aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHaibo Huang <hhb@google.com>2020-10-28 22:18:23 -0700
committerHaibo Huang <hhb@google.com>2020-11-11 14:04:46 -0800
commitb5a52b921a9e7144aa95b8dff2d66732c2a8efff (patch)
tree5d8dc61c3642298f09b9916bb6a8df99630852d4
parent963b4486efcc9e99b5e50bdfb2562f1c9f536682 (diff)
downloadexternal_curl-b5a52b921a9e7144aa95b8dff2d66732c2a8efff.tar.gz
external_curl-b5a52b921a9e7144aa95b8dff2d66732c2a8efff.tar.bz2
external_curl-b5a52b921a9e7144aa95b8dff2d66732c2a8efff.zip
Upgrade curl to curl-7_73_0
Test: make Change-Id: Ib063c45f52a3c6892447f92e44043a14f01a917a
-rw-r--r--Android.bp1
-rw-r--r--CHANGES3650
-rw-r--r--CMake/FindBrotli.cmake41
-rw-r--r--CMake/FindNSS.cmake38
-rw-r--r--CMake/FindZstd.cmake69
-rw-r--r--CMakeLists.txt38
-rw-r--r--METADATA8
-rw-r--r--Makefile.am5
-rw-r--r--README6
-rw-r--r--RELEASE-NOTES521
-rw-r--r--acinclude.m44
-rwxr-xr-xbuildconf430
-rwxr-xr-xconfigure223
-rwxr-xr-xconfigure.ac107
-rw-r--r--docs/BUGS302
-rw-r--r--docs/BUGS.md266
-rw-r--r--docs/CHECKSRC.md6
-rw-r--r--docs/CONTRIBUTE.md27
-rw-r--r--docs/CURL-DISABLE.md14
-rw-r--r--docs/DYNBUF.md6
-rw-r--r--docs/ECH.md (renamed from docs/ESNI.md)74
-rw-r--r--docs/EXPERIMENTAL.md1
-rw-r--r--docs/FAQ53
-rw-r--r--docs/HISTORY.md33
-rw-r--r--docs/HTTP3.md2
-rw-r--r--docs/INTERNALS.md11
-rw-r--r--docs/KNOWN_BUGS15
-rw-r--r--docs/LICENSE-MIXING.md128
-rw-r--r--docs/MQTT.md32
-rw-r--r--docs/Makefile.am8
-rw-r--r--docs/RESOURCES85
-rw-r--r--docs/ROADMAP.md30
-rw-r--r--docs/SSLCERTS.md4
-rw-r--r--docs/THANKS31
-rw-r--r--docs/TODO46
-rw-r--r--docs/TheArtOfHttpScripting758
-rw-r--r--docs/TheArtOfHttpScripting.md692
-rw-r--r--docs/cmdline-opts/Makefile.inc2
-rw-r--r--docs/cmdline-opts/abstract-unix-socket.d1
-rw-r--r--docs/cmdline-opts/alt-svc.d1
-rw-r--r--docs/cmdline-opts/anyauth.d1
-rw-r--r--docs/cmdline-opts/append.d1
-rw-r--r--docs/cmdline-opts/basic.d1
-rw-r--r--docs/cmdline-opts/cacert.d1
-rw-r--r--docs/cmdline-opts/capath.d1
-rw-r--r--docs/cmdline-opts/cert-status.d1
-rw-r--r--docs/cmdline-opts/cert-type.d1
-rw-r--r--docs/cmdline-opts/cert.d1
-rw-r--r--docs/cmdline-opts/ciphers.d1
-rw-r--r--docs/cmdline-opts/compressed-ssh.d1
-rw-r--r--docs/cmdline-opts/compressed.d1
-rw-r--r--docs/cmdline-opts/config.d19
-rw-r--r--docs/cmdline-opts/connect-timeout.d1
-rw-r--r--docs/cmdline-opts/connect-to.d1
-rw-r--r--docs/cmdline-opts/continue-at.d1
-rw-r--r--docs/cmdline-opts/cookie-jar.d1
-rw-r--r--docs/cmdline-opts/cookie.d1
-rw-r--r--docs/cmdline-opts/create-dirs.d1
-rw-r--r--docs/cmdline-opts/crlf.d1
-rw-r--r--docs/cmdline-opts/crlfile.d1
-rw-r--r--docs/cmdline-opts/curves.d18
-rw-r--r--docs/cmdline-opts/data-ascii.d1
-rw-r--r--docs/cmdline-opts/data-binary.d1
-rw-r--r--docs/cmdline-opts/data-raw.d1
-rw-r--r--docs/cmdline-opts/data-urlencode.d1
-rw-r--r--docs/cmdline-opts/data.d1
-rw-r--r--docs/cmdline-opts/delegation.d1
-rw-r--r--docs/cmdline-opts/digest.d1
-rw-r--r--docs/cmdline-opts/disable-eprt.d1
-rw-r--r--docs/cmdline-opts/disable-epsv.d1
-rw-r--r--docs/cmdline-opts/disable.d1
-rw-r--r--docs/cmdline-opts/disallow-username-in-url.d1
-rw-r--r--docs/cmdline-opts/dns-interface.d1
-rw-r--r--docs/cmdline-opts/dns-ipv4-addr.d1
-rw-r--r--docs/cmdline-opts/dns-ipv6-addr.d1
-rw-r--r--docs/cmdline-opts/dns-servers.d1
-rw-r--r--docs/cmdline-opts/doh-url.d1
-rw-r--r--docs/cmdline-opts/dump-header.d1
-rw-r--r--docs/cmdline-opts/egd-file.d1
-rw-r--r--docs/cmdline-opts/engine.d1
-rw-r--r--docs/cmdline-opts/etag-compare.d1
-rw-r--r--docs/cmdline-opts/etag-save.d1
-rw-r--r--docs/cmdline-opts/expect100-timeout.d1
-rw-r--r--docs/cmdline-opts/fail-early.d1
-rw-r--r--docs/cmdline-opts/fail.d1
-rw-r--r--docs/cmdline-opts/false-start.d1
-rw-r--r--docs/cmdline-opts/form-string.d1
-rw-r--r--docs/cmdline-opts/form.d1
-rw-r--r--docs/cmdline-opts/ftp-account.d1
-rw-r--r--docs/cmdline-opts/ftp-alternative-to-user.d1
-rw-r--r--docs/cmdline-opts/ftp-create-dirs.d1
-rw-r--r--docs/cmdline-opts/ftp-method.d1
-rw-r--r--docs/cmdline-opts/ftp-pasv.d1
-rw-r--r--docs/cmdline-opts/ftp-port.d1
-rw-r--r--docs/cmdline-opts/ftp-pret.d1
-rw-r--r--docs/cmdline-opts/ftp-skip-pasv-ip.d1
-rw-r--r--docs/cmdline-opts/ftp-ssl-ccc-mode.d1
-rw-r--r--docs/cmdline-opts/ftp-ssl-ccc.d1
-rw-r--r--docs/cmdline-opts/ftp-ssl-control.d1
-rwxr-xr-xdocs/cmdline-opts/gen.pl64
-rw-r--r--docs/cmdline-opts/get.d1
-rw-r--r--docs/cmdline-opts/globoff.d1
-rw-r--r--docs/cmdline-opts/happy-eyeballs-timeout-ms.d1
-rw-r--r--docs/cmdline-opts/haproxy-protocol.d1
-rw-r--r--docs/cmdline-opts/head.d1
-rw-r--r--docs/cmdline-opts/header.d1
-rw-r--r--docs/cmdline-opts/help.d12
-rw-r--r--docs/cmdline-opts/hostpubmd5.d1
-rw-r--r--docs/cmdline-opts/http0.9.d1
-rw-r--r--docs/cmdline-opts/http1.0.d1
-rw-r--r--docs/cmdline-opts/http1.1.d1
-rw-r--r--docs/cmdline-opts/http2-prior-knowledge.d1
-rw-r--r--docs/cmdline-opts/http2.d1
-rw-r--r--docs/cmdline-opts/http3.d1
-rw-r--r--docs/cmdline-opts/ignore-content-length.d1
-rw-r--r--docs/cmdline-opts/include.d1
-rw-r--r--docs/cmdline-opts/insecure.d1
-rw-r--r--docs/cmdline-opts/interface.d1
-rw-r--r--docs/cmdline-opts/ipv4.d1
-rw-r--r--docs/cmdline-opts/ipv6.d1
-rw-r--r--docs/cmdline-opts/junk-session-cookies.d1
-rw-r--r--docs/cmdline-opts/keepalive-time.d1
-rw-r--r--docs/cmdline-opts/key-type.d1
-rw-r--r--docs/cmdline-opts/key.d1
-rw-r--r--docs/cmdline-opts/krb.d1
-rw-r--r--docs/cmdline-opts/libcurl.d1
-rw-r--r--docs/cmdline-opts/limit-rate.d1
-rw-r--r--docs/cmdline-opts/list-only.d1
-rw-r--r--docs/cmdline-opts/local-port.d1
-rw-r--r--docs/cmdline-opts/location-trusted.d1
-rw-r--r--docs/cmdline-opts/location.d1
-rw-r--r--docs/cmdline-opts/login-options.d1
-rw-r--r--docs/cmdline-opts/mail-auth.d1
-rw-r--r--docs/cmdline-opts/mail-from.d1
-rw-r--r--docs/cmdline-opts/mail-rcpt-allowfails.d1
-rw-r--r--docs/cmdline-opts/mail-rcpt.d1
-rw-r--r--docs/cmdline-opts/manual.d1
-rw-r--r--docs/cmdline-opts/max-filesize.d1
-rw-r--r--docs/cmdline-opts/max-redirs.d1
-rw-r--r--docs/cmdline-opts/max-time.d1
-rw-r--r--docs/cmdline-opts/metalink.d1
-rw-r--r--docs/cmdline-opts/negotiate.d1
-rw-r--r--docs/cmdline-opts/netrc-file.d1
-rw-r--r--docs/cmdline-opts/netrc-optional.d1
-rw-r--r--docs/cmdline-opts/netrc.d1
-rw-r--r--docs/cmdline-opts/next.d1
-rw-r--r--docs/cmdline-opts/no-alpn.d1
-rw-r--r--docs/cmdline-opts/no-buffer.d1
-rw-r--r--docs/cmdline-opts/no-keepalive.d1
-rw-r--r--docs/cmdline-opts/no-npn.d1
-rw-r--r--docs/cmdline-opts/no-progress-meter.d1
-rw-r--r--docs/cmdline-opts/no-sessionid.d1
-rw-r--r--docs/cmdline-opts/noproxy.d1
-rw-r--r--docs/cmdline-opts/ntlm-wb.d1
-rw-r--r--docs/cmdline-opts/ntlm.d1
-rw-r--r--docs/cmdline-opts/oauth2-bearer.d1
-rw-r--r--docs/cmdline-opts/output-dir.d19
-rw-r--r--docs/cmdline-opts/output.d1
-rw-r--r--docs/cmdline-opts/page-footer6
-rw-r--r--docs/cmdline-opts/parallel-immediate.d1
-rw-r--r--docs/cmdline-opts/parallel-max.d1
-rw-r--r--docs/cmdline-opts/parallel.d1
-rw-r--r--docs/cmdline-opts/pass.d1
-rw-r--r--docs/cmdline-opts/path-as-is.d1
-rw-r--r--docs/cmdline-opts/pinnedpubkey.d1
-rw-r--r--docs/cmdline-opts/post301.d1
-rw-r--r--docs/cmdline-opts/post302.d1
-rw-r--r--docs/cmdline-opts/post303.d1
-rw-r--r--docs/cmdline-opts/preproxy.d1
-rw-r--r--docs/cmdline-opts/progress-bar.d1
-rw-r--r--docs/cmdline-opts/proto-default.d1
-rw-r--r--docs/cmdline-opts/proto-redir.d1
-rw-r--r--docs/cmdline-opts/proto.d1
-rw-r--r--docs/cmdline-opts/proxy-anyauth.d1
-rw-r--r--docs/cmdline-opts/proxy-basic.d1
-rw-r--r--docs/cmdline-opts/proxy-cacert.d1
-rw-r--r--docs/cmdline-opts/proxy-capath.d1
-rw-r--r--docs/cmdline-opts/proxy-cert-type.d1
-rw-r--r--docs/cmdline-opts/proxy-cert.d1
-rw-r--r--docs/cmdline-opts/proxy-ciphers.d1
-rw-r--r--docs/cmdline-opts/proxy-crlfile.d1
-rw-r--r--docs/cmdline-opts/proxy-digest.d1
-rw-r--r--docs/cmdline-opts/proxy-header.d1
-rw-r--r--docs/cmdline-opts/proxy-insecure.d1
-rw-r--r--docs/cmdline-opts/proxy-key-type.d1
-rw-r--r--docs/cmdline-opts/proxy-key.d1
-rw-r--r--docs/cmdline-opts/proxy-negotiate.d1
-rw-r--r--docs/cmdline-opts/proxy-ntlm.d1
-rw-r--r--docs/cmdline-opts/proxy-pass.d1
-rw-r--r--docs/cmdline-opts/proxy-pinnedpubkey.d1
-rw-r--r--docs/cmdline-opts/proxy-service-name.d1
-rw-r--r--docs/cmdline-opts/proxy-ssl-allow-beast.d1
-rw-r--r--docs/cmdline-opts/proxy-tls13-ciphers.d1
-rw-r--r--docs/cmdline-opts/proxy-tlsauthtype.d1
-rw-r--r--docs/cmdline-opts/proxy-tlspassword.d1
-rw-r--r--docs/cmdline-opts/proxy-tlsuser.d1
-rw-r--r--docs/cmdline-opts/proxy-tlsv1.d1
-rw-r--r--docs/cmdline-opts/proxy-user.d1
-rw-r--r--docs/cmdline-opts/proxy.d1
-rw-r--r--docs/cmdline-opts/proxy1.0.d1
-rw-r--r--docs/cmdline-opts/proxytunnel.d1
-rw-r--r--docs/cmdline-opts/pubkey.d1
-rw-r--r--docs/cmdline-opts/quote.d9
-rw-r--r--docs/cmdline-opts/random-file.d1
-rw-r--r--docs/cmdline-opts/range.d1
-rw-r--r--docs/cmdline-opts/raw.d1
-rw-r--r--docs/cmdline-opts/referer.d1
-rw-r--r--docs/cmdline-opts/remote-header-name.d1
-rw-r--r--docs/cmdline-opts/remote-name-all.d1
-rw-r--r--docs/cmdline-opts/remote-name.d1
-rw-r--r--docs/cmdline-opts/remote-time.d1
-rw-r--r--docs/cmdline-opts/request-target.d1
-rw-r--r--docs/cmdline-opts/request.d1
-rw-r--r--docs/cmdline-opts/resolve.d1
-rw-r--r--docs/cmdline-opts/retry-all-errors.d1
-rw-r--r--docs/cmdline-opts/retry-connrefused.d1
-rw-r--r--docs/cmdline-opts/retry-delay.d1
-rw-r--r--docs/cmdline-opts/retry-max-time.d1
-rw-r--r--docs/cmdline-opts/retry.d1
-rw-r--r--docs/cmdline-opts/sasl-authzid.d1
-rw-r--r--docs/cmdline-opts/sasl-ir.d1
-rw-r--r--docs/cmdline-opts/service-name.d1
-rw-r--r--docs/cmdline-opts/show-error.d2
-rw-r--r--docs/cmdline-opts/silent.d3
-rw-r--r--docs/cmdline-opts/socks4.d1
-rw-r--r--docs/cmdline-opts/socks4a.d1
-rw-r--r--docs/cmdline-opts/socks5-basic.d1
-rw-r--r--docs/cmdline-opts/socks5-gssapi-nec.d1
-rw-r--r--docs/cmdline-opts/socks5-gssapi-service.d1
-rw-r--r--docs/cmdline-opts/socks5-gssapi.d1
-rw-r--r--docs/cmdline-opts/socks5-hostname.d1
-rw-r--r--docs/cmdline-opts/socks5.d1
-rw-r--r--docs/cmdline-opts/speed-limit.d1
-rw-r--r--docs/cmdline-opts/speed-time.d1
-rw-r--r--docs/cmdline-opts/ssl-allow-beast.d1
-rw-r--r--docs/cmdline-opts/ssl-no-revoke.d1
-rw-r--r--docs/cmdline-opts/ssl-reqd.d1
-rw-r--r--docs/cmdline-opts/ssl-revoke-best-effort.d1
-rw-r--r--docs/cmdline-opts/ssl.d1
-rw-r--r--docs/cmdline-opts/sslv2.d1
-rw-r--r--docs/cmdline-opts/sslv3.d1
-rw-r--r--docs/cmdline-opts/stderr.d1
-rw-r--r--docs/cmdline-opts/styled-output.d1
-rw-r--r--docs/cmdline-opts/suppress-connect-headers.d1
-rw-r--r--docs/cmdline-opts/tcp-fastopen.d1
-rw-r--r--docs/cmdline-opts/tcp-nodelay.d1
-rw-r--r--docs/cmdline-opts/telnet-option.d1
-rw-r--r--docs/cmdline-opts/tftp-blksize.d1
-rw-r--r--docs/cmdline-opts/tftp-no-options.d1
-rw-r--r--docs/cmdline-opts/time-cond.d1
-rw-r--r--docs/cmdline-opts/tls-max.d1
-rw-r--r--docs/cmdline-opts/tls13-ciphers.d1
-rw-r--r--docs/cmdline-opts/tlsauthtype.d1
-rw-r--r--docs/cmdline-opts/tlspassword.d1
-rw-r--r--docs/cmdline-opts/tlsuser.d1
-rw-r--r--docs/cmdline-opts/tlsv1.0.d1
-rw-r--r--docs/cmdline-opts/tlsv1.1.d1
-rw-r--r--docs/cmdline-opts/tlsv1.2.d1
-rw-r--r--docs/cmdline-opts/tlsv1.3.d1
-rw-r--r--docs/cmdline-opts/tlsv1.d1
-rw-r--r--docs/cmdline-opts/tr-encoding.d1
-rw-r--r--docs/cmdline-opts/trace-ascii.d1
-rw-r--r--docs/cmdline-opts/trace-time.d1
-rw-r--r--docs/cmdline-opts/trace.d1
-rw-r--r--docs/cmdline-opts/unix-socket.d1
-rw-r--r--docs/cmdline-opts/upload-file.d1
-rw-r--r--docs/cmdline-opts/url.d1
-rw-r--r--docs/cmdline-opts/use-ascii.d1
-rw-r--r--docs/cmdline-opts/user-agent.d1
-rw-r--r--docs/cmdline-opts/user.d1
-rw-r--r--docs/cmdline-opts/verbose.d1
-rw-r--r--docs/cmdline-opts/version.d1
-rw-r--r--docs/cmdline-opts/write-out.d5
-rw-r--r--docs/cmdline-opts/xattr.d1
-rw-r--r--docs/curl-config.12
-rw-r--r--docs/curl.1115
-rw-r--r--docs/examples/Makefile.am2
-rw-r--r--docs/examples/Makefile.m327
-rw-r--r--docs/examples/README.md (renamed from docs/examples/README)22
-rw-r--r--docs/examples/sslbackend.c6
-rw-r--r--docs/libcurl/Makefile.inc3
-rw-r--r--docs/libcurl/curl_easy_cleanup.36
-rw-r--r--docs/libcurl/curl_easy_duphandle.32
-rw-r--r--docs/libcurl/curl_easy_escape.32
-rw-r--r--docs/libcurl/curl_easy_getinfo.35
-rw-r--r--docs/libcurl/curl_easy_init.34
-rw-r--r--docs/libcurl/curl_easy_option_by_id.347
-rw-r--r--docs/libcurl/curl_easy_option_by_name.345
-rw-r--r--docs/libcurl/curl_easy_option_next.375
-rw-r--r--docs/libcurl/curl_easy_pause.32
-rw-r--r--docs/libcurl/curl_easy_perform.34
-rw-r--r--docs/libcurl/curl_easy_recv.32
-rw-r--r--docs/libcurl/curl_easy_reset.32
-rw-r--r--docs/libcurl/curl_easy_send.32
-rw-r--r--docs/libcurl/curl_easy_setopt.39
-rw-r--r--docs/libcurl/curl_easy_strerror.32
-rw-r--r--docs/libcurl/curl_easy_unescape.32
-rw-r--r--docs/libcurl/curl_escape.32
-rw-r--r--docs/libcurl/curl_formadd.32
-rw-r--r--docs/libcurl/curl_formfree.32
-rw-r--r--docs/libcurl/curl_formget.32
-rw-r--r--docs/libcurl/curl_free.32
-rw-r--r--docs/libcurl/curl_getdate.32
-rw-r--r--docs/libcurl/curl_getenv.32
-rw-r--r--docs/libcurl/curl_global_cleanup.32
-rw-r--r--docs/libcurl/curl_global_init.32
-rw-r--r--docs/libcurl/curl_global_init_mem.32
-rw-r--r--docs/libcurl/curl_global_sslset.32
-rw-r--r--docs/libcurl/curl_mime_addpart.32
-rw-r--r--docs/libcurl/curl_mime_data.32
-rw-r--r--docs/libcurl/curl_mime_data_cb.32
-rw-r--r--docs/libcurl/curl_mime_encoder.32
-rw-r--r--docs/libcurl/curl_mime_filedata.32
-rw-r--r--docs/libcurl/curl_mime_filename.32
-rw-r--r--docs/libcurl/curl_mime_free.32
-rw-r--r--docs/libcurl/curl_mime_headers.36
-rw-r--r--docs/libcurl/curl_mime_init.36
-rw-r--r--docs/libcurl/curl_mime_name.32
-rw-r--r--docs/libcurl/curl_mime_subparts.32
-rw-r--r--docs/libcurl/curl_mime_type.32
-rw-r--r--docs/libcurl/curl_mprintf.32
-rw-r--r--docs/libcurl/curl_multi_add_handle.32
-rw-r--r--docs/libcurl/curl_multi_assign.32
-rw-r--r--docs/libcurl/curl_multi_cleanup.32
-rw-r--r--docs/libcurl/curl_multi_fdset.32
-rw-r--r--docs/libcurl/curl_multi_info_read.32
-rw-r--r--docs/libcurl/curl_multi_init.32
-rw-r--r--docs/libcurl/curl_multi_perform.32
-rw-r--r--docs/libcurl/curl_multi_poll.32
-rw-r--r--docs/libcurl/curl_multi_remove_handle.32
-rw-r--r--docs/libcurl/curl_multi_setopt.32
-rw-r--r--docs/libcurl/curl_multi_socket.32
-rw-r--r--docs/libcurl/curl_multi_socket_action.32
-rw-r--r--docs/libcurl/curl_multi_strerror.32
-rw-r--r--docs/libcurl/curl_multi_timeout.32
-rw-r--r--docs/libcurl/curl_multi_wait.32
-rw-r--r--docs/libcurl/curl_multi_wakeup.32
-rw-r--r--docs/libcurl/curl_share_cleanup.32
-rw-r--r--docs/libcurl/curl_share_init.32
-rw-r--r--docs/libcurl/curl_share_setopt.32
-rw-r--r--docs/libcurl/curl_share_strerror.32
-rw-r--r--docs/libcurl/curl_slist_append.32
-rw-r--r--docs/libcurl/curl_slist_free_all.32
-rw-r--r--docs/libcurl/curl_strequal.32
-rw-r--r--docs/libcurl/curl_unescape.32
-rw-r--r--docs/libcurl/curl_url.32
-rw-r--r--docs/libcurl/curl_url_cleanup.32
-rw-r--r--docs/libcurl/curl_url_dup.32
-rw-r--r--docs/libcurl/curl_url_get.32
-rw-r--r--docs/libcurl/curl_url_set.32
-rw-r--r--docs/libcurl/curl_version.32
-rw-r--r--docs/libcurl/curl_version_info.35
-rw-r--r--docs/libcurl/libcurl-easy.32
-rw-r--r--docs/libcurl/libcurl-env.36
-rw-r--r--docs/libcurl/libcurl-errors.32
-rw-r--r--docs/libcurl/libcurl-multi.32
-rw-r--r--docs/libcurl/libcurl-security.34
-rw-r--r--docs/libcurl/libcurl-share.32
-rw-r--r--docs/libcurl/libcurl-symbols.3132
-rw-r--r--docs/libcurl/libcurl-thread.32
-rw-r--r--docs/libcurl/libcurl-tutorial.32
-rw-r--r--docs/libcurl/libcurl-url.32
-rw-r--r--docs/libcurl/libcurl.32
-rw-r--r--docs/libcurl/opts/CURLINFO_ACTIVESOCKET.34
-rw-r--r--docs/libcurl/opts/CURLINFO_APPCONNECT_TIME.32
-rw-r--r--docs/libcurl/opts/CURLINFO_APPCONNECT_TIME_T.32
-rw-r--r--docs/libcurl/opts/CURLINFO_CERTINFO.32
-rw-r--r--docs/libcurl/opts/CURLINFO_CONDITION_UNMET.34
-rw-r--r--docs/libcurl/opts/CURLINFO_CONNECT_TIME.32
-rw-r--r--docs/libcurl/opts/CURLINFO_CONNECT_TIME_T.32
-rw-r--r--docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD.34
-rw-r--r--docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD_T.34
-rw-r--r--docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD.34
-rw-r--r--docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD_T.34
-rw-r--r--docs/libcurl/opts/CURLINFO_CONTENT_TYPE.34
-rw-r--r--docs/libcurl/opts/CURLINFO_COOKIELIST.34
-rw-r--r--docs/libcurl/opts/CURLINFO_EFFECTIVE_METHOD.34
-rw-r--r--docs/libcurl/opts/CURLINFO_EFFECTIVE_URL.34
-rw-r--r--docs/libcurl/opts/CURLINFO_FILETIME.32
-rw-r--r--docs/libcurl/opts/CURLINFO_FILETIME_T.32
-rw-r--r--docs/libcurl/opts/CURLINFO_FTP_ENTRY_PATH.32
-rw-r--r--docs/libcurl/opts/CURLINFO_HEADER_SIZE.34
-rw-r--r--docs/libcurl/opts/CURLINFO_HTTPAUTH_AVAIL.34
-rw-r--r--docs/libcurl/opts/CURLINFO_HTTP_CONNECTCODE.32
-rw-r--r--docs/libcurl/opts/CURLINFO_HTTP_VERSION.34
-rw-r--r--docs/libcurl/opts/CURLINFO_LASTSOCKET.34
-rw-r--r--docs/libcurl/opts/CURLINFO_LOCAL_IP.34
-rw-r--r--docs/libcurl/opts/CURLINFO_LOCAL_PORT.34
-rw-r--r--docs/libcurl/opts/CURLINFO_NAMELOOKUP_TIME.32
-rw-r--r--docs/libcurl/opts/CURLINFO_NAMELOOKUP_TIME_T.32
-rw-r--r--docs/libcurl/opts/CURLINFO_NUM_CONNECTS.34
-rw-r--r--docs/libcurl/opts/CURLINFO_OS_ERRNO.34
-rw-r--r--docs/libcurl/opts/CURLINFO_PRETRANSFER_TIME.32
-rw-r--r--docs/libcurl/opts/CURLINFO_PRETRANSFER_TIME_T.32
-rw-r--r--docs/libcurl/opts/CURLINFO_PRIMARY_IP.34
-rw-r--r--docs/libcurl/opts/CURLINFO_PRIMARY_PORT.34
-rw-r--r--docs/libcurl/opts/CURLINFO_PRIVATE.34
-rw-r--r--docs/libcurl/opts/CURLINFO_PROTOCOL.34
-rw-r--r--docs/libcurl/opts/CURLINFO_PROXYAUTH_AVAIL.34
-rw-r--r--docs/libcurl/opts/CURLINFO_PROXY_ERROR.3105
-rw-r--r--docs/libcurl/opts/CURLINFO_PROXY_SSL_VERIFYRESULT.32
-rw-r--r--docs/libcurl/opts/CURLINFO_REDIRECT_COUNT.34
-rw-r--r--docs/libcurl/opts/CURLINFO_REDIRECT_TIME.32
-rw-r--r--docs/libcurl/opts/CURLINFO_REDIRECT_TIME_T.32
-rw-r--r--docs/libcurl/opts/CURLINFO_REDIRECT_URL.34
-rw-r--r--docs/libcurl/opts/CURLINFO_REQUEST_SIZE.34
-rw-r--r--docs/libcurl/opts/CURLINFO_RESPONSE_CODE.34
-rw-r--r--docs/libcurl/opts/CURLINFO_RETRY_AFTER.36
-rw-r--r--docs/libcurl/opts/CURLINFO_RTSP_CLIENT_CSEQ.32
-rw-r--r--docs/libcurl/opts/CURLINFO_RTSP_CSEQ_RECV.32
-rw-r--r--docs/libcurl/opts/CURLINFO_RTSP_SERVER_CSEQ.32
-rw-r--r--docs/libcurl/opts/CURLINFO_RTSP_SESSION_ID.32
-rw-r--r--docs/libcurl/opts/CURLINFO_SCHEME.34
-rw-r--r--docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD.34
-rw-r--r--docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD_T.34
-rw-r--r--docs/libcurl/opts/CURLINFO_SIZE_UPLOAD.34
-rw-r--r--docs/libcurl/opts/CURLINFO_SIZE_UPLOAD_T.34
-rw-r--r--docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD.34
-rw-r--r--docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD_T.34
-rw-r--r--docs/libcurl/opts/CURLINFO_SPEED_UPLOAD.34
-rw-r--r--docs/libcurl/opts/CURLINFO_SPEED_UPLOAD_T.34
-rw-r--r--docs/libcurl/opts/CURLINFO_SSL_ENGINES.32
-rw-r--r--docs/libcurl/opts/CURLINFO_SSL_VERIFYRESULT.32
-rw-r--r--docs/libcurl/opts/CURLINFO_STARTTRANSFER_TIME.32
-rw-r--r--docs/libcurl/opts/CURLINFO_STARTTRANSFER_TIME_T.32
-rw-r--r--docs/libcurl/opts/CURLINFO_TLS_SESSION.32
-rw-r--r--docs/libcurl/opts/CURLINFO_TLS_SSL_PTR.32
-rw-r--r--docs/libcurl/opts/CURLINFO_TOTAL_TIME.32
-rw-r--r--docs/libcurl/opts/CURLINFO_TOTAL_TIME_T.32
-rw-r--r--docs/libcurl/opts/CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.32
-rw-r--r--docs/libcurl/opts/CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.32
-rw-r--r--docs/libcurl/opts/CURLMOPT_MAXCONNECTS.32
-rw-r--r--docs/libcurl/opts/CURLMOPT_MAX_HOST_CONNECTIONS.32
-rw-r--r--docs/libcurl/opts/CURLMOPT_MAX_PIPELINE_LENGTH.32
-rw-r--r--docs/libcurl/opts/CURLMOPT_MAX_TOTAL_CONNECTIONS.32
-rw-r--r--docs/libcurl/opts/CURLMOPT_PIPELINING.32
-rw-r--r--docs/libcurl/opts/CURLMOPT_PIPELINING_SERVER_BL.32
-rw-r--r--docs/libcurl/opts/CURLMOPT_PIPELINING_SITE_BL.32
-rw-r--r--docs/libcurl/opts/CURLMOPT_PUSHDATA.32
-rw-r--r--docs/libcurl/opts/CURLMOPT_PUSHFUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLMOPT_SOCKETDATA.32
-rw-r--r--docs/libcurl/opts/CURLMOPT_SOCKETFUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLMOPT_TIMERDATA.32
-rw-r--r--docs/libcurl/opts/CURLMOPT_TIMERFUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_ABSTRACT_UNIX_SOCKET.32
-rw-r--r--docs/libcurl/opts/CURLOPT_ACCEPTTIMEOUT_MS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_ACCEPT_ENCODING.34
-rw-r--r--docs/libcurl/opts/CURLOPT_ADDRESS_SCOPE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_ALTSVC.32
-rw-r--r--docs/libcurl/opts/CURLOPT_ALTSVC_CTRL.32
-rw-r--r--docs/libcurl/opts/CURLOPT_APPEND.32
-rw-r--r--docs/libcurl/opts/CURLOPT_AUTOREFERER.34
-rw-r--r--docs/libcurl/opts/CURLOPT_BUFFERSIZE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_CAINFO.32
-rw-r--r--docs/libcurl/opts/CURLOPT_CAPATH.32
-rw-r--r--docs/libcurl/opts/CURLOPT_CERTINFO.32
-rw-r--r--docs/libcurl/opts/CURLOPT_CHUNK_BGN_FUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_CHUNK_DATA.32
-rw-r--r--docs/libcurl/opts/CURLOPT_CHUNK_END_FUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_CLOSESOCKETDATA.32
-rw-r--r--docs/libcurl/opts/CURLOPT_CLOSESOCKETFUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT.34
-rw-r--r--docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT_MS.34
-rw-r--r--docs/libcurl/opts/CURLOPT_CONNECT_ONLY.32
-rw-r--r--docs/libcurl/opts/CURLOPT_CONNECT_TO.34
-rw-r--r--docs/libcurl/opts/CURLOPT_CONV_FROM_NETWORK_FUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_CONV_FROM_UTF8_FUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_CONV_TO_NETWORK_FUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_COOKIE.34
-rw-r--r--docs/libcurl/opts/CURLOPT_COOKIEFILE.34
-rw-r--r--docs/libcurl/opts/CURLOPT_COOKIEJAR.34
-rw-r--r--docs/libcurl/opts/CURLOPT_COOKIELIST.32
-rw-r--r--docs/libcurl/opts/CURLOPT_COOKIESESSION.34
-rw-r--r--docs/libcurl/opts/CURLOPT_COPYPOSTFIELDS.34
-rw-r--r--docs/libcurl/opts/CURLOPT_CRLF.32
-rw-r--r--docs/libcurl/opts/CURLOPT_CRLFILE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_CURLU.34
-rw-r--r--docs/libcurl/opts/CURLOPT_CUSTOMREQUEST.34
-rw-r--r--docs/libcurl/opts/CURLOPT_DEBUGDATA.32
-rw-r--r--docs/libcurl/opts/CURLOPT_DEBUGFUNCTION.34
-rw-r--r--docs/libcurl/opts/CURLOPT_DEFAULT_PROTOCOL.32
-rw-r--r--docs/libcurl/opts/CURLOPT_DIRLISTONLY.32
-rw-r--r--docs/libcurl/opts/CURLOPT_DISALLOW_USERNAME_IN_URL.34
-rw-r--r--docs/libcurl/opts/CURLOPT_DNS_CACHE_TIMEOUT.34
-rw-r--r--docs/libcurl/opts/CURLOPT_DNS_INTERFACE.34
-rw-r--r--docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP4.34
-rw-r--r--docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP6.34
-rw-r--r--docs/libcurl/opts/CURLOPT_DNS_SERVERS.34
-rw-r--r--docs/libcurl/opts/CURLOPT_DNS_SHUFFLE_ADDRESSES.32
-rw-r--r--docs/libcurl/opts/CURLOPT_DNS_USE_GLOBAL_CACHE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_DOH_URL.34
-rw-r--r--docs/libcurl/opts/CURLOPT_EGDSOCKET.32
-rw-r--r--docs/libcurl/opts/CURLOPT_ERRORBUFFER.34
-rw-r--r--docs/libcurl/opts/CURLOPT_EXPECT_100_TIMEOUT_MS.34
-rw-r--r--docs/libcurl/opts/CURLOPT_FAILONERROR.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FILETIME.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FNMATCH_DATA.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FNMATCH_FUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FOLLOWLOCATION.34
-rw-r--r--docs/libcurl/opts/CURLOPT_FORBID_REUSE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FRESH_CONNECT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FTPPORT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FTPSSLAUTH.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FTP_ACCOUNT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FTP_ALTERNATIVE_TO_USER.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FTP_CREATE_MISSING_DIRS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FTP_FILEMETHOD.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FTP_RESPONSE_TIMEOUT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FTP_SKIP_PASV_IP.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FTP_SSL_CCC.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FTP_USE_EPRT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FTP_USE_EPSV.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FTP_USE_PRET.32
-rw-r--r--docs/libcurl/opts/CURLOPT_GSSAPI_DELEGATION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_HAPROXYPROTOCOL.32
-rw-r--r--docs/libcurl/opts/CURLOPT_HEADER.34
-rw-r--r--docs/libcurl/opts/CURLOPT_HEADERDATA.34
-rw-r--r--docs/libcurl/opts/CURLOPT_HEADERFUNCTION.34
-rw-r--r--docs/libcurl/opts/CURLOPT_HEADEROPT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_HTTP09_ALLOWED.32
-rw-r--r--docs/libcurl/opts/CURLOPT_HTTP200ALIASES.34
-rw-r--r--docs/libcurl/opts/CURLOPT_HTTPAUTH.32
-rw-r--r--docs/libcurl/opts/CURLOPT_HTTPGET.34
-rw-r--r--docs/libcurl/opts/CURLOPT_HTTPHEADER.34
-rw-r--r--docs/libcurl/opts/CURLOPT_HTTPPOST.32
-rw-r--r--docs/libcurl/opts/CURLOPT_HTTPPROXYTUNNEL.32
-rw-r--r--docs/libcurl/opts/CURLOPT_HTTP_CONTENT_DECODING.32
-rw-r--r--docs/libcurl/opts/CURLOPT_HTTP_TRANSFER_DECODING.32
-rw-r--r--docs/libcurl/opts/CURLOPT_HTTP_VERSION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_IGNORE_CONTENT_LENGTH.34
-rw-r--r--docs/libcurl/opts/CURLOPT_INFILESIZE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_INFILESIZE_LARGE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_INTERFACE.34
-rw-r--r--docs/libcurl/opts/CURLOPT_INTERLEAVEDATA.32
-rw-r--r--docs/libcurl/opts/CURLOPT_INTERLEAVEFUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_IOCTLDATA.32
-rw-r--r--docs/libcurl/opts/CURLOPT_IOCTLFUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_IPRESOLVE.34
-rw-r--r--docs/libcurl/opts/CURLOPT_ISSUERCERT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_KEEP_SENDING_ON_ERROR.32
-rw-r--r--docs/libcurl/opts/CURLOPT_KEYPASSWD.34
-rw-r--r--docs/libcurl/opts/CURLOPT_KRBLEVEL.32
-rw-r--r--docs/libcurl/opts/CURLOPT_LOCALPORT.34
-rw-r--r--docs/libcurl/opts/CURLOPT_LOCALPORTRANGE.34
-rw-r--r--docs/libcurl/opts/CURLOPT_LOGIN_OPTIONS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_LOW_SPEED_LIMIT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_LOW_SPEED_TIME.32
-rw-r--r--docs/libcurl/opts/CURLOPT_MAIL_AUTH.32
-rw-r--r--docs/libcurl/opts/CURLOPT_MAIL_FROM.32
-rw-r--r--docs/libcurl/opts/CURLOPT_MAIL_RCPT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_MAIL_RCPT_ALLLOWFAILS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_MAXAGE_CONN.34
-rw-r--r--docs/libcurl/opts/CURLOPT_MAXCONNECTS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_MAXFILESIZE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_MAXFILESIZE_LARGE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_MAXREDIRS.34
-rw-r--r--docs/libcurl/opts/CURLOPT_MAX_RECV_SPEED_LARGE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_MAX_SEND_SPEED_LARGE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_MIMEPOST.32
-rw-r--r--docs/libcurl/opts/CURLOPT_NETRC.32
-rw-r--r--docs/libcurl/opts/CURLOPT_NETRC_FILE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_NEW_DIRECTORY_PERMS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_NEW_FILE_PERMS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_NOBODY.32
-rw-r--r--docs/libcurl/opts/CURLOPT_NOPROGRESS.34
-rw-r--r--docs/libcurl/opts/CURLOPT_NOPROXY.38
-rw-r--r--docs/libcurl/opts/CURLOPT_NOSIGNAL.32
-rw-r--r--docs/libcurl/opts/CURLOPT_OPENSOCKETDATA.32
-rw-r--r--docs/libcurl/opts/CURLOPT_OPENSOCKETFUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PASSWORD.34
-rw-r--r--docs/libcurl/opts/CURLOPT_PATH_AS_IS.34
-rw-r--r--docs/libcurl/opts/CURLOPT_PINNEDPUBLICKEY.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PIPEWAIT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PORT.34
-rw-r--r--docs/libcurl/opts/CURLOPT_POST.34
-rw-r--r--docs/libcurl/opts/CURLOPT_POSTFIELDS.34
-rw-r--r--docs/libcurl/opts/CURLOPT_POSTFIELDSIZE.34
-rw-r--r--docs/libcurl/opts/CURLOPT_POSTFIELDSIZE_LARGE.34
-rw-r--r--docs/libcurl/opts/CURLOPT_POSTQUOTE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_POSTREDIR.34
-rw-r--r--docs/libcurl/opts/CURLOPT_PREQUOTE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PRE_PROXY.34
-rw-r--r--docs/libcurl/opts/CURLOPT_PRIVATE.34
-rw-r--r--docs/libcurl/opts/CURLOPT_PROGRESSDATA.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROGRESSFUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROTOCOLS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY.34
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXYAUTH.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXYHEADER.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXYPASSWORD.34
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXYPORT.34
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXYTYPE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXYUSERNAME.34
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXYUSERPWD.34
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_CAINFO.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_CAPATH.34
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_CRLFILE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_ISSUERCERT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_KEYPASSWD.34
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_PINNEDPUBLICKEY.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_SERVICE_NAME.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_SSLCERT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_SSLCERTTYPE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_SSLKEY.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_SSLKEYTYPE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_SSLVERSION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_SSL_CIPHER_LIST.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_SSL_OPTIONS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_SSL_VERIFYHOST.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_SSL_VERIFYPEER.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_TLS13_CIPHERS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_PASSWORD.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_TYPE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_USERNAME.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_TRANSFER_MODE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PUT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_QUOTE.310
-rw-r--r--docs/libcurl/opts/CURLOPT_RANDOM_FILE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_RANGE.34
-rw-r--r--docs/libcurl/opts/CURLOPT_READDATA.34
-rw-r--r--docs/libcurl/opts/CURLOPT_READFUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_REDIR_PROTOCOLS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_REFERER.36
-rw-r--r--docs/libcurl/opts/CURLOPT_REQUEST_TARGET.34
-rw-r--r--docs/libcurl/opts/CURLOPT_RESOLVE.34
-rw-r--r--docs/libcurl/opts/CURLOPT_RESOLVER_START_DATA.34
-rw-r--r--docs/libcurl/opts/CURLOPT_RESOLVER_START_FUNCTION.34
-rw-r--r--docs/libcurl/opts/CURLOPT_RESUME_FROM.32
-rw-r--r--docs/libcurl/opts/CURLOPT_RESUME_FROM_LARGE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_RTSP_CLIENT_CSEQ.32
-rw-r--r--docs/libcurl/opts/CURLOPT_RTSP_REQUEST.32
-rw-r--r--docs/libcurl/opts/CURLOPT_RTSP_SERVER_CSEQ.32
-rw-r--r--docs/libcurl/opts/CURLOPT_RTSP_SESSION_ID.32
-rw-r--r--docs/libcurl/opts/CURLOPT_RTSP_STREAM_URI.32
-rw-r--r--docs/libcurl/opts/CURLOPT_RTSP_TRANSPORT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SASL_AUTHZID.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SASL_IR.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SEEKDATA.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SEEKFUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SERVICE_NAME.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SHARE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SOCKOPTDATA.34
-rw-r--r--docs/libcurl/opts/CURLOPT_SOCKOPTFUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SOCKS5_AUTH.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_NEC.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_SERVICE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSH_AUTH_TYPES.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSH_COMPRESSION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSH_KEYDATA.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSH_KEYFUNCTION.313
-rw-r--r--docs/libcurl/opts/CURLOPT_SSH_KNOWNHOSTS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSH_PRIVATE_KEYFILE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSH_PUBLIC_KEYFILE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSLCERT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSLCERTTYPE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSLENGINE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSLENGINE_DEFAULT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSLKEY.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSLKEYTYPE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSLVERSION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_CIPHER_LIST.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_CTX_DATA.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_CTX_FUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_EC_CURVES.355
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_ENABLE_ALPN.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_ENABLE_NPN.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_FALSESTART.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_OPTIONS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_SESSIONID_CACHE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_VERIFYHOST.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_VERIFYPEER.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_VERIFYSTATUS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_STDERR.34
-rw-r--r--docs/libcurl/opts/CURLOPT_STREAM_DEPENDS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_STREAM_DEPENDS_E.32
-rw-r--r--docs/libcurl/opts/CURLOPT_STREAM_WEIGHT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SUPPRESS_CONNECT_HEADERS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_TCP_FASTOPEN.34
-rw-r--r--docs/libcurl/opts/CURLOPT_TCP_KEEPALIVE.34
-rw-r--r--docs/libcurl/opts/CURLOPT_TCP_KEEPIDLE.34
-rw-r--r--docs/libcurl/opts/CURLOPT_TCP_KEEPINTVL.34
-rw-r--r--docs/libcurl/opts/CURLOPT_TCP_NODELAY.34
-rw-r--r--docs/libcurl/opts/CURLOPT_TELNETOPTIONS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_TFTP_BLKSIZE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_TFTP_NO_OPTIONS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_TIMECONDITION.34
-rw-r--r--docs/libcurl/opts/CURLOPT_TIMEOUT.34
-rw-r--r--docs/libcurl/opts/CURLOPT_TIMEOUT_MS.34
-rw-r--r--docs/libcurl/opts/CURLOPT_TIMEVALUE.34
-rw-r--r--docs/libcurl/opts/CURLOPT_TIMEVALUE_LARGE.34
-rw-r--r--docs/libcurl/opts/CURLOPT_TLS13_CIPHERS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_TLSAUTH_PASSWORD.32
-rw-r--r--docs/libcurl/opts/CURLOPT_TLSAUTH_TYPE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_TLSAUTH_USERNAME.32
-rw-r--r--docs/libcurl/opts/CURLOPT_TRAILERDATA.32
-rw-r--r--docs/libcurl/opts/CURLOPT_TRAILERFUNCTION.36
-rw-r--r--docs/libcurl/opts/CURLOPT_TRANSFERTEXT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_TRANSFER_ENCODING.34
-rw-r--r--docs/libcurl/opts/CURLOPT_UNIX_SOCKET_PATH.32
-rw-r--r--docs/libcurl/opts/CURLOPT_UNRESTRICTED_AUTH.34
-rw-r--r--docs/libcurl/opts/CURLOPT_UPLOAD.32
-rw-r--r--docs/libcurl/opts/CURLOPT_UPLOAD_BUFFERSIZE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_URL.34
-rw-r--r--docs/libcurl/opts/CURLOPT_USERAGENT.34
-rw-r--r--docs/libcurl/opts/CURLOPT_USERNAME.34
-rw-r--r--docs/libcurl/opts/CURLOPT_USERPWD.34
-rw-r--r--docs/libcurl/opts/CURLOPT_USE_SSL.32
-rw-r--r--docs/libcurl/opts/CURLOPT_VERBOSE.34
-rw-r--r--docs/libcurl/opts/CURLOPT_WILDCARDMATCH.32
-rw-r--r--docs/libcurl/opts/CURLOPT_WRITEDATA.32
-rw-r--r--docs/libcurl/opts/CURLOPT_WRITEFUNCTION.36
-rw-r--r--docs/libcurl/opts/CURLOPT_XFERINFODATA.32
-rw-r--r--docs/libcurl/opts/CURLOPT_XFERINFOFUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_XOAUTH2_BEARER.32
-rw-r--r--docs/libcurl/opts/Makefile.inc4
-rw-r--r--docs/libcurl/symbols-in-versions65
-rw-r--r--docs/options-in-versions2
-rw-r--r--include/Makefile.am2
-rw-r--r--include/README18
-rw-r--r--include/README.md14
-rw-r--r--include/curl/Makefile.am4
-rw-r--r--include/curl/curl.h140
-rw-r--r--include/curl/curlver.h8
-rw-r--r--include/curl/options.h68
-rw-r--r--include/curl/typecheck-gcc.h3
-rw-r--r--lib/CMakeLists.txt9
-rw-r--r--lib/Makefile.Watcom274
-rw-r--r--lib/Makefile.am7
-rw-r--r--lib/Makefile.inc8
-rw-r--r--lib/Makefile.m327
-rw-r--r--lib/altsvc.c22
-rw-r--r--lib/altsvc.h7
-rw-r--r--lib/asyn-ares.c4
-rw-r--r--lib/base64.c5
-rwxr-xr-xlib/checksrc.pl23
-rw-r--r--lib/config-symbian.h793
-rw-r--r--lib/conncache.c34
-rw-r--r--lib/conncache.h4
-rw-r--r--lib/connect.c25
-rw-r--r--lib/content_encoding.c4
-rw-r--r--lib/curl_config.h20
-rw-r--r--lib/curl_config.h.cmake4
-rw-r--r--lib/curl_config.h.in20
-rw-r--r--lib/curl_get_line.c6
-rw-r--r--lib/curl_gethostname.c4
-rw-r--r--lib/curl_gethostname.h4
-rw-r--r--lib/curl_krb5.h (renamed from lib/curl_sec.h)12
-rw-r--r--lib/curl_ntlm_core.c8
-rw-r--r--lib/curl_ntlm_core.h8
-rw-r--r--lib/curl_path.c4
-rw-r--r--lib/curl_printf.h2
-rw-r--r--lib/curl_rtmp.c8
-rw-r--r--lib/curl_setup.h26
-rw-r--r--lib/curl_threads.c6
-rw-r--r--lib/dict.c96
-rw-r--r--lib/doh.c9
-rw-r--r--lib/dynbuf.c48
-rw-r--r--lib/dynbuf.h25
-rw-r--r--lib/easy.c31
-rw-r--r--lib/easygetopt.c96
-rw-r--r--lib/easyoptions.c347
-rw-r--r--lib/easyoptions.h35
-rw-r--r--lib/file.c4
-rw-r--r--lib/fileinfo.h4
-rw-r--r--lib/ftp.c420
-rw-r--r--lib/ftp.h1
-rw-r--r--lib/ftplistparser.c8
-rw-r--r--lib/getinfo.c3
-rw-r--r--lib/gopher.c5
-rw-r--r--lib/hash.c82
-rw-r--r--lib/hash.h48
-rw-r--r--lib/hostip.c6
-rw-r--r--lib/hostip.h8
-rw-r--r--lib/http.c4
-rw-r--r--lib/http2.c119
-rw-r--r--lib/http_proxy.c1
-rw-r--r--lib/imap.c37
-rw-r--r--lib/imap.h5
-rw-r--r--lib/inet_pton.c4
-rw-r--r--lib/krb5.c596
-rw-r--r--lib/ldap.c68
-rw-r--r--lib/libcurl.plist6
-rw-r--r--lib/llist.c12
-rw-r--r--lib/llist.h28
-rw-r--r--lib/memdebug.c51
-rw-r--r--lib/mprintf.c55
-rw-r--r--lib/mqtt.c11
-rw-r--r--lib/mqtt.h2
-rw-r--r--lib/multi.c231
-rw-r--r--lib/multihandle.h18
-rw-r--r--lib/openldap.c4
-rw-r--r--lib/parsedate.c57
-rw-r--r--lib/pingpong.c55
-rw-r--r--lib/pingpong.h4
-rw-r--r--lib/pop3.c3
-rw-r--r--lib/progress.c9
-rw-r--r--lib/progress.h4
-rw-r--r--lib/rtsp.c1
-rw-r--r--lib/security.c579
-rw-r--r--lib/select.c175
-rw-r--r--lib/select.h15
-rw-r--r--lib/sendf.c58
-rw-r--r--lib/sendf.h4
-rw-r--r--lib/setopt.c248
-rw-r--r--lib/setup-win32.h3
-rw-r--r--lib/share.c2
-rw-r--r--lib/share.h6
-rw-r--r--lib/smb.c11
-rw-r--r--lib/smb.h9
-rw-r--r--lib/smtp.c3
-rw-r--r--lib/socketpair.c4
-rw-r--r--lib/socks.c165
-rw-r--r--lib/socks.h26
-rw-r--r--lib/strerror.c40
-rw-r--r--lib/system_win32.c11
-rw-r--r--lib/telnet.c132
-rw-r--r--lib/tftp.c1
-rw-r--r--lib/url.c176
-rw-r--r--lib/urlapi.c6
-rw-r--r--lib/urldata.h33
-rw-r--r--lib/version.c17
-rw-r--r--lib/vquic/ngtcp2.c21
-rw-r--r--lib/vquic/quiche.c1
-rw-r--r--lib/vssh/libssh.c36
-rw-r--r--lib/vssh/libssh2.c137
-rw-r--r--lib/vtls/gskit.c2
-rw-r--r--lib/vtls/gtls.c63
-rw-r--r--lib/vtls/mbedtls.c14
-rw-r--r--lib/vtls/mesalink.c22
-rw-r--r--lib/vtls/nss.c65
-rw-r--r--lib/vtls/openssl.c110
-rw-r--r--lib/vtls/schannel.c55
-rw-r--r--lib/vtls/schannel.h10
-rw-r--r--lib/vtls/sectransp.c20
-rw-r--r--lib/vtls/vtls.c15
-rw-r--r--lib/vtls/vtls.h16
-rw-r--r--lib/vtls/wolfssl.c22
-rw-r--r--lib/wildcard.h12
-rw-r--r--local-configure.patch14
-rw-r--r--m4/curl-compilers.m48
-rw-r--r--m4/curl-confopts.m442
-rw-r--r--m4/libtool.m418
-rw-r--r--packages/Makefile.am10
-rw-r--r--packages/Symbian/bwins/libcurlu.def60
-rw-r--r--packages/Symbian/eabi/libcurlu.def60
-rw-r--r--packages/Symbian/group/bld.inf10
-rw-r--r--packages/Symbian/group/curl.iby15
-rw-r--r--packages/Symbian/group/curl.mmp64
-rw-r--r--packages/Symbian/group/curl.pkg26
-rw-r--r--packages/Symbian/group/libcurl.iby14
-rw-r--r--packages/Symbian/group/libcurl.mmp67
-rw-r--r--packages/Symbian/group/libcurl.pkg22
-rw-r--r--packages/Symbian/readme.txt93
-rw-r--r--projects/Windows/VC10/lib/libcurl.vcxproj6
-rw-r--r--projects/Windows/VC10/src/curl.vcxproj2
-rw-r--r--projects/Windows/VC11/lib/libcurl.vcxproj6
-rw-r--r--projects/Windows/VC11/src/curl.vcxproj2
-rw-r--r--projects/Windows/VC12/lib/libcurl.vcxproj6
-rw-r--r--projects/Windows/VC12/src/curl.vcxproj2
-rw-r--r--projects/Windows/VC14/lib/libcurl.vcxproj6
-rw-r--r--projects/Windows/VC14/src/curl.vcxproj2
-rw-r--r--projects/Windows/VC15/lib/libcurl.vcxproj6
-rw-r--r--projects/Windows/VC15/src/curl.vcxproj2
-rw-r--r--projects/Windows/VC6/lib/libcurl.dsp24
-rw-r--r--projects/Windows/VC6/src/curl.dsp8
-rw-r--r--projects/Windows/VC7.1/lib/libcurl.vcproj18
-rw-r--r--projects/Windows/VC7.1/src/curl.vcproj6
-rw-r--r--projects/Windows/VC7/lib/libcurl.vcproj18
-rw-r--r--projects/Windows/VC7/src/curl.vcproj6
-rw-r--r--projects/Windows/VC8/lib/libcurl.vcproj24
-rw-r--r--projects/Windows/VC8/src/curl.vcproj8
-rw-r--r--projects/Windows/VC9/lib/libcurl.vcproj24
-rw-r--r--projects/Windows/VC9/src/curl.vcproj8
-rw-r--r--projects/build-wolfssl.bat20
-rw-r--r--projects/generate.bat2
-rw-r--r--src/CMakeLists.txt6
-rw-r--r--src/Makefile.Watcom234
-rw-r--r--src/Makefile.am4
-rw-r--r--src/Makefile.inc6
-rw-r--r--src/Makefile.m329
-rw-r--r--src/tool_cb_hdr.c68
-rw-r--r--src/tool_cb_wrt.c32
-rw-r--r--src/tool_cfgable.c1
-rw-r--r--src/tool_cfgable.h3
-rw-r--r--src/tool_easysrc.c4
-rw-r--r--src/tool_getparam.c19
-rw-r--r--src/tool_getpass.c10
-rw-r--r--src/tool_help.c842
-rw-r--r--src/tool_help.h4
-rw-r--r--src/tool_homedir.c45
-rw-r--r--src/tool_homedir.h4
-rw-r--r--src/tool_hugehelp.c10352
-rw-r--r--src/tool_main.c5
-rw-r--r--src/tool_operate.c94
-rw-r--r--src/tool_operate.h5
-rw-r--r--src/tool_panykey.c10
-rw-r--r--src/tool_panykey.h8
-rw-r--r--src/tool_paramhlp.c116
-rw-r--r--src/tool_parsecfg.c71
-rw-r--r--src/tool_setopt.c56
-rw-r--r--src/tool_setopt.h11
-rw-r--r--src/tool_urlglob.c50
-rw-r--r--src/tool_version.h2
-rw-r--r--src/tool_writeout.c34
-rw-r--r--src/tool_writeout.h4
-rw-r--r--src/tool_writeout_json.c22
-rw-r--r--src/tool_writeout_json.h4
-rwxr-xr-xtest-driver10
-rw-r--r--tests/CMakeLists.txt4
-rw-r--r--tests/FILEFORMAT.md40
-rw-r--r--tests/Makefile.am2
-rw-r--r--tests/README.md (renamed from tests/README)214
-rw-r--r--tests/appveyor.pm10
-rw-r--r--tests/azure.pm19
-rw-r--r--tests/data/DISABLED33
-rw-r--r--tests/data/Makefile.inc86
-rw-r--r--tests/data/test14
-rw-r--r--tests/data/test104
-rw-r--r--tests/data/test10016
-rw-r--r--tests/data/test100210
-rw-r--r--tests/data/test10044
-rw-r--r--tests/data/test10087
-rw-r--r--tests/data/test10116
-rw-r--r--tests/data/test10126
-rw-r--r--tests/data/test10155
-rw-r--r--tests/data/test10218
-rw-r--r--tests/data/test10246
-rw-r--r--tests/data/test10256
-rw-r--r--tests/data/test10284
-rw-r--r--tests/data/test10294
-rw-r--r--tests/data/test10306
-rw-r--r--tests/data/test10315
-rw-r--r--tests/data/test10324
-rw-r--r--tests/data/test10334
-rw-r--r--tests/data/test10353
-rw-r--r--tests/data/test10404
-rw-r--r--tests/data/test10414
-rw-r--r--tests/data/test10424
-rw-r--r--tests/data/test10434
-rw-r--r--tests/data/test10454
-rw-r--r--tests/data/test10464
-rw-r--r--tests/data/test10515
-rw-r--r--tests/data/test10525
-rw-r--r--tests/data/test10536
-rw-r--r--tests/data/test10545
-rw-r--r--tests/data/test10554
-rw-r--r--tests/data/test10565
-rw-r--r--tests/data/test10584
-rw-r--r--tests/data/test10594
-rw-r--r--tests/data/test106010
-rw-r--r--tests/data/test106110
-rw-r--r--tests/data/test10645
-rw-r--r--tests/data/test10655
-rw-r--r--tests/data/test10665
-rw-r--r--tests/data/test10675
-rw-r--r--tests/data/test10684
-rw-r--r--tests/data/test10704
-rw-r--r--tests/data/test10715
-rw-r--r--tests/data/test10724
-rw-r--r--tests/data/test10734
-rw-r--r--tests/data/test10745
-rw-r--r--tests/data/test10755
-rw-r--r--tests/data/test10766
-rw-r--r--tests/data/test10775
-rw-r--r--tests/data/test10786
-rw-r--r--tests/data/test10795
-rw-r--r--tests/data/test10805
-rw-r--r--tests/data/test10815
-rw-r--r--tests/data/test10824
-rw-r--r--tests/data/test10834
-rw-r--r--tests/data/test10876
-rw-r--r--tests/data/test10886
-rw-r--r--tests/data/test10895
-rw-r--r--tests/data/test10905
-rw-r--r--tests/data/test10924
-rw-r--r--tests/data/test10956
-rw-r--r--tests/data/test10961
-rw-r--r--tests/data/test10977
-rw-r--r--tests/data/test10985
-rw-r--r--tests/data/test115
-rw-r--r--tests/data/test110010
-rw-r--r--tests/data/test11014
-rw-r--r--tests/data/test11045
-rw-r--r--tests/data/test11054
-rw-r--r--tests/data/test11064
-rw-r--r--tests/data/test11094
-rw-r--r--tests/data/test11104
-rw-r--r--tests/data/test11114
-rw-r--r--tests/data/test11154
-rw-r--r--tests/data/test11164
-rw-r--r--tests/data/test11175
-rw-r--r--tests/data/test11184
-rw-r--r--tests/data/test11191
-rw-r--r--tests/data/test11214
-rw-r--r--tests/data/test11224
-rw-r--r--tests/data/test11234
-rw-r--r--tests/data/test11244
-rw-r--r--tests/data/test11254
-rw-r--r--tests/data/test11264
-rw-r--r--tests/data/test11274
-rw-r--r--tests/data/test11285
-rw-r--r--tests/data/test11297
-rw-r--r--tests/data/test11305
-rw-r--r--tests/data/test11315
-rw-r--r--tests/data/test11334
-rw-r--r--tests/data/test11345
-rw-r--r--tests/data/test11386
-rw-r--r--tests/data/test11415
-rw-r--r--tests/data/test11424
-rw-r--r--tests/data/test11434
-rw-r--r--tests/data/test11444
-rw-r--r--tests/data/test11484
-rw-r--r--tests/data/test11505
-rw-r--r--tests/data/test11514
-rw-r--r--tests/data/test11546
-rw-r--r--tests/data/test11554
-rw-r--r--tests/data/test11574
-rw-r--r--tests/data/test11584
-rw-r--r--tests/data/test11594
-rw-r--r--tests/data/test11604
-rw-r--r--tests/data/test11614
-rw-r--r--tests/data/test11644
-rw-r--r--tests/data/test11665
-rw-r--r--tests/data/test11685
-rw-r--r--tests/data/test11704
-rw-r--r--tests/data/test11714
-rw-r--r--tests/data/test11724
-rw-r--r--tests/data/test11744
-rw-r--r--tests/data/test11764
-rw-r--r--tests/data/test11784
-rw-r--r--tests/data/test1181
-rw-r--r--tests/data/test1191
-rw-r--r--tests/data/test11975
-rw-r--r--tests/data/test124
-rw-r--r--tests/data/test12045
-rw-r--r--tests/data/test12054
-rw-r--r--tests/data/test12104
-rw-r--r--tests/data/test12124
-rw-r--r--tests/data/test12134
-rw-r--r--tests/data/test12144
-rw-r--r--tests/data/test12157
-rw-r--r--tests/data/test12165
-rw-r--r--tests/data/test12186
-rw-r--r--tests/data/test12234
-rw-r--r--tests/data/test12285
-rw-r--r--tests/data/test12295
-rw-r--r--tests/data/test12305
-rw-r--r--tests/data/test12315
-rw-r--r--tests/data/test12325
-rw-r--r--tests/data/test123511
-rw-r--r--tests/data/test12374
-rw-r--r--tests/data/test12394
-rw-r--r--tests/data/test12405
-rw-r--r--tests/data/test12415
-rw-r--r--tests/data/test12444
-rw-r--r--tests/data/test12454
-rw-r--r--tests/data/test12465
-rw-r--r--tests/data/test12484
-rw-r--r--tests/data/test12494
-rw-r--r--tests/data/test12504
-rw-r--r--tests/data/test12514
-rw-r--r--tests/data/test12524
-rw-r--r--tests/data/test12534
-rw-r--r--tests/data/test12544
-rw-r--r--tests/data/test12554
-rw-r--r--tests/data/test12564
-rw-r--r--tests/data/test12574
-rw-r--r--tests/data/test12585
-rw-r--r--tests/data/test12594
-rw-r--r--tests/data/test12614
-rw-r--r--tests/data/test12654
-rw-r--r--tests/data/test12664
-rw-r--r--tests/data/test12674
-rw-r--r--tests/data/test12704
-rw-r--r--tests/data/test12714
-rw-r--r--tests/data/test12807
-rw-r--r--tests/data/test12834
-rw-r--r--tests/data/test12845
-rw-r--r--tests/data/test12855
-rw-r--r--tests/data/test12867
-rw-r--r--tests/data/test12875
-rw-r--r--tests/data/test12885
-rw-r--r--tests/data/test12904
-rw-r--r--tests/data/test12924
-rw-r--r--tests/data/test12934
-rw-r--r--tests/data/test12944
-rw-r--r--tests/data/test12954
-rw-r--r--tests/data/test12964
-rw-r--r--tests/data/test129765
-rw-r--r--tests/data/test12984
-rw-r--r--tests/data/test12994
-rw-r--r--tests/data/test134
-rw-r--r--tests/data/test13107
-rw-r--r--tests/data/test13114
-rw-r--r--tests/data/test13124
-rw-r--r--tests/data/test13134
-rw-r--r--tests/data/test13145
-rw-r--r--tests/data/test13154
-rw-r--r--tests/data/test13174
-rw-r--r--tests/data/test13185
-rw-r--r--tests/data/test13195
-rw-r--r--tests/data/test13205
-rw-r--r--tests/data/test13215
-rw-r--r--tests/data/test13224
-rw-r--r--tests/data/test13244
-rw-r--r--tests/data/test13255
-rw-r--r--tests/data/test13285
-rw-r--r--tests/data/test13315
-rw-r--r--tests/data/test13326
-rw-r--r--tests/data/test13334
-rw-r--r--tests/data/test13344
-rw-r--r--tests/data/test13354
-rw-r--r--tests/data/test13364
-rw-r--r--tests/data/test13374
-rw-r--r--tests/data/test13384
-rw-r--r--tests/data/test13394
-rw-r--r--tests/data/test13404
-rw-r--r--tests/data/test13414
-rw-r--r--tests/data/test13424
-rw-r--r--tests/data/test13434
-rw-r--r--tests/data/test13444
-rw-r--r--tests/data/test13454
-rw-r--r--tests/data/test13464
-rw-r--r--tests/data/test13474
-rw-r--r--tests/data/test13644
-rw-r--r--tests/data/test13654
-rw-r--r--tests/data/test13664
-rw-r--r--tests/data/test13674
-rw-r--r--tests/data/test13684
-rw-r--r--tests/data/test13694
-rw-r--r--tests/data/test13704
-rw-r--r--tests/data/test13714
-rw-r--r--tests/data/test13724
-rw-r--r--tests/data/test13734
-rw-r--r--tests/data/test13744
-rw-r--r--tests/data/test13754
-rw-r--r--tests/data/test13764
-rw-r--r--tests/data/test13774
-rw-r--r--tests/data/test1381
-rw-r--r--tests/data/test145
-rw-r--r--tests/data/test14005
-rw-r--r--tests/data/test14015
-rw-r--r--tests/data/test14025
-rw-r--r--tests/data/test14035
-rw-r--r--tests/data/test14044
-rw-r--r--tests/data/test14085
-rw-r--r--tests/data/test14114
-rw-r--r--tests/data/test141210
-rw-r--r--tests/data/test14135
-rw-r--r--tests/data/test14154
-rw-r--r--tests/data/test14164
-rw-r--r--tests/data/test14174
-rw-r--r--tests/data/test14187
-rw-r--r--tests/data/test14195
-rw-r--r--tests/data/test14215
-rw-r--r--tests/data/test14224
-rw-r--r--tests/data/test14234
-rw-r--r--tests/data/test14244
-rw-r--r--tests/data/test1425bin1726 -> 1721 bytes
-rw-r--r--tests/data/test1426bin1663 -> 1658 bytes
-rw-r--r--tests/data/test14287
-rw-r--r--tests/data/test14294
-rw-r--r--tests/data/test14304
-rw-r--r--tests/data/test14314
-rw-r--r--tests/data/test14324
-rw-r--r--tests/data/test14334
-rw-r--r--tests/data/test14344
-rw-r--r--tests/data/test14354
-rw-r--r--tests/data/test14366
-rw-r--r--tests/data/test14376
-rw-r--r--tests/data/test14384
-rw-r--r--tests/data/test14396
-rw-r--r--tests/data/test14434
-rw-r--r--tests/data/test14485
-rw-r--r--tests/data/test14554
-rw-r--r--tests/data/test14565
-rw-r--r--tests/data/test14574
-rw-r--r--tests/data/test14584
-rw-r--r--tests/data/test14603
-rw-r--r--tests/data/test146153
-rw-r--r--tests/data/test146261
-rw-r--r--tests/data/test146344
-rw-r--r--tests/data/test146444
-rw-r--r--tests/data/test1465bin0 -> 2914 bytes
-rw-r--r--tests/data/test154
-rw-r--r--tests/data/test1507
-rw-r--r--tests/data/test15023
-rw-r--r--tests/data/test15033
-rw-r--r--tests/data/test15043
-rw-r--r--tests/data/test15053
-rw-r--r--tests/data/test1515
-rw-r--r--tests/data/test1525
-rw-r--r--tests/data/test15246
-rw-r--r--tests/data/test15310
-rw-r--r--tests/data/test15383
-rw-r--r--tests/data/test1546
-rw-r--r--tests/data/test1557
-rw-r--r--tests/data/test15513
-rw-r--r--tests/data/test15565
-rw-r--r--tests/data/test1565
-rw-r--r--tests/data/test15617
-rw-r--r--tests/data/test15626
-rw-r--r--tests/data/test15634
-rw-r--r--tests/data/test15666
-rw-r--r--tests/data/test15673
-rw-r--r--tests/data/test1574
-rw-r--r--tests/data/test1583
-rw-r--r--tests/data/test1595
-rw-r--r--tests/data/test15913
-rw-r--r--tests/data/test15933
-rw-r--r--tests/data/test15943
-rw-r--r--tests/data/test15953
-rw-r--r--tests/data/test15963
-rw-r--r--tests/data/test164
-rw-r--r--tests/data/test1605
-rw-r--r--tests/data/test1625
-rw-r--r--tests/data/test1634
-rw-r--r--tests/data/test16304
-rw-r--r--tests/data/test16313
-rw-r--r--tests/data/test16323
-rw-r--r--tests/data/test16337
-rw-r--r--tests/data/test1644
-rw-r--r--tests/data/test1655
-rw-r--r--tests/data/test1664
-rw-r--r--tests/data/test1677
-rw-r--r--tests/data/test1689
-rw-r--r--tests/data/test1699
-rw-r--r--tests/data/test1705
-rw-r--r--tests/data/test17003
-rw-r--r--tests/data/test17012
-rw-r--r--tests/data/test17022
-rw-r--r--tests/data/test1714
-rw-r--r--tests/data/test1724
-rw-r--r--tests/data/test1734
-rw-r--r--tests/data/test1745
-rw-r--r--tests/data/test1757
-rw-r--r--tests/data/test1767
-rw-r--r--tests/data/test1775
-rw-r--r--tests/data/test1784
-rw-r--r--tests/data/test1794
-rw-r--r--tests/data/test189
-rw-r--r--tests/data/test1804
-rw-r--r--tests/data/test18004
-rw-r--r--tests/data/test18014
-rw-r--r--tests/data/test1814
-rw-r--r--tests/data/test1837
-rw-r--r--tests/data/test1846
-rw-r--r--tests/data/test1856
-rw-r--r--tests/data/test1864
-rw-r--r--tests/data/test1875
-rw-r--r--tests/data/test1887
-rw-r--r--tests/data/test1897
-rw-r--r--tests/data/test190061
-rw-r--r--tests/data/test190163
-rw-r--r--tests/data/test190262
-rw-r--r--tests/data/test190362
-rw-r--r--tests/data/test19047
-rw-r--r--tests/data/test19053
-rw-r--r--tests/data/test19063
-rw-r--r--tests/data/test19073
-rw-r--r--tests/data/test190818
-rw-r--r--tests/data/test19095
-rw-r--r--tests/data/test19105
-rw-r--r--tests/data/test1911 (renamed from tests/data/test1541)19
-rw-r--r--tests/data/test191230
-rw-r--r--tests/data/test191341
-rw-r--r--tests/data/test191442
-rw-r--r--tests/data/test1924
-rw-r--r--tests/data/test1935
-rw-r--r--tests/data/test1944
-rw-r--r--tests/data/test1975
-rw-r--r--tests/data/test1985
-rw-r--r--tests/data/test1995
-rw-r--r--tests/data/test24
-rw-r--r--tests/data/test20014
-rw-r--r--tests/data/test20024
-rw-r--r--tests/data/test20035
-rw-r--r--tests/data/test20054
-rw-r--r--tests/data/test20064
-rw-r--r--tests/data/test20074
-rw-r--r--tests/data/test20084
-rw-r--r--tests/data/test20094
-rw-r--r--tests/data/test20104
-rw-r--r--tests/data/test20114
-rw-r--r--tests/data/test20124
-rw-r--r--tests/data/test20233
-rw-r--r--tests/data/test20243
-rw-r--r--tests/data/test20253
-rw-r--r--tests/data/test20263
-rw-r--r--tests/data/test20273
-rw-r--r--tests/data/test20283
-rw-r--r--tests/data/test20293
-rw-r--r--tests/data/test20303
-rw-r--r--tests/data/test20313
-rw-r--r--tests/data/test20323
-rw-r--r--tests/data/test2033125
-rw-r--r--tests/data/test20344
-rw-r--r--tests/data/test20363
-rw-r--r--tests/data/test20373
-rw-r--r--tests/data/test20405
-rw-r--r--tests/data/test20414
-rw-r--r--tests/data/test20465
-rw-r--r--tests/data/test20475
-rw-r--r--tests/data/test20497
-rw-r--r--tests/data/test20505
-rw-r--r--tests/data/test20516
-rw-r--r--tests/data/test20525
-rw-r--r--tests/data/test20535
-rw-r--r--tests/data/test20547
-rw-r--r--tests/data/test20555
-rw-r--r--tests/data/test20564
-rw-r--r--tests/data/test20575
-rw-r--r--tests/data/test20586
-rw-r--r--tests/data/test20596
-rw-r--r--tests/data/test2067
-rw-r--r--tests/data/test20606
-rw-r--r--tests/data/test20616
-rw-r--r--tests/data/test20626
-rw-r--r--tests/data/test20636
-rw-r--r--tests/data/test20646
-rw-r--r--tests/data/test20656
-rw-r--r--tests/data/test20666
-rw-r--r--tests/data/test20675
-rw-r--r--tests/data/test20685
-rw-r--r--tests/data/test20695
-rw-r--r--tests/data/test2074
-rw-r--r--tests/data/test20704
-rw-r--r--tests/data/test20734
-rw-r--r--tests/data/test20744
-rw-r--r--tests/data/test20765
-rw-r--r--tests/data/test20784
-rw-r--r--tests/data/test2084
-rw-r--r--tests/data/test2097
-rw-r--r--tests/data/test2100bin1647 -> 1642 bytes
-rw-r--r--tests/data/test2137
-rw-r--r--tests/data/test2144
-rw-r--r--tests/data/test2174
-rw-r--r--tests/data/test2184
-rw-r--r--tests/data/test225
-rw-r--r--tests/data/test2204
-rw-r--r--tests/data/test2214
-rw-r--r--tests/data/test2224
-rw-r--r--tests/data/test2234
-rw-r--r--tests/data/test2244
-rw-r--r--tests/data/test2304
-rw-r--r--tests/data/test2324
-rw-r--r--tests/data/test2335
-rw-r--r--tests/data/test2345
-rw-r--r--tests/data/test2353
-rw-r--r--tests/data/test2361
-rw-r--r--tests/data/test2397
-rw-r--r--tests/data/test245
-rw-r--r--tests/data/test2404
-rw-r--r--tests/data/test2414
-rw-r--r--tests/data/test2424
-rw-r--r--tests/data/test2439
-rw-r--r--tests/data/test2457
-rw-r--r--tests/data/test2467
-rw-r--r--tests/data/test2494
-rw-r--r--tests/data/test2515
-rw-r--r--tests/data/test2564
-rw-r--r--tests/data/test2579
-rw-r--r--tests/data/test2586
-rw-r--r--tests/data/test2596
-rw-r--r--tests/data/test265
-rw-r--r--tests/data/test2604
-rw-r--r--tests/data/test262bin1137 -> 1132 bytes
-rw-r--r--tests/data/test2634
-rw-r--r--tests/data/test2644
-rw-r--r--tests/data/test2657
-rw-r--r--tests/data/test2664
-rw-r--r--tests/data/test2677
-rw-r--r--tests/data/test2684
-rw-r--r--tests/data/test2694
-rw-r--r--tests/data/test276
-rw-r--r--tests/data/test2736
-rw-r--r--tests/data/test2745
-rw-r--r--tests/data/test2757
-rw-r--r--tests/data/test2765
-rw-r--r--tests/data/test2775
-rw-r--r--tests/data/test2784
-rw-r--r--tests/data/test2794
-rw-r--r--tests/data/test285
-rw-r--r--tests/data/test2814
-rw-r--r--tests/data/test2824
-rw-r--r--tests/data/test294
-rw-r--r--tests/data/test2924
-rw-r--r--tests/data/test2934
-rw-r--r--tests/data/test2994
-rw-r--r--tests/data/test34
-rw-r--r--tests/data/test304
-rw-r--r--tests/data/test3004
-rw-r--r--tests/data/test30004
-rw-r--r--tests/data/test30014
-rw-r--r--tests/data/test300857
-rw-r--r--tests/data/test300957
-rw-r--r--tests/data/test3014
-rw-r--r--tests/data/test301157
-rw-r--r--tests/data/test301260
-rw-r--r--tests/data/test301368
-rw-r--r--tests/data/test301456
-rw-r--r--tests/data/test301578
-rw-r--r--tests/data/test3023
-rw-r--r--tests/data/test3034
-rw-r--r--tests/data/test3044
-rw-r--r--tests/data/test3053
-rw-r--r--tests/data/test3064
-rw-r--r--tests/data/test3074
-rw-r--r--tests/data/test3095
-rw-r--r--tests/data/test314
-rw-r--r--tests/data/test3104
-rw-r--r--tests/data/test3144
-rw-r--r--tests/data/test3154
-rw-r--r--tests/data/test3164
-rw-r--r--tests/data/test3175
-rw-r--r--tests/data/test3185
-rw-r--r--tests/data/test3194
-rw-r--r--tests/data/test325
-rw-r--r--tests/data/test3254
-rw-r--r--tests/data/test3264
-rw-r--r--tests/data/test3275
-rw-r--r--tests/data/test3282
-rw-r--r--tests/data/test3295
-rw-r--r--tests/data/test335
-rw-r--r--tests/data/test3305
-rw-r--r--tests/data/test3315
-rw-r--r--tests/data/test3344
-rw-r--r--tests/data/test3359
-rw-r--r--tests/data/test3385
-rw-r--r--tests/data/test3398
-rw-r--r--tests/data/test344
-rw-r--r--tests/data/test3413
-rw-r--r--tests/data/test3426
-rw-r--r--tests/data/test3438
-rw-r--r--tests/data/test3446
-rw-r--r--tests/data/test3458
-rw-r--r--tests/data/test3464
-rw-r--r--tests/data/test34760
-rw-r--r--tests/data/test34861
-rw-r--r--tests/data/test35bin810 -> 805 bytes
-rw-r--r--tests/data/test3554
-rw-r--r--tests/data/test3564
-rw-r--r--tests/data/test3575
-rw-r--r--tests/data/test364
-rw-r--r--tests/data/test374
-rw-r--r--tests/data/test384
-rw-r--r--tests/data/test394
-rw-r--r--tests/data/test3934
-rw-r--r--tests/data/test3944
-rw-r--r--tests/data/test3954
-rw-r--r--tests/data/test3964
-rw-r--r--tests/data/test3974
-rw-r--r--tests/data/test45
-rw-r--r--tests/data/test406
-rw-r--r--tests/data/test426
-rw-r--r--tests/data/test435
-rw-r--r--tests/data/test4306
-rw-r--r--tests/data/test4316
-rw-r--r--tests/data/test4326
-rw-r--r--tests/data/test43357
-rw-r--r--tests/data/test43446
-rw-r--r--tests/data/test444
-rw-r--r--tests/data/test455
-rw-r--r--tests/data/test464
-rw-r--r--tests/data/test474
-rw-r--r--tests/data/test485
-rw-r--r--tests/data/test496
-rw-r--r--tests/data/test4905
-rw-r--r--tests/data/test4914
-rw-r--r--tests/data/test4927
-rw-r--r--tests/data/test54
-rw-r--r--tests/data/test506
-rw-r--r--tests/data/test516
-rw-r--r--tests/data/test5114
-rw-r--r--tests/data/test5123
-rw-r--r--tests/data/test5143
-rw-r--r--tests/data/test5153
-rw-r--r--tests/data/test5163
-rw-r--r--tests/data/test526
-rw-r--r--tests/data/test5223
-rw-r--r--tests/data/test5233
-rw-r--r--tests/data/test534
-rw-r--r--tests/data/test53083
-rw-r--r--tests/data/test5332
-rw-r--r--tests/data/test5342
-rw-r--r--tests/data/test544
-rw-r--r--tests/data/test5403
-rw-r--r--tests/data/test5443
-rw-r--r--tests/data/test5462
-rw-r--r--tests/data/test5476
-rw-r--r--tests/data/test5486
-rw-r--r--tests/data/test5493
-rw-r--r--tests/data/test556
-rw-r--r--tests/data/test5503
-rw-r--r--tests/data/test5513
-rw-r--r--tests/data/test552bin142947 -> 2967 bytes
-rw-r--r--tests/data/test55321
-rw-r--r--tests/data/test5556
-rw-r--r--tests/data/test5563
-rw-r--r--tests/data/test5584
-rw-r--r--tests/data/test564
-rw-r--r--tests/data/test5603
-rw-r--r--tests/data/test5613
-rw-r--r--tests/data/test574
-rw-r--r--tests/data/test5733
-rw-r--r--tests/data/test584
-rw-r--r--tests/data/test5803
-rw-r--r--tests/data/test5813
-rw-r--r--tests/data/test584102
-rw-r--r--tests/data/test5853
-rw-r--r--tests/data/test5893
-rw-r--r--tests/data/test594
-rw-r--r--tests/data/test5907
-rw-r--r--tests/data/test64
-rw-r--r--tests/data/test604
-rw-r--r--tests/data/test614
-rw-r--r--tests/data/test625
-rw-r--r--tests/data/test634
-rw-r--r--tests/data/test646
-rw-r--r--tests/data/test656
-rw-r--r--tests/data/test6583
-rw-r--r--tests/data/test6593
-rw-r--r--tests/data/test664
-rw-r--r--tests/data/test6625
-rw-r--r--tests/data/test6635
-rw-r--r--tests/data/test6696
-rw-r--r--tests/data/test677
-rw-r--r--tests/data/test6743
-rw-r--r--tests/data/test687
-rw-r--r--tests/data/test699
-rw-r--r--tests/data/test74
-rw-r--r--tests/data/test707
-rw-r--r--tests/data/test7004
-rw-r--r--tests/data/test7014
-rw-r--r--tests/data/test7022
-rw-r--r--tests/data/test7032
-rw-r--r--tests/data/test7084
-rw-r--r--tests/data/test7094
-rw-r--r--tests/data/test7104
-rw-r--r--tests/data/test7162
-rw-r--r--tests/data/test7174
-rw-r--r--tests/data/test727
-rw-r--r--tests/data/test734
-rw-r--r--tests/data/test745
-rw-r--r--tests/data/test753
-rw-r--r--tests/data/test763
-rw-r--r--tests/data/test774
-rw-r--r--tests/data/test784
-rw-r--r--tests/data/test794
-rw-r--r--tests/data/test84
-rw-r--r--tests/data/test807
-rw-r--r--tests/data/test817
-rw-r--r--tests/data/test825
-rw-r--r--tests/data/test837
-rw-r--r--tests/data/test845
-rw-r--r--tests/data/test855
-rw-r--r--tests/data/test869
-rw-r--r--tests/data/test886
-rw-r--r--tests/data/test8911
-rw-r--r--tests/data/test94
-rw-r--r--tests/data/test9013
-rw-r--r--tests/data/test919
-rw-r--r--tests/data/test924
-rw-r--r--tests/data/test934
-rw-r--r--tests/data/test945
-rw-r--r--tests/data/test957
-rw-r--r--tests/data/test974
-rw-r--r--tests/data/test9706
-rw-r--r--tests/data/test9715
-rw-r--r--tests/data/test984
-rw-r--r--tests/data/test994
-rwxr-xr-xtests/ftpserver.pl17
-rw-r--r--tests/getpart.pm7
-rw-r--r--tests/libtest/Makefile.inc36
-rw-r--r--tests/libtest/lib1538.c14
-rw-r--r--tests/libtest/lib1541.c151
-rw-r--r--tests/libtest/lib1560.c10
-rw-r--r--tests/libtest/lib1592.c10
-rw-r--r--tests/libtest/lib1900.c248
-rw-r--r--tests/libtest/lib1908.c15
-rw-r--r--tests/libtest/lib1911.c87
-rw-r--r--tests/libtest/lib1912.c80
-rw-r--r--tests/libtest/lib1913.c48
-rw-r--r--tests/libtest/lib505.c4
-rw-r--r--tests/libtest/lib530.c122
-rw-r--r--tests/libtest/lib541.c4
-rw-r--r--tests/libtest/lib556.c4
-rw-r--r--tests/libtest/lib583.c11
-rw-r--r--tests/libtest/lib661.c2
-rwxr-xr-xtests/libtest/mk-lib1521.pl12
-rw-r--r--tests/libtest/sethostname.h2
-rw-r--r--tests/libtest/test.h46
-rw-r--r--tests/options-scan.pl4
-rw-r--r--tests/runtests.12
-rwxr-xr-xtests/runtests.pl176
-rw-r--r--tests/server/sockfilt.c6
-rw-r--r--tests/server/util.c11
-rwxr-xr-xtests/symbol-scan.pl2
-rw-r--r--tests/testcurl.12
-rwxr-xr-xtests/testcurl.pl10
-rw-r--r--tests/unit/Makefile.am4
-rw-r--r--tests/unit/README.md (renamed from tests/unit/README)42
-rw-r--r--tests/unit/unit1300.c30
-rw-r--r--tests/unit/unit1305.c2
-rw-r--r--tests/unit/unit1602.c4
-rw-r--r--tests/unit/unit1603.c4
-rw-r--r--tests/unit/unit1654.c4
-rw-r--r--winbuild/BUILD.WINDOWS.txt130
-rw-r--r--winbuild/MakefileBuild.vc5
-rw-r--r--winbuild/README.md127
1612 files changed, 17497 insertions, 18439 deletions
diff --git a/Android.bp b/Android.bp
index ab892e5c..4f85619a 100644
--- a/Android.bp
+++ b/Android.bp
@@ -83,6 +83,7 @@ cc_binary {
defaults: ["curl_common_defaults"],
srcs: [
"src/*.c",
+ "lib/dynbuf.c",
],
shared_libs: [
"libcrypto",
diff --git a/CHANGES b/CHANGES
index 51a99f4d..b5bc3059 100644
--- a/CHANGES
+++ b/CHANGES
@@ -6,6 +6,1806 @@
Changelog
+Version 7.73.0 (14 Oct 2020)
+
+Daniel Stenberg (14 Oct 2020)
+- RELEASE-NOTES: synced
+
+ for 7.73.0
+
+- THANKS: from 7.73.0 and .mailmap fixes
+
+- mailmap: fixups of some contributors
+
+- projects/build-wolfssl.bat: fix the copyright year range
+
+Marc Hoersken (14 Oct 2020)
+- [Sergei Nikulov brought this change]
+
+ CI/tests: fix invocation of tests for CMake builds
+
+ Update appveyor.yml to set env variable TFLAGS and run tests
+ Remove curly braces due to CMake error (${TFLAGS} -> $TFLAGS)
+ Move testdeps build to build step (per review comments)
+
+ Reviewed-by: Marc Hörsken
+
+ Closes #6066
+ Fixes #6052
+
+- tests/server/util.c: fix support for Windows Unicode builds
+
+ Detected via #6066
+ Closes #6070
+
+Daniel Stenberg (13 Oct 2020)
+- [Jay Satiro brought this change]
+
+ strerror: Revert to local codepage for Windows error string
+
+ - Change get_winapi_error() to return the error string in the local
+ codepage instead of UTF-8 encoding.
+
+ Two weeks ago bed5f84 fixed get_winapi_error() to work on xbox, but it
+ also changed the error string's encoding from local codepage to UTF-8.
+
+ We return the local codepage version of the error string because if it
+ is output to the user's terminal it will likely be with functions which
+ expect the local codepage (eg fprintf, failf, infof).
+
+ This is essentially a partial revert of bed5f84. The support for xbox
+ remains but the error string is reverted back to local codepage.
+
+ Ref: https://github.com/curl/curl/pull/6005
+
+ Reviewed-by: Marcel Raad
+ Closes #6065
+
+Marc Hoersken (13 Oct 2020)
+- CI/tests: use verification curl for test reporting APIs
+
+ Avoid using our own, potentially installed, curl for
+ the test reporting APIs in case it is broken.
+
+ Reviewed-by: Daniel Stenberg
+
+ Preparation for #6049
+ Closes #6063
+
+Viktor Szakats (12 Oct 2020)
+- windows: fix comparison of mismatched types warning
+
+ clang 10, mingw-w64:
+ ```
+ vtls/openssl.c:2917:33: warning: comparison of integers of different signs: 'DWORD' (aka 'unsigned long') and 'HRESULT' (aka 'long')
+ [-Wsign-compare]
+ if(GetLastError() != CRYPT_E_NOT_FOUND)
+ ~~~~~~~~~~~~~~ ^ ~~~~~~~~~~~~~~~~~
+ ```
+
+ Approved-by: Daniel Stenberg
+ Closes #6062
+
+Daniel Stenberg (11 Oct 2020)
+- [Viktor Szakats brought this change]
+
+ src/Makefile.m32: fix undefined curlx_dyn_* errors
+
+ by linking `lib/dynbuf.c` when building a static curl binary.
+ Previously this source file was only included when building
+ a dynamic curl binary. This was likely possibly because no
+ functions from the `src/Makefile.inc` / `CURLX_CFILES` sources
+ were actually required for a curl tool build. This has
+ recently changed with the introduction of `curlx_dyn_*()`
+ memory functions and their use by the tool sources.
+
+ Closes #6060
+
+- HISTORY: curl verifies SSL certs by default since version 7.10
+
+Marc Hoersken (8 Oct 2020)
+- runtests.pl: use $LIBDIR variable instead of hardcoded path
+
+ Reviewed-by: Daniel Stenberg
+ Closes #6051
+
+Daniel Stenberg (7 Oct 2020)
+- checksrc: detect // comments on column 0
+
+ Spotted while working on #6045
+
+ Closes #6048
+
+- [Frederik Wedel-Heinen brought this change]
+
+ mbedtls: add missing header when defining MBEDTLS_DEBUG
+
+ Closes #6045
+
+- curl: make sure setopt CURLOPT_IPRESOLVE passes on a long
+
+ Previously, it would pass on a define (int) which could make libcurl
+ read junk as a value - which prevented the CURLOPT_IPRESOLVE option to
+ "take". This could then make test 2100 do two DoH requests instead of
+ one!
+
+ Fixes #6042
+ Closes #6043
+
+- RELEASE-NOTES: synced
+
+- scripts/release-notes.pl: don't "embed" $ in format string for printf()
+
+ ... since they might contain %-codes that mess up the output!
+
+Jay Satiro (5 Oct 2020)
+- [M.R.T brought this change]
+
+ build-wolfssl: fix build with Visual Studio 2019
+
+ Closes https://github.com/curl/curl/pull/6033
+
+Daniel Stenberg (4 Oct 2020)
+- runtests: add %repeat[]% for test files
+
+ ... and use this new keywords in all the test files larger than 50K to reduce
+ their sizes and make them a lot easier to read and understand.
+
+ Closes #6040
+
+- [Emil Engler brought this change]
+
+ --help: move two options from the misc category
+
+ The cmdline opts delegation and suppress-connect-headers
+ fit better into auth and proxy rather than misc.
+
+ Follow-up to aa8777f63febc
+ Closes #6038
+
+- [Samanta Navarro brought this change]
+
+ docs/opts: fix typos in two manual pages
+
+ Closes #6039
+
+- ldap: reduce the amount of #ifdefs needed
+
+ Closes #6035
+
+- runtests: provide curl's version string as %VERSION for tests
+
+ ... so that we can check HTTP requests for User-Agent: curl/%VERSION
+
+ Update 600+ test cases accordingly.
+
+ Closes #6037
+
+- checksrc: warn on space after exclamation mark
+
+ Closes #6034
+
+- test1465: verify --libcurl with binary POST data
+
+- runtests: allow generating a binary sequence from hex
+
+- tool_setopt: escape binary data to hex, not octal
+
+- curl: make --libcurl show binary posts correctly
+
+ Reported-by: Stephan Mühlstrasser
+ Fixes #6031
+ Closes #6032
+
+Jay Satiro (1 Oct 2020)
+- strerror: fix null deref on winapi out-of-memory
+
+ Follow-up to bed5f84 from several days ago.
+
+ Ref: https://github.com/curl/curl/pull/6005
+
+Daniel Stenberg (1 Oct 2020)
+- [Kamil Dudka brought this change]
+
+ vtls: deduplicate some DISABLE_PROXY ifdefs
+
+ ... in the code of gtls, nss, and openssl
+
+ Closes #5735
+
+- RELEASE-NOTES: synced
+
+- [Emil Engler brought this change]
+
+ TODO: Add OpenBSD libtool notice
+
+ See #5862
+ Closes #6030
+
+- tests/unit/README: convert to markdown
+
+ ... and add to dist!
+
+ Closes #6028
+
+- tests/README: convert to markdown
+
+ Closes #6028
+
+- include/README: convert to markdown
+
+ Closes #6028
+
+- examples/README: convert to markdown
+
+ Closes #6028
+
+- configure: don't say HTTPS-proxy is enabled when disabled!
+
+ Reported-by: Kamil Dudka
+ Reviewed-by: Kamil Dudka
+ Bug: https://github.com/curl/curl/pull/5735#issuecomment-701376388
+ Closes #6029
+
+Daniel Gustafsson (30 Sep 2020)
+- src: Consistently spell whitespace without whitespace
+
+ Whitespace is spelled without a space between white and space, so
+ make sure to consistently spell it that way across the codebase.
+
+ Closes #6023
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+ Reviewed-by: Emil Engler <me@emilengler.com>
+
+- MANUAL: update examples to resolve without redirects
+
+ www.netscape.com is redirecting to a cookie consent form on Aol, and
+ cool.haxx.se isn't responding to FTP anymore. Replace with examples
+ that resolves in case users try out the commands when reading the
+ manual.
+
+ Closes #6024
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+ Reviewed-by: Emil Engler <me@emilengler.com>
+
+Daniel Stenberg (30 Sep 2020)
+- HISTORY: add some 2020 events
+
+- sectransp: make it build with --disable-proxy
+
+ Follow-up from #5466 and f3d501dc678d80
+ Reported-by: Javier Navarro
+ Fixes #6025
+ Closes #6026
+
+- ECH: renamed from ESNI in docs and configure
+
+ Encrypted Client Hello (ECH) is the current name.
+
+ Closes #6022
+
+- configure: use "no" instead of "disabled" for the end summary
+
+ ... for consistency but also to make them more distinctly stand out next
+ to the "enabled" lines.
+
+- TODO: SSH over HTTPS proxy with more backends
+
+ ... as right now only the libssh2 backend supports it.
+
+- libssh2: handle the SSH protocols done over HTTPS proxy
+
+ Reported-by: Robin Douine
+ Fixes #4295
+ Closes #6021
+
+- [Emil Engler brought this change]
+
+ memdebug: remove 9 year old unused debug function
+
+ There used to be a way to have memdebug fill allocated memory. 9 years
+ later this has no value there (valgrind and ASAN etc are way better). If
+ people need to know about it they can have a look at VCS logs.
+
+ Closes #5973
+
+- sendf: move Curl_sendf to dict.c and make it static
+
+ ... as the only remaining user of that function. Also fix gopher.c to
+ instead use Curl_write()
+
+ Closes #6020
+
+- ROADMAP: updates and cleanups
+
+ Fix the HSTS PR
+
+ Remove DoT, thread-safe init and hard-coded localhost. I feel very
+ little interest for these with users so I downgrade them to plain "TODO"
+ entries again.
+
+- schannel: return CURLE_PEER_FAILED_VERIFICATION for untrusted root
+
+ This matches what is returned in other TLS backends in the same
+ situation.
+
+ Reviewed-by: Jay Satiro
+ Reviewed-by: Emil Engler
+ Follow-up to 5a3efb1
+ Reported-by: iammrtau on github
+ Fixes #6003
+ Closes #6018
+
+- RELEASE-NOTES: synced
+
+- ftp: make a 552 response return CURLE_REMOTE_DISK_FULL
+
+ Added test 348 to verify. Added a 'STOR' command to the test FTP
+ server to enable test 348. Documented the command in FILEFORMAT.md
+
+ Reported-by: Duncan Wilcox
+ Fixes #6016
+ Closes #6017
+
+- pause: only trigger a reread if the unpause sticks
+
+ As an unpause might itself get paused again and then triggering another
+ reread doesn't help.
+
+ Follow-up from e040146f22608fd9 (shipped since 7.69.1)
+
+ Bug: https://curl.haxx.se/mail/lib-2020-09/0081.html
+ Patch-by: Kunal Chandarana
+ Fixes #5988
+ Closes #6013
+
+- test163[12]: require http to be built-in to run
+
+ ... as speaking over an HTTPS proxy implies http!
+
+ Closes #6014
+
+- ngtcp2: adapt to new NGTCP2_PROTO_VER_MAX define
+
+ Closes #6012
+
+- [Javier Blazquez brought this change]
+
+ strerror: honor Unicode API choice on Windows
+
+ Closes #6005
+
+- imap: make imap_send use dynbuf for the send buffer management
+
+ Reuses the buffer and thereby reduces number of mallocs over a transfer.
+
+ Closes #6010
+
+- Curl_send: return error when pre_receive_plain can't malloc
+
+ ... will probably trigger some false DEAD CODE positives on non-windows
+ code analyzers for the conditional code.
+
+ Closes #6011
+
+- ftp: separate FTPS from FTP over "HTTPS proxy"
+
+ When using HTTPS proxy, SSL is used but not in the view of the FTP
+ protocol handler itself so separate the connection's use of SSL from the
+ FTP control connection's sue.
+
+ Reported-by: Mingtao Yang
+ Fixes #5523
+ Closes #6006
+
+Dan Fandrich (23 Sep 2020)
+- tests/data: Fix some mismatched XML tags in test cases
+
+ This allows these test files to pass xmllint.
+
+Daniel Stenberg (23 Sep 2020)
+- pingpong: use a dynbuf for the *_pp_sendf() function
+
+ ... reuses the same dynamic buffer instead of doing repeated malloc/free
+ cycles.
+
+ Test case 100 (FTP dir list PASV) does 7 fewer memory allocation calls
+ after this change in my test setup (132 => 125), curl 7.72.0 needed 140
+ calls for this.
+
+ Test case 103 makes 9 less allocations now (130). Down from 149 in
+ 7.72.0.
+
+ Closes #6004
+
+- dynbuf: add Curl_dyn_vaddf
+
+ Closes #6004
+
+- dynbuf: make *addf() not require extra mallocs
+
+ ... by introducing a printf() function that appends directly into a
+ dynbuf: Curl_dyn_vprintf(). This avoids the mandatory extra malloc so if
+ the buffer is already big enough it can just printf directly into it.
+
+ Since this less-malloc version requires tthe use of a library internal
+ printf function, we only provide this version when building libcurl and
+ not for the dynbuf code that is used when building the curl tool.
+
+ Closes #5998
+
+- KNOWN_BUGS: Unable to use PKCS12 certificate with Secure Transport
+
+ Closes #5403
+
+- pingpong: remove a malloc per Curl_pp_vsendf call
+
+ This typically makes 7-9 fewer mallocs per FTP transfer.
+
+ Closes #5997
+
+- symbian: drop support
+
+ The OS is deprecated. I see no traces of anyone having actually built
+ curl for Symbian after 2012.
+
+ The public headers are unmodified.
+
+ Closes #5989
+
+- RELEASE-NOTES: synced
+
+- curl_krb5.h: rename from krb5.h
+
+ Follow-up from f4873ebd0be32cf
+
+ Turns out some older openssl installations go bananas otherwise.
+ Reported-by: Tom van der Woerdt
+ Fixes #5995
+ Closes #5996
+
+- test1297: verify GOT_NOTHING with http proxy tunnel
+
+- http_proxy: do not count proxy headers in the header bytecount
+
+ ... as that counter is subsequently used to detect if nothing was
+ returned from the peer. This made curl return CURLE_OK when it should
+ have returned CURLE_GOT_NOTHING.
+
+ Fixes #5992
+ Reported-by: Tom van der Woerdt
+ Closes #5994
+
+- setopt: return CURLE_BAD_FUNCTION_ARGUMENT on bad argument
+
+ Fixed two return code mixups. CURLE_UNKNOWN_OPTION is saved for when the
+ option is, yeah, not known. Clarified this in the setopt man page too.
+
+ Closes #5993
+
+- krb5: merged security.c and krb specific FTP functions in here
+
+ These two files were always tightly connected and it was hard to
+ understand what went into which. This also allows us to make the
+ ftpsend() function static (moved from ftp.c).
+
+ Removed security.c
+ Renamed curl_sec.h to krb5.h
+
+ Closes #5987
+
+- Curl_handler: add 'family' to each protocol
+
+ Makes get_protocol_family() faster and it moves the knowledge about the
+ "families" to each protocol handler, where it belongs.
+
+ Closes #5986
+
+- parsedate: tune the date to epoch conversion
+
+ By avoiding an unnecessary error check and the temp use of the tm
+ struct, the time2epoch conversion function gets a little bit faster.
+ When repeating test 517, the updated version is perhaps 1% faster (on
+ one particular build on one particular architecture).
+
+ Closes #5985
+
+- cmake: remove scary warning
+
+ Remove the text saying
+
+ "the curl cmake build system is poorly maintained. Be aware"
+
+ ... not because anything changed just now, but to encourage users to use
+ it and subsequently improve it.
+
+ Closes #5984
+
+- docs/MQTT: remove outdated paaragraphs
+
+- docs/MQTT: not experimental anymore
+
+ Follow-up to e37e4468688d8f
+
+- docs/RESOURCES: remove
+
+ This document is not maintained and rather than trying to refresh it,
+ let's kill it. A more up-to-date document with relevant RFCs is this
+ page on the curl website: https://curl.haxx.se/rfc/
+
+ Closes #5980
+
+- docs/TheArtOfHttpScripting: convert to markdown
+
+ Makes it easier to browse on github etc. Offers (better) links.
+
+ It should be noted that this document is already mostly outdated and
+ "Everything curl" at https://ec.haxx.se/ is a better resource and
+ tutorial.
+
+ Closes #5981
+
+- BUGS: convert document to markdown
+
+ Closes #5979
+
+- --help: strdup the category
+
+ ... since it is converted and the original pointer is freed on Windows
+ unicode handling.
+
+ Follow-up to aa8777f63febc
+ Fixes #5977
+ Closes #5978
+ Reported-by: xwxbug on github
+
+- CHECKSRC: document two missing warnings
+
+- RELEASE-NOTES: synced
+
+- ftp: avoid risk of reading uninitialized integers
+
+ If the received PASV response doesn't match the expected pattern, we
+ could end up reading uninitialized integers for IP address and port
+ number.
+
+ Issue pointed out by muse.dev
+ Closes #5972
+
+- [Quentin Balland brought this change]
+
+ easy_reset: clear retry counter
+
+ Closes #5975
+ Fixes #5974
+
+- ftp: get rid of the PPSENDF macro
+
+ The use of such a macro hides some of what's actually going on to the
+ reader and is generally disapproved of in the project.
+
+ Closes #5971
+
+- man pages: switch to https://example.com URLs
+
+ Since HTTPS is "the new normal", this update changes a lot of man page
+ examples to use https://example.com instead of the previous "http://..."
+
+ Closes #5969
+
+- github: remove the duplicate "Security vulnerability" entry
+
+ ... since github adds an entry automatically by itself.
+
+ Closes #5970
+
+- [Emil Engler brought this change]
+
+ github: use new issue template feature
+
+ This helps us to avoid getting feature requests as well as security
+ bugs reported into the issue tracker.
+
+ Closes #5936
+
+- [Emil Engler brought this change]
+
+ urlapi: use more Curl_safefree
+
+ Closes #5968
+
+Marc Hoersken (17 Sep 2020)
+- multi: align WinSock mask variables in Curl_multi_wait
+
+ Also skip pre-checking sockets to set timeout_ms to 0
+ after the first socket has been detected to be ready.
+
+ Reviewed-by: rcombs on github
+ Reviewed-by: Daniel Stenberg
+
+ Follow up to #5886
+
+- multi: reuse WinSock events variable in Curl_multi_wait
+
+ Since the struct is quite large (1 long and 10 ints) we
+ declare it once at the beginning of the function instead
+ of multiple times inside loops to avoid stack movements.
+
+ Reviewed-by: Viktor Szakats
+ Reviewed-by: Daniel Stenberg
+
+ Closes #5886
+
+Daniel Stenberg (16 Sep 2020)
+- TODO: dynamically decide to use socketpair
+
+ Suggested-by: Anders Bakken
+
+ Closes #4829
+
+- TODO: add PR reference for native IDN support on macOS
+
+ As there was work started on this that never got completed.
+
+ Closes #5371
+
+- tool_help.h: update copyright year range
+
+ Follow-up from aa8777f63febca
+
+- CI/azure: disable test 571 in the msys2 builds
+
+ It's just too flaky there
+
+ Reviewed-by: Marc Hoersken
+ Closes #5954
+
+- tool_writeout: protect fputs() from NULL
+
+ When the code was changed to do fputs() instead of fprintf() it got
+ sensitive for NULL pointers; add checks for that.
+
+ Follow-up from 0c1e767e83ec66
+
+ Closes #5963
+
+- test3015: verify stdout "as text"
+
+ Follow-up from 0c1e767e83e to please win32 tests
+
+ Closes #5962
+
+- travis: use libressl v3.1.4 instead of master
+
+ ... as their git master seems too fragile to use (and 3.2.1 which is the
+ latest has a build failure).
+
+ Closes #5964
+
+- tests/FILEFORMAT: document type=shell for <command>
+
+- tests/FILEFORMAT: document nonewline support for <file>
+
+ The one in <client>, that creates files.
+
+ Follow-up from b83947c8df7
+
+- [anio brought this change]
+
+ tool_writeout: add new writeout variable, %{num_headers}
+
+ This variable gives the number of headers.
+
+ Closes #5947
+
+- tool_urlglob: fix compiler warning "unreachable code"
+
+ (On Windows builds.)
+
+ Follow-up to 70a3b003d9
+
+- [Gergely Nagy brought this change]
+
+ vtls: deduplicate client certificates in ssl_config_data
+
+ Closes #5629
+
+- ftp: a 550 response to SIZE returns CURLE_REMOTE_FILE_NOT_FOUND
+
+ This is primarily interesting for cases where CURLOPT_NOBODY is set as
+ previously curl would not return an error for this case.
+
+ MDTM getting 550 now also returns this error (it returned
+ CURLE_FTP_COULDNT_RETR_FILE before) in order to unify return codes for
+ missing files across protocols and specific FTP commands.
+
+ libcurl already returns error on a 550 as a MDTM response (when
+ CURLOPT_FILETIME is set). If CURLOPT_NOBODY is not set, an error would
+ happen subsequently anyway since the RETR command would fail.
+
+ Add test 1913 and 1914 to verify. Updated several tests accordingly due
+ to the updated SIZE behavior.
+
+ Reported-by: Tomas Berger
+ Fixes #5953
+ Closes #5957
+
+- curl: make checkpasswd use dynbuf
+
+ Closes #5952
+
+- curl: make glob_match_url use dynbuf
+
+ Closes #5952
+
+- curl: make file2memory use dynbuf
+
+ Closes #5952
+
+- curl: make file2string use dynbuf
+
+ Closes #5952
+
+- [Antarpreet Singh brought this change]
+
+ imap: set cselect_bits to CURL_CSELECT_IN initially
+
+ ... when continuing a transfer from a FETCH response.
+
+ When the size of the file was small enough that the entirety of the
+ transfer happens in a single go and schannel buffers holds the entire
+ data. However, it wasn't completely read in Curl_pp_readresp since a
+ line break was found before that could happen. So, by the time we are in
+ imap_state_fetch_resp - there's data in buffers that needs to be read
+ via Curl_read but nothing to read from the socket. After we setup a
+ transfer (Curl_setup_transfer), curl just waits on the socket state to
+ change - which doesn't happen since no new data ever comes.
+
+ Closes #5961
+
+- RELEASE-NOTES: synced
+
+- test434: test -K use in a single line without newline
+
+ Closes #5946
+
+- runtests: allow creating files without newlines
+
+ Closes #5946
+
+- curl: use curlx_dynbuf for realloc when loading config files
+
+ ... fixes an integer overflow at the same time.
+
+ Reported-by: ihsinme on github
+ Assisted-by: Jay Satiro
+
+ Closes #5946
+
+- dynbuf: provide curlx_ names for reuse by the curl tool
+
+ Closes #5946
+
+- dynbuf: make sure Curl_dyn_tail() zero terminates
+
+ Closes #5959
+
+- tests: add test1912 to the dist
+
+ Follow-up to 70984ce1be4cab6c
+
+- docs/LICENSE-MIXING: remove
+
+ This document is not maintained and I feel that it doesn't provide much
+ value to users anymore (if it ever did).
+
+ Closes #5955
+
+- [Laramie Leavitt brought this change]
+
+ http: consolidate nghttp2_session_mem_recv() call paths
+
+ Previously there were several locations that called
+ nghttp2_session_mem_recv and handled responses slightly differently.
+ Those have been converted to call the existing
+ h2_process_pending_input() function.
+
+ Moved the end-of-session check to h2_process_pending_input() since the
+ only place the end-of-session state can change is after nghttp2
+ processes additional input frames.
+
+ This will likely fix the fuzzing error. While I don't have a root cause
+ the out-of-bounds read seems like a use after free, so moving the
+ nghttp2_session_check_request_allowed() call to a location with a
+ guaranteed nghttp2 session seems reasonable.
+
+ Also updated a few nghttp2 callsites to include error messages and added
+ a few additional error checks.
+
+ Closes #5648
+
+- HISTORY: mention alt-svc added in 2019
+
+ ... and make 1996 the first year subtitle
+
+- base64: also build for pop3 and imap
+
+ Follow-up to the fix in 20417a13fb8f83
+
+ Reported-by: Michael Olbrich
+ Fixes #5937
+ Closes #5948
+
+- base64: enable in build with SMTP
+
+ The oauth2 support is used with SMTP and it uses base64 functions.
+
+ Reported-by: Michael Olbrich
+ Fixes #5937
+ Closes #5938
+
+- curl_mime_headers.3: fix the example's use of curl_slist_append
+
+ Reported-by: sofaboss on github
+ Fixes #5942
+ Closes #5943
+
+- lib583: fix enum mixup
+
+ grrr the previous follow-up to 17fcdf6a31 was wrong
+
+- libtest: fix build errors
+
+ Follow-up from 17fcdf6a310d4c8076
+
+- lib: fix -Wassign-enum warnings
+
+ configure --enable-debug now enables -Wassign-enum with clang,
+ identifying several enum "abuses" also fixed.
+
+ Reported-by: Gisle Vanem
+ Bug: https://github.com/curl/curl/commit/879007f8118771f4896334731aaca5850a154675#commitcomment-42087553
+
+ Closes #5929
+
+- RELEASE-NOTES: synced
+
+- [Diven Qi brought this change]
+
+ url: use blank credentials when using proxy w/o username and password
+
+ Fixes proxy regression brought in commit ad829b21ae (7.71.0)
+
+ Fixed #5911
+ Closes #5914
+
+- travis: add a build using libressl (from git master)
+
+ The v3.2.1 tag (latest release atm) results in a broken build.
+
+ Closes #5932
+
+- configure: let --enable-debug set -Wenum-conversion with gcc >= 10
+
+ Unfortunately, this option is not detecting the same issues as clang's
+ -Wassign-enum flag, but should still be useful to detect future
+ mistakes.
+
+ Closes #5930
+
+- openssl: consider ALERT_CERTIFICATE_EXPIRED a failed verification
+
+ If the error reason from the lib is
+ SSL_R_SSLV3_ALERT_CERTIFICATE_EXPIRED, libcurl will return
+ CURLE_PEER_FAILED_VERIFICATION and not CURLE_SSL_CONNECT_ERROR.
+
+ This unifies the libcurl return code and makes libressl run test 313
+ (CRL testing) fine.
+
+ Closes #5934
+
+- FAQ: refreshed some very old language
+
+- cmake: make HTTP_ONLY also disable MQTT
+
+ ... and alphasort the order of disabling protocols to make it easier to
+ browse.
+
+ Closes #5931
+
+- libtest: remove lib1541 leftovers
+
+ Caused automake errors.
+
+ Follow-up to 8ca54a03ea08a
+
+- tests/libtests: remove test 1900 and 2033
+
+ We already remove the test files, now remove the libtest codes as well.
+
+ Follow-up to e50a877df74
+
+Marc Hoersken (7 Sep 2020)
+- CI/azure: add test number to title for display in analytics
+
+ To ease identification of tests the test number is added to
+ the test case title in order to have it on the Azure DevOps
+ Analytics pages and reports which currently do not show it.
+
+ Bump test case revision to make Azure DevOps update titles.
+
+ Closes #5927
+
+Daniel Stenberg (6 Sep 2020)
+- altsvc: clone setting in curl_easy_duphandle
+
+ The cache content is not duplicated, like other caches, but the setting
+ and specified file name are.
+
+ Test 1908 is extended to verify this somewhat. Since the duplicated
+ handle gets the same file name, the test unfortunately overwrites the
+ same file twice (with different contents) which makes it hard to check
+ automatically.
+
+ Closes #5923
+
+- test1541: remove since it is a known bug
+
+ A shared connection cache is not thread-safe is a known issue. Stop
+ testing this until we believe this issue is addressed. Reduces
+ occasional test failures we don't care about.
+
+ The test code in lib1541.c is left in git to allow us to restore it when
+ we get to fix this.
+
+ Closes #5922
+
+- tests: remove pipelining tests
+
+ Remove the tests 530, 584, 1900, 1901, 1902, 1903 and 2033. They were
+ previously disabled.
+
+ The Pipelining code was removed from curl in commit 2f44e94efb3df8e,
+ April 2019.
+
+ Closes #5921
+
+- curl: retry delays in parallel mode no longer sleeps blocking
+
+ The previous sleep for retries would block all other concurrent
+ transfers. Starting now, the retry will instead be properly marked to
+ not get restarted until after the delay time but other transfers can
+ still continue in the mean time.
+
+ Closes #5917
+
+- curl:parallel_transfers: make sure retry readds the transfer
+
+ Reported-by: htasta on github
+ Fixes #5905
+ Closes #5917
+
+- build: drop support for building with Watcom
+
+ These files are not maintained, they seem to have no users, Watcom
+ compilers look like not having users nor releases anymore.
+
+ Closes #5918
+
+- winbuild/rundebug.cmd: remove
+
+ Seems to have been added by mistake? Not included in dists.
+
+ Closes #5919
+
+- curl: in retry output don't call all problems "transient"
+
+ ... because when --retry-all-errors is used, the error isn't necessarily
+ transient at all.
+
+ Closes #5916
+
+- easygetopt: pass a valid enum to avoid compiler warning
+
+ "integer constant not in range of enumerated type 'CURLoption'"
+
+ Reported-by: Gisle Vanem
+ Bug: https://github.com/curl/curl/commit/6ebe63fac23f38df911edc348e8ccc72280f9434#commitcomment-42042843
+
+ Closes #5915
+
+- [Emil Engler brought this change]
+
+ tests: Add tests for new --help
+
+ This commit is a part of "--help me if you can"
+
+ Closes #5680
+
+- [Emil Engler brought this change]
+
+ tool: update --help with categories
+
+ This commit is a part of "--help me if you can"
+
+ Closes #5680
+
+- [Emil Engler brought this change]
+
+ docs: add categories to all cmdline opts
+
+ Adapted gen.pl with 'listcats'
+
+ This commit is a part of "--help me if you can"
+
+ Closes #5680
+
+- RELEASE-NOTES: synced
+
+- [ihsinme brought this change]
+
+ connect.c: remove superfluous 'else' in Curl_getconnectinfo
+
+ Closes #5912
+
+- [Samuel Marks brought this change]
+
+ CMake: remove explicit `CMAKE_ANSI_CFLAGS`
+
+ This variable was removed from cmake in commit
+ https://gitlab.kitware.com/cmake/cmake/commit/5a834b0bb0bc288. A later
+ CMake commit removes the variable from the tests, claiming that it was
+ removed in CMake 2.6
+
+ Reviewed-By: Peter Wu
+ Closes #5439
+
+- [cbe brought this change]
+
+ libssh2: pass on the error from ssh_force_knownhost_key_type
+
+ Closes #5909
+
+- scripts/delta: add diffstat summary
+
+ ... and make output more table-like
+
+- [Martin Bašti brought this change]
+
+ http_proxy: do not crash with HTTPS_PROXY and NO_PROXY set
+
+ ... in case NO_PROXY takes an effect
+
+ Without this patch, the following command crashes:
+
+ $ GIT_CURL_VERBOSE=1 NO_PROXY=github.com HTTPS_PROXY=https://example.com \
+ git clone https://github.com/curl/curl.git
+
+ Minimal libcurl-based reproducer:
+
+ #include <curl/curl.h>
+
+ int main() {
+ CURL *curl = curl_easy_init();
+ if(curl) {
+ CURLcode ret;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://github.com/");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "example.com");
+ /* set the proxy type */
+ curl_easy_setopt(curl, CURLOPT_PROXYTYPE, CURLPROXY_HTTPS);
+ curl_easy_setopt(curl, CURLOPT_NOPROXY, "github.com");
+ curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+ return ret;
+ }
+ return -1;
+ }
+
+ Assisted-by: Kamil Dudka
+ Bug: https://bugzilla.redhat.com/1873327
+ Closes #5902
+
+- travis: add a CI job with openssl3 (from git master)
+
+ Closes #5908
+
+- openssl: avoid error conditions when importing native CA
+
+ The code section that is OpenSSL 3+ specific now uses the same logic as
+ is used in the version < 3 section. It caused a compiler error without
+ it.
+
+ Closes #5907
+
+- setopt: avoid curl_ on local variable
+
+ Closes #5906
+
+- mqtt.c: avoid curl_ prefix on local variable
+
+ Closes #5906
+
+- wildcard: strip "curl_" prefix from private symbols
+
+ Closes #5906
+
+- vtls: make it 'struct Curl_ssl_session'
+
+ Use uppercase C for internal symbols.
+
+ Closes #5906
+
+- curl_threads: make it 'struct Curl_actual_call'
+
+ Internal names should not be prefixed "curl_"
+
+ Closes #5906
+
+- schannel: make it 'struct Curl_schannel*'
+
+ As internal global names should use captical C.
+
+ Closes #5906
+
+- hash: make it 'struct Curl_hash'
+
+ As internal global names should use captical C.
+
+ Closes #5906
+
+- llist: make it "struct Curl_llist"
+
+ As internal global names should use captical C.
+
+ Closes #5906
+
+Marc Hoersken (2 Sep 2020)
+- telnet.c: depend on static requirement of WinSock version 2
+
+ Drop dynamic loading of ws2_32.dll and instead rely on the
+ imported version which is now required to be at least 2.2.
+
+ Reviewed-by: Marcel Raad
+ Reviewed-by: Jay Satiro
+ Reviewed-by: Daniel Stenberg
+ Reviewed-by: Viktor Szakats
+
+ Closes #5854
+
+- win32: drop support for WinSock version 1, require version 2
+
+ IPv6, telnet and now also the multi API require WinSock
+ version 2 which is available starting with Windows 95.
+
+ Therefore we think it is time to drop support for version 1.
+
+ Reviewed-by: Marcel Raad
+ Reviewed-by: Jay Satiro
+ Reviewed-by: Daniel Stenberg
+ Reviewed-by: Viktor Szakats
+
+ Follow up to #5634
+ Closes #5854
+
+- select: align poll emulation to return all relevant events
+
+ The poll emulation via select already consumes POLLRDNORM,
+ POLLWRNORM and POLLRDBAND as input events. Therefore it
+ should also return them as output events if signaled.
+
+ Also fix indentation in input event handling block.
+
+ Assisted-by: Jay Satiro
+ Reviewed-by: Daniel Stenberg
+
+ Replaces #5852
+ Closes #5883
+
+- CI/azure: MQTT is now enabled by default
+
+ Reviewed-by: Daniel Stenberg
+
+ Follow up to #5858
+ Closes #5903
+
+Daniel Stenberg (2 Sep 2020)
+- copyright.pl: ignore buildconf
+
+- test971: show test mismatches "inline"
+
+- lib/Makefile.am: bump VERSIONINFO due to new functions
+
+ ... we're generally bad at this, but we are adding new functions for
+ this release.
+
+ Closes #5899
+
+- optiontable: use DEBUGBUILD
+
+ Follow-up to commit 6e18568ba38 (#5877)
+
+- cmdline-opts/gen.pl: generate nicer "See Also" in curl.1
+
+ If there are more than two items in the list, use commas for all but the
+ last separator which is set to 'and'. Reads better.
+
+ Closes #5898
+
+- curl.1: add see also no-progress-meter on two spots
+
+ Ref: #5894
+
+ Closes #5897
+
+- RELEASE-NOTES: synced
+
+- mqtt: enable by default
+
+ No longer considered experimental.
+
+ Closes #5858
+
+- [Michael Baentsch brought this change]
+
+ tls: add CURLOPT_SSL_EC_CURVES and --curves
+
+ Closes #5892
+
+- url: remove funny embedded comments in Curl_disonnect calls
+
+- [Chris Paulson-Ellis brought this change]
+
+ conn: check for connection being dead before reuse
+
+ Prevents incorrect reuse of an HTTP connection that has been prematurely
+ shutdown() by the server.
+
+ Partial revert of 755083d00deb16
+
+ Fixes #5884
+ Closes #5893
+
+Marc Hoersken (29 Aug 2020)
+- buildconf: exec autoreconf to avoid additional process
+
+ Also make buildconf exit with the return code of autoreconf.
+
+ Reviewed-by: Daniel Stenberg
+
+ Follow up to #5853
+ Closes #5890
+
+- CI/azure: no longer ignore results of test 1013
+
+ Follow up to #5771
+ Closes #5889
+
+- docs: add description about CI platforms to CONTRIBUTE.md
+
+ Reviewed-by: Daniel Stenberg
+ Reviewed-by: Marcel Raad
+ Reviewed-by: Jay Satiro
+
+ Closes #5882
+
+Daniel Stenberg (29 Aug 2020)
+- tests/getpart: use MIME::Base64 instead of home-cooked
+
+ Since we already use the base64 package since a while back, we can just
+ as well switch to that here too.
+
+ It also happens to use the exact same function name, which otherwise
+ causes a run-time warning.
+
+ Reported-by: Marc Hörsken
+ Fixes #5885
+ Closes #5887
+
+Marcel Raad (29 Aug 2020)
+- ntlm: fix condition for curl_ntlm_core usage
+
+ `USE_WINDOWS_SSPI` without `USE_WIN32_CRYPTO` but with any other DES
+ backend is fine, but was excluded before.
+
+ This also fixes test 1013 as the condition for SMB support in
+ configure.ac didn't match the condition in the source code. Now it
+ does.
+
+ Fixes https://github.com/curl/curl/issues/1262
+ Closes https://github.com/curl/curl/pull/5771
+
+- AppVeyor: switch 64-bit Schannel Debug CMake builds to Unicode
+
+ The Schannel builds are the most useful to verify as they make the most
+ use of the Windows API. Classic MinGW doesn't support Unicode at all,
+ only MinGW-w64 and MSVC do.
+
+ Closes https://github.com/curl/curl/pull/5843
+
+- CMake: add option to enable Unicode on Windows
+
+ As already existing for winbuild.
+
+ Closes https://github.com/curl/curl/pull/5843
+
+Marc Hoersken (29 Aug 2020)
+- select: simplify return code handling for poll and select
+
+ poll and select already return -1 on error according to POSIX,
+ so there is no need to perform a <0 to -1 conversion in code.
+
+ Also we can just use one check with <= 0 on the return code.
+
+ Assisted-by: Daniel Stenberg
+ Reviewed-by: Jay Satiro
+
+ Replaces #5852
+ Closes #5880
+
+Daniel Stenberg (28 Aug 2020)
+- RELEASE-NOTES: synced
+
+- [Jeroen Ooms brought this change]
+
+ tests: add test1912 with typechecks
+
+ Validates that gcc-typecheck macros match the new option type API.
+
+ Closes #5873
+
+- easyoptions: provide debug function when DEBUGBUILD
+
+ ... not CURLDEBUG as they're not always set in conjunction.
+
+ Follow-up to 6ebe63fac23f38df
+
+ Fixes #5877
+ Closes #5878
+
+Marc Hoersken (28 Aug 2020)
+- sockfilt: handle FD_CLOSE winsock event on write socket
+
+ Learn from the way Cygwin handles and maps the WinSock events
+ to simulate correct and complete poll and select behaviour
+ according to Richard W. Stevens Network Programming book.
+
+ Follow up to #5867
+ Closes #5879
+
+- multi: handle connection state winsock events
+
+ Learn from the way Cygwin handles and maps the WinSock events
+ to simulate correct and complete poll and select behaviour
+ according to Richard W. Stevens Network Programming book.
+
+ Reviewed-by: Jay Satiro
+ Reviewed-by: Marcel Raad
+
+ Follow up to #5634
+ Closes #5867
+
+Daniel Stenberg (28 Aug 2020)
+- Curl_pgrsTime - return new time to avoid timeout integer overflow
+
+ Setting a timeout to INT_MAX could cause an immediate error to get
+ returned as timeout because of an overflow when different values of
+ 'now' were used.
+
+ This is primarily fixed by having Curl_pgrsTime() return the "now" when
+ TIMER_STARTSINGLE is set so that the parent function will continue using
+ that time.
+
+ Reported-by: Ionuț-Francisc Oancea
+ Fixes #5583
+ Closes #5847
+
+- TLS: fix SRP detection by using the proper #ifdefs
+
+ USE_TLS_SRP will be true if *any* selected TLS backend can use SRP
+
+ HAVE_OPENSSL_SRP is defined when OpenSSL can use it
+
+ HAVE_GNUTLS_SRP is defined when GnuTLS can use it
+
+ Clarify in the curl_verison_info docs that CURL_VERSION_TLSAUTH_SRP is
+ set if at least one of the supported backends offers SRP.
+
+ Reported-by: Stefan Strogin
+ Fixes #5865
+ Closes #5870
+
+- [Dan Kenigsberg brought this change]
+
+ docs: SSLCERTS: fix English syntax
+
+ Signed-off-by: Dan Kenigsberg <danken@redhat.com>
+
+ Closes #5876
+
+- [Alessandro Ghedini brought this change]
+
+ docs: non-existing macros in man pages
+
+ As reported by man(1) when invoked as:
+
+ man --warnings -E UTF-8 -l -Tutf8 -Z <file> >/dev/null
+
+ Closes #5846
+
+- [Alessandro Ghedini brought this change]
+
+ curl.1: fix typo invokved -> invoked
+
+ Closes #5846
+
+- buildconf: invoke 'autoreconf -fi' instead
+
+ The custom script isn't necessary anymore - but remains for simplicity
+ and just invokes autoreconf.
+
+ Closes #5853
+
+- [Emil Engler brought this change]
+
+ lib: make Curl_gethostname accept a const pointer
+
+ The address of that variable never gets changed, only the data in it so
+ why not make it a "char * const"?
+
+ Closes #5866
+
+- docs/libcurl: update "Added in" version for curl_easy_option*
+
+ Follow-up to 6ebe63fac23f38
+
+- scripts: improve the "get latest curl release tag" logic
+
+ ... by insiting on it matching "^curl-".
+
+- configure: added --disable-get-easy-options
+
+ To allow disabling of the curl_easy_option APIs in a build.
+
+ Closes #5365
+
+- options: API for meta-data about easy options
+
+ const struct curl_easyoption *curl_easy_option_by_name(const char *name);
+
+ const struct curl_easyoption *curl_easy_option_by_id (CURLoption id);
+
+ const struct curl_easyoption *
+ curl_easy_option_next(const struct curl_easyoption *prev);
+
+ The purpose is to provide detailed enough information to allow for
+ example libcurl bindings to get option information at run-time about
+ what easy options that exist and what arguments they expect.
+
+ Assisted-by: Jeroen Ooms
+ Closes #5365
+
+- [Eric Curtin brought this change]
+
+ HTTP/3: update to OpenSSL_1_1_1g-quic-draft-29
+
+ Closes #5871
+
+- RELEASE-NOTES: synced
+
+Jay Satiro (26 Aug 2020)
+- openssl: Fix wincrypt symbols conflict with BoringSSL
+
+ OpenSSL undefines the conflicting symbols but BoringSSL does not so we
+ must do it ourselves.
+
+ Reported-by: Samuel Tranchet
+ Assisted-by: Javier Blazquez
+
+ Ref: https://bugs.chromium.org/p/boringssl/issues/detail?id=371
+ Ref: https://github.com/openssl/openssl/blob/OpenSSL_1_1_1g/include/openssl/ossl_typ.h#L66-L73
+
+ Fixes https://github.com/curl/curl/issues/5669
+ Closes https://github.com/curl/curl/pull/5857
+
+Daniel Stenberg (26 Aug 2020)
+- socketpair: allow CURL_DISABLE_SOCKETPAIR
+
+ ... to completely disable the use of socketpair
+
+ Closes #5850
+
+- curl_get_line: build only if cookies or alt-svc are enabled
+
+ Closes #5851
+
+- [fullincome brought this change]
+
+ schannel: fix memory leak when using get_cert_location
+
+ The get_cert_location function allocates memory only on success.
+ Previously get_cert_location was able to allocate memory and return
+ error. It wasn't obvious and in this case the memory wasn't
+ released.
+
+ Fixes #5855
+ Closes #5860
+
+- [Emil Engler brought this change]
+
+ git: ignore libtests in 3XXX area
+
+ Currently the file tests/libtest/lib3010 is not getting
+ ignored by git. This fixes it by adding the 3XXX area to
+ the according .gitignore file.
+
+ Closes #5859
+
+- [Emil Engler brought this change]
+
+ doh: add error message for DOH_DNS_NAME_TOO_LONG
+
+ When this error code was introduced in b6a53fff6c1d07e8a9, it was
+ forgotten to be added in the errors array and doh_strerror function.
+
+ Closes #5863
+
+- ngtcp2: adapt to the new pkt_info arguments
+
+ Guidance-by: Tatsuhiro Tsujikawa
+
+ Closes #5864
+
+- winbuild/README.md: make <options> visible
+
+ Follow-up to be753add31c2d8c
+
+- winbuild: convert the instruction text to README.md
+
+ Closes #5861
+
+- lib1560: verify "redirect" to double-slash leading URL
+
+ Closes #5849
+
+Marc Hoersken (25 Aug 2020)
+- multi: expand pre-check for socket readiness
+
+ Check readiness of all sockets before waiting on them
+ to avoid locking in case the one-time event FD_WRITE
+ was already consumed by a previous wait operation.
+
+ More information about WinSock network events:
+ https://docs.microsoft.com/en-us/windows/win32/api/
+ winsock2/nf-winsock2-wsaeventselect#return-value
+
+ Closes #5634
+
+- [rcombs brought this change]
+
+ multi: implement wait using winsock events
+
+ This avoids using a pair of TCP ports to provide wakeup functionality
+ for every multi instance on Windows, where socketpair() is emulated
+ using a TCP socket on loopback which could in turn lead to socket
+ resource exhaustion.
+
+ A previous version of this patch failed to account for how in WinSock,
+ FD_WRITE is set only once when writing becomes possible and not again
+ until after a send has failed due to the buffer filling. This contrasts
+ to how FD_READ and FD_OOB continue to be set until the conditions they
+ refer to no longer apply. This meant that if a user wrote some data to
+ a socket, but not enough data to completely fill its send buffer, then
+ waited on that socket to become writable, we'd erroneously stall until
+ their configured timeout rather than returning immediately.
+
+ This version of the patch addresses that issue by checking each socket
+ we're waiting on to become writable with select() before the wait, and
+ zeroing the timeout if it's already writable.
+
+ Assisted-by: Marc Hörsken
+ Reviewed-by: Marcel Raad
+ Reviewed-by: Daniel Stenberg
+ Tested-by: Gergely Nagy
+ Tested-by: Rasmus Melchior Jacobsen
+ Tested-by: Tomas Berger
+
+ Replaces #5397
+ Reverts #5632
+ Closes #5634
+
+- select: reduce duplication of Curl_poll in Curl_socket_check
+
+ Change Curl_socket_check to use select-fallback in Curl_poll
+ instead of implementing it in Curl_socket_check and Curl_poll.
+
+ Reviewed-by: Daniel Stenberg
+ Reviewed-by: Jay Satiro
+
+ Replaces #5262 and #5492
+ Closes #5707
+
+- select: fix poll-based check not detecting connect failure
+
+ This commit changes Curl_socket_check to use POLLPRI to
+ check for connect failure on the write socket, because
+ POLLPRI maps to fds_err. This is in line with select(2).
+
+ The select-based socket check correctly checks for connect
+ failures by adding the write socket also to fds_err.
+
+ The poll-based implementation (which internally can itself
+ fallback to select again) did not previously check for
+ connect failure by using POLLPRI with the write socket.
+
+ See the follow up commit to this for more information.
+
+ This commit makes sure connect failures can be detected
+ and handled if HAVE_POLL_FINE is defined, eg. on msys2-devel.
+
+ Reviewed-by: Daniel Stenberg
+ Reviewed-by: Jay Satiro
+
+ Replaces #5509
+ Prepares #5707
+
+- select.h: make socket validation macros test for INVALID_SOCKET
+
+ With Winsock the valid range is [0..INVALID_SOCKET-1] according to
+ https://docs.microsoft.com/en-us/windows/win32/winsock/socket-data-type-2
+
+ Reviewed-by: Jay Satiro
+ Reviewed-by: Marcel Raad
+ Reviewed-by: Daniel Stenberg
+
+ Closes #5760
+
+Daniel Stenberg (24 Aug 2020)
+- docs: --output-dir is added in 7.73.0, nothing else
+
+ Follow-up to 5620d2cc78c0
+
+- curl: add --output-dir
+
+ Works with --create-dirs and with -J
+
+ Add test 3008, 3009, 3011, 3012 and 3013 to verify.
+
+ Closes #5637
+
+- configure: fix pkg-config detecting wolfssl
+
+ When amending the include path with "/wolfssl", this now properly strips
+ off all whitespace from the path variable! Previously this would lead to
+ pkg-config builds creating bad command lines.
+
+ Closes #5848
+
+- [Michael Musset brought this change]
+
+ sftp: add the option CURLKHSTAT_FINE_REPLACE
+
+ Replace the old fingerprint of the host with a new.
+
+ Closes #5685
+
+- RELEASE-NOTES: synced
+
+ The next release is now to become 7.73.0
+
+- checksrc: verify do-while and spaces between the braces
+
+ Updated mprintf.c to comply
+
+ Closes #5845
+
+- curl: support XDG_CONFIG_HOME to find .curlrc
+
+ Added test433 to verify. Updated documentation.
+
+ Reviewed-by: Jay Satiro
+ Suggested-by: Eli Schwartz
+ Fixes #5829
+ Closes #5837
+
+- etag: save and use the full received contents
+
+ ... which makes it support weak tags and non-standard etags too!
+
+ Added test case 347 to verify blank incoming ETag:
+
+ Fixes #5610
+ Closes #5833
+
+- setopt: if the buffer exists, refuse the new BUFFERSIZE
+
+ The buffer only exists during transfer and then we shouldn't change the
+ size (the setopt is not documented to work then).
+
+ Reported-by: Harry Sintonen
+ Closes #5842
+
+- [COFFEETALES brought this change]
+
+ sftp: add new quote commands 'atime' and 'mtime'
+
+ Closes #5810
+
+- CURLE_PROXY: new error code
+
+ Failures clearly returned from a (SOCKS) proxy now causes this return
+ code. Previously the situation was not very clear as what would be
+ returned and when.
+
+ In addition: when this error code is returned, an application can use
+ CURLINFO_PROXY_ERROR to query libcurl for the detailed error, which then
+ returns a value from the new 'CURLproxycode' enum.
+
+ Closes #5770
+
+- runtests: make cleardir() erase dot files too
+
+ Because test cases might use dot files.
+
+ Closes #5838
+
+- KNOWN_BUGS: 'no_proxy' string-matches IPv6 numerical addreses
+
+ Also: the current behavior is now documented in the curl.1 and
+ CURLOPT_NOPROXY.3 man pages.
+
+ Reported-by: Andrew Barnes
+ Closes #5745
+ Closes #5841
+
+Viktor Szakats (22 Aug 2020)
+- Makefile.m32: add ability to override zstd libs [ci skip]
+
+ Similarly to brotli, where this was already possible.
+ E.g. it allows to link zstd statically to libcurl.dll.
+
+ Ref: https://github.com/curl/curl-for-win/issues/12
+ Ref: https://github.com/curl/curl-for-win/commit/d9b266afd2e5d3f5604483010ef62340b5918c89
+
+ Closes https://github.com/curl/curl/pull/5840
+
+Daniel Stenberg (21 Aug 2020)
+- runtests: avoid 'fail to start' repeated messages in attempt loops
+
+ Closes #5834
+
+- runtests: clear pid variables when failing to start a server
+
+ ... as otherwise the parent doesn't detect the failure and believe it
+ actually worked to start.
+
+ Reported-by: Christian Weisgerber
+ Bug: https://curl.haxx.se/mail/lib-2020-08/0018.html
+ Closes #5834
+
+- TODO: Virtual external sockets
+
+ Closes #5835
+
+- [Don J Olmstead brought this change]
+
+ dist: add missing CMake Find modules to the distribution
+
+ Closes #5836
+
+- RELEASE-NOTES: synced
+
+ ... and version bumped to 7.72.1
+
+- tls: provide the CApath verbose log on its own line
+
+ ... not newline separated from the previous line. This makes it output
+ asterisk prefixed properly like other verbose putput!
+
+ Reported-by: jmdavitt on github
+ Fixes #5826
+ Closes #5827
+
Version 7.72.0 (19 Aug 2020)
Daniel Stenberg (19 Aug 2020)
@@ -3530,7 +5330,7 @@ Daniel Stenberg (20 Apr 2020)
Closes #5264
Daniel Gustafsson (19 Apr 2020)
-- [Tom brought this change]
+- [Mipsters on github brought this change]
src: Remove C99 constructs to ensure C89 compliance
@@ -5650,1851 +7450,3 @@ Marc Hoersken (1 Mar 2020)
For security reasons the access token is not available to PR builds.
Therefore we should not try to use the DevOps API with an empty token.
-
-Daniel Stenberg (1 Mar 2020)
-- build: remove all HAVE_OPENSSL_ENGINE_H defines
-
- ... as there's nothing in the code that actually uses the define! The
- last reference was removed in 38203f158.
-
- Closes #5007
-
-Jay Satiro (29 Feb 2020)
-- [Rolf Eike Beer brought this change]
-
- CMake: clean up and improve build procedures
-
- - remove check for unsupported old CMake versions
-
- - do not link to c-ares library twice
-
- - modernize custom Find modules
-
- - FindLibSSH2:
- - pass version to FPHSA to show it in the output
- - use LIBSSH2_VERSION define to extract the version number in
- one shot. This variable exists in the header for 10 years.
- - remove unneeded code
-
- - FindNGHTTP2.cmake:
- - drop needless FPHSA argument
- - mark found variables as advanced
-
- - FindNSS.cmake:
- - show version number
-
- - FindCARES.cmake:
- - drop default paths
- - use FPHSA instead of checking things by hand
-
- - remove needless explict variable dereference
-
- - simplify count_true()
-
- - allow all policies up to version 3.16 to be set to NEW
-
- - do not rerun check for -Wstrict-aliasing=3 every time
-
- In contrast to every other compiler flag this has a = in it, which CMake
- can't have in a variable name.
-
- - only read the interesting strings from curlver.h
-
- Reviewed-by: Peter Wu
-
- Closes https://github.com/curl/curl/pull/4975
-
-- runtests: fix output to command log
-
- - Record only the command of the most recently ran test in the command
- log.
-
- This is a follow-up to 02988b7 from several weeks ago which fixed
- writing to the command log, however it saved all commands for all tests
- instead of just the most recently ran test as we would now expect.
-
- Fixes https://github.com/curl/curl/commit/02988b7#commitcomment-37546876
- Closes https://github.com/curl/curl/pull/5001
-
-Steve Holme (1 Mar 2020)
-- polarssl: Additional removal
-
- Follow up to 6357a19f.
-
- Reviewed-by: Daniel Stenberg
- Closes #5004
-
-- [Jonathan Cardoso Machado brought this change]
-
- docs: fix typo on CURLINFO_RETRY_AFTER - alwaus -> always
-
- Reviewed-by: Steve Holme
- Closes #5005
-
-- md5: Added implementation for mbedTLS
-
- Reviewed-by: Jay Satiro
- Closes #4980
-
-- md5: Use pointer notation for array parameters in GnuTLS implementation
-
-- md4: Use non-deprecated functions in mbedTLS >= 2.7.0
-
- Closes #4983
-
-Marc Hoersken (29 Feb 2020)
-- ci/tests: Send test results to Azure DevOps for reporting
-
-Daniel Stenberg (29 Feb 2020)
-- pause: force-drain the transfer on unpause
-
- ... since the socket might not actually be readable anymore when for
- example the data is already buffered in the TLS layer.
-
- Fixes #4966
- Reported-by: Anders Berg
- Closes #5000
-
-- TODO: curl --proxycommand
-
- Suggested-by: Kristian Mide
- Closes #4941
-
-- smtp: overwriting 'from' leaks memory
-
- Detected by Coverity. CID 1418139.
-
- Also, make sure to return error if the new 'from' allocation fails.
-
- Closes #4997
-
-- CIfuzz: switch off 'dry_run' mode
-
- Follow-up from #4960: now make it fail if it detects problems.
-
- Closes #4998
-
-Marc Hoersken (28 Feb 2020)
-- ci/tests: Increase timeouts of Windows builds due to new tests
-
- Recently added tests increased their runtime above the limit of 60min.
-
-- ci/tests: align Azure Pipeline job names with each other
-
-- ci/tests: Add Windows builds via Azure Pipelines using Docker
-
-- tests: fix Python 3 compatibility of smbserver.py
-
-Daniel Stenberg (27 Feb 2020)
-- runtests: restore the command log
-
- The log file with all command lines for the invoked command lines is now
- called logs/commands.log
-
- Fixes #4911
- Closes #4989
-
-- smtp: fix memory leak on exit path
-
- Detected by Coverity. CID 1418139. "leaked_storage: Variable 'from'
- going out of scope leaks the storage it points to"
-
- Closes #4990
-
-Steve Holme (27 Feb 2020)
-- gtls: Fixed compilation when using GnuTLS < 3.5.0
-
- Reverts the functionality from 41fcb4f when compiling with GnuTLS older
- than 3.5.0.
-
- Reviewed-by: Daniel Stenberg
- Closes #4984
-
-- RELEASE-NOTES: Corrected the link to issue #4892
-
-Daniel Stenberg (27 Feb 2020)
-- Curl_is_ASCII_name: handle a NULL argument
-
- Make the function tolerate a NULL pointer input to avoid dereferencing
- that pointer.
-
- Follow-up to efce3ea5a85126d
- Detected by OSS-Fuzz
- Reviewed-By: Steve Holme
- Bug: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=20907
- Fixes #4985
- Closes #4986
-
-- RELEASE-NOTES: synced
-
-- http2: make pausing/unpausing set/clear local stream window
-
- This reduces the HTTP/2 window size to 32 MB since libcurl might have to
- buffer up to this amount of data in memory and yet we don't want it set
- lower to potentially impact tranfer performance on high speed networks.
-
- Requires nghttp2 commit b3f85e2daa629
- (https://github.com/nghttp2/nghttp2/pull/1444) to work properly, to end
- up in the next release after 1.40.0.
-
- Fixes #4939
- Closes #4940
-
-- [Anderson Toshiyuki Sasaki brought this change]
-
- libssh: improve known hosts handling
-
- Previously, it was not possible to get a known hosts file entry due to
- the lack of an API. ssh_session_get_known_hosts_entry(), introduced in
- libssh-0.9.0, allows libcurl to obtain such information and behave the
- same as when compiled with libssh2.
-
- This also tries to avoid the usage of deprecated functions when the
- replacements are available. The behaviour will not change if versions
- older than libssh-0.8.0 are used.
-
- Signed-off-by: Anderson Toshiyuki Sasaki <ansasaki@redhat.com>
-
- Fixes #4953
- Closes #4962
-
-Steve Holme (27 Feb 2020)
-- tests: Automatically deduce the tool name from the test case for unit tests
-
- It is still possible to override the executable to run during the test,
- using the <tool> tag, but this patch removes the requirement that the
- tag must be present for unit tests.
-
- It also removes the possibility of human error when existing test cases
- are used as the basis for new tests, as recently witnessed in 81c37124.
-
- Reviewed-by: Daniel Stenberg
- Closes #4976
-
-- test1323: Added the missing 'unit test' feature requirement in the test case
-
-Daniel Stenberg (26 Feb 2020)
-- cookie: remove unnecessary check for 'out != 0'
-
- ... as it will always be non-NULL at this point.
-
- Detected by Coverity: CID 1459009
-
-- http: added 417 response treatment
-
- When doing a request with a body + Expect: 100-continue and the server
- responds with a 417, the same request will be retried immediately
- without the Expect: header.
-
- Added test 357 to verify.
-
- Also added a control instruction to tell the sws test server to not read
- the request body if Expect: is present, which the new test 357 uses.
-
- Reported-by: bramus on github
- Fixes #4949
- Closes #4964
-
-Steve Holme (26 Feb 2020)
-- smtp: Tidy up, following recent changes, to maintain the coding style
-
- Closes #4892
-
-- smtp: Support the SMTPUTF8 extension for the EXPN command
-
- Simply notify the server we support the SMTPUTF8 extension if it does.
-
-- smtp: Support the SMTPUTF8 extension in the VRFY command
-
-- smtp: Support the SMTPUTF8 extension in the RCPT TO command
-
- Note: The RCPT TO command isn't required to advertise to the server that
- it contains UTF-8 characters, instead the server is told that a mail may
- contain UTF-8 in any envelope command via the MAIL command.
-
-- smtp: Support the SMTPUTF8 extension in the MAIL command
-
- Support the SMTPUTF8 extension when sending mailbox information in the
- MAIL command (FROM and AUTH parameters). Non-ASCII domain names will
- be ACE encoded, if IDN is supported, whilst non-ASCII characters in
- the local address part are passed to the server.
-
- Reported-by: ygthien on github
- Fixes #4828
-
-- smtp: Detect server support for the UTF-8 extension as defined in RFC-6531
-
-- smtp: Support UTF-8 based host names in the VRFY command
-
-- smtp: Support UTF-8 based host names in the RCPT TO command
-
-- smtp: Support UTF-8 based host names in the MAIL command
-
- Non-ASCII host names will be ACE encoded if IDN is supported.
-
-- url: Make the IDN conversion functions available to others
-
-- smtp: Added UTF-8 mailbox tests to verify existing behaviour
-
-- ftpserver: Updated VRFY_smtp() so the response isn't necessary in the test case
-
-- ftpserver: Corrected the e-mail address regex in MAIL_smtp() and RCTP_smtp()
-
- The dot character between the host and the tld was not being escaped,
- which meant it specified a match of 'any' character rather than an
- explicit dot separator.
-
- Additionally removed the dot character from the host name as it allowed
- the following to be specified as a valid address in our test cases:
-
- <bad@example......com>
-
- Both are typos from 98f7ca7 and 8880f84 :(
-
- I can't remember whether my intention was to allow sub-domains to be
- specified in the host or not with these additional dots, but by placing
- it outside of the host means it can only be specified once per domain
- and by placing a + after the new grouping support for sub-domains is
- kept.
-
- Closes #4912
-
-- hmac: Added a unit test for the HMAC hash generation
-
- Closes #4973
-
-- ntlm: Moved the HMAC MD5 function into the HMAC module as a generic function
-
-- tests: Added a unit test for MD4 digest generation
-
- Closes #4970
-
-- md4: Use const for the length input parameter
-
- This keeps the interface the same as md5 and sha256.
-
-- test1610: Fixed the link to the unit test
-
- Typo from 81c37124.
-
-- ntlm: Removed the dependency on the TLS libaries when using MD5
-
- As we have our own MD5 implementation use the MD5 wrapper to remove the
- TLS dependency.
-
- Closes #4967
-
-- md5/sha256: Updated the functions to allow non-string data to be hashed
-
-- digest: Corrected the name of the local HTTP digest function
-
- Follow up to 2b5b37cb. Local static functions do not require the Curl
- prefix.
-
-- tests: Added a unit test for SHA256 digest generation
-
- Follow up to 2b5b37c.
-
- Closes #4968
-
-- md4: Fixed compilation issues when using GNU TLS gcrypt
-
- * Don't include 'struct' in the gcrypt MD4_CTX typedef
- * The call to gcry_md_read() should use a dereferenced ctx
- * The call to gcry_md_close() should use a dereferenced ctx
-
- Additional minor whitespace issue in the USE_WIN32_CRYPTO code.
-
- Closes #4959
-
-Daniel Stenberg (21 Feb 2020)
-- RELEASE-NOTES: synced
-
-- http2: now require nghttp2 >= 1.12.0
-
- To simplify our code and since earlier versions lack important function
- calls libcurl needs to function correctly.
-
- nghttp2 1.12.0 was relased on June 26, 2016.
-
- Closes #4961
-
-- gtls: fix the copyright year
-
- Follow-up from 41fcb4f609
-
-- [jethrogb brought this change]
-
- GnuTLS: Always send client cert
-
- TLS servers may request a certificate from the client. This request
- includes a list of 0 or more acceptable issuer DNs. The client may use
- this list to determine which certificate to send. GnuTLS's default
- behavior is to not send a client certificate if there is no
- match. However, OpenSSL's default behavior is to send the configured
- certificate. The `GNUTLS_FORCE_CLIENT_CERT` flag mimics OpenSSL
- behavior.
-
- Authored-by: jethrogb on github
- Fixes #1411
- Closes #4958
-
-- [Leo Neat brought this change]
-
- github action: add CIFuzz
-
- Closes #4960
-
-- cleanup: comment typos
-
- Spotted by 'codespell'
-
- Closes #4957
-
-Steve Holme (20 Feb 2020)
-- win32: USE_WIN32_CRYPTO to enable Win32 based MD4, MD5 and SHA256 functions
-
- Whilst lib\md4.c used this pre-processor, lib\md5.c and
- src\tool_metalink.c did not and simply relied on the WIN32
- pre-processor directive.
-
- Reviewed-by: Marcel Raad
- Closes #4955
-
-Daniel Stenberg (19 Feb 2020)
-- connect: remove some spurious infof() calls
-
- As they were added primarily for debugging, they provide little use for
- users.
-
- Closes #4951
-
-- HTTP-COOKIES: mention that a trailing newline is required
-
- ... so that we know we got the whole and not a partial line.
-
- Also, changed the formatting of the fields away from a table again since
- the table format requires a github-markdown tool version that we don't
- run on the web server atm.
-
- Reported-by: Sunny Bean
- Fixes #4946
- Closes #4947
-
-- nit: Copyright year out of date
-
- Follow-up to 1fc0617dcc
-
-Jay Satiro (18 Feb 2020)
-- tool_util: Improve Windows version of tvnow()
-
- - Change tool_util.c tvnow() for Windows to match more closely to
- timeval.c Curl_now().
-
- - Create a win32 init function for the tool, since some initialization
- is required for the tvnow() changes.
-
- Prior to this change the monotonic time function used by curl in Windows
- was determined at build-time and not runtime. That was a problem because
- when curl was built targeted for compatibility with old versions of
- Windows (eg _WIN32_WINNT < 0x0600) it would use GetTickCount which wraps
- every 49.7 days that Windows has been running.
-
- This change makes curl behave similar to libcurl's tvnow function, which
- determines at runtime whether the OS is Vista+ and if so calls
- QueryPerformanceCounter instead. (Note QueryPerformanceCounter is used
- because it has higher resolution than the more obvious candidate
- GetTickCount64). The changes to tvnow are basically a copy and paste but
- the types in some cases are different.
-
- Ref: https://github.com/curl/curl/issues/3309
-
- Closes https://github.com/curl/curl/pull/4847
-
-Daniel Stenberg (18 Feb 2020)
-- SOCKS: fix typo in printf formatting
-
- Follow-up to 4a4b63daa
-
- Reported-by: Peter Piekarski
- Bug: https://github.com/curl/curl/commit/4a4b63daaa01ef59b131d91e8e6e6dfe275c0f08#r37351330
-
-- CURLOPT_REDIR_PROTOCOLS.3: update the DEFAULT section
-
- to be in sync with the description above
-
- Reported-by: Joonas Kuorilehto
- Fixes #4943
- Closes #4945
-
-- docs/GOVERNANCE: refreshed + added "donations" and "commercial support"
-
-- altsvc: make saving the cache an atomic operation
-
- ... by writing the file to temp name then rename to the final when done.
-
- Assisted-by: Jay Satiro
- Fixes #4936
- Closes #4942
-
-- rename: a new file for Curl_rename()
-
- And make the cookie save function use it.
-
-- cookies: make saving atomic with a rename
-
- Saves the file as "[filename].[8 random hex digits].tmp" and renames
- away the extension when done.
-
- Co-authored-by: Jay Satiro
- Reported-by: Mike Frysinger
- Fixes #4914
- Closes #4926
-
-- RELEASE-NOTES: synced
-
-- socks: make the connect phase non-blocking
-
- Removes two entries from KNOWN_BUGS.
-
- Closes #4907
-
-- multi: if Curl_readwrite sets 'comeback' use expire, not loop
-
- Otherwise, a very fast single transfer ricks starving out other
- concurrent transfers.
-
- Closes #4927
-
-- ftp: convert 'sock_accepted' to a plain boolean
-
- This was an array indexed with sockindex but it was only ever used for
- the secondary socket.
-
- Closes #4929
-
-Jay Satiro (15 Feb 2020)
-- CURLINFO_COOKIELIST.3: Fix example
-
- Prior to this change the example would try to import cookies from stdin,
- which wasn't what was intended.
-
- Reported-by: 3dyd@users.noreply.github.com
-
- Fixes https://github.com/curl/curl/issues/4930
-
-Daniel Stenberg (14 Feb 2020)
-- TODO: Paged searches on LDAP server
-
- Closes #4452
-
-- TODO: CURLOPT_SSL_CTX_FUNCTION for LDAPS
-
- Closes #4108
-
-- azure: disable brotli on the macos debug-builds
-
- Because of:
-
- brotli/decode.h:204:33: error: variable length array used [-Werror,-Wvla]
- const uint8_t encoded_buffer[BROTLI_ARRAY_PARAM(encoded_size)],
-
- Closes #4925
-
-Steve Holme (13 Feb 2020)
-- tool_home: Fix the copyright year being out of date
-
- Follow up to 9dc350b6.
-
-Jay Satiro (12 Feb 2020)
-- tool_homedir: Change GetEnv() to use libcurl's curl_getenv()
-
- - Deduplicate GetEnv() code.
-
- - On Windows change ultimate call to use Windows API
- GetEnvironmentVariable() instead of C runtime getenv().
-
- Prior to this change both libcurl and the tool had their own GetEnv
- which over time diverged. Now the tool's GetEnv is a wrapper around
- curl_getenv (libcurl API function which is itself a wrapper around
- libcurl's GetEnv).
-
- Furthermore this change fixes a bug in that Windows API
- GetEnvironmentVariable() is called instead of C runtime getenv() to get
- the environment variable since some changes aren't always visible to the
- latter.
-
- Reported-by: Christoph M. Becker
-
- Fixes https://github.com/curl/curl/issues/4774
- Closes https://github.com/curl/curl/pull/4863
-
-Daniel Stenberg (12 Feb 2020)
-- strerror.h: Copyright year out of date
-
- Follow-up to 1c4fa67e8a8fcf6
-
-Jay Satiro (12 Feb 2020)
-- strerror: Increase STRERROR_LEN 128 -> 256
-
- STRERROR_LEN is the constant used throughout the library to set the size
- of the buffer on the stack that the curl strerror functions write to.
-
- Prior to this change some extended length Windows error messages could
- be truncated.
-
- Closes https://github.com/curl/curl/pull/4920
-
-- multi: fix outdated comment
-
- - Do not say that conn->data is "cleared" by multi_done().
-
- If the connection is in use then multi_done assigns another easy handle
- still using the connection to conn->data, therefore in that case it is
- not cleared.
-
- Closes https://github.com/curl/curl/pull/4901
-
-- easy: remove dead code
-
- multi is already assigned to data->multi by curl_multi_add_handle.
-
- Closes https://github.com/curl/curl/pull/4900
-
-Daniel Stenberg (12 Feb 2020)
-- create-dirs.d: mention the mode
-
- Reported-by: Dan Jacobson
- Fixes #4766
- Closes #4916
-
-- CURLOPT_ALTSVC_CTRL.3: fix the DEFAULT wording
-
- Assisted-by: Jay Satiro
- Reported-by: Craig Andrews
- Fixes #4909
- Closes #4910
-
-- RELEASE-NOTES: synced
-
-Steve Holme (9 Feb 2020)
-- smtp: Simplify the MAIL command and avoid a duplication of send strings
-
- This avoids the duplication of strings when the optional AUTH and SIZE
- parameters are required. It also assists with the modifications that
- are part of #4892.
-
- Closes #4903
-
-Daniel Stenberg (9 Feb 2020)
-- altsvc: keep a copy of the file name to survive handle reset
-
- The alt-svc cache survives a call to curl_easy_reset fine, but the file
- name to use for saving the cache was cleared. Now the alt-svc cache has
- a copy of the file name to survive handle resets.
-
- Added test 1908 to verify.
-
- Reported-by: Craig Andrews
- Fixes #4898
- Closes #4902
-
-Steve Holme (9 Feb 2020)
-- url: Include the failure reason when curl_win32_idn_to_ascii() fails
-
- Provide the failure reason in the failf() info just as we do for the
- libidn2 version of code.
-
- Closes #4899
-
-Jay Satiro (9 Feb 2020)
-- asyn-thread: remove dead code
-
-Daniel Stenberg (8 Feb 2020)
-- [Emil Engler brought this change]
-
- github: Instructions to post "uname -a" on Unix systems in issues
-
- Closes #4896
-
-- [Cristian Greco brought this change]
-
- configure.ac: fix comments about --with-quiche
-
- A simple s/nghttp3/quiche in some comments of --with-quiche.
- Looks like a copy-paste error from --with-nghttp3.
-
- Closes #4897
-
-Steve Holme (7 Feb 2020)
-- checksrc.bat: Fix not being able to run script from the main curl directory
-
- If the script was ran from the main curl directory rather then the
- projects directory then the script would simply exit without error:
-
- C:\url> projects\checksrc.bat
-
- The user would either need to change to the projects directory,
- explicitly specify the current working directory, or perform a
- oneline hacky workaround:
-
- C:\url> cd projects
- C:\url\projects> checksrc.bat
-
- C:\url> checksrc.bat %cd%
-
- C:\url> pushd projects & checksrc.bat & popd
-
- Closes #4894
-
-Daniel Stenberg (7 Feb 2020)
-- [Pierre-Yves Bigourdan brought this change]
-
- digest: Do not quote algorithm in HTTP authorisation
-
- RFC 7616 section 3.4 (The Authorization Header Field) states that "For
- historical reasons, a sender MUST NOT generate the quoted string syntax
- for the following parameters: algorithm, qop, and nc". This removes the
- quoting for the algorithm parameter.
-
- Reviewed-by: Steve Holme
- Closes #4890
-
-- ftp: remove the duplicated user/password struct fields
-
- Closes #4887
-
-- ftp: remove superfluous checking for crlf in user or pwd
-
- ... as this is already done much earlier in the URL parser.
-
- Also add test case 894 that verifies that pop3 with an encodedd CR in
- the user name is rejected.
-
- Closes #4887
-
-Steve Holme (6 Feb 2020)
-- ntlm_wb: Use Curl_socketpair() for greater portability
-
- Reported-by: Daniel Stenberg
- Closes #4886
-
-Daniel Stenberg (5 Feb 2020)
-- [Frank Gevaerts brought this change]
-
- contributors: Also include people who contributed to curl-www
-
- Closes #4884
-
-- [Frank Gevaerts brought this change]
-
- contrithanks: Use the most recent tag by default
-
- (similar to 5296abe)
-
- Closes #4883
-
-- scripts: use last set tag if none given
-
- Makes 'delta' and 'contributors.sh' easier to use.
-
- Make the delta script invoke contrithanks to get current number of
- contributors instead of counting THANKS, for accuracy.
-
- Closes #4881
-
-- ftp: shrink temp buffers used for PORT
-
- These two stack based buffers only need to be 46 + 66 bytes instead of
- 256 + 1024.
-
- Closes #4880
-
-- curl: error on --alt-svc use w/o support
-
- Make the tool check for alt-svc support at run-time and return error
- accordingly if not present when the option is used.
-
- Reported-by: Harry Sintonen
- Closes #4878
-
-- docs/HTTP3: add --enable-alt-svc to curl's configure
-
-- RELEASE-PROCEDURE: feature win is closed post-release a few days
-
- We've tried to uphold this already but let's make it official by
- publicly stating this is the way we do it.
-
- Closes #4877
-
-- altsvc: set h3 version at a common single spot
-
- ... and move the #ifdefs out of the functions. Addresses the fact they
- were different before this change.
-
- Reported-by: Harry Sintonen
- Closes #4876
-
-- [Harry Sintonen brought this change]
-
- altsvc: improved header parser
-
- - Fixed the flag parsing to apply to specific alternative entry only, as
- per RFC. The earlier code would also get totally confused by
- multiprotocol header, parsing flags from the wrong part of the header.
-
- - Fixed the parser terminating on unknown protocols, instead of skipping
- them.
-
- - Fixed a busyloop when protocol-id was present without an equal sign.
-
- Closes #4875
-
-- [Harry Sintonen brought this change]
-
- ngtcp2: fixed to only use AF_INET6 when ENABLE_IPV6
-
-- docs/HTTP3: update the OpenSSL branch to use for ngtcp2
-
- Reported-by: James Fuller
-
-Steve Holme (4 Feb 2020)
-- ntlm: Pass the Curl_easy structure to the private winbind functions
-
- ...rather than the full conndata structure.
-
-Daniel Stenberg (4 Feb 2020)
-- RELEASE-NOTES: synced
-
-- tool_operhlp: Copyright year out of date, should be 2020
-
- Follow-up from 2bc373740a3
-
-- [Orgad Shaneh brought this change]
-
- curl: avoid using strlen for testing if a string is empty
-
- Closes #4873
-
-Steve Holme (3 Feb 2020)
-- ntlm: Ensure the HTTP header data is not stored in the challenge/response
-
-Marcel Raad (3 Feb 2020)
-- openssl: remove redundant assignment
-
- Fixes a scan-build failure on Bionic.
-
- Closes https://github.com/curl/curl/pull/4872
-
-- travis: update non-OpenSSL Linux jobs to Bionic
-
- For the OpenSSL builds, test 323 [TLS-SRP to non-TLS-SRP server] is
- failing with "curl returned 52, when expecting 35".
-
- Closes https://github.com/curl/curl/pull/4872
-
-Dan Fandrich (3 Feb 2020)
-- cirrus: Add some missing semicolons
-
- Newlines aren't preserved in this section so they're needed to separate
- commands. The exports luckily worked anyway as a single long line, but
- erroneously exported a variable called "export"
- [skip ci]
-
-Daniel Gustafsson (2 Feb 2020)
-- [Pedro Monreal brought this change]
-
- cleanup: fix typos and wording in docs and comments
-
- Closes #4869
- Reviewed-by: Emil Engler and Daniel Gustafsson
-
-Steve Holme (2 Feb 2020)
-- ntlm: Move the winbind data into the NTLM data structure
-
- To assist with adding winbind support to the SASL NTLM authentication,
- move the winbind specific data out of conndata into ntlmdata.
-
-Daniel Stenberg (30 Jan 2020)
-- quiche: Copyright year out of date
-
- Follow-up to 7fc63d72333a
-
-- altsvc: use h3-25
-
- Closes #4868
-
-- [Alessandro Ghedini brought this change]
-
- quiche: update to draft-25
-
- Closes #4867
-
-- ngtcp2: update to git master and its draft-25 support
-
- Closes #4865
-
-- cookie: check __Secure- and __Host- case sensitively
-
- While most keywords in cookies are case insensitive, these prefixes are
- specified explicitly to get checked "with a case-sensitive match".
-
- (From the 6265bis document in progress)
-
- Ref: https://tools.ietf.org/html/draft-ietf-httpbis-rfc6265bis-04
- Closes #4864
-
-- KNOWN_BUGS: Multiple methods in a single WWW-Authenticate: header
-
-- oauth2-bearer.d: works for HTTP too
-
- Reported-by: Mischa Salle
- Bug: https://curl.haxx.se/mail/lib-2020-01/0070.html
- Closes #4862
-
-- multi_done: if multiplexed, make conn->data point to another transfer
-
- ... since the current transfer is being killed. Setting to NULL is
- wrong, leaving it pointing to 'data' is wrong since that handle might be
- about to get freed.
-
- Fixes #4845
- Closes #4858
- Reported-by: dmitrmax on github
-
-- location.d: the method change is from POST to GET only
-
- Not from generic non-GET to GET.
-
- Reported-by: Andrius Merkys
- Ref: #4859
- Closes #4861
-
-- urlapi: guess scheme correct even with credentials given
-
- In the "scheme-less" parsing case, we need to strip off credentials
- first before we guess scheme based on the host name!
-
- Assisted-by: Jay Satiro
- Fixes #4856
- Closes #4857
-
-- global_init: move the IPv6 works status bool to multi handle
-
- Previously it was stored in a global state which contributed to
- curl_global_init's thread unsafety. This boolean is now instead figured
- out in curl_multi_init() and stored in the multi handle. Less effective,
- but thread safe.
-
- Closes #4851
-
-- [Jay Satiro brought this change]
-
- README: mention that the docs is in docs/
-
- Reported-by: Austin Green
- Fixes #4830
- Closes #4853
-
-- curl.h: define CURL_WIN32 on windows
-
- ... so that the subsequent logic below can use a single known define to know
- when built on Windows (as we don't define WIN32 anymore).
-
- Follow-up to 1adebe7886ddf20b
-
- Reported-by: crazydef on github
- Assisted-by: Marcel Raad
- Fixes #4854
- Closes #4855
-
-- RELEASE-NOTES: synced
-
-- [Jon Rumsey brought this change]
-
- urldata: do string enums without #ifdefs for build scripts
-
- ... and check for inconsistencies for OS400 at build time with the new
- chkstrings tool.
-
- Closes #4822
-
-- curl: make the -# spaceship bar not wrap the line
-
- The fixed-point math made us lose precision and thus a too high index
- value could be used for outputting the hashtags which could overwrite
- the newline.
-
- The fix increases the precision in the sine table (*100) and the
- associated position math.
-
- Reported-by: Andrew Potter
- Fixes #4849
- Closes #4850
-
-- global_init: assume the EINTR bit by default
-
- - Removed from global_init since it isn't thread-safe. The symbol will
- still remain to not break compiles, it just won't have any effect going
- forward.
-
- - make the internals NOT loop on EINTR (the opposite from previously).
- It only risks returning from the select/poll/wait functions early, and that
- should be risk-free.
-
- Closes #4840
-
-- [Peter Piekarski brought this change]
-
- conn: do not reuse connection if SOCKS proxy credentials differ
-
- Closes #4835
-
-- llist: removed unused Curl_llist_move()
-
- (and the corresponding unit test)
-
- Closes #4842
-
-- conncache: removed unused Curl_conncache_bundle_size()
-
-- strcase: turn Curl_raw_tolower into static
-
- Only ever used from within this file.
-
-- singleuse.pl: support new API functions, fix curl_dbg_ handling
-
-- wolfssh: make it init properly via Curl_ssh_init()
-
- Closes #4846
-
-- [Aron Rotteveel brought this change]
-
- form.d: fix two minor typos
-
- Closes #4843
-
-- openssl: make CURLINFO_CERTINFO not truncate x509v3 fields
-
- Avoid "reparsing" the content and instead deliver more exactly what is
- provided in the certificate and avoid truncating the data after 512
- bytes as done previously. This no longer removes embedded newlines.
-
- Fixes #4837
- Reported-by: bnfp on github
- Closes #4841
-
-Jay Satiro (23 Jan 2020)
-- CURLOPT_PROXY_SSL_OPTIONS.3: Sync with CURLOPT_SSL_OPTIONS.3
-
- - Copy CURLOPT_SSL_OPTIONS.3 description to CURLOPT_PROXY_SSL_OPTIONS.3.
-
- Prior to this change CURLSSLOPT_NO_PARTIALCHAIN was missing from the
- CURLOPT_PROXY_SSL_OPTIONS description.
-
-Daniel Stenberg (22 Jan 2020)
-- mk-ca-bundle: add support for CKA_NSS_SERVER_DISTRUST_AFTER
-
- For now, no cert in the bundle actually sets a date there...
-
- Co-Authored-by: Jay Satiro
- Reported-by: Christian Heimes
- Fixes #4834
- Closes #4836
-
-- RELEASE-NOTES: synced
-
-- [Pavel Volgarev brought this change]
-
- smtp: Allow RCPT TO command to fail for some recipients
-
- Introduces CURLOPT_MAIL_RCPT_ALLLOWFAILS.
-
- Verified with the new tests 3002-3007
-
- Closes #4816
-
-- copyright: fix year ranges
-
- follow-up from dea17b519d (one of these days I'll learn to check before
- I push)
-
-- [nao brought this change]
-
- http: move "oauth_bearer" from connectdata to Curl_easy
-
- Fixes the bug where oauth_bearer gets deallocated when we re-use a
- connection.
-
- Closes #4824
-
-- [Emil Engler brought this change]
-
- curl: Let -D merge headers in one file again
-
- Closes #4762
- Fixes #4753
-
-- data.d: remove "Multiple files can also be specified"
-
- It is superfluous and could even be misleading.
-
- Bug: https://curl.haxx.se/mail/archive-2020-01/0016.html
- Reported-by: Mike Norton
- Closes #4832
-
-Marcel Raad (20 Jan 2020)
-- CMake: support specifying the target Windows version
-
- Previously, it was only possible to set it to Windows Vista or XP by
- setting the option `ENABLE_INET_PTON` to `ON` resp. `OFF`.
- Use a new cache variable `CURL_TARGET_WINDOWS_VERSION` to be able to
- explicitly set the target Windows version. `ENABLE_INET_PTON` is
- ignored in this case.
-
- Ref: https://github.com/curl/curl/pull/1639#issuecomment-313039352
- Ref: https://github.com/curl/curl/pull/4607#issuecomment-557541456
- Closes https://github.com/curl/curl/pull/4815
-
-Daniel Stenberg (20 Jan 2020)
-- http.h: Copyright year out of date, should be 2020
-
- Follow-up to 7ff9222ced8c
-
-- [加藤郁之 brought this change]
-
- HTTP: increase EXPECT_100_THRESHOLD to 1Mb
-
- Mentioned: https://curl.haxx.se/mail/lib-2020-01/0050.html
-
- Closes #4814
-
-- ROADMAP: thread-safe `curl_global_init()`
-
- I'd like to see this happen.
-
-- RELEASE-NOTES: synced
-
-- wolfssl: use the wc-prefixed symbol alternatives
-
- The symbols without wc_ prefix are not always provided.
-
- Ref: https://github.com/wolfSSL/wolfssl/issues/2744
-
- Closes #4827
-
-- polarssl: removed
-
- As detailed in DEPRECATE.md, the polarssl support is now removed after
- having been disabled for 6 months and nobody has missed it.
-
- The threadlock files used by mbedtls are renamed to an 'mbedtls' prefix
- instead of the former 'polarssl' and the common functions that
- previously were shared between mbedtls and polarssl and contained the
- name 'polarssl' have now all been renamed to instead say 'mbedtls'.
-
- Closes #4825
-
-Marcel Raad (16 Jan 2020)
-- libssh2: fix variable type
-
- This led to a conversion warning on 64-bit MinGW, which has 32-bit
- `long` but 64-bit `size_t`.
-
- Closes https://github.com/curl/curl/pull/4823
-
-Daniel Stenberg (16 Jan 2020)
-- curl:progressbarinit: ignore column width from terminals < 20
-
- To avoid division by zero - or other issues.
-
- Reported-by: Daniel Marjamäki
- Closes #4818
-
-- wolfssh: set the password correctly for PASSWORD auth
-
-- wolfssh: remove fprintf() calls (and uses of __func__)
-
-Marcel Raad (14 Jan 2020)
-- CMake: use check_symbol_exists also for inet_pton
-
- It doesn't make much sense to only check if the function can be linked
- when it's not declared in any header and that is treated as an error.
- With the correct target Windows version set, the function is declared
- in ws2tcpip.h and the comment above the modified block is invalid.
-
- Also, move the definition of `_WIN32_WINNT` up to before all symbol
- availability checks so that we don't have to care which ones must be
- done after it.
-
- Tested with Visual Studio 2019 and current MinGW-w64.
-
- Closes https://github.com/curl/curl/pull/4808
-
-Jay Satiro (13 Jan 2020)
-- schannel_verify: Fix alt names manual verify for UNICODE builds
-
- Follow-up to 29e40a6 from two days ago, which added that feature for
- Windows 7 and earlier. The bug only occurred in same.
-
- Ref: https://github.com/curl/curl/pull/4761
-
-Daniel Stenberg (13 Jan 2020)
-- HTTP-COOKIES.md: describe the cookie file format
-
- ... and refer to that file from from CURLOPT_COOKIEFILE.3 and
- CURLOPT_COOKIELIST.3
-
- Assisted-by: Jay Satiro
- Reported-by: bsammon on github
- Fixes #4805
- Closes #4806
-
-- [Tobias Hieta brought this change]
-
- CMake: Add support for CMAKE_LTO option.
-
- This enables Link Time Optimization. LTO is a proven technique for
- optimizing across compilation units.
-
- Closes #4799
-
-- RELEASE-NOTES: synced
-
-- ConnectionExists: respect the max_concurrent_streams limits
-
- A regression made the code use 'multiplexed' as a boolean instead of the
- counter it is intended to be. This made curl try to "over-populate"
- connections with new streams.
-
- This regression came with 41fcdf71a1, shipped in curl 7.65.0.
-
- Also, respect the CURLMOPT_MAX_CONCURRENT_STREAMS value in the same
- check.
-
- Reported-by: Kunal Ekawde
- Fixes #4779
- Closes #4784
-
-- curl: make #0 not output the full URL
-
- It was not intended nor documented!
-
- Added test 1176 to verify.
-
- Reported-by: vshmuk on hackerone
-
- Closes #4812
-
-- wolfSSH: new SSH backend
-
- Adds support for SFTP (not SCP) using WolfSSH.
-
- Closes #4231
-
-- curl: remove 'config' field from OutStruct
-
- As it was just unnecessary duplicated information already stored in the
- 'per_transfer' struct and that's around mostly anyway.
-
- The duplicated pointer caused problems when the code flow was aborted
- before the dupe was filled in and could cause a NULL pointer access.
-
- Reported-by: Brian Carpenter
- Fixes #4807
- Closes #4810
-
-- misc: Copyright year out of date, should be 2020
-
- Follow-up to recent commits
-
- [skip ci]
-
-Jay Satiro (11 Jan 2020)
-- [Santino Keupp brought this change]
-
- libssh2: add support for forcing a hostkey type
-
- - Allow forcing the host's key type found in the known_hosts file.
-
- Currently, curl (with libssh2) does not take keys from your known_hosts
- file into account when talking to a server. With this patch the
- known_hosts file will be searched for an entry matching the hostname
- and, if found, libssh2 will be told to claim this key type from the
- server.
-
- Closes https://github.com/curl/curl/pull/4747
-
-- [Nicolas Guillier brought this change]
-
- cmake: Improve libssh2 check on Windows
-
- - Add "libssh2" name to FindLibSSH2 library search.
-
- On Windows systems, libSSH2 CMake installation may name the library
- "LibSSH2".
-
- Prior to this change cmake only checked for name "ssh2". On Linux that
- works fine because it will prepend the "lib", but it doesn't do that on
- Windows.
-
- Closes https://github.com/curl/curl/pull/4804
-
-- [Faizur Rahman brought this change]
-
- schannel: Make CURLOPT_CAINFO work better on Windows 7
-
- - Support hostname verification via alternative names (SAN) in the
- peer certificate when CURLOPT_CAINFO is used in Windows 7 and earlier.
-
- CERT_NAME_SEARCH_ALL_NAMES_FLAG doesn't exist before Windows 8. As a
- result CertGetNameString doesn't quite work on those versions of
- Windows. This change provides an alternative solution for
- CertGetNameString by iterating through CERT_ALT_NAME_INFO for earlier
- versions of Windows.
-
- Prior to this change many certificates failed the hostname validation
- when CURLOPT_CAINFO was used in Windows 7 and earlier. Most certificates
- now represent multiple hostnames and rely on the alternative names field
- exclusively to represent their hostnames.
-
- Reported-by: Jeroen Ooms
-
- Fixes https://github.com/curl/curl/issues/3711
- Closes https://github.com/curl/curl/pull/4761
-
-- [Emil Engler brought this change]
-
- ngtcp2: Add an error code for QUIC connection errors
-
- - Add new error code CURLE_QUIC_CONNECT_ERROR for QUIC connection
- errors.
-
- Prior to this change CURLE_FAILED_INIT was used, but that was not
- correct.
-
- Closes https://github.com/curl/curl/pull/4754
-
-- multi: Change curl_multi_wait/poll to error on negative timeout
-
- - Add new error CURLM_BAD_FUNCTION_ARGUMENT and return that error when
- curl_multi_wait/poll is passed timeout param < 0.
-
- Prior to this change passing a negative value to curl_multi_wait/poll
- such as -1 could cause the function to wait forever.
-
- Reported-by: hamstergene@users.noreply.github.com
-
- Fixes https://github.com/curl/curl/issues/4763
-
- Closes https://github.com/curl/curl/pull/4765
-
-- [Marc Aldorasi brought this change]
-
- cmake: Enable SMB for Windows builds
-
- - Define USE_WIN32_CRYPTO by default. This enables SMB.
-
- - Show whether SMB is enabled in the "Enabled features" output.
-
- - Fix mingw compiler warning for call to CryptHashData by casting away
- const param. mingw CryptHashData prototype is wrong.
-
- Closes https://github.com/curl/curl/pull/4717
-
-- vtls: Refactor Curl_multissl_version to make the code clearer
-
- Reported-by: Johannes Schindelin
-
- Ref: https://github.com/curl/curl/pull/3863#pullrequestreview-241395121
-
- Closes https://github.com/curl/curl/pull/4803
-
-Daniel Stenberg (10 Jan 2020)
-- fix: Copyright year out of date, should be 2020
-
- Follow-up to 875314ed0bf3b
-
-Marcel Raad (10 Jan 2020)
-- hostip: move code to resolve IP address literals to `Curl_resolv`
-
- The code was duplicated in the various resolver backends.
-
- Also, it was called after the call to `Curl_ipvalid`, which matters in
- case of `CURLRES_IPV4` when called from `connect.c:bindlocal`. This
- caused test 1048 to fail on classic MinGW.
-
- The code ignores `conn->ip_version` as done previously in the
- individual resolver backends.
-
- Move the call to the `resolver_start` callback up to appease test 655,
- which wants it to be called also for literal addresses.
-
- Closes https://github.com/curl/curl/pull/4798
-
-Daniel Stenberg (9 Jan 2020)
-- scripts/delta: adapt to new public header layout
-
-- test1167: verify global symbols in public headers are curl prefixed
-
- ... using the new badsymbols.pl perl script
-
- Fixes #4793
- Closes #4794
-
-- libtest/mk-lib1521: adapt to new public header layout
-
-- include: remove non-curl prefixed defines
-
- ...requires some rearranging of the setup of CURLOPT_ and CURLMOPT_
- enums.
-
-- curl.h: remove WIN32 define
-
- It isn't our job to define this in a public header - and it defines a
- name outside of our naming scope.
-
-- tool_dirhie.c: fix the copyright year range
-
- Follow-up to: 4027bd72d9
-
-- bump: work towards 7.69.0 is started
-
-Jay Satiro (9 Jan 2020)
-- tool_dirhie: Allow directory traversal during creation
-
- - When creating a directory hierarchy do not error when mkdir fails due
- to error EACCESS (13) "access denied".
-
- Some file systems allow for directory traversal; in this case that it
- should be possible to create child directories when permission to the
- parent directory is restricted.
-
- This is a regression caused by me in f16bed0 (precedes curl-7_61_1).
- Basically I had assumed that if a directory already existed it would
- fail only with error EEXIST, and not error EACCES. The latter may
- happen if the directory exists but has certain restricted permissions.
-
- Reported-by: mbeifuss@users.noreply.github.com
-
- Fixes https://github.com/curl/curl/issues/4796
- Closes https://github.com/curl/curl/pull/4797
-
-Daniel Stenberg (9 Jan 2020)
-- KNOWN_BUGS: AUTH PLAIN for SMTP is not working on all servers
-
- Closes #4080
-
-- docs/RELEASE-PROCEDURE.md: pushed some release dates
-
- Ref: https://curl.haxx.se/mail/lib-2020-01/0031.html
-
-- runtests: make random seed fixed for a month
-
- When using randomized features of runtests (-R and --shallow) it is
- useful to have a fixed random seed to make sure for example extra
- commits in a branch or a rebase won't change the seed that would make
- repeated runs work differently.
-
- As it is also useful to change seed sometimes, the default seed is now
- determined based on the current month (and first line curl -V
- output). When the month changes, so will the random seed.
-
- The specific seed is also shown in the standard test suite top header
- and it can be set explictly with the new --seed=[num] option so that the
- exact order of a previous run can be achieved.
-
- Closes #4734
-
-- RELEASE-PROCEDURE.md: fix next release date (Feb 26)
-
- [skip ci]
-
-Version 7.68.0 (8 Jan 2020)
-
-Daniel Stenberg (8 Jan 2020)
-- RELEASE-NOTES: 7.68.0
-
-- THANKS: updated with names from the 7.68.0 release
-
-- RELEASE-PROCEDURE: add four future release dates
-
- and remove four past release dates
-
- [skip ci]
-
-Marcel Raad (6 Jan 2020)
-- TrackMemory tests: always remove CR before LF
-
- It was removed for output containing ' =' via `s/ =.*//`. With classic
- MinGW, this made lines with `free()` end with CRLF, but lines with e.g.
- `malloc()` end with only LF. The tests expect LF only.
-
- Closes https://github.com/curl/curl/pull/4788
-
-Daniel Stenberg (6 Jan 2020)
-- multi.h: move INITIAL_MAX_CONCURRENT_STREAMS from public header
-
- ... to the private multihhandle.h. It is not for public use and it
- wasn't prefixed correctly anyway!
-
- Closes #4790
-
-- file: fix copyright year range
-
- Follow-up to 1b71bc532bd
-
-- curl -w: handle a blank input file correctly
-
- Previously it would end up with an uninitialized memory buffer that
- would lead to a crash or junk getting output.
-
- Added test 1271 to verify.
-
- Reported-by: Brian Carpenter
- Closes #4786
-
-- file: on Windows, refuse paths that start with \\
-
- ... as that might cause an unexpected SMB connection to a given host
- name.
-
- Reported-by: Fernando Muñoz
- CVE-2019-15601
- Bug: https://curl.haxx.se/docs/CVE-2019-15601.html
-
-Jay Satiro (6 Jan 2020)
-- CURLOPT_READFUNCTION.3: fix fopen params in example
-
-- CURLOPT_READFUNCTION.3: fix variable name in example
-
- Reported-by: Paul Joyce
-
- Fixes https://github.com/curl/curl/issues/4787
-
-Daniel Stenberg (5 Jan 2020)
-- curl:getparameter return error for --http3 if libcurl doesn't support
-
- Closes #4785
-
-- docs: mention CURL_MAX_INPUT_LENGTH restrictions
-
- ... for curl_easy_setopt() and curl_url_set().
-
- [skip ci]
-
- Closes #4783
-
-- curl: properly free mimepost data
-
- ... as it could otherwise leak memory when a transfer failed.
-
- Added test 1293 to verify.
-
- Reported-by: Brian Carpenter
- Fixes #4781
- Closes #4782
-
-- curl: cleanup multi handle on failure
-
- ... to fix memory leak in error path.
-
- Fixes #4772
- Closes #4780
- Reported-by: Brian Carpenter
-
-Marcel Raad (3 Jan 2020)
-- lib: fix compiler warnings with `CURL_DISABLE_VERBOSE_STRINGS`
-
- Closes https://github.com/curl/curl/pull/4775
-
-Daniel Stenberg (3 Jan 2020)
-- COPYING: it's 2020!
-
- [skip ci]
-
-Jay Satiro (3 Jan 2020)
-- [Marc Aldorasi brought this change]
-
- tests: Fix bounce requests with truncated writes
-
- Prior to this change the swsbounce check in service_connection could
- fail because prevtestno and prevpartno were not set, which would cause
- the wrong response data to be sent to some tests and cause them to fail.
-
- Ref: https://github.com/curl/curl/pull/4717#issuecomment-570240785
-
-Marcel Raad (31 Dec 2019)
-- tool: make a few char pointers point to const char instead
-
- These are read-only.
-
- Closes https://github.com/curl/curl/pull/4771
-
-Jay Satiro (31 Dec 2019)
-- tests: Change NTLM tests to require SSL
-
- Prior to this change tests that required NTLM feature did not require
- SSL feature.
-
- There are pending changes to cmake builds that will allow enabling NTLM
- in non-SSL builds in Windows. In that case the NTLM auth strings created
- are different from what is expected by the NTLM tests and they fail:
-
- "The issue with NTLM is that previous non-SSL builds would not enable
- NTLM and so the NTLM tests would be skipped."
-
- Assisted-by: marc-groundctl@users.noreply.github.com
-
- Ref: https://github.com/curl/curl/pull/4717#issuecomment-566218729
-
- Closes https://github.com/curl/curl/pull/4768
-
-- [Michael Forney brought this change]
-
- bearssl: Improve I/O handling
-
- Factor out common I/O loop as bearssl_run_until, which reads/writes TLS
- records until the desired engine state is reached. This is now used for
- the handshake, read, write, and close.
-
- Match OpenSSL SSL_write behavior, and don't return the number of bytes
- written until the corresponding records have been completely flushed
- across the socket. This involves keeping track of the length of data
- buffered into the TLS engine, and assumes that when CURLE_AGAIN is
- returned, the write function will be called again with the same data
- and length arguments. This is the same requirement of SSL_write.
-
- Handle TLS close notify as EOF when reading by returning 0.
-
- Closes https://github.com/curl/curl/pull/4748
-
-- travis: Fix error detection
-
- - Stop using inline shell scripts for before_script and script sections.
-
- Prior to this change Travis could ignore errors from commands in inline
- scripts. I don't understand how or why it happens. This is a workaround.
-
- Assisted-by: Simon Warta
-
- Ref: https://github.com/travis-ci/travis-ci/issues/1066
-
- Fixes https://github.com/curl/curl/issues/3730
- Closes https://github.com/curl/curl/pull/3755
-
-- tool_operate: fix mem leak when failed config parse
-
- Found by fuzzing the config file.
-
- Reported-by: Geeknik Labs
-
- Fixes https://github.com/curl/curl/issues/4767
-
-- [Xiang Xiao brought this change]
-
- lib: remove erroneous +x file permission on some c files
-
- Modified by commit eb9a604 accidentally.
-
- Closes https://github.com/curl/curl/pull/4756
-
-- [Xiang Xiao brought this change]
-
- lib: fix warnings found when porting to NuttX
-
- - Undefine DEBUGASSERT in curl_setup_once.h in case it was already
- defined as a system macro.
-
- - Don't compile write32_le in curl_endian unless
- CURL_SIZEOF_CURL_OFF_T > 4, since it's only used by Curl_write64_le.
-
- - Include <arpa/inet.h> in socketpair.c.
-
- Closes https://github.com/curl/curl/pull/4756
-
-- os400: Add missing CURLE error constants
-
- Bug: https://github.com/curl/curl/pull/4754#issuecomment-569126922
- Reported-by: Emil Engler
-
-- CURLOPT_HEADERFUNCTION.3: Document that size is always 1
-
- For compatibility with `fwrite`, the `CURLOPT_HEADERFUNCTION` callback
- is passed two `size_t` parameters which, when multiplied, designate the
- number of bytes of data passed in. In practice, CURL always sets the
- first parameter (`size`) to 1.
-
- This practice is also enshrined in documentation and cannot be changed
- in future. The documentation states that the default callback is
- `fwrite`, which means `fwrite` must be a suitable function for this
- purpose. However, the documentation also states that the callback must
- return the number of *bytes* it successfully handled, whereas ISO C
- `fwrite` returns the number of items (each of size `size`) which it
- wrote. The only way these numbers can be equal is if `size` is 1.
-
- Since `size` is 1 and can never be changed in future anyway, document
- that fact explicitly and let users rely on it.
-
- Reported-by: Frank Gevaerts
- Commit-message-by: Christopher Head
-
- Ref: https://github.com/curl/curl/pull/2787
-
- Fixes https://github.com/curl/curl/issues/4758
-
-- examples/postinmemory.c: Call curl_global_cleanup always
-
- Prior to this change curl_global_cleanup was not called if
- curl_easy_init failed.
-
- Reported-by: kouzhudong@users.noreply.github.com
-
- Fixes https://github.com/curl/curl/issues/4751
-
-Daniel Stenberg (21 Dec 2019)
-- url2file.c: fix copyright year
-
- Follow-up to 525787269599b5
-
-- [Rickard Hallerbäck brought this change]
-
- examples/url2file.c: corrected a comment
-
- The comment was confusing and suggested that setting CURLOPT_NOPROGRESS
- to 0L would both enable and disable debug output at the same time, like
- a Schrödinger's cat of CURLOPTs.
-
- Closes #4745
-
-- HISTORY: OSS-Fuzz started fuzzing libcurl in 2017
-
-- RELEASE-NOTES: synced
-
-Jay Satiro (20 Dec 2019)
-- ngtcp2: Support the latest update key callback type
-
- - Remove our cb_update_key in favor of ngtcp2's new
- ngtcp2_crypto_update_key_cb which does the same thing.
-
- Several days ago the ngtcp2_update_key callback function prototype was
- changed in ngtcp2/ngtcp2@42ce09c. Though it would be possible to
- fix up our cb_update_key for that change they also added
- ngtcp2_crypto_update_key_cb which does the same thing so we'll use that
- instead.
-
- Ref: https://github.com/ngtcp2/ngtcp2/commit/42ce09c
-
- Closes https://github.com/curl/curl/pull/4735
-
-Daniel Stenberg (19 Dec 2019)
-- sws: search for "Testno:" header uncondtionally if no testno
-
- Even if the initial request line wasn't found. With the fix to 1455, the
- test number is now detected correctly.
-
- (Problem found when running tests in random order.)
-
- Closes #4744
-
-- tests: set LC_ALL in more tests
-
- Follow-up to 23208e330ac0c21
-
- Closes #4743
-
-- test165: set LC_ALL=en_US.UTF-8 too
-
- On my current Debian Unstable with libidn2 2.2.0, I get an error if
- LC_ALL is set to blank. Then curl errors out with:
-
- curl: (3) Failed to convert www.åäö.se to ACE; could not convert string to UTF-8
-
- Closes #4738
-
-- curl.h: add two defines for the "pre ISO C" case
-
- Without this fix, this caused a compilation failure on AIX with IBM xlc
- 13.1.3 compiler.
-
- Reported-by: Ram Krushna Mishra
- Fixes #4739
- Closes #4740
-
-- create_conn: prefer multiplexing to using new connections
-
- ... as it would previously prefer new connections rather than
- multiplexing in most conditions! The (now removed) code was a leftover
- from the Pipelining code that was translated wrongly into a
- multiplex-only world.
-
- Reported-by: Kunal Ekawde
- Bug: https://curl.haxx.se/mail/lib-2019-12/0060.html
- Closes #4732
-
-- test1456: remove the use of a fixed local port
-
- Fixup the test to instead not compare the port number. It sometimes
- caused problems like this:
-
- "curl: (45) bind failed with errno 98: Address already in use"
-
- Closes #4733
-
-Jay Satiro (18 Dec 2019)
-- CURLOPT_QUOTE.3: fix typos
-
- Prior to this change the EXAMPLE in the QUOTE/PREQUOTE/POSTQUOTE man
- pages would not compile because a variable name was incorrect.
-
- Reported-by: Bylon2@users.noreply.github.com
-
- Fixes https://github.com/curl/curl/issues/4736
-
-- [Gisle Vanem brought this change]
-
- strerror: Fix compiler warning "empty expression"
-
- - Remove the final semi-colon in the SEC2TXT() macro definition.
-
- Before: #define SEC2TXT(sec) case sec: txt = #sec; break;
-
- After: #define SEC2TXT(sec) case sec: txt = #sec; break
-
- Prior to this change SEC2TXT(foo); would generate break;; which caused
- the empty expression warning.
-
- Ref: https://github.com/curl/curl/commit/5b22e1a#r36458547
-
-Daniel Stenberg (18 Dec 2019)
-- curl/parseconfig: use curl_free() to free memory allocated by libcurl
-
- Reported-by: bxac on github
- Fixes #4730
- Closes #4731
-
-- curl/parseconfig: fix mem-leak
-
- When looping, first trying '.curlrc' and then '_curlrc', the function
- would not free the first string.
-
- Closes #4731
-
-- CURLOPT_URL.3: "curl supports SMB version 1 (only)"
-
- [skip ci]
-
-- test1270: a basic -w redirect_url test
-
- Closes #4728
-
-- HISTORY: the SMB(S) support landed in 2014
-
-- define: remove HAVE_ENGINE_LOAD_BUILTIN_ENGINES, not used anymore
-
- It is covered by USE_OPENSSL_ENGINE now.
-
- Reported-by: Gisle Vanem
- Bug: https://github.com/curl/curl/commit/87b9337c8f76c21c57b204e88b68c6ecf3bd1ac0#commitcomment-36447951
-
- Closes #4725
diff --git a/CMake/FindBrotli.cmake b/CMake/FindBrotli.cmake
new file mode 100644
index 00000000..c43172b6
--- /dev/null
+++ b/CMake/FindBrotli.cmake
@@ -0,0 +1,41 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+include(FindPackageHandleStandardArgs)
+
+find_path(BROTLI_INCLUDE_DIR "brotli/decode.h")
+
+find_library(BROTLICOMMON_LIBRARY NAMES brotlicommon)
+find_library(BROTLIDEC_LIBRARY NAMES brotlidec)
+
+find_package_handle_standard_args(BROTLI
+ FOUND_VAR
+ BROTLI_FOUND
+ REQUIRED_VARS
+ BROTLIDEC_LIBRARY
+ BROTLICOMMON_LIBRARY
+ BROTLI_INCLUDE_DIR
+ FAIL_MESSAGE
+ "Could NOT find BROTLI"
+)
+
+set(BROTLI_INCLUDE_DIRS ${BROTLI_INCLUDE_DIR})
+set(BROTLI_LIBRARIES ${BROTLICOMMON_LIBRARY} ${BROTLIDEC_LIBRARY})
diff --git a/CMake/FindNSS.cmake b/CMake/FindNSS.cmake
new file mode 100644
index 00000000..5fdb2b77
--- /dev/null
+++ b/CMake/FindNSS.cmake
@@ -0,0 +1,38 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+if(UNIX)
+ find_package(PkgConfig QUIET)
+ pkg_search_module(PC_NSS nss)
+endif()
+if(NOT PC_NSS_FOUND)
+ return()
+endif()
+
+set(NSS_LIBRARIES ${PC_NSS_LINK_LIBRARIES})
+set(NSS_INCLUDE_DIRS ${PC_NSS_INCLUDE_DIRS})
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(NSS
+ REQUIRED_VARS NSS_LIBRARIES NSS_INCLUDE_DIRS
+ VERSION_VAR PC_NSS_VERSION)
+
+mark_as_advanced(NSS_INCLUDE_DIRS NSS_LIBRARIES)
diff --git a/CMake/FindZstd.cmake b/CMake/FindZstd.cmake
new file mode 100644
index 00000000..44c741ae
--- /dev/null
+++ b/CMake/FindZstd.cmake
@@ -0,0 +1,69 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+
+#[=======================================================================[.rst:
+FindZstd
+----------
+
+Find the zstd library
+
+Result Variables
+^^^^^^^^^^^^^^^^
+
+``Zstd_FOUND``
+ System has zstd
+``Zstd_INCLUDE_DIRS``
+ The zstd include directories.
+``Zstd_LIBRARIES``
+ The libraries needed to use zstd
+#]=======================================================================]
+
+if(UNIX)
+ find_package(PkgConfig QUIET)
+ pkg_search_module(PC_Zstd libzstd)
+endif()
+
+find_path(Zstd_INCLUDE_DIR zstd.h
+ HINTS
+ ${PC_Zstd_INCLUDEDIR}
+ ${PC_Zstd_INCLUDE_DIRS}
+)
+
+find_library(Zstd_LIBRARY NAMES zstd
+ HINTS
+ ${PC_Zstd_LIBDIR}
+ ${PC_Zstd_LIBRARY_DIRS}
+)
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(Zstd
+ REQUIRED_VARS
+ Zstd_LIBRARY
+ Zstd_INCLUDE_DIR
+)
+
+if(Zstd_FOUND)
+ set(Zstd_LIBRARIES ${Zstd_LIBRARY})
+ set(Zstd_INCLUDE_DIRS ${Zstd_INCLUDE_DIR})
+endif()
+
+mark_as_advanced(Zstd_INCLUDE_DIRS Zstd_LIBRARIES)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 68842ee3..ec1cfa78 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -47,8 +47,6 @@ include(CheckCCompilerFlag)
project(CURL C)
-message(WARNING "the curl cmake build system is poorly maintained. Be aware")
-
file(STRINGS ${CURL_SOURCE_DIR}/include/curl/curlver.h CURL_VERSION_H_CONTENTS REGEX "#define LIBCURL_VERSION( |_NUM )")
string(REGEX MATCH "#define LIBCURL_VERSION \"[^\"]*"
CURL_VERSION ${CURL_VERSION_H_CONTENTS})
@@ -79,6 +77,7 @@ option(ENABLE_ARES "Set to ON to enable c-ares support" OFF)
if(WIN32)
option(CURL_STATIC_CRT "Set to ON to build libcurl with static CRT on Windows (/MT)." OFF)
option(ENABLE_INET_PTON "Set to OFF to prevent usage of inet_pton when building against modern SDKs while still requiring compatibility with older Windows versions, such as Windows XP, Windows Server 2003 etc." ON)
+ option(ENABLE_UNICODE "Set to ON to use the Unicode version of the Windows API functions" OFF)
set(CURL_TARGET_WINDOWS_VERSION "" CACHE STRING "Minimum target Windows version as hex string")
if(CURL_TARGET_WINDOWS_VERSION)
add_definitions(-D_WIN32_WINNT=${CURL_TARGET_WINDOWS_VERSION})
@@ -92,6 +91,12 @@ if(WIN32)
add_definitions(-D_WIN32_WINNT=0x0501)
set(CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS} -D_WIN32_WINNT=0x0501")
endif()
+ if(ENABLE_UNICODE)
+ add_definitions(-DUNICODE -D_UNICODE)
+ if(MINGW)
+ add_compile_options(-municode)
+ endif()
+ endif()
endif()
option(CURL_LTO "Turn on compiler Link Time Optimizations" OFF)
@@ -183,23 +188,24 @@ option(CURL_DISABLE_SMTP "to disable SMTP" OFF)
mark_as_advanced(CURL_DISABLE_SMTP)
option(CURL_DISABLE_GOPHER "to disable Gopher" OFF)
mark_as_advanced(CURL_DISABLE_GOPHER)
-option(CURL_ENABLE_MQTT "to enable MQTT" OFF)
-mark_as_advanced(CURL_ENABLE_MQTT)
+option(CURL_DISABLE_MQTT "to disable MQTT" OFF)
+mark_as_advanced(CURL_DISABLE_MQTT)
if(HTTP_ONLY)
+ set(CURL_DISABLE_DICT ON)
+ set(CURL_DISABLE_FILE ON)
set(CURL_DISABLE_FTP ON)
+ set(CURL_DISABLE_GOPHER ON)
+ set(CURL_DISABLE_IMAP ON)
set(CURL_DISABLE_LDAP ON)
set(CURL_DISABLE_LDAPS ON)
- set(CURL_DISABLE_TELNET ON)
- set(CURL_DISABLE_DICT ON)
- set(CURL_DISABLE_FILE ON)
- set(CURL_DISABLE_TFTP ON)
- set(CURL_DISABLE_RTSP ON)
+ set(CURL_DISABLE_MQTT ON)
set(CURL_DISABLE_POP3 ON)
- set(CURL_DISABLE_IMAP ON)
+ set(CURL_DISABLE_RTSP ON)
set(CURL_DISABLE_SMB ON)
set(CURL_DISABLE_SMTP ON)
- set(CURL_DISABLE_GOPHER ON)
+ set(CURL_DISABLE_TELNET ON)
+ set(CURL_DISABLE_TFTP ON)
endif()
option(CURL_DISABLE_COOKIES "to disable cookies support" OFF)
@@ -239,10 +245,6 @@ if(ENABLE_MANUAL)
set(USE_MANUAL ON)
endif()
-# We need ansi c-flags, especially on HP
-set(CMAKE_C_FLAGS "${CMAKE_ANSI_CFLAGS} ${CMAKE_C_FLAGS}")
-set(CMAKE_REQUIRED_FLAGS ${CMAKE_ANSI_CFLAGS})
-
if(CURL_STATIC_CRT)
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /MT")
@@ -1332,7 +1334,7 @@ endif()
# NTLM support requires crypto function adaptions from various SSL libs
# TODO alternative SSL libs tests for SSP1, GNUTLS, NSS
-if(NOT CURL_DISABLE_CRYPTO_AUTH AND (USE_OPENSSL OR USE_WINDOWS_SSPI OR USE_DARWINSSL OR USE_MBEDTLS OR USE_WIN32_CRYPTO))
+if(NOT CURL_DISABLE_CRYPTO_AUTH AND (USE_OPENSSL OR USE_DARWINSSL OR USE_MBEDTLS OR USE_WIN32_CRYPTO))
set(use_ntlm ON)
else()
set(use_ntlm OFF)
@@ -1370,7 +1372,7 @@ _add_if("Kerberos" NOT CURL_DISABLE_CRYPTO_AUTH AND
(HAVE_GSSAPI OR USE_WINDOWS_SSPI))
# NTLM support requires crypto function adaptions from various SSL libs
# TODO alternative SSL libs tests for SSP1, GNUTLS, NSS
-_add_if("NTLM" use_ntlm)
+_add_if("NTLM" use_ntlm OR USE_WINDOWS_SSPI)
# TODO missing option (autoconf: --enable-ntlm-wb)
_add_if("NTLM_WB" use_ntlm AND NOT CURL_DISABLE_HTTP AND NTLM_WB_ENABLED)
# TODO missing option (--enable-tls-srp), depends on GNUTLS_SRP/OPENSSL_SRP
@@ -1412,7 +1414,7 @@ _add_if("SCP" USE_LIBSSH2 OR USE_LIBSSH)
_add_if("SFTP" USE_LIBSSH2 OR USE_LIBSSH)
_add_if("RTSP" NOT CURL_DISABLE_RTSP)
_add_if("RTMP" USE_LIBRTMP)
-_add_if("MQTT" CURL_ENABLE_MQTT)
+_add_if("MQTT" NOT CURL_DISABLE_MQTT)
if(_items)
list(SORT _items)
endif()
diff --git a/METADATA b/METADATA
index d028213e..a1da2fe8 100644
--- a/METADATA
+++ b/METADATA
@@ -7,13 +7,13 @@ third_party {
}
url {
type: ARCHIVE
- value: "https://github.com/curl/curl/releases/download/curl-7_72_0/curl-7.72.0.tar.xz"
+ value: "https://github.com/curl/curl/releases/download/curl-7_73_0/curl-7.73.0.tar.xz"
}
- version: "curl-7_72_0"
+ version: "curl-7_73_0"
license_type: NOTICE
last_upgrade_date {
year: 2020
- month: 8
- day: 19
+ month: 10
+ day: 28
}
}
diff --git a/Makefile.am b/Makefile.am
index b9632770..1a6d7f99 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -31,6 +31,7 @@ CMAKE_DIST = \
CMake/CurlSymbolHiding.cmake \
CMake/CurlTests.c \
CMake/FindBearSSL.cmake \
+ CMake/FindBrotli.cmake \
CMake/FindCARES.cmake \
CMake/FindGSS.cmake \
CMake/FindLibSSH2.cmake \
@@ -38,8 +39,10 @@ CMAKE_DIST = \
CMake/FindNGHTTP2.cmake \
CMake/FindNGHTTP3.cmake \
CMake/FindNGTCP2.cmake \
+ CMake/FindNSS.cmake \
CMake/FindQUICHE.cmake \
CMake/FindWolfSSL.cmake \
+ CMake/FindZstd.cmake \
CMake/Macros.cmake \
CMake/OtherTests.cmake \
CMake/Platforms/WindowsCache.cmake \
@@ -164,7 +167,7 @@ VC_DIST = projects/README \
projects/wolfssl_options.h \
projects/wolfssl_override.props
-WINBUILD_DIST = winbuild/BUILD.WINDOWS.txt winbuild/gen_resp_file.bat \
+WINBUILD_DIST = winbuild/README.md winbuild/gen_resp_file.bat \
winbuild/MakefileBuild.vc winbuild/Makefile.vc
PLAN9_DIST = plan9/include/mkfile \
diff --git a/README b/README
index ab9aef84..f337f351 100644
--- a/README
+++ b/README
@@ -17,11 +17,9 @@ README
You find answers to the most frequent questions we get in the FAQ document.
- Study the COPYING file for distribution terms and similar. If you distribute
- curl binaries or other binaries that involve libcurl, you might enjoy the
- LICENSE-MIXING document.
+ Study the COPYING file for distribution terms.
- All of those documents and more can be found in the docs/ directory.
+ Those documents and more can be found in the docs/ directory.
CONTACT
diff --git a/RELEASE-NOTES b/RELEASE-NOTES
index 363c7c94..7ec031d1 100644
--- a/RELEASE-NOTES
+++ b/RELEASE-NOTES
@@ -1,119 +1,160 @@
-curl and libcurl 7.72.0
+curl and libcurl 7.73.0
- Public curl releases: 194
- Command line options: 232
- curl_easy_setopt() options: 277
- Public functions in libcurl: 82
- Contributors: 2239
+ Public curl releases: 195
+ Command line options: 234
+ curl_easy_setopt() options: 278
+ Public functions in libcurl: 85
+ Contributors: 2270
This release includes the following changes:
- o content_encoding: add zstd decoding support [1]
- o CURL_PUSH_ERROROUT: allow the push callback to fail the parent stream [31]
- o CURLINFO_EFFECTIVE_METHOD: added [34]
+ o curl: add --output-dir [25]
+ o curl: support XDG_CONFIG_HOME to find .curlrc [3]
+ o curl: update --help with categories [77]
+ o curl_easy_option_*: new API for meta-data about easy options [40]
+ o CURLE_PROXY: new error code [7]
+ o mqtt: enable by default [28]
+ o sftp: add new quote commands 'atime' and 'mtime' [6]
+ o ssh: add the option CURLKHSTAT_FINE_REPLACE [27]
+ o tls: add CURLOPT_SSL_EC_CURVES and --curves [29]
This release includes the following bugfixes:
- o CVE-2020-8231: libcurl: wrong connect-only connection [98]
- o appveyor: collect libcurl.dll variants with prefix or suffix [38]
- o asyn-ares: correct some bad comments [94]
- o bearssl: fix build with disabled proxy support [16]
- o buildconf: avoid array concatenation in die() [64]
- o buildconf: retire ares buildconf invocation
- o checksrc: ban gmtime/localtime [40]
- o checksrc: invoke script with -D to find .checksrc proper [63]
- o CI/azure: install libssh2 for use with msys2-based builds [67]
- o CI/azure: unconditionally enable warnings-as-errors with autotools [19]
- o CI/macos: enable warnings as errors for CMake builds [4]
- o CI/macos: set minimum macOS version [56]
- o CI/macos: unconditionally enable warnings-as-errors with autotools [21]
- o CI: Add muse CI analyzer [79]
- o cirrus-ci: upgrade 11-STABLE to 11.4 [2]
- o CMake: don't complain about missing nroff [87]
- o CMake: fix test for warning suppressions [17]
- o cmake: fix windows xp build [13]
- o configure.ac: Sort features name in summary [6]
- o configure: allow disabling warnings [26]
- o configure: cleanup wolfssl + pkg-config conflicts when cross compiling. [48]
- o configure: show zstd "no" in summary when built without it [49]
- o connect: remove redundant message about connect failure [66]
- o curl-config: ignore REQUIRE_LIB_DEPS in --libs output [96]
- o curl.1: add a few missing valid exit codes [76]
- o curl: add %{method} to the -w variables
- o curl: improve the existing file check with -J [43]
- o curl_multi_setopt: fix compiler warning "result is always false" [42]
- o curl_version_info.3: CURL_VERSION_KERBEROS4 is deprecated [9]
- o CURLINFO_CERTINFO.3: fix typo [3]
- o CURLOPT_NOBODY.3: clarify what setting to 0 means [46]
- o docs: add date of 7.20 to CURLM_CALL_MULTI_PERFORM mentions [18]
- o docs: Add video link to docs/CONTRIBUTE.md [95]
- o docs: change "web site" to "website" [86]
- o docs: clarify MAX_SEND/RECV_SPEED functionality [92]
- o docs: Update a few leftover mentions of DarwinSSL [29]
- o doh: remove redundant cast [20]
- o file2memory: use a define instead of -1 unsigned value [30]
- o ftp: don't do ssl_shutdown instead of ssl_close [85]
- o ftpserver: don't verify SMTP MAIL FROM names [8]
- o getinfo: reset retry-after value in initinfo [51]
- o gnutls: repair the build with `CURL_DISABLE_PROXY` [5]
- o gtls: survive not being able to get name/issuer [73]
- o h2: repair trailer handling [81]
- o http2: close the http2 connection when no more requests may be sent [7]
- o http2: fix nghttp2_strerror -> nghttp2_http2_strerror in debug messages [11]
- o libssh2: s/ssherr/sftperr/ [78]
- o libtest/Makefile.am: add -no-undefined for libstubgss for Cygwin [91]
- o md(4|5): don't use deprecated macOS functions [23]
- o mprintf: Fix dollar string handling [54]
- o mprintf: Fix stack overflows [53]
- o multi: Condition 'extrawait' is always true [60]
- o multi: Remove 10-year old out-commented code [97]
- o multi: remove two checks always true [36]
- o multi: update comment to say easyp list is linear [44]
- o multi_remove_handle: close unused connect-only connections [62]
- o ngtcp2: adapt to error code rename [69]
- o ngtcp2: adjust to recent sockaddr updates [27]
- o ngtcp2: update to modified qlog callback prototype [14]
- o nss: fix build with disabled proxy support [32]
- o ntlm: free target_info before (re-)malloc [55]
- o openssl: fix build with LibreSSL < 2.9.1 [61]
- o page-header: provide protocol details in the curl.1 man page [28]
- o quiche: handle calling disconnect twice [50]
- o runtests.pl: treat LibreSSL and BoringSSL as OpenSSL [59]
- o runtests: move the gnutls-serv tests to a dynamic port [74]
- o runtests: move the smbserver to use a dynamic port number [71]
- o runtests: move the TELNET server to a dynamic port [68]
- o runtests: run the DICT server on a random port number [90]
- o runtests: run the http2 tests on a random port number [72]
- o runtests: support dynamicly base64 encoded sections in tests [75]
- o setopt: unset NOBODY switches to GET if still HEAD [47]
- o smtp_parse_address: handle blank input string properly [89]
- o socks: use size_t for size variable [39]
- o strdup: remove the odd strlen check [24]
- o test1119: verify stdout in the test [33]
- o test1139: make it display the difference on test failures
- o test1140: compare stdout [93]
- o test1908: treat file as text [83]
- o tests/FILEFORMAT.md: mention %HTTP2PORT
- o tests/sshserver.pl: fix compatibility with OpenSSH for Windows
- o TLS naming: fix more Winssl and Darwinssl leftovers [88]
- o tls-max.d: this option is only for TLS-using connections [45]
- o tlsv1.3.d. only for TLS-using connections [37]
- o tool_doswin: Simplify Windows version detection [57]
- o tool_getparam: make --krb option work again [10]
- o TrackMemory tests: ignore realloc and free in getenv.c [84]
- o transfer: fix data_pending for builds with both h2 and h3 enabled [41]
- o transfer: fix memory-leak with CURLOPT_CURLU in a duped handle [15]
- o transfer: move retrycount from connect struct to easy handle [77]
- o travis/script.sh: fix use of `-n' with unquoted envvar [80]
- o travis: add ppc64le and s390x builds [65]
- o travis: update quiche builds for new boringssl layout [25]
- o url: fix CURLU and location following [70]
- o url: silence MSVC warning [12]
- o util: silence conversion warnings [22]
- o win32: Add Curl_verify_windows_version() to curlx [58]
- o WIN32: stop forcing narrow-character API [52]
- o windows: add unicode to feature list [35]
- o windows: disable Unix Sockets for old mingw [82]
+ o altsvc: clone setting in curl_easy_duphandle [60]
+ o base64: also build for smtp, pop3 and imap [81]
+ o BUGS: convert document to markdown [107]
+ o build-wolfssl: fix build with Visual Studio 2019 [114]
+ o buildconf: invoke 'autoreconf -fi' instead [37]
+ o checksrc: detect // comments on column 0 [132]
+ o checksrc: verify do-while and spaces between the braces [2]
+ o checksrc: warn on space after exclamation mark [129]
+ o CI/azure: disable test 571 in the msys2 builds [93]
+ o CI/azure: MQTT is now enabled by default [64]
+ o CI/azure: no longer ignore results of test 1013 [43]
+ o CI/tests: fix invocation of tests for CMake builds [117]
+ o CI/travis: add a CI job with openssl3 (from git master) [51]
+ o cleanups: avoid curl_ on local variables [53]
+ o CMake: add option to enable Unicode on Windows [48]
+ o cmake: make HTTP_ONLY also disable MQTT [58]
+ o CMake: remove explicit `CMAKE_ANSI_CFLAGS` [45]
+ o cmake: remove scary warning [96]
+ o cmdline-opts/gen.pl: generate nicer "See Also" in curl.1 [66]
+ o configure: don't say HTTPS-proxy is enabled when disabled [120]
+ o configure: fix pkg-config detecting wolfssl [26]
+ o configure: let --enable-debug set -Wenum-conversion with gcc >= 10 [56]
+ o conn: check for connection being dead before reuse [39]
+ o connect.c: remove superfluous 'else' in Curl_getconnectinfo [42]
+ o curl.1: add see also no-progress-meter on two spots [67]
+ o curl.1: fix typo invokved -> invoked [36]
+ o curl: in retry output don't call all problems "transient" [74]
+ o curl: make --libcurl show binary posts correctly [130]
+ o curl: make checkpasswd use dynbuf [100]
+ o curl: make file2memory use dynbuf [102]
+ o curl: make file2string use dynbuf [103]
+ o curl: make glob_match_url use dynbuf [101]
+ o curl: make sure setopt CURLOPT_IPRESOLVE passes on a long [134]
+ o curl: retry delays in parallel mode no longer sleeps blocking [70]
+ o curl: use curlx_dynbuf for realloc when loading config files [73]
+ o curl:parallel_transfers: make sure retry readds the transfer [71]
+ o curl_get_line: build only if cookies or alt-svc are enabled [13]
+ o curl_mime_headers.3: fix the example's use of curl_slist_append [83]
+ o Curl_pgrsTime - return new time to avoid timeout integer overflow [32]
+ o Curl_send: return error when pre_receive_plain can't malloc [111]
+ o dist: add missing CMake Find modules to the distribution [14]
+ o docs/LICENSE-MIXING: remove [79]
+ o docs/opts: fix typos in two manual pages [119]
+ o docs/RESOURCES: remove [105]
+ o docs/TheArtOfHttpScripting: convert to markdown [106]
+ o docs: add description about CI platforms to CONTRIBUTE.md [44]
+ o docs: correct non-existing macros in man pages [35]
+ o doh: add error message for DOH_DNS_NAME_TOO_LONG [17]
+ o dynbuf: make sure Curl_dyn_tail() zero terminates [78]
+ o easy_reset: clear retry counter [82]
+ o easygetopt: pass a valid enum to avoid compiler warning [75]
+ o etag: save and use the full received contents [4]
+ o ftp: a 550 response to SIZE returns CURLE_REMOTE_FILE_NOT_FOUND [99]
+ o ftp: avoid risk of reading uninitialized integers [76]
+ o ftp: get rid of the PPSENDF macro [85]
+ o ftp: make a 552 response return CURLE_REMOTE_DISK_FULL [87]
+ o ftp: separate FTPS from FTP over "HTTPS proxy" [112]
+ o git: ignore libtests in 3XXX area [16]
+ o github: use new issue template feature [88]
+ o HISTORY: mention alt-svc added in 2019
+ o HTTP/3: update to OpenSSL_1_1_1g-quic-draft-29 [41]
+ o http: consolidate nghttp2_session_mem_recv() call paths [80]
+ o http_proxy: do not count proxy headers in the header bytecount [90]
+ o http_proxy: do not crash with HTTPS_PROXY and NO_PROXY set [50]
+ o imap: make imap_send use dynbuf for the send buffer management [110]
+ o imap: set cselect_bits to CURL_CSELECT_IN initially [104]
+ o ldap: reduce the amount of #ifdefs needed [124]
+ o lib/Makefile.am: bump VERSIONINFO due to new functions [65]
+ o lib1560: verify "redirect" to double-slash leading URL [20]
+ o lib583: fix enum mixup
+ o lib: fix -Wassign-enum warnings [84]
+ o lib: make Curl_gethostname accept a const pointer [38]
+ o libssh2: handle the SSH protocols done over HTTPS proxy [125]
+ o libssh2: pass on the error from ssh_force_knownhost_key_type [47]
+ o Makefile.m32: add ability to override zstd libs [ci skip] [10]
+ o man pages: switch to https://example.com URLs [86]
+ o MANUAL: update examples to resolve without redirects [122]
+ o mbedtls: add missing header when defining MBEDTLS_DEBUG [133]
+ o memdebug: remove 9 year old unused debug function [126]
+ o multi: expand pre-check for socket readiness [21]
+ o multi: handle connection state winsock events [31]
+ o multi: implement wait using winsock events [22]
+ o ngtcp2: adapt to new NGTCP2_PROTO_VER_MAX define [108]
+ o ngtcp2: adapt to the new pkt_info arguments [18]
+ o ntlm: fix condition for curl_ntlm_core usage [46]
+ o openssl: avoid error conditions when importing native CA [52]
+ o openssl: consider ALERT_CERTIFICATE_EXPIRED a failed verification [57]
+ o openssl: Fix wincrypt symbols conflict with BoringSSL [9]
+ o parsedate: tune the date to epoch conversion [95]
+ o pause: only trigger a reread if the unpause sticks [92]
+ o pingpong: use a dynbuf for the *_pp_sendf() function [113]
+ o READMEs: convert several to markdown [115]
+ o runtests: add %repeat[]% for test files [116]
+ o runtests: allow creating files without newlines [72]
+ o runtests: allow generating a binary sequence from hex
+ o runtests: clear pid variables when failing to start a server [12]
+ o runtests: make cleardir() erase dot files too [8]
+ o runtests: provide curl's version string as %VERSION for tests [127]
+ o schannel: fix memory leak when using get_cert_location [15]
+ o schannel: return CURLE_PEER_FAILED_VERIFICATION for untrusted root [128]
+ o scripts: improve the "get latest curl release tag" logic
+ o sectransp: make it build with --disable-proxy [123]
+ o select.h: make socket validation macros test for INVALID_SOCKET [24]
+ o select: align poll emulation to return all relevant events [63]
+ o select: fix poll-based check not detecting connect failure
+ o select: reduce duplication of Curl_poll in Curl_socket_check [23]
+ o select: simplify return code handling for poll and select [49]
+ o setopt: if the buffer exists, refuse the new BUFFERSIZE [5]
+ o setopt: return CURLE_BAD_FUNCTION_ARGUMENT on bad argument [91]
+ o socketpair: allow CURL_DISABLE_SOCKETPAIR [11]
+ o sockfilt: handle FD_CLOSE winsock event on write socket [30]
+ o src: spell whitespace without whitespace [121]
+ o SSLCERTS: fix English syntax [34]
+ o strerror: honor Unicode API choice on Windows [109]
+ o symbian: drop support [118]
+ o telnet.c: depend on static requirement of WinSock version 2 [61]
+ o test1541: remove since it is a known bug [68]
+ o test163[12]: require http to be built-in to run [94]
+ o test434: test -K use in a single line without newline [59]
+ o test971: show test mismatches "inline"
+ o tests/data: Fix some mismatched XML tags in test cases
+ o tests/FILEFORMAT: document nonewline support for <file>
+ o tests/FILEFORMAT: document type=shell for <command>
+ o tests/server/util.c: fix support for Windows Unicode builds [131]
+ o tests: remove pipelining tests [69]
+ o tls: fix SRP detection by using the proper #ifdefs [33]
+ o tls: provide the CApath verbose log on its own line [1]
+ o tool_setopt: escape binary data to hex, not octal
+ o tool_writeout: add new writeout variable, %{num_headers} [97]
+ o travis: add a build using libressl (from git master) [55]
+ o url: use blank credentials when using proxy w/o username and password [54]
+ o urlapi: use more Curl_safefree [89]
+ o vtls: deduplicate client certificates in ssl_config_data [98]
+ o win32: drop support for WinSock version 1, require version 2 [62]
+ o winbuild: convert the instruction text to README.md [19]
This release includes the following known bugs:
@@ -122,121 +163,159 @@ This release includes the following known bugs:
This release would not have looked like this without help, code, reports and
advice from friends like these:
- Alessandro Ghedini, Alex Kiernan, Baruch Siach, Bevan Weiss, Brian Inglis,
- BrumBrum on hackerone, Cameron Cawley, Carlo Marcelo Arenas Belón,
- causal-agent on github, Cherish98 on github, Dan Fandrich, Daniel Gustafsson,
- Daniel Stenberg, Denis Goleshchikhin, divinity76 on github, Ehren Bendler,
- Emil Engler, Erik Johansson, Filip Salomonsson, Gilles Vollant, Gisle Vanem,
- H3RSKO on github, ihsinme on github, Jeremy Maitin-Shepard,
- joey-l-us on github, Jonathan Cardoso Machado, Jonathan Nieder, Kamil Dudka,
- Ken Brown, Laramie Leavitt, lilongyan-huawei on github, Marc Aldorasi,
- Marcel Raad, Marc Hörsken, Masaya Suzuki, Matthias Naegler,
- Nicolas Sterchele, NobodyXu on github, Peter Wu, ramsay-jones on github,
- Rasmus Melchior Jacobsen, Ray Satiro, sspiri on github, Stefan Yohansson,
- Tadej Vengust, Tatsuhiro Tsujikawa, tbugfinder on github,
- Thomas M. DuBuisson, Tobias Stoeckmann, Tomas Berger, Viktor Szakats,
+ Alessandro Ghedini, Anders Bakken, Andrew Barnes, anio on github,
+ Antarpreet Singh, beckenc on github, Chris Paulson-Ellis,
+ Christian Weisgerber, COFFEETALES on github, Dan Fandrich, Daniel Gustafsson,
+ Daniel Stenberg, Dan Kenigsberg, Diven Qi, Don J Olmstead, Duncan Wilcox,
+ Eli Schwartz, Emil Engler, Eric Curtin, Frederik Wedel-Heinen,
+ fullincome on github, Gaurav Malhotra, Gergely Nagy, Gisle Vanem,
+ Harry Sintonen, htasta on github, iammrtau on github, ihsinme on github,
+ Ionuț-Francisc Oancea, Javier Blazquez, Javier Navarro, Jeroen Ooms,
+ jmdavitt on github, Kamil Dudka, Kunal Chandarana, Laramie Leavitt,
+ Marcel Raad, Marc Hörsken, Martin Bašti, Michael Baentsch, Michael Musset,
+ Michael Olbrich, Mingtao Yang, M.R.T on github, Peter Körner, Peter Wu,
+ Quentin Balland, Rasmus Melchior Jacobsen, Ray Satiro, rcombs on github,
+ Robin Douine, Samanta Navarro, Samuel Marks, Samuel Tranchet, Sergei Nikulov,
+ sofaboss on github, Stefan Strogin, Stephan Mühlstrasser,
+ Tatsuhiro Tsujikawa, Tomas Berger, Tom van der Woerdt, Viktor Szakats,
xwxbug on github,
- (52 contributors)
+ (63 contributors)
Thanks! (and sorry if I forgot to mention someone)
References to bug reports and discussions on issues:
- [1] = https://curl.haxx.se/bug/?i=5453
- [2] = https://curl.haxx.se/bug/?i=5668
- [3] = https://curl.haxx.se/bug/?i=5655
- [4] = https://curl.haxx.se/bug/?i=5716
- [5] = https://curl.haxx.se/bug/?i=5645
- [6] = https://curl.haxx.se/bug/?i=5656
- [7] = https://curl.haxx.se/bug/?i=5643
- [8] = https://curl.haxx.se/bug/?i=5639
- [9] = https://curl.haxx.se/bug/?i=5642
- [10] = https://bugzilla.redhat.com/1833193
- [11] = https://curl.haxx.se/bug/?i=5641
- [12] = https://curl.haxx.se/bug/?i=5638
- [13] = https://curl.haxx.se/bug/?i=5662
- [14] = https://curl.haxx.se/bug/?i=5675
- [15] = https://curl.haxx.se/bug/?i=5665
- [16] = https://curl.haxx.se/bug/?i=5666
- [17] = https://curl.haxx.se/bug/?i=5714
- [18] = https://curl.haxx.se/bug/?i=5744
- [19] = https://curl.haxx.se/bug/?i=5706
- [20] = https://curl.haxx.se/bug/?i=5704
- [21] = https://curl.haxx.se/bug/?i=5694
- [22] = https://curl.haxx.se/bug/?i=5695
- [23] = https://curl.haxx.se/bug/?i=5695
- [24] = https://curl.haxx.se/bug/?i=5697
- [25] = https://curl.haxx.se/bug/?i=5691
- [26] = https://curl.haxx.se/bug/?i=5689
- [27] = https://curl.haxx.se/bug/?i=5690
- [28] = https://curl.haxx.se/bug/?i=5679
- [29] = https://curl.haxx.se/bug/?i=5688
- [30] = https://curl.haxx.se/bug/?i=5683
- [31] = https://curl.haxx.se/bug/?i=5636
- [32] = https://curl.haxx.se/bug/?i=5667
- [33] = https://curl.haxx.se/bug/?i=5644
- [34] = https://curl.haxx.se/bug/?i=5511
- [35] = https://curl.haxx.se/bug/?i=5491
- [36] = https://curl.haxx.se/bug/?i=5676
- [37] = https://curl.haxx.se/bug/?i=5764
- [38] = https://curl.haxx.se/bug/?i=5659
- [39] = https://curl.haxx.se/bug/?i=5654
- [40] = https://curl.haxx.se/bug/?i=5732
- [41] = https://curl.haxx.se/bug/?i=5734
- [42] = https://github.com/curl/curl/commit/61a08508f6a458fe21bbb18cd2a9bac2f039452b#commitcomment-40941232
- [43] = https://hackerone.com/reports/926638
- [44] = https://curl.haxx.se/bug/?i=5737
- [45] = https://curl.haxx.se/bug/?i=5764
- [46] = https://curl.haxx.se/bug/?i=5729
- [47] = https://curl.haxx.se/bug/?i=5725
- [48] = https://curl.haxx.se/bug/?i=5605
- [49] = https://curl.haxx.se/bug/?i=5720
- [50] = https://curl.haxx.se/bug/?i=5726
- [51] = https://curl.haxx.se/bug/?i=5661
- [52] = https://curl.haxx.se/bug/?i=5658
- [53] = https://curl.haxx.se/bug/?i=5722
- [54] = https://curl.haxx.se/bug/?i=5722
- [55] = https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=24379
- [56] = https://curl.haxx.se/bug/?i=5723
- [57] = https://curl.haxx.se/bug/?i=5754
- [58] = https://curl.haxx.se/bug/?i=5754
- [59] = https://curl.haxx.se/bug/?i=5762
- [60] = https://curl.haxx.se/bug/?i=5759
- [61] = https://curl.haxx.se/bug/?i=5757
- [62] = https://curl.haxx.se/bug/?i=5749
- [63] = https://curl.haxx.se/bug/?i=5715
- [64] = https://curl.haxx.se/bug/?i=5701
- [65] = https://curl.haxx.se/bug/?i=5752
- [66] = https://curl.haxx.se/bug/?i=5708
- [67] = https://curl.haxx.se/bug/?i=5721
- [68] = https://curl.haxx.se/bug/?i=5785
- [69] = https://curl.haxx.se/bug/?i=5786
- [70] = https://curl.haxx.se/bug/?i=5709
- [71] = https://curl.haxx.se/bug/?i=5782
- [72] = https://curl.haxx.se/bug/?i=5779
- [73] = https://curl.haxx.se/bug/?i=5778
- [74] = https://curl.haxx.se/bug/?i=5778
- [75] = https://curl.haxx.se/bug/?i=5761
- [76] = https://curl.haxx.se/bug/?i=5777
- [77] = https://curl.haxx.se/bug/?i=5794
- [78] = https://github.com/curl/curl/commit/7370b4e39f1390e701f5b68d910c619151daf72b#r41334700
- [79] = https://curl.haxx.se/bug/?i=5772
- [80] = https://curl.haxx.se/bug/?i=5773
- [81] = https://curl.haxx.se/bug/?i=5663
- [82] = https://curl.haxx.se/bug/?i=5674
- [83] = https://curl.haxx.se/bug/?i=5767
- [84] = https://curl.haxx.se/bug/?i=5767
- [85] = https://curl.haxx.se/bug/?i=5797
- [86] = https://curl.haxx.se/bug/?i=5822
- [87] = https://curl.haxx.se/bug/?i=5817
- [88] = https://curl.haxx.se/bug/?i=5795
- [89] = https://curl.haxx.se/bug/?i=5792
- [90] = https://curl.haxx.se/bug/?i=5783
- [91] = https://curl.haxx.se/bug/?i=5819
- [92] = https://curl.haxx.se/bug/?i=5788
- [93] = https://curl.haxx.se/bug/?i=5814
- [94] = https://curl.haxx.se/bug/?i=5812
- [95] = https://curl.haxx.se/bug/?i=5811
- [96] = https://curl.haxx.se/bug/?i=5793
- [97] = https://curl.haxx.se/bug/?i=5805
- [98] = https://curl.haxx.se/docs/CVE-2020-8231.html
+ [1] = https://curl.haxx.se/bug/?i=5826
+ [2] = https://curl.haxx.se/bug/?i=5845
+ [3] = https://curl.haxx.se/bug/?i=5829
+ [4] = https://curl.haxx.se/bug/?i=5610
+ [5] = https://curl.haxx.se/bug/?i=5842
+ [6] = https://curl.haxx.se/bug/?i=5810
+ [7] = https://curl.haxx.se/bug/?i=5770
+ [8] = https://curl.haxx.se/bug/?i=5838
+ [9] = https://curl.haxx.se/bug/?i=5669
+ [10] = https://curl.haxx.se/bug/?i=5840
+ [11] = https://curl.haxx.se/bug/?i=5850
+ [12] = https://curl.haxx.se/mail/lib-2020-08/0018.html
+ [13] = https://curl.haxx.se/bug/?i=5851
+ [14] = https://curl.haxx.se/bug/?i=5836
+ [15] = https://curl.haxx.se/bug/?i=5855
+ [16] = https://curl.haxx.se/bug/?i=5859
+ [17] = https://curl.haxx.se/bug/?i=5863
+ [18] = https://curl.haxx.se/bug/?i=5864
+ [19] = https://curl.haxx.se/bug/?i=5861
+ [20] = https://curl.haxx.se/bug/?i=5849
+ [21] = https://curl.haxx.se/bug/?i=5634
+ [22] = https://curl.haxx.se/bug/?i=5634
+ [23] = https://curl.haxx.se/bug/?i=5707
+ [24] = https://curl.haxx.se/bug/?i=5760
+ [25] = https://curl.haxx.se/bug/?i=5637
+ [26] = https://curl.haxx.se/bug/?i=5848
+ [27] = https://curl.haxx.se/bug/?i=5685
+ [28] = https://curl.haxx.se/bug/?i=5858
+ [29] = https://curl.haxx.se/bug/?i=5892
+ [30] = https://curl.haxx.se/bug/?i=5879
+ [31] = https://curl.haxx.se/bug/?i=5867
+ [32] = https://curl.haxx.se/bug/?i=5583
+ [33] = https://curl.haxx.se/bug/?i=5865
+ [34] = https://curl.haxx.se/bug/?i=5876
+ [35] = https://curl.haxx.se/bug/?i=5846
+ [36] = https://curl.haxx.se/bug/?i=5846
+ [37] = https://curl.haxx.se/bug/?i=5853
+ [38] = https://curl.haxx.se/bug/?i=5866
+ [39] = https://curl.haxx.se/bug/?i=5884
+ [40] = https://curl.haxx.se/bug/?i=5365
+ [41] = https://curl.haxx.se/bug/?i=5871
+ [42] = https://curl.haxx.se/bug/?i=5912
+ [43] = https://curl.haxx.se/bug/?i=5889
+ [44] = https://curl.haxx.se/bug/?i=5882
+ [45] = https://curl.haxx.se/bug/?i=5439
+ [46] = https://curl.haxx.se/bug/?i=1262
+ [47] = https://curl.haxx.se/bug/?i=5909
+ [48] = https://curl.haxx.se/bug/?i=5843
+ [49] = https://curl.haxx.se/bug/?i=5880
+ [50] = https://bugzilla.redhat.com/1873327
+ [51] = https://curl.haxx.se/bug/?i=5908
+ [52] = https://curl.haxx.se/bug/?i=5907
+ [53] = https://curl.haxx.se/bug/?i=5906
+ [54] = https://curl.haxx.se/bug/?i=5914
+ [55] = https://curl.haxx.se/bug/?i=5932
+ [56] = https://curl.haxx.se/bug/?i=5930
+ [57] = https://curl.haxx.se/bug/?i=5934
+ [58] = https://curl.haxx.se/bug/?i=5931
+ [59] = https://curl.haxx.se/bug/?i=5946
+ [60] = https://curl.haxx.se/bug/?i=5923
+ [61] = https://curl.haxx.se/bug/?i=5854
+ [62] = https://curl.haxx.se/bug/?i=5854
+ [63] = https://curl.haxx.se/bug/?i=5883
+ [64] = https://curl.haxx.se/bug/?i=5903
+ [65] = https://curl.haxx.se/bug/?i=5899
+ [66] = https://curl.haxx.se/bug/?i=5898
+ [67] = https://curl.haxx.se/bug/?i=5897
+ [68] = https://curl.haxx.se/bug/?i=5922
+ [69] = https://curl.haxx.se/bug/?i=5921
+ [70] = https://curl.haxx.se/bug/?i=5917
+ [71] = https://curl.haxx.se/bug/?i=5905
+ [72] = https://curl.haxx.se/bug/?i=5946
+ [73] = https://curl.haxx.se/bug/?i=5946
+ [74] = https://curl.haxx.se/bug/?i=5916
+ [75] = https://github.com/curl/curl/commit/6ebe63fac23f38df911edc348e8ccc72280f9434#commitcomment-42042843
+ [76] = https://curl.haxx.se/bug/?i=5972
+ [77] = https://curl.haxx.se/bug/?i=5680
+ [78] = https://curl.haxx.se/bug/?i=5959
+ [79] = https://curl.haxx.se/bug/?i=5955
+ [80] = https://curl.haxx.se/bug/?i=5648
+ [81] = https://curl.haxx.se/bug/?i=5937
+ [82] = https://curl.haxx.se/bug/?i=5974
+ [83] = https://curl.haxx.se/bug/?i=5942
+ [84] = https://github.com/curl/curl/commit/879007f8118771f4896334731aaca5850a154675#commitcomment-42087553
+ [85] = https://curl.haxx.se/bug/?i=5971
+ [86] = https://curl.haxx.se/bug/?i=5969
+ [87] = https://curl.haxx.se/bug/?i=6016
+ [88] = https://curl.haxx.se/bug/?i=5936
+ [89] = https://curl.haxx.se/bug/?i=5968
+ [90] = https://curl.haxx.se/bug/?i=5992
+ [91] = https://curl.haxx.se/bug/?i=5993
+ [92] = https://curl.haxx.se/mail/lib-2020-09/0081.html
+ [93] = https://curl.haxx.se/bug/?i=5954
+ [94] = https://curl.haxx.se/bug/?i=6014
+ [95] = https://curl.haxx.se/bug/?i=5985
+ [96] = https://curl.haxx.se/bug/?i=5984
+ [97] = https://curl.haxx.se/bug/?i=5947
+ [98] = https://curl.haxx.se/bug/?i=5629
+ [99] = https://curl.haxx.se/bug/?i=5953
+ [100] = https://curl.haxx.se/bug/?i=5952
+ [101] = https://curl.haxx.se/bug/?i=5952
+ [102] = https://curl.haxx.se/bug/?i=5952
+ [103] = https://curl.haxx.se/bug/?i=5952
+ [104] = https://curl.haxx.se/bug/?i=5961
+ [105] = https://curl.haxx.se/bug/?i=5980
+ [106] = https://curl.haxx.se/bug/?i=5981
+ [107] = https://curl.haxx.se/bug/?i=5979
+ [108] = https://curl.haxx.se/bug/?i=6012
+ [109] = https://curl.haxx.se/bug/?i=6005
+ [110] = https://curl.haxx.se/bug/?i=6010
+ [111] = https://curl.haxx.se/bug/?i=6011
+ [112] = https://curl.haxx.se/bug/?i=5523
+ [113] = https://curl.haxx.se/bug/?i=6004
+ [114] = https://curl.haxx.se/bug/?i=6033
+ [115] = https://curl.haxx.se/bug/?i=6028
+ [116] = https://curl.haxx.se/bug/?i=6040
+ [117] = https://curl.haxx.se/bug/?i=6052
+ [118] = https://curl.haxx.se/bug/?i=5989
+ [119] = https://curl.haxx.se/bug/?i=6039
+ [120] = https://github.com/curl/curl/pull/5735#issuecomment-701376388
+ [121] = https://curl.haxx.se/bug/?i=6023
+ [122] = https://curl.haxx.se/bug/?i=6024
+ [123] = https://curl.haxx.se/bug/?i=6025
+ [124] = https://curl.haxx.se/bug/?i=6035
+ [125] = https://curl.haxx.se/bug/?i=4295
+ [126] = https://curl.haxx.se/bug/?i=5973
+ [127] = https://curl.haxx.se/bug/?i=6037
+ [128] = https://curl.haxx.se/bug/?i=6003
+ [129] = https://curl.haxx.se/bug/?i=6034
+ [130] = https://curl.haxx.se/bug/?i=6031
+ [131] = https://curl.haxx.se/bug/?i=6070
+ [132] = https://curl.haxx.se/bug/?i=6048
+ [133] = https://curl.haxx.se/bug/?i=6045
+ [134] = https://curl.haxx.se/bug/?i=6042
diff --git a/acinclude.m4 b/acinclude.m4
index 089449ba..e7a36e4b 100644
--- a/acinclude.m4
+++ b/acinclude.m4
@@ -661,7 +661,7 @@ dnl -------------------------------------------------
dnl Check for libraries needed for WINLDAP support,
dnl and prepended to LIBS any needed libraries.
dnl This macro can take an optional parameter with a
-dnl white space separated list of libraries to check
+dnl whitespace separated list of libraries to check
dnl before the WINLDAP default ones.
AC_DEFUN([CURL_CHECK_LIBS_WINLDAP], [
@@ -755,7 +755,7 @@ dnl -------------------------------------------------
dnl Check for libraries needed for LDAP support,
dnl and prepended to LIBS any needed libraries.
dnl This macro can take an optional parameter with a
-dnl white space separated list of libraries to check
+dnl whitespace separated list of libraries to check
dnl before the default ones.
AC_DEFUN([CURL_CHECK_LIBS_LDAP], [
diff --git a/buildconf b/buildconf
index 0d3c064f..4e4c17e9 100755
--- a/buildconf
+++ b/buildconf
@@ -1,430 +1,4 @@
#!/bin/sh
-#***************************************************************************
-# _ _ ____ _
-# Project ___| | | | _ \| |
-# / __| | | | |_) | |
-# | (__| |_| | _ <| |___
-# \___|\___/|_| \_\_____|
-#
-# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
-#
-# This software is licensed as described in the file COPYING, which
-# you should have received as part of this distribution. The terms
-# are also available at https://curl.haxx.se/docs/copyright.html.
-#
-# You may opt to use, copy, modify, merge, publish, distribute and/or sell
-# copies of the Software, and permit persons to whom the Software is
-# furnished to do so, under the terms of the COPYING file.
-#
-# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
-# KIND, either express or implied.
-#
-###########################################################################
-#--------------------------------------------------------------------------
-# die prints argument string to stdout and exits this shell script.
-#
-die(){
- echo "buildconf: $*"
- exit 1
-}
-
-#--------------------------------------------------------------------------
-# findtool works as 'which' but we use a different name to make it more
-# obvious we aren't using 'which'! ;-)
-# Unlike 'which' does, the current directory is ignored.
-#
-findtool(){
- file="$1"
-
- if { echo "$file" | grep "/" >/dev/null 2>&1; } then
- # when file is given with a path check it first
- if test -f "$file"; then
- echo "$file"
- return
- fi
- fi
-
- old_IFS=$IFS; IFS=':'
- for path in $PATH
- do
- IFS=$old_IFS
- # echo "checks for $file in $path" >&2
- if test "$path" -a "$path" != '.' -a -f "$path/$file"; then
- echo "$path/$file"
- return
- fi
- done
- IFS=$old_IFS
-}
-
-#--------------------------------------------------------------------------
-# removethis() removes all files and subdirectories with the given name,
-# inside and below the current subdirectory at invocation time.
-#
-removethis(){
- if test "$#" = "1"; then
- find . -depth -name $1 -exec rm -rf {} \;
- fi
-}
-
-#--------------------------------------------------------------------------
-# Ensure that buildconf runs from the subdirectory where configure.ac lives
-#
-if test ! -f configure.ac ||
- test ! -f src/tool_main.c ||
- test ! -f lib/urldata.h ||
- test ! -f include/curl/curl.h ||
- test ! -f m4/curl-functions.m4; then
- echo "Can not run buildconf from outside of curl's source subdirectory!"
- echo "Change to the subdirectory where buildconf is found, and try again."
- exit 1
-fi
-
-#--------------------------------------------------------------------------
-# autoconf 2.57 or newer. Unpatched version 2.67 does not generate proper
-# configure script. Unpatched version 2.68 is simply unusable, we should
-# disallow 2.68 usage.
-#
-need_autoconf="2.57"
-ac_version=`${AUTOCONF:-autoconf} --version 2>/dev/null|head -n 1| sed -e 's/^[^0-9]*//' -e 's/[a-z]* *$//'`
-if test -z "$ac_version"; then
- echo "buildconf: autoconf not found."
- echo " You need autoconf version $need_autoconf or newer installed."
- exit 1
-fi
-old_IFS=$IFS; IFS='.'; set $ac_version; IFS=$old_IFS
-if test "$1" = "2" -a "$2" -lt "57" || test "$1" -lt "2"; then
- echo "buildconf: autoconf version $ac_version found."
- echo " You need autoconf version $need_autoconf or newer installed."
- echo " If you have a sufficient autoconf installed, but it"
- echo " is not named 'autoconf', then try setting the"
- echo " AUTOCONF environment variable."
- exit 1
-fi
-
-if test "$1" = "2" -a "$2" -eq "67"; then
- echo "buildconf: autoconf version $ac_version (BAD)"
- echo " Unpatched version generates broken configure script."
-elif test "$1" = "2" -a "$2" -eq "68"; then
- echo "buildconf: autoconf version $ac_version (BAD)"
- echo " Unpatched version generates unusable configure script."
-else
- echo "buildconf: autoconf version $ac_version (ok)"
-fi
-
-am4te_version=`${AUTOM4TE:-autom4te} --version 2>/dev/null|head -n 1| sed -e 's/autom4te\(.*\)/\1/' -e 's/^[^0-9]*//' -e 's/[a-z]* *$//'`
-if test -z "$am4te_version"; then
- echo "buildconf: autom4te not found. Weird autoconf installation!"
- exit 1
-fi
-if test "$am4te_version" = "$ac_version"; then
- echo "buildconf: autom4te version $am4te_version (ok)"
-else
- echo "buildconf: autom4te version $am4te_version (ERROR: does not match autoconf version)"
- exit 1
-fi
-
-#--------------------------------------------------------------------------
-# autoheader 2.50 or newer
-#
-ah_version=`${AUTOHEADER:-autoheader} --version 2>/dev/null|head -n 1| sed -e 's/^[^0-9]*//' -e 's/[a-z]* *$//'`
-if test -z "$ah_version"; then
- echo "buildconf: autoheader not found."
- echo " You need autoheader version 2.50 or newer installed."
- exit 1
-fi
-old_IFS=$IFS; IFS='.'; set $ah_version; IFS=$old_IFS
-if test "$1" = "2" -a "$2" -lt "50" || test "$1" -lt "2"; then
- echo "buildconf: autoheader version $ah_version found."
- echo " You need autoheader version 2.50 or newer installed."
- echo " If you have a sufficient autoheader installed, but it"
- echo " is not named 'autoheader', then try setting the"
- echo " AUTOHEADER environment variable."
- exit 1
-fi
-
-echo "buildconf: autoheader version $ah_version (ok)"
-
-#--------------------------------------------------------------------------
-# automake 1.7 or newer
-#
-need_automake="1.7"
-am_version=`${AUTOMAKE:-automake} --version 2>/dev/null|head -n 1| sed -e 's/^.* \([0-9]\)/\1/' -e 's/[a-z]* *$//' -e 's/\(.*\)\(-p.*\)/\1/'`
-if test -z "$am_version"; then
- echo "buildconf: automake not found."
- echo " You need automake version $need_automake or newer installed."
- exit 1
-fi
-old_IFS=$IFS; IFS='.'; set $am_version; IFS=$old_IFS
-if test "$1" = "1" -a "$2" -lt "7" || test "$1" -lt "1"; then
- echo "buildconf: automake version $am_version found."
- echo " You need automake version $need_automake or newer installed."
- echo " If you have a sufficient automake installed, but it"
- echo " is not named 'automake', then try setting the"
- echo " AUTOMAKE environment variable."
- exit 1
-fi
-
-echo "buildconf: automake version $am_version (ok)"
-
-acloc_version=`${ACLOCAL:-aclocal} --version 2>/dev/null|head -n 1| sed -e 's/^.* \([0-9]\)/\1/' -e 's/[a-z]* *$//' -e 's/\(.*\)\(-p.*\)/\1/'`
-if test -z "$acloc_version"; then
- echo "buildconf: aclocal not found. Weird automake installation!"
- exit 1
-fi
-if test "$acloc_version" = "$am_version"; then
- echo "buildconf: aclocal version $acloc_version (ok)"
-else
- echo "buildconf: aclocal version $acloc_version (ERROR: does not match automake version)"
- exit 1
-fi
-
-#--------------------------------------------------------------------------
-# GNU libtoolize preliminary check
-#
-want_lt_major=1
-want_lt_minor=4
-want_lt_patch=2
-want_lt_version=1.4.2
-
-# This approach that tries 'glibtoolize' first is intended for systems that
-# have GNU libtool named as 'glibtoolize' and libtoolize not being GNU's.
-
-libtoolize=`findtool glibtoolize 2>/dev/null`
-if test ! -x "$libtoolize"; then
- libtoolize=`findtool ${LIBTOOLIZE:-libtoolize}`
-fi
-if test -z "$libtoolize"; then
- echo "buildconf: libtoolize not found."
- echo " You need GNU libtoolize $want_lt_version or newer installed."
- exit 1
-fi
-
-lt_pver=`$libtoolize --version 2>/dev/null|head -n 1`
-lt_qver=`echo $lt_pver|sed -e "s/([^)]*)//g" -e "s/^[^0-9]*//g"`
-lt_version=`echo $lt_qver|sed -e "s/[- ].*//" -e "s/\([a-z]*\)$//"`
-if test -z "$lt_version"; then
- echo "buildconf: libtoolize not found."
- echo " You need GNU libtoolize $want_lt_version or newer installed."
- exit 1
-fi
-old_IFS=$IFS; IFS='.'; set $lt_version; IFS=$old_IFS
-lt_major=$1
-lt_minor=$2
-lt_patch=$3
-
-if test -z "$lt_major"; then
- lt_status="bad"
-elif test "$lt_major" -gt "$want_lt_major"; then
- lt_status="good"
-elif test "$lt_major" -lt "$want_lt_major"; then
- lt_status="bad"
-elif test -z "$lt_minor"; then
- lt_status="bad"
-elif test "$lt_minor" -gt "$want_lt_minor"; then
- lt_status="good"
-elif test "$lt_minor" -lt "$want_lt_minor"; then
- lt_status="bad"
-elif test -z "$lt_patch"; then
- lt_status="bad"
-elif test "$lt_patch" -gt "$want_lt_patch"; then
- lt_status="good"
-elif test "$lt_patch" -lt "$want_lt_patch"; then
- lt_status="bad"
-else
- lt_status="good"
-fi
-if test "$lt_status" != "good"; then
- echo "buildconf: libtoolize version $lt_version found."
- echo " You need GNU libtoolize $want_lt_version or newer installed."
- exit 1
-fi
-
-echo "buildconf: libtoolize version $lt_version (ok)"
-
-#--------------------------------------------------------------------------
-# m4 check
-#
-m4=`(${M4:-m4} --version 0<&- || ${M4:-gm4} --version) 2>/dev/null 0<&- | head -n 1`;
-m4_version=`echo $m4 | sed -e 's/^.* \([0-9]\)/\1/' -e 's/[a-z]* *$//'`
-
-if { echo $m4 | grep "GNU" >/dev/null 2>&1; } then
- echo "buildconf: GNU m4 version $m4_version (ok)"
-else
- if test -z "$m4"; then
- echo "buildconf: m4 version not recognized. You need a GNU m4 installed!"
- else
- echo "buildconf: m4 version $m4 found. You need a GNU m4 installed!"
- fi
- exit 1
-fi
-
-#--------------------------------------------------------------------------
-# perl check
-#
-PERL=`findtool ${PERL:-perl}`
-if test -z "$PERL"; then
- echo "buildconf: perl not found"
- exit 1
-fi
-
-#--------------------------------------------------------------------------
-# Remove files generated on previous buildconf/configure run.
-#
-for fname in .deps \
- .libs \
- *.la \
- *.lo \
- *.a \
- *.o \
- Makefile \
- Makefile.in \
- aclocal.m4 \
- aclocal.m4.bak \
- autom4te.cache \
- compile \
- config.guess \
- curl_config.h \
- curl_config.h.in \
- config.log \
- config.lt \
- config.status \
- config.sub \
- configure \
- configurehelp.pm \
- curl-config \
- depcomp \
- libcares.pc \
- libcurl.pc \
- libtool \
- libtool.m4 \
- libtool.m4.tmp \
- ltmain.sh \
- ltoptions.m4 \
- ltsugar.m4 \
- ltversion.m4 \
- lt~obsolete.m4 \
- missing \
- install-sh \
- stamp-h1 \
- stamp-h2 \
- stamp-h3 ; do
- removethis "$fname"
-done
-
-#--------------------------------------------------------------------------
-# run the correct scripts now
-#
-
-echo "buildconf: running libtoolize"
-${libtoolize} --copy --force || die "libtoolize command failed"
-
-# When using libtool 1.5.X (X < 26) we copy libtool.m4 to our local m4
-# subdirectory and this local copy is patched to fix some warnings that
-# are triggered when running aclocal and using autoconf 2.62 or later.
-
-if test "$lt_major" = "1" && test "$lt_minor" = "5"; then
- if test -z "$lt_patch" || test "$lt_patch" -lt "26"; then
- echo "buildconf: copying libtool.m4 to local m4 subdir"
- ac_dir=`${ACLOCAL:-aclocal} --print-ac-dir`
- if test -f $ac_dir/libtool.m4; then
- cp -f $ac_dir/libtool.m4 m4/libtool.m4
- else
- echo "buildconf: $ac_dir/libtool.m4 not found"
- fi
- if test -f m4/libtool.m4; then
- echo "buildconf: renaming some variables in local m4/libtool.m4"
- $PERL -i.tmp -pe \
- 's/lt_prog_compiler_pic_works/lt_cv_prog_compiler_pic_works/g; \
- s/lt_prog_compiler_static_works/lt_cv_prog_compiler_static_works/g;' \
- m4/libtool.m4
- rm -f m4/libtool.m4.tmp
- fi
- fi
-fi
-
-if test -f m4/libtool.m4; then
- echo "buildconf: converting all mv to mv -f in local m4/libtool.m4"
- $PERL -i.tmp -pe 's/\bmv +([^-\s])/mv -f $1/g' m4/libtool.m4
- rm -f m4/libtool.m4.tmp
-fi
-
-echo "buildconf: running aclocal"
-#shellcheck disable=SC2154
-${ACLOCAL:-aclocal} -I m4 $ACLOCAL_FLAGS || die "aclocal command failed"
-
-echo "buildconf: converting all mv to mv -f in local aclocal.m4"
-$PERL -i.bak -pe 's/\bmv +([^-\s])/mv -f $1/g' aclocal.m4
-
-echo "buildconf: running autoheader"
-${AUTOHEADER:-autoheader} || die "autoheader command failed"
-
-echo "buildconf: running autoconf"
-${AUTOCONF:-autoconf} || die "autoconf command failed"
-
-echo "buildconf: running automake"
-${AUTOMAKE:-automake} --add-missing --copy || die "automake command failed"
-
-#--------------------------------------------------------------------------
-# GNU libtool complementary check
-#
-# Depending on the libtool and automake versions being used, config.guess
-# might not be installed in the subdirectory until automake has finished.
-# So we can not attempt to use it until this very last buildconf stage.
-#
-if test ! -f ./config.guess; then
- echo "buildconf: config.guess not found"
-else
- buildhost=`./config.guess 2>/dev/null|head -n 1`
- case $buildhost in
- *-*-darwin*)
- need_lt_major=1
- need_lt_minor=5
- need_lt_patch=26
- need_lt_check="yes"
- ;;
- *-*-hpux*)
- need_lt_major=1
- need_lt_minor=5
- need_lt_patch=24
- need_lt_check="yes"
- ;;
- esac
- if test ! -z "$need_lt_check"; then
- if test -z "$lt_major"; then
- lt_status="bad"
- elif test "$lt_major" -gt "$need_lt_major"; then
- lt_status="good"
- elif test "$lt_major" -lt "$need_lt_major"; then
- lt_status="bad"
- elif test -z "$lt_minor"; then
- lt_status="bad"
- elif test "$lt_minor" -gt "$need_lt_minor"; then
- lt_status="good"
- elif test "$lt_minor" -lt "$need_lt_minor"; then
- lt_status="bad"
- elif test -z "$lt_patch"; then
- lt_status="bad"
- elif test "$lt_patch" -gt "$need_lt_patch"; then
- lt_status="good"
- elif test "$lt_patch" -lt "$need_lt_patch"; then
- lt_status="bad"
- else
- lt_status="good"
- fi
- if test "$lt_status" != "good"; then
- need_lt_version="$need_lt_major.$need_lt_minor.$need_lt_patch"
- echo "buildconf: libtool version $lt_version found."
- echo " $buildhost requires GNU libtool $need_lt_version or newer installed."
- rm -f configure
- exit 1
- fi
- fi
-fi
-
-#--------------------------------------------------------------------------
-# Finished successfully.
-#
-echo "buildconf: OK"
-exit 0
+echo "*** Do not use buildconf. Instead, just use: autoreconf -fi" >&2
+exec ${AUTORECONF:-autoreconf} -fi "${@}"
diff --git a/configure b/configure
index 6c5ed680..2b0a6145 100755
--- a/configure
+++ b/configure
@@ -955,7 +955,7 @@ HAVE_LIBZ_TRUE
HAVE_LIBZ
PKGCONFIG
HAVE_PROTO_BSDSOCKET_H
-CURL_ENABLE_MQTT
+CURL_DISABLE_MQTT
CURL_DISABLE_GOPHER
CURL_DISABLE_SMTP
CURL_DISABLE_SMB
@@ -1133,7 +1133,7 @@ enable_symbol_hiding
enable_hidden_symbols
enable_ares
enable_rt
-enable_esni
+enable_ech
enable_code_coverage
enable_dependency_tracking
enable_largefile
@@ -1216,6 +1216,7 @@ enable_ntlm_wb
enable_tls_srp
enable_unix_sockets
enable_cookies
+enable_socketpair
enable_http_auth
enable_doh
enable_mime
@@ -1223,6 +1224,7 @@ enable_dateparse
enable_netrc
enable_progress_meter
enable_dnsshuffle
+enable_get_easy_option
enable_alt_svc
'
ac_precious_vars='build_alias
@@ -1887,8 +1889,8 @@ Optional Features:
--enable-ares[=PATH] Enable c-ares for DNS lookups
--disable-ares Disable c-ares for DNS lookups
--disable-rt disable dependency on -lrt
- --enable-esni Enable ESNI support
- --disable-esni Disable ESNI support
+ --enable-ech Enable ECH support
+ --disable-ech Disable ECH support
--enable-code-coverage Provide code coverage
--enable-dependency-tracking
do not reject slow dependency extractors
@@ -1971,6 +1973,8 @@ Optional Features:
--disable-unix-sockets Disable Unix domain sockets
--enable-cookies Enable cookies support
--disable-cookies Disable cookies support
+ --enable-socketpair Enable socketpair support
+ --disable-socketpair Disable socketpair support
--enable-http-auth Enable HTTP authentication support
--disable-http-auth Disable HTTP authentication support
--enable-doh Enable DoH support
@@ -1986,6 +1990,10 @@ Optional Features:
Disable progress-meter
--enable-dnsshuffle Enable DNS shuffling
--disable-dnsshuffle Disable DNS shuffling
+ --enable-get-easy-options
+ Enable curl_easy_options
+ --disable-get-easy-options
+ Disable curl_easy_options
--enable-alt-svc Enable alt-svc support
--disable-alt-svc Disable alt-svc support
@@ -3355,31 +3363,31 @@ $as_echo "no" >&6; }
esac
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable ESNI support" >&5
-$as_echo_n "checking whether to enable ESNI support... " >&6; }
- OPT_ESNI="default"
- # Check whether --enable-esni was given.
-if test "${enable_esni+set}" = set; then :
- enableval=$enable_esni; OPT_ESNI=$enableval
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable ECH support" >&5
+$as_echo_n "checking whether to enable ECH support... " >&6; }
+ OPT_ECH="default"
+ # Check whether --enable-ech was given.
+if test "${enable_ech+set}" = set; then :
+ enableval=$enable_ech; OPT_ECH=$enableval
fi
- case "$OPT_ESNI" in
+ case "$OPT_ECH" in
no)
- want_esni="no"
- curl_esni_msg="no (--enable-esni)"
+ want_ech="no"
+ curl_ech_msg="no (--enable-ech)"
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
;;
default)
- want_esni="no"
- curl_esni_msg="no (--enable-esni)"
+ want_ech="no"
+ curl_ech_msg="no (--enable-ech)"
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
;;
*)
- want_esni="yes"
- curl_esni_msg="enabled (--disable-esni)"
- experimental="esni"
+ want_ech="yes"
+ curl_ech_msg="enabled (--disable-ech)"
+ experimental="ech"
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
;;
@@ -9340,7 +9348,7 @@ static const void *lt_preloaded_setup() {
#endif
_LT_EOF
# Now try linking the two files.
- mv -f conftest.$ac_objext conftstm.$ac_objext
+ mv conftest.$ac_objext conftstm.$ac_objext
lt_globsym_save_LIBS=$LIBS
lt_globsym_save_CFLAGS=$CFLAGS
LIBS=conftstm.$ac_objext
@@ -13149,9 +13157,9 @@ fi
hpux9*)
if test yes = "$GCC"; then
- archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv -f $output_objdir/$soname $lib'
+ archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
else
- archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv -f $output_objdir/$soname $lib'
+ archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
fi
hardcode_libdir_flag_spec='$wl+b $wl$libdir'
hardcode_libdir_separator=:
@@ -18110,6 +18118,28 @@ $as_echo "$as_me: WARNING: compiler options rejected: $tmp_options" >&2;}
tmp_CFLAGS="$tmp_CFLAGS -Wno-varargs"
fi
fi
+ if test "$compiler_num" -ge "700"; then
+
+ ac_var_added_warnings=""
+ for warning in assign-enum; do
+
+ ac_var_match_word="no"
+ for word1 in $CFLAGS; do
+ for word2 in -Wno-$warning -W$warning; do
+ if test "$word1" = "$word2"; then
+ ac_var_match_word="yes"
+ fi
+ done
+ done
+
+ if test "$ac_var_match_word" = "no"; then
+ ac_var_added_warnings="$ac_var_added_warnings -W$warning"
+ fi
+ done
+ tmp_CFLAGS="$tmp_CFLAGS $ac_var_added_warnings"
+ squeeze tmp_CFLAGS
+
+ fi
fi
;;
#
@@ -18760,6 +18790,28 @@ $as_echo "$as_me: WARNING: compiler options rejected: $tmp_options" >&2;}
fi
fi
fi
+ if test "$compiler_num" -ge "1000"; then
+
+ ac_var_added_warnings=""
+ for warning in enum-conversion; do
+
+ ac_var_match_word="no"
+ for word1 in $CFLAGS; do
+ for word2 in -Wno-$warning -W$warning; do
+ if test "$word1" = "$word2"; then
+ ac_var_match_word="yes"
+ fi
+ done
+ done
+
+ if test "$ac_var_match_word" = "no"; then
+ ac_var_added_warnings="$ac_var_added_warnings -W$warning"
+ fi
+ done
+ tmp_CFLAGS="$tmp_CFLAGS $ac_var_added_warnings"
+ squeeze tmp_CFLAGS
+
+ fi
;;
#
HP_UX_C)
@@ -20208,6 +20260,7 @@ $as_echo "#define CURL_DISABLE_PROXY 1" >>confdefs.h
CURL_DISABLE_PROXY=1
+ https_proxy="no"
;;
*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
@@ -20428,16 +20481,15 @@ if test "${enable_mqtt+set}" = set; then :
no)
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
- ;;
- *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
- experimental="$experimental MQTT"
-$as_echo "#define CURL_ENABLE_MQTT 1" >>confdefs.h
+$as_echo "#define CURL_DISABLE_MQTT 1" >>confdefs.h
- CURL_ENABLE_MQTT=1
+ CURL_DISABLE_MQTT=1
;;
+ *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ ;;
esac
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
@@ -26051,9 +26103,12 @@ if test "x$ac_cv_func_wolfSSL_DES_ecb_encrypt" = xyes; then :
$as_echo "#define HAVE_WOLFSSL_DES_ECB_ENCRYPT 1" >>confdefs.h
if test -n "$addcflags"; then
- CPPFLAGS="$addcflags/wolfssl $CPPFLAGS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: Add $addcflags/wolfssl to CPPFLAGS" >&5
-$as_echo "$as_me: Add $addcflags/wolfssl to CPPFLAGS" >&6;}
+ for f in $addcflags; do
+ CPPFLAGS="$f/wolfssl $CPPFLAGS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Add $f/wolfssl to CPPFLAGS" >&5
+$as_echo "$as_me: Add $f/wolfssl to CPPFLAGS" >&6;}
+ break
+ done
else
CPPFLAGS="-I$includedir/wolfssl $CPPFLAGS"
{ $as_echo "$as_me:${as_lineno-$LINENO}: Add $includedir/wolfssl to CPPFLAGS" >&5
@@ -28991,7 +29046,7 @@ case "$OPT_H2" in
;;
esac
-curl_h2_msg="disabled (--with-nghttp2)"
+curl_h2_msg="no (--with-nghttp2)"
if test X"$want_h2" != Xno; then
CLEANLDFLAGS="$LDFLAGS"
CLEANCPPFLAGS="$CPPFLAGS"
@@ -29233,7 +29288,7 @@ fi
OPT_TCP2="yes"
-curl_h3_msg="disabled (--with-ngtcp2, --with-quiche)"
+curl_h3_msg="no (--with-ngtcp2, --with-quiche)"
if test "x$disable_http" = "xyes"; then
# without HTTP, ngtcp2 is no use
@@ -29260,7 +29315,7 @@ case "$OPT_TCP2" in
;;
esac
-curl_tcp2_msg="disabled (--with-ngtcp2)"
+curl_tcp2_msg="no (--with-ngtcp2)"
if test X"$want_tcp2" != Xno; then
CLEANLDFLAGS="$LDFLAGS"
CLEANCPPFLAGS="$CPPFLAGS"
@@ -30016,7 +30071,7 @@ case "$OPT_NGHTTP3" in
;;
esac
-curl_http3_msg="disabled (--with-nghttp3)"
+curl_http3_msg="no (--with-nghttp3)"
if test X"$want_nghttp3" != Xno; then
CLEANLDFLAGS="$LDFLAGS"
CLEANCPPFLAGS="$CPPFLAGS"
@@ -44323,6 +44378,29 @@ $as_echo "yes" >&6; }
fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to support socketpair" >&5
+$as_echo_n "checking whether to support socketpair... " >&6; }
+# Check whether --enable-socketpair was given.
+if test "${enable_socketpair+set}" = set; then :
+ enableval=$enable_socketpair; case "$enableval" in
+ no)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+$as_echo "#define CURL_DISABLE_SOCKETPAIR 1" >>confdefs.h
+
+ ;;
+ *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ ;;
+ esac
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+fi
+
+
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to support HTTP authentication" >&5
$as_echo_n "checking whether to support HTTP authentication... " >&6; }
# Check whether --enable-http-auth was given.
@@ -44484,6 +44562,29 @@ $as_echo "yes" >&6; }
fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to support curl_easy_option*" >&5
+$as_echo_n "checking whether to support curl_easy_option*... " >&6; }
+# Check whether --enable-get-easy-option was given.
+if test "${enable_get_easy_option+set}" = set; then :
+ enableval=$enable_get_easy_option; case "$enableval" in
+ no)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+$as_echo "#define CURL_DISABLE_GETOPTIONS 1" >>confdefs.h
+
+ ;;
+ *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ ;;
+ esac
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+fi
+
+
curl_altsvc_msg="no (--enable-alt-svc)";
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to support alt-svc" >&5
$as_echo_n "checking whether to support alt-svc... " >&6; }
@@ -44514,38 +44615,38 @@ $as_echo "#define USE_ALTSVC 1" >>confdefs.h
experimental="$experimental alt-svc"
fi
-if test "x$want_esni" != "xno"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ESNI support is available" >&5
-$as_echo_n "checking whether ESNI support is available... " >&6; }
+if test "x$want_ech" != "xno"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ECH support is available" >&5
+$as_echo_n "checking whether ECH support is available... " >&6; }
- ESNI_ENABLED=0
- ESNI_SUPPORT=''
+ ECH_ENABLED=0
+ ECH_SUPPORT=''
if test "x$OPENSSL_ENABLED" = "x1"; then
- for ac_func in SSL_get_esni_status
+ for ac_func in SSL_get_ech_status
do :
- ac_fn_c_check_func "$LINENO" "SSL_get_esni_status" "ac_cv_func_SSL_get_esni_status"
-if test "x$ac_cv_func_SSL_get_esni_status" = xyes; then :
+ ac_fn_c_check_func "$LINENO" "SSL_get_ech_status" "ac_cv_func_SSL_get_ech_status"
+if test "x$ac_cv_func_SSL_get_ech_status" = xyes; then :
cat >>confdefs.h <<_ACEOF
-#define HAVE_SSL_GET_ESNI_STATUS 1
+#define HAVE_SSL_GET_ECH_STATUS 1
_ACEOF
- ESNI_SUPPORT="ESNI support available (OpenSSL with SSL_get_esni_status)"
- ESNI_ENABLED=1
+ ECH_SUPPORT="ECH support available (OpenSSL with SSL_get_ech_status)"
+ ECH_ENABLED=1
fi
done
fi
- if test "x$ESNI_ENABLED" = "x1"; then
+ if test "x$ECH_ENABLED" = "x1"; then
-$as_echo "#define USE_ESNI 1" >>confdefs.h
+$as_echo "#define USE_ECH 1" >>confdefs.h
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ESNI_SUPPORT" >&5
-$as_echo "$ESNI_SUPPORT" >&6; }
- experimental="$experimental ESNI"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ECH_SUPPORT" >&5
+$as_echo "$ECH_SUPPORT" >&6; }
+ experimental="$experimental ECH"
else
- as_fn_error $? "--enable-esni ignored: No ESNI support found" "$LINENO" 5
+ as_fn_error $? "--enable-ech ignored: No ECH support found" "$LINENO" 5
fi
fi
@@ -44696,13 +44797,15 @@ if test "x$CURL_WITH_MULTI_SSL" = "x1"; then
SUPPORT_FEATURES="$SUPPORT_FEATURES MultiSSL"
fi
-if test "x$OPENSSL_ENABLED" = "x1" -o "x$GNUTLS_ENABLED" = "x1" \
- -o "x$NSS_ENABLED" = "x1"; then
- SUPPORT_FEATURES="$SUPPORT_FEATURES HTTPS-proxy"
+if test "x$https_proxy" != "xno"; then
+ if test "x$OPENSSL_ENABLED" = "x1" -o "x$GNUTLS_ENABLED" = "x1" \
+ -o "x$NSS_ENABLED" = "x1"; then
+ SUPPORT_FEATURES="$SUPPORT_FEATURES HTTPS-proxy"
+ fi
fi
-if test "x$ESNI_ENABLED" = "x1"; then
- SUPPORT_FEATURES="$SUPPORT_FEATURES ESNI"
+if test "x$ECH_ENABLED" = "x1"; then
+ SUPPORT_FEATURES="$SUPPORT_FEATURES ECH"
fi
SUPPORT_FEATURES=`echo $SUPPORT_FEATURES | tr ' ' '\012' | sort | tr '\012' ' '`
@@ -44744,7 +44847,7 @@ fi
if test "x$CURL_DISABLE_GOPHER" != "x1"; then
SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS GOPHER"
fi
-if test "x$CURL_ENABLE_MQTT" = "x1"; then
+if test "x$CURL_DISABLE_MQTT" != "x1"; then
SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS MQTT"
fi
if test "x$CURL_DISABLE_POP3" != "x1"; then
@@ -44761,7 +44864,7 @@ if test "x$CURL_DISABLE_IMAP" != "x1"; then
fi
if test "x$CURL_DISABLE_SMB" != "x1" \
-a "x$CURL_DISABLE_CRYPTO_AUTH" != "x1" \
- -a \( "x$OPENSSL_ENABLED" = "x1" -o "x$USE_WINDOWS_SSPI" = "x1" \
+ -a \( "x$OPENSSL_ENABLED" = "x1" \
-o "x$GNUTLS_ENABLED" = "x1" -o "x$MBEDTLS_ENABLED" = "x1" \
-o "x$NSS_ENABLED" = "x1" -o "x$SECURETRANSPORT_ENABLED" = "x1" \
-o "x$WOLFSSL_NTLM" = "x1" \); then
@@ -47687,7 +47790,7 @@ done
Alt-svc: ${curl_altsvc_msg}
HTTP2: ${curl_h2_msg}
HTTP3: ${curl_h3_msg}
- ESNI: ${curl_esni_msg}
+ ECH: ${curl_ech_msg}
Protocols: ${SUPPORT_PROTOCOLS}
Features: ${SUPPORT_FEATURES}
" >&5
@@ -47731,7 +47834,7 @@ $as_echo "$as_me: Configured to build curl/libcurl:
Alt-svc: ${curl_altsvc_msg}
HTTP2: ${curl_h2_msg}
HTTP3: ${curl_h3_msg}
- ESNI: ${curl_esni_msg}
+ ECH: ${curl_ech_msg}
Protocols: ${SUPPORT_PROTOCOLS}
Features: ${SUPPORT_FEATURES}
" >&6;}
diff --git a/configure.ac b/configure.ac
index 9c738d12..2304775b 100755
--- a/configure.ac
+++ b/configure.ac
@@ -49,7 +49,7 @@ CURL_CHECK_OPTION_CURLDEBUG
CURL_CHECK_OPTION_SYMBOL_HIDING
CURL_CHECK_OPTION_ARES
CURL_CHECK_OPTION_RT
-CURL_CHECK_OPTION_ESNI
+CURL_CHECK_OPTION_ECH
XC_CHECK_PATH_SEPARATOR
@@ -503,6 +503,7 @@ AC_HELP_STRING([--disable-proxy],[Disable proxy support]),
AC_MSG_RESULT(no)
AC_DEFINE(CURL_DISABLE_PROXY, 1, [to disable proxies])
AC_SUBST(CURL_DISABLE_PROXY, [1])
+ https_proxy="no"
;;
*) AC_MSG_RESULT(yes)
;;
@@ -645,11 +646,10 @@ AC_HELP_STRING([--disable-mqtt],[Disable MQTT support]),
[ case "$enableval" in
no)
AC_MSG_RESULT(no)
+ AC_DEFINE(CURL_DISABLE_MQTT, 1, [to disable MQTT])
+ AC_SUBST(CURL_DISABLE_MQTT, [1])
;;
*) AC_MSG_RESULT(yes)
- experimental="$experimental MQTT"
- AC_DEFINE(CURL_ENABLE_MQTT, 1, [to enable MQTT])
- AC_SUBST(CURL_ENABLE_MQTT, [1])
;;
esac ],
AC_MSG_RESULT(no)
@@ -2474,8 +2474,12 @@ if test -z "$ssl_backends" -o "x$OPT_WOLFSSL" != xno; then
AC_DEFINE(HAVE_WOLFSSL_DES_ECB_ENCRYPT, 1,
[if you have wolfSSL_DES_ecb_encrypt])
if test -n "$addcflags"; then
- CPPFLAGS="$addcflags/wolfssl $CPPFLAGS"
- AC_MSG_NOTICE([Add $addcflags/wolfssl to CPPFLAGS])
+ dnl use a for loop to strip off whitespace
+ for f in $addcflags; do
+ CPPFLAGS="$f/wolfssl $CPPFLAGS"
+ AC_MSG_NOTICE([Add $f/wolfssl to CPPFLAGS])
+ break
+ done
else
dnl user didn't give a path, so guess/hope they installed wolfssl
dnl headers to system default location
@@ -3546,7 +3550,7 @@ case "$OPT_H2" in
;;
esac
-curl_h2_msg="disabled (--with-nghttp2)"
+curl_h2_msg="no (--with-nghttp2)"
if test X"$want_h2" != Xno; then
dnl backup the pre-nghttp2 variables
CLEANLDFLAGS="$LDFLAGS"
@@ -3605,7 +3609,7 @@ dnl Check for ngtcp2 (QUIC)
dnl **********************************************************************
OPT_TCP2="yes"
-curl_h3_msg="disabled (--with-ngtcp2, --with-quiche)"
+curl_h3_msg="no (--with-ngtcp2, --with-quiche)"
if test "x$disable_http" = "xyes"; then
# without HTTP, ngtcp2 is no use
@@ -3633,7 +3637,7 @@ case "$OPT_TCP2" in
;;
esac
-curl_tcp2_msg="disabled (--with-ngtcp2)"
+curl_tcp2_msg="no (--with-ngtcp2)"
if test X"$want_tcp2" != Xno; then
dnl backup the pre-ngtcp2 variables
CLEANLDFLAGS="$LDFLAGS"
@@ -3832,7 +3836,7 @@ case "$OPT_NGHTTP3" in
;;
esac
-curl_http3_msg="disabled (--with-nghttp3)"
+curl_http3_msg="no (--with-nghttp3)"
if test X"$want_nghttp3" != Xno; then
dnl backup the pre-nghttp3 variables
CLEANLDFLAGS="$LDFLAGS"
@@ -4683,6 +4687,24 @@ AC_HELP_STRING([--disable-cookies],[Disable cookies support]),
)
dnl ************************************************************
+dnl disable socketpair
+dnl
+AC_MSG_CHECKING([whether to support socketpair])
+AC_ARG_ENABLE(socketpair,
+AC_HELP_STRING([--enable-socketpair],[Enable socketpair support])
+AC_HELP_STRING([--disable-socketpair],[Disable socketpair support]),
+[ case "$enableval" in
+ no)
+ AC_MSG_RESULT(no)
+ AC_DEFINE(CURL_DISABLE_SOCKETPAIR, 1, [to disable socketpair support])
+ ;;
+ *) AC_MSG_RESULT(yes)
+ ;;
+ esac ],
+ AC_MSG_RESULT(yes)
+)
+
+dnl ************************************************************
dnl disable HTTP authentication support
dnl
AC_MSG_CHECKING([whether to support HTTP authentication])
@@ -4809,6 +4831,24 @@ AC_HELP_STRING([--disable-dnsshuffle],[Disable DNS shuffling]),
)
dnl ************************************************************
+dnl disable the curl_easy_options API
+dnl
+AC_MSG_CHECKING([whether to support curl_easy_option*])
+AC_ARG_ENABLE(get-easy-option,
+AC_HELP_STRING([--enable-get-easy-options],[Enable curl_easy_options])
+AC_HELP_STRING([--disable-get-easy-options],[Disable curl_easy_options]),
+[ case "$enableval" in
+ no)
+ AC_MSG_RESULT(no)
+ AC_DEFINE(CURL_DISABLE_GETOPTIONS, 1, [to disable curl_easy_options])
+ ;;
+ *) AC_MSG_RESULT(yes)
+ ;;
+ esac ],
+ AC_MSG_RESULT(yes)
+)
+
+dnl ************************************************************
dnl switch on/off alt-svc
dnl
curl_altsvc_msg="no (--enable-alt-svc)";
@@ -4834,32 +4874,32 @@ if test "$enable_altsvc" = "yes"; then
fi
dnl *************************************************************
-dnl check whether ESNI support, if desired, is actually available
+dnl check whether ECH support, if desired, is actually available
dnl
-if test "x$want_esni" != "xno"; then
- AC_MSG_CHECKING([whether ESNI support is available])
+if test "x$want_ech" != "xno"; then
+ AC_MSG_CHECKING([whether ECH support is available])
dnl assume NOT and look for sufficient condition
- ESNI_ENABLED=0
- ESNI_SUPPORT=''
+ ECH_ENABLED=0
+ ECH_SUPPORT=''
- dnl OpenSSL with a chosen ESNI function should be enough
+ dnl OpenSSL with a chosen ECH function should be enough
dnl so more exhaustive checking seems unnecessary for now
if test "x$OPENSSL_ENABLED" = "x1"; then
- AC_CHECK_FUNCS(SSL_get_esni_status,
- ESNI_SUPPORT="ESNI support available (OpenSSL with SSL_get_esni_status)"
- ESNI_ENABLED=1)
+ AC_CHECK_FUNCS(SSL_get_ech_status,
+ ECH_SUPPORT="ECH support available (OpenSSL with SSL_get_ech_status)"
+ ECH_ENABLED=1)
dnl add 'elif' chain here for additional implementations
fi
dnl now deal with whatever we found
- if test "x$ESNI_ENABLED" = "x1"; then
- AC_DEFINE(USE_ESNI, 1, [if ESNI support is available])
- AC_MSG_RESULT($ESNI_SUPPORT)
- experimental="$experimental ESNI"
+ if test "x$ECH_ENABLED" = "x1"; then
+ AC_DEFINE(USE_ECH, 1, [if ECH support is available])
+ AC_MSG_RESULT($ECH_SUPPORT)
+ experimental="$experimental ECH"
else
- AC_MSG_ERROR([--enable-esni ignored: No ESNI support found])
+ AC_MSG_ERROR([--enable-ech ignored: No ECH support found])
fi
fi
@@ -4990,13 +5030,16 @@ if test "x$CURL_WITH_MULTI_SSL" = "x1"; then
SUPPORT_FEATURES="$SUPPORT_FEATURES MultiSSL"
fi
-if test "x$OPENSSL_ENABLED" = "x1" -o "x$GNUTLS_ENABLED" = "x1" \
- -o "x$NSS_ENABLED" = "x1"; then
- SUPPORT_FEATURES="$SUPPORT_FEATURES HTTPS-proxy"
+dnl if not explictily turned off, HTTPS-proxy comes with some TLS backends
+if test "x$https_proxy" != "xno"; then
+ if test "x$OPENSSL_ENABLED" = "x1" -o "x$GNUTLS_ENABLED" = "x1" \
+ -o "x$NSS_ENABLED" = "x1"; then
+ SUPPORT_FEATURES="$SUPPORT_FEATURES HTTPS-proxy"
+ fi
fi
-if test "x$ESNI_ENABLED" = "x1"; then
- SUPPORT_FEATURES="$SUPPORT_FEATURES ESNI"
+if test "x$ECH_ENABLED" = "x1"; then
+ SUPPORT_FEATURES="$SUPPORT_FEATURES ECH"
fi
dnl replace spaces with newlines
@@ -5042,7 +5085,7 @@ fi
if test "x$CURL_DISABLE_GOPHER" != "x1"; then
SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS GOPHER"
fi
-if test "x$CURL_ENABLE_MQTT" = "x1"; then
+if test "x$CURL_DISABLE_MQTT" != "x1"; then
SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS MQTT"
fi
if test "x$CURL_DISABLE_POP3" != "x1"; then
@@ -5059,7 +5102,7 @@ if test "x$CURL_DISABLE_IMAP" != "x1"; then
fi
if test "x$CURL_DISABLE_SMB" != "x1" \
-a "x$CURL_DISABLE_CRYPTO_AUTH" != "x1" \
- -a \( "x$OPENSSL_ENABLED" = "x1" -o "x$USE_WINDOWS_SSPI" = "x1" \
+ -a \( "x$OPENSSL_ENABLED" = "x1" \
-o "x$GNUTLS_ENABLED" = "x1" -o "x$MBEDTLS_ENABLED" = "x1" \
-o "x$NSS_ENABLED" = "x1" -o "x$SECURETRANSPORT_ENABLED" = "x1" \
-o "x$WOLFSSL_NTLM" = "x1" \); then
@@ -5194,7 +5237,7 @@ AC_MSG_NOTICE([Configured to build curl/libcurl:
Alt-svc: ${curl_altsvc_msg}
HTTP2: ${curl_h2_msg}
HTTP3: ${curl_h3_msg}
- ESNI: ${curl_esni_msg}
+ ECH: ${curl_ech_msg}
Protocols: ${SUPPORT_PROTOCOLS}
Features: ${SUPPORT_FEATURES}
])
diff --git a/docs/BUGS b/docs/BUGS
deleted file mode 100644
index 480e0cae..00000000
--- a/docs/BUGS
+++ /dev/null
@@ -1,302 +0,0 @@
- _ _ ____ _
- ___| | | | _ \| |
- / __| | | | |_) | |
- | (__| |_| | _ <| |___
- \___|\___/|_| \_\_____|
-
-BUGS
-
- 1. Bugs
- 1.1 There are still bugs
- 1.2 Where to report
- 1.3 Security bugs
- 1.4 What to report
- 1.5 libcurl problems
- 1.6 Who will fix the problems
- 1.7 How to get a stack trace
- 1.8 Bugs in libcurl bindings
- 1.9 Bugs in old versions
-
- 2. Bug fixing procedure
- 2.1 What happens on first filing
- 2.2 First response
- 2.3 Not reproducible
- 2.4 Unresponsive
- 2.5 Lack of time/interest
- 2.6 KNOWN_BUGS
- 2.7 TODO
- 2.8 Closing off stalled bugs
-
-==============================================================================
-
-1.1 There are still bugs
-
- Curl and libcurl keep being developed. Adding features and changing code
- means that bugs will sneak in, no matter how hard we try not to.
-
- Of course there are lots of bugs left. And lots of misfeatures.
-
- To help us make curl the stable and solid product we want it to be, we need
- bug reports and bug fixes.
-
-1.2 Where to report
-
- If you can't fix a bug yourself and submit a fix for it, try to report an as
- detailed report as possible to a curl mailing list to allow one of us to
- have a go at a solution. You can optionally also post your bug/problem at
- curl's bug tracking system over at
-
- https://github.com/curl/curl/issues
-
- Please read the rest of this document below first before doing that!
-
- If you feel you need to ask around first, find a suitable mailing list and
- post there. The lists are available on https://curl.haxx.se/mail/
-
-1.3 Security bugs
-
- If you find a bug or problem in curl or libcurl that you think has a
- security impact, for example a bug that can put users in danger or make them
- vulnerable if the bug becomes public knowledge, then please report that bug
- using our security development process.
-
- Security related bugs or bugs that are suspected to have a security impact,
- should be reported on the curl security tracker at HackerOne:
-
- https://hackerone.com/curl
-
- This ensures that the report reaches the curl security team so that they
- first can be deal with the report away from the public to minimize the harm
- and impact it will have on existing users out there who might be using the
- vulnerable versions.
-
- The curl project's process for handling security related issues is
- documented here:
-
- https://curl.haxx.se/dev/secprocess.html
-
-1.4 What to report
-
- When reporting a bug, you should include all information that will help us
- understand what's wrong, what you expected to happen and how to repeat the
- bad behavior. You therefore need to tell us:
-
- - your operating system's name and version number
-
- - what version of curl you're using (curl -V is fine)
-
- - versions of the used libraries that libcurl is built to use
-
- - what URL you were working with (if possible), at least which protocol
-
- and anything and everything else you think matters. Tell us what you
- expected to happen, tell use what did happen, tell us how you could make it
- work another way. Dig around, try out, test. Then include all the tiny bits
- and pieces in your report. You will benefit from this yourself, as it will
- enable us to help you quicker and more accurately.
-
- Since curl deals with networks, it often helps us if you include a protocol
- debug dump with your bug report. The output you get by using the -v or
- --trace options.
-
- If curl crashed, causing a core dump (in unix), there is hardly any use to
- send that huge file to anyone of us. Unless we have an exact same system
- setup as you, we can't do much with it. Instead we ask you to get a stack
- trace and send that (much smaller) output to us instead!
-
- The address and how to subscribe to the mailing lists are detailed in the
- MANUAL file.
-
-1.5 libcurl problems
-
- When you've written your own application with libcurl to perform transfers,
- it is even more important to be specific and detailed when reporting bugs.
-
- Tell us the libcurl version and your operating system. Tell us the name and
- version of all relevant sub-components like for example the SSL library
- you're using and what name resolving your libcurl uses. If you use SFTP or
- SCP, the libssh2 version is relevant etc.
-
- Showing us a real source code example repeating your problem is the best way
- to get our attention and it will greatly increase our chances to understand
- your problem and to work on a fix (if we agree it truly is a problem).
-
- Lots of problems that appear to be libcurl problems are actually just abuses
- of the libcurl API or other malfunctions in your applications. It is advised
- that you run your problematic program using a memory debug tool like
- valgrind or similar before you post memory-related or "crashing" problems to
- us.
-
-1.6 Who will fix the problems
-
- If the problems or bugs you describe are considered to be bugs, we want to
- have the problems fixed.
-
- There are no developers in the curl project that are paid to work on bugs.
- All developers that take on reported bugs do this on a voluntary basis. We
- do it out of an ambition to keep curl and libcurl excellent products and out
- of pride.
-
- But please do not assume that you can just lump over something to us and it
- will then magically be fixed after some given time. Most often we need
- feedback and help to understand what you've experienced and how to repeat a
- problem. Then we may only be able to assist YOU to debug the problem and to
- track down the proper fix.
-
- We get reports from many people every month and each report can take a
- considerable amount of time to really go to the bottom with.
-
-1.7 How to get a stack trace
-
- First, you must make sure that you compile all sources with -g and that you
- don't 'strip' the final executable. Try to avoid optimizing the code as
- well, remove -O, -O2 etc from the compiler options.
-
- Run the program until it cores.
-
- Run your debugger on the core file, like '<debugger> curl core'. <debugger>
- should be replaced with the name of your debugger, in most cases that will
- be 'gdb', but 'dbx' and others also occur.
-
- When the debugger has finished loading the core file and presents you a
- prompt, enter 'where' (without the quotes) and press return.
-
- The list that is presented is the stack trace. If everything worked, it is
- supposed to contain the chain of functions that were called when curl
- crashed. Include the stack trace with your detailed bug report. It'll help a
- lot.
-
-1.8 Bugs in libcurl bindings
-
- There will of course pop up bugs in libcurl bindings. You should then
- primarily approach the team that works on that particular binding and see
- what you can do to help them fix the problem.
-
- If you suspect that the problem exists in the underlying libcurl, then
- please convert your program over to plain C and follow the steps outlined
- above.
-
-1.9 Bugs in old versions
-
- The curl project typically releases new versions every other month, and we
- fix several hundred bugs per year. For a huge table of releases, number of
- bug fixes and more, see: https://curl.haxx.se/docs/releases.html
-
- The developers in the curl project do not have bandwidth or energy enough to
- maintain several branches or to spend much time on hunting down problems in
- old versions when chances are we already fixed them or at least that they've
- changed nature and appearance in later versions.
-
- When you experience a problem and want to report it, you really SHOULD
- include the version number of the curl you're using when you experience the
- issue. If that version number shows us that you're using an out-of-date
- curl, you should also try out a modern curl version to see if the problem
- persists or how/if it has changed in appearance.
-
- Even if you cannot immediately upgrade your application/system to run the
- latest curl version, you can most often at least run a test version or
- experimental build or similar, to get this confirmed or not.
-
- At times people insist that they cannot upgrade to a modern curl version,
- but instead they "just want the bug fixed". That's fine, just don't count on
- us spending many cycles on trying to identify which single commit, if that's
- even possible, that at some point in the past fixed the problem you're now
- experiencing.
-
- Security wise, it is almost always a bad idea to lag behind the current curl
- versions by a lot. We keeping discovering and reporting security problems
- over time see you can see in this table:
- https://curl.haxx.se/docs/vulnerabilities.html
-
-2. Bug fixing procedure
-
-2.1 What happens on first filing
-
- When a new issue is posted in the issue tracker or on the mailing list, the
- team of developers first need to see the report. Maybe they took the day
- off, maybe they're off in the woods hunting. Have patience. Allow at least a
- few days before expecting someone to have responded.
-
- In the issue tracker you can expect that some labels will be set on the
- issue to help categorize it.
-
-2.2 First response
-
- If your issue/bug report wasn't perfect at once (and few are), chances are
- that someone will ask follow-up questions. Which version did you use? Which
- options did you use? How often does the problem occur? How can we reproduce
- this problem? Which protocols does it involve? Or perhaps much more specific
- and deep diving questions. It all depends on your specific issue.
-
- You should then respond to these follow-up questions and provide more info
- about the problem, so that we can help you figure it out. Or maybe you can
- help us figure it out. An active back-and-forth communication is important
- and the key for finding a cure and landing a fix.
-
-2.3 Not reproducible
-
- For problems that we can't reproduce and can't understand even after having
- gotten all the info we need and having studied the source code over again,
- are really hard to solve so then we may require further work from you who
- actually see or experience the problem.
-
-2.4 Unresponsive
-
- If the problem haven't been understood or reproduced, and there's nobody
- responding to follow-up questions or questions asking for clarifications or
- for discussing possible ways to move forward with the task, we take that as
- a strong suggestion that the bug is not important.
-
- Unimportant issues will be closed as inactive sooner or later as they can't
- be fixed. The inactivity period (waiting for responses) should not be
- shorter than two weeks but may extend months.
-
-2.5 Lack of time/interest
-
- Bugs that are filed and are understood can unfortunately end up in the
- "nobody cares enough about it to work on it" category. Such bugs are
- perfectly valid problems that *should* get fixed but apparently aren't. We
- try to mark such bugs as "KNOWN_BUGS material" after a time of inactivity
- and if no activity is noticed after yet some time those bugs are added to
- KNOWN_BUGS and are closed in the issue tracker.
-
-2.6 KNOWN_BUGS
-
- This is a list of known bugs. Bugs we know exist and that have been pointed
- out but that haven't yet been fixed. The reasons for why they haven't been
- fixed can involve anything really, but the primary reason is that nobody has
- considered these problems to be important enough to spend the necessary time
- and effort to have them fixed.
-
- The KNOWN_BUGS are always up for grabs and we will always love the ones who
- bring one of them back to live and offers solutions to them.
-
- The KNOWN_BUGS document has a sibling document known as TODO.
-
-2.7 TODO
-
- Issues that are filed or reported that aren't really bugs but more missing
- features or ideas for future improvements and so on are marked as
- 'enhancement' or 'feature-request' and will be added to the TODO document
- instead and the issue is closed. We don't keep TODO items in the issue
- tracker.
-
- The TODO document is full of ideas and suggestions of what we can add or fix
- one day. You're always encouraged and free to grab one of those items and
- take up a discussion with the curl development team on how that could be
- implemented or provided in the project so that you can work on ticking it
- odd that document.
-
- If the issue is rather a bug and not a missing feature or functionality, it
- is listed in KNOWN_BUGS instead.
-
-2.8 Closing off stalled bugs
-
- The issue and pull request trackers on https://github.com/curl/curl will
- only hold "active" entries (using a non-precise definition of what active
- actually is, but they're at least not completely dead). Those that are
- abandoned or in other ways dormant will be closed and sometimes added to
- TODO and KNOWN_BUGS instead.
-
- This way, we only have "active" issues open on github. Irrelevant issues and
- pull requests will not distract developers or casual visitors.
diff --git a/docs/BUGS.md b/docs/BUGS.md
new file mode 100644
index 00000000..cc09a5d1
--- /dev/null
+++ b/docs/BUGS.md
@@ -0,0 +1,266 @@
+# BUGS
+
+## There are still bugs
+
+ Curl and libcurl keep being developed. Adding features and changing code
+ means that bugs will sneak in, no matter how hard we try not to.
+
+ Of course there are lots of bugs left. And lots of misfeatures.
+
+ To help us make curl the stable and solid product we want it to be, we need
+ bug reports and bug fixes.
+
+## Where to report
+
+ If you can't fix a bug yourself and submit a fix for it, try to report an as
+ detailed report as possible to a curl mailing list to allow one of us to have
+ a go at a solution. You can optionally also submit your problem in [curl's
+ bug tracking system](https://github.com/curl/curl/issues).
+
+ Please read the rest of this document below first before doing that!
+
+ If you feel you need to ask around first, find a suitable [mailing list](
+ https://curl.haxx.se/mail/) and post your questions there.
+
+## Security bugs
+
+ If you find a bug or problem in curl or libcurl that you think has a security
+ impact, for example a bug that can put users in danger or make them
+ vulnerable if the bug becomes public knowledge, then please report that bug
+ using our security development process.
+
+ Security related bugs or bugs that are suspected to have a security impact,
+ should be reported on the [curl security tracker at
+ HackerOne](https://hackerone.com/curl).
+
+ This ensures that the report reaches the curl security team so that they
+ first can be deal with the report away from the public to minimize the harm
+ and impact it will have on existing users out there who might be using the
+ vulnerable versions.
+
+ The curl project's process for handling security related issues is
+ [documented separately](https://curl.haxx.se/dev/secprocess.html).
+
+## What to report
+
+ When reporting a bug, you should include all information that will help us
+ understand what's wrong, what you expected to happen and how to repeat the
+ bad behavior. You therefore need to tell us:
+
+ - your operating system's name and version number
+
+ - what version of curl you're using (`curl -V` is fine)
+
+ - versions of the used libraries that libcurl is built to use
+
+ - what URL you were working with (if possible), at least which protocol
+
+ and anything and everything else you think matters. Tell us what you expected
+ to happen, tell use what did happen, tell us how you could make it work
+ another way. Dig around, try out, test. Then include all the tiny bits and
+ pieces in your report. You will benefit from this yourself, as it will enable
+ us to help you quicker and more accurately.
+
+ Since curl deals with networks, it often helps us if you include a protocol
+ debug dump with your bug report. The output you get by using the `-v` or
+ `--trace` options.
+
+ If curl crashed, causing a core dump (in unix), there is hardly any use to
+ send that huge file to anyone of us. Unless we have an exact same system
+ setup as you, we can't do much with it. Instead we ask you to get a stack
+ trace and send that (much smaller) output to us instead!
+
+ The address and how to subscribe to the mailing lists are detailed in the
+ `MANUAL.md` file.
+
+## libcurl problems
+
+ When you've written your own application with libcurl to perform transfers,
+ it is even more important to be specific and detailed when reporting bugs.
+
+ Tell us the libcurl version and your operating system. Tell us the name and
+ version of all relevant sub-components like for example the SSL library
+ you're using and what name resolving your libcurl uses. If you use SFTP or
+ SCP, the libssh2 version is relevant etc.
+
+ Showing us a real source code example repeating your problem is the best way
+ to get our attention and it will greatly increase our chances to understand
+ your problem and to work on a fix (if we agree it truly is a problem).
+
+ Lots of problems that appear to be libcurl problems are actually just abuses
+ of the libcurl API or other malfunctions in your applications. It is advised
+ that you run your problematic program using a memory debug tool like valgrind
+ or similar before you post memory-related or "crashing" problems to us.
+
+## Who will fix the problems
+
+ If the problems or bugs you describe are considered to be bugs, we want to
+ have the problems fixed.
+
+ There are no developers in the curl project that are paid to work on bugs.
+ All developers that take on reported bugs do this on a voluntary basis. We do
+ it out of an ambition to keep curl and libcurl excellent products and out of
+ pride.
+
+ But please do not assume that you can just lump over something to us and it
+ will then magically be fixed after some given time. Most often we need
+ feedback and help to understand what you've experienced and how to repeat a
+ problem. Then we may only be able to assist YOU to debug the problem and to
+ track down the proper fix.
+
+ We get reports from many people every month and each report can take a
+ considerable amount of time to really go to the bottom with.
+
+## How to get a stack trace
+
+ First, you must make sure that you compile all sources with `-g` and that you
+ don't 'strip' the final executable. Try to avoid optimizing the code as well,
+ remove `-O`, `-O2` etc from the compiler options.
+
+ Run the program until it cores.
+
+ Run your debugger on the core file, like `<debugger> curl
+ core`. `<debugger>` should be replaced with the name of your debugger, in
+ most cases that will be `gdb`, but `dbx` and others also occur.
+
+ When the debugger has finished loading the core file and presents you a
+ prompt, enter `where` (without quotes) and press return.
+
+ The list that is presented is the stack trace. If everything worked, it is
+ supposed to contain the chain of functions that were called when curl
+ crashed. Include the stack trace with your detailed bug report. It'll help a
+ lot.
+
+## Bugs in libcurl bindings
+
+ There will of course pop up bugs in libcurl bindings. You should then
+ primarily approach the team that works on that particular binding and see
+ what you can do to help them fix the problem.
+
+ If you suspect that the problem exists in the underlying libcurl, then please
+ convert your program over to plain C and follow the steps outlined above.
+
+## Bugs in old versions
+
+ The curl project typically releases new versions every other month, and we
+ fix several hundred bugs per year. For a huge table of releases, number of
+ bug fixes and more, see: https://curl.haxx.se/docs/releases.html
+
+ The developers in the curl project do not have bandwidth or energy enough to
+ maintain several branches or to spend much time on hunting down problems in
+ old versions when chances are we already fixed them or at least that they've
+ changed nature and appearance in later versions.
+
+ When you experience a problem and want to report it, you really SHOULD
+ include the version number of the curl you're using when you experience the
+ issue. If that version number shows us that you're using an out-of-date curl,
+ you should also try out a modern curl version to see if the problem persists
+ or how/if it has changed in appearance.
+
+ Even if you cannot immediately upgrade your application/system to run the
+ latest curl version, you can most often at least run a test version or
+ experimental build or similar, to get this confirmed or not.
+
+ At times people insist that they cannot upgrade to a modern curl version, but
+ instead they "just want the bug fixed". That's fine, just don't count on us
+ spending many cycles on trying to identify which single commit, if that's
+ even possible, that at some point in the past fixed the problem you're now
+ experiencing.
+
+ Security wise, it is almost always a bad idea to lag behind the current curl
+ versions by a lot. We keeping discovering and reporting security problems
+ over time see you can see in [this
+ table](https://curl.haxx.se/docs/vulnerabilities.html)
+
+# Bug fixing procedure
+
+## What happens on first filing
+
+ When a new issue is posted in the issue tracker or on the mailing list, the
+ team of developers first need to see the report. Maybe they took the day off,
+ maybe they're off in the woods hunting. Have patience. Allow at least a few
+ days before expecting someone to have responded.
+
+ In the issue tracker you can expect that some labels will be set on the issue
+ to help categorize it.
+
+## First response
+
+ If your issue/bug report wasn't perfect at once (and few are), chances are
+ that someone will ask follow-up questions. Which version did you use? Which
+ options did you use? How often does the problem occur? How can we reproduce
+ this problem? Which protocols does it involve? Or perhaps much more specific
+ and deep diving questions. It all depends on your specific issue.
+
+ You should then respond to these follow-up questions and provide more info
+ about the problem, so that we can help you figure it out. Or maybe you can
+ help us figure it out. An active back-and-forth communication is important
+ and the key for finding a cure and landing a fix.
+
+## Not reproducible
+
+ For problems that we can't reproduce and can't understand even after having
+ gotten all the info we need and having studied the source code over again,
+ are really hard to solve so then we may require further work from you who
+ actually see or experience the problem.
+
+## Unresponsive
+
+ If the problem haven't been understood or reproduced, and there's nobody
+ responding to follow-up questions or questions asking for clarifications or
+ for discussing possible ways to move forward with the task, we take that as a
+ strong suggestion that the bug is not important.
+
+ Unimportant issues will be closed as inactive sooner or later as they can't
+ be fixed. The inactivity period (waiting for responses) should not be shorter
+ than two weeks but may extend months.
+
+## Lack of time/interest
+
+ Bugs that are filed and are understood can unfortunately end up in the
+ "nobody cares enough about it to work on it" category. Such bugs are
+ perfectly valid problems that *should* get fixed but apparently aren't. We
+ try to mark such bugs as `KNOWN_BUGS material` after a time of inactivity and
+ if no activity is noticed after yet some time those bugs are added to
+ `KNOWN_BUGS` and are closed in the issue tracker.
+
+## `KNOWN_BUGS`
+
+ This is a list of known bugs. Bugs we know exist and that have been pointed
+ out but that haven't yet been fixed. The reasons for why they haven't been
+ fixed can involve anything really, but the primary reason is that nobody has
+ considered these problems to be important enough to spend the necessary time
+ and effort to have them fixed.
+
+ The `KNOWN_BUGS` are always up for grabs and we will always love the ones who
+ bring one of them back to live and offers solutions to them.
+
+ The `KNOWN_BUGS` document has a sibling document known as `TODO`.
+
+## `TODO`
+
+ Issues that are filed or reported that aren't really bugs but more missing
+ features or ideas for future improvements and so on are marked as
+ 'enhancement' or 'feature-request' and will be added to the `TODO` document
+ instead and the issue is closed. We don't keep TODO items in the issue
+ tracker.
+
+ The `TODO` document is full of ideas and suggestions of what we can add or
+ fix one day. You're always encouraged and free to grab one of those items and
+ take up a discussion with the curl development team on how that could be
+ implemented or provided in the project so that you can work on ticking it odd
+ that document.
+
+ If the issue is rather a bug and not a missing feature or functionality, it
+ is listed in `KNOWN_BUGS` instead.
+
+## Closing off stalled bugs
+
+ The [issue and pull request trackers](https://github.com/curl/curl) only
+ holds "active" entries open (using a non-precise definition of what active
+ actually is, but they're at least not completely dead). Those that are
+ abandoned or in other ways dormant will be closed and sometimes added to
+ `TODO` and `KNOWN_BUGS` instead.
+
+ This way, we only have "active" issues open on github. Irrelevant issues and
+ pull requests will not distract developers or casual visitors.
diff --git a/docs/CHECKSRC.md b/docs/CHECKSRC.md
index 96150922..d36763bc 100644
--- a/docs/CHECKSRC.md
+++ b/docs/CHECKSRC.md
@@ -70,6 +70,8 @@ warnings are:
- `NOSPACEEQUALS`: An equals sign was found without preceding space. We prefer
`a = 2` and *not* `a=2`.
+- `ONELINECONDITION`: do not put the conditional block on the same line as `if()`
+
- `OPENCOMMENT`: File ended with a comment (`/*`) still "open".
- `PARENBRACE`: `){` was used without sufficient space in between.
@@ -98,7 +100,9 @@ warnings are:
- `TABS`: TAB characters are not allowed!
-- `TRAILINGSPACE`: Trailing white space on the line
+- `TRAILINGSPACE`: Trailing whitespace on the line
+
+- `TYPEDEFSTRUCT`: we frown upon (most) typedefed structs
- `UNUSEDIGNORE`: a checksrc inlined warning ignore was asked for but not used,
that's an ignore that should be removed or changed to get used.
diff --git a/docs/CONTRIBUTE.md b/docs/CONTRIBUTE.md
index 3d4bf49e..69ddfbee 100644
--- a/docs/CONTRIBUTE.md
+++ b/docs/CONTRIBUTE.md
@@ -172,6 +172,33 @@ you are expected to fix the problem. If you don't understand when the issue is
or have other problems to fix the complaint, just ask and other project
members will likely be able to help out.
+Consider the following table while looking at pull request failures:
+
+ | CI platform as shown in PR | State | What to look at next |
+ | ----------------------------------- | ------ | -------------------------- |
+ | CI / codeql | stable | quality check results |
+ | CI / fuzzing | stable | fuzzing results |
+ | CI / macos ... | stable | all errors and failures |
+ | Code scanning results / CodeQL | stable | quality check results |
+ | FreeBSD FreeBSD: ... | stable | all errors and failures |
+ | LGTM analysis: Python | stable | new findings |
+ | LGTM analysis: C/C++ | stable | new findings |
+ | buildbot/curl_winssl_ ... | stable | all errors and failures |
+ | continuous-integration/appveyor/pr | stable | all errors and failures |
+ | continuous-integration/travis-ci/pr | stable | all errors and failures |
+ | curl.curl (linux ...) | stable | all errors and failures |
+ | curl.curl (windows ...) | flaky | repetitive errors/failures |
+ | deepcode-ci-bot | stable | new findings |
+ | musedev | stable | new findings |
+
+Sometimes the tests fail due to a dependency service temporarily being offline
+or otherwise unavailable, eg. package downloads. In this case you can just
+try to update your pull requests to rerun the tests later as described below.
+
+You can update your pull requests by pushing new commits or force-pushing
+changes to existing commits. Force-pushing an amended commit without any
+actual content changed also allows you to retrigger the tests for that commit.
+
When you adjust your pull requests after review, consider squashing the
commits so that we can review the full updated version more easily.
diff --git a/docs/CURL-DISABLE.md b/docs/CURL-DISABLE.md
index 83436b47..a9e6acaf 100644
--- a/docs/CURL-DISABLE.md
+++ b/docs/CURL-DISABLE.md
@@ -24,6 +24,11 @@ Disable the FILE protocol
Disable the FTP (and FTPS) protocol
+## CURL_DISABLE_GETOPTIONS
+
+Disable the `curl_easy_options` API calls that lets users get information
+about existing options to `curl_easy_setopt`.
+
## CURL_DISABLE_GOPHER
Disable the GOPHER protocol.
@@ -57,6 +62,10 @@ Disable the --libcurl option from the curl tool.
Disable MIME support.
+## CURL_DISABLE_MQTT
+
+Disable MQTT support.
+
## CURL_DISABLE_NETRC
Disable the netrc parser.
@@ -97,6 +106,11 @@ Disable the SMB(S) protocols
Disable the SMTP(S) protocols
+## CURL_DISABLE_SOCKETPAIR
+
+Disable the use of socketpair internally to allow waking up and canceling
+curl_multi_poll().
+
## CURL_DISABLE_TELNET
Disable the TELNET protocol
diff --git a/docs/DYNBUF.md b/docs/DYNBUF.md
index 382c1365..aa528ec3 100644
--- a/docs/DYNBUF.md
+++ b/docs/DYNBUF.md
@@ -42,6 +42,12 @@ Append a C string to the end of the buffer.
Append a `printf()`-style string to the end of the buffer.
+## vaddf
+
+ CURLcode Curl_dyn_vaddf(struct dynbuf *s, const char *fmt, va_list ap);
+
+Append a `vprintf()`-style string to the end of the buffer.
+
## reset
void Curl_dyn_reset(struct dynbuf *s);
diff --git a/docs/ESNI.md b/docs/ECH.md
index 7feaa75a..ea1efaa6 100644
--- a/docs/ESNI.md
+++ b/docs/ECH.md
@@ -1,24 +1,23 @@
-# TLS: ESNI support in curl and libcurl
+# TLS: ECH support in curl and libcurl
## Summary
-**ESNI** means **Encrypted Server Name Indication**, a TLS 1.3
-extension which is currently the subject of an
-[IETF Draft][tlsesni].
+**ECH** means **Encrypted Client Hello**, a TLS 1.3 extension which is
+currently the subject of an [IETF Draft][tlsesni]. (ECH was formerly known as
+ESNI).
-This file is intended to show the latest current state of ESNI support
+This file is intended to show the latest current state of ECH support
in **curl** and **libcurl**.
-At end of August 2019, an [experimental fork of curl][niallorcurl],
-built using an [experimental fork of OpenSSL][sftcdopenssl], which in
-turn provided an implementation of ESNI, was demonstrated
-interoperating with a server belonging to the [DEfO
-Project][defoproj].
+At end of August 2019, an [experimental fork of curl][niallorcurl], built
+using an [experimental fork of OpenSSL][sftcdopenssl], which in turn provided
+an implementation of ECH, was demonstrated interoperating with a server
+belonging to the [DEfO Project][defoproj].
Further sections here describe
- resources needed for building and demonstrating **curl** support
- for ESNI,
+ for ECH,
- progress to date,
@@ -28,18 +27,18 @@ Further sections here describe
## Resources needed
-To build and demonstrate ESNI support in **curl** and/or **libcurl**,
+To build and demonstrate ECH support in **curl** and/or **libcurl**,
you will need
-- a TLS library, supported by **libcurl**, which implements ESNI;
+- a TLS library, supported by **libcurl**, which implements ECH;
-- an edition of **curl** and/or **libcurl** which supports the ESNI
+- an edition of **curl** and/or **libcurl** which supports the ECH
implementation of the chosen TLS library;
- an environment for building and running **curl**, and at least
building **OpenSSL**;
-- a server, supporting ESNI, against which to run a demonstration
+- a server, supporting ECH, against which to run a demonstration
and perhaps a specific target URL;
- some instructions.
@@ -58,52 +57,49 @@ The following set of resources is currently known to be available.
- Details [below](#pr4011);
-- New **curl** feature: `CURL_VERSION_ESNI`;
+- New configuration option: `--enable-ech`;
-- New configuration option: `--enable-esni`;
-
-- Build-time check for availability of resources needed for ESNI
+- Build-time check for availability of resources needed for ECH
support;
-- Pre-processor symbol `USE_ESNI` for conditional compilation of
- ESNI support code, subject to configuration option and
+- Pre-processor symbol `USE_ECH` for conditional compilation of
+ ECH support code, subject to configuration option and
availability of needed resources.
## TODO
-- (next PR) Add libcurl options to set ESNI parameters.
+- (next PR) Add libcurl options to set ECH parameters.
-- (next PR) Add curl tool command line options to set ESNI parameters.
+- (next PR) Add curl tool command line options to set ECH parameters.
-- (WIP) Extend DoH functions so that published ESNI parameters can be
+- (WIP) Extend DoH functions so that published ECH parameters can be
retrieved from DNS instead of being required as options.
-- (WIP) Work with OpenSSL community to finalize ESNI API.
+- (WIP) Work with OpenSSL community to finalize ECH API.
-- Track OpenSSL ESNI API in libcurl
+- Track OpenSSL ECH API in libcurl
- Identify and implement any changes needed for CMake.
- Optimize build-time checking of available resources.
-- Encourage ESNI support work on other TLS/SSL backends.
+- Encourage ECH support work on other TLS/SSL backends.
## Additional detail
### PR 4011
-**TLS: Provide ESNI support framework for curl and libcurl**
+**TLS: Provide ECH support framework for curl and libcurl**
-The proposed change provides a framework to facilitate work to
-implement ESNI support in curl and libcurl. It is not intended
-either to provide ESNI functionality or to favour any particular
-TLS-providing backend. Specifically, the change reserves a
-feature bit for ESNI support (symbol `CURL_VERSION_ESNI`),
-implements setting and reporting of this bit, includes dummy
-book-keeping for the symbol, adds a build-time configuration
-option (`--enable-esni`), provides an extensible check for
-resources available to provide ESNI support, and defines a
-compiler pre-processor symbol (`USE_ESNI`) accordingly.
+The proposed change provides a framework to facilitate work to implement ECH
+support in curl and libcurl. It is not intended either to provide ECH
+functionality or to favour any particular TLS-providing backend. Specifically,
+the change reserves a feature bit for ECH support (symbol
+`CURL_VERSION_ECH`), implements setting and reporting of this bit, includes
+dummy book-keeping for the symbol, adds a build-time configuration option
+(`--enable-ech`), provides an extensible check for resources available to
+provide ECH support, and defines a compiler pre-processor symbol (`USE_ECH`)
+accordingly.
Proposed-by: @niallor (Niall O'Reilly)\
Encouraged-by: @sftcd (Stephen Farrell)\
@@ -117,7 +113,7 @@ Limitations:
- Check for available resources, although extensible, refers only to
specific work in progress ([described
here](https://github.com/sftcd/openssl/tree/master/esnistuff)) to
- implement ESNI for OpenSSL, as this is the immediate motivation
+ implement ECH for OpenSSL, as this is the immediate motivation
for the proposed change.
## References
diff --git a/docs/EXPERIMENTAL.md b/docs/EXPERIMENTAL.md
index bca2bd91..6a014c3d 100644
--- a/docs/EXPERIMENTAL.md
+++ b/docs/EXPERIMENTAL.md
@@ -20,5 +20,4 @@ Experimental support in curl means:
- HTTP/3 support and options
- alt-svc support and options
- - MQTT
- CURLSSLOPT_NATIVE_CA (No configure option, feature built in when supported)
diff --git a/docs/FAQ b/docs/FAQ
index 5679352b..b5efb119 100644
--- a/docs/FAQ
+++ b/docs/FAQ
@@ -247,21 +247,22 @@ FAQ
1.6 What do you get for making curl?
- Project cURL is entirely free and open. No person gets paid for developing
- curl full time. We do this voluntarily, mostly in our spare time.
- Occasionally companies pay individual developers to work on curl, but that's
- up to each company and developer. This is not controlled by nor supervised in
- any way by the project.
-
- We still get help from companies. Haxx provides website, bandwidth, mailing
- lists etc, GitHub hosts the primary git repository and other services like
- the bug tracker at https://github.com/curl/curl. Also again, some companies
- have sponsored certain parts of the development in the past and I hope some
- will continue to do so in the future.
+ Project cURL is entirely free and open. We do this voluntarily, mostly in
+ our spare time. Companies may pay individual developers to work on curl,
+ but that's up to each company and developer. This is not controlled by nor
+ supervised in any way by the curl project.
+
+ We get help from companies. Haxx provides website, bandwidth, mailing lists
+ etc, GitHub hosts the primary git repository and other services like the bug
+ tracker at https://github.com/curl/curl. Also again, some companies have
+ sponsored certain parts of the development in the past and I hope some will
+ continue to do so in the future.
If you want to support our project, consider a donation or a banner-program
or even better: by helping us with coding, documenting or testing etc.
+ See also: https://curl.haxx.se/sponsors.html
+
1.7 What about CURL from curl.com?
During the summer of 2001, curl.com was busy advertising their client-side
@@ -317,21 +318,14 @@ FAQ
We don't know how many users that downloaded or installed curl and then
never use it.
- In May 2012 Daniel did a counting game and came up with a number that may
- be completely wrong or somewhat accurate. Over 500 million!
-
- See https://daniel.haxx.se/blog/2012/05/16/300m-users/
+ In 2020, we estimate that curl runs in rougly ten billion installations
+ world wide.
1.11 Why don't you update ca-bundle.crt
- The ca cert bundle that used to be shipped with curl was very outdated and
- must be replaced with an up-to-date version by anyone who wants to verify
- peers. It is no longer provided by curl. The last curl release that ever
- shipped a ca cert bundle was curl 7.18.0.
-
In the cURL project we've decided not to attempt to keep this file updated
- (or even present anymore) since deciding what to add to a ca cert bundle is
- an undertaking we've not been ready to accept, and the one we can get from
+ (or even present) since deciding what to add to a ca cert bundle is an
+ undertaking we've not been ready to accept, and the one we can get from
Mozilla is perfectly fine so there's no need to duplicate that work.
Today, with many services performed over HTTPS, every operating system
@@ -374,16 +368,13 @@ FAQ
1.14 How do I submit my patch?
- When you have made a patch or a change of whatever sort, and want to submit
- that to the project, there are a few different ways we prefer:
-
- o send a patch to the curl-library mailing list. We're many subscribers
- there and there are lots of people who can review patches, comment on them
- and "receive" them properly.
+ We strongly encourage you to submit changes and improvements directly as
+ "pull requests" on github: https://github.com/curl/curl/pulls
- o if your patch changes or fixes a bug, you can also opt to submit a bug
- report in the bug tracker and attach your patch there. There are less
- people involved there.
+ If you for any reason can't or won't deal with github, send your patch to
+ the curl-library mailing list. We're many subscribers there and there are
+ lots of people who can review patches, comment on them and "receive" them
+ properly.
Lots of more details are found in the CONTRIBUTE and INTERNALS docs.
diff --git a/docs/HISTORY.md b/docs/HISTORY.md
index 4c0499f7..c5ed1384 100644
--- a/docs/HISTORY.md
+++ b/docs/HISTORY.md
@@ -7,9 +7,12 @@ currency-exchange calculations available to Internet Relay Chat (IRC)
users. All the necessary data were published on the Web; he just needed to
automate their retrieval.
-Daniel simply adopted an existing command-line open-source tool, httpget, that
-Brazilian Rafael Sagula had written and recently released version 0.1 of. After
-a few minor adjustments, it did just what he needed.
+1996
+----
+
+Daniel adopted an existing command-line open-source tool, httpget, that
+Brazilian Rafael Sagula had written and recently released version 0.1
+of. After a few minor adjustments, it did just what he needed.
1997
----
@@ -126,9 +129,11 @@ impossible. Around 5000 downloaded packages each week from the main site gives
a hint, but the packages are mirrored extensively, bundled with numerous OS
distributions and otherwise retrieved as part of other software.
-September: with the release of curl 7.10 it is released under the MIT license
+October 1: with the release of curl 7.10 it is released under the MIT license
only.
+Starting with 7.10, curl verifies SSL server certificates by default.
+
2003
----
@@ -322,6 +327,8 @@ April: added the cyassl backend (later renamed to WolfSSL)
October: SSLKEYLOGFILE support, new MIME API
+ October: Daniel received the Polhem Prize for his work on curl
+
November: brotli
2018
@@ -351,9 +358,27 @@ April: added the cyassl backend (later renamed to WolfSSL)
Public functions in libcurl: 80
Contributors: 1808
+ December: removed axTLS support
+
2019
----
+ March: added experimental alt-svc support
+
August: the first HTTP/3 requests with curl.
September: 7.66.0 is released and the tool offers parallel downloads
+
+2020
+----
+
+ curl and libcurl are installed in an estimated 10 *billion* instances
+ world-wide.
+
+ January: added BearSSL support
+
+ March: removed support for PolarSSL, added wolfSSH support
+
+ April: experimental MQTT support
+
+ August: zstd support
diff --git a/docs/HTTP3.md b/docs/HTTP3.md
index 44381ae1..fa9d2443 100644
--- a/docs/HTTP3.md
+++ b/docs/HTTP3.md
@@ -33,7 +33,7 @@ in the master branch using pull-requests, just like ordinary changes.
Build (patched) OpenSSL
- % git clone --depth 1 -b OpenSSL_1_1_1d-quic-draft-27 https://github.com/tatsuhiro-t/openssl
+ % git clone --depth 1 -b OpenSSL_1_1_1g-quic-draft-29 https://github.com/tatsuhiro-t/openssl
% cd openssl
% ./config enable-tls1_3 --prefix=<somewhere1>
% make
diff --git a/docs/INTERNALS.md b/docs/INTERNALS.md
index 635e7b2d..e9be0889 100644
--- a/docs/INTERNALS.md
+++ b/docs/INTERNALS.md
@@ -97,6 +97,7 @@ Dependencies
- NSS 3.14.x
- Heimdal ?
- nghttp2 1.12.0
+ - WinSock 2.2 (on Windows 95+ and Windows CE .NET 4.1+)
Operating Systems
-----------------
@@ -146,6 +147,8 @@ Windows vs Unix
also do it etc there might be reasons for applications to alter that
behaviour.
+ We require WinSock version 2.2 and load this version during global init.
+
3. The file descriptors for network communication and file operations are
not as easily interchangeable as in Unix.
@@ -323,9 +326,9 @@ FTP
Kerberos
========
- Kerberos support is mainly in `lib/krb5.c` and `lib/security.c` but also
- `curl_sasl_sspi.c` and `curl_sasl_gssapi.c` for the email protocols and
- `socks_gssapi.c` and `socks_sspi.c` for SOCKS5 proxy specifics.
+ Kerberos support is mainly in `lib/krb5.c` but also `curl_sasl_sspi.c` and
+ `curl_sasl_gssapi.c` for the email protocols and `socks_gssapi.c` and
+ `socks_sspi.c` for SOCKS5 proxy specifics.
<a name="telnet"></a>
TELNET
@@ -500,7 +503,7 @@ Client
status and exits.
When the operation is done, the `ourWriteOut()` function in `src/writeout.c`
- may be called to report about the operation. That function is using the
+ may be called to report about the operation. That function is mostly using the
`curl_easy_getinfo()` function to extract useful information from the curl
session.
diff --git a/docs/KNOWN_BUGS b/docs/KNOWN_BUGS
index e35172da..1aa025fd 100644
--- a/docs/KNOWN_BUGS
+++ b/docs/KNOWN_BUGS
@@ -25,6 +25,7 @@ problems may have been fixed or changed somewhat since this was written!
2. TLS
2.1 CURLINFO_SSL_VERIFYRESULT has limited support
2.2 DER in keychain
+ 2.3 Unable to use PKCS12 certificate with Secure Transport
2.4 Secure Transport won't import PKCS#12 client certificates without a password
2.5 Client cert handling with Issuer DN differs between backends
2.6 CURL_GLOBAL_SSL
@@ -104,6 +105,7 @@ problems may have been fixed or changed somewhat since this was written!
11.9 DoH doesn't inherit all transfer options
11.10 Blocking socket operations in non-blocking API
11.11 A shared connection cache is not thread-safe
+ 11.12 'no_proxy' string-matches IPv6 numerical addreses
12. LDAP and OpenLDAP
12.1 OpenLDAP hangs after returning results
@@ -211,6 +213,10 @@ problems may have been fixed or changed somewhat since this was written!
Curl doesn't recognize certificates in DER format in keychain, but it works
with PEM. https://curl.haxx.se/bug/view.cgi?id=1065
+2.3 Unable to use PKCS12 certificate with Secure Transport
+
+ See https://github.com/curl/curl/issues/5403
+
2.4 Secure Transport won't import PKCS#12 client certificates without a password
libcurl calls SecPKCS12Import with the PKCS#12 client certificate, but that
@@ -760,7 +766,14 @@ problems may have been fixed or changed somewhat since this was written!
handle share a connection cache, but due to how connections are used they are
still not thread-safe when used shared.
- See https://github.com/curl/curl/issues/4915
+ See https://github.com/curl/curl/issues/4915 and lib1541.c
+
+11.12 'no_proxy' string-matches IPv6 numerical addreses
+
+ This has the downside that "::1" for example doesn't match "::0:1" even
+ though they are in fact the same address.
+
+ See https://github.com/curl/curl/issues/5745
12. LDAP and OpenLDAP
diff --git a/docs/LICENSE-MIXING.md b/docs/LICENSE-MIXING.md
deleted file mode 100644
index 1083a2dc..00000000
--- a/docs/LICENSE-MIXING.md
+++ /dev/null
@@ -1,128 +0,0 @@
-License Mixing
-==============
-
-libcurl can be built to use a fair amount of various third party libraries,
-libraries that are written and provided by other parties that are distributed
-using their own licenses. Even libcurl itself contains code that may cause
-problems to some. This document attempts to describe what licenses libcurl and
-the other libraries use and what possible dilemmas linking and mixing them all
-can lead to for end users.
-
-I am not a lawyer and this is not legal advice!
-
-One common dilemma is that [GPL](https://www.gnu.org/licenses/gpl.html)
-licensed code is not allowed to be linked with code licensed under the
-[Original BSD license](https://spdx.org/licenses/BSD-4-Clause.html) (with the
-announcement clause). You may still build your own copies that use them all,
-but distributing them as binaries would be to violate the GPL license - unless
-you accompany your license with an
-[exception](https://www.gnu.org/licenses/gpl-faq.html#GPLIncompatibleLibs). This
-particular problem was addressed when the [Modified BSD
-license](https://opensource.org/licenses/BSD-3-Clause) was created, which does
-not have the announcement clause that collides with GPL.
-
-## libcurl
-
- Uses an [MIT style license](https://curl.haxx.se/docs/copyright.html) that is
- very liberal.
-
-## OpenSSL
-
- (May be used for SSL/TLS support) Uses an Original BSD-style license with an
- announcement clause that makes it "incompatible" with GPL. You are not
- allowed to ship binaries that link with OpenSSL that includes GPL code
- (unless that specific GPL code includes an exception for OpenSSL - a habit
- that is growing more and more common). If OpenSSL's licensing is a problem
- for you, consider using another TLS library.
-
-## GnuTLS
-
- (May be used for SSL/TLS support) Uses the
- [LGPL](https://www.gnu.org/licenses/lgpl.html) license. If this is a problem
- for you, consider using another TLS library. Also note that GnuTLS itself
- depends on and uses other libs (libgcrypt and libgpg-error) and they too are
- LGPL- or GPL-licensed.
-
-## WolfSSL
-
- (May be used for SSL/TLS support) Uses the GPL license or a proprietary
- license. If this is a problem for you, consider using another TLS library.
-
-## NSS
-
- (May be used for SSL/TLS support) Is covered by the
- [MPL](https://www.mozilla.org/MPL/) license, the GPL license and the LGPL
- license. You may choose to license the code under MPL terms, GPL terms, or
- LGPL terms. These licenses grant you different permissions and impose
- different obligations. You should select the license that best meets your
- needs.
-
-## mbedTLS
-
- (May be used for SSL/TLS support) Uses the [Apache 2.0
- license](https://opensource.org/licenses/Apache-2.0) or the GPL license.
- You may choose to license the code under Apache 2.0 terms or GPL terms.
- These licenses grant you different permissions and impose different
- obligations. You should select the license that best meets your needs.
-
-## BoringSSL
-
- (May be used for SSL/TLS support) As an OpenSSL fork, it has the same
- license as that.
-
-## libressl
-
- (May be used for SSL/TLS support) As an OpenSSL fork, it has the same
- license as that.
-
-## BearSSL
-
- (May be used for SSL/TLS support) Uses an MIT license that is very liberal
- and imposes no restrictions on any other library or part you may link with.
-
-## c-ares
-
- (Used for asynchronous name resolves) Uses an MIT license that is very
- liberal and imposes no restrictions on any other library or part you may link
- with.
-
-## zlib
-
- (Used for compressed Transfer-Encoding support) Uses an MIT-style license
- that shouldn't collide with any other library.
-
-## MIT Kerberos
-
- (May be used for GSS support) MIT licensed, that shouldn't collide with any
- other parts.
-
-## Heimdal
-
- (May be used for GSS support) Heimdal is Original BSD licensed with the
- announcement clause.
-
-## GNU GSS
-
- (May be used for GSS support) GNU GSS is GPL licensed. Note that you may not
- distribute binary curl packages that uses this if you build curl to also link
- and use any Original BSD licensed libraries!
-
-## libidn
-
- (Used for IDNA support) Uses the GNU Lesser General Public License [3]. LGPL
- is a variation of GPL with slightly less aggressive "copyleft". This license
- requires more requirements to be met when distributing binaries, see the
- license for details. Also note that if you distribute a binary that includes
- this library, you must also include the full LGPL license text. Please
- properly point out what parts of the distributed package that the license
- addresses.
-
-## OpenLDAP
-
- (Used for LDAP support) Uses a Modified BSD-style license. Since libcurl uses
- OpenLDAP as a shared library only, I have not heard of anyone that ships
- OpenLDAP linked with libcurl in an app.
-
-## libssh2
-
- (Used for scp and sftp support) libssh2 uses a Modified BSD-style license.
diff --git a/docs/MQTT.md b/docs/MQTT.md
index a4097147..741b0729 100644
--- a/docs/MQTT.md
+++ b/docs/MQTT.md
@@ -1,25 +1,5 @@
# MQTT in curl
-## Experimental!
-
-MQTT support in curl is considered **EXPERIMENTAL** until further notice. It
-needs to be enabled at build-time. See below.
-
-After the initial merge, further development and tweaking of the MQTT support
-in curl will happen in the master branch using pull-requests, just like
-ordinary changes.
-
-Experimental support for MQTT means that we **do not guarantee** that the
-current protocol functionality will remain or remain this way going forward.
-There are no API or ABI promises for experimental features as for regular curl
-features.
-
-Do not ship anything with this enabled.
-
-## Build
-
- ./configure --enable-mqtt
-
## Usage
A plain "GET" subscribes to the topic and prints all published messages.
@@ -47,15 +27,3 @@ Remaining limitations:
- No username/password support
- No TLS (mqtts) support
- Naive EAGAIN handling won't handle split messages
-
-## Work
-
-1. Write a mqtt server for the test suite
-2. Create a few tests verifying the existing mqtt functionality
-3. Work on fixing some of the worst limitations - with accompanying tests
-4. Consider replacing the client-side MQTT code with wolfMQTT
-
-## Credits
-
-The initial MQTT patch was authored by Björn Stenberg. This work is built upon
-that patch and has been expanded since.
diff --git a/docs/Makefile.am b/docs/Makefile.am
index 59ade4a8..b7d17922 100644
--- a/docs/Makefile.am
+++ b/docs/Makefile.am
@@ -45,7 +45,7 @@ EXTRA_DIST = \
ALTSVC.md \
BINDINGS.md \
BUG-BOUNTY.md \
- BUGS \
+ BUGS.md \
CHECKSRC.md \
CIPHERS.md \
CMakeLists.txt \
@@ -56,7 +56,7 @@ EXTRA_DIST = \
CURL-DISABLE.md \
DEPRECATE.md \
DYNBUF.md \
- ESNI.md \
+ ECH.md \
EXPERIMENTAL.md \
FAQ \
FEATURES \
@@ -71,21 +71,19 @@ EXTRA_DIST = \
INSTALL.md \
INTERNALS.md \
KNOWN_BUGS \
- LICENSE-MIXING.md \
MAIL-ETIQUETTE \
MQTT.md \
options-in-versions \
PARALLEL-TRANSFERS.md \
README.md \
RELEASE-PROCEDURE.md \
- RESOURCES \
ROADMAP.md \
SECURITY-PROCESS.md \
SSL-PROBLEMS.md \
SSLCERTS.md \
THANKS \
TODO \
- TheArtOfHttpScripting \
+ TheArtOfHttpScripting.md \
VERSIONS.md
MAN2HTML= roffit $< >$@
diff --git a/docs/RESOURCES b/docs/RESOURCES
deleted file mode 100644
index 55f75df7..00000000
--- a/docs/RESOURCES
+++ /dev/null
@@ -1,85 +0,0 @@
- _ _ ____ _
- Project ___| | | | _ \| |
- / __| | | | |_) | |
- | (__| |_| | _ <| |___
- \___|\___/|_| \_\_____|
-
-
-This document lists documents and standards used by curl.
-
- RFC 959 - FTP Protocol
-
- RFC 1635 - How to Use Anonymous FTP
-
- RFC 1738 - Uniform Resource Locators
-
- RFC 1777 - Lightweight Directory Access Protocol (LDAP)
-
- RFC 1808 - Relative Uniform Resource Locators
-
- RFC 1867 - Form-based File Upload in HTML
-
- RFC 1950 - ZLIB Compressed Data Format Specification
-
- RFC 1951 - DEFLATE Compressed Data Format Specification
-
- RFC 1952 - GZIP File Format Specification
-
- RFC 1959 - LDAP URL Syntax
-
- RFC 2045-2049 - Everything you need to know about MIME! (needed for form
- based upload)
-
- RFC 2068 - HTTP 1.1 (obsoleted by RFC 2616)
-
- RFC 2104 - Keyed-Hashing for Message Authentication
-
- RFC 2109 - HTTP State Management Mechanism (cookie stuff)
- - Also, read Netscape's specification at
- https://curl.haxx.se/rfc/cookie_spec.html
-
- RFC 2183 - The Content-Disposition Header Field
-
- RFC 2195 - CRAM-MD5 Authentication
-
- RFC 2229 - A Dictionary Server Protocol
-
- RFC 2255 - Newer LDAP URL Format
-
- RFC 2231 - MIME Parameter Value and Encoded Word Extensions:
- Character Sets, Languages, and Continuations
-
- RFC 2388 - "Returning Values from Forms: multipart/form-data"
- Use this as an addition to the RFC1867
-
- RFC 2396 - "Uniform Resource Identifiers: Generic Syntax and Semantics" This
- one obsoletes RFC 1738, but since RFC 1738 is often mentioned
- I've left it in this list.
-
- RFC 2428 - FTP Extensions for IPv6 and NATs
-
- RFC 2577 - FTP Security Considerations
-
- RFC 2616 - HTTP 1.1, the latest
-
- RFC 2617 - HTTP Authentication
-
- RFC 2718 - Guidelines for new URL Schemes
-
- RFC 2732 - Format for Literal IPv6 Addresses in URL's
-
- RFC 2818 - HTTP Over TLS (TLS is the successor to SSL)
-
- RFC 2821 - Simple Mail Transfer Protocol (SMTP)
-
- RFC 2964 - Use of HTTP State Management
-
- RFC 2965 - HTTP State Management Mechanism. Cookies. Obsoletes RFC2109
-
- RFC 3207 - SMTP Over TLS
-
- RFC 4616 - PLAIN Authentication
-
- RFC 4954 - SMTP Authentication
-
- RFC 7932 - Brotli Compressed Data Format
diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md
index dae72a91..574bd810 100644
--- a/docs/ROADMAP.md
+++ b/docs/ROADMAP.md
@@ -8,36 +8,12 @@ participation.
HSTS
----
- Complete and merge [the existing PR](https://github.com/curl/curl/pull/2682).
+ Merge [the existing PR](https://github.com/curl/curl/pull/5896).
- Loading a huge preload file is probably not too interesting to most people,
- but using a custom file and reacting to HSTS response header probably are
- good features.
-
-DNS-over-TLS
-------------
-
- Similar to DNS-over-HTTPS. Could share quite a lot of generic code.
-
-ESNI (Encrypted SNI)
---------------------
+ECH (Encrypted Client Hello - formerly known as ESNI)
+-----------------------------------------------------
See Daniel's post on [Support of Encrypted
SNI](https://curl.haxx.se/mail/lib-2019-03/0000.html) on the mailing list.
Initial work exists in https://github.com/curl/curl/pull/4011
-
-thread-safe `curl_global_init()`
---------------------------------
-
- Fix the libcurl specific parts of the function to be thread-safe. Make sure
- it can be thread-safe if built with thread-safe 3rd party libraries.
- (probably can't include `curl_global_init_mem()` for obvious reasons)
-
-Hardcode “localhost”
---------------------
-
- No need to resolve it. Avoid a risk where this is resolved over the network
- and actually responds with something else than a local address. Some
- operating systems already do this. Also:
- https://tools.ietf.org/html/draft-ietf-dnsop-let-localhost-be-localhost-02
diff --git a/docs/SSLCERTS.md b/docs/SSLCERTS.md
index 39170d08..c991f67d 100644
--- a/docs/SSLCERTS.md
+++ b/docs/SSLCERTS.md
@@ -60,8 +60,8 @@ server, do one of the following:
With the curl command line tool: --cacert [file]
3. Add the CA cert for your server to the existing default CA certificate
- store. The default CA certificate store can changed at compile time with the
- following configure options:
+ store. The default CA certificate store can be changed at compile time with
+ the following configure options:
--with-ca-bundle=FILE: use the specified file as CA certificate store. CA
certificates need to be concatenated in PEM format into this file.
diff --git a/docs/THANKS b/docs/THANKS
index ccec1214..9e037eec 100644
--- a/docs/THANKS
+++ b/docs/THANKS
@@ -135,6 +135,7 @@ Andrei Sedoi
Andrei Valeriu BICA
Andrei Virtosu
Andrej E Baranov
+Andrew Barnes
Andrew Benham
Andrew Biggs
Andrew Bushnell
@@ -158,7 +159,9 @@ Andy Fiddaman
Andy Serpa
Andy Tsouladze
Angus Mackay
+anio on github
anshnd on github
+Antarpreet Singh
Anthon Pang
Anthony Avina
Anthony Bryan
@@ -213,6 +216,7 @@ Bastien Bouclet
Basuke Suzuki
baumanj on github
bdry on github
+beckenc on github
Ben Boeckel
Ben Darnell
Ben Greear
@@ -343,6 +347,7 @@ Chris Flerackers
Chris Gaukroger
Chris Maltby
Chris Mumford
+Chris Paulson-Ellis
Chris Roberts
Chris Smowton
Chris Young
@@ -383,6 +388,7 @@ cmfrolick on github
codesniffer13 on github
Cody Jones
Cody Mack
+COFFEETALES on github
coinhubs on github
Colby Ranger
Colin Blair
@@ -426,6 +432,7 @@ Dan Donahue
Dan Fandrich
Dan Jacobson
Dan Johnson
+Dan Kenigsberg
Dan Locks
Dan McNulty
Dan Nelson
@@ -539,6 +546,7 @@ Dirk Eddelbuettel
Dirk Feytons
Dirk Manske
Dirkjan Bussink
+Diven Qi
divinity76 on github
dkjjr89 on github
dkwolfe4 on github
@@ -578,6 +586,7 @@ Drake Arconis
dtmsecurity on github
Duane Cathey
Duncan Mac-Vicar Prett
+Duncan Wilcox
Dustin Boswell
Dusty Mabe
Duy Phan Thanh
@@ -709,8 +718,10 @@ Fred Noz
Fred Stluka
Frederic Lepied
Frederik B
+Frederik Wedel-Heinen
Fredrik Thulin
FuccDucc on github
+fullincome on github
Gabriel Kuri
Gabriel Sjoberg
Garrett Holmstrom
@@ -822,12 +833,14 @@ Hongli Lai
Howard Blaise
Howard Chu
hsiao yi
+htasta on github
Hubert Kario
Hugo van Kemenade
Huzaifa Sidhpurwala
huzunhao on github
hydra3333 on github
Hzhijun
+iammrtau on github
Ian D Allen
Ian Fette
Ian Ford
@@ -854,6 +867,7 @@ infinnovation-dev on github
Ingmar Runge
Ingo Ralf Blum
Ingo Wilken
+Ionuț-Francisc Oancea
Irfan Adilovic
Ironbars13 on github
Irving Wolfe
@@ -920,6 +934,7 @@ Jason S. Priebe
Javier Barroso
Javier Blazquez
Javier G. Sogo
+Javier Navarro
Javier Sixto
Jay Austin
Jayesh A Shah
@@ -979,6 +994,7 @@ Jiri Dvorak
Jiri Hruska
Jiri Jaburek
Jiří Malák
+jmdavitt on github
jnbr on github
Jocelyn Jaubert
Joe Halpin
@@ -1161,6 +1177,7 @@ Kristian Köhntopp
Kristian Mide
Kristiyan Tsaklev
Kristoffer Gleditsch
+Kunal Chandarana
Kunal Ekawde
Kurt Fankhauser
Kwon-Young Choi
@@ -1249,6 +1266,7 @@ Luz Paz
Luật Nguyễn
Lyman Epp
Lyndon Hill
+M.R.T on github
Maciej Karpiuk
Maciej Puzio
Maciej W. Rozycki
@@ -1316,6 +1334,7 @@ Maros Priputen
Marquis de Muesli
Martijn Koster
Martin Ankerl
+Martin Bašti
Martin C. Martin
Martin Drasar
Martin Dreher
@@ -1386,6 +1405,7 @@ Melissa Mears
Mert Yazıcıoğlu
Mettgut Jamalla
Michael Anti
+Michael Baentsch
Michael Benedict
Michael Brehm
Michael Calmer
@@ -1407,6 +1427,8 @@ Michael Lee
Michael Maltese
Michael Mealling
Michael Mueller
+Michael Musset
+Michael Olbrich
Michael Osipov
Michael Schmid
Michael Smith
@@ -1451,6 +1473,7 @@ Mike Revi
Miklos Nemeth
Miloš Ljumović
Mingliang Zhu
+Mingtao Yang
Miroslav Franc
Miroslav Spousta
Mischa Salle
@@ -1632,6 +1655,7 @@ Peter Gal
Peter Heuchert
Peter Hjalmarsson
Peter Korsgaard
+Peter Körner
Peter Lamare
Peter Lamberg
Peter Laser
@@ -1690,6 +1714,7 @@ Puneet Pawaia
qiandu2006 on github
Quagmire
Quanah Gibson-Mount
+Quentin Balland
Quinn Slack
R. Dennis Steed
Radoslav Georgiev
@@ -1721,6 +1746,7 @@ Ray Dassen
Ray Pekowski
Ray Satiro
Razvan Cojocaru
+rcombs on github
Reed Loden
Reinhard Max
Reinout van Schouwen
@@ -1796,6 +1822,7 @@ Robert Schumann
Robert Weaver
Robert Wruck
Robin Cornelius
+Robin Douine
Robin Johnson
Robin Kay
Robson Braga Araujo
@@ -1849,12 +1876,14 @@ Sam Deane
Sam Hurst
Sam Roth
Sam Schanken
+Samanta Navarro
Sampo Kellomaki
Samuel Díaz García
Samuel Listopad
Samuel Marks
Samuel Surtees
Samuel Thibault
+Samuel Tranchet
Sander Gates
Sandor Feldi
Santhana Todatry
@@ -1924,6 +1953,7 @@ Siva Sivaraman
SLDiggie on github
smuellerDD on github
sn on hackerone
+sofaboss on github
Somnath Kundu
Song Ma
Sonia Subramanian
@@ -1947,6 +1977,7 @@ Stefan Grether
Stefan Kanthak
Stefan Krause
Stefan Neis
+Stefan Strogin
Stefan Teleman
Stefan Tomanek
Stefan Ulrich
diff --git a/docs/TODO b/docs/TODO
index bd9b0e88..d45319d7 100644
--- a/docs/TODO
+++ b/docs/TODO
@@ -52,6 +52,8 @@
2.4 Split connect and authentication process
2.5 Edge-triggered sockets should work
2.6 multi upkeep
+ 2.7 Virtual external sockets
+ 2.8 dynamically decide to use socketpair
3. Documentation
3.2 Provide cmake config-file
@@ -135,6 +137,7 @@
17.2 Handle growing SFTP files
17.3 Support better than MD5 hostkey hash
17.4 Support CURLOPT_PREQUOTE
+ 17.5 SSH over HTTPS proxy with more backends
18. Command line tool
18.1 sync
@@ -158,13 +161,13 @@
18.19 expand ~/ in config files
18.20 host name sections in config files
18.21 retry on the redirected-to URL
- 18.22 Add flag to specify download directory
18.23 Set the modification date on an uploaded file
18.24 Use multiple parallel transfers for a single download
19. Build
19.1 roffit
19.2 Enable PIE and RELRO by default
+ 19.3 Don't use GNU libtool on OpenBSD
20. Test suite
20.1 SSL tunnel
@@ -238,6 +241,8 @@
This could be used by curl on macOS when built without a separate IDN library
and an IDN host name is used in a URL.
+ See initial work in https://github.com/curl/curl/pull/5371
+
1.7 Support HTTP/2 for HTTP(S) proxies
Support for doing HTTP/2 to HTTP and HTTPS proxies is still missing.
@@ -481,6 +486,23 @@
See https://github.com/curl/curl/issues/3199
+2.7 Virtual external sockets
+
+ libcurl performs operations on the given file descriptor that presumes it is
+ a socket and an application cannot replace them at the moment. Allowing an
+ application to fully replace those would allow a larger degree of freedom and
+ flexibility.
+
+ See https://github.com/curl/curl/issues/5835
+
+2.8 dynamically decide to use socketpair
+
+ For users who don't use curl_multi_wait() or don't care for
+ curl_multi_wakeup(), we could introduce a way to make libcurl NOT
+ create a socketpair in the multi handle.
+
+ See https://github.com/curl/curl/issues/4829
+
3. Documentation
3.2 Provide cmake config-file
@@ -910,6 +932,13 @@ that doesn't exist on the server, just like --ftp-create-dirs.
The two other QUOTE options are supported for SFTP, but this was left out for
unknown reasons!
+17.5 SSH over HTTPS proxy with more backends
+
+ The SSH based protocols SFTP and SCP didn't work over HTTPS proxy at
+ all until PR https://github.com/curl/curl/pull/6021 brought the
+ functionality with the libssh2 backend. Presumably, this support
+ can/could be added for the other backends as well.
+
18. Command line tool
18.1 sync
@@ -1112,12 +1141,6 @@ that doesn't exist on the server, just like --ftp-create-dirs.
See https://github.com/curl/curl/issues/5462
-18.22 Add flag to specify download directory
-
- A directory name to basically prepend to the file name -O and -o use. Saves
- user from having to manually "cd" to the directory. Especially useful for
- command lines with multiple -O and different download directories.
-
18.23 Set the modification date on an uploaded file
For SFTP and posssibly FTP, curl could offer an option to set the
@@ -1165,6 +1188,15 @@ that doesn't exist on the server, just like --ftp-create-dirs.
to no impact, neither on the performance nor on the general functionality of
curl.
+19.3 Don't use GNU libtool on OpenBSD
+ When compiling curl on OpenBSD with "--enable-debug" it will give linking
+ errors when you use GNU libtool. This can be fixed by using the libtool
+ provided by OpenBSD itself. However for this the user always needs to invoke
+ make with "LIBTOOL=/usr/bin/libtool". It would be nice if the script could
+ have some magic to detect if this system is an OpenBSD host and then use the
+ OpenBSD libtool instead.
+
+ See https://github.com/curl/curl/issues/5862
20. Test suite
diff --git a/docs/TheArtOfHttpScripting b/docs/TheArtOfHttpScripting
deleted file mode 100644
index 65bda625..00000000
--- a/docs/TheArtOfHttpScripting
+++ /dev/null
@@ -1,758 +0,0 @@
- _ _ ____ _
- ___| | | | _ \| |
- / __| | | | |_) | |
- | (__| |_| | _ <| |___
- \___|\___/|_| \_\_____|
-
-
-The Art Of Scripting HTTP Requests Using Curl
-
- 1. HTTP Scripting
- 1.1 Background
- 1.2 The HTTP Protocol
- 1.3 See the Protocol
- 1.4 See the Timing
- 1.5 See the Response
- 2. URL
- 2.1 Spec
- 2.2 Host
- 2.3 Port number
- 2.4 User name and password
- 2.5 Path part
- 3. Fetch a page
- 3.1 GET
- 3.2 HEAD
- 3.3 Multiple URLs in a single command line
- 3.4 Multiple HTTP methods in a single command line
- 4. HTML forms
- 4.1 Forms explained
- 4.2 GET
- 4.3 POST
- 4.4 File Upload POST
- 4.5 Hidden Fields
- 4.6 Figure Out What A POST Looks Like
- 5. HTTP upload
- 5.1 PUT
- 6. HTTP Authentication
- 6.1 Basic Authentication
- 6.2 Other Authentication
- 6.3 Proxy Authentication
- 6.4 Hiding credentials
- 7. More HTTP Headers
- 7.1 Referer
- 7.2 User Agent
- 8. Redirects
- 8.1 Location header
- 8.2 Other redirects
- 9. Cookies
- 9.1 Cookie Basics
- 9.2 Cookie options
- 10. HTTPS
- 10.1 HTTPS is HTTP secure
- 10.2 Certificates
- 11. Custom Request Elements
- 11.1 Modify method and headers
- 11.2 More on changed methods
- 12. Web Login
- 12.1 Some login tricks
- 13. Debug
- 13.1 Some debug tricks
- 14. References
- 14.1 Standards
- 14.2 Sites
-
-==============================================================================
-
-1. HTTP Scripting
-
- 1.1 Background
-
- This document assumes that you're familiar with HTML and general networking.
-
- The increasing amount of applications moving to the web has made "HTTP
- Scripting" more frequently requested and wanted. To be able to automatically
- extract information from the web, to fake users, to post or upload data to
- web servers are all important tasks today.
-
- Curl is a command line tool for doing all sorts of URL manipulations and
- transfers, but this particular document will focus on how to use it when
- doing HTTP requests for fun and profit. I'll assume that you know how to
- invoke 'curl --help' or 'curl --manual' to get basic information about it.
-
- Curl is not written to do everything for you. It makes the requests, it gets
- the data, it sends data and it retrieves the information. You probably need
- to glue everything together using some kind of script language or repeated
- manual invokes.
-
- 1.2 The HTTP Protocol
-
- HTTP is the protocol used to fetch data from web servers. It is a very simple
- protocol that is built upon TCP/IP. The protocol also allows information to
- get sent to the server from the client using a few different methods, as will
- be shown here.
-
- HTTP is plain ASCII text lines being sent by the client to a server to
- request a particular action, and then the server replies a few text lines
- before the actual requested content is sent to the client.
-
- The client, curl, sends a HTTP request. The request contains a method (like
- GET, POST, HEAD etc), a number of request headers and sometimes a request
- body. The HTTP server responds with a status line (indicating if things went
- well), response headers and most often also a response body. The "body" part
- is the plain data you requested, like the actual HTML or the image etc.
-
- 1.3 See the Protocol
-
- Using curl's option --verbose (-v as a short option) will display what kind
- of commands curl sends to the server, as well as a few other informational
- texts.
-
- --verbose is the single most useful option when it comes to debug or even
- understand the curl<->server interaction.
-
- Sometimes even --verbose is not enough. Then --trace and --trace-ascii offer
- even more details as they show EVERYTHING curl sends and receives. Use it
- like this:
-
- curl --trace-ascii debugdump.txt http://www.example.com/
-
- 1.4 See the Timing
-
- Many times you may wonder what exactly is taking all the time, or you just
- want to know the amount of milliseconds between two points in a
- transfer. For those, and other similar situations, the --trace-time option
- is what you need. It'll prepend the time to each trace output line:
-
- curl --trace-ascii d.txt --trace-time http://example.com/
-
- 1.5 See the Response
-
- By default curl sends the response to stdout. You need to redirect it
- somewhere to avoid that, most often that is done with -o or -O.
-
-2. URL
-
- 2.1 Spec
-
- The Uniform Resource Locator format is how you specify the address of a
- particular resource on the Internet. You know these, you've seen URLs like
- https://curl.haxx.se or https://yourbank.com a million times. RFC 3986 is the
- canonical spec. And yeah, the formal name is not URL, it is URI.
-
- 2.2 Host
-
- The host name is usually resolved using DNS or your /etc/hosts file to an IP
- address and that's what curl will communicate with. Alternatively you specify
- the IP address directly in the URL instead of a name.
-
- For development and other trying out situations, you can point to a different
- IP address for a host name than what would otherwise be used, by using curl's
- --resolve option:
-
- curl --resolve www.example.org:80:127.0.0.1 http://www.example.org/
-
- 2.3 Port number
-
- Each protocol curl supports operates on a default port number, be it over TCP
- or in some cases UDP. Normally you don't have to take that into
- consideration, but at times you run test servers on other ports or
- similar. Then you can specify the port number in the URL with a colon and a
- number immediately following the host name. Like when doing HTTP to port
- 1234:
-
- curl http://www.example.org:1234/
-
- The port number you specify in the URL is the number that the server uses to
- offer its services. Sometimes you may use a local proxy, and then you may
- need to specify that proxy's port number separately for what curl needs to
- connect to locally. Like when using a HTTP proxy on port 4321:
-
- curl --proxy http://proxy.example.org:4321 http://remote.example.org/
-
- 2.4 User name and password
-
- Some services are setup to require HTTP authentication and then you need to
- provide name and password which is then transferred to the remote site in
- various ways depending on the exact authentication protocol used.
-
- You can opt to either insert the user and password in the URL or you can
- provide them separately:
-
- curl http://user:password@example.org/
-
- or
-
- curl -u user:password http://example.org/
-
- You need to pay attention that this kind of HTTP authentication is not what
- is usually done and requested by user-oriented websites these days. They
- tend to use forms and cookies instead.
-
- 2.5 Path part
-
- The path part is just sent off to the server to request that it sends back
- the associated response. The path is what is to the right side of the slash
- that follows the host name and possibly port number.
-
-3. Fetch a page
-
- 3.1 GET
-
- The simplest and most common request/operation made using HTTP is to GET a
- URL. The URL could itself refer to a web page, an image or a file. The client
- issues a GET request to the server and receives the document it asked for.
- If you issue the command line
-
- curl https://curl.haxx.se
-
- you get a web page returned in your terminal window. The entire HTML document
- that that URL holds.
-
- All HTTP replies contain a set of response headers that are normally hidden,
- use curl's --include (-i) option to display them as well as the rest of the
- document.
-
- 3.2 HEAD
-
- You can ask the remote server for ONLY the headers by using the --head (-I)
- option which will make curl issue a HEAD request. In some special cases
- servers deny the HEAD method while others still work, which is a particular
- kind of annoyance.
-
- The HEAD method is defined and made so that the server returns the headers
- exactly the way it would do for a GET, but without a body. It means that you
- may see a Content-Length: in the response headers, but there must not be an
- actual body in the HEAD response.
-
- 3.3 Multiple URLs in a single command line
-
- A single curl command line may involve one or many URLs. The most common case
- is probably to just use one, but you can specify any amount of URLs. Yes
- any. No limits. You'll then get requests repeated over and over for all the
- given URLs.
-
- Example, send two GETs:
-
- curl http://url1.example.com http://url2.example.com
-
- If you use --data to POST to the URL, using multiple URLs means that you send
- that same POST to all the given URLs.
-
- Example, send two POSTs:
-
- curl --data name=curl http://url1.example.com http://url2.example.com
-
-
- 3.4 Multiple HTTP methods in a single command line
-
- Sometimes you need to operate on several URLs in a single command line and do
- different HTTP methods on each. For this, you'll enjoy the --next option. It
- is basically a separator that separates a bunch of options from the next. All
- the URLs before --next will get the same method and will get all the POST
- data merged into one.
-
- When curl reaches the --next on the command line, it'll sort of reset the
- method and the POST data and allow a new set.
-
- Perhaps this is best shown with a few examples. To send first a HEAD and then
- a GET:
-
- curl -I http://example.com --next http://example.com
-
- To first send a POST and then a GET:
-
- curl -d score=10 http://example.com/post.cgi --next http://example.com/results.html
-
-
-4. HTML forms
-
- 4.1 Forms explained
-
- Forms are the general way a website can present a HTML page with fields for
- the user to enter data in, and then press some kind of 'OK' or 'Submit'
- button to get that data sent to the server. The server then typically uses
- the posted data to decide how to act. Like using the entered words to search
- in a database, or to add the info in a bug tracking system, display the entered
- address on a map or using the info as a login-prompt verifying that the user
- is allowed to see what it is about to see.
-
- Of course there has to be some kind of program on the server end to receive
- the data you send. You cannot just invent something out of the air.
-
- 4.2 GET
-
- A GET-form uses the method GET, as specified in HTML like:
-
- <form method="GET" action="junk.cgi">
- <input type=text name="birthyear">
- <input type=submit name=press value="OK">
- </form>
-
- In your favorite browser, this form will appear with a text box to fill in
- and a press-button labeled "OK". If you fill in '1905' and press the OK
- button, your browser will then create a new URL to get for you. The URL will
- get "junk.cgi?birthyear=1905&press=OK" appended to the path part of the
- previous URL.
-
- If the original form was seen on the page "www.hotmail.com/when/birth.html",
- the second page you'll get will become
- "www.hotmail.com/when/junk.cgi?birthyear=1905&press=OK".
-
- Most search engines work this way.
-
- To make curl do the GET form post for you, just enter the expected created
- URL:
-
- curl "http://www.hotmail.com/when/junk.cgi?birthyear=1905&press=OK"
-
- 4.3 POST
-
- The GET method makes all input field names get displayed in the URL field of
- your browser. That's generally a good thing when you want to be able to
- bookmark that page with your given data, but it is an obvious disadvantage
- if you entered secret information in one of the fields or if there are a
- large amount of fields creating a very long and unreadable URL.
-
- The HTTP protocol then offers the POST method. This way the client sends the
- data separated from the URL and thus you won't see any of it in the URL
- address field.
-
- The form would look very similar to the previous one:
-
- <form method="POST" action="junk.cgi">
- <input type=text name="birthyear">
- <input type=submit name=press value=" OK ">
- </form>
-
- And to use curl to post this form with the same data filled in as before, we
- could do it like:
-
- curl --data "birthyear=1905&press=%20OK%20" \
- http://www.example.com/when.cgi
-
- This kind of POST will use the Content-Type
- application/x-www-form-urlencoded and is the most widely used POST kind.
-
- The data you send to the server MUST already be properly encoded, curl will
- not do that for you. For example, if you want the data to contain a space,
- you need to replace that space with %20 etc. Failing to comply with this
- will most likely cause your data to be received wrongly and messed up.
-
- Recent curl versions can in fact url-encode POST data for you, like this:
-
- curl --data-urlencode "name=I am Daniel" http://www.example.com
-
- If you repeat --data several times on the command line, curl will
- concatenate all the given data pieces - and put a '&' symbol between each
- data segment.
-
- 4.4 File Upload POST
-
- Back in late 1995 they defined an additional way to post data over HTTP. It
- is documented in the RFC 1867, why this method sometimes is referred to as
- RFC1867-posting.
-
- This method is mainly designed to better support file uploads. A form that
- allows a user to upload a file could be written like this in HTML:
-
- <form method="POST" enctype='multipart/form-data' action="upload.cgi">
- <input type=file name=upload>
- <input type=submit name=press value="OK">
- </form>
-
- This clearly shows that the Content-Type about to be sent is
- multipart/form-data.
-
- To post to a form like this with curl, you enter a command line like:
-
- curl --form upload=@localfilename --form press=OK [URL]
-
- 4.5 Hidden Fields
-
- A very common way for HTML based applications to pass state information
- between pages is to add hidden fields to the forms. Hidden fields are
- already filled in, they aren't displayed to the user and they get passed
- along just as all the other fields.
-
- A similar example form with one visible field, one hidden field and one
- submit button could look like:
-
- <form method="POST" action="foobar.cgi">
- <input type=text name="birthyear">
- <input type=hidden name="person" value="daniel">
- <input type=submit name="press" value="OK">
- </form>
-
- To POST this with curl, you won't have to think about if the fields are
- hidden or not. To curl they're all the same:
-
- curl --data "birthyear=1905&press=OK&person=daniel" [URL]
-
- 4.6 Figure Out What A POST Looks Like
-
- When you're about fill in a form and send to a server by using curl instead
- of a browser, you're of course very interested in sending a POST exactly the
- way your browser does.
-
- An easy way to get to see this, is to save the HTML page with the form on
- your local disk, modify the 'method' to a GET, and press the submit button
- (you could also change the action URL if you want to).
-
- You will then clearly see the data get appended to the URL, separated with a
- '?'-letter as GET forms are supposed to.
-
-5. HTTP upload
-
- 5.1 PUT
-
- Perhaps the best way to upload data to a HTTP server is to use PUT. Then
- again, this of course requires that someone put a program or script on the
- server end that knows how to receive a HTTP PUT stream.
-
- Put a file to a HTTP server with curl:
-
- curl --upload-file uploadfile http://www.example.com/receive.cgi
-
-6. HTTP Authentication
-
- 6.1 Basic Authentication
-
- HTTP Authentication is the ability to tell the server your username and
- password so that it can verify that you're allowed to do the request you're
- doing. The Basic authentication used in HTTP (which is the type curl uses by
- default) is *plain* *text* based, which means it sends username and password
- only slightly obfuscated, but still fully readable by anyone that sniffs on
- the network between you and the remote server.
-
- To tell curl to use a user and password for authentication:
-
- curl --user name:password http://www.example.com
-
- 6.2 Other Authentication
-
- The site might require a different authentication method (check the headers
- returned by the server), and then --ntlm, --digest, --negotiate or even
- --anyauth might be options that suit you.
-
- 6.3 Proxy Authentication
-
- Sometimes your HTTP access is only available through the use of a HTTP
- proxy. This seems to be especially common at various companies. A HTTP proxy
- may require its own user and password to allow the client to get through to
- the Internet. To specify those with curl, run something like:
-
- curl --proxy-user proxyuser:proxypassword curl.haxx.se
-
- If your proxy requires the authentication to be done using the NTLM method,
- use --proxy-ntlm, if it requires Digest use --proxy-digest.
-
- If you use any one of these user+password options but leave out the password
- part, curl will prompt for the password interactively.
-
- 6.4 Hiding credentials
-
- Do note that when a program is run, its parameters might be possible to see
- when listing the running processes of the system. Thus, other users may be
- able to watch your passwords if you pass them as plain command line
- options. There are ways to circumvent this.
-
- It is worth noting that while this is how HTTP Authentication works, very
- many websites will not use this concept when they provide logins etc. See
- the Web Login chapter further below for more details on that.
-
-7. More HTTP Headers
-
- 7.1 Referer
-
- A HTTP request may include a 'referer' field (yes it is misspelled), which
- can be used to tell from which URL the client got to this particular
- resource. Some programs/scripts check the referer field of requests to verify
- that this wasn't arriving from an external site or an unknown page. While
- this is a stupid way to check something so easily forged, many scripts still
- do it. Using curl, you can put anything you want in the referer-field and
- thus more easily be able to fool the server into serving your request.
-
- Use curl to set the referer field with:
-
- curl --referer http://www.example.come http://www.example.com
-
- 7.2 User Agent
-
- Very similar to the referer field, all HTTP requests may set the User-Agent
- field. It names what user agent (client) that is being used. Many
- applications use this information to decide how to display pages. Silly web
- programmers try to make different pages for users of different browsers to
- make them look the best possible for their particular browsers. They usually
- also do different kinds of javascript, vbscript etc.
-
- At times, you will see that getting a page with curl will not return the same
- page that you see when getting the page with your browser. Then you know it
- is time to set the User Agent field to fool the server into thinking you're
- one of those browsers.
-
- To make curl look like Internet Explorer 5 on a Windows 2000 box:
-
- curl --user-agent "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)" [URL]
-
- Or why not look like you're using Netscape 4.73 on an old Linux box:
-
- curl --user-agent "Mozilla/4.73 [en] (X11; U; Linux 2.2.15 i686)" [URL]
-
-8. Redirects
-
- 8.1 Location header
-
- When a resource is requested from a server, the reply from the server may
- include a hint about where the browser should go next to find this page, or a
- new page keeping newly generated output. The header that tells the browser
- to redirect is Location:.
-
- Curl does not follow Location: headers by default, but will simply display
- such pages in the same manner it displays all HTTP replies. It does however
- feature an option that will make it attempt to follow the Location: pointers.
-
- To tell curl to follow a Location:
-
- curl --location http://www.example.com
-
- If you use curl to POST to a site that immediately redirects you to another
- page, you can safely use --location (-L) and --data/--form together. Curl will
- only use POST in the first request, and then revert to GET in the following
- operations.
-
- 8.2 Other redirects
-
- Browser typically support at least two other ways of redirects that curl
- doesn't: first the html may contain a meta refresh tag that asks the browser
- to load a specific URL after a set number of seconds, or it may use
- javascript to do it.
-
-9. Cookies
-
- 9.1 Cookie Basics
-
- The way the web browsers do "client side state control" is by using
- cookies. Cookies are just names with associated contents. The cookies are
- sent to the client by the server. The server tells the client for what path
- and host name it wants the cookie sent back, and it also sends an expiration
- date and a few more properties.
-
- When a client communicates with a server with a name and path as previously
- specified in a received cookie, the client sends back the cookies and their
- contents to the server, unless of course they are expired.
-
- Many applications and servers use this method to connect a series of requests
- into a single logical session. To be able to use curl in such occasions, we
- must be able to record and send back cookies the way the web application
- expects them. The same way browsers deal with them.
-
- 9.2 Cookie options
-
- The simplest way to send a few cookies to the server when getting a page with
- curl is to add them on the command line like:
-
- curl --cookie "name=Daniel" http://www.example.com
-
- Cookies are sent as common HTTP headers. This is practical as it allows curl
- to record cookies simply by recording headers. Record cookies with curl by
- using the --dump-header (-D) option like:
-
- curl --dump-header headers_and_cookies http://www.example.com
-
- (Take note that the --cookie-jar option described below is a better way to
- store cookies.)
-
- Curl has a full blown cookie parsing engine built-in that comes in use if you
- want to reconnect to a server and use cookies that were stored from a
- previous connection (or hand-crafted manually to fool the server into
- believing you had a previous connection). To use previously stored cookies,
- you run curl like:
-
- curl --cookie stored_cookies_in_file http://www.example.com
-
- Curl's "cookie engine" gets enabled when you use the --cookie option. If you
- only want curl to understand received cookies, use --cookie with a file that
- doesn't exist. Example, if you want to let curl understand cookies from a
- page and follow a location (and thus possibly send back cookies it received),
- you can invoke it like:
-
- curl --cookie nada --location http://www.example.com
-
- Curl has the ability to read and write cookie files that use the same file
- format that Netscape and Mozilla once used. It is a convenient way to share
- cookies between scripts or invokes. The --cookie (-b) switch automatically
- detects if a given file is such a cookie file and parses it, and by using the
- --cookie-jar (-c) option you'll make curl write a new cookie file at the end
- of an operation:
-
- curl --cookie cookies.txt --cookie-jar newcookies.txt \
- http://www.example.com
-
-10. HTTPS
-
- 10.1 HTTPS is HTTP secure
-
- There are a few ways to do secure HTTP transfers. By far the most common
- protocol for doing this is what is generally known as HTTPS, HTTP over
- SSL. SSL encrypts all the data that is sent and received over the network and
- thus makes it harder for attackers to spy on sensitive information.
-
- SSL (or TLS as the latest version of the standard is called) offers a
- truckload of advanced features to allow all those encryptions and key
- infrastructure mechanisms encrypted HTTP requires.
-
- Curl supports encrypted fetches when built to use a TLS library and it can be
- built to use one out of a fairly large set of libraries - "curl -V" will show
- which one your curl was built to use (if any!). To get a page from a HTTPS
- server, simply run curl like:
-
- curl https://secure.example.com
-
- 10.2 Certificates
-
- In the HTTPS world, you use certificates to validate that you are the one
- you claim to be, as an addition to normal passwords. Curl supports client-
- side certificates. All certificates are locked with a pass phrase, which you
- need to enter before the certificate can be used by curl. The pass phrase
- can be specified on the command line or if not, entered interactively when
- curl queries for it. Use a certificate with curl on a HTTPS server like:
-
- curl --cert mycert.pem https://secure.example.com
-
- curl also tries to verify that the server is who it claims to be, by
- verifying the server's certificate against a locally stored CA cert
- bundle. Failing the verification will cause curl to deny the connection. You
- must then use --insecure (-k) in case you want to tell curl to ignore that
- the server can't be verified.
-
- More about server certificate verification and ca cert bundles can be read
- in the SSLCERTS document, available online here:
-
- https://curl.haxx.se/docs/sslcerts.html
-
- At times you may end up with your own CA cert store and then you can tell
- curl to use that to verify the server's certificate:
-
- curl --cacert ca-bundle.pem https://example.com/
-
-
-11. Custom Request Elements
-
-11.1 Modify method and headers
-
- Doing fancy stuff, you may need to add or change elements of a single curl
- request.
-
- For example, you can change the POST request to a PROPFIND and send the data
- as "Content-Type: text/xml" (instead of the default Content-Type) like this:
-
- curl --data "<xml>" --header "Content-Type: text/xml" \
- --request PROPFIND url.com
-
- You can delete a default header by providing one without content. Like you
- can ruin the request by chopping off the Host: header:
-
- curl --header "Host:" http://www.example.com
-
- You can add headers the same way. Your server may want a "Destination:"
- header, and you can add it:
-
- curl --header "Destination: http://nowhere" http://example.com
-
- 11.2 More on changed methods
-
- It should be noted that curl selects which methods to use on its own
- depending on what action to ask for. -d will do POST, -I will do HEAD and so
- on. If you use the --request / -X option you can change the method keyword
- curl selects, but you will not modify curl's behavior. This means that if you
- for example use -d "data" to do a POST, you can modify the method to a
- PROPFIND with -X and curl will still think it sends a POST. You can change
- the normal GET to a POST method by simply adding -X POST in a command line
- like:
-
- curl -X POST http://example.org/
-
- ... but curl will still think and act as if it sent a GET so it won't send any
- request body etc.
-
-
-12. Web Login
-
- 12.1 Some login tricks
-
- While not strictly just HTTP related, it still causes a lot of people problems
- so here's the executive run-down of how the vast majority of all login forms
- work and how to login to them using curl.
-
- It can also be noted that to do this properly in an automated fashion, you
- will most certainly need to script things and do multiple curl invokes etc.
-
- First, servers mostly use cookies to track the logged-in status of the
- client, so you will need to capture the cookies you receive in the
- responses. Then, many sites also set a special cookie on the login page (to
- make sure you got there through their login page) so you should make a habit
- of first getting the login-form page to capture the cookies set there.
-
- Some web-based login systems feature various amounts of javascript, and
- sometimes they use such code to set or modify cookie contents. Possibly they
- do that to prevent programmed logins, like this manual describes how to...
- Anyway, if reading the code isn't enough to let you repeat the behavior
- manually, capturing the HTTP requests done by your browsers and analyzing the
- sent cookies is usually a working method to work out how to shortcut the
- javascript need.
-
- In the actual <form> tag for the login, lots of sites fill-in random/session
- or otherwise secretly generated hidden tags and you may need to first capture
- the HTML code for the login form and extract all the hidden fields to be able
- to do a proper login POST. Remember that the contents need to be URL encoded
- when sent in a normal POST.
-
-13. Debug
-
- 13.1 Some debug tricks
-
- Many times when you run curl on a site, you'll notice that the site doesn't
- seem to respond the same way to your curl requests as it does to your
- browser's.
-
- Then you need to start making your curl requests more similar to your
- browser's requests:
-
- * Use the --trace-ascii option to store fully detailed logs of the requests
- for easier analyzing and better understanding
-
- * Make sure you check for and use cookies when needed (both reading with
- --cookie and writing with --cookie-jar)
-
- * Set user-agent to one like a recent popular browser does
-
- * Set referer like it is set by the browser
-
- * If you use POST, make sure you send all the fields and in the same order as
- the browser does it.
-
- A very good helper to make sure you do this right, is the LiveHTTPHeader tool
- that lets you view all headers you send and receive with Mozilla/Firefox
- (even when using HTTPS). Chrome features similar functionality out of the box
- among the developer's tools.
-
- A more raw approach is to capture the HTTP traffic on the network with tools
- such as ethereal or tcpdump and check what headers that were sent and
- received by the browser. (HTTPS makes this technique inefficient.)
-
-14. References
-
- 14.1 Standards
-
- RFC 7230 is a must to read if you want in-depth understanding of the HTTP
- protocol
-
- RFC 3986 explains the URL syntax
-
- RFC 1867 defines the HTTP post upload format
-
- RFC 6525 defines how HTTP cookies work
-
- 14.2 Sites
-
- https://curl.haxx.se is the home of the curl project
diff --git a/docs/TheArtOfHttpScripting.md b/docs/TheArtOfHttpScripting.md
new file mode 100644
index 00000000..8de00f0a
--- /dev/null
+++ b/docs/TheArtOfHttpScripting.md
@@ -0,0 +1,692 @@
+# The Art Of Scripting HTTP Requests Using Curl
+
+## Background
+
+ This document assumes that you're familiar with HTML and general networking.
+
+ The increasing amount of applications moving to the web has made "HTTP
+ Scripting" more frequently requested and wanted. To be able to automatically
+ extract information from the web, to fake users, to post or upload data to
+ web servers are all important tasks today.
+
+ Curl is a command line tool for doing all sorts of URL manipulations and
+ transfers, but this particular document will focus on how to use it when
+ doing HTTP requests for fun and profit. I willl assume that you know how to
+ invoke `curl --help` or `curl --manual` to get basic information about it.
+
+ Curl is not written to do everything for you. It makes the requests, it gets
+ the data, it sends data and it retrieves the information. You probably need
+ to glue everything together using some kind of script language or repeated
+ manual invokes.
+
+## The HTTP Protocol
+
+ HTTP is the protocol used to fetch data from web servers. It is a very simple
+ protocol that is built upon TCP/IP. The protocol also allows information to
+ get sent to the server from the client using a few different methods, as will
+ be shown here.
+
+ HTTP is plain ASCII text lines being sent by the client to a server to
+ request a particular action, and then the server replies a few text lines
+ before the actual requested content is sent to the client.
+
+ The client, curl, sends a HTTP request. The request contains a method (like
+ GET, POST, HEAD etc), a number of request headers and sometimes a request
+ body. The HTTP server responds with a status line (indicating if things went
+ well), response headers and most often also a response body. The "body" part
+ is the plain data you requested, like the actual HTML or the image etc.
+
+## See the Protocol
+
+ Using curl's option [`--verbose`](https://curl.haxx.se/docs/manpage.html#-v)
+ (`-v` as a short option) will display what kind of commands curl sends to the
+ server, as well as a few other informational texts.
+
+ `--verbose` is the single most useful option when it comes to debug or even
+ understand the curl<->server interaction.
+
+ Sometimes even `--verbose` is not enough. Then
+ [`--trace`](https://curl.haxx.se/docs/manpage.html#-trace) and
+ [`--trace-ascii`]((https://curl.haxx.se/docs/manpage.html#--trace-ascii)
+ offer even more details as they show **everything** curl sends and
+ receives. Use it like this:
+
+ curl --trace-ascii debugdump.txt http://www.example.com/
+
+## See the Timing
+
+ Many times you may wonder what exactly is taking all the time, or you just
+ want to know the amount of milliseconds between two points in a transfer. For
+ those, and other similar situations, the
+ [`--trace-time`]((https://curl.haxx.se/docs/manpage.html#--trace-time) option
+ is what you need. It'll prepend the time to each trace output line:
+
+ curl --trace-ascii d.txt --trace-time http://example.com/
+
+## See the Response
+
+ By default curl sends the response to stdout. You need to redirect it
+ somewhere to avoid that, most often that is done with ` -o` or `-O`.
+
+# URL
+
+## Spec
+
+ The Uniform Resource Locator format is how you specify the address of a
+ particular resource on the Internet. You know these, you've seen URLs like
+ https://curl.haxx.se or https://yourbank.com a million times. RFC 3986 is the
+ canonical spec. And yeah, the formal name is not URL, it is URI.
+
+## Host
+
+ The host name is usually resolved using DNS or your /etc/hosts file to an IP
+ address and that's what curl will communicate with. Alternatively you specify
+ the IP address directly in the URL instead of a name.
+
+ For development and other trying out situations, you can point to a different
+ IP address for a host name than what would otherwise be used, by using curl's
+ [`--resolve`](https://curl.haxx.se/docs/manpage.html#--resolve) option:
+
+ curl --resolve www.example.org:80:127.0.0.1 http://www.example.org/
+
+## Port number
+
+ Each protocol curl supports operates on a default port number, be it over TCP
+ or in some cases UDP. Normally you don't have to take that into
+ consideration, but at times you run test servers on other ports or
+ similar. Then you can specify the port number in the URL with a colon and a
+ number immediately following the host name. Like when doing HTTP to port
+ 1234:
+
+ curl http://www.example.org:1234/
+
+ The port number you specify in the URL is the number that the server uses to
+ offer its services. Sometimes you may use a local proxy, and then you may
+ need to specify that proxy's port number separately for what curl needs to
+ connect to locally. Like when using a HTTP proxy on port 4321:
+
+ curl --proxy http://proxy.example.org:4321 http://remote.example.org/
+
+## User name and password
+
+ Some services are setup to require HTTP authentication and then you need to
+ provide name and password which is then transferred to the remote site in
+ various ways depending on the exact authentication protocol used.
+
+ You can opt to either insert the user and password in the URL or you can
+ provide them separately:
+
+ curl http://user:password@example.org/
+
+ or
+
+ curl -u user:password http://example.org/
+
+ You need to pay attention that this kind of HTTP authentication is not what
+ is usually done and requested by user-oriented websites these days. They tend
+ to use forms and cookies instead.
+
+## Path part
+
+ The path part is just sent off to the server to request that it sends back
+ the associated response. The path is what is to the right side of the slash
+ that follows the host name and possibly port number.
+
+# Fetch a page
+
+## GET
+
+ The simplest and most common request/operation made using HTTP is to GET a
+ URL. The URL could itself refer to a web page, an image or a file. The client
+ issues a GET request to the server and receives the document it asked for.
+ If you issue the command line
+
+ curl https://curl.haxx.se
+
+ you get a web page returned in your terminal window. The entire HTML document
+ that that URL holds.
+
+ All HTTP replies contain a set of response headers that are normally hidden,
+ use curl's [`--include`](https://curl.haxx.se/docs/manpage.html#-i) (`-i`)
+ option to display them as well as the rest of the document.
+
+## HEAD
+
+ You can ask the remote server for ONLY the headers by using the
+ [`--head`](https://curl.haxx.se/docs/manpage.html#-I) (`-I`) option which
+ will make curl issue a HEAD request. In some special cases servers deny the
+ HEAD method while others still work, which is a particular kind of annoyance.
+
+ The HEAD method is defined and made so that the server returns the headers
+ exactly the way it would do for a GET, but without a body. It means that you
+ may see a `Content-Length:` in the response headers, but there must not be an
+ actual body in the HEAD response.
+
+## Multiple URLs in a single command line
+
+ A single curl command line may involve one or many URLs. The most common case
+ is probably to just use one, but you can specify any amount of URLs. Yes
+ any. No limits. You'll then get requests repeated over and over for all the
+ given URLs.
+
+ Example, send two GETs:
+
+ curl http://url1.example.com http://url2.example.com
+
+ If you use [`--data`](https://curl.haxx.se/docs/manpage.html#-d) to POST to
+ the URL, using multiple URLs means that you send that same POST to all the
+ given URLs.
+
+ Example, send two POSTs:
+
+ curl --data name=curl http://url1.example.com http://url2.example.com
+
+
+## Multiple HTTP methods in a single command line
+
+ Sometimes you need to operate on several URLs in a single command line and do
+ different HTTP methods on each. For this, you'll enjoy the
+ [`--next`](https://curl.haxx.se/docs/manpage.html#-:) option. It is basically
+ a separator that separates a bunch of options from the next. All the URLs
+ before `--next` will get the same method and will get all the POST data
+ merged into one.
+
+ When curl reaches the `--next` on the command line, it'll sort of reset the
+ method and the POST data and allow a new set.
+
+ Perhaps this is best shown with a few examples. To send first a HEAD and then
+ a GET:
+
+ curl -I http://example.com --next http://example.com
+
+ To first send a POST and then a GET:
+
+ curl -d score=10 http://example.com/post.cgi --next http://example.com/results.html
+
+# HTML forms
+
+## Forms explained
+
+ Forms are the general way a website can present a HTML page with fields for
+ the user to enter data in, and then press some kind of 'OK' or 'Submit'
+ button to get that data sent to the server. The server then typically uses
+ the posted data to decide how to act. Like using the entered words to search
+ in a database, or to add the info in a bug tracking system, display the
+ entered address on a map or using the info as a login-prompt verifying that
+ the user is allowed to see what it is about to see.
+
+ Of course there has to be some kind of program on the server end to receive
+ the data you send. You cannot just invent something out of the air.
+
+## GET
+
+ A GET-form uses the method GET, as specified in HTML like:
+
+ <form method="GET" action="junk.cgi">
+ <input type=text name="birthyear">
+ <input type=submit name=press value="OK">
+ </form>
+
+ In your favorite browser, this form will appear with a text box to fill in
+ and a press-button labeled "OK". If you fill in '1905' and press the OK
+ button, your browser will then create a new URL to get for you. The URL will
+ get `junk.cgi?birthyear=1905&press=OK` appended to the path part of the
+ previous URL.
+
+ If the original form was seen on the page `www.example.com/when/birth.html`,
+ the second page you'll get will become
+ `www.example.com/when/junk.cgi?birthyear=1905&press=OK`.
+
+ Most search engines work this way.
+
+ To make curl do the GET form post for you, just enter the expected created
+ URL:
+
+ curl "http://www.example.com/when/junk.cgi?birthyear=1905&press=OK"
+
+## POST
+
+ The GET method makes all input field names get displayed in the URL field of
+ your browser. That's generally a good thing when you want to be able to
+ bookmark that page with your given data, but it is an obvious disadvantage if
+ you entered secret information in one of the fields or if there are a large
+ amount of fields creating a very long and unreadable URL.
+
+ The HTTP protocol then offers the POST method. This way the client sends the
+ data separated from the URL and thus you won't see any of it in the URL
+ address field.
+
+ The form would look very similar to the previous one:
+
+ <form method="POST" action="junk.cgi">
+ <input type=text name="birthyear">
+ <input type=submit name=press value=" OK ">
+ </form>
+
+ And to use curl to post this form with the same data filled in as before, we
+ could do it like:
+
+ curl --data "birthyear=1905&press=%20OK%20" http://www.example.com/when.cgi
+
+ This kind of POST will use the Content-Type
+ `application/x-www-form-urlencoded' and is the most widely used POST kind.
+
+ The data you send to the server MUST already be properly encoded, curl will
+ not do that for you. For example, if you want the data to contain a space,
+ you need to replace that space with %20 etc. Failing to comply with this will
+ most likely cause your data to be received wrongly and messed up.
+
+ Recent curl versions can in fact url-encode POST data for you, like this:
+
+ curl --data-urlencode "name=I am Daniel" http://www.example.com
+
+ If you repeat `--data` several times on the command line, curl will
+ concatenate all the given data pieces - and put a `&` symbol between each
+ data segment.
+
+## File Upload POST
+
+ Back in late 1995 they defined an additional way to post data over HTTP. It
+ is documented in the RFC 1867, why this method sometimes is referred to as
+ RFC1867-posting.
+
+ This method is mainly designed to better support file uploads. A form that
+ allows a user to upload a file could be written like this in HTML:
+
+ <form method="POST" enctype='multipart/form-data' action="upload.cgi">
+ <input type=file name=upload>
+ <input type=submit name=press value="OK">
+ </form>
+
+ This clearly shows that the Content-Type about to be sent is
+ `multipart/form-data`.
+
+ To post to a form like this with curl, you enter a command line like:
+
+ curl --form upload=@localfilename --form press=OK [URL]
+
+## Hidden Fields
+
+ A very common way for HTML based applications to pass state information
+ between pages is to add hidden fields to the forms. Hidden fields are already
+ filled in, they aren't displayed to the user and they get passed along just
+ as all the other fields.
+
+ A similar example form with one visible field, one hidden field and one
+ submit button could look like:
+
+ <form method="POST" action="foobar.cgi">
+ <input type=text name="birthyear">
+ <input type=hidden name="person" value="daniel">
+ <input type=submit name="press" value="OK">
+ </form>
+
+ To POST this with curl, you won't have to think about if the fields are
+ hidden or not. To curl they're all the same:
+
+ curl --data "birthyear=1905&press=OK&person=daniel" [URL]
+
+## Figure Out What A POST Looks Like
+
+ When you're about fill in a form and send to a server by using curl instead
+ of a browser, you're of course very interested in sending a POST exactly the
+ way your browser does.
+
+ An easy way to get to see this, is to save the HTML page with the form on
+ your local disk, modify the 'method' to a GET, and press the submit button
+ (you could also change the action URL if you want to).
+
+ You will then clearly see the data get appended to the URL, separated with a
+ `?`-letter as GET forms are supposed to.
+
+# HTTP upload
+
+## PUT
+
+ Perhaps the best way to upload data to a HTTP server is to use PUT. Then
+ again, this of course requires that someone put a program or script on the
+ server end that knows how to receive a HTTP PUT stream.
+
+ Put a file to a HTTP server with curl:
+
+ curl --upload-file uploadfile http://www.example.com/receive.cgi
+
+# HTTP Authentication
+
+## Basic Authentication
+
+ HTTP Authentication is the ability to tell the server your username and
+ password so that it can verify that you're allowed to do the request you're
+ doing. The Basic authentication used in HTTP (which is the type curl uses by
+ default) is **plain text** based, which means it sends username and password
+ only slightly obfuscated, but still fully readable by anyone that sniffs on
+ the network between you and the remote server.
+
+ To tell curl to use a user and password for authentication:
+
+ curl --user name:password http://www.example.com
+
+## Other Authentication
+
+ The site might require a different authentication method (check the headers
+ returned by the server), and then
+ [`--ntlm`](https://curl.haxx.se/docs/manpage.html#--ntlm),
+ [`--digest`](https://curl.haxx.se/docs/manpage.html#--digest),
+ [`--negotiate`](https://curl.haxx.se/docs/manpage.html#--negotiate) or even
+ [`--anyauth`](https://curl.haxx.se/docs/manpage.html#--anyauth) might be
+ options that suit you.
+
+## Proxy Authentication
+
+ Sometimes your HTTP access is only available through the use of a HTTP
+ proxy. This seems to be especially common at various companies. A HTTP proxy
+ may require its own user and password to allow the client to get through to
+ the Internet. To specify those with curl, run something like:
+
+ curl --proxy-user proxyuser:proxypassword curl.haxx.se
+
+ If your proxy requires the authentication to be done using the NTLM method,
+ use [`--proxy-ntlm`](https://curl.haxx.se/docs/manpage.html#--proxy-ntlm), if
+ it requires Digest use
+ [`--proxy-digest`](https://curl.haxx.se/docs/manpage.html#--proxy-digest).
+
+ If you use any one of these user+password options but leave out the password
+ part, curl will prompt for the password interactively.
+
+## Hiding credentials
+
+ Do note that when a program is run, its parameters might be possible to see
+ when listing the running processes of the system. Thus, other users may be
+ able to watch your passwords if you pass them as plain command line
+ options. There are ways to circumvent this.
+
+ It is worth noting that while this is how HTTP Authentication works, very
+ many websites will not use this concept when they provide logins etc. See the
+ Web Login chapter further below for more details on that.
+
+# More HTTP Headers
+
+## Referer
+
+ A HTTP request may include a 'referer' field (yes it is misspelled), which
+ can be used to tell from which URL the client got to this particular
+ resource. Some programs/scripts check the referer field of requests to verify
+ that this wasn't arriving from an external site or an unknown page. While
+ this is a stupid way to check something so easily forged, many scripts still
+ do it. Using curl, you can put anything you want in the referer-field and
+ thus more easily be able to fool the server into serving your request.
+
+ Use curl to set the referer field with:
+
+ curl --referer http://www.example.come http://www.example.com
+
+## User Agent
+
+ Very similar to the referer field, all HTTP requests may set the User-Agent
+ field. It names what user agent (client) that is being used. Many
+ applications use this information to decide how to display pages. Silly web
+ programmers try to make different pages for users of different browsers to
+ make them look the best possible for their particular browsers. They usually
+ also do different kinds of javascript, vbscript etc.
+
+ At times, you will see that getting a page with curl will not return the same
+ page that you see when getting the page with your browser. Then you know it
+ is time to set the User Agent field to fool the server into thinking you're
+ one of those browsers.
+
+ To make curl look like Internet Explorer 5 on a Windows 2000 box:
+
+ curl --user-agent "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)" [URL]
+
+ Or why not look like you're using Netscape 4.73 on an old Linux box:
+
+ curl --user-agent "Mozilla/4.73 [en] (X11; U; Linux 2.2.15 i686)" [URL]
+
+## Redirects
+
+## Location header
+
+ When a resource is requested from a server, the reply from the server may
+ include a hint about where the browser should go next to find this page, or a
+ new page keeping newly generated output. The header that tells the browser to
+ redirect is `Location:`.
+
+ Curl does not follow `Location:` headers by default, but will simply display
+ such pages in the same manner it displays all HTTP replies. It does however
+ feature an option that will make it attempt to follow the `Location:`
+ pointers.
+
+ To tell curl to follow a Location:
+
+ curl --location http://www.example.com
+
+ If you use curl to POST to a site that immediately redirects you to another
+ page, you can safely use
+ [`--location`](https://curl.haxx.se/docs/manpage.html#-L) (`-L`) and
+ `--data`/`--form` together. curl will only use POST in the first request, and
+ then revert to GET in the following operations.
+
+## Other redirects
+
+ Browser typically support at least two other ways of redirects that curl
+ doesn't: first the html may contain a meta refresh tag that asks the browser
+ to load a specific URL after a set number of seconds, or it may use
+ javascript to do it.
+
+# Cookies
+
+## Cookie Basics
+
+ The way the web browsers do "client side state control" is by using
+ cookies. Cookies are just names with associated contents. The cookies are
+ sent to the client by the server. The server tells the client for what path
+ and host name it wants the cookie sent back, and it also sends an expiration
+ date and a few more properties.
+
+ When a client communicates with a server with a name and path as previously
+ specified in a received cookie, the client sends back the cookies and their
+ contents to the server, unless of course they are expired.
+
+ Many applications and servers use this method to connect a series of requests
+ into a single logical session. To be able to use curl in such occasions, we
+ must be able to record and send back cookies the way the web application
+ expects them. The same way browsers deal with them.
+
+## Cookie options
+
+ The simplest way to send a few cookies to the server when getting a page with
+ curl is to add them on the command line like:
+
+ curl --cookie "name=Daniel" http://www.example.com
+
+ Cookies are sent as common HTTP headers. This is practical as it allows curl
+ to record cookies simply by recording headers. Record cookies with curl by
+ using the [`--dump-header`](https://curl.haxx.se/docs/manpage.html#-D) (`-D`)
+ option like:
+
+ curl --dump-header headers_and_cookies http://www.example.com
+
+ (Take note that the
+ [`--cookie-jar`](https://curl.haxx.se/docs/manpage.html#-c) option described
+ below is a better way to store cookies.)
+
+ Curl has a full blown cookie parsing engine built-in that comes in use if you
+ want to reconnect to a server and use cookies that were stored from a
+ previous connection (or hand-crafted manually to fool the server into
+ believing you had a previous connection). To use previously stored cookies,
+ you run curl like:
+
+ curl --cookie stored_cookies_in_file http://www.example.com
+
+ Curl's "cookie engine" gets enabled when you use the
+ [`--cookie`](https://curl.haxx.se/docs/manpage.html#-b) option. If you only
+ want curl to understand received cookies, use `--cookie` with a file that
+ doesn't exist. Example, if you want to let curl understand cookies from a
+ page and follow a location (and thus possibly send back cookies it received),
+ you can invoke it like:
+
+ curl --cookie nada --location http://www.example.com
+
+ Curl has the ability to read and write cookie files that use the same file
+ format that Netscape and Mozilla once used. It is a convenient way to share
+ cookies between scripts or invokes. The `--cookie` (`-b`) switch
+ automatically detects if a given file is such a cookie file and parses it,
+ and by using the `--cookie-jar` (`-c`) option you'll make curl write a new
+ cookie file at the end of an operation:
+
+ curl --cookie cookies.txt --cookie-jar newcookies.txt \
+ http://www.example.com
+
+# HTTPS
+
+## HTTPS is HTTP secure
+
+ There are a few ways to do secure HTTP transfers. By far the most common
+ protocol for doing this is what is generally known as HTTPS, HTTP over
+ SSL. SSL encrypts all the data that is sent and received over the network and
+ thus makes it harder for attackers to spy on sensitive information.
+
+ SSL (or TLS as the latest version of the standard is called) offers a
+ truckload of advanced features to allow all those encryptions and key
+ infrastructure mechanisms encrypted HTTP requires.
+
+ Curl supports encrypted fetches when built to use a TLS library and it can be
+ built to use one out of a fairly large set of libraries - `curl -V` will show
+ which one your curl was built to use (if any!). To get a page from a HTTPS
+ server, simply run curl like:
+
+ curl https://secure.example.com
+
+## Certificates
+
+ In the HTTPS world, you use certificates to validate that you are the one
+ you claim to be, as an addition to normal passwords. Curl supports client-
+ side certificates. All certificates are locked with a pass phrase, which you
+ need to enter before the certificate can be used by curl. The pass phrase
+ can be specified on the command line or if not, entered interactively when
+ curl queries for it. Use a certificate with curl on a HTTPS server like:
+
+ curl --cert mycert.pem https://secure.example.com
+
+ curl also tries to verify that the server is who it claims to be, by
+ verifying the server's certificate against a locally stored CA cert
+ bundle. Failing the verification will cause curl to deny the connection. You
+ must then use [`--insecure`](https://curl.haxx.se/docs/manpage.html#-k)
+ (`-k`) in case you want to tell curl to ignore that the server can't be
+ verified.
+
+ More about server certificate verification and ca cert bundles can be read in
+ the [SSLCERTS document](https://curl.haxx.se/docs/sslcerts.html).
+
+ At times you may end up with your own CA cert store and then you can tell
+ curl to use that to verify the server's certificate:
+
+ curl --cacert ca-bundle.pem https://example.com/
+
+# Custom Request Elements
+
+## Modify method and headers
+
+ Doing fancy stuff, you may need to add or change elements of a single curl
+ request.
+
+ For example, you can change the POST request to a PROPFIND and send the data
+ as `Content-Type: text/xml` (instead of the default Content-Type) like this:
+
+ curl --data "<xml>" --header "Content-Type: text/xml" \
+ --request PROPFIND example.com
+
+ You can delete a default header by providing one without content. Like you
+ can ruin the request by chopping off the Host: header:
+
+ curl --header "Host:" http://www.example.com
+
+ You can add headers the same way. Your server may want a `Destination:`
+ header, and you can add it:
+
+ curl --header "Destination: http://nowhere" http://example.com
+
+## More on changed methods
+
+ It should be noted that curl selects which methods to use on its own
+ depending on what action to ask for. `-d` will do POST, `-I` will do HEAD and
+ so on. If you use the
+ [`--request`](https://curl.haxx.se/docs/manpage.html#-X) / `-X` option you
+ can change the method keyword curl selects, but you will not modify curl's
+ behavior. This means that if you for example use -d "data" to do a POST, you
+ can modify the method to a `PROPFIND` with `-X` and curl will still think it
+ sends a POST . You can change the normal GET to a POST method by simply
+ adding `-X POST` in a command line like:
+
+ curl -X POST http://example.org/
+
+ ... but curl will still think and act as if it sent a GET so it won't send
+ any request body etc.
+
+# Web Login
+
+## Some login tricks
+
+ While not strictly just HTTP related, it still causes a lot of people
+ problems so here's the executive run-down of how the vast majority of all
+ login forms work and how to login to them using curl.
+
+ It can also be noted that to do this properly in an automated fashion, you
+ will most certainly need to script things and do multiple curl invokes etc.
+
+ First, servers mostly use cookies to track the logged-in status of the
+ client, so you will need to capture the cookies you receive in the
+ responses. Then, many sites also set a special cookie on the login page (to
+ make sure you got there through their login page) so you should make a habit
+ of first getting the login-form page to capture the cookies set there.
+
+ Some web-based login systems feature various amounts of javascript, and
+ sometimes they use such code to set or modify cookie contents. Possibly they
+ do that to prevent programmed logins, like this manual describes how to...
+ Anyway, if reading the code isn't enough to let you repeat the behavior
+ manually, capturing the HTTP requests done by your browsers and analyzing the
+ sent cookies is usually a working method to work out how to shortcut the
+ javascript need.
+
+ In the actual `<form>` tag for the login, lots of sites fill-in
+ random/session or otherwise secretly generated hidden tags and you may need
+ to first capture the HTML code for the login form and extract all the hidden
+ fields to be able to do a proper login POST. Remember that the contents need
+ to be URL encoded when sent in a normal POST.
+
+# Debug
+
+## Some debug tricks
+
+ Many times when you run curl on a site, you'll notice that the site doesn't
+ seem to respond the same way to your curl requests as it does to your
+ browser's.
+
+ Then you need to start making your curl requests more similar to your
+ browser's requests:
+
+ - Use the `--trace-ascii` option to store fully detailed logs of the requests
+ for easier analyzing and better understanding
+
+ - Make sure you check for and use cookies when needed (both reading with
+ `--cookie` and writing with `--cookie-jar`)
+
+ - Set user-agent (with [`-A`](https://curl.haxx.se/docs/manpage.html#-A)) to
+ one like a recent popular browser does
+
+ - Set referer (with [`-E`](https://curl.haxx.se/docs/manpage.html#-E)) like
+ it is set by the browser
+
+ - If you use POST, make sure you send all the fields and in the same order as
+ the browser does it.
+
+## Check what the browsers do
+
+ A very good helper to make sure you do this right, is the web browsers'
+ developers tools that let you view all headers you send and receive (even
+ when using HTTPS).
+
+ A more raw approach is to capture the HTTP traffic on the network with tools
+ such as Wireshark or tcpdump and check what headers that were sent and
+ received by the browser. (HTTPS forces you to use `SSLKEYLOGFILE` to do
+ that.)
diff --git a/docs/cmdline-opts/Makefile.inc b/docs/cmdline-opts/Makefile.inc
index 6a7b953b..792cadb3 100644
--- a/docs/cmdline-opts/Makefile.inc
+++ b/docs/cmdline-opts/Makefile.inc
@@ -41,6 +41,7 @@ DPAGES = \
cookie.d \
create-dirs.d \
crlf.d crlfile.d \
+ curves.d \
data-ascii.d \
data-binary.d \
data-urlencode.d \
@@ -127,6 +128,7 @@ DPAGES = \
ntlm.d ntlm-wb.d \
oauth2-bearer.d \
output.d \
+ output-dir.d \
parallel-immediate.d \
parallel-max.d \
parallel.d \
diff --git a/docs/cmdline-opts/abstract-unix-socket.d b/docs/cmdline-opts/abstract-unix-socket.d
index 1fda4e5d..8403cab9 100644
--- a/docs/cmdline-opts/abstract-unix-socket.d
+++ b/docs/cmdline-opts/abstract-unix-socket.d
@@ -3,6 +3,7 @@ Arg: <path>
Help: Connect via abstract Unix domain socket
Added: 7.53.0
Protocols: HTTP
+Category: connection
---
Connect through an abstract Unix domain socket, instead of using the network.
Note: netstat shows the path of an abstract socket prefixed with '@', however
diff --git a/docs/cmdline-opts/alt-svc.d b/docs/cmdline-opts/alt-svc.d
index 15877a2f..5598b59b 100644
--- a/docs/cmdline-opts/alt-svc.d
+++ b/docs/cmdline-opts/alt-svc.d
@@ -3,6 +3,7 @@ Arg: <file name>
Protocols: HTTPS
Help: Enable alt-svc with this cache file
Added: 7.64.1
+Category: http
---
WARNING: this option is experimental. Do not use in production.
diff --git a/docs/cmdline-opts/anyauth.d b/docs/cmdline-opts/anyauth.d
index c32d1ed5..bec0c0c8 100644
--- a/docs/cmdline-opts/anyauth.d
+++ b/docs/cmdline-opts/anyauth.d
@@ -2,6 +2,7 @@ Long: anyauth
Help: Pick any authentication method
Protocols: HTTP
See-also: proxy-anyauth basic digest
+Category: http proxy auth
---
Tells curl to figure out authentication method by itself, and use the most
secure one the remote site claims to support. This is done by first doing a
diff --git a/docs/cmdline-opts/append.d b/docs/cmdline-opts/append.d
index f001b123..8bdb2594 100644
--- a/docs/cmdline-opts/append.d
+++ b/docs/cmdline-opts/append.d
@@ -2,6 +2,7 @@ Short: a
Long: append
Help: Append to target file when uploading
Protocols: FTP SFTP
+Category: ftp sftp
---
When used in an upload, this makes curl append to the target file instead of
overwriting it. If the remote file doesn't exist, it will be created. Note
diff --git a/docs/cmdline-opts/basic.d b/docs/cmdline-opts/basic.d
index 09d42af9..e222c51c 100644
--- a/docs/cmdline-opts/basic.d
+++ b/docs/cmdline-opts/basic.d
@@ -2,6 +2,7 @@ Long: basic
Help: Use HTTP Basic Authentication
See-also: proxy-basic
Protocols: HTTP
+Category: auth
---
Tells curl to use HTTP Basic authentication with the remote host. This is the
default and this option is usually pointless, unless you use it to override a
diff --git a/docs/cmdline-opts/cacert.d b/docs/cmdline-opts/cacert.d
index 6a567875..793d8c1b 100644
--- a/docs/cmdline-opts/cacert.d
+++ b/docs/cmdline-opts/cacert.d
@@ -2,6 +2,7 @@ Long: cacert
Arg: <file>
Help: CA certificate to verify peer against
Protocols: TLS
+Category: tls
---
Tells curl to use the specified certificate file to verify the peer. The file
may contain multiple CA certificates. The certificate(s) must be in PEM
diff --git a/docs/cmdline-opts/capath.d b/docs/cmdline-opts/capath.d
index 0763f7a0..4ce077a1 100644
--- a/docs/cmdline-opts/capath.d
+++ b/docs/cmdline-opts/capath.d
@@ -2,6 +2,7 @@ Long: capath
Arg: <dir>
Help: CA directory to verify peer against
Protocols: TLS
+Category: tls
---
Tells curl to use the specified certificate directory to verify the
peer. Multiple paths can be provided by separating them with ":" (e.g.
diff --git a/docs/cmdline-opts/cert-status.d b/docs/cmdline-opts/cert-status.d
index f1aaa217..1342b092 100644
--- a/docs/cmdline-opts/cert-status.d
+++ b/docs/cmdline-opts/cert-status.d
@@ -2,6 +2,7 @@ Long: cert-status
Protocols: TLS
Added: 7.41.0
Help: Verify the status of the server certificate
+Category: tls
---
Tells curl to verify the status of the server certificate by using the
Certificate Status Request (aka. OCSP stapling) TLS extension.
diff --git a/docs/cmdline-opts/cert-type.d b/docs/cmdline-opts/cert-type.d
index 1232ec10..b041bcb0 100644
--- a/docs/cmdline-opts/cert-type.d
+++ b/docs/cmdline-opts/cert-type.d
@@ -3,6 +3,7 @@ Protocols: TLS
Arg: <type>
Help: Certificate type (DER/PEM/ENG)
See-also: cert key key-type
+Category: tls
---
Tells curl what type the provided client certificate is using. PEM, DER, ENG
and P12 are recognized types. If not specified, PEM is assumed.
diff --git a/docs/cmdline-opts/cert.d b/docs/cmdline-opts/cert.d
index de6b4206..2938e571 100644
--- a/docs/cmdline-opts/cert.d
+++ b/docs/cmdline-opts/cert.d
@@ -4,6 +4,7 @@ Arg: <certificate[:password]>
Help: Client certificate file and password
Protocols: TLS
See-also: cert-type key key-type
+Category: tls
---
Tells curl to use the specified client certificate file when getting a file
with HTTPS, FTPS or another SSL-based protocol. The certificate must be in
diff --git a/docs/cmdline-opts/ciphers.d b/docs/cmdline-opts/ciphers.d
index 69e85525..ed7438a0 100644
--- a/docs/cmdline-opts/ciphers.d
+++ b/docs/cmdline-opts/ciphers.d
@@ -2,6 +2,7 @@ Long: ciphers
Arg: <list of ciphers>
Help: SSL ciphers to use
Protocols: TLS
+Category: tls
---
Specifies which ciphers to use in the connection. The list of ciphers must
specify valid ciphers. Read up on SSL cipher list details on this URL:
diff --git a/docs/cmdline-opts/compressed-ssh.d b/docs/cmdline-opts/compressed-ssh.d
index 583452ae..849fe18b 100644
--- a/docs/cmdline-opts/compressed-ssh.d
+++ b/docs/cmdline-opts/compressed-ssh.d
@@ -2,6 +2,7 @@ Long: compressed-ssh
Help: Enable SSH compression
Protocols: SCP SFTP
Added: 7.56.0
+Category: scp ssh
---
Enables built-in SSH compression.
This is a request, not an order; the server may or may not do it.
diff --git a/docs/cmdline-opts/compressed.d b/docs/cmdline-opts/compressed.d
index 3aca92c3..26bc1514 100644
--- a/docs/cmdline-opts/compressed.d
+++ b/docs/cmdline-opts/compressed.d
@@ -1,6 +1,7 @@
Long: compressed
Help: Request compressed response
Protocols: HTTP
+Category: http
---
Request a compressed response using one of the algorithms curl supports, and
automatically decompress the content. Headers are not modified.
diff --git a/docs/cmdline-opts/config.d b/docs/cmdline-opts/config.d
index df3d3922..26346799 100644
--- a/docs/cmdline-opts/config.d
+++ b/docs/cmdline-opts/config.d
@@ -2,6 +2,7 @@ Long: config
Arg: <file>
Help: Read config from a file
Short: K
+Category: curl
---
Specify a text file to read curl arguments from. The command line arguments
@@ -34,13 +35,19 @@ When curl is invoked, it (unless --disable is used) checks for a default
config file and uses it if found. The default config file is checked for in
the following places in this order:
-1) curl tries to find the "home dir": It first checks for the CURL_HOME and
-then the HOME environment variables. Failing that, it uses getpwuid() on
-Unix-like systems (which returns the home dir given the current user in your
-system). On Windows, it then checks for the APPDATA variable, or as a last
-resort the '%USERPROFILE%\\Application Data'.
+1) Use the CURL_HOME environment variable if set
-2) On windows, if there is no .curlrc file in the home dir, it checks for one
+2) Use the XDG_CONFIG_HOME environment variable if set (Added in 7.73.0)
+
+3) Use the HOME environment variable if set
+
+4) Non-windows: use getpwuid to find the home directory
+
+5) Windows: use APPDATA if set
+
+6) Windows: use "USERPROFILE\Application Data" if set
+
+7) On windows, if there is no .curlrc file in the home dir, it checks for one
in the same dir the curl executable is placed. On Unix-like systems, it will
simply try to load .curlrc from the determined home dir.
diff --git a/docs/cmdline-opts/connect-timeout.d b/docs/cmdline-opts/connect-timeout.d
index 3a32d868..fa327722 100644
--- a/docs/cmdline-opts/connect-timeout.d
+++ b/docs/cmdline-opts/connect-timeout.d
@@ -2,6 +2,7 @@ Long: connect-timeout
Arg: <seconds>
Help: Maximum time allowed for connection
See-also: max-time
+Category: connection
---
Maximum time in seconds that you allow curl's connection to take. This only
limits the connection phase, so if curl connects within the given period it
diff --git a/docs/cmdline-opts/connect-to.d b/docs/cmdline-opts/connect-to.d
index 458bfe85..2f015f8a 100644
--- a/docs/cmdline-opts/connect-to.d
+++ b/docs/cmdline-opts/connect-to.d
@@ -3,6 +3,7 @@ Arg: <HOST1:PORT1:HOST2:PORT2>
Help: Connect to host
Added: 7.49.0
See-also: resolve header
+Category: connection
---
For a request to the given HOST1:PORT1 pair, connect to HOST2:PORT2 instead.
diff --git a/docs/cmdline-opts/continue-at.d b/docs/cmdline-opts/continue-at.d
index 733f4941..c44d2f49 100644
--- a/docs/cmdline-opts/continue-at.d
+++ b/docs/cmdline-opts/continue-at.d
@@ -3,6 +3,7 @@ Long: continue-at
Arg: <offset>
Help: Resumed transfer offset
See-also: range
+Category: connection
---
Continue/Resume a previous file transfer at the given offset. The given offset
is the exact number of bytes that will be skipped, counting from the beginning
diff --git a/docs/cmdline-opts/cookie-jar.d b/docs/cmdline-opts/cookie-jar.d
index da79777e..f11991f4 100644
--- a/docs/cmdline-opts/cookie-jar.d
+++ b/docs/cmdline-opts/cookie-jar.d
@@ -3,6 +3,7 @@ Long: cookie-jar
Arg: <filename>
Protocols: HTTP
Help: Write cookies to <filename> after operation
+Category: http
---
Specify to which file you want curl to write all cookies after a completed
operation. Curl writes all cookies from its in-memory cookie storage to the
diff --git a/docs/cmdline-opts/cookie.d b/docs/cmdline-opts/cookie.d
index 467e0566..5d2c9d78 100644
--- a/docs/cmdline-opts/cookie.d
+++ b/docs/cmdline-opts/cookie.d
@@ -3,6 +3,7 @@ Long: cookie
Arg: <data|filename>
Protocols: HTTP
Help: Send cookies from string/file
+Category: http
---
Pass the data to the HTTP server in the Cookie header. It is supposedly
the data previously received from the server in a "Set-Cookie:" line. The
diff --git a/docs/cmdline-opts/create-dirs.d b/docs/cmdline-opts/create-dirs.d
index b09d96ca..48a8fd46 100644
--- a/docs/cmdline-opts/create-dirs.d
+++ b/docs/cmdline-opts/create-dirs.d
@@ -1,5 +1,6 @@
Long: create-dirs
Help: Create necessary local directory hierarchy
+Category: curl
---
When used in conjunction with the --output option, curl will create the
necessary local directory hierarchy as needed. This option creates the dirs
diff --git a/docs/cmdline-opts/crlf.d b/docs/cmdline-opts/crlf.d
index f6694b65..50c4bef8 100644
--- a/docs/cmdline-opts/crlf.d
+++ b/docs/cmdline-opts/crlf.d
@@ -1,6 +1,7 @@
Long: crlf
Help: Convert LF to CRLF in upload
Protocols: FTP SMTP
+Category: ftp smtp
---
Convert LF to CRLF in upload. Useful for MVS (OS/390).
diff --git a/docs/cmdline-opts/crlfile.d b/docs/cmdline-opts/crlfile.d
index 0fcc63c8..360e668d 100644
--- a/docs/cmdline-opts/crlfile.d
+++ b/docs/cmdline-opts/crlfile.d
@@ -3,6 +3,7 @@ Arg: <file>
Protocols: TLS
Help: Get a CRL list in PEM format from the given file
Added: 7.19.7
+Category: tls
---
Provide a file using PEM format with a Certificate Revocation List that may
specify peer certificates that are to be considered revoked.
diff --git a/docs/cmdline-opts/curves.d b/docs/cmdline-opts/curves.d
new file mode 100644
index 00000000..47870a27
--- /dev/null
+++ b/docs/cmdline-opts/curves.d
@@ -0,0 +1,18 @@
+Long: curves
+Arg: <algorithm list>
+Help: (EC) TLS key exchange algorithm(s) to request
+Protocols: TLS
+Added: 7.73.0
+Category: tls
+---
+Tells curl to request specific curves to use during SSL session establishment
+according to RFC 8422, 5.1. Multiple algorithms can be provided by separating
+them with ":" (e.g. "X25519:P-521"). The parameter is available identically
+in the "openssl s_client/s_server" utilities.
+
+--curves allows a OpenSSL powered curl to make SSL-connections with exactly
+the (EC) curve requested by the client, avoiding intransparent client/server
+negotiations.
+
+If this option is set, the default curves list built into openssl will be
+ignored.
diff --git a/docs/cmdline-opts/data-ascii.d b/docs/cmdline-opts/data-ascii.d
index bda4abc3..3522f634 100644
--- a/docs/cmdline-opts/data-ascii.d
+++ b/docs/cmdline-opts/data-ascii.d
@@ -2,5 +2,6 @@ Long: data-ascii
Arg: <data>
Help: HTTP POST ASCII data
Protocols: HTTP
+Category: http post upload
---
This is just an alias for --data.
diff --git a/docs/cmdline-opts/data-binary.d b/docs/cmdline-opts/data-binary.d
index 3f6ff2db..c40785ec 100644
--- a/docs/cmdline-opts/data-binary.d
+++ b/docs/cmdline-opts/data-binary.d
@@ -2,6 +2,7 @@ Long: data-binary
Arg: <data>
Help: HTTP POST binary data
Protocols: HTTP
+Category: http post upload
---
This posts data exactly as specified with no extra processing whatsoever.
diff --git a/docs/cmdline-opts/data-raw.d b/docs/cmdline-opts/data-raw.d
index 7669b4ab..4db83aef 100644
--- a/docs/cmdline-opts/data-raw.d
+++ b/docs/cmdline-opts/data-raw.d
@@ -4,6 +4,7 @@ Protocols: HTTP
Help: HTTP POST data, '@' allowed
Added: 7.43.0
See-also: data
+Category: http post upload
---
This posts data similarly to --data but without the special
interpretation of the @ character.
diff --git a/docs/cmdline-opts/data-urlencode.d b/docs/cmdline-opts/data-urlencode.d
index 9873f335..2f2a3645 100644
--- a/docs/cmdline-opts/data-urlencode.d
+++ b/docs/cmdline-opts/data-urlencode.d
@@ -4,6 +4,7 @@ Help: HTTP POST data url encoded
Protocols: HTTP
See-also: data data-raw
Added: 7.18.0
+Category: http post upload
---
This posts data, similar to the other --data options with the exception
that this performs URL-encoding.
diff --git a/docs/cmdline-opts/data.d b/docs/cmdline-opts/data.d
index 280d38bc..53ba86b3 100644
--- a/docs/cmdline-opts/data.d
+++ b/docs/cmdline-opts/data.d
@@ -5,6 +5,7 @@ Help: HTTP POST data
Protocols: HTTP MQTT
See-also: data-binary data-urlencode data-raw
Mutexed: form head upload-file
+Category: important http post upload
---
Sends the specified data in a POST request to the HTTP server, in the same way
that a browser does when a user has filled in an HTML form and presses the
diff --git a/docs/cmdline-opts/delegation.d b/docs/cmdline-opts/delegation.d
index 138d8233..fa2795f9 100644
--- a/docs/cmdline-opts/delegation.d
+++ b/docs/cmdline-opts/delegation.d
@@ -2,6 +2,7 @@ Long: delegation
Arg: <LEVEL>
Help: GSS-API delegation permission
Protocols: GSS/kerberos
+Category: auth
---
Set LEVEL to tell the server what it is allowed to delegate when it
comes to user credentials.
diff --git a/docs/cmdline-opts/digest.d b/docs/cmdline-opts/digest.d
index 5cdd9258..da8c01e2 100644
--- a/docs/cmdline-opts/digest.d
+++ b/docs/cmdline-opts/digest.d
@@ -3,6 +3,7 @@ Help: Use HTTP Digest Authentication
Protocols: HTTP
Mutexed: basic ntlm negotiate
See-also: user proxy-digest anyauth
+Category: proxy auth http
---
Enables HTTP Digest authentication. This is an authentication scheme that
prevents the password from being sent over the wire in clear text. Use this in
diff --git a/docs/cmdline-opts/disable-eprt.d b/docs/cmdline-opts/disable-eprt.d
index a1e53c0b..ffcf684e 100644
--- a/docs/cmdline-opts/disable-eprt.d
+++ b/docs/cmdline-opts/disable-eprt.d
@@ -1,6 +1,7 @@
Long: disable-eprt
Help: Inhibit using EPRT or LPRT
Protocols: FTP
+Category: ftp
---
Tell curl to disable the use of the EPRT and LPRT commands when doing active
FTP transfers. Curl will normally always first attempt to use EPRT, then LPRT
diff --git a/docs/cmdline-opts/disable-epsv.d b/docs/cmdline-opts/disable-epsv.d
index 6d2cb708..df1de830 100644
--- a/docs/cmdline-opts/disable-epsv.d
+++ b/docs/cmdline-opts/disable-epsv.d
@@ -1,6 +1,7 @@
Long: disable-epsv
Help: Inhibit using EPSV
Protocols: FTP
+Category: ftp
---
(FTP) Tell curl to disable the use of the EPSV command when doing passive FTP
transfers. Curl will normally always first attempt to use EPSV before PASV,
diff --git a/docs/cmdline-opts/disable.d b/docs/cmdline-opts/disable.d
index 20b27b4c..688fc0c5 100644
--- a/docs/cmdline-opts/disable.d
+++ b/docs/cmdline-opts/disable.d
@@ -1,6 +1,7 @@
Long: disable
Short: q
Help: Disable .curlrc
+Category: curl
---
If used as the first parameter on the command line, the \fIcurlrc\fP config
file will not be read and used. See the --config for details on the default
diff --git a/docs/cmdline-opts/disallow-username-in-url.d b/docs/cmdline-opts/disallow-username-in-url.d
index a7f46ea1..e124f675 100644
--- a/docs/cmdline-opts/disallow-username-in-url.d
+++ b/docs/cmdline-opts/disallow-username-in-url.d
@@ -3,5 +3,6 @@ Help: Disallow username in url
Protocols: HTTP
Added: 7.61.0
See-also: proto
+Category: curl http
---
This tells curl to exit if passed a url containing a username.
diff --git a/docs/cmdline-opts/dns-interface.d b/docs/cmdline-opts/dns-interface.d
index 45e5af26..3cb818ae 100644
--- a/docs/cmdline-opts/dns-interface.d
+++ b/docs/cmdline-opts/dns-interface.d
@@ -5,6 +5,7 @@ Protocols: DNS
See-also: dns-ipv4-addr dns-ipv6-addr
Added: 7.33.0
Requires: c-ares
+Category: dns
---
Tell curl to send outgoing DNS requests through <interface>. This option is a
counterpart to --interface (which does not affect DNS). The supplied string
diff --git a/docs/cmdline-opts/dns-ipv4-addr.d b/docs/cmdline-opts/dns-ipv4-addr.d
index 597b8588..5ebdda5c 100644
--- a/docs/cmdline-opts/dns-ipv4-addr.d
+++ b/docs/cmdline-opts/dns-ipv4-addr.d
@@ -5,6 +5,7 @@ Protocols: DNS
See-also: dns-interface dns-ipv6-addr
Added: 7.33.0
Requires: c-ares
+Category: dns
---
Tell curl to bind to <ip-address> when making IPv4 DNS requests, so that
the DNS requests originate from this address. The argument should be a
diff --git a/docs/cmdline-opts/dns-ipv6-addr.d b/docs/cmdline-opts/dns-ipv6-addr.d
index 581f0195..10e80764 100644
--- a/docs/cmdline-opts/dns-ipv6-addr.d
+++ b/docs/cmdline-opts/dns-ipv6-addr.d
@@ -5,6 +5,7 @@ Protocols: DNS
See-also: dns-interface dns-ipv4-addr
Added: 7.33.0
Requires: c-ares
+Category: dns
---
Tell curl to bind to <ip-address> when making IPv6 DNS requests, so that
the DNS requests originate from this address. The argument should be a
diff --git a/docs/cmdline-opts/dns-servers.d b/docs/cmdline-opts/dns-servers.d
index a98fd07d..8665426a 100644
--- a/docs/cmdline-opts/dns-servers.d
+++ b/docs/cmdline-opts/dns-servers.d
@@ -3,6 +3,7 @@ Arg: <addresses>
Help: DNS server addrs to use
Requires: c-ares
Added: 7.33.0
+Category: dns
---
Set the list of DNS servers to be used instead of the system default.
The list of IP addresses should be separated with commas. Port numbers
diff --git a/docs/cmdline-opts/doh-url.d b/docs/cmdline-opts/doh-url.d
index c871c4d2..7fce4460 100644
--- a/docs/cmdline-opts/doh-url.d
+++ b/docs/cmdline-opts/doh-url.d
@@ -3,6 +3,7 @@ Arg: <URL>
Help: Resolve host names over DOH
Protocols: all
Added: 7.62.0
+Category: dns
---
Specifies which DNS-over-HTTPS (DOH) server to use to resolve hostnames,
instead of using the default name resolver mechanism. The URL must be HTTPS.
diff --git a/docs/cmdline-opts/dump-header.d b/docs/cmdline-opts/dump-header.d
index 33c6674e..8449dfe8 100644
--- a/docs/cmdline-opts/dump-header.d
+++ b/docs/cmdline-opts/dump-header.d
@@ -4,6 +4,7 @@ Arg: <filename>
Help: Write the received headers to <filename>
Protocols: HTTP FTP
See-also: output
+Category: http ftp
---
Write the received protocol headers to the specified file.
diff --git a/docs/cmdline-opts/egd-file.d b/docs/cmdline-opts/egd-file.d
index c22790f6..05ede9ad 100644
--- a/docs/cmdline-opts/egd-file.d
+++ b/docs/cmdline-opts/egd-file.d
@@ -3,6 +3,7 @@ Arg: <file>
Help: EGD socket path for random data
Protocols: TLS
See-also: random-file
+Category: tls
---
Specify the path name to the Entropy Gathering Daemon socket. The socket is
used to seed the random engine for SSL connections.
diff --git a/docs/cmdline-opts/engine.d b/docs/cmdline-opts/engine.d
index cde1a477..9ed0cf1b 100644
--- a/docs/cmdline-opts/engine.d
+++ b/docs/cmdline-opts/engine.d
@@ -2,6 +2,7 @@ Long: engine
Arg: <name>
Help: Crypto engine to use
Protocols: TLS
+Category: tls
---
Select the OpenSSL crypto engine to use for cipher operations. Use --engine
list to print a list of build-time supported engines. Note that not all (or
diff --git a/docs/cmdline-opts/etag-compare.d b/docs/cmdline-opts/etag-compare.d
index 1a698a8f..cbf48ac5 100644
--- a/docs/cmdline-opts/etag-compare.d
+++ b/docs/cmdline-opts/etag-compare.d
@@ -3,6 +3,7 @@ Arg: <file>
Help: Pass an ETag from a file as a custom header
Protocols: HTTP
Added: 7.68.0
+Category: http
---
This option makes a conditional HTTP request for the specific
ETag read from the given file by sending a custom If-None-Match
diff --git a/docs/cmdline-opts/etag-save.d b/docs/cmdline-opts/etag-save.d
index 214723ff..82e6dfa8 100644
--- a/docs/cmdline-opts/etag-save.d
+++ b/docs/cmdline-opts/etag-save.d
@@ -3,6 +3,7 @@ Arg: <file>
Help: Parse ETag from a request and save it to a file
Protocols: HTTP
Added: 7.68.0
+Category: http
---
This option saves an HTTP ETag to the specified file. Etag is
usually part of headers returned by a request. When server sends an
diff --git a/docs/cmdline-opts/expect100-timeout.d b/docs/cmdline-opts/expect100-timeout.d
index c88f0b84..431a529c 100644
--- a/docs/cmdline-opts/expect100-timeout.d
+++ b/docs/cmdline-opts/expect100-timeout.d
@@ -4,6 +4,7 @@ Help: How long to wait for 100-continue
Protocols: HTTP
Added: 7.47.0
See-also: connect-timeout
+Category: http
---
Maximum time in seconds that you allow curl to wait for a 100-continue
response when curl emits an Expects: 100-continue header in its request. By
diff --git a/docs/cmdline-opts/fail-early.d b/docs/cmdline-opts/fail-early.d
index 375d4c91..3fbe238a 100644
--- a/docs/cmdline-opts/fail-early.d
+++ b/docs/cmdline-opts/fail-early.d
@@ -1,6 +1,7 @@
Long: fail-early
Help: Fail on first transfer error, do not continue
Added: 7.52.0
+Category: curl
---
Fail and exit on the first detected transfer error.
diff --git a/docs/cmdline-opts/fail.d b/docs/cmdline-opts/fail.d
index c46c571b..7fc76fb6 100644
--- a/docs/cmdline-opts/fail.d
+++ b/docs/cmdline-opts/fail.d
@@ -2,6 +2,7 @@ Long: fail
Short: f
Protocols: HTTP
Help: Fail silently (no output at all) on HTTP errors
+Category: important http
---
Fail silently (no output at all) on server errors. This is mostly done to
better enable scripts etc to better deal with failed attempts. In normal cases
diff --git a/docs/cmdline-opts/false-start.d b/docs/cmdline-opts/false-start.d
index 65a8afb8..abeff0eb 100644
--- a/docs/cmdline-opts/false-start.d
+++ b/docs/cmdline-opts/false-start.d
@@ -2,6 +2,7 @@ Long: false-start
Help: Enable TLS False Start
Protocols: TLS
Added: 7.42.0
+Category: tls
---
Tells curl to use false start during the TLS handshake. False start is a mode
where a TLS client will start sending application data before verifying the
diff --git a/docs/cmdline-opts/form-string.d b/docs/cmdline-opts/form-string.d
index 49d0d44e..04d2578c 100644
--- a/docs/cmdline-opts/form-string.d
+++ b/docs/cmdline-opts/form-string.d
@@ -3,6 +3,7 @@ Help: Specify multipart MIME data
Protocols: HTTP SMTP IMAP
Arg: <name=string>
See-also: form
+Category: http upload
---
Similar to --form except that the value string for the named parameter is used
literally. Leading \&'@' and \&'<' characters, and the \&';type=' string in
diff --git a/docs/cmdline-opts/form.d b/docs/cmdline-opts/form.d
index 7f1aa31c..3cd8dce7 100644
--- a/docs/cmdline-opts/form.d
+++ b/docs/cmdline-opts/form.d
@@ -4,6 +4,7 @@ Arg: <name=content>
Help: Specify multipart MIME data
Protocols: HTTP SMTP IMAP
Mutexed: data head upload-file
+Category: http upload
---
For HTTP protocol family, this lets curl emulate a filled-in form in which a
user has pressed the submit button. This causes curl to POST data using the
diff --git a/docs/cmdline-opts/ftp-account.d b/docs/cmdline-opts/ftp-account.d
index 013c4f37..bc04ba04 100644
--- a/docs/cmdline-opts/ftp-account.d
+++ b/docs/cmdline-opts/ftp-account.d
@@ -3,6 +3,7 @@ Arg: <data>
Help: Account data string
Protocols: FTP
Added: 7.13.0
+Category: ftp auth
---
When an FTP server asks for "account data" after user name and password has
been provided, this data is sent off using the ACCT command.
diff --git a/docs/cmdline-opts/ftp-alternative-to-user.d b/docs/cmdline-opts/ftp-alternative-to-user.d
index 8982ba8b..17148490 100644
--- a/docs/cmdline-opts/ftp-alternative-to-user.d
+++ b/docs/cmdline-opts/ftp-alternative-to-user.d
@@ -3,6 +3,7 @@ Arg: <command>
Help: String to replace USER [name]
Protocols: FTP
Added: 7.15.5
+Category: ftp
---
If authenticating with the USER and PASS commands fails, send this command.
When connecting to Tumbleweed's Secure Transport server over FTPS using a
diff --git a/docs/cmdline-opts/ftp-create-dirs.d b/docs/cmdline-opts/ftp-create-dirs.d
index ede57100..5d9dfda4 100644
--- a/docs/cmdline-opts/ftp-create-dirs.d
+++ b/docs/cmdline-opts/ftp-create-dirs.d
@@ -2,6 +2,7 @@ Long: ftp-create-dirs
Protocols: FTP SFTP
Help: Create the remote dirs if not present
See-also: create-dirs
+Category: ftp sftp curl
---
When an FTP or SFTP URL/operation uses a path that doesn't currently exist on
the server, the standard behavior of curl is to fail. Using this option, curl
diff --git a/docs/cmdline-opts/ftp-method.d b/docs/cmdline-opts/ftp-method.d
index 95aa522e..149340b8 100644
--- a/docs/cmdline-opts/ftp-method.d
+++ b/docs/cmdline-opts/ftp-method.d
@@ -3,6 +3,7 @@ Arg: <method>
Help: Control CWD usage
Protocols: FTP
Added: 7.15.1
+Category: ftp
---
Control what method curl should use to reach a file on an FTP(S)
server. The method argument should be one of the following alternatives:
diff --git a/docs/cmdline-opts/ftp-pasv.d b/docs/cmdline-opts/ftp-pasv.d
index 44103e21..cbd548de 100644
--- a/docs/cmdline-opts/ftp-pasv.d
+++ b/docs/cmdline-opts/ftp-pasv.d
@@ -3,6 +3,7 @@ Help: Use PASV/EPSV instead of PORT
Protocols: FTP
Added: 7.11.0
See-also: disable-epsv
+Category: ftp
---
Use passive mode for the data connection. Passive is the internal default
behavior, but using this option can be used to override a previous --ftp-port
diff --git a/docs/cmdline-opts/ftp-port.d b/docs/cmdline-opts/ftp-port.d
index e4b14560..9bb1d43f 100644
--- a/docs/cmdline-opts/ftp-port.d
+++ b/docs/cmdline-opts/ftp-port.d
@@ -4,6 +4,7 @@ Help: Use PORT instead of PASV
Short: P
Protocols: FTP
See-also: ftp-pasv disable-eprt
+Category: ftp
---
Reverses the default initiator/listener roles when connecting with FTP. This
option makes curl use active mode. curl then tells the server to connect back
diff --git a/docs/cmdline-opts/ftp-pret.d b/docs/cmdline-opts/ftp-pret.d
index dac4c353..e9c7d251 100644
--- a/docs/cmdline-opts/ftp-pret.d
+++ b/docs/cmdline-opts/ftp-pret.d
@@ -2,6 +2,7 @@ Long: ftp-pret
Help: Send PRET before PASV
Protocols: FTP
Added: 7.20.0
+Category: ftp
---
Tell curl to send a PRET command before PASV (and EPSV). Certain FTP servers,
mainly drftpd, require this non-standard command for directory listings as
diff --git a/docs/cmdline-opts/ftp-skip-pasv-ip.d b/docs/cmdline-opts/ftp-skip-pasv-ip.d
index da6ab11f..d6fd4589 100644
--- a/docs/cmdline-opts/ftp-skip-pasv-ip.d
+++ b/docs/cmdline-opts/ftp-skip-pasv-ip.d
@@ -3,6 +3,7 @@ Help: Skip the IP address for PASV
Protocols: FTP
Added: 7.14.2
See-also: ftp-pasv
+Category: ftp
---
Tell curl to not use the IP address the server suggests in its response
to curl's PASV command when curl connects the data connection. Instead curl
diff --git a/docs/cmdline-opts/ftp-ssl-ccc-mode.d b/docs/cmdline-opts/ftp-ssl-ccc-mode.d
index be102949..6289e544 100644
--- a/docs/cmdline-opts/ftp-ssl-ccc-mode.d
+++ b/docs/cmdline-opts/ftp-ssl-ccc-mode.d
@@ -4,6 +4,7 @@ Help: Set CCC mode
Protocols: FTP
Added: 7.16.2
See-also: ftp-ssl-ccc
+Category: ftp tls
---
Sets the CCC mode. The passive mode will not initiate the shutdown, but
instead wait for the server to do it, and will not reply to the shutdown from
diff --git a/docs/cmdline-opts/ftp-ssl-ccc.d b/docs/cmdline-opts/ftp-ssl-ccc.d
index c6edc5b3..33cab430 100644
--- a/docs/cmdline-opts/ftp-ssl-ccc.d
+++ b/docs/cmdline-opts/ftp-ssl-ccc.d
@@ -3,6 +3,7 @@ Help: Send CCC after authenticating
Protocols: FTP
See-also: ssl ftp-ssl-ccc-mode
Added: 7.16.1
+Category: ftp tls
---
Use CCC (Clear Command Channel) Shuts down the SSL/TLS layer after
authenticating. The rest of the control channel communication will be
diff --git a/docs/cmdline-opts/ftp-ssl-control.d b/docs/cmdline-opts/ftp-ssl-control.d
index 87a82253..5191353d 100644
--- a/docs/cmdline-opts/ftp-ssl-control.d
+++ b/docs/cmdline-opts/ftp-ssl-control.d
@@ -2,6 +2,7 @@ Long: ftp-ssl-control
Help: Require SSL/TLS for FTP login, clear for transfer
Protocols: FTP
Added: 7.16.0
+Category: ftp tls
---
Require SSL/TLS for the FTP login, clear for transfer. Allows secure
authentication, but non-encrypted data transfers for efficiency. Fails the
diff --git a/docs/cmdline-opts/gen.pl b/docs/cmdline-opts/gen.pl
index b7a924e8..3fec1646 100755
--- a/docs/cmdline-opts/gen.pl
+++ b/docs/cmdline-opts/gen.pl
@@ -43,6 +43,7 @@ my %helplong;
my %arglong;
my %redirlong;
my %protolong;
+my %catlong;
# get the long name version, return the man page string
sub manpageify {
@@ -126,6 +127,7 @@ sub single {
my $arg;
my $mutexed;
my $requires;
+ my $category;
my $seealso;
my $magic; # cmdline special option
while(<F>) {
@@ -159,6 +161,9 @@ sub single {
elsif(/^Requires: *(.*)/i) {
$requires=$1;
}
+ elsif(/^Category: *(.*)/i) {
+ $category=$1;
+ }
elsif(/^Help: *(.*)/i) {
;
}
@@ -166,6 +171,9 @@ sub single {
if(!$long) {
print STDERR "WARN: no 'Long:' in $f\n";
}
+ if(!$category) {
+ print STDERR "WARN: no 'Category:' in $f\n";
+ }
last;
}
else {
@@ -216,12 +224,24 @@ sub single {
if($seealso) {
my @m=split(/ /, $seealso);
my $mstr;
+ my $and = 0;
+ my $num = scalar(@m);
+ if($num > 2) {
+ # use commas up to this point
+ $and = $num - 1;
+ }
+ my $i = 0;
for my $k (@m) {
if(!$helplong{$k}) {
print STDERR "WARN: $f see-alsos a non-existing option: $k\n";
}
my $l = manpageify($k);
- $mstr .= sprintf "%s$l", $mstr?" and ":"";
+ my $sep = " and";
+ if($and && ($i < $and)) {
+ $sep = ",";
+ }
+ $mstr .= sprintf "%s$l", $mstr?"$sep ":"";
+ $i++;
}
push @foot, seealso($standalone, $mstr);
}
@@ -262,6 +282,7 @@ sub getshortlong {
my $help;
my $arg;
my $protocols;
+ my $category;
while(<F>) {
if(/^Short: (.)/i) {
$short=$1;
@@ -278,6 +299,9 @@ sub getshortlong {
elsif(/^Protocols: (.*)/i) {
$protocols=$1;
}
+ elsif(/^Category: (.*)/i) {
+ $category=$1;
+ }
elsif(/^---/) {
last;
}
@@ -291,6 +315,7 @@ sub getshortlong {
$helplong{$long}=$help;
$arglong{$long}=$arg;
$protolong{$long}=$protocols;
+ $catlong{$long}=$category;
}
}
@@ -316,6 +341,8 @@ sub listhelp {
foreach my $f (sort keys %helplong) {
my $long = $f;
my $short = $optlong{$long};
+ my @categories = split ' ', $catlong{$long};
+ my $bitmask;
my $opt;
if(defined($short) && $long) {
@@ -324,7 +351,13 @@ sub listhelp {
elsif($long && !$short) {
$opt = " --$long";
}
-
+ for my $i (0 .. $#categories) {
+ $bitmask .= 'CURLHELP_' . uc $categories[$i];
+ # If not last element, append |
+ if($i < $#categories) {
+ $bitmask .= ' | ';
+ }
+ }
my $arg = $arglong{$long};
if($arg) {
$opt .= " $arg";
@@ -332,7 +365,7 @@ sub listhelp {
my $desc = $helplong{$f};
$desc =~ s/\"/\\\"/g; # escape double quotes
- my $line = sprintf " {\"%s\",\n \"%s\"},\n", $opt, $desc;
+ my $line = sprintf " {\"%s\",\n \"%s\",\n %s},\n", $opt, $desc, $bitmask;
if(length($opt) + length($desc) > 78) {
print STDERR "WARN: the --$long line is too long\n";
@@ -341,6 +374,25 @@ sub listhelp {
}
}
+sub listcats {
+ my %allcats;
+ foreach my $f (sort keys %helplong) {
+ my @categories = split ' ', $catlong{$f};
+ foreach (@categories) {
+ $allcats{$_} = undef;
+ }
+ }
+ my @categories;
+ foreach my $key (keys %allcats) {
+ push @categories, $key;
+ }
+ @categories = sort @categories;
+ unshift @categories, 'hidden';
+ for my $i (0..$#categories) {
+ print '#define ' . 'CURLHELP_' . uc($categories[$i]) . ' ' . "1u << " . $i . "u\n";
+ }
+}
+
sub mainpage {
my (@files) = @_;
# show the page header
@@ -394,8 +446,12 @@ sub getargs {
showprotocols();
return;
}
+ elsif($f eq "listcats") {
+ listcats();
+ return;
+ }
- print "Usage: gen.pl <mainpage/listhelp/single FILE/protos> [files]\n";
+ print "Usage: gen.pl <mainpage/listhelp/single FILE/protos/listcats> [files]\n";
}
#------------------------------------------------------------------------
diff --git a/docs/cmdline-opts/get.d b/docs/cmdline-opts/get.d
index be7cb25f..d529bb4e 100644
--- a/docs/cmdline-opts/get.d
+++ b/docs/cmdline-opts/get.d
@@ -1,6 +1,7 @@
Long: get
Short: G
Help: Put the post data in the URL and use GET
+Category: http upload
---
When used, this option will make all data specified with --data, --data-binary
or --data-urlencode to be used in an HTTP GET request instead of the POST
diff --git a/docs/cmdline-opts/globoff.d b/docs/cmdline-opts/globoff.d
index fff6516b..4b5f30de 100644
--- a/docs/cmdline-opts/globoff.d
+++ b/docs/cmdline-opts/globoff.d
@@ -1,6 +1,7 @@
Long: globoff
Short: g
Help: Disable URL sequences and ranges using {} and []
+Category: curl
---
This option switches off the "URL globbing parser". When you set this option,
you can specify URLs that contain the letters {}[] without having them being
diff --git a/docs/cmdline-opts/happy-eyeballs-timeout-ms.d b/docs/cmdline-opts/happy-eyeballs-timeout-ms.d
index 611a8f1d..ceff2a7d 100644
--- a/docs/cmdline-opts/happy-eyeballs-timeout-ms.d
+++ b/docs/cmdline-opts/happy-eyeballs-timeout-ms.d
@@ -2,6 +2,7 @@ Long: happy-eyeballs-timeout-ms
Arg: <milliseconds>
Help: Time for IPv6 before trying IPv4
Added: 7.59.0
+Category: connection
---
Happy eyeballs is an algorithm that attempts to connect to both IPv4 and IPv6
addresses for dual-stack hosts, preferring IPv6 first for the number of
diff --git a/docs/cmdline-opts/haproxy-protocol.d b/docs/cmdline-opts/haproxy-protocol.d
index cc41c9c4..83582046 100644
--- a/docs/cmdline-opts/haproxy-protocol.d
+++ b/docs/cmdline-opts/haproxy-protocol.d
@@ -2,6 +2,7 @@ Long: haproxy-protocol
Help: Send HAProxy PROXY protocol v1 header
Protocols: HTTP
Added: 7.60.0
+Category: http proxy
---
Send a HAProxy PROXY protocol v1 header at the beginning of the connection. This
is used by some load balancers and reverse proxies to indicate the client's
diff --git a/docs/cmdline-opts/head.d b/docs/cmdline-opts/head.d
index 350a100f..6fe46851 100644
--- a/docs/cmdline-opts/head.d
+++ b/docs/cmdline-opts/head.d
@@ -2,6 +2,7 @@ Long: head
Short: I
Help: Show document info only
Protocols: HTTP FTP FILE
+Category: http ftp file
---
Fetch the headers only! HTTP-servers feature the command HEAD which this uses
to get nothing but the header of a document. When used on an FTP or FILE file,
diff --git a/docs/cmdline-opts/header.d b/docs/cmdline-opts/header.d
index d8292ed7..e8416899 100644
--- a/docs/cmdline-opts/header.d
+++ b/docs/cmdline-opts/header.d
@@ -3,6 +3,7 @@ Short: H
Arg: <header/@file>
Help: Pass custom header(s) to server
Protocols: HTTP
+Category: http
---
Extra header to include in the request when sending HTTP to a server. You may
specify any number of extra headers. Note that if you should add a custom
diff --git a/docs/cmdline-opts/help.d b/docs/cmdline-opts/help.d
index 64aa696d..bf80b781 100644
--- a/docs/cmdline-opts/help.d
+++ b/docs/cmdline-opts/help.d
@@ -1,6 +1,12 @@
Long: help
+Arg: <category>
Short: h
-Help: This help text
+Help: Get help for commands
+Category: important curl
---
-Usage help. This lists all current command line options with a short
-description.
+Usage help. This lists all commands of the <category>.
+If no arg was provided, curl will display the most important
+command line arguments and the list of categories.
+If the argument "all" was provided, curl will display all options available.
+If the argument "category" was provided, curl will display all categories and
+their meanings.
diff --git a/docs/cmdline-opts/hostpubmd5.d b/docs/cmdline-opts/hostpubmd5.d
index a8511580..c926ed8b 100644
--- a/docs/cmdline-opts/hostpubmd5.d
+++ b/docs/cmdline-opts/hostpubmd5.d
@@ -3,6 +3,7 @@ Arg: <md5>
Help: Acceptable MD5 hash of the host public key
Protocols: SFTP SCP
Added: 7.17.1
+Category: sftp scp
---
Pass a string containing 32 hexadecimal digits. The string should
be the 128 bit MD5 checksum of the remote host's public key, curl will refuse
diff --git a/docs/cmdline-opts/http0.9.d b/docs/cmdline-opts/http0.9.d
index 7e783f69..954c22a1 100644
--- a/docs/cmdline-opts/http0.9.d
+++ b/docs/cmdline-opts/http0.9.d
@@ -3,6 +3,7 @@ Tags: Versions
Protocols: HTTP
Added:
Help: Allow HTTP 0.9 responses
+Category: http
---
Tells curl to be fine with HTTP version 0.9 response.
diff --git a/docs/cmdline-opts/http1.0.d b/docs/cmdline-opts/http1.0.d
index d9bbd76f..a4059dbf 100644
--- a/docs/cmdline-opts/http1.0.d
+++ b/docs/cmdline-opts/http1.0.d
@@ -5,6 +5,7 @@ Protocols: HTTP
Added:
Mutexed: http1.1 http2
Help: Use HTTP 1.0
+Category: http
---
Tells curl to use HTTP version 1.0 instead of using its internally preferred
HTTP version.
diff --git a/docs/cmdline-opts/http1.1.d b/docs/cmdline-opts/http1.1.d
index f1e6b5c3..a71a40ba 100644
--- a/docs/cmdline-opts/http1.1.d
+++ b/docs/cmdline-opts/http1.1.d
@@ -4,5 +4,6 @@ Protocols: HTTP
Added: 7.33.0
Mutexed: http1.0 http2
Help: Use HTTP 1.1
+Category: http
---
Tells curl to use HTTP version 1.1.
diff --git a/docs/cmdline-opts/http2-prior-knowledge.d b/docs/cmdline-opts/http2-prior-knowledge.d
index f793f775..ea2906ed 100644
--- a/docs/cmdline-opts/http2-prior-knowledge.d
+++ b/docs/cmdline-opts/http2-prior-knowledge.d
@@ -5,6 +5,7 @@ Added: 7.49.0
Mutexed: http1.1 http1.0 http2
Requires: HTTP/2
Help: Use HTTP 2 without HTTP/1.1 Upgrade
+Category: http
---
Tells curl to issue its non-TLS HTTP requests using HTTP/2 without HTTP/1.1
Upgrade. It requires prior knowledge that the server supports HTTP/2 straight
diff --git a/docs/cmdline-opts/http2.d b/docs/cmdline-opts/http2.d
index cf8f2988..197515ee 100644
--- a/docs/cmdline-opts/http2.d
+++ b/docs/cmdline-opts/http2.d
@@ -7,5 +7,6 @@ Requires: HTTP/2
See-also: no-alpn
Help: Use HTTP 2
See-also: http1.1 http3
+Category: http
---
Tells curl to use HTTP version 2.
diff --git a/docs/cmdline-opts/http3.d b/docs/cmdline-opts/http3.d
index 8265937a..478b662a 100644
--- a/docs/cmdline-opts/http3.d
+++ b/docs/cmdline-opts/http3.d
@@ -6,6 +6,7 @@ Mutexed: http1.1 http1.0 http2 http2-prior-knowledge
Requires: HTTP/3
Help: Use HTTP v3
See-also: http1.1 http2
+Category: http
---
WARNING: this option is experimental. Do not use in production.
diff --git a/docs/cmdline-opts/ignore-content-length.d b/docs/cmdline-opts/ignore-content-length.d
index 53524f51..82ac5da0 100644
--- a/docs/cmdline-opts/ignore-content-length.d
+++ b/docs/cmdline-opts/ignore-content-length.d
@@ -1,6 +1,7 @@
Long: ignore-content-length
Help: Ignore the size of the remote resource
Protocols: FTP HTTP
+Category: http ftp
---
For HTTP, Ignore the Content-Length header. This is particularly useful for
servers running Apache 1.x, which will report incorrect Content-Length for
diff --git a/docs/cmdline-opts/include.d b/docs/cmdline-opts/include.d
index 9d282dd1..250d4acc 100644
--- a/docs/cmdline-opts/include.d
+++ b/docs/cmdline-opts/include.d
@@ -2,6 +2,7 @@ Long: include
Short: i
Help: Include protocol response headers in the output
See-also: verbose
+Category: important verbose
---
Include the HTTP response headers in the output. The HTTP response headers can
include things like server name, cookies, date of the document, HTTP version
diff --git a/docs/cmdline-opts/insecure.d b/docs/cmdline-opts/insecure.d
index 49b0a432..35f4a2e0 100644
--- a/docs/cmdline-opts/insecure.d
+++ b/docs/cmdline-opts/insecure.d
@@ -3,6 +3,7 @@ Short: k
Help: Allow insecure server connections when using SSL
Protocols: TLS
See-also: proxy-insecure cacert
+Category: tls
---
By default, every SSL connection curl makes is verified to be secure. This
diff --git a/docs/cmdline-opts/interface.d b/docs/cmdline-opts/interface.d
index 65827fb8..196e7efa 100644
--- a/docs/cmdline-opts/interface.d
+++ b/docs/cmdline-opts/interface.d
@@ -2,6 +2,7 @@ Long: interface
Arg: <name>
Help: Use network INTERFACE (or address)
See-also: dns-interface
+Category: connection
---
Perform an operation using a specified interface. You can enter interface
diff --git a/docs/cmdline-opts/ipv4.d b/docs/cmdline-opts/ipv4.d
index 9c40c8c3..a6691376 100644
--- a/docs/cmdline-opts/ipv4.d
+++ b/docs/cmdline-opts/ipv4.d
@@ -7,6 +7,7 @@ Mutexed: ipv6
Requires:
See-also: http1.1 http2
Help: Resolve names to IPv4 addresses
+Category: connection dns
---
This option tells curl to resolve names to IPv4 addresses only, and not for
example try IPv6.
diff --git a/docs/cmdline-opts/ipv6.d b/docs/cmdline-opts/ipv6.d
index 6eef6dd0..ce0415ca 100644
--- a/docs/cmdline-opts/ipv6.d
+++ b/docs/cmdline-opts/ipv6.d
@@ -7,6 +7,7 @@ Mutexed: ipv4
Requires:
See-also: http1.1 http2
Help: Resolve names to IPv6 addresses
+Category: connection dns
---
This option tells curl to resolve names to IPv6 addresses only, and not for
example try IPv4.
diff --git a/docs/cmdline-opts/junk-session-cookies.d b/docs/cmdline-opts/junk-session-cookies.d
index 40ccd9c2..993b77fa 100644
--- a/docs/cmdline-opts/junk-session-cookies.d
+++ b/docs/cmdline-opts/junk-session-cookies.d
@@ -3,6 +3,7 @@ Short: j
Help: Ignore session cookies read from file
Protocols: HTTP
See-also: cookie cookie-jar
+Category: http
---
When curl is told to read cookies from a given file, this option will make it
discard all "session cookies". This will basically have the same effect as if
diff --git a/docs/cmdline-opts/keepalive-time.d b/docs/cmdline-opts/keepalive-time.d
index c816e13f..41261535 100644
--- a/docs/cmdline-opts/keepalive-time.d
+++ b/docs/cmdline-opts/keepalive-time.d
@@ -2,6 +2,7 @@ Long: keepalive-time
Arg: <seconds>
Help: Interval time for keepalive probes
Added: 7.18.0
+Category: connection
---
This option sets the time a connection needs to remain idle before sending
keepalive probes and the time between individual keepalive probes. It is
diff --git a/docs/cmdline-opts/key-type.d b/docs/cmdline-opts/key-type.d
index bf39bcd3..50a06867 100644
--- a/docs/cmdline-opts/key-type.d
+++ b/docs/cmdline-opts/key-type.d
@@ -2,6 +2,7 @@ Long: key-type
Arg: <type>
Help: Private key file type (DER/PEM/ENG)
Protocols: TLS
+Category: tls
---
Private key file type. Specify which type your --key provided private key
is. DER, PEM, and ENG are supported. If not specified, PEM is assumed.
diff --git a/docs/cmdline-opts/key.d b/docs/cmdline-opts/key.d
index 855e2f7b..a762e6fa 100644
--- a/docs/cmdline-opts/key.d
+++ b/docs/cmdline-opts/key.d
@@ -2,6 +2,7 @@ Long: key
Arg: <key>
Protocols: TLS SSH
Help: Private key file name
+Category: tls ssh
---
Private key file name. Allows you to provide your private key in this separate
file. For SSH, if not specified, curl tries the following candidates in order:
diff --git a/docs/cmdline-opts/krb.d b/docs/cmdline-opts/krb.d
index 19547af0..7759cfb0 100644
--- a/docs/cmdline-opts/krb.d
+++ b/docs/cmdline-opts/krb.d
@@ -3,6 +3,7 @@ Arg: <level>
Help: Enable Kerberos with security <level>
Protocols: FTP
Requires: Kerberos
+Category: ftp
---
Enable Kerberos authentication and use. The level must be entered and should
be one of 'clear', 'safe', 'confidential', or 'private'. Should you use a
diff --git a/docs/cmdline-opts/libcurl.d b/docs/cmdline-opts/libcurl.d
index ef132fe7..eb9850c6 100644
--- a/docs/cmdline-opts/libcurl.d
+++ b/docs/cmdline-opts/libcurl.d
@@ -2,6 +2,7 @@ Long: libcurl
Arg: <file>
Help: Dump libcurl equivalent code of this command line
Added: 7.16.1
+Category: curl
---
Append this option to any ordinary curl command line, and you will get a
libcurl-using C source code written to the file that does the equivalent
diff --git a/docs/cmdline-opts/limit-rate.d b/docs/cmdline-opts/limit-rate.d
index 06c456e3..cb3a8607 100644
--- a/docs/cmdline-opts/limit-rate.d
+++ b/docs/cmdline-opts/limit-rate.d
@@ -1,6 +1,7 @@
Long: limit-rate
Arg: <speed>
Help: Limit transfer speed to RATE
+Category: connection
---
Specify the maximum transfer rate you want curl to use - for both downloads
and uploads. This feature is useful if you have a limited pipe and you'd like
diff --git a/docs/cmdline-opts/list-only.d b/docs/cmdline-opts/list-only.d
index 63b2851f..c6988580 100644
--- a/docs/cmdline-opts/list-only.d
+++ b/docs/cmdline-opts/list-only.d
@@ -3,6 +3,7 @@ Short: l
Protocols: FTP POP3
Help: List only mode
Added: 4.0
+Category: ftp pop3
---
(FTP)
When listing an FTP directory, this switch forces a name-only view. This is
diff --git a/docs/cmdline-opts/local-port.d b/docs/cmdline-opts/local-port.d
index d96b46eb..3f7a0e02 100644
--- a/docs/cmdline-opts/local-port.d
+++ b/docs/cmdline-opts/local-port.d
@@ -2,6 +2,7 @@ Long: local-port
Arg: <num/range>
Help: Force use of RANGE for local port numbers
Added: 7.15.2
+Category: connection
---
Set a preferred single number or range (FROM-TO) of local port numbers to use
for the connection(s). Note that port numbers by nature are a scarce resource
diff --git a/docs/cmdline-opts/location-trusted.d b/docs/cmdline-opts/location-trusted.d
index 995a8718..f01d842b 100644
--- a/docs/cmdline-opts/location-trusted.d
+++ b/docs/cmdline-opts/location-trusted.d
@@ -2,6 +2,7 @@ Long: location-trusted
Help: Like --location, and send auth to other hosts
Protocols: HTTP
See-also: user
+Category: http auth
---
Like --location, but will allow sending the name + password to all hosts that
the site may redirect to. This may or may not introduce a security breach if
diff --git a/docs/cmdline-opts/location.d b/docs/cmdline-opts/location.d
index b5ba1f4f..c70b2eba 100644
--- a/docs/cmdline-opts/location.d
+++ b/docs/cmdline-opts/location.d
@@ -2,6 +2,7 @@ Long: location
Short: L
Help: Follow redirects
Protocols: HTTP
+Category: http
---
If the server reports that the requested page has moved to a different
location (indicated with a Location: header and a 3XX response code), this
diff --git a/docs/cmdline-opts/login-options.d b/docs/cmdline-opts/login-options.d
index 8bad0511..887d5d51 100644
--- a/docs/cmdline-opts/login-options.d
+++ b/docs/cmdline-opts/login-options.d
@@ -3,6 +3,7 @@ Arg: <options>
Protocols: IMAP POP3 SMTP
Help: Server login options
Added: 7.34.0
+Category: imap pop3 smtp auth
---
Specify the login options to use during server authentication.
diff --git a/docs/cmdline-opts/mail-auth.d b/docs/cmdline-opts/mail-auth.d
index 70cf0eda..52999716 100644
--- a/docs/cmdline-opts/mail-auth.d
+++ b/docs/cmdline-opts/mail-auth.d
@@ -4,6 +4,7 @@ Protocols: SMTP
Help: Originator address of the original email
Added: 7.25.0
See-also: mail-rcpt mail-from
+Category: smtp
---
Specify a single address. This will be used to specify the authentication
address (identity) of a submitted message that is being relayed to another
diff --git a/docs/cmdline-opts/mail-from.d b/docs/cmdline-opts/mail-from.d
index 1d932344..faf48e2a 100644
--- a/docs/cmdline-opts/mail-from.d
+++ b/docs/cmdline-opts/mail-from.d
@@ -4,5 +4,6 @@ Help: Mail from this address
Protocols: SMTP
Added: 7.20.0
See-also: mail-rcpt mail-auth
+Category: smtp
---
Specify a single address that the given mail should get sent from.
diff --git a/docs/cmdline-opts/mail-rcpt-allowfails.d b/docs/cmdline-opts/mail-rcpt-allowfails.d
index b5723df3..76457c32 100644
--- a/docs/cmdline-opts/mail-rcpt-allowfails.d
+++ b/docs/cmdline-opts/mail-rcpt-allowfails.d
@@ -2,6 +2,7 @@ Long: mail-rcpt-allowfails
Help: Allow RCPT TO command to fail for some recipients
Protocols: SMTP
Added: 7.69.0
+Category: smtp
---
When sending data to multiple recipients, by default curl will abort SMTP
conversation if at least one of the recipients causes RCPT TO command to
diff --git a/docs/cmdline-opts/mail-rcpt.d b/docs/cmdline-opts/mail-rcpt.d
index 0a2859b6..d8ae046e 100644
--- a/docs/cmdline-opts/mail-rcpt.d
+++ b/docs/cmdline-opts/mail-rcpt.d
@@ -3,6 +3,7 @@ Arg: <address>
Help: Mail to this address
Protocols: SMTP
Added: 7.20.0
+Category: smtp
---
Specify a single address, user name or mailing list name. Repeat this
option several times to send to multiple recipients.
diff --git a/docs/cmdline-opts/manual.d b/docs/cmdline-opts/manual.d
index a9dbb0c7..25ed08dd 100644
--- a/docs/cmdline-opts/manual.d
+++ b/docs/cmdline-opts/manual.d
@@ -1,5 +1,6 @@
Long: manual
Short: M
Help: Display the full manual
+Category: curl
---
Manual. Display the huge help text.
diff --git a/docs/cmdline-opts/max-filesize.d b/docs/cmdline-opts/max-filesize.d
index 50d5266e..1f6bdc66 100644
--- a/docs/cmdline-opts/max-filesize.d
+++ b/docs/cmdline-opts/max-filesize.d
@@ -2,6 +2,7 @@ Long: max-filesize
Arg: <bytes>
Help: Maximum file size to download
See-also: limit-rate
+Category: connection
---
Specify the maximum size (in bytes) of a file to download. If the file
requested is larger than this value, the transfer will not start and curl will
diff --git a/docs/cmdline-opts/max-redirs.d b/docs/cmdline-opts/max-redirs.d
index a97860a8..ba16c43f 100644
--- a/docs/cmdline-opts/max-redirs.d
+++ b/docs/cmdline-opts/max-redirs.d
@@ -2,6 +2,7 @@ Long: max-redirs
Arg: <num>
Help: Maximum number of redirects allowed
Protocols: HTTP
+Category: http
---
Set maximum number of redirection-followings allowed. When --location is used,
is used to prevent curl from following redirections too much. By default, the
diff --git a/docs/cmdline-opts/max-time.d b/docs/cmdline-opts/max-time.d
index 0057f9d0..c4e4ed7e 100644
--- a/docs/cmdline-opts/max-time.d
+++ b/docs/cmdline-opts/max-time.d
@@ -3,6 +3,7 @@ Short: m
Arg: <seconds>
Help: Maximum time allowed for the transfer
See-also: connect-timeout
+Category: connection
---
Maximum time in seconds that you allow the whole operation to take. This is
useful for preventing your batch jobs from hanging for hours due to slow
diff --git a/docs/cmdline-opts/metalink.d b/docs/cmdline-opts/metalink.d
index 81fc8bc7..88376643 100644
--- a/docs/cmdline-opts/metalink.d
+++ b/docs/cmdline-opts/metalink.d
@@ -2,6 +2,7 @@ Long: metalink
Help: Process given URLs as metalink XML file
Added: 7.27.0
Requires: metalink
+Category: misc
---
This option can tell curl to parse and process a given URI as Metalink file
(both version 3 and 4 (RFC 5854) are supported) and make use of the mirrors
diff --git a/docs/cmdline-opts/negotiate.d b/docs/cmdline-opts/negotiate.d
index 69a6b917..e247bfbe 100644
--- a/docs/cmdline-opts/negotiate.d
+++ b/docs/cmdline-opts/negotiate.d
@@ -2,6 +2,7 @@ Long: negotiate
Help: Use HTTP Negotiate (SPNEGO) authentication
Protocols: HTTP
See-also: basic ntlm anyauth proxy-negotiate
+Category: auth http
---
Enables Negotiate (SPNEGO) authentication.
diff --git a/docs/cmdline-opts/netrc-file.d b/docs/cmdline-opts/netrc-file.d
index 50126d25..95fb2654 100644
--- a/docs/cmdline-opts/netrc-file.d
+++ b/docs/cmdline-opts/netrc-file.d
@@ -3,6 +3,7 @@ Help: Specify FILE for netrc
Arg: <filename>
Added: 7.21.5
Mutexed: netrc
+Category: curl
---
This option is similar to --netrc, except that you provide the path (absolute
or relative) to the netrc file that curl should use. You can only specify one
diff --git a/docs/cmdline-opts/netrc-optional.d b/docs/cmdline-opts/netrc-optional.d
index c2854030..fa92032b 100644
--- a/docs/cmdline-opts/netrc-optional.d
+++ b/docs/cmdline-opts/netrc-optional.d
@@ -2,6 +2,7 @@ Long: netrc-optional
Help: Use either .netrc or URL
Mutexed: netrc
See-also: netrc-file
+Category: curl
---
Very similar to --netrc, but this option makes the .netrc usage \fBoptional\fP
and not mandatory as the --netrc option does.
diff --git a/docs/cmdline-opts/netrc.d b/docs/cmdline-opts/netrc.d
index 2df26782..6aac568a 100644
--- a/docs/cmdline-opts/netrc.d
+++ b/docs/cmdline-opts/netrc.d
@@ -1,6 +1,7 @@
Long: netrc
Short: n
Help: Must read .netrc for user name and password
+Category: curl
---
Makes curl scan the \fI.netrc\fP (\fI_netrc\fP on Windows) file in the user's
home directory for login name and password. This is typically used for FTP on
diff --git a/docs/cmdline-opts/next.d b/docs/cmdline-opts/next.d
index 1d1e70a3..1adcc753 100644
--- a/docs/cmdline-opts/next.d
+++ b/docs/cmdline-opts/next.d
@@ -5,6 +5,7 @@ Protocols:
Added: 7.36.0
Magic: divider
Help: Make next URL use its separate set of options
+Category: curl
---
Tells curl to use a separate operation for the following URL and associated
options. This allows you to send several URL requests, each with their own
diff --git a/docs/cmdline-opts/no-alpn.d b/docs/cmdline-opts/no-alpn.d
index 88abb836..8031b4f0 100644
--- a/docs/cmdline-opts/no-alpn.d
+++ b/docs/cmdline-opts/no-alpn.d
@@ -5,6 +5,7 @@ Added: 7.36.0
See-also: no-npn http2
Requires: TLS
Help: Disable the ALPN TLS extension
+Category: tls http
---
Disable the ALPN TLS extension. ALPN is enabled by default if libcurl was built
with an SSL library that supports ALPN. ALPN is used by a libcurl that supports
diff --git a/docs/cmdline-opts/no-buffer.d b/docs/cmdline-opts/no-buffer.d
index 65a6282f..1079f471 100644
--- a/docs/cmdline-opts/no-buffer.d
+++ b/docs/cmdline-opts/no-buffer.d
@@ -1,6 +1,7 @@
Long: no-buffer
Short: N
Help: Disable buffering of the output stream
+Category: curl
---
Disables the buffering of the output stream. In normal work situations, curl
will use a standard buffered output stream that will have the effect that it
diff --git a/docs/cmdline-opts/no-keepalive.d b/docs/cmdline-opts/no-keepalive.d
index 8fb28a03..72f3bc9a 100644
--- a/docs/cmdline-opts/no-keepalive.d
+++ b/docs/cmdline-opts/no-keepalive.d
@@ -1,5 +1,6 @@
Long: no-keepalive
Help: Disable TCP keepalive on the connection
+Category: connection
---
Disables the use of keepalive messages on the TCP connection. curl otherwise
enables them by default.
diff --git a/docs/cmdline-opts/no-npn.d b/docs/cmdline-opts/no-npn.d
index ab0f6de2..27e5974b 100644
--- a/docs/cmdline-opts/no-npn.d
+++ b/docs/cmdline-opts/no-npn.d
@@ -6,6 +6,7 @@ Mutexed:
See-also: no-alpn http2
Requires: TLS
Help: Disable the NPN TLS extension
+Category: tls http
---
Disable the NPN TLS extension. NPN is enabled by default if libcurl was built
with an SSL library that supports NPN. NPN is used by a libcurl that supports
diff --git a/docs/cmdline-opts/no-progress-meter.d b/docs/cmdline-opts/no-progress-meter.d
index aff0717d..bf28d635 100644
--- a/docs/cmdline-opts/no-progress-meter.d
+++ b/docs/cmdline-opts/no-progress-meter.d
@@ -2,6 +2,7 @@ Long: no-progress-meter
Help: Do not show the progress meter
See-also: verbose silent
Added: 7.67.0
+Category: verbose
---
Option to switch off the progress meter output without muting or otherwise
affecting warning and informational messages like --silent does.
diff --git a/docs/cmdline-opts/no-sessionid.d b/docs/cmdline-opts/no-sessionid.d
index 397a1586..013ca4cb 100644
--- a/docs/cmdline-opts/no-sessionid.d
+++ b/docs/cmdline-opts/no-sessionid.d
@@ -2,6 +2,7 @@ Long: no-sessionid
Help: Disable SSL session-ID reusing
Protocols: TLS
Added: 7.16.0
+Category: tls
---
Disable curl's use of SSL session-ID caching. By default all transfers are
done using the cache. Note that while nothing should ever get hurt by
diff --git a/docs/cmdline-opts/noproxy.d b/docs/cmdline-opts/noproxy.d
index a216e75f..12ce6d3e 100644
--- a/docs/cmdline-opts/noproxy.d
+++ b/docs/cmdline-opts/noproxy.d
@@ -2,6 +2,7 @@ Long: noproxy
Arg: <no-proxy-list>
Help: List of hosts which do not use proxy
Added: 7.19.4
+Category: proxy
---
Comma-separated list of hosts which do not use a proxy, if one is specified.
The only wildcard is a single * character, which matches all hosts, and
diff --git a/docs/cmdline-opts/ntlm-wb.d b/docs/cmdline-opts/ntlm-wb.d
index 7b933840..4a2f7e1e 100644
--- a/docs/cmdline-opts/ntlm-wb.d
+++ b/docs/cmdline-opts/ntlm-wb.d
@@ -2,6 +2,7 @@ Long: ntlm-wb
Help: Use HTTP NTLM authentication with winbind
Protocols: HTTP
See-also: ntlm proxy-ntlm
+Category: auth http
---
Enables NTLM much in the style --ntlm does, but hand over the authentication
to the separate binary ntlmauth application that is executed when needed.
diff --git a/docs/cmdline-opts/ntlm.d b/docs/cmdline-opts/ntlm.d
index baaa1d53..c63c086e 100644
--- a/docs/cmdline-opts/ntlm.d
+++ b/docs/cmdline-opts/ntlm.d
@@ -4,6 +4,7 @@ Mutexed: basic negotiate digest anyauth
See-also: proxy-ntlm
Protocols: HTTP
Requires: TLS
+Category: auth http
---
Enables NTLM authentication. The NTLM authentication method was designed by
Microsoft and is used by IIS web servers. It is a proprietary protocol,
diff --git a/docs/cmdline-opts/oauth2-bearer.d b/docs/cmdline-opts/oauth2-bearer.d
index 30466e57..e0ea210e 100644
--- a/docs/cmdline-opts/oauth2-bearer.d
+++ b/docs/cmdline-opts/oauth2-bearer.d
@@ -2,6 +2,7 @@ Long: oauth2-bearer
Help: OAuth 2 Bearer Token
Arg: <token>
Protocols: IMAP POP3 SMTP HTTP
+Category: auth
---
Specify the Bearer Token for OAUTH 2.0 server authentication. The Bearer Token
is used in conjunction with the user name which can be specified as part of
diff --git a/docs/cmdline-opts/output-dir.d b/docs/cmdline-opts/output-dir.d
new file mode 100644
index 00000000..d2ff7738
--- /dev/null
+++ b/docs/cmdline-opts/output-dir.d
@@ -0,0 +1,19 @@
+Long: output-dir
+Arg: <dir>
+Help: Directory to save files in
+Added: 7.73.0
+See-also: remote-name remote-header-name
+Category: curl
+---
+
+This option specifies the directory in which files should be stored, when
+--remote-name or --output are used.
+
+The given output directory is used for all URLs and output options on the
+command line, up until the first --next.
+
+If the specified target directory doesn't exist, the operation will fail
+unless --create-dirs is also used.
+
+If this option is used multiple times, the last specified directory will be
+used.
diff --git a/docs/cmdline-opts/output.d b/docs/cmdline-opts/output.d
index f310c267..bf35bf4a 100644
--- a/docs/cmdline-opts/output.d
+++ b/docs/cmdline-opts/output.d
@@ -3,6 +3,7 @@ Arg: <file>
Short: o
Help: Write to file instead of stdout
See-also: remote-name remote-name-all remote-header-name
+Category: important curl
---
Write output to <file> instead of stdout. If you are using {} or [] to fetch
multiple documents, you should quote the URL and you can use '#' followed by a
diff --git a/docs/cmdline-opts/page-footer b/docs/cmdline-opts/page-footer
index 2a65b84f..479c712a 100644
--- a/docs/cmdline-opts/page-footer
+++ b/docs/cmdline-opts/page-footer
@@ -36,11 +36,15 @@ accesses the target URL through the proxy.
The list of host names can also be include numerical IP addresses, and IPv6
versions should then be given without enclosing brackets.
+
+IPv6 numerical addresses are compared as strings, so they will only match if
+the representations are the same: "::1" is the same as "::0:1" but they don't
+match.
.IP "CURL_SSL_BACKEND <TLS backend>"
If curl was built with support for "MultiSSL", meaning that it has built-in
support for more than one TLS backend, this environment variable can be set to
the case insensitive name of the particular backend to use when curl is
-invokved. Setting a name that isn't a built-in alternative, will make curl
+invoked. Setting a name that isn't a built-in alternative, will make curl
stay with the default.
.IP "QLOGDIR <directory name>"
If curl was built with HTTP/3 support, setting this environment variable to a
diff --git a/docs/cmdline-opts/parallel-immediate.d b/docs/cmdline-opts/parallel-immediate.d
index 34393108..95c8afc4 100644
--- a/docs/cmdline-opts/parallel-immediate.d
+++ b/docs/cmdline-opts/parallel-immediate.d
@@ -2,6 +2,7 @@ Long: parallel-immediate
Help: Do not wait for multiplexing (with --parallel)
Added: 7.68.0
See-also: parallel parallel-max
+Category: connection curl
---
When doing parallel transfers, this option will instruct curl that it should
rather prefer opening up more connections in parallel at once rather than
diff --git a/docs/cmdline-opts/parallel-max.d b/docs/cmdline-opts/parallel-max.d
index a8c79c74..d49aeb7a 100644
--- a/docs/cmdline-opts/parallel-max.d
+++ b/docs/cmdline-opts/parallel-max.d
@@ -2,6 +2,7 @@ Long: parallel-max
Help: Maximum concurrency for parallel transfers
Added: 7.66.0
See-also: parallel
+Category: connection curl
---
When asked to do parallel transfers, using --parallel, this option controls
the maximum amount of transfers to do simultaneously.
diff --git a/docs/cmdline-opts/parallel.d b/docs/cmdline-opts/parallel.d
index fac84e62..d6b4affe 100644
--- a/docs/cmdline-opts/parallel.d
+++ b/docs/cmdline-opts/parallel.d
@@ -2,6 +2,7 @@ Short: Z
Long: parallel
Help: Perform transfers in parallel
Added: 7.66.0
+Category: connection curl
---
Makes curl perform its transfers in parallel as compared to the regular serial
manner.
diff --git a/docs/cmdline-opts/pass.d b/docs/cmdline-opts/pass.d
index 2639cb9d..f6633d24 100644
--- a/docs/cmdline-opts/pass.d
+++ b/docs/cmdline-opts/pass.d
@@ -2,6 +2,7 @@ Long: pass
Arg: <phrase>
Help: Pass phrase for the private key
Protocols: SSH TLS
+Category: ssh tls auth
---
Passphrase for the private key
diff --git a/docs/cmdline-opts/path-as-is.d b/docs/cmdline-opts/path-as-is.d
index 946e2f07..0bfaf663 100644
--- a/docs/cmdline-opts/path-as-is.d
+++ b/docs/cmdline-opts/path-as-is.d
@@ -1,6 +1,7 @@
Long: path-as-is
Help: Do not squash .. sequences in URL path
Added: 7.42.0
+Category: curl
---
Tell curl to not handle sequences of /../ or /./ in the given URL
path. Normally curl will squash or merge them according to standards but with
diff --git a/docs/cmdline-opts/pinnedpubkey.d b/docs/cmdline-opts/pinnedpubkey.d
index cd21911f..617252c6 100644
--- a/docs/cmdline-opts/pinnedpubkey.d
+++ b/docs/cmdline-opts/pinnedpubkey.d
@@ -2,6 +2,7 @@ Long: pinnedpubkey
Arg: <hashes>
Help: FILE/HASHES Public key to verify peer against
Protocols: TLS
+Category: tls
---
Tells curl to use the specified public key file (or hashes) to verify the
peer. This can be a path to a file which contains a single public key in PEM
diff --git a/docs/cmdline-opts/post301.d b/docs/cmdline-opts/post301.d
index 87a9fe7e..9cc2ad01 100644
--- a/docs/cmdline-opts/post301.d
+++ b/docs/cmdline-opts/post301.d
@@ -3,6 +3,7 @@ Help: Do not switch to GET after following a 301
Protocols: HTTP
See-also: post302 post303 location
Added: 7.17.1
+Category: http post
---
Tells curl to respect RFC 7231/6.4.2 and not convert POST requests into GET
requests when following a 301 redirection. The non-RFC behaviour is ubiquitous
diff --git a/docs/cmdline-opts/post302.d b/docs/cmdline-opts/post302.d
index caf0d87f..02749032 100644
--- a/docs/cmdline-opts/post302.d
+++ b/docs/cmdline-opts/post302.d
@@ -3,6 +3,7 @@ Help: Do not switch to GET after following a 302
Protocols: HTTP
See-also: post301 post303 location
Added: 7.19.1
+Category: http post
---
Tells curl to respect RFC 7231/6.4.3 and not convert POST requests into GET
requests when following a 302 redirection. The non-RFC behaviour is ubiquitous
diff --git a/docs/cmdline-opts/post303.d b/docs/cmdline-opts/post303.d
index 44f39e61..1a67e13e 100644
--- a/docs/cmdline-opts/post303.d
+++ b/docs/cmdline-opts/post303.d
@@ -3,6 +3,7 @@ Help: Do not switch to GET after following a 303
Protocols: HTTP
See-also: post302 post301 location
Added: 7.26.0
+Category: http post
---
Tells curl to violate RFC 7231/6.4.4 and not convert POST requests into GET
requests when following 303 redirections. A server may require a POST to
diff --git a/docs/cmdline-opts/preproxy.d b/docs/cmdline-opts/preproxy.d
index b8eb77fa..a917c16e 100644
--- a/docs/cmdline-opts/preproxy.d
+++ b/docs/cmdline-opts/preproxy.d
@@ -2,6 +2,7 @@ Long: preproxy
Arg: [protocol://]host[:port]
Help: Use this proxy first
Added: 7.52.0
+Category: proxy
---
Use the specified SOCKS proxy before connecting to an HTTP or HTTPS --proxy. In
such a case curl first connects to the SOCKS proxy and then connects (through
diff --git a/docs/cmdline-opts/progress-bar.d b/docs/cmdline-opts/progress-bar.d
index f27de2d9..299d5384 100644
--- a/docs/cmdline-opts/progress-bar.d
+++ b/docs/cmdline-opts/progress-bar.d
@@ -1,6 +1,7 @@
Short: #
Long: progress-bar
Help: Display transfer progress as a bar
+Category: verbose
---
Make curl display transfer progress as a simple progress bar instead of the
standard, more informational, meter.
diff --git a/docs/cmdline-opts/proto-default.d b/docs/cmdline-opts/proto-default.d
index ccc3b85f..1c2afea2 100644
--- a/docs/cmdline-opts/proto-default.d
+++ b/docs/cmdline-opts/proto-default.d
@@ -2,6 +2,7 @@ Long: proto-default
Help: Use PROTOCOL for any URL missing a scheme
Arg: <protocol>
Added: 7.45.0
+Category: connection curl
---
Tells curl to use \fIprotocol\fP for any URL missing a scheme name.
diff --git a/docs/cmdline-opts/proto-redir.d b/docs/cmdline-opts/proto-redir.d
index a1205dd0..9a096f53 100644
--- a/docs/cmdline-opts/proto-redir.d
+++ b/docs/cmdline-opts/proto-redir.d
@@ -2,6 +2,7 @@ Long: proto-redir
Arg: <protocols>
Help: Enable/disable PROTOCOLS on redirect
Added: 7.20.2
+Category: connection curl
---
Tells curl to limit what protocols it may use on redirect. Protocols denied by
--proto are not overridden by this option. See --proto for how protocols are
diff --git a/docs/cmdline-opts/proto.d b/docs/cmdline-opts/proto.d
index e1ece178..46c91225 100644
--- a/docs/cmdline-opts/proto.d
+++ b/docs/cmdline-opts/proto.d
@@ -3,6 +3,7 @@ Arg: <protocols>
Help: Enable/disable PROTOCOLS
See-also: proto-redir proto-default
Added: 7.20.2
+Category: connection curl
---
Tells curl to limit what protocols it may use in the transfer. Protocols are
evaluated left to right, are comma separated, and are each a protocol name or
diff --git a/docs/cmdline-opts/proxy-anyauth.d b/docs/cmdline-opts/proxy-anyauth.d
index b60d0a05..6410c0e6 100644
--- a/docs/cmdline-opts/proxy-anyauth.d
+++ b/docs/cmdline-opts/proxy-anyauth.d
@@ -2,6 +2,7 @@ Long: proxy-anyauth
Help: Pick any proxy authentication method
Added: 7.13.2
See-also: proxy proxy-basic proxy-digest
+Category: proxy auth
---
Tells curl to pick a suitable authentication method when communicating with
the given HTTP proxy. This might cause an extra request/response round-trip.
diff --git a/docs/cmdline-opts/proxy-basic.d b/docs/cmdline-opts/proxy-basic.d
index 566f890a..e842f990 100644
--- a/docs/cmdline-opts/proxy-basic.d
+++ b/docs/cmdline-opts/proxy-basic.d
@@ -1,6 +1,7 @@
Long: proxy-basic
Help: Use Basic authentication on the proxy
See-also: proxy proxy-anyauth proxy-digest
+Category: proxy auth
---
Tells curl to use HTTP Basic authentication when communicating with the given
proxy. Use --basic for enabling HTTP Basic with a remote host. Basic is the
diff --git a/docs/cmdline-opts/proxy-cacert.d b/docs/cmdline-opts/proxy-cacert.d
index 2713dd2a..bbc731a2 100644
--- a/docs/cmdline-opts/proxy-cacert.d
+++ b/docs/cmdline-opts/proxy-cacert.d
@@ -3,5 +3,6 @@ Help: CA certificate to verify peer against for proxy
Arg: <file>
Added: 7.52.0
See-also: proxy-capath cacert capath proxy
+Category: proxy tls
---
Same as --cacert but used in HTTPS proxy context.
diff --git a/docs/cmdline-opts/proxy-capath.d b/docs/cmdline-opts/proxy-capath.d
index 177246aa..cc342b75 100644
--- a/docs/cmdline-opts/proxy-capath.d
+++ b/docs/cmdline-opts/proxy-capath.d
@@ -3,5 +3,6 @@ Help: CA directory to verify peer against for proxy
Arg: <dir>
Added: 7.52.0
See-also: proxy-cacert proxy capath
+Category: proxy tls
---
Same as --capath but used in HTTPS proxy context.
diff --git a/docs/cmdline-opts/proxy-cert-type.d b/docs/cmdline-opts/proxy-cert-type.d
index 906d2a11..fb7596c1 100644
--- a/docs/cmdline-opts/proxy-cert-type.d
+++ b/docs/cmdline-opts/proxy-cert-type.d
@@ -2,5 +2,6 @@ Long: proxy-cert-type
Arg: <type>
Added: 7.52.0
Help: Client certificate type for HTTPS proxy
+Category: proxy tls
---
Same as --cert-type but used in HTTPS proxy context.
diff --git a/docs/cmdline-opts/proxy-cert.d b/docs/cmdline-opts/proxy-cert.d
index 43acd395..7df2712f 100644
--- a/docs/cmdline-opts/proxy-cert.d
+++ b/docs/cmdline-opts/proxy-cert.d
@@ -2,5 +2,6 @@ Long: proxy-cert
Arg: <cert[:passwd]>
Help: Set client certificate for proxy
Added: 7.52.0
+Category: proxy tls
---
Same as --cert but used in HTTPS proxy context.
diff --git a/docs/cmdline-opts/proxy-ciphers.d b/docs/cmdline-opts/proxy-ciphers.d
index dcac8128..36655567 100644
--- a/docs/cmdline-opts/proxy-ciphers.d
+++ b/docs/cmdline-opts/proxy-ciphers.d
@@ -2,5 +2,6 @@ Long: proxy-ciphers
Arg: <list>
Help: SSL ciphers to use for proxy
Added: 7.52.0
+Category: proxy tls
---
Same as --ciphers but used in HTTPS proxy context.
diff --git a/docs/cmdline-opts/proxy-crlfile.d b/docs/cmdline-opts/proxy-crlfile.d
index 1d6247f4..580dc50c 100644
--- a/docs/cmdline-opts/proxy-crlfile.d
+++ b/docs/cmdline-opts/proxy-crlfile.d
@@ -2,5 +2,6 @@ Long: proxy-crlfile
Arg: <file>
Help: Set a CRL list for proxy
Added: 7.52.0
+Category: proxy tls
---
Same as --crlfile but used in HTTPS proxy context.
diff --git a/docs/cmdline-opts/proxy-digest.d b/docs/cmdline-opts/proxy-digest.d
index ccf46636..52f1fcc6 100644
--- a/docs/cmdline-opts/proxy-digest.d
+++ b/docs/cmdline-opts/proxy-digest.d
@@ -1,6 +1,7 @@
Long: proxy-digest
Help: Use Digest authentication on the proxy
See-also: proxy proxy-anyauth proxy-basic
+Category: proxy tls
---
Tells curl to use HTTP Digest authentication when communicating with the given
proxy. Use --digest for enabling HTTP Digest with a remote host.
diff --git a/docs/cmdline-opts/proxy-header.d b/docs/cmdline-opts/proxy-header.d
index c1b0bb7c..9f1121d2 100644
--- a/docs/cmdline-opts/proxy-header.d
+++ b/docs/cmdline-opts/proxy-header.d
@@ -3,6 +3,7 @@ Arg: <header/@file>
Help: Pass custom header(s) to proxy
Protocols: HTTP
Added: 7.37.0
+Category: proxy
---
Extra header to include in the request when sending HTTP to a proxy. You may
specify any number of extra headers. This is the equivalent option to --header
diff --git a/docs/cmdline-opts/proxy-insecure.d b/docs/cmdline-opts/proxy-insecure.d
index 762828f4..e123f401 100644
--- a/docs/cmdline-opts/proxy-insecure.d
+++ b/docs/cmdline-opts/proxy-insecure.d
@@ -1,5 +1,6 @@
Long: proxy-insecure
Help: Do HTTPS proxy connections without verifying the proxy
Added: 7.52.0
+Category: proxy tls
---
Same as --insecure but used in HTTPS proxy context.
diff --git a/docs/cmdline-opts/proxy-key-type.d b/docs/cmdline-opts/proxy-key-type.d
index ce7482ae..1906872e 100644
--- a/docs/cmdline-opts/proxy-key-type.d
+++ b/docs/cmdline-opts/proxy-key-type.d
@@ -2,5 +2,6 @@ Long: proxy-key-type
Arg: <type>
Help: Private key file type for proxy
Added: 7.52.0
+Category: proxy tls
---
Same as --key-type but used in HTTPS proxy context.
diff --git a/docs/cmdline-opts/proxy-key.d b/docs/cmdline-opts/proxy-key.d
index e61eb18a..57d469f4 100644
--- a/docs/cmdline-opts/proxy-key.d
+++ b/docs/cmdline-opts/proxy-key.d
@@ -1,5 +1,6 @@
Long: proxy-key
Help: Private key for HTTPS proxy
Arg: <key>
+Category: proxy tls
---
Same as --key but used in HTTPS proxy context.
diff --git a/docs/cmdline-opts/proxy-negotiate.d b/docs/cmdline-opts/proxy-negotiate.d
index 775f62a9..72f35960 100644
--- a/docs/cmdline-opts/proxy-negotiate.d
+++ b/docs/cmdline-opts/proxy-negotiate.d
@@ -2,6 +2,7 @@ Long: proxy-negotiate
Help: Use HTTP Negotiate (SPNEGO) authentication on the proxy
Added: 7.17.1
See-also: proxy-anyauth proxy-basic
+Category: proxy auth
---
Tells curl to use HTTP Negotiate (SPNEGO) authentication when communicating
with the given proxy. Use --negotiate for enabling HTTP Negotiate (SPNEGO)
diff --git a/docs/cmdline-opts/proxy-ntlm.d b/docs/cmdline-opts/proxy-ntlm.d
index c30db53b..cb1ba7b0 100644
--- a/docs/cmdline-opts/proxy-ntlm.d
+++ b/docs/cmdline-opts/proxy-ntlm.d
@@ -1,6 +1,7 @@
Long: proxy-ntlm
Help: Use NTLM authentication on the proxy
See-also: proxy-negotiate proxy-anyauth
+Category: proxy auth
---
Tells curl to use HTTP NTLM authentication when communicating with the given
proxy. Use --ntlm for enabling NTLM with a remote host.
diff --git a/docs/cmdline-opts/proxy-pass.d b/docs/cmdline-opts/proxy-pass.d
index 3371714b..627451bb 100644
--- a/docs/cmdline-opts/proxy-pass.d
+++ b/docs/cmdline-opts/proxy-pass.d
@@ -2,5 +2,6 @@ Long: proxy-pass
Arg: <phrase>
Help: Pass phrase for the private key for HTTPS proxy
Added: 7.52.0
+Category: proxy tls auth
---
Same as --pass but used in HTTPS proxy context.
diff --git a/docs/cmdline-opts/proxy-pinnedpubkey.d b/docs/cmdline-opts/proxy-pinnedpubkey.d
index abd6dc4a..2ab79f19 100644
--- a/docs/cmdline-opts/proxy-pinnedpubkey.d
+++ b/docs/cmdline-opts/proxy-pinnedpubkey.d
@@ -2,6 +2,7 @@ Long: proxy-pinnedpubkey
Arg: <hashes>
Help: FILE/HASHES public key to verify proxy with
Protocols: TLS
+Category: proxy tls
---
Tells curl to use the specified public key file (or hashes) to verify the
proxy. This can be a path to a file which contains a single public key in PEM
diff --git a/docs/cmdline-opts/proxy-service-name.d b/docs/cmdline-opts/proxy-service-name.d
index 9a73f2be..f7807290 100644
--- a/docs/cmdline-opts/proxy-service-name.d
+++ b/docs/cmdline-opts/proxy-service-name.d
@@ -2,5 +2,6 @@ Long: proxy-service-name
Arg: <name>
Help: SPNEGO proxy service name
Added: 7.43.0
+Category: proxy tls
---
This option allows you to change the service name for proxy negotiation.
diff --git a/docs/cmdline-opts/proxy-ssl-allow-beast.d b/docs/cmdline-opts/proxy-ssl-allow-beast.d
index de96b843..138001b3 100644
--- a/docs/cmdline-opts/proxy-ssl-allow-beast.d
+++ b/docs/cmdline-opts/proxy-ssl-allow-beast.d
@@ -1,5 +1,6 @@
Long: proxy-ssl-allow-beast
Help: Allow security flaw for interop for HTTPS proxy
Added: 7.52.0
+Category: proxy tls
---
Same as --ssl-allow-beast but used in HTTPS proxy context.
diff --git a/docs/cmdline-opts/proxy-tls13-ciphers.d b/docs/cmdline-opts/proxy-tls13-ciphers.d
index 08961b72..19add226 100644
--- a/docs/cmdline-opts/proxy-tls13-ciphers.d
+++ b/docs/cmdline-opts/proxy-tls13-ciphers.d
@@ -2,6 +2,7 @@ Long: proxy-tls13-ciphers
Arg: <ciphersuite list>
help: TLS 1.3 proxy cipher suites
Protocols: TLS
+Category: proxy tls
---
Specifies which cipher suites to use in the connection to your HTTPS proxy
when it negotiates TLS 1.3. The list of ciphers suites must specify valid
diff --git a/docs/cmdline-opts/proxy-tlsauthtype.d b/docs/cmdline-opts/proxy-tlsauthtype.d
index 7d0ce8e1..5649a0f5 100644
--- a/docs/cmdline-opts/proxy-tlsauthtype.d
+++ b/docs/cmdline-opts/proxy-tlsauthtype.d
@@ -2,5 +2,6 @@ Long: proxy-tlsauthtype
Arg: <type>
Help: TLS authentication type for HTTPS proxy
Added: 7.52.0
+Category: proxy tls auth
---
Same as --tlsauthtype but used in HTTPS proxy context.
diff --git a/docs/cmdline-opts/proxy-tlspassword.d b/docs/cmdline-opts/proxy-tlspassword.d
index cf003844..38a33d45 100644
--- a/docs/cmdline-opts/proxy-tlspassword.d
+++ b/docs/cmdline-opts/proxy-tlspassword.d
@@ -2,5 +2,6 @@ Long: proxy-tlspassword
Arg: <string>
Help: TLS password for HTTPS proxy
Added: 7.52.0
+Category: proxy tls auth
---
Same as --tlspassword but used in HTTPS proxy context.
diff --git a/docs/cmdline-opts/proxy-tlsuser.d b/docs/cmdline-opts/proxy-tlsuser.d
index 758a7c95..587f7f51 100644
--- a/docs/cmdline-opts/proxy-tlsuser.d
+++ b/docs/cmdline-opts/proxy-tlsuser.d
@@ -2,5 +2,6 @@ Long: proxy-tlsuser
Arg: <name>
Help: TLS username for HTTPS proxy
Added: 7.52.0
+Category: proxy tls auth
---
Same as --tlsuser but used in HTTPS proxy context.
diff --git a/docs/cmdline-opts/proxy-tlsv1.d b/docs/cmdline-opts/proxy-tlsv1.d
index d024eeac..5003f5f7 100644
--- a/docs/cmdline-opts/proxy-tlsv1.d
+++ b/docs/cmdline-opts/proxy-tlsv1.d
@@ -1,5 +1,6 @@
Long: proxy-tlsv1
Help: Use TLSv1 for HTTPS proxy
Added: 7.52.0
+Category: proxy tls auth
---
Same as --tlsv1 but used in HTTPS proxy context.
diff --git a/docs/cmdline-opts/proxy-user.d b/docs/cmdline-opts/proxy-user.d
index 152466da..82fc5170 100644
--- a/docs/cmdline-opts/proxy-user.d
+++ b/docs/cmdline-opts/proxy-user.d
@@ -2,6 +2,7 @@ Long: proxy-user
Short: U
Arg: <user:password>
Help: Proxy user and password
+Category: proxy auth
---
Specify the user name and password to use for proxy authentication.
diff --git a/docs/cmdline-opts/proxy.d b/docs/cmdline-opts/proxy.d
index 6506692b..0592f13b 100644
--- a/docs/cmdline-opts/proxy.d
+++ b/docs/cmdline-opts/proxy.d
@@ -2,6 +2,7 @@ Long: proxy
Short: x
Arg: [protocol://]host[:port]
Help: Use this proxy
+Category: proxy
---
Use the specified proxy.
diff --git a/docs/cmdline-opts/proxy1.0.d b/docs/cmdline-opts/proxy1.0.d
index 4a931bd1..b8a232bf 100644
--- a/docs/cmdline-opts/proxy1.0.d
+++ b/docs/cmdline-opts/proxy1.0.d
@@ -1,6 +1,7 @@
Long: proxy1.0
Arg: <host[:port]>
Help: Use HTTP/1.0 proxy on given port
+Category: proxy
---
Use the specified HTTP 1.0 proxy. If the port number is not specified, it is
assumed at port 1080.
diff --git a/docs/cmdline-opts/proxytunnel.d b/docs/cmdline-opts/proxytunnel.d
index 1f587f12..94dae992 100644
--- a/docs/cmdline-opts/proxytunnel.d
+++ b/docs/cmdline-opts/proxytunnel.d
@@ -2,6 +2,7 @@ Long: proxytunnel
Short: p
Help: Operate through an HTTP proxy tunnel (using CONNECT)
See-also: proxy
+Category: proxy
---
When an HTTP proxy is used --proxy, this option will make curl tunnel through
the proxy. The tunnel approach is made with the HTTP proxy CONNECT request and
diff --git a/docs/cmdline-opts/pubkey.d b/docs/cmdline-opts/pubkey.d
index b2e11c02..692daf6b 100644
--- a/docs/cmdline-opts/pubkey.d
+++ b/docs/cmdline-opts/pubkey.d
@@ -2,6 +2,7 @@ Long: pubkey
Arg: <key>
Protocols: SFTP SCP
Help: SSH Public key file name
+Category: sftp scp auth
---
Public key file name. Allows you to provide your public key in this separate
file.
diff --git a/docs/cmdline-opts/quote.d b/docs/cmdline-opts/quote.d
index 59a98eaf..a33ed357 100644
--- a/docs/cmdline-opts/quote.d
+++ b/docs/cmdline-opts/quote.d
@@ -2,6 +2,7 @@ Long: quote
Short: Q
Help: Send command(s) to server before transfer
Protocols: FTP SFTP
+Category: ftp sftp
---
Send an arbitrary command to the remote FTP or SFTP server. Quote commands are
@@ -26,6 +27,10 @@ itself before sending them to the server. File names may be quoted
shell-style to embed spaces or special characters. Following is the list of
all supported SFTP quote commands:
.RS
+.IP "atime date file"
+The atime command sets the last access time of the file named by the file
+operand. The <date expression> can be all sorts of date strings, see the
+\fIcurl_getdate(3)\fP man page for date expression details. (Added in 7.73.0)
.IP "chgrp group file"
The chgrp command sets the group ID of the file named by the file operand to
the group ID specified by the group operand. The group operand is a decimal
@@ -42,6 +47,10 @@ The ln and symlink commands create a symbolic link at the target_file location
pointing to the source_file location.
.IP "mkdir directory_name"
The mkdir command creates the directory named by the directory_name operand.
+.IP "mtime date file"
+The mtime command sets the last modification time of the file named by the
+file operand. The <date expression> can be all sorts of date strings, see the
+\fIcurl_getdate(3)\fP man page for date expression details. (Added in 7.73.0)
.IP "pwd"
The pwd command returns the absolute pathname of the current working directory.
.IP "rename source target"
diff --git a/docs/cmdline-opts/random-file.d b/docs/cmdline-opts/random-file.d
index 51626f88..c57f5236 100644
--- a/docs/cmdline-opts/random-file.d
+++ b/docs/cmdline-opts/random-file.d
@@ -1,6 +1,7 @@
Long: random-file
Arg: <file>
Help: File for reading random data from
+Category: misc
---
Specify the path name to file containing what will be considered as random
data. The data may be used to seed the random engine for SSL connections. See
diff --git a/docs/cmdline-opts/range.d b/docs/cmdline-opts/range.d
index b888dd18..17c6c2ab 100644
--- a/docs/cmdline-opts/range.d
+++ b/docs/cmdline-opts/range.d
@@ -3,6 +3,7 @@ Short: r
Help: Retrieve only the bytes within RANGE
Arg: <range>
Protocols: HTTP FTP SFTP FILE
+Category: http ftp sftp file
---
Retrieve a byte range (i.e. a partial document) from an HTTP/1.1, FTP or SFTP
server or a local FILE. Ranges can be specified in a number of ways.
diff --git a/docs/cmdline-opts/raw.d b/docs/cmdline-opts/raw.d
index c3328e69..90e77726 100644
--- a/docs/cmdline-opts/raw.d
+++ b/docs/cmdline-opts/raw.d
@@ -2,6 +2,7 @@ Long: raw
Help: Do HTTP "raw"; no transfer decoding
Added: 7.16.2
Protocols: HTTP
+Category: http
---
When used, it disables all internal HTTP decoding of content or transfer
encodings and instead makes them passed on unaltered, raw.
diff --git a/docs/cmdline-opts/referer.d b/docs/cmdline-opts/referer.d
index cd84e9d5..8b2057b9 100644
--- a/docs/cmdline-opts/referer.d
+++ b/docs/cmdline-opts/referer.d
@@ -4,6 +4,7 @@ Arg: <URL>
Protocols: HTTP
Help: Referrer URL
See-also: user-agent header
+Category: http
---
Sends the "Referrer Page" information to the HTTP server. This can also be set
with the --header flag of course. When used with --location you can append
diff --git a/docs/cmdline-opts/remote-header-name.d b/docs/cmdline-opts/remote-header-name.d
index 771b6d46..700da69f 100644
--- a/docs/cmdline-opts/remote-header-name.d
+++ b/docs/cmdline-opts/remote-header-name.d
@@ -2,6 +2,7 @@ Long: remote-header-name
Short: J
Protocols: HTTP
Help: Use the header-provided filename
+Category: output
---
This option tells the --remote-name option to use the server-specified
Content-Disposition filename instead of extracting a filename from the URL.
diff --git a/docs/cmdline-opts/remote-name-all.d b/docs/cmdline-opts/remote-name-all.d
index f7a19967..299684c5 100644
--- a/docs/cmdline-opts/remote-name-all.d
+++ b/docs/cmdline-opts/remote-name-all.d
@@ -1,6 +1,7 @@
Long: remote-name-all
Help: Use the remote file name for all URLs
Added: 7.19.0
+Category: output
---
This option changes the default action for all given URLs to be dealt with as
if --remote-name were used for each one. So if you want to disable that for a
diff --git a/docs/cmdline-opts/remote-name.d b/docs/cmdline-opts/remote-name.d
index 9fed64bf..184c32e4 100644
--- a/docs/cmdline-opts/remote-name.d
+++ b/docs/cmdline-opts/remote-name.d
@@ -1,6 +1,7 @@
Long: remote-name
Short: O
Help: Write output to a file named as the remote file
+Category: important output
---
Write output to a local file named like the remote file we get. (Only the file
part of the remote file is used, the path is cut off.)
diff --git a/docs/cmdline-opts/remote-time.d b/docs/cmdline-opts/remote-time.d
index 7f6809dc..96fb4fbe 100644
--- a/docs/cmdline-opts/remote-time.d
+++ b/docs/cmdline-opts/remote-time.d
@@ -1,6 +1,7 @@
Long: remote-time
Short: R
Help: Set the remote file's time on the local output
+Category: output
---
When used, this will make curl attempt to figure out the timestamp of the
remote file, and if that is available make the local file get that same
diff --git a/docs/cmdline-opts/request-target.d b/docs/cmdline-opts/request-target.d
index b46b4af0..df423f87 100644
--- a/docs/cmdline-opts/request-target.d
+++ b/docs/cmdline-opts/request-target.d
@@ -2,6 +2,7 @@ Long: request-target
Help: Specify the target for this request
Protocols: HTTP
Added: 7.55.0
+Category: http
---
Tells curl to use an alternative "target" (path) instead of using the path as
provided in the URL. Particularly useful when wanting to issue HTTP requests
diff --git a/docs/cmdline-opts/request.d b/docs/cmdline-opts/request.d
index 3919d426..47c4c8b0 100644
--- a/docs/cmdline-opts/request.d
+++ b/docs/cmdline-opts/request.d
@@ -2,6 +2,7 @@ Long: request
Short: X
Arg: <command>
Help: Specify request command to use
+Category: connection
---
(HTTP) Specifies a custom request method to use when communicating with the
HTTP server. The specified request method will be used instead of the method
diff --git a/docs/cmdline-opts/resolve.d b/docs/cmdline-opts/resolve.d
index c1692f0f..41f6a1bd 100644
--- a/docs/cmdline-opts/resolve.d
+++ b/docs/cmdline-opts/resolve.d
@@ -2,6 +2,7 @@ Long: resolve
Arg: <host:port:addr[,addr]...>
Help: Resolve the host+port to this address
Added: 7.21.3
+Category: connection
---
Provide a custom address for a specific host and port pair. Using this, you
can make the curl requests(s) use a specified address and prevent the
diff --git a/docs/cmdline-opts/retry-all-errors.d b/docs/cmdline-opts/retry-all-errors.d
index 4554f593..6bda52b6 100644
--- a/docs/cmdline-opts/retry-all-errors.d
+++ b/docs/cmdline-opts/retry-all-errors.d
@@ -1,6 +1,7 @@
Long: retry-all-errors
Help: Retry all errors (use with --retry)
Added: 7.71.0
+Category: curl
---
Retry on any error. This option is used together with --retry.
diff --git a/docs/cmdline-opts/retry-connrefused.d b/docs/cmdline-opts/retry-connrefused.d
index 6a78e1fd..be34f973 100644
--- a/docs/cmdline-opts/retry-connrefused.d
+++ b/docs/cmdline-opts/retry-connrefused.d
@@ -1,6 +1,7 @@
Long: retry-connrefused
Help: Retry on connection refused (use with --retry)
Added: 7.52.0
+Category: curl
---
In addition to the other conditions, consider ECONNREFUSED as a transient
error too for --retry. This option is used together with --retry.
diff --git a/docs/cmdline-opts/retry-delay.d b/docs/cmdline-opts/retry-delay.d
index 1691356d..5645c0e6 100644
--- a/docs/cmdline-opts/retry-delay.d
+++ b/docs/cmdline-opts/retry-delay.d
@@ -2,6 +2,7 @@ Long: retry-delay
Arg: <seconds>
Help: Wait time between retries
Added: 7.12.3
+Category: curl
---
Make curl sleep this amount of time before each retry when a transfer has
failed with a transient error (it changes the default backoff time algorithm
diff --git a/docs/cmdline-opts/retry-max-time.d b/docs/cmdline-opts/retry-max-time.d
index 0920c924..9d6faf30 100644
--- a/docs/cmdline-opts/retry-max-time.d
+++ b/docs/cmdline-opts/retry-max-time.d
@@ -2,6 +2,7 @@ Long: retry-max-time
Arg: <seconds>
Help: Retry only within this period
Added: 7.12.3
+Category: curl
---
The retry timer is reset before the first transfer attempt. Retries will be
done as usual (see --retry) as long as the timer hasn't reached this given
diff --git a/docs/cmdline-opts/retry.d b/docs/cmdline-opts/retry.d
index 3db89b71..70f6e7bf 100644
--- a/docs/cmdline-opts/retry.d
+++ b/docs/cmdline-opts/retry.d
@@ -2,6 +2,7 @@ Long: retry
Arg: <num>
Added: 7.12.3
Help: Retry request if transient problems occur
+Category: curl
---
If a transient error is returned when curl tries to perform a transfer, it
will retry this number of times before giving up. Setting the number to 0
diff --git a/docs/cmdline-opts/sasl-authzid.d b/docs/cmdline-opts/sasl-authzid.d
index a3bd46e7..e802c80a 100644
--- a/docs/cmdline-opts/sasl-authzid.d
+++ b/docs/cmdline-opts/sasl-authzid.d
@@ -2,6 +2,7 @@ Long: sasl-authzid
Arg: <identity>
Help: Identity for SASL PLAIN authentication
Added: 7.66.0
+Category: auth
---
Use this authorisation identity (authzid), during SASL PLAIN authentication,
in addition to the authentication identity (authcid) as specified by --user.
diff --git a/docs/cmdline-opts/sasl-ir.d b/docs/cmdline-opts/sasl-ir.d
index c0dab946..0041c3b4 100644
--- a/docs/cmdline-opts/sasl-ir.d
+++ b/docs/cmdline-opts/sasl-ir.d
@@ -1,5 +1,6 @@
Long: sasl-ir
Help: Enable initial response in SASL authentication
Added: 7.31.0
+Category: auth
---
Enable initial response in SASL authentication.
diff --git a/docs/cmdline-opts/service-name.d b/docs/cmdline-opts/service-name.d
index 4dfeb27d..c64496b8 100644
--- a/docs/cmdline-opts/service-name.d
+++ b/docs/cmdline-opts/service-name.d
@@ -2,6 +2,7 @@ Long: service-name
Help: SPNEGO service name
Arg: <name>
Added: 7.43.0
+Category: misc
---
This option allows you to change the service name for SPNEGO.
diff --git a/docs/cmdline-opts/show-error.d b/docs/cmdline-opts/show-error.d
index b9667a4c..2124409e 100644
--- a/docs/cmdline-opts/show-error.d
+++ b/docs/cmdline-opts/show-error.d
@@ -1,5 +1,7 @@
Long: show-error
Short: S
Help: Show error even when -s is used
+See-also: no-progress-meter
+Category: curl
---
When used with --silent, it makes curl show an error message if it fails.
diff --git a/docs/cmdline-opts/silent.d b/docs/cmdline-opts/silent.d
index b0b4425b..58a52233 100644
--- a/docs/cmdline-opts/silent.d
+++ b/docs/cmdline-opts/silent.d
@@ -1,7 +1,8 @@
Long: silent
Short: s
Help: Silent mode
-See-also: verbose stderr
+See-also: verbose stderr no-progress-meter
+Category: important verbose
---
Silent or quiet mode. Don't show progress meter or error messages. Makes Curl
mute. It will still output the data you ask for, potentially even to the
diff --git a/docs/cmdline-opts/socks4.d b/docs/cmdline-opts/socks4.d
index 11f6ae03..bc095d54 100644
--- a/docs/cmdline-opts/socks4.d
+++ b/docs/cmdline-opts/socks4.d
@@ -2,6 +2,7 @@ Long: socks4
Arg: <host[:port]>
Help: SOCKS4 proxy on given host + port
Added: 7.15.2
+Category: proxy
---
Use the specified SOCKS4 proxy. If the port number is not specified, it is
assumed at port 1080.
diff --git a/docs/cmdline-opts/socks4a.d b/docs/cmdline-opts/socks4a.d
index ae254ae0..d3177a9d 100644
--- a/docs/cmdline-opts/socks4a.d
+++ b/docs/cmdline-opts/socks4a.d
@@ -2,6 +2,7 @@ Long: socks4a
Arg: <host[:port]>
Help: SOCKS4a proxy on given host + port
Added: 7.18.0
+Category: proxy
---
Use the specified SOCKS4a proxy. If the port number is not specified, it is
assumed at port 1080.
diff --git a/docs/cmdline-opts/socks5-basic.d b/docs/cmdline-opts/socks5-basic.d
index 67d16b3a..52d1e661 100644
--- a/docs/cmdline-opts/socks5-basic.d
+++ b/docs/cmdline-opts/socks5-basic.d
@@ -1,6 +1,7 @@
Long: socks5-basic
Help: Enable username/password auth for SOCKS5 proxies
Added: 7.55.0
+Category: proxy auth
---
Tells curl to use username/password authentication when connecting to a SOCKS5
proxy. The username/password authentication is enabled by default. Use
diff --git a/docs/cmdline-opts/socks5-gssapi-nec.d b/docs/cmdline-opts/socks5-gssapi-nec.d
index 477e218e..b538f33f 100644
--- a/docs/cmdline-opts/socks5-gssapi-nec.d
+++ b/docs/cmdline-opts/socks5-gssapi-nec.d
@@ -1,6 +1,7 @@
Long: socks5-gssapi-nec
Help: Compatibility with NEC SOCKS5 server
Added: 7.19.4
+Category: proxy auth
---
As part of the GSS-API negotiation a protection mode is negotiated. RFC 1961
says in section 4.3/4.4 it should be protected, but the NEC reference
diff --git a/docs/cmdline-opts/socks5-gssapi-service.d b/docs/cmdline-opts/socks5-gssapi-service.d
index eb3b2407..e61d0f5a 100644
--- a/docs/cmdline-opts/socks5-gssapi-service.d
+++ b/docs/cmdline-opts/socks5-gssapi-service.d
@@ -2,6 +2,7 @@ Long: socks5-gssapi-service
Arg: <name>
Help: SOCKS5 proxy service name for GSS-API
Added: 7.19.4
+Category: proxy auth
---
The default service name for a socks server is rcmd/server-fqdn. This option
allows you to change it.
diff --git a/docs/cmdline-opts/socks5-gssapi.d b/docs/cmdline-opts/socks5-gssapi.d
index 0070f37e..72ae7aeb 100644
--- a/docs/cmdline-opts/socks5-gssapi.d
+++ b/docs/cmdline-opts/socks5-gssapi.d
@@ -1,6 +1,7 @@
Long: socks5-gssapi
Help: Enable GSS-API auth for SOCKS5 proxies
Added: 7.55.0
+Category: proxy auth
---
Tells curl to use GSS-API authentication when connecting to a SOCKS5 proxy.
The GSS-API authentication is enabled by default (if curl is compiled with
diff --git a/docs/cmdline-opts/socks5-hostname.d b/docs/cmdline-opts/socks5-hostname.d
index 9d9d946e..247d7660 100644
--- a/docs/cmdline-opts/socks5-hostname.d
+++ b/docs/cmdline-opts/socks5-hostname.d
@@ -2,6 +2,7 @@ Long: socks5-hostname
Arg: <host[:port]>
Help: SOCKS5 proxy, pass host name to proxy
Added: 7.18.0
+Category: proxy
---
Use the specified SOCKS5 proxy (and let the proxy resolve the host name). If
the port number is not specified, it is assumed at port 1080.
diff --git a/docs/cmdline-opts/socks5.d b/docs/cmdline-opts/socks5.d
index 22fae762..bbe92f0a 100644
--- a/docs/cmdline-opts/socks5.d
+++ b/docs/cmdline-opts/socks5.d
@@ -2,6 +2,7 @@ Long: socks5
Arg: <host[:port]>
Help: SOCKS5 proxy on given host + port
Added: 7.18.0
+Category: proxy
---
Use the specified SOCKS5 proxy - but resolve the host name locally. If the
port number is not specified, it is assumed at port 1080.
diff --git a/docs/cmdline-opts/speed-limit.d b/docs/cmdline-opts/speed-limit.d
index e2b81c79..3f9ad3a4 100644
--- a/docs/cmdline-opts/speed-limit.d
+++ b/docs/cmdline-opts/speed-limit.d
@@ -2,6 +2,7 @@ Long: speed-limit
Short: Y
Arg: <speed>
Help: Stop transfers slower than this
+Category: connection
---
If a download is slower than this given speed (in bytes per second) for
speed-time seconds it gets aborted. speed-time is set with --speed-time and is
diff --git a/docs/cmdline-opts/speed-time.d b/docs/cmdline-opts/speed-time.d
index 98d6ae13..81acabec 100644
--- a/docs/cmdline-opts/speed-time.d
+++ b/docs/cmdline-opts/speed-time.d
@@ -2,6 +2,7 @@ Long: speed-time
Short: y
Arg: <seconds>
Help: Trigger 'speed-limit' abort after this time
+Category: connection
---
If a download is slower than speed-limit bytes per second during a speed-time
period, the download gets aborted. If speed-time is used, the default
diff --git a/docs/cmdline-opts/ssl-allow-beast.d b/docs/cmdline-opts/ssl-allow-beast.d
index 973fcd45..f18fe747 100644
--- a/docs/cmdline-opts/ssl-allow-beast.d
+++ b/docs/cmdline-opts/ssl-allow-beast.d
@@ -1,6 +1,7 @@
Long: ssl-allow-beast
Help: Allow security flaw to improve interop
Added: 7.25.0
+Category: tls
---
This option tells curl to not work around a security flaw in the SSL3 and
TLS1.0 protocols known as BEAST. If this option isn't used, the SSL layer may
diff --git a/docs/cmdline-opts/ssl-no-revoke.d b/docs/cmdline-opts/ssl-no-revoke.d
index f94b1114..3b161424 100644
--- a/docs/cmdline-opts/ssl-no-revoke.d
+++ b/docs/cmdline-opts/ssl-no-revoke.d
@@ -1,6 +1,7 @@
Long: ssl-no-revoke
Help: Disable cert revocation checks (Schannel)
Added: 7.44.0
+Category: tls
---
(Schannel) This option tells curl to disable certificate revocation checks.
WARNING: this option loosens the SSL security, and by using this flag you ask
diff --git a/docs/cmdline-opts/ssl-reqd.d b/docs/cmdline-opts/ssl-reqd.d
index 3c6f8a25..2e573e39 100644
--- a/docs/cmdline-opts/ssl-reqd.d
+++ b/docs/cmdline-opts/ssl-reqd.d
@@ -2,6 +2,7 @@ Long: ssl-reqd
Help: Require SSL/TLS
Protocols: FTP IMAP POP3 SMTP
Added: 7.20.0
+Category: tls
---
Require SSL/TLS for the connection. Terminates the connection if the server
doesn't support SSL/TLS.
diff --git a/docs/cmdline-opts/ssl-revoke-best-effort.d b/docs/cmdline-opts/ssl-revoke-best-effort.d
index e339b8af..af22da46 100644
--- a/docs/cmdline-opts/ssl-revoke-best-effort.d
+++ b/docs/cmdline-opts/ssl-revoke-best-effort.d
@@ -1,6 +1,7 @@
Long: ssl-revoke-best-effort
Help: Ignore missing/offline cert CRL dist points
Added: 7.70.0
+Category: tls
---
(Schannel) This option tells curl to ignore certificate revocation checks when
they failed due to missing/offline distribution points for the revocation check
diff --git a/docs/cmdline-opts/ssl.d b/docs/cmdline-opts/ssl.d
index dabd8376..8df46010 100644
--- a/docs/cmdline-opts/ssl.d
+++ b/docs/cmdline-opts/ssl.d
@@ -2,6 +2,7 @@ Long: ssl
Help: Try SSL/TLS
Protocols: FTP IMAP POP3 SMTP
Added: 7.20.0
+Category: tls
---
Try to use SSL/TLS for the connection. Reverts to a non-secure connection if
diff --git a/docs/cmdline-opts/sslv2.d b/docs/cmdline-opts/sslv2.d
index 67d2b850..773ab691 100644
--- a/docs/cmdline-opts/sslv2.d
+++ b/docs/cmdline-opts/sslv2.d
@@ -7,6 +7,7 @@ Mutexed: sslv3 tlsv1 tlsv1.1 tlsv1.2
Requires: TLS
See-also: http1.1 http2
Help: Use SSLv2
+Category: tls
---
Forces curl to use SSL version 2 when negotiating with a remote SSL
server. Sometimes curl is built without SSLv2 support. SSLv2 is widely
diff --git a/docs/cmdline-opts/sslv3.d b/docs/cmdline-opts/sslv3.d
index 101ad100..7beed8f8 100644
--- a/docs/cmdline-opts/sslv3.d
+++ b/docs/cmdline-opts/sslv3.d
@@ -7,6 +7,7 @@ Mutexed: sslv2 tlsv1 tlsv1.1 tlsv1.2
Requires: TLS
See-also: http1.1 http2
Help: Use SSLv3
+Category: tls
---
Forces curl to use SSL version 3 when negotiating with a remote SSL
server. Sometimes curl is built without SSLv3 support. SSLv3 is widely
diff --git a/docs/cmdline-opts/stderr.d b/docs/cmdline-opts/stderr.d
index e8cf7ba6..6da04015 100644
--- a/docs/cmdline-opts/stderr.d
+++ b/docs/cmdline-opts/stderr.d
@@ -1,6 +1,7 @@
Long: stderr
Help: Where to redirect stderr
See-also: verbose silent
+Category: verbose
---
Redirect all writes to stderr to the specified file instead. If the file name
is a plain '-', it is instead written to stdout.
diff --git a/docs/cmdline-opts/styled-output.d b/docs/cmdline-opts/styled-output.d
index e4751aec..8aa4a0f0 100644
--- a/docs/cmdline-opts/styled-output.d
+++ b/docs/cmdline-opts/styled-output.d
@@ -1,6 +1,7 @@
Long: styled-output
Help: Enable styled output for HTTP headers
Added: 7.61.0
+Category: verbose
---
Enables the automatic use of bold font styles when writing HTTP headers to the
terminal. Use --no-styled-output to switch them off.
diff --git a/docs/cmdline-opts/suppress-connect-headers.d b/docs/cmdline-opts/suppress-connect-headers.d
index d208b891..b4e2a17d 100644
--- a/docs/cmdline-opts/suppress-connect-headers.d
+++ b/docs/cmdline-opts/suppress-connect-headers.d
@@ -1,6 +1,7 @@
Long: suppress-connect-headers
Help: Suppress proxy CONNECT response headers
See-also: dump-header include proxytunnel
+Category: proxy
---
When --proxytunnel is used and a CONNECT request is made don't output proxy
CONNECT response headers. This option is meant to be used with --dump-header or
diff --git a/docs/cmdline-opts/tcp-fastopen.d b/docs/cmdline-opts/tcp-fastopen.d
index 08e141df..faef499f 100644
--- a/docs/cmdline-opts/tcp-fastopen.d
+++ b/docs/cmdline-opts/tcp-fastopen.d
@@ -1,5 +1,6 @@
Long: tcp-fastopen
Added: 7.49.0
Help: Use TCP Fast Open
+Category: connection
---
Enable use of TCP Fast Open (RFC7413).
diff --git a/docs/cmdline-opts/tcp-nodelay.d b/docs/cmdline-opts/tcp-nodelay.d
index f047a7c6..f1cf644a 100644
--- a/docs/cmdline-opts/tcp-nodelay.d
+++ b/docs/cmdline-opts/tcp-nodelay.d
@@ -1,6 +1,7 @@
Long: tcp-nodelay
Help: Use the TCP_NODELAY option
Added: 7.11.2
+Category: connection
---
Turn on the TCP_NODELAY option. See the \fIcurl_easy_setopt(3)\fP man page for
details about this option.
diff --git a/docs/cmdline-opts/telnet-option.d b/docs/cmdline-opts/telnet-option.d
index a67cb627..789de3ea 100644
--- a/docs/cmdline-opts/telnet-option.d
+++ b/docs/cmdline-opts/telnet-option.d
@@ -2,6 +2,7 @@ Long: telnet-option
Short: t
Arg: <opt=val>
Help: Set telnet option
+Category: telnet
---
Pass options to the telnet protocol. Supported options are:
diff --git a/docs/cmdline-opts/tftp-blksize.d b/docs/cmdline-opts/tftp-blksize.d
index c184328d..6e67ed2e 100644
--- a/docs/cmdline-opts/tftp-blksize.d
+++ b/docs/cmdline-opts/tftp-blksize.d
@@ -3,6 +3,7 @@ Arg: <value>
Help: Set TFTP BLKSIZE option
Protocols: TFTP
Added: 7.20.0
+Category: tftp
---
Set TFTP BLKSIZE option (must be >512). This is the block size that curl will
try to use when transferring data to or from a TFTP server. By default 512
diff --git a/docs/cmdline-opts/tftp-no-options.d b/docs/cmdline-opts/tftp-no-options.d
index e2a4dacd..02332730 100644
--- a/docs/cmdline-opts/tftp-no-options.d
+++ b/docs/cmdline-opts/tftp-no-options.d
@@ -2,6 +2,7 @@ Long: tftp-no-options
Help: Do not send any TFTP options
Protocols: TFTP
Added: 7.48.0
+Category: tftp
---
Tells curl not to send TFTP options requests.
diff --git a/docs/cmdline-opts/time-cond.d b/docs/cmdline-opts/time-cond.d
index 830b4e1a..f733eeb0 100644
--- a/docs/cmdline-opts/time-cond.d
+++ b/docs/cmdline-opts/time-cond.d
@@ -3,6 +3,7 @@ Short: z
Arg: <time>
Help: Transfer based on a time condition
Protocols: HTTP FTP
+Category: http ftp
---
Request a file that has been modified later than the given time and date, or
one that has been modified before that time. The <date expression> can be all
diff --git a/docs/cmdline-opts/tls-max.d b/docs/cmdline-opts/tls-max.d
index 475c12fe..07eb6546 100644
--- a/docs/cmdline-opts/tls-max.d
+++ b/docs/cmdline-opts/tls-max.d
@@ -6,6 +6,7 @@ Added: 7.54.0
Requires: TLS
See-also: tlsv1.0 tlsv1.1 tlsv1.2 tlsv1.3
Help: Set maximum allowed TLS version
+Category: tls
---
VERSION defines maximum supported TLS version. The minimum acceptable version
is set by tlsv1.0, tlsv1.1, tlsv1.2 or tlsv1.3.
diff --git a/docs/cmdline-opts/tls13-ciphers.d b/docs/cmdline-opts/tls13-ciphers.d
index db803352..0f906ce4 100644
--- a/docs/cmdline-opts/tls13-ciphers.d
+++ b/docs/cmdline-opts/tls13-ciphers.d
@@ -2,6 +2,7 @@ Long: tls13-ciphers
Arg: <ciphersuite list>
help: TLS 1.3 cipher suites to use
Protocols: TLS
+Category: tls
---
Specifies which cipher suites to use in the connection if it negotiates TLS
1.3. The list of ciphers suites must specify valid ciphers. Read up on TLS 1.3
diff --git a/docs/cmdline-opts/tlsauthtype.d b/docs/cmdline-opts/tlsauthtype.d
index ede21c2f..5b283cf9 100644
--- a/docs/cmdline-opts/tlsauthtype.d
+++ b/docs/cmdline-opts/tlsauthtype.d
@@ -2,6 +2,7 @@ Long: tlsauthtype
Arg: <type>
Help: TLS authentication type
Added: 7.21.4
+Category: tls auth
---
Set TLS authentication type. Currently, the only supported option is "SRP",
for TLS-SRP (RFC 5054). If --tlsuser and --tlspassword are specified but
diff --git a/docs/cmdline-opts/tlspassword.d b/docs/cmdline-opts/tlspassword.d
index b2e65362..5c6a0fa5 100644
--- a/docs/cmdline-opts/tlspassword.d
+++ b/docs/cmdline-opts/tlspassword.d
@@ -1,6 +1,7 @@
Long: tlspassword
Help: TLS password
Added: 7.21.4
+Category: tls auth
---
Set password for use with the TLS authentication method specified with
--tlsauthtype. Requires that --tlsuser also be set.
diff --git a/docs/cmdline-opts/tlsuser.d b/docs/cmdline-opts/tlsuser.d
index 7192b9f1..ada15260 100644
--- a/docs/cmdline-opts/tlsuser.d
+++ b/docs/cmdline-opts/tlsuser.d
@@ -2,6 +2,7 @@ Long: tlsuser
Arg: <name>
Help: TLS user name
Added: 7.21.4
+Category: tls auth
---
Set username for use with the TLS authentication method specified with
--tlsauthtype. Requires that --tlspassword also is set.
diff --git a/docs/cmdline-opts/tlsv1.0.d b/docs/cmdline-opts/tlsv1.0.d
index 2b1f0156..4f0176f3 100644
--- a/docs/cmdline-opts/tlsv1.0.d
+++ b/docs/cmdline-opts/tlsv1.0.d
@@ -2,6 +2,7 @@ Long: tlsv1.0
Help: Use TLSv1.0 or greater
Protocols: TLS
Added: 7.34.0
+Category: tls
---
Forces curl to use TLS version 1.0 or later when connecting to a remote TLS server.
diff --git a/docs/cmdline-opts/tlsv1.1.d b/docs/cmdline-opts/tlsv1.1.d
index 405d552b..b3649f7f 100644
--- a/docs/cmdline-opts/tlsv1.1.d
+++ b/docs/cmdline-opts/tlsv1.1.d
@@ -2,6 +2,7 @@ Long: tlsv1.1
Help: Use TLSv1.1 or greater
Protocols: TLS
Added: 7.34.0
+Category: tls
---
Forces curl to use TLS version 1.1 or later when connecting to a remote TLS server.
diff --git a/docs/cmdline-opts/tlsv1.2.d b/docs/cmdline-opts/tlsv1.2.d
index bdf1fcf6..dffbccb9 100644
--- a/docs/cmdline-opts/tlsv1.2.d
+++ b/docs/cmdline-opts/tlsv1.2.d
@@ -2,6 +2,7 @@ Long: tlsv1.2
Help: Use TLSv1.2 or greater
Protocols: TLS
Added: 7.34.0
+Category: tls
---
Forces curl to use TLS version 1.2 or later when connecting to a remote TLS server.
diff --git a/docs/cmdline-opts/tlsv1.3.d b/docs/cmdline-opts/tlsv1.3.d
index 19da857b..37d95355 100644
--- a/docs/cmdline-opts/tlsv1.3.d
+++ b/docs/cmdline-opts/tlsv1.3.d
@@ -2,6 +2,7 @@ Long: tlsv1.3
Help: Use TLSv1.3 or greater
Protocols: TLS
Added: 7.52.0
+Category: tls
---
Forces curl to use TLS version 1.3 or later when connecting to a remote TLS
server.
diff --git a/docs/cmdline-opts/tlsv1.d b/docs/cmdline-opts/tlsv1.d
index 4cb40569..d4c0c516 100644
--- a/docs/cmdline-opts/tlsv1.d
+++ b/docs/cmdline-opts/tlsv1.d
@@ -7,6 +7,7 @@ Mutexed: tlsv1.1 tlsv1.2 tlsv1.3
Requires: TLS
See-also: http1.1 http2
Help: Use TLSv1.0 or greater
+Category: tls
---
Tells curl to use at least TLS version 1.x when negotiating with a remote TLS
server. That means TLS version 1.0 or higher
diff --git a/docs/cmdline-opts/tr-encoding.d b/docs/cmdline-opts/tr-encoding.d
index 01bb62bb..ce1d0032 100644
--- a/docs/cmdline-opts/tr-encoding.d
+++ b/docs/cmdline-opts/tr-encoding.d
@@ -2,6 +2,7 @@ Long: tr-encoding
Added: 7.21.6
Help: Request compressed transfer encoding
Protocols: HTTP
+Category: http
---
Request a compressed Transfer-Encoding response using one of the algorithms
curl supports, and uncompress the data while receiving it.
diff --git a/docs/cmdline-opts/trace-ascii.d b/docs/cmdline-opts/trace-ascii.d
index fceaa712..fa7e16cc 100644
--- a/docs/cmdline-opts/trace-ascii.d
+++ b/docs/cmdline-opts/trace-ascii.d
@@ -2,6 +2,7 @@ Long: trace-ascii
Arg: <file>
Help: Like --trace, but without hex output
Mutexed: trace verbose
+Category: verbose
---
Enables a full trace dump of all incoming and outgoing data, including
descriptive information, to the given output file. Use "-" as filename to have
diff --git a/docs/cmdline-opts/trace-time.d b/docs/cmdline-opts/trace-time.d
index 27dcc42c..19a31a70 100644
--- a/docs/cmdline-opts/trace-time.d
+++ b/docs/cmdline-opts/trace-time.d
@@ -1,5 +1,6 @@
Long: trace-time
Help: Add time stamps to trace/verbose output
Added: 7.14.0
+Category: verbose
---
Prepends a time stamp to each trace or verbose line that curl displays.
diff --git a/docs/cmdline-opts/trace.d b/docs/cmdline-opts/trace.d
index 334ea5ad..502dafd7 100644
--- a/docs/cmdline-opts/trace.d
+++ b/docs/cmdline-opts/trace.d
@@ -2,6 +2,7 @@ Long: trace
Arg: <file>
Help: Write a debug trace to FILE
Mutexed: verbose trace-ascii
+Category: verbose
---
Enables a full trace dump of all incoming and outgoing data, including
descriptive information, to the given output file. Use "-" as filename to have
diff --git a/docs/cmdline-opts/unix-socket.d b/docs/cmdline-opts/unix-socket.d
index 812d20f3..e4ea91d0 100644
--- a/docs/cmdline-opts/unix-socket.d
+++ b/docs/cmdline-opts/unix-socket.d
@@ -3,5 +3,6 @@ Arg: <path>
Help: Connect through this Unix domain socket
Added: 7.40.0
Protocols: HTTP
+Category: connection
---
Connect through this Unix domain socket, instead of using the network.
diff --git a/docs/cmdline-opts/upload-file.d b/docs/cmdline-opts/upload-file.d
index 6f01dbf3..63584b79 100644
--- a/docs/cmdline-opts/upload-file.d
+++ b/docs/cmdline-opts/upload-file.d
@@ -2,6 +2,7 @@ Long: upload-file
Short: T
Arg: <file>
Help: Transfer local FILE to destination
+Category: important upload
---
This transfers the specified local file to the remote URL. If there is no file
part in the specified URL, curl will append the local file name. NOTE that you
diff --git a/docs/cmdline-opts/url.d b/docs/cmdline-opts/url.d
index 991f1f27..30f0bf72 100644
--- a/docs/cmdline-opts/url.d
+++ b/docs/cmdline-opts/url.d
@@ -1,6 +1,7 @@
Long: url
Arg: <url>
Help: URL to work with
+Category: curl
---
Specify a URL to fetch. This option is mostly handy when you want to specify
URL(s) in a config file.
diff --git a/docs/cmdline-opts/use-ascii.d b/docs/cmdline-opts/use-ascii.d
index d59fad92..3a5a6a4f 100644
--- a/docs/cmdline-opts/use-ascii.d
+++ b/docs/cmdline-opts/use-ascii.d
@@ -2,6 +2,7 @@ Short: B
Long: use-ascii
Help: Use ASCII/text transfer
Protocols: FTP LDAP
+Category: misc
---
Enable ASCII transfer. For FTP, this can also be enforced by using a URL that
ends with ";type=A". This option causes data sent to stdout to be in text mode
diff --git a/docs/cmdline-opts/user-agent.d b/docs/cmdline-opts/user-agent.d
index c6dd2e58..ec2ca82b 100644
--- a/docs/cmdline-opts/user-agent.d
+++ b/docs/cmdline-opts/user-agent.d
@@ -3,6 +3,7 @@ Long: user-agent
Arg: <name>
Help: Send User-Agent <name> to server
Protocols: HTTP
+Category: important http
---
Specify the User-Agent string to send to the HTTP server. To encode blanks in
diff --git a/docs/cmdline-opts/user.d b/docs/cmdline-opts/user.d
index 7001d28a..b588700c 100644
--- a/docs/cmdline-opts/user.d
+++ b/docs/cmdline-opts/user.d
@@ -2,6 +2,7 @@ Long: user
Short: u
Arg: <user:password>
Help: Server user and password
+Category: important auth
---
Specify the user name and password to use for server authentication. Overrides
--netrc and --netrc-optional.
diff --git a/docs/cmdline-opts/verbose.d b/docs/cmdline-opts/verbose.d
index 5d335218..8db1ea22 100644
--- a/docs/cmdline-opts/verbose.d
+++ b/docs/cmdline-opts/verbose.d
@@ -3,6 +3,7 @@ Long: verbose
Mutexed: trace trace-ascii
Help: Make the operation more talkative
See-also: include
+Category: important verbose
---
Makes curl verbose during the operation. Useful for debugging and seeing
what's going on "under the hood". A line starting with '>' means "header data"
diff --git a/docs/cmdline-opts/version.d b/docs/cmdline-opts/version.d
index 16c1843f..52c29f17 100644
--- a/docs/cmdline-opts/version.d
+++ b/docs/cmdline-opts/version.d
@@ -1,6 +1,7 @@
Long: version
Short: V
Help: Show version number and quit
+Category: important curl
---
Displays information about curl and the libcurl version it uses.
diff --git a/docs/cmdline-opts/write-out.d b/docs/cmdline-opts/write-out.d
index 686bda6e..28b9a13a 100644
--- a/docs/cmdline-opts/write-out.d
+++ b/docs/cmdline-opts/write-out.d
@@ -2,6 +2,7 @@ Long: write-out
Short: w
Arg: <format>
Help: Use output FORMAT after completion
+Category: verbose
---
Make curl display information on stdout after a completed transfer. The format
is a string that may contain plain text mixed with any number of
@@ -66,6 +67,10 @@ The http method used in the most recent HTTP request (Added in 7.72.0)
.B num_connects
Number of new connects made in the recent transfer. (Added in 7.12.3)
.TP
+.B num_headers
+The number of response headers in the most recent request (restarted at each
+ redirect). Note that the status line IS NOT a header. (Added in 7.73.0)
+.TP
.B num_redirects
Number of redirects that were followed in the request. (Added in 7.12.3)
.TP
diff --git a/docs/cmdline-opts/xattr.d b/docs/cmdline-opts/xattr.d
index b7553dae..4b64c6cb 100644
--- a/docs/cmdline-opts/xattr.d
+++ b/docs/cmdline-opts/xattr.d
@@ -1,5 +1,6 @@
Long: xattr
Help: Store metadata in extended file attributes
+Category: misc
---
When saving output to a file, this option tells curl to store certain file
metadata in extended file attributes. Currently, the URL is stored in the
diff --git a/docs/curl-config.1 b/docs/curl-config.1
index 3103c897..2bf853af 100644
--- a/docs/curl-config.1
+++ b/docs/curl-config.1
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH curl-config 1 "April 26, 2020" "Curl 7.72.0" "curl-config manual"
+.TH curl-config 1 "April 26, 2020" "Curl 7.73.0" "curl-config manual"
.SH NAME
curl-config \- Get information about a libcurl installation
diff --git a/docs/curl.1 b/docs/curl.1
index efb250aa..cf42b91d 100644
--- a/docs/curl.1
+++ b/docs/curl.1
@@ -22,7 +22,7 @@
.\"
.\" DO NOT EDIT. Generated by the curl project gen.pl man page generator.
.\"
-.TH curl 1 "November 16, 2016" "Curl 7.72.0" "Curl Manual"
+.TH curl 1 "November 16, 2016" "Curl 7.73.0" "Curl Manual"
.SH NAME
curl \- transfer a URL
@@ -224,7 +224,7 @@ fail.
Used together with \fI-u, --user\fP.
-See also \fI--proxy-anyauth\fP and \fI--basic\fP and \fI--digest\fP.
+See also \fI--proxy-anyauth\fP, \fI--basic\fP and \fI--digest\fP.
.IP "-a, --append"
(FTP SFTP) When used in an upload, this makes curl append to the target file instead of
overwriting it. If the remote file doesn't exist, it will be created. Note
@@ -295,7 +295,7 @@ and P12 are recognized types. If not specified, PEM is assumed.
If this option is used several times, the last one will be used.
-See also \fI-E, --cert\fP and \fI--key\fP and \fI--key-type\fP.
+See also \fI-E, --cert\fP, \fI--key\fP and \fI--key-type\fP.
.IP "-E, --cert <certificate[:password]>"
(TLS) Tells curl to use the specified client certificate file when getting a file
with HTTPS, FTPS or another SSL-based protocol. The certificate must be in
@@ -341,7 +341,7 @@ LocalMachineEnterprise.
If this option is used several times, the last one will be used.
-See also \fI--cert-type\fP and \fI--key\fP and \fI--key-type\fP.
+See also \fI--cert-type\fP, \fI--key\fP and \fI--key-type\fP.
.IP "--ciphers <list of ciphers>"
(TLS) Specifies which ciphers to use in the connection. The list of ciphers must
specify valid ciphers. Read up on SSL cipher list details on this URL:
@@ -392,13 +392,19 @@ When curl is invoked, it (unless \fI-q, --disable\fP is used) checks for a defau
config file and uses it if found. The default config file is checked for in
the following places in this order:
-1) curl tries to find the "home dir": It first checks for the CURL_HOME and
-then the HOME environment variables. Failing that, it uses getpwuid() on
-Unix-like systems (which returns the home dir given the current user in your
-system). On Windows, it then checks for the APPDATA variable, or as a last
-resort the '%USERPROFILE%\\Application Data'.
+1) Use the CURL_HOME environment variable if set
-2) On windows, if there is no .curlrc file in the home dir, it checks for one
+2) Use the XDG_CONFIG_HOME environment variable if set (Added in 7.73.0)
+
+3) Use the HOME environment variable if set
+
+4) Non-windows: use getpwuid to find the home directory
+
+5) Windows: use APPDATA if set
+
+6) Windows: use "USERPROFILE\Application Data" if set
+
+7) On windows, if there is no .curlrc file in the home dir, it checks for one
in the same dir the curl executable is placed. On Unix-like systems, it will
simply try to load .curlrc from the determined home dir.
@@ -527,6 +533,20 @@ specify peer certificates that are to be considered revoked.
If this option is used several times, the last one will be used.
Added in 7.19.7.
+.IP "--curves <algorithm list>"
+(TLS) Tells curl to request specific curves to use during SSL session establishment
+according to RFC 8422, 5.1. Multiple algorithms can be provided by separating
+them with ":" (e.g. "X25519:P-521"). The parameter is available identically
+in the "openssl s_client/s_server" utilities.
+
+\fI--curves\fP allows a OpenSSL powered curl to make SSL-connections with exactly
+the (EC) curve requested by the client, avoiding intransparent client/server
+negotiations.
+
+If this option is set, the default curves list built into openssl will be
+ignored.
+
+Added in 7.73.0.
.IP "--data-ascii <data>"
(HTTP) This is just an alias for \fI-d, --data\fP.
.IP "--data-binary <data>"
@@ -600,7 +620,7 @@ data from a file named \&'foobar' would thus be done with \fI-d, --data\fP @foob
will be stripped out. If you don't want the @ character to have a special
interpretation use \fI--data-raw\fP instead.
-See also \fI--data-binary\fP and \fI--data-urlencode\fP and \fI--data-raw\fP. This option overrides \fI-F, --form\fP and \fI-I, --head\fP and \fI-T, --upload-file\fP.
+See also \fI--data-binary\fP, \fI--data-urlencode\fP and \fI--data-raw\fP. This option overrides \fI-F, --form\fP and \fI-I, --head\fP and \fI-T, --upload-file\fP.
.IP "--delegation <LEVEL>"
(GSS/kerberos) Set LEVEL to tell the server what it is allowed to delegate when it
comes to user credentials.
@@ -620,7 +640,7 @@ combination with the normal \fI-u, --user\fP option to set user name and passwor
If this option is used several times, only the first one is used.
-See also \fI-u, --user\fP and \fI--proxy-digest\fP and \fI--anyauth\fP. This option overrides \fI--basic\fP and \fI--ntlm\fP and \fI--negotiate\fP.
+See also \fI-u, --user\fP, \fI--proxy-digest\fP and \fI--anyauth\fP. This option overrides \fI--basic\fP and \fI--ntlm\fP and \fI--negotiate\fP.
.IP "--disable-eprt"
(FTP) Tell curl to disable the use of the EPRT and LPRT commands when doing active
FTP transfers. Curl will normally always first attempt to use EPRT, then LPRT
@@ -1127,9 +1147,13 @@ the header being sent to other hosts than the original host, so sensitive
headers should be used with caution combined with following redirects.
This option can be used multiple times to add/replace/remove multiple headers.
-.IP "-h, --help"
-Usage help. This lists all current command line options with a short
-description.
+.IP "-h, --help <category>"
+Usage help. This lists all commands of the <category>.
+If no arg was provided, curl will display the most important
+command line arguments and the list of categories.
+If the argument "all" was provided, curl will display all options available.
+If the argument "category" was provided, curl will display all categories and
+their meanings.
.IP "--hostpubmd5 <md5>"
(SFTP SCP) Pass a string containing 32 hexadecimal digits. The string should
be the 128 bit MD5 checksum of the remote host's public key, curl will refuse
@@ -1470,7 +1494,7 @@ and password from the \fI-u, --user\fP option aren't actually used.
If this option is used several times, only the first one is used.
-See also \fI--basic\fP and \fI--ntlm\fP and \fI--anyauth\fP and \fI--proxy-negotiate\fP.
+See also \fI--basic\fP, \fI--ntlm\fP, \fI--anyauth\fP and \fI--proxy-negotiate\fP.
.IP "--netrc-file <filename>"
This option is similar to \fI-n, --netrc\fP, except that you provide the path (absolute
or relative) to the netrc file that curl should use. You can only specify one
@@ -1599,6 +1623,21 @@ the \fI--url\fP or \fI-u, --user\fP options.
The Bearer Token and user name are formatted according to RFC 6750.
If this option is used several times, the last one will be used.
+.IP "--output-dir <dir>"
+
+This option specifies the directory in which files should be stored, when
+\fI-O, --remote-name\fP or \fI-o, --output\fP are used.
+
+The given output directory is used for all URLs and output options on the
+command line, up until the first \fI-:, --next\fP.
+
+If the specified target directory doesn't exist, the operation will fail
+unless \fI--create-dirs\fP is also used.
+
+If this option is used multiple times, the last specified directory will be
+used.
+
+See also \fI-O, --remote-name\fP and \fI-J, --remote-header-name\fP. Added in 7.73.0.
.IP "-o, --output <file>"
Write output to <file> instead of stdout. If you are using {} or [] to fetch
multiple documents, you should quote the URL and you can use '#' followed by a
@@ -1627,7 +1666,7 @@ See also the \fI--create-dirs\fP option to create the local directories
dynamically. Specifying the output as '-' (a single dash) will force the
output to be done to stdout.
-See also \fI-O, --remote-name\fP and \fI--remote-name-all\fP and \fI-J, --remote-header-name\fP.
+See also \fI-O, --remote-name\fP, \fI--remote-name-all\fP and \fI-J, --remote-header-name\fP.
.IP "--parallel-immediate"
When doing parallel transfers, this option will instruct curl that it should
rather prefer opening up more connections in parallel at once rather than
@@ -1685,7 +1724,7 @@ in web browsers, so curl does the conversion by default to maintain
consistency. However, a server may require a POST to remain a POST after such
a redirection. This option is meaningful only when using \fI-L, --location\fP.
-See also \fI--post302\fP and \fI--post303\fP and \fI-L, --location\fP. Added in 7.17.1.
+See also \fI--post302\fP, \fI--post303\fP and \fI-L, --location\fP. Added in 7.17.1.
.IP "--post302"
(HTTP) Tells curl to respect RFC 7231/6.4.3 and not convert POST requests into GET
requests when following a 302 redirection. The non-RFC behaviour is ubiquitous
@@ -1693,14 +1732,14 @@ in web browsers, so curl does the conversion by default to maintain
consistency. However, a server may require a POST to remain a POST after such
a redirection. This option is meaningful only when using \fI-L, --location\fP.
-See also \fI--post301\fP and \fI--post303\fP and \fI-L, --location\fP. Added in 7.19.1.
+See also \fI--post301\fP, \fI--post303\fP and \fI-L, --location\fP. Added in 7.19.1.
.IP "--post303"
(HTTP) Tells curl to violate RFC 7231/6.4.4 and not convert POST requests into GET
requests when following 303 redirections. A server may require a POST to
remain a POST after a 303 redirection. This option is meaningful only when
using \fI-L, --location\fP.
-See also \fI--post302\fP and \fI--post301\fP and \fI-L, --location\fP. Added in 7.26.0.
+See also \fI--post302\fP, \fI--post301\fP and \fI-L, --location\fP. Added in 7.26.0.
.IP "--preproxy [protocol://]host[:port]"
Use the specified SOCKS proxy before connecting to an HTTP or HTTPS \fI-x, --proxy\fP. In
such a case curl first connects to the SOCKS proxy and then connects (through
@@ -1806,21 +1845,21 @@ See also \fI--proto-redir\fP and \fI--proto-default\fP. Added in 7.20.2.
Tells curl to pick a suitable authentication method when communicating with
the given HTTP proxy. This might cause an extra request/response round-trip.
-See also \fI-x, --proxy\fP and \fI--proxy-basic\fP and \fI--proxy-digest\fP. Added in 7.13.2.
+See also \fI-x, --proxy\fP, \fI--proxy-basic\fP and \fI--proxy-digest\fP. Added in 7.13.2.
.IP "--proxy-basic"
Tells curl to use HTTP Basic authentication when communicating with the given
proxy. Use \fI--basic\fP for enabling HTTP Basic with a remote host. Basic is the
default authentication method curl uses with proxies.
-See also \fI-x, --proxy\fP and \fI--proxy-anyauth\fP and \fI--proxy-digest\fP.
+See also \fI-x, --proxy\fP, \fI--proxy-anyauth\fP and \fI--proxy-digest\fP.
.IP "--proxy-cacert <file>"
Same as \fI--cacert\fP but used in HTTPS proxy context.
-See also \fI--proxy-capath\fP and \fI--cacert\fP and \fI--capath\fP and \fI-x, --proxy\fP. Added in 7.52.0.
+See also \fI--proxy-capath\fP, \fI--cacert\fP, \fI--capath\fP and \fI-x, --proxy\fP. Added in 7.52.0.
.IP "--proxy-capath <dir>"
Same as \fI--capath\fP but used in HTTPS proxy context.
-See also \fI--proxy-cacert\fP and \fI-x, --proxy\fP and \fI--capath\fP. Added in 7.52.0.
+See also \fI--proxy-cacert\fP, \fI-x, --proxy\fP and \fI--capath\fP. Added in 7.52.0.
.IP "--proxy-cert-type <type>"
Same as \fI--cert-type\fP but used in HTTPS proxy context.
@@ -1841,7 +1880,7 @@ Added in 7.52.0.
Tells curl to use HTTP Digest authentication when communicating with the given
proxy. Use \fI--digest\fP for enabling HTTP Digest with a remote host.
-See also \fI-x, --proxy\fP and \fI--proxy-anyauth\fP and \fI--proxy-basic\fP.
+See also \fI-x, --proxy\fP, \fI--proxy-anyauth\fP and \fI--proxy-basic\fP.
.IP "--proxy-header <header/@file>"
(HTTP) Extra header to include in the request when sending HTTP to a proxy. You may
specify any number of extra headers. This is the equivalent option to \fI-H, --header\fP
@@ -2036,6 +2075,10 @@ itself before sending them to the server. File names may be quoted
shell-style to embed spaces or special characters. Following is the list of
all supported SFTP quote commands:
.RS
+.IP "atime date file"
+The atime command sets the last access time of the file named by the file
+operand. The <date expression> can be all sorts of date strings, see the
+\fIcurl_getdate(3)\fP man page for date expression details. (Added in 7.73.0)
.IP "chgrp group file"
The chgrp command sets the group ID of the file named by the file operand to
the group ID specified by the group operand. The group operand is a decimal
@@ -2052,6 +2095,10 @@ The ln and symlink commands create a symbolic link at the target_file location
pointing to the source_file location.
.IP "mkdir directory_name"
The mkdir command creates the directory named by the directory_name operand.
+.IP "mtime date file"
+The mtime command sets the last modification time of the file named by the
+file operand. The <date expression> can be all sorts of date strings, see the
+\fIcurl_getdate(3)\fP man page for date expression details. (Added in 7.73.0)
.IP "pwd"
The pwd command returns the absolute pathname of the current working directory.
.IP "rename source target"
@@ -2319,6 +2366,8 @@ Examples: \fI--negotiate\fP \fI--service-name\fP sockd would use sockd/server-na
Added in 7.43.0.
.IP "-S, --show-error"
When used with \fI-s, --silent\fP, it makes curl show an error message if it fails.
+
+See also \fI--no-progress-meter\fP.
.IP "-s, --silent"
Silent or quiet mode. Don't show progress meter or error messages. Makes Curl
mute. It will still output the data you ask for, potentially even to the
@@ -2327,7 +2376,7 @@ terminal/stdout unless you redirect it.
Use \fI-S, --show-error\fP in addition to this option to disable progress meter but
still show error messages.
-See also \fI-v, --verbose\fP and \fI--stderr\fP.
+See also \fI-v, --verbose\fP, \fI--stderr\fP and \fI--no-progress-meter\fP.
.IP "--socks4 <host[:port]>"
Use the specified SOCKS4 proxy. If the port number is not specified, it is
assumed at port 1080.
@@ -2510,7 +2559,7 @@ CONNECT response headers. This option is meant to be used with \fI-D, --dump-hea
\fI-i, --include\fP which are used to show protocol headers in the output. It has no
effect on debug options such as \fI-v, --verbose\fP or \fI--trace\fP, or any statistics.
-See also \fI-D, --dump-header\fP and \fI-i, --include\fP and \fI-p, --proxytunnel\fP.
+See also \fI-D, --dump-header\fP, \fI-i, --include\fP and \fI-p, --proxytunnel\fP.
.IP "--tcp-fastopen"
Enable use of TCP Fast Open (RFC7413).
@@ -2579,7 +2628,7 @@ Use up to TLSv1.2.
Use up to TLSv1.3.
.RE
-See also \fI--tlsv1.0\fP and \fI--tlsv1.1\fP and \fI--tlsv1.2\fP and \fI--tlsv1.3\fP. \fI--tls-max\fP requires that the underlying libcurl was built to support TLS. Added in 7.54.0.
+See also \fI--tlsv1.0\fP, \fI--tlsv1.1\fP, \fI--tlsv1.2\fP and \fI--tlsv1.3\fP. \fI--tls-max\fP requires that the underlying libcurl was built to support TLS. Added in 7.54.0.
.IP "--tls13-ciphers <ciphersuite list>"
(TLS) Specifies which cipher suites to use in the connection if it negotiates TLS
1.3. The list of ciphers suites must specify valid ciphers. Read up on TLS 1.3
@@ -2926,6 +2975,10 @@ The http method used in the most recent HTTP request (Added in 7.72.0)
.B num_connects
Number of new connects made in the recent transfer. (Added in 7.12.3)
.TP
+.B num_headers
+The number of response headers in the most recent request (restarted at each
+ redirect). Note that the status line IS NOT a header. (Added in 7.73.0)
+.TP
.B num_redirects
Number of redirects that were followed in the request. (Added in 7.12.3)
.TP
@@ -3066,11 +3119,15 @@ accesses the target URL through the proxy.
The list of host names can also be include numerical IP addresses, and IPv6
versions should then be given without enclosing brackets.
+
+IPv6 numerical addresses are compared as strings, so they will only match if
+the representations are the same: "::1" is the same as "::0:1" but they don't
+match.
.IP "CURL_SSL_BACKEND <TLS backend>"
If curl was built with support for "MultiSSL", meaning that it has built-in
support for more than one TLS backend, this environment variable can be set to
the case insensitive name of the particular backend to use when curl is
-invokved. Setting a name that isn't a built-in alternative, will make curl
+invoked. Setting a name that isn't a built-in alternative, will make curl
stay with the default.
.IP "QLOGDIR <directory name>"
If curl was built with HTTP/3 support, setting this environment variable to a
diff --git a/docs/examples/Makefile.am b/docs/examples/Makefile.am
index 44372a19..b8fd1ffd 100644
--- a/docs/examples/Makefile.am
+++ b/docs/examples/Makefile.am
@@ -22,7 +22,7 @@
AUTOMAKE_OPTIONS = foreign nostdinc
-EXTRA_DIST = README Makefile.example Makefile.inc Makefile.m32 \
+EXTRA_DIST = README.md Makefile.example Makefile.inc Makefile.m32 \
Makefile.netware makefile.dj $(COMPLICATED_EXAMPLES)
# Specify our include paths here, and do it relative to $(top_srcdir) and
diff --git a/docs/examples/Makefile.m32 b/docs/examples/Makefile.m32
index e8c0d376..a2dca6bb 100644
--- a/docs/examples/Makefile.m32
+++ b/docs/examples/Makefile.m32
@@ -294,7 +294,12 @@ endif
ifdef ZSTD
INCLUDES += -I"$(ZSTD_PATH)/include"
CFLAGS += -DHAVE_ZSTD
- curl_LDADD += -L"$(ZSTD_PATH)/lib" -lzstd
+ curl_LDADD += -L"$(ZSTD_PATH)/lib"
+ ifdef ZSTD_LIBS
+ curl_LDADD += $(ZSTD_LIBS)
+ else
+ curl_LDADD += -lzstd
+ endif
endif
ifdef BROTLI
INCLUDES += -I"$(BROTLI_PATH)/include"
diff --git a/docs/examples/README b/docs/examples/README.md
index 6336c373..f2ba0619 100644
--- a/docs/examples/README
+++ b/docs/examples/README.md
@@ -1,8 +1,4 @@
- _ _ ____ _
- ___| | | | _ \| |
- / __| | | | |_) | |
- | (__| |_| | _ <| |___
- \___|\___/|_| \_\_____|
+# libcurl examples
This directory is for libcurl programming examples. They are meant to show
some simple steps on how you can build your own application to take full
@@ -11,26 +7,26 @@ advantage of libcurl.
If you end up with other small but still useful example sources, please mail
them for submission in future packages and on the website.
-BUILDING
+## Building
The Makefile.example is an example makefile that could be used to build these
examples. Just edit the file according to your system and requirements first.
Most examples should build fine using a command line like this:
- $ `curl-config --cc --cflags --libs` -o example example.c
+ `curl-config --cc --cflags --libs` -o example example.c
Some compilers don't like having the arguments in this order but instead
want you do reorganize them like:
- $ `curl-config --cc` -o example example.c `curl-config --cflags --libs`
+ `curl-config --cc` -o example example.c `curl-config --cflags --libs`
-*PLEASE* do not use the curl.haxx.se site as a test target for your libcurl
-applications/experiments. Even if some of the examples use that site as a URL
-at some places, it doesn't mean that the URLs work or that we expect you to
-actually torture our website with your tests! Thanks.
+**Please** do not use the `curl.haxx.se` site as a test target for your
+libcurl applications/experiments. Even if some of the examples use that site
+as a URL at some places, it doesn't mean that the URLs work or that we expect
+you to actually torture our website with your tests! Thanks.
-EXAMPLES
+## Examples
Each example source code file is designed to be and work stand-alone and
rather self-explanatory. The examples may at times lack the level of error
diff --git a/docs/examples/sslbackend.c b/docs/examples/sslbackend.c
index 14c23039..12e51500 100644
--- a/docs/examples/sslbackend.c
+++ b/docs/examples/sslbackend.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -47,7 +47,7 @@ int main(int argc, char **argv)
const curl_ssl_backend **list;
int i;
- result = curl_global_sslset(-1, NULL, &list);
+ result = curl_global_sslset((curl_sslbackend)-1, NULL, &list);
assert(result == CURLSSLSET_UNKNOWN_BACKEND);
for(i = 0; list[i]; i++)
@@ -62,7 +62,7 @@ int main(int argc, char **argv)
result = curl_global_sslset((curl_sslbackend)id, NULL, NULL);
}
else
- result = curl_global_sslset(-1, name, NULL);
+ result = curl_global_sslset((curl_sslbackend)-1, name, NULL);
if(result == CURLSSLSET_UNKNOWN_BACKEND) {
fprintf(stderr, "Unknown SSL backend id: %s\n", name);
diff --git a/docs/libcurl/Makefile.inc b/docs/libcurl/Makefile.inc
index 332056a1..fb7ea89a 100644
--- a/docs/libcurl/Makefile.inc
+++ b/docs/libcurl/Makefile.inc
@@ -28,6 +28,9 @@ man_MANS = \
curl_easy_escape.3 \
curl_easy_getinfo.3 \
curl_easy_init.3 \
+ curl_easy_option_by_id.3 \
+ curl_easy_option_by_name.3 \
+ curl_easy_option_next.3 \
curl_easy_pause.3 \
curl_easy_perform.3 \
curl_easy_recv.3 \
diff --git a/docs/libcurl/curl_easy_cleanup.3 b/docs/libcurl/curl_easy_cleanup.3
index ac049970..bcef9e25 100644
--- a/docs/libcurl/curl_easy_cleanup.3
+++ b/docs/libcurl/curl_easy_cleanup.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH curl_easy_cleanup 3 "August 09, 2018" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_easy_cleanup 3 "September 16, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_easy_cleanup - End a libcurl easy handle
@@ -61,7 +61,7 @@ None
CURL *curl = curl_easy_init();
if(curl) {
CURLcode res;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
}
diff --git a/docs/libcurl/curl_easy_duphandle.3 b/docs/libcurl/curl_easy_duphandle.3
index c740c261..b757e8c0 100644
--- a/docs/libcurl/curl_easy_duphandle.3
+++ b/docs/libcurl/curl_easy_duphandle.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_easy_duphandle 3 "March 01, 2019" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_easy_duphandle 3 "March 01, 2019" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_easy_duphandle - Clone a libcurl session handle
diff --git a/docs/libcurl/curl_easy_escape.3 b/docs/libcurl/curl_easy_escape.3
index c3510826..015b5d9d 100644
--- a/docs/libcurl/curl_easy_escape.3
+++ b/docs/libcurl/curl_easy_escape.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH curl_easy_escape 3 "June 25, 2020" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_easy_escape 3 "June 25, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_easy_escape - URL encodes the given string
diff --git a/docs/libcurl/curl_easy_getinfo.3 b/docs/libcurl/curl_easy_getinfo.3
index 7524922d..938ccd1f 100644
--- a/docs/libcurl/curl_easy_getinfo.3
+++ b/docs/libcurl/curl_easy_getinfo.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH curl_easy_getinfo 3 "July 13, 2020" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_easy_getinfo 3 "August 24, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_easy_getinfo - extract information from a curl handle
@@ -142,6 +142,9 @@ See \fICURLINFO_REQUEST_SIZE(3)\fP
.IP CURLINFO_SSL_VERIFYRESULT
Certificate verification result.
See \fICURLINFO_SSL_VERIFYRESULT(3)\fP
+.IP CURLINFO_PROXY_ERROR
+Detailed proxy error.
+See \fICURLINFO_PROXY_ERROR(3)\fP
.IP CURLINFO_PROXY_SSL_VERIFYRESULT
Proxy certificate verification result.
See \fICURLINFO_PROXY_SSL_VERIFYRESULT(3)\fP
diff --git a/docs/libcurl/curl_easy_init.3 b/docs/libcurl/curl_easy_init.3
index 7aade577..38e062ef 100644
--- a/docs/libcurl/curl_easy_init.3
+++ b/docs/libcurl/curl_easy_init.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_easy_init 3 "March 23, 2020" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_easy_init 3 "September 16, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_easy_init - Start a libcurl easy session
@@ -50,7 +50,7 @@ other curl functions.
CURL *curl = curl_easy_init();
if(curl) {
CURLcode res;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
}
diff --git a/docs/libcurl/curl_easy_option_by_id.3 b/docs/libcurl/curl_easy_option_by_id.3
new file mode 100644
index 00000000..5aab60bc
--- /dev/null
+++ b/docs/libcurl/curl_easy_option_by_id.3
@@ -0,0 +1,47 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at https://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_easy_option_by_id 3 "August 27, 2020" "libcurl 7.73.0" "libcurl Manual"
+
+.SH NAME
+curl_easy_option_by_id - find an easy setopt option by id
+.SH SYNOPSIS
+.nf
+#include <curl/curl.h>
+
+const struct curl_easyoption *curl_easy_option_by_id(CURLoption id);
+.fi
+.SH DESCRIPTION
+Given a CURLoption \fBid\fP, this function returns a pointer to the
+curl_easyoption struct, holding information about the
+\fIcurl_easy_setopt(3)\fP option using that id. The option id is the CURLOPT_
+prefix ones provided in the standard curl/curl.h header file. This function
+will return the non-aliases version for the cases where there is an alias
+function as well.
+
+If libcurl has no option with the given id, this function returns NULL.
+.SH AVAILABILITY
+This function was added in libcurl 7.73.0
+.SH RETURN VALUE
+A pointer to the curl_easyoption struct for the option or NULL.
+.SH "SEE ALSO"
+.BR curl_easy_option_by_name "(3)," curl_easy_option_next "(3),"
+.BR curl_easy_setopt "(3),"
diff --git a/docs/libcurl/curl_easy_option_by_name.3 b/docs/libcurl/curl_easy_option_by_name.3
new file mode 100644
index 00000000..a44006a7
--- /dev/null
+++ b/docs/libcurl/curl_easy_option_by_name.3
@@ -0,0 +1,45 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at https://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_easy_option_by_name 3 "August 27, 2020" "libcurl 7.73.0" "libcurl Manual"
+
+.SH NAME
+curl_easy_option_by_name - find an easy setopt option by name
+.SH SYNOPSIS
+.nf
+#include <curl/curl.h>
+
+const struct curl_easyoption *curl_easy_option_by_name(const char *name);
+.fi
+.SH DESCRIPTION
+Given a \fBname\fP, this function returns a pointer to the curl_easyoption
+struct, holding information about the \fIcurl_easy_setopt(3)\fP option using
+that name. The name should be specified without the "CURLOPT_" prefix and the
+name comparison is made case insensitive.
+
+If libcurl has no option with the given name, this function returns NULL.
+.SH AVAILABILITY
+This function was added in libcurl 7.73.0
+.SH RETURN VALUE
+A pointer to the curl_easyoption struct for the option or NULL.
+.SH "SEE ALSO"
+.BR curl_easy_option_next "(3)," curl_easy_option_by_id "(3),"
+.BR curl_easy_setopt "(3),"
diff --git a/docs/libcurl/curl_easy_option_next.3 b/docs/libcurl/curl_easy_option_next.3
new file mode 100644
index 00000000..56132c98
--- /dev/null
+++ b/docs/libcurl/curl_easy_option_next.3
@@ -0,0 +1,75 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at https://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_easy_option_next 3 "August 27, 2020" "libcurl 7.73.0" "libcurl Manual"
+
+.SH NAME
+curl_easy_option_next - iterate over easy setopt options
+.SH SYNOPSIS
+.nf
+#include <curl/curl.h>
+
+typedef enum {
+ CURLOT_LONG, /* long (a range of values) */
+ CURLOT_VALUES, /* (a defined set or bitmask) */
+ CURLOT_OFF_T, /* curl_off_t (a range of values) */
+ CURLOT_OBJECT, /* pointer (void *) */
+ CURLOT_STRING, /* (char * to zero terminated buffer) */
+ CURLOT_SLIST, /* (struct curl_slist *) */
+ CURLOT_CBPTR, /* (void * passed as-is to a callback) */
+ CURLOT_BLOB, /* blob (struct curl_blob *) */
+ CURLOT_FUNCTION /* function pointer */
+} curl_easytype;
+
+/* The CURLOPTTYPE_* id ranges can still be used to figure out what type/size
+ to use for curl_easy_setopt() for the given id */
+struct curl_easyoption {
+ const char *name;
+ CURLoption id;
+ curl_easytype type;
+ unsigned int flags;
+};
+
+const struct curl_easyoption *
+curl_easy_option_next(const struct curl_easyoption *prev);
+.fi
+.SH DESCRIPTION
+This function returns a pointer to the first or the next curl_easyoption
+struct, providing an ability to iterate over all known options for
+\fIcurl_easy_setopt(3)\fP in this instance of libcurl.
+
+Pass a \fBNULL\fP argument as \fBprev\fP to get the first option returned, or
+pass in the current option to get the next one returned. If there is no more
+option to return, \fIcurl_easy_option_next(3)\fP returns NULL.
+
+The options returned by this functions are the ones known to this libcurl and
+information about what argument type they want.
+
+If the \fBCURLOT_FLAG_ALIAS\fP bit is set in the flags field, it means the
+name is provided for backwards compatibility as an alias.
+.SH AVAILABILITY
+This function was added in libcurl 7.73.0
+.SH RETURN VALUE
+A pointer to the curl_easyoption struct for the next option or NULL if no more
+options.
+.SH "SEE ALSO"
+.BR curl_easy_option_by_name "(3)," curl_easy_option_by_id "(3),"
+.BR curl_easy_setopt "(3),"
diff --git a/docs/libcurl/curl_easy_pause.3 b/docs/libcurl/curl_easy_pause.3
index df5d095d..37d3f050 100644
--- a/docs/libcurl/curl_easy_pause.3
+++ b/docs/libcurl/curl_easy_pause.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_easy_pause 3 "May 01, 2016" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_easy_pause 3 "May 01, 2016" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_easy_pause - pause and unpause a connection
diff --git a/docs/libcurl/curl_easy_perform.3 b/docs/libcurl/curl_easy_perform.3
index b0574f45..eeeb5df9 100644
--- a/docs/libcurl/curl_easy_perform.3
+++ b/docs/libcurl/curl_easy_perform.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_easy_perform 3 "March 23, 2020" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_easy_perform 3 "September 16, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_easy_perform - perform a blocking file transfer
@@ -64,7 +64,7 @@ the error buffer when non-zero is returned.
CURL *curl = curl_easy_init();
if(curl) {
CURLcode res;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
}
diff --git a/docs/libcurl/curl_easy_recv.3 b/docs/libcurl/curl_easy_recv.3
index b1faca99..3212e2c3 100644
--- a/docs/libcurl/curl_easy_recv.3
+++ b/docs/libcurl/curl_easy_recv.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH curl_easy_recv 3 "December 18, 2016" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_easy_recv 3 "December 18, 2016" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_easy_recv - receives raw data on an "easy" connection
diff --git a/docs/libcurl/curl_easy_reset.3 b/docs/libcurl/curl_easy_reset.3
index 14d5acf5..f9caabba 100644
--- a/docs/libcurl/curl_easy_reset.3
+++ b/docs/libcurl/curl_easy_reset.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_easy_reset 3 "February 09, 2020" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_easy_reset 3 "February 09, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_easy_reset - reset all options of a libcurl session handle
diff --git a/docs/libcurl/curl_easy_send.3 b/docs/libcurl/curl_easy_send.3
index b38e58f8..480b4a29 100644
--- a/docs/libcurl/curl_easy_send.3
+++ b/docs/libcurl/curl_easy_send.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH curl_easy_send 3 "December 18, 2016" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_easy_send 3 "December 18, 2016" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_easy_send - sends raw data over an "easy" connection
diff --git a/docs/libcurl/curl_easy_setopt.3 b/docs/libcurl/curl_easy_setopt.3
index 3242b5cc..2b67d4ae 100644
--- a/docs/libcurl/curl_easy_setopt.3
+++ b/docs/libcurl/curl_easy_setopt.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH curl_easy_setopt 3 "May 19, 2020" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_easy_setopt 3 "September 21, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_easy_setopt \- set options for a curl easy handle
@@ -533,6 +533,8 @@ Proxy client key type. See \fICURLOPT_PROXY_SSLKEYTYPE(3)\fP
Client key password. See \fICURLOPT_KEYPASSWD(3)\fP
.IP CURLOPT_PROXY_KEYPASSWD
Proxy client key password. See \fICURLOPT_PROXY_KEYPASSWD(3)\fP
+.IP CURLOPT_SSL_EC_CURVES
+Set key exchange curves. See \fICURLOPT_SSL_EC_CURVES(3)\fP
.IP CURLOPT_SSL_ENABLE_ALPN
Enable use of ALPN. See \fICURLOPT_SSL_ENABLE_ALPN(3)\fP
.IP CURLOPT_SSL_ENABLE_NPN
@@ -644,6 +646,9 @@ Strings passed on to libcurl must be shorter than 8000000 bytes, otherwise
\fIcurl_easy_setopt(3)\fP returns \fBCURLE_BAD_FUNCTION_ARGUMENT\fP (added in
7.65.0).
+\fBCURLE_BAD_FUNCTION_ARGUMENT\fP is returned when the argument to an option
+is invalid, like perhaps out of range.a
+
If you try to set an option that libcurl doesn't know about, perhaps because
the library is too old to support it or the option was removed in a recent
version, this function will return \fICURLE_UNKNOWN_OPTION\fP. If support for
@@ -654,7 +659,7 @@ the option was disabled at compile-time, it will return
CURL *curl = curl_easy_init();
if(curl) {
CURLcode res;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
}
diff --git a/docs/libcurl/curl_easy_strerror.3 b/docs/libcurl/curl_easy_strerror.3
index 43e3b714..ce274acd 100644
--- a/docs/libcurl/curl_easy_strerror.3
+++ b/docs/libcurl/curl_easy_strerror.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_easy_strerror 3 "June 25, 2020" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_easy_strerror 3 "June 25, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_easy_strerror - return string describing error code
diff --git a/docs/libcurl/curl_easy_unescape.3 b/docs/libcurl/curl_easy_unescape.3
index fa18174f..29029a24 100644
--- a/docs/libcurl/curl_easy_unescape.3
+++ b/docs/libcurl/curl_easy_unescape.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH curl_easy_unescape 3 "June 25, 2020" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_easy_unescape 3 "June 25, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_easy_unescape - URL decodes the given string
diff --git a/docs/libcurl/curl_escape.3 b/docs/libcurl/curl_escape.3
index fa74ca5c..73951cdb 100644
--- a/docs/libcurl/curl_escape.3
+++ b/docs/libcurl/curl_escape.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_escape 3 "June 25, 2020" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_escape 3 "June 25, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_escape - URL encodes the given string
diff --git a/docs/libcurl/curl_formadd.3 b/docs/libcurl/curl_formadd.3
index 3fdf47cc..f906a74a 100644
--- a/docs/libcurl/curl_formadd.3
+++ b/docs/libcurl/curl_formadd.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_formadd 3 "March 23, 2020" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_formadd 3 "March 23, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_formadd - add a section to a multipart/formdata HTTP POST
diff --git a/docs/libcurl/curl_formfree.3 b/docs/libcurl/curl_formfree.3
index ea3eead4..c027253e 100644
--- a/docs/libcurl/curl_formfree.3
+++ b/docs/libcurl/curl_formfree.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_formfree 3 "August 09, 2018" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_formfree 3 "August 09, 2018" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_formfree - free a previously build multipart/formdata HTTP POST chain
diff --git a/docs/libcurl/curl_formget.3 b/docs/libcurl/curl_formget.3
index aeb61bc8..950bc5d1 100644
--- a/docs/libcurl/curl_formget.3
+++ b/docs/libcurl/curl_formget.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_formget 3 "September 02, 2017" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_formget 3 "September 02, 2017" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_formget - serialize a previously built multipart/formdata HTTP POST chain
diff --git a/docs/libcurl/curl_free.3 b/docs/libcurl/curl_free.3
index d3697c97..99b76e15 100644
--- a/docs/libcurl/curl_free.3
+++ b/docs/libcurl/curl_free.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_free 3 "August 09, 2018" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_free 3 "August 09, 2018" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_free - reclaim memory that has been obtained through a libcurl call
diff --git a/docs/libcurl/curl_getdate.3 b/docs/libcurl/curl_getdate.3
index 75bdb76c..6b2e2b5e 100644
--- a/docs/libcurl/curl_getdate.3
+++ b/docs/libcurl/curl_getdate.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_getdate 3 "January 18, 2018" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_getdate 3 "January 18, 2018" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_getdate - Convert a date string to number of seconds
diff --git a/docs/libcurl/curl_getenv.3 b/docs/libcurl/curl_getenv.3
index b16f7ebc..1be19e5b 100644
--- a/docs/libcurl/curl_getenv.3
+++ b/docs/libcurl/curl_getenv.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_getenv 3 "June 25, 2020" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_getenv 3 "June 25, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_getenv - return value for environment name
diff --git a/docs/libcurl/curl_global_cleanup.3 b/docs/libcurl/curl_global_cleanup.3
index cb89cb2a..e1148826 100644
--- a/docs/libcurl/curl_global_cleanup.3
+++ b/docs/libcurl/curl_global_cleanup.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_global_cleanup 3 "September 20, 2016" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_global_cleanup 3 "September 20, 2016" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_global_cleanup - global libcurl cleanup
diff --git a/docs/libcurl/curl_global_init.3 b/docs/libcurl/curl_global_init.3
index 0871c06f..1ff813b0 100644
--- a/docs/libcurl/curl_global_init.3
+++ b/docs/libcurl/curl_global_init.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_global_init 3 "January 23, 2020" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_global_init 3 "January 23, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_global_init - Global libcurl initialisation
diff --git a/docs/libcurl/curl_global_init_mem.3 b/docs/libcurl/curl_global_init_mem.3
index 093ddb70..81d64253 100644
--- a/docs/libcurl/curl_global_init_mem.3
+++ b/docs/libcurl/curl_global_init_mem.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_global_init_mem 3 "August 11, 2019" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_global_init_mem 3 "August 11, 2019" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_global_init_mem - Global libcurl initialisation with memory callbacks
diff --git a/docs/libcurl/curl_global_sslset.3 b/docs/libcurl/curl_global_sslset.3
index 6ae894dd..1b653909 100644
--- a/docs/libcurl/curl_global_sslset.3
+++ b/docs/libcurl/curl_global_sslset.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_global_sslset 3 "August 07, 2020" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_global_sslset 3 "August 07, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_global_sslset - Select SSL backend to use with libcurl
diff --git a/docs/libcurl/curl_mime_addpart.3 b/docs/libcurl/curl_mime_addpart.3
index dafabd8b..46264c6c 100644
--- a/docs/libcurl/curl_mime_addpart.3
+++ b/docs/libcurl/curl_mime_addpart.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_mime_addpart 3 "September 22, 2017" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_mime_addpart 3 "September 22, 2017" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_mime_addpart - append a new empty part to a mime structure
diff --git a/docs/libcurl/curl_mime_data.3 b/docs/libcurl/curl_mime_data.3
index aa6ced99..dee6b74a 100644
--- a/docs/libcurl/curl_mime_data.3
+++ b/docs/libcurl/curl_mime_data.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_mime_data 3 "June 25, 2020" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_mime_data 3 "June 25, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_mime_data - set a mime part's body data from memory
diff --git a/docs/libcurl/curl_mime_data_cb.3 b/docs/libcurl/curl_mime_data_cb.3
index 57de7cd2..9733d445 100644
--- a/docs/libcurl/curl_mime_data_cb.3
+++ b/docs/libcurl/curl_mime_data_cb.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_mime_data_cb 3 "April 17, 2018" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_mime_data_cb 3 "April 17, 2018" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_mime_data_cb - set a callback-based data source for a mime part's body
diff --git a/docs/libcurl/curl_mime_encoder.3 b/docs/libcurl/curl_mime_encoder.3
index a67a4a04..279ce9e5 100644
--- a/docs/libcurl/curl_mime_encoder.3
+++ b/docs/libcurl/curl_mime_encoder.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_mime_encoder 3 "June 25, 2020" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_mime_encoder 3 "June 25, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_mime_encoder - set a mime part's encoder and content transfer encoding
diff --git a/docs/libcurl/curl_mime_filedata.3 b/docs/libcurl/curl_mime_filedata.3
index 4f6a6cb1..38bc2849 100644
--- a/docs/libcurl/curl_mime_filedata.3
+++ b/docs/libcurl/curl_mime_filedata.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_mime_filedata 3 "June 25, 2020" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_mime_filedata 3 "June 25, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_mime_filedata - set a mime part's body data from a file contents
diff --git a/docs/libcurl/curl_mime_filename.3 b/docs/libcurl/curl_mime_filename.3
index 4f552d13..ebf43251 100644
--- a/docs/libcurl/curl_mime_filename.3
+++ b/docs/libcurl/curl_mime_filename.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_mime_filename 3 "June 25, 2020" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_mime_filename 3 "June 25, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_mime_filename - set a mime part's remote file name
diff --git a/docs/libcurl/curl_mime_free.3 b/docs/libcurl/curl_mime_free.3
index ee19b891..bf7753ce 100644
--- a/docs/libcurl/curl_mime_free.3
+++ b/docs/libcurl/curl_mime_free.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_mime_free 3 "August 09, 2018" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_mime_free 3 "August 09, 2018" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_mime_free - free a previously built mime structure
diff --git a/docs/libcurl/curl_mime_headers.3 b/docs/libcurl/curl_mime_headers.3
index 9f6c17b2..af148b5c 100644
--- a/docs/libcurl/curl_mime_headers.3
+++ b/docs/libcurl/curl_mime_headers.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_mime_headers 3 "September 22, 2017" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_mime_headers 3 "September 08, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_mime_headers - set a mime part's custom headers
@@ -51,7 +51,7 @@ CURLE_OK or a CURL error code upon failure.
.nf
struct curl_slist *headers = NULL;
- headers = curl_slist_append("Custom-Header: mooo", headers);
+ headers = curl_slist_append(headers, "Custom-Header: mooo");
/* use these headers, please take ownership */
curl_mime_headers(part, headers, TRUE);
diff --git a/docs/libcurl/curl_mime_init.3 b/docs/libcurl/curl_mime_init.3
index 682b646a..b3a1da94 100644
--- a/docs/libcurl/curl_mime_init.3
+++ b/docs/libcurl/curl_mime_init.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_mime_init 3 "September 22, 2017" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_mime_init 3 "September 16, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_mime_init - create a mime handle
@@ -57,7 +57,7 @@ A mime struct handle, or NULL upon failure.
/* Post and send it. */
curl_easy_setopt(easy, CURLOPT_MIMEPOST, mime);
- curl_easy_setopt(easy, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(easy, CURLOPT_URL, "https://example.com");
curl_easy_perform(easy);
/* Clean-up. */
diff --git a/docs/libcurl/curl_mime_name.3 b/docs/libcurl/curl_mime_name.3
index 4c4f9ec3..10c5b121 100644
--- a/docs/libcurl/curl_mime_name.3
+++ b/docs/libcurl/curl_mime_name.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_mime_name 3 "June 25, 2020" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_mime_name 3 "June 25, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_mime_name - set a mime part's name
diff --git a/docs/libcurl/curl_mime_subparts.3 b/docs/libcurl/curl_mime_subparts.3
index 2dc20ed0..9240e81a 100644
--- a/docs/libcurl/curl_mime_subparts.3
+++ b/docs/libcurl/curl_mime_subparts.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_mime_subparts 3 "September 05, 2017" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_mime_subparts 3 "September 05, 2017" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_mime_subparts - set subparts of a multipart mime part
diff --git a/docs/libcurl/curl_mime_type.3 b/docs/libcurl/curl_mime_type.3
index 6f45e5bd..3d9ecbbf 100644
--- a/docs/libcurl/curl_mime_type.3
+++ b/docs/libcurl/curl_mime_type.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_mime_type 3 "June 25, 2020" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_mime_type 3 "June 25, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_mime_type - set a mime part's content type
diff --git a/docs/libcurl/curl_mprintf.3 b/docs/libcurl/curl_mprintf.3
index d2a5592d..253490b0 100644
--- a/docs/libcurl/curl_mprintf.3
+++ b/docs/libcurl/curl_mprintf.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_printf 3 "April 01, 2016" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_printf 3 "April 01, 2016" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_maprintf, curl_mfprintf, curl_mprintf, curl_msnprintf, curl_msprintf
diff --git a/docs/libcurl/curl_multi_add_handle.3 b/docs/libcurl/curl_multi_add_handle.3
index 7d6cd2b4..568a74f1 100644
--- a/docs/libcurl/curl_multi_add_handle.3
+++ b/docs/libcurl/curl_multi_add_handle.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_add_handle 3 "June 30, 2018" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_multi_add_handle 3 "June 30, 2018" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_multi_add_handle - add an easy handle to a multi session
diff --git a/docs/libcurl/curl_multi_assign.3 b/docs/libcurl/curl_multi_assign.3
index b419f4e7..6fd1f2ef 100644
--- a/docs/libcurl/curl_multi_assign.3
+++ b/docs/libcurl/curl_multi_assign.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_assign 3 "March 23, 2020" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_multi_assign 3 "March 23, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_multi_assign \- set data to associate with an internal socket
diff --git a/docs/libcurl/curl_multi_cleanup.3 b/docs/libcurl/curl_multi_cleanup.3
index 0706adfd..8b22a2df 100644
--- a/docs/libcurl/curl_multi_cleanup.3
+++ b/docs/libcurl/curl_multi_cleanup.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_cleanup 3 "August 09, 2018" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_multi_cleanup 3 "August 09, 2018" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_multi_cleanup - close down a multi session
diff --git a/docs/libcurl/curl_multi_fdset.3 b/docs/libcurl/curl_multi_fdset.3
index f5661963..f1f8d60a 100644
--- a/docs/libcurl/curl_multi_fdset.3
+++ b/docs/libcurl/curl_multi_fdset.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_fdset 3 "November 09, 2017" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_multi_fdset 3 "November 09, 2017" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_multi_fdset - extracts file descriptor information from a multi handle
diff --git a/docs/libcurl/curl_multi_info_read.3 b/docs/libcurl/curl_multi_info_read.3
index 7c46830c..1a67710f 100644
--- a/docs/libcurl/curl_multi_info_read.3
+++ b/docs/libcurl/curl_multi_info_read.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_info_read 3 "March 23, 2020" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_multi_info_read 3 "March 23, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_multi_info_read - read multi stack informationals
diff --git a/docs/libcurl/curl_multi_init.3 b/docs/libcurl/curl_multi_init.3
index e51a2256..e62a8481 100644
--- a/docs/libcurl/curl_multi_init.3
+++ b/docs/libcurl/curl_multi_init.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_init 3 "March 23, 2020" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_multi_init 3 "March 23, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_multi_init - create a multi handle
diff --git a/docs/libcurl/curl_multi_perform.3 b/docs/libcurl/curl_multi_perform.3
index b22d355b..179fbfdd 100644
--- a/docs/libcurl/curl_multi_perform.3
+++ b/docs/libcurl/curl_multi_perform.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_perform 3 "August 14, 2020" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_multi_perform 3 "August 14, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_multi_perform - reads/writes available data from each easy handle
diff --git a/docs/libcurl/curl_multi_poll.3 b/docs/libcurl/curl_multi_poll.3
index 229d52e0..1a0888ee 100644
--- a/docs/libcurl/curl_multi_poll.3
+++ b/docs/libcurl/curl_multi_poll.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_poll 3 "November 17, 2019" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_multi_poll 3 "November 17, 2019" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_multi_poll - polls on all easy handles in a multi handle
diff --git a/docs/libcurl/curl_multi_remove_handle.3 b/docs/libcurl/curl_multi_remove_handle.3
index 80522dcb..2395e300 100644
--- a/docs/libcurl/curl_multi_remove_handle.3
+++ b/docs/libcurl/curl_multi_remove_handle.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_remove_handle 3 "February 19, 2019" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_multi_remove_handle 3 "February 19, 2019" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_multi_remove_handle - remove an easy handle from a multi session
diff --git a/docs/libcurl/curl_multi_setopt.3 b/docs/libcurl/curl_multi_setopt.3
index 600ad5a9..d548c58e 100644
--- a/docs/libcurl/curl_multi_setopt.3
+++ b/docs/libcurl/curl_multi_setopt.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_setopt 3 "September 24, 2019" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_multi_setopt 3 "September 24, 2019" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_multi_setopt \- set options for a curl multi handle
diff --git a/docs/libcurl/curl_multi_socket.3 b/docs/libcurl/curl_multi_socket.3
index 0989a7a6..c8f04922 100644
--- a/docs/libcurl/curl_multi_socket.3
+++ b/docs/libcurl/curl_multi_socket.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_socket 3 "June 30, 2018" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_multi_socket 3 "June 30, 2018" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_multi_socket \- reads/writes available data
diff --git a/docs/libcurl/curl_multi_socket_action.3 b/docs/libcurl/curl_multi_socket_action.3
index 2ecdc36a..121ac0bc 100644
--- a/docs/libcurl/curl_multi_socket_action.3
+++ b/docs/libcurl/curl_multi_socket_action.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_socket_action 3 "June 10, 2019" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_multi_socket_action 3 "June 10, 2019" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_multi_socket_action \- reads/writes available data given an action
diff --git a/docs/libcurl/curl_multi_strerror.3 b/docs/libcurl/curl_multi_strerror.3
index a65f7187..b5e5f73d 100644
--- a/docs/libcurl/curl_multi_strerror.3
+++ b/docs/libcurl/curl_multi_strerror.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_strerror 3 "June 25, 2020" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_multi_strerror 3 "June 25, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_multi_strerror - return string describing error code
diff --git a/docs/libcurl/curl_multi_timeout.3 b/docs/libcurl/curl_multi_timeout.3
index 8c3d6991..cdbc3de3 100644
--- a/docs/libcurl/curl_multi_timeout.3
+++ b/docs/libcurl/curl_multi_timeout.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_timeout 3 "March 23, 2020" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_multi_timeout 3 "March 23, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_multi_timeout \- how long to wait for action before proceeding
diff --git a/docs/libcurl/curl_multi_wait.3 b/docs/libcurl/curl_multi_wait.3
index dd913a5c..61fe44bd 100644
--- a/docs/libcurl/curl_multi_wait.3
+++ b/docs/libcurl/curl_multi_wait.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_wait 3 "November 28, 2019" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_multi_wait 3 "November 28, 2019" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_multi_wait - polls on all easy handles in a multi handle
diff --git a/docs/libcurl/curl_multi_wakeup.3 b/docs/libcurl/curl_multi_wakeup.3
index 6eb25ebc..a6be2636 100644
--- a/docs/libcurl/curl_multi_wakeup.3
+++ b/docs/libcurl/curl_multi_wakeup.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_wakeup 3 "November 25, 2019" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_multi_wakeup 3 "November 25, 2019" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_multi_wakeup - wakes up a sleeping curl_multi_poll call
diff --git a/docs/libcurl/curl_share_cleanup.3 b/docs/libcurl/curl_share_cleanup.3
index ebbd0b58..b5bdb5d5 100644
--- a/docs/libcurl/curl_share_cleanup.3
+++ b/docs/libcurl/curl_share_cleanup.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_share_cleanup 3 "August 09, 2018" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_share_cleanup 3 "August 09, 2018" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_share_cleanup - Clean up a shared object
diff --git a/docs/libcurl/curl_share_init.3 b/docs/libcurl/curl_share_init.3
index 2ec5a633..afbbfad1 100644
--- a/docs/libcurl/curl_share_init.3
+++ b/docs/libcurl/curl_share_init.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_share_init 3 "March 23, 2020" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_share_init 3 "March 23, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_share_init - Create a shared object
diff --git a/docs/libcurl/curl_share_setopt.3 b/docs/libcurl/curl_share_setopt.3
index 9110c9b0..f2e5c8c3 100644
--- a/docs/libcurl/curl_share_setopt.3
+++ b/docs/libcurl/curl_share_setopt.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_share_setopt 3 "August 11, 2020" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_share_setopt 3 "August 11, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_share_setopt - Set options for a shared object
diff --git a/docs/libcurl/curl_share_strerror.3 b/docs/libcurl/curl_share_strerror.3
index e09f3e23..7667570b 100644
--- a/docs/libcurl/curl_share_strerror.3
+++ b/docs/libcurl/curl_share_strerror.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_share_strerror 3 "June 25, 2020" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_share_strerror 3 "June 25, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_share_strerror - return string describing error code
diff --git a/docs/libcurl/curl_slist_append.3 b/docs/libcurl/curl_slist_append.3
index e6a7132c..3c84193f 100644
--- a/docs/libcurl/curl_slist_append.3
+++ b/docs/libcurl/curl_slist_append.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_slist_append 3 "January 02, 2019" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_slist_append 3 "January 02, 2019" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_slist_append - add a string to an slist
diff --git a/docs/libcurl/curl_slist_free_all.3 b/docs/libcurl/curl_slist_free_all.3
index c22d1fec..39b09d72 100644
--- a/docs/libcurl/curl_slist_free_all.3
+++ b/docs/libcurl/curl_slist_free_all.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_slist_free_all 3 "September 23, 2018" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_slist_free_all 3 "September 23, 2018" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_slist_free_all - free an entire curl_slist list
diff --git a/docs/libcurl/curl_strequal.3 b/docs/libcurl/curl_strequal.3
index 56ee819c..481b4fde 100644
--- a/docs/libcurl/curl_strequal.3
+++ b/docs/libcurl/curl_strequal.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_strequal 3 "June 29, 2017" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_strequal 3 "June 29, 2017" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_strequal, curl_strnequal - case insensitive string comparisons
diff --git a/docs/libcurl/curl_unescape.3 b/docs/libcurl/curl_unescape.3
index ad67032d..9775efbe 100644
--- a/docs/libcurl/curl_unescape.3
+++ b/docs/libcurl/curl_unescape.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_unescape 3 "June 25, 2020" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_unescape 3 "June 25, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_unescape - URL decodes the given string
diff --git a/docs/libcurl/curl_url.3 b/docs/libcurl/curl_url.3
index 3f8073bc..98435d39 100644
--- a/docs/libcurl/curl_url.3
+++ b/docs/libcurl/curl_url.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_url 3 "March 22, 2019" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_url 3 "March 22, 2019" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_url - returns a new CURLU handle
diff --git a/docs/libcurl/curl_url_cleanup.3 b/docs/libcurl/curl_url_cleanup.3
index 3a75856a..33b0998f 100644
--- a/docs/libcurl/curl_url_cleanup.3
+++ b/docs/libcurl/curl_url_cleanup.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_url_cleanup 3 "September 08, 2018" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_url_cleanup 3 "September 08, 2018" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_url_cleanup - free a CURLU handle
diff --git a/docs/libcurl/curl_url_dup.3 b/docs/libcurl/curl_url_dup.3
index 3d6e041f..8ab084bb 100644
--- a/docs/libcurl/curl_url_dup.3
+++ b/docs/libcurl/curl_url_dup.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_url_dup 3 "September 08, 2018" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_url_dup 3 "September 08, 2018" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_url_dup - duplicate a CURLU handle
diff --git a/docs/libcurl/curl_url_get.3 b/docs/libcurl/curl_url_get.3
index 0a788ea8..3209931e 100644
--- a/docs/libcurl/curl_url_get.3
+++ b/docs/libcurl/curl_url_get.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_url_get 3 "September 25, 2019" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_url_get 3 "September 25, 2019" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_url_get - extract a part from a URL
diff --git a/docs/libcurl/curl_url_set.3 b/docs/libcurl/curl_url_set.3
index 422e4e72..6a6c54f1 100644
--- a/docs/libcurl/curl_url_set.3
+++ b/docs/libcurl/curl_url_set.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_url_set 3 "June 25, 2020" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_url_set 3 "June 25, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_url_set - set a URL part
diff --git a/docs/libcurl/curl_version.3 b/docs/libcurl/curl_version.3
index 0abc1a9c..b192b326 100644
--- a/docs/libcurl/curl_version.3
+++ b/docs/libcurl/curl_version.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_version 3 "June 25, 2020" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_version 3 "June 25, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_version - returns the libcurl version string
diff --git a/docs/libcurl/curl_version_info.3 b/docs/libcurl/curl_version_info.3
index b864a397..9e224b94 100644
--- a/docs/libcurl/curl_version_info.3
+++ b/docs/libcurl/curl_version_info.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH curl_version_info 3 "July 14, 2020" "libcurl 7.72.0" "libcurl Manual"
+.TH curl_version_info 3 "August 27, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_version_info - returns run-time libcurl version info
@@ -193,7 +193,8 @@ makes libcurl use Windows-provided functions for Kerberos, NTLM, SPNEGO and
Digest authentication. It also allows libcurl to use the current user
credentials without the app having to pass them on. (Added in 7.13.2)
.IP CURL_VERSION_TLSAUTH_SRP
-libcurl was built with support for TLS-SRP. (Added in 7.21.4)
+libcurl was built with support for TLS-SRP (in one or more of the built-in TLS
+backends). (Added in 7.21.4)
.IP CURL_VERSION_UNIX_SOCKETS
libcurl was built with support for Unix domain sockets.
(Added in 7.40.0)
diff --git a/docs/libcurl/libcurl-easy.3 b/docs/libcurl/libcurl-easy.3
index 4be90c58..78cae734 100644
--- a/docs/libcurl/libcurl-easy.3
+++ b/docs/libcurl/libcurl-easy.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH libcurl 3 "March 23, 2020" "libcurl 7.72.0" "libcurl easy interface"
+.TH libcurl 3 "March 23, 2020" "libcurl 7.73.0" "libcurl easy interface"
.SH NAME
libcurl-easy \- easy interface overview
diff --git a/docs/libcurl/libcurl-env.3 b/docs/libcurl/libcurl-env.3
index 86d544ad..f81244d5 100644
--- a/docs/libcurl/libcurl-env.3
+++ b/docs/libcurl/libcurl-env.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 2018 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH libcurl-env 3 "April 17, 2018" "libcurl 7.72.0" "libcurl environment variables"
+.TH libcurl-env 3 "September 16, 2020" "libcurl 7.73.0" "libcurl environment variables"
.SH NAME
libcurl-env \- environment variables libcurl understands
@@ -31,7 +31,7 @@ supports a set of additional environment variables independently of this.
.IP "[scheme]_proxy"
When libcurl is given a URL to use in a transfer, it first extracts the
"scheme" part from the URL and checks if there is a given proxy set for that
-in its corresponding environment variable. A URL like "http://example.com"
+in its corresponding environment variable. A URL like "https://example.com"
will hence use the "http_proxy" variable, while a URL like "ftp://example.com"
will use the "ftp_proxy" variable.
diff --git a/docs/libcurl/libcurl-errors.3 b/docs/libcurl/libcurl-errors.3
index 5db5c9fc..b16cfc3d 100644
--- a/docs/libcurl/libcurl-errors.3
+++ b/docs/libcurl/libcurl-errors.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH libcurl-errors 3 "July 29, 2020" "libcurl 7.72.0" "libcurl errors"
+.TH libcurl-errors 3 "July 29, 2020" "libcurl 7.73.0" "libcurl errors"
.SH NAME
libcurl-errors \- error codes in libcurl
diff --git a/docs/libcurl/libcurl-multi.3 b/docs/libcurl/libcurl-multi.3
index 26768b6f..95c3681a 100644
--- a/docs/libcurl/libcurl-multi.3
+++ b/docs/libcurl/libcurl-multi.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH libcurl-multi 3 "April 26, 2020" "libcurl 7.72.0" "libcurl multi interface"
+.TH libcurl-multi 3 "April 26, 2020" "libcurl 7.73.0" "libcurl multi interface"
.SH NAME
libcurl-multi \- how to use the multi interface
diff --git a/docs/libcurl/libcurl-security.3 b/docs/libcurl/libcurl-security.3
index 104d380c..2460058e 100644
--- a/docs/libcurl/libcurl-security.3
+++ b/docs/libcurl/libcurl-security.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH libcurl-security 3 "March 09, 2020" "libcurl 7.72.0" "libcurl security"
+.TH libcurl-security 3 "September 16, 2020" "libcurl 7.73.0" "libcurl security"
.SH NAME
libcurl-security \- security considerations when using libcurl
@@ -155,7 +155,7 @@ behind a firewall. Applications can mitigate against this by using the
\fICURLOPT_FTP_SKIP_PASV_IP(3)\fP option or \fICURLOPT_FTPPORT(3)\fP.
Local servers sometimes assume local access comes from friends and trusted
-users. An application that expects http://example.com/file_to_read that and
+users. An application that expects https://example.com/file_to_read that and
instead gets http://192.168.0.1/my_router_config might print a file that would
otherwise be protected by the firewall.
diff --git a/docs/libcurl/libcurl-share.3 b/docs/libcurl/libcurl-share.3
index 4c2fef47..decfdf31 100644
--- a/docs/libcurl/libcurl-share.3
+++ b/docs/libcurl/libcurl-share.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH libcurl-share 3 "November 27, 2017" "libcurl 7.72.0" "libcurl share interface"
+.TH libcurl-share 3 "November 27, 2017" "libcurl 7.73.0" "libcurl share interface"
.SH NAME
libcurl-share \- how to use the share interface
diff --git a/docs/libcurl/libcurl-symbols.3 b/docs/libcurl/libcurl-symbols.3
index f688c4d3..22c7b4be 100644
--- a/docs/libcurl/libcurl-symbols.3
+++ b/docs/libcurl/libcurl-symbols.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH libcurl-symbols 3 "Aug 19, 2020" "libcurl 7.41.0" "libcurl symbols"
+.TH libcurl-symbols 3 "Oct 14, 2020" "libcurl 7.41.0" "libcurl symbols"
.SH NAME
libcurl-symbols \- libcurl symbol version information
.SH "libcurl symbols"
@@ -245,6 +245,8 @@ Introduced in 7.1
Introduced in 7.1
.IP CURLE_PEER_FAILED_VERIFICATION
Introduced in 7.17.1
+.IP CURLE_PROXY
+Introduced in 7.73.0
.IP CURLE_QUIC_CONNECT_ERROR
Introduced in 7.69.0
.IP CURLE_QUOTE_ERROR
@@ -592,6 +594,8 @@ Introduced in 7.10.3
Introduced in 7.52.0
.IP CURLINFO_PROXYAUTH_AVAIL
Introduced in 7.10.8
+.IP CURLINFO_PROXY_ERROR
+Introduced in 7.73.0
.IP CURLINFO_PROXY_SSL_VERIFYRESULT
Introduced in 7.52.0
.IP CURLINFO_PTR
@@ -689,6 +693,8 @@ Introduced in 7.19.6
Introduced in 7.19.6
.IP CURLKHSTAT_FINE_ADD_TO_FILE
Introduced in 7.19.6
+.IP CURLKHSTAT_FINE_REPLACE
+Introduced in 7.73.0
.IP CURLKHSTAT_REJECT
Introduced in 7.19.6
.IP CURLKHTYPE_DSS
@@ -769,6 +775,8 @@ Introduced in 7.68.0
Introduced in 7.69.0
.IP CURLOPTTYPE_BLOB
Introduced in 7.71.0
+.IP CURLOPTTYPE_CBPOINT
+Introduced in 7.73.0
.IP CURLOPTTYPE_FUNCTIONPOINT
Introduced in 7.1
.IP CURLOPTTYPE_LONG
@@ -781,6 +789,8 @@ Introduced in 7.11.0
Introduced in 7.65.2
.IP CURLOPTTYPE_STRINGPOINT
Introduced in 7.46.0
+.IP CURLOPTTYPE_VALUES
+Introduced in 7.73.0
.IP CURLOPT_ABSTRACT_UNIX_SOCKET
Introduced in 7.53.0
.IP CURLOPT_ACCEPTTIMEOUT_MS
@@ -1130,10 +1140,6 @@ Deprecated since 7.32.0
Introduced in 7.19.4
.IP CURLOPT_PROXY
Introduced in 7.1
-.IP CURLOPT_PROXY_ISSUERCERT
-Introduced in 7.71.0
-.IP CURLOPT_PROXY_ISSUERCERT_BLOB
-Introduced in 7.71.0
.IP CURLOPT_PROXYAUTH
Introduced in 7.10.7
.IP CURLOPT_PROXYHEADER
@@ -1154,6 +1160,10 @@ Introduced in 7.52.0
Introduced in 7.52.0
.IP CURLOPT_PROXY_CRLFILE
Introduced in 7.52.0
+.IP CURLOPT_PROXY_ISSUERCERT
+Introduced in 7.71.0
+.IP CURLOPT_PROXY_ISSUERCERT_BLOB
+Introduced in 7.71.0
.IP CURLOPT_PROXY_KEYPASSWD
Introduced in 7.52.0
.IP CURLOPT_PROXY_PINNEDPUBLICKEY
@@ -1162,16 +1172,16 @@ Introduced in 7.52.0
Introduced in 7.43.0
.IP CURLOPT_PROXY_SSLCERT
Introduced in 7.52.0
-.IP CURLOPT_PROXY_SSLCERT_BLOB
-Introduced in 7.71.0
.IP CURLOPT_PROXY_SSLCERTTYPE
Introduced in 7.52.0
+.IP CURLOPT_PROXY_SSLCERT_BLOB
+Introduced in 7.71.0
.IP CURLOPT_PROXY_SSLKEY
Introduced in 7.52.0
-.IP CURLOPT_PROXY_SSLKEY_BLOB
-Introduced in 7.71.0
.IP CURLOPT_PROXY_SSLKEYTYPE
Introduced in 7.52.0
+.IP CURLOPT_PROXY_SSLKEY_BLOB
+Introduced in 7.71.0
.IP CURLOPT_PROXY_SSLVERSION
Introduced in 7.52.0
.IP CURLOPT_PROXY_SSL_CIPHER_LIST
@@ -1293,26 +1303,26 @@ Introduced in 7.16.1
Introduced in 7.16.1
.IP CURLOPT_SSLCERT
Introduced in 7.1
-.IP CURLOPT_SSLCERT_BLOB
-Introduced in 7.71.0
.IP CURLOPT_SSLCERTPASSWD
Introduced in 7.1.1
Deprecated since 7.17.0
.IP CURLOPT_SSLCERTTYPE
Introduced in 7.9.3
+.IP CURLOPT_SSLCERT_BLOB
+Introduced in 7.71.0
.IP CURLOPT_SSLENGINE
Introduced in 7.9.3
.IP CURLOPT_SSLENGINE_DEFAULT
Introduced in 7.9.3
.IP CURLOPT_SSLKEY
Introduced in 7.9.3
-.IP CURLOPT_SSLKEY_BLOB
-Introduced in 7.71.0
.IP CURLOPT_SSLKEYPASSWD
Introduced in 7.9.3
Deprecated since 7.17.0
.IP CURLOPT_SSLKEYTYPE
Introduced in 7.9.3
+.IP CURLOPT_SSLKEY_BLOB
+Introduced in 7.71.0
.IP CURLOPT_SSLVERSION
Introduced in 7.1
.IP CURLOPT_SSL_CIPHER_LIST
@@ -1321,6 +1331,8 @@ Introduced in 7.9
Introduced in 7.10.6
.IP CURLOPT_SSL_CTX_FUNCTION
Introduced in 7.10.6
+.IP CURLOPT_SSL_EC_CURVES
+Introduced in 7.73.0
.IP CURLOPT_SSL_ENABLE_ALPN
Introduced in 7.36.0
.IP CURLOPT_SSL_ENABLE_NPN
@@ -1427,6 +1439,24 @@ Introduced in 7.32.0
Introduced in 7.32.0
.IP CURLOPT_XOAUTH2_BEARER
Introduced in 7.33.0
+.IP CURLOT_BLOB
+Introduced in 7.73.0
+.IP CURLOT_CBPTR
+Introduced in 7.73.0
+.IP CURLOT_FUNCTION
+Introduced in 7.73.0
+.IP CURLOT_LONG
+Introduced in 7.73.0
+.IP CURLOT_OBJECT
+Introduced in 7.73.0
+.IP CURLOT_OFF_T
+Introduced in 7.73.0
+.IP CURLOT_SLIST
+Introduced in 7.73.0
+.IP CURLOT_STRING
+Introduced in 7.73.0
+.IP CURLOT_VALUES
+Introduced in 7.73.0
.IP CURLPAUSE_ALL
Introduced in 7.18.0
.IP CURLPAUSE_CONT
@@ -1519,6 +1549,74 @@ Introduced in 7.18.0
Introduced in 7.10
.IP CURLPROXY_SOCKS5_HOSTNAME
Introduced in 7.18.0
+.IP CURLPX_BAD_ADDRESS_TYPE
+Introduced in 7.73.0
+.IP CURLPX_BAD_VERSION
+Introduced in 7.73.0
+.IP CURLPX_CLOSED
+Introduced in 7.73.0
+.IP CURLPX_GSSAPI
+Introduced in 7.73.0
+.IP CURLPX_GSSAPI_PERMSG
+Introduced in 7.73.0
+.IP CURLPX_GSSAPI_PROTECTION
+Introduced in 7.73.0
+.IP CURLPX_IDENTD
+Introduced in 7.73.0
+.IP CURLPX_IDENTD_DIFFER
+Introduced in 7.73.0
+.IP CURLPX_LONG_HOSTNAME
+Introduced in 7.73.0
+.IP CURLPX_LONG_PASSWD
+Introduced in 7.73.0
+.IP CURLPX_LONG_USER
+Introduced in 7.73.0
+.IP CURLPX_NO_AUTH
+Introduced in 7.73.0
+.IP CURLPX_OK
+Introduced in 7.73.0
+.IP CURLPX_RECV_ADDRESS
+Introduced in 7.73.0
+.IP CURLPX_RECV_AUTH
+Introduced in 7.73.0
+.IP CURLPX_RECV_CONNECT
+Introduced in 7.73.0
+.IP CURLPX_RECV_REQACK
+Introduced in 7.73.0
+.IP CURLPX_REPLY_ADDRESS_TYPE_NOT_SUPPORTED
+Introduced in 7.73.0
+.IP CURLPX_REPLY_COMMAND_NOT_SUPPORTED
+Introduced in 7.73.0
+.IP CURLPX_REPLY_CONNECTION_REFUSED
+Introduced in 7.73.0
+.IP CURLPX_REPLY_GENERAL_SERVER_FAILURE
+Introduced in 7.73.0
+.IP CURLPX_REPLY_HOST_UNREACHABLE
+Introduced in 7.73.0
+.IP CURLPX_REPLY_NETWORK_UNREACHABLE
+Introduced in 7.73.0
+.IP CURLPX_REPLY_NOT_ALLOWED
+Introduced in 7.73.0
+.IP CURLPX_REPLY_TTL_EXPIRED
+Introduced in 7.73.0
+.IP CURLPX_REPLY_UNASSIGNED
+Introduced in 7.73.0
+.IP CURLPX_REQUEST_FAILED
+Introduced in 7.73.0
+.IP CURLPX_RESOLVE_HOST
+Introduced in 7.73.0
+.IP CURLPX_SEND_AUTH
+Introduced in 7.73.0
+.IP CURLPX_SEND_CONNECT
+Introduced in 7.73.0
+.IP CURLPX_SEND_REQUEST
+Introduced in 7.73.0
+.IP CURLPX_UNKNOWN_FAIL
+Introduced in 7.73.0
+.IP CURLPX_UNKNOWN_MODE
+Introduced in 7.73.0
+.IP CURLPX_USER_REJECTED
+Introduced in 7.73.0
.IP CURLSHE_BAD_OPTION
Introduced in 7.10.3
.IP CURLSHE_INVALID
@@ -1612,12 +1710,12 @@ Introduced in 7.71.0
Introduced in 7.68.0
.IP CURLSSLOPT_NO_REVOKE
Introduced in 7.44.0
+.IP CURLSSLOPT_REVOKE_BEST_EFFORT
+Introduced in 7.70.0
.IP CURLSSLSET_NO_BACKENDS
Introduced in 7.56.0
.IP CURLSSLSET_OK
Introduced in 7.56.0
-.IP CURLSSLOPT_REVOKE_BEST_EFFORT
-Introduced in 7.70.0
.IP CURLSSLSET_TOO_LATE
Introduced in 7.56.0
.IP CURLSSLSET_UNKNOWN_BACKEND
@@ -2052,12 +2150,12 @@ Introduced in 7.10
Introduced in 7.13.2
.IP CURL_VERSION_TLSAUTH_SRP
Introduced in 7.21.4
+.IP CURL_VERSION_UNICODE
+Introduced in 7.72.0
.IP CURL_VERSION_UNIX_SOCKETS
Introduced in 7.40.0
.IP CURL_VERSION_ZSTD
Introduced in 7.72.0
-.IP CURL_VERSION_UNICODE
-Introduced in 7.72.0
.IP CURL_WAIT_POLLIN
Introduced in 7.28.0
.IP CURL_WAIT_POLLOUT
diff --git a/docs/libcurl/libcurl-thread.3 b/docs/libcurl/libcurl-thread.3
index 4d2ab06a..1205c1b2 100644
--- a/docs/libcurl/libcurl-thread.3
+++ b/docs/libcurl/libcurl-thread.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH libcurl-thread 3 "August 07, 2020" "libcurl 7.72.0" "libcurl thread safety"
+.TH libcurl-thread 3 "August 07, 2020" "libcurl 7.73.0" "libcurl thread safety"
.SH NAME
libcurl-thread \- libcurl thread safety
diff --git a/docs/libcurl/libcurl-tutorial.3 b/docs/libcurl/libcurl-tutorial.3
index 9f7725b8..853c1f0c 100644
--- a/docs/libcurl/libcurl-tutorial.3
+++ b/docs/libcurl/libcurl-tutorial.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH libcurl-tutorial 3 "October 31, 2019" "libcurl 7.72.0" "libcurl programming"
+.TH libcurl-tutorial 3 "October 31, 2019" "libcurl 7.73.0" "libcurl programming"
.SH NAME
libcurl-tutorial \- libcurl programming tutorial
diff --git a/docs/libcurl/libcurl-url.3 b/docs/libcurl/libcurl-url.3
index c1ff98fe..f912fce2 100644
--- a/docs/libcurl/libcurl-url.3
+++ b/docs/libcurl/libcurl-url.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH libcurl 3 "September 10, 2018" "libcurl 7.72.0" "libcurl url interface"
+.TH libcurl 3 "September 10, 2018" "libcurl 7.73.0" "libcurl url interface"
.SH NAME
libcurl-url \- URL interface overview
diff --git a/docs/libcurl/libcurl.3 b/docs/libcurl/libcurl.3
index 9c5f205a..15ac51b0 100644
--- a/docs/libcurl/libcurl.3
+++ b/docs/libcurl/libcurl.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH libcurl 3 "March 23, 2020" "libcurl 7.72.0" "libcurl overview"
+.TH libcurl 3 "March 23, 2020" "libcurl 7.73.0" "libcurl overview"
.SH NAME
libcurl \- client-side URL transfers
diff --git a/docs/libcurl/opts/CURLINFO_ACTIVESOCKET.3 b/docs/libcurl/opts/CURLINFO_ACTIVESOCKET.3
index 242280b0..bd38d48c 100644
--- a/docs/libcurl/opts/CURLINFO_ACTIVESOCKET.3
+++ b/docs/libcurl/opts/CURLINFO_ACTIVESOCKET.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_ACTIVESOCKET 3 "June 04, 2020" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_ACTIVESOCKET 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_ACTIVESOCKET \- get the active socket
@@ -48,7 +48,7 @@ All
CURL *curl = curl_easy_init();
if(curl) {
curl_socket_t sockfd;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* Do not do the transfer - only connect to host */
curl_easy_setopt(curl, CURLOPT_CONNECT_ONLY, 1L);
diff --git a/docs/libcurl/opts/CURLINFO_APPCONNECT_TIME.3 b/docs/libcurl/opts/CURLINFO_APPCONNECT_TIME.3
index 59c78edd..bd50055b 100644
--- a/docs/libcurl/opts/CURLINFO_APPCONNECT_TIME.3
+++ b/docs/libcurl/opts/CURLINFO_APPCONNECT_TIME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_APPCONNECT_TIME 3 "August 26, 2019" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_APPCONNECT_TIME 3 "August 26, 2019" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_APPCONNECT_TIME \- get the time until the SSL/SSH handshake is completed
diff --git a/docs/libcurl/opts/CURLINFO_APPCONNECT_TIME_T.3 b/docs/libcurl/opts/CURLINFO_APPCONNECT_TIME_T.3
index e42315b3..498053a5 100644
--- a/docs/libcurl/opts/CURLINFO_APPCONNECT_TIME_T.3
+++ b/docs/libcurl/opts/CURLINFO_APPCONNECT_TIME_T.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_APPCONNECT_TIME_T 3 "August 26, 2019" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_APPCONNECT_TIME_T 3 "August 26, 2019" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_APPCONNECT_TIME_T \- get the time until the SSL/SSH handshake is completed
diff --git a/docs/libcurl/opts/CURLINFO_CERTINFO.3 b/docs/libcurl/opts/CURLINFO_CERTINFO.3
index ed027bff..f7be3209 100644
--- a/docs/libcurl/opts/CURLINFO_CERTINFO.3
+++ b/docs/libcurl/opts/CURLINFO_CERTINFO.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_CERTINFO 3 "July 04, 2020" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_CERTINFO 3 "July 04, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_CERTINFO \- get the TLS certificate chain
diff --git a/docs/libcurl/opts/CURLINFO_CONDITION_UNMET.3 b/docs/libcurl/opts/CURLINFO_CONDITION_UNMET.3
index ecc55b40..98d72d10 100644
--- a/docs/libcurl/opts/CURLINFO_CONDITION_UNMET.3
+++ b/docs/libcurl/opts/CURLINFO_CONDITION_UNMET.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_CONDITION_UNMET 3 "April 04, 2020" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_CONDITION_UNMET 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_CONDITION_UNMET \- get info on unmet time conditional or 304 HTTP response.
@@ -42,7 +42,7 @@ HTTP and some
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* January 1, 2020 is 1577833200 */
curl_easy_setopt(curl, CURLOPT_TIMEVALUE, 1577833200L);
diff --git a/docs/libcurl/opts/CURLINFO_CONNECT_TIME.3 b/docs/libcurl/opts/CURLINFO_CONNECT_TIME.3
index 27e82184..bee7a2fa 100644
--- a/docs/libcurl/opts/CURLINFO_CONNECT_TIME.3
+++ b/docs/libcurl/opts/CURLINFO_CONNECT_TIME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_CONNECT_TIME 3 "August 26, 2019" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_CONNECT_TIME 3 "August 26, 2019" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_CONNECT_TIME \- get the time until connect
diff --git a/docs/libcurl/opts/CURLINFO_CONNECT_TIME_T.3 b/docs/libcurl/opts/CURLINFO_CONNECT_TIME_T.3
index 37604ec1..a924573c 100644
--- a/docs/libcurl/opts/CURLINFO_CONNECT_TIME_T.3
+++ b/docs/libcurl/opts/CURLINFO_CONNECT_TIME_T.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_CONNECT_TIME_T 3 "August 26, 2019" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_CONNECT_TIME_T 3 "August 26, 2019" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_CONNECT_TIME_T \- get the time until connect
diff --git a/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD.3 b/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD.3
index 35bfbb65..d01f1075 100644
--- a/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD.3
+++ b/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_CONTENT_LENGTH_DOWNLOAD 3 "June 15, 2017" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_CONTENT_LENGTH_DOWNLOAD 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_CONTENT_LENGTH_DOWNLOAD \- get content-length of download
@@ -42,7 +42,7 @@ HTTP(S)
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* Perform the request */
res = curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD_T.3 b/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD_T.3
index 31f59469..65647284 100644
--- a/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD_T.3
+++ b/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD_T.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_CONTENT_LENGTH_DOWNLOAD_T 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_CONTENT_LENGTH_DOWNLOAD_T 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_CONTENT_LENGTH_DOWNLOAD_T \- get content-length of download
@@ -39,7 +39,7 @@ HTTP(S)
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* Perform the request */
res = curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD.3 b/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD.3
index 25badebf..ab45f583 100644
--- a/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD.3
+++ b/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_CONTENT_LENGTH_UPLOAD 3 "June 15, 2017" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_CONTENT_LENGTH_UPLOAD 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_CONTENT_LENGTH_UPLOAD \- get the specified size of the upload
@@ -41,7 +41,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* Perform the upload */
res = curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD_T.3 b/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD_T.3
index b65a517f..e562e805 100644
--- a/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD_T.3
+++ b/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD_T.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_CONTENT_LENGTH_UPLOAD_T 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_CONTENT_LENGTH_UPLOAD_T 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_CONTENT_LENGTH_UPLOAD_T \- get the specified size of the upload
@@ -38,7 +38,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* Perform the upload */
res = curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLINFO_CONTENT_TYPE.3 b/docs/libcurl/opts/CURLINFO_CONTENT_TYPE.3
index 3291b215..6a739d6e 100644
--- a/docs/libcurl/opts/CURLINFO_CONTENT_TYPE.3
+++ b/docs/libcurl/opts/CURLINFO_CONTENT_TYPE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_CONTENT_TYPE 3 "May 06, 2017" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_CONTENT_TYPE 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_CONTENT_TYPE \- get Content-Type
@@ -43,7 +43,7 @@ HTTP(S)
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
res = curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLINFO_COOKIELIST.3 b/docs/libcurl/opts/CURLINFO_COOKIELIST.3
index 89c3c2a2..4ce9ba31 100644
--- a/docs/libcurl/opts/CURLINFO_COOKIELIST.3
+++ b/docs/libcurl/opts/CURLINFO_COOKIELIST.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_COOKIELIST 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_COOKIELIST 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_COOKIELIST \- get all known cookies
@@ -44,7 +44,7 @@ HTTP(S)
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* enable the cookie engine */
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "");
diff --git a/docs/libcurl/opts/CURLINFO_EFFECTIVE_METHOD.3 b/docs/libcurl/opts/CURLINFO_EFFECTIVE_METHOD.3
index 578eb29f..36cf6214 100644
--- a/docs/libcurl/opts/CURLINFO_EFFECTIVE_METHOD.3
+++ b/docs/libcurl/opts/CURLINFO_EFFECTIVE_METHOD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_EFFECTIVE_METHOD 3 "July 13, 2020" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_EFFECTIVE_METHOD 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_EFFECTIVE_METHOD \- get the last used HTTP method
@@ -48,7 +48,7 @@ HTTP(S)
CURL *curl = curl_easy_init();
if(curl) {
CURLcode res;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "data");
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
res = curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLINFO_EFFECTIVE_URL.3 b/docs/libcurl/opts/CURLINFO_EFFECTIVE_URL.3
index f166a586..a3066eff 100644
--- a/docs/libcurl/opts/CURLINFO_EFFECTIVE_URL.3
+++ b/docs/libcurl/opts/CURLINFO_EFFECTIVE_URL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_EFFECTIVE_URL 3 "May 04, 2017" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_EFFECTIVE_URL 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_EFFECTIVE_URL \- get the last used URL
@@ -44,7 +44,7 @@ HTTP(S)
CURL *curl = curl_easy_init();
if(curl) {
CURLcode res;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
res = curl_easy_perform(curl);
if(res == CURLE_OK) {
diff --git a/docs/libcurl/opts/CURLINFO_FILETIME.3 b/docs/libcurl/opts/CURLINFO_FILETIME.3
index 2b36cf21..04185bba 100644
--- a/docs/libcurl/opts/CURLINFO_FILETIME.3
+++ b/docs/libcurl/opts/CURLINFO_FILETIME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_FILETIME 3 "January 25, 2018" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_FILETIME 3 "January 25, 2018" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_FILETIME \- get the remote time of the retrieved document
diff --git a/docs/libcurl/opts/CURLINFO_FILETIME_T.3 b/docs/libcurl/opts/CURLINFO_FILETIME_T.3
index 758172d2..4d3556a6 100644
--- a/docs/libcurl/opts/CURLINFO_FILETIME_T.3
+++ b/docs/libcurl/opts/CURLINFO_FILETIME_T.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_FILETIME 3 "January 25, 2018" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_FILETIME 3 "January 25, 2018" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_FILETIME_T \- get the remote time of the retrieved document
diff --git a/docs/libcurl/opts/CURLINFO_FTP_ENTRY_PATH.3 b/docs/libcurl/opts/CURLINFO_FTP_ENTRY_PATH.3
index e16ad04e..c38dc546 100644
--- a/docs/libcurl/opts/CURLINFO_FTP_ENTRY_PATH.3
+++ b/docs/libcurl/opts/CURLINFO_FTP_ENTRY_PATH.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_FTP_ENTRY_PATH 3 "May 06, 2017" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_FTP_ENTRY_PATH 3 "May 06, 2017" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_FTP_ENTRY_PATH \- get entry path in FTP server
diff --git a/docs/libcurl/opts/CURLINFO_HEADER_SIZE.3 b/docs/libcurl/opts/CURLINFO_HEADER_SIZE.3
index 6dc9dc2b..71aa2d9c 100644
--- a/docs/libcurl/opts/CURLINFO_HEADER_SIZE.3
+++ b/docs/libcurl/opts/CURLINFO_HEADER_SIZE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_HEADER_SIZE 3 "May 06, 2017" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_HEADER_SIZE 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_HEADER_SIZE \- get size of retrieved headers
@@ -41,7 +41,7 @@ All
CURL *curl = curl_easy_init();
if(curl) {
CURLcode res;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
res = curl_easy_perform(curl);
if(res == CURLE_OK) {
long size;
diff --git a/docs/libcurl/opts/CURLINFO_HTTPAUTH_AVAIL.3 b/docs/libcurl/opts/CURLINFO_HTTPAUTH_AVAIL.3
index ec8fb197..0dadef43 100644
--- a/docs/libcurl/opts/CURLINFO_HTTPAUTH_AVAIL.3
+++ b/docs/libcurl/opts/CURLINFO_HTTPAUTH_AVAIL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_HTTPAUTH_AVAIL 3 "October 07, 2017" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_HTTPAUTH_AVAIL 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_HTTPAUTH_AVAIL \- get available HTTP authentication methods
@@ -39,7 +39,7 @@ HTTP(S)
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
res = curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLINFO_HTTP_CONNECTCODE.3 b/docs/libcurl/opts/CURLINFO_HTTP_CONNECTCODE.3
index 52d06ea2..68e2b985 100644
--- a/docs/libcurl/opts/CURLINFO_HTTP_CONNECTCODE.3
+++ b/docs/libcurl/opts/CURLINFO_HTTP_CONNECTCODE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_HTTP_CONNECTCODE 3 "May 06, 2017" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_HTTP_CONNECTCODE 3 "May 06, 2017" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_HTTP_CONNECTCODE \- get the CONNECT response code
diff --git a/docs/libcurl/opts/CURLINFO_HTTP_VERSION.3 b/docs/libcurl/opts/CURLINFO_HTTP_VERSION.3
index 27b4b984..8600f64a 100644
--- a/docs/libcurl/opts/CURLINFO_HTTP_VERSION.3
+++ b/docs/libcurl/opts/CURLINFO_HTTP_VERSION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_HTTP_VERSION 3 "August 07, 2019" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_HTTP_VERSION 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_HTTP_VERSION \- get the http version used in the connection
@@ -40,7 +40,7 @@ HTTP
CURL *curl = curl_easy_init();
if(curl) {
CURLcode res;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
res = curl_easy_perform(curl);
if(res == CURLE_OK) {
long http_version;
diff --git a/docs/libcurl/opts/CURLINFO_LASTSOCKET.3 b/docs/libcurl/opts/CURLINFO_LASTSOCKET.3
index b9d5e33d..9e436a10 100644
--- a/docs/libcurl/opts/CURLINFO_LASTSOCKET.3
+++ b/docs/libcurl/opts/CURLINFO_LASTSOCKET.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_LASTSOCKET 3 "May 06, 2017" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_LASTSOCKET 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_LASTSOCKET \- get the last socket used
@@ -48,7 +48,7 @@ All
CURL *curl = curl_easy_init();
if(curl) {
long sockfd; /* doesn't work on win64! */
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* Do not do the transfer - only connect to host */
curl_easy_setopt(curl, CURLOPT_CONNECT_ONLY, 1L);
diff --git a/docs/libcurl/opts/CURLINFO_LOCAL_IP.3 b/docs/libcurl/opts/CURLINFO_LOCAL_IP.3
index 5e2c7e48..f336c40e 100644
--- a/docs/libcurl/opts/CURLINFO_LOCAL_IP.3
+++ b/docs/libcurl/opts/CURLINFO_LOCAL_IP.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_LOCAL_IP 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_LOCAL_IP 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_LOCAL_IP \- get local IP address of last connection
@@ -46,7 +46,7 @@ All
{
char *ip;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* Perform the request, res will get the return code */
res = curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLINFO_LOCAL_PORT.3 b/docs/libcurl/opts/CURLINFO_LOCAL_PORT.3
index 58301198..5e690c76 100644
--- a/docs/libcurl/opts/CURLINFO_LOCAL_PORT.3
+++ b/docs/libcurl/opts/CURLINFO_LOCAL_PORT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_LOCAL_PORT 3 "March 16, 2017" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_LOCAL_PORT 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_LOCAL_PORT \- get the latest local port number
@@ -41,7 +41,7 @@ All
curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
res = curl_easy_perform(curl);
if(CURLE_OK == res) {
diff --git a/docs/libcurl/opts/CURLINFO_NAMELOOKUP_TIME.3 b/docs/libcurl/opts/CURLINFO_NAMELOOKUP_TIME.3
index cdd00e19..40e936ed 100644
--- a/docs/libcurl/opts/CURLINFO_NAMELOOKUP_TIME.3
+++ b/docs/libcurl/opts/CURLINFO_NAMELOOKUP_TIME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_NAMELOOKUP_TIME 3 "August 26, 2019" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_NAMELOOKUP_TIME 3 "August 26, 2019" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_NAMELOOKUP_TIME \- get the name lookup time
diff --git a/docs/libcurl/opts/CURLINFO_NAMELOOKUP_TIME_T.3 b/docs/libcurl/opts/CURLINFO_NAMELOOKUP_TIME_T.3
index 24148f02..833991a8 100644
--- a/docs/libcurl/opts/CURLINFO_NAMELOOKUP_TIME_T.3
+++ b/docs/libcurl/opts/CURLINFO_NAMELOOKUP_TIME_T.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_NAMELOOKUP_TIME_T 3 "August 26, 2019" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_NAMELOOKUP_TIME_T 3 "August 26, 2019" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_NAMELOOKUP_TIME_T \- get the name lookup time in microseconds
diff --git a/docs/libcurl/opts/CURLINFO_NUM_CONNECTS.3 b/docs/libcurl/opts/CURLINFO_NUM_CONNECTS.3
index ef20576f..96f7d5f2 100644
--- a/docs/libcurl/opts/CURLINFO_NUM_CONNECTS.3
+++ b/docs/libcurl/opts/CURLINFO_NUM_CONNECTS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_NUM_CONNECTS 3 "May 06, 2017" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_NUM_CONNECTS 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_NUM_CONNECTS \- get number of created connections
@@ -42,7 +42,7 @@ All
CURL *curl = curl_easy_init();
if(curl) {
CURLcode res;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
res = curl_easy_perform(curl);
if(res == CURLE_OK) {
diff --git a/docs/libcurl/opts/CURLINFO_OS_ERRNO.3 b/docs/libcurl/opts/CURLINFO_OS_ERRNO.3
index 1b9a6e24..ef58727f 100644
--- a/docs/libcurl/opts/CURLINFO_OS_ERRNO.3
+++ b/docs/libcurl/opts/CURLINFO_OS_ERRNO.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_OS_ERRNO 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_OS_ERRNO 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_OS_ERRNO \- get errno number from last connect failure
@@ -39,7 +39,7 @@ All
CURL *curl = curl_easy_init();
if(curl) {
CURLcode res;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
res = curl_easy_perform(curl);
if(res != CURLE_OK) {
long error;
diff --git a/docs/libcurl/opts/CURLINFO_PRETRANSFER_TIME.3 b/docs/libcurl/opts/CURLINFO_PRETRANSFER_TIME.3
index 3146c0fc..97f7d436 100644
--- a/docs/libcurl/opts/CURLINFO_PRETRANSFER_TIME.3
+++ b/docs/libcurl/opts/CURLINFO_PRETRANSFER_TIME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_PRETRANSFER_TIME 3 "August 26, 2019" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_PRETRANSFER_TIME 3 "August 26, 2019" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_PRETRANSFER_TIME \- get the time until the file transfer start
diff --git a/docs/libcurl/opts/CURLINFO_PRETRANSFER_TIME_T.3 b/docs/libcurl/opts/CURLINFO_PRETRANSFER_TIME_T.3
index b5f436f0..ecbd4f48 100644
--- a/docs/libcurl/opts/CURLINFO_PRETRANSFER_TIME_T.3
+++ b/docs/libcurl/opts/CURLINFO_PRETRANSFER_TIME_T.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_PRETRANSFER_TIME_T 3 "August 26, 2019" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_PRETRANSFER_TIME_T 3 "August 26, 2019" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_PRETRANSFER_TIME_T \- get the time until the file transfer start
diff --git a/docs/libcurl/opts/CURLINFO_PRIMARY_IP.3 b/docs/libcurl/opts/CURLINFO_PRIMARY_IP.3
index a9e74cf5..f78097b7 100644
--- a/docs/libcurl/opts/CURLINFO_PRIMARY_IP.3
+++ b/docs/libcurl/opts/CURLINFO_PRIMARY_IP.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_PRIMARY_IP 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_PRIMARY_IP 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_PRIMARY_IP \- get IP address of last connection
@@ -45,7 +45,7 @@ All network based ones
{
char *ip;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* Perform the request, res will get the return code */
res = curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLINFO_PRIMARY_PORT.3 b/docs/libcurl/opts/CURLINFO_PRIMARY_PORT.3
index 88f36cdd..622cb990 100644
--- a/docs/libcurl/opts/CURLINFO_PRIMARY_PORT.3
+++ b/docs/libcurl/opts/CURLINFO_PRIMARY_PORT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_PRIMARY_PORT 3 "May 06, 2017" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_PRIMARY_PORT 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_PRIMARY_PORT \- get the latest destination port number
@@ -38,7 +38,7 @@ All
CURL *curl = curl_easy_init();
if(curl) {
CURLcode res;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
res = curl_easy_perform(curl);
if(res == CURLE_OK) {
long port;
diff --git a/docs/libcurl/opts/CURLINFO_PRIVATE.3 b/docs/libcurl/opts/CURLINFO_PRIVATE.3
index c8d32dd9..33739224 100644
--- a/docs/libcurl/opts/CURLINFO_PRIVATE.3
+++ b/docs/libcurl/opts/CURLINFO_PRIVATE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_PRIVATE 3 "May 05, 2017" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_PRIVATE 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_PRIVATE \- get the private pointer
@@ -40,7 +40,7 @@ All
CURL *curl = curl_easy_init();
if(curl) {
void *pointer = 0x2345454;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
/* set the private pointer */
curl_easy_setopt(curl, CURLOPT_PRIVATE, pointer);
diff --git a/docs/libcurl/opts/CURLINFO_PROTOCOL.3 b/docs/libcurl/opts/CURLINFO_PROTOCOL.3
index fffc5415..cecf6798 100644
--- a/docs/libcurl/opts/CURLINFO_PROTOCOL.3
+++ b/docs/libcurl/opts/CURLINFO_PROTOCOL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_PROTOCOL 3 "April 14, 2020" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_PROTOCOL 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_PROTOCOL \- get the protocol used in the connection
@@ -47,7 +47,7 @@ All
CURL *curl = curl_easy_init();
if(curl) {
CURLcode res;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
res = curl_easy_perform(curl);
if(res == CURLE_OK) {
long protocol;
diff --git a/docs/libcurl/opts/CURLINFO_PROXYAUTH_AVAIL.3 b/docs/libcurl/opts/CURLINFO_PROXYAUTH_AVAIL.3
index e3818919..5b8da3da 100644
--- a/docs/libcurl/opts/CURLINFO_PROXYAUTH_AVAIL.3
+++ b/docs/libcurl/opts/CURLINFO_PROXYAUTH_AVAIL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_PROXYAUTH_AVAIL 3 "October 07, 2017" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_PROXYAUTH_AVAIL 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_PROXYAUTH_AVAIL \- get available HTTP proxy authentication methods
@@ -39,7 +39,7 @@ HTTP(S)
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
curl_easy_setopt(curl, CURLOPT_PROXY, "http://127.0.0.1:80");
res = curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLINFO_PROXY_ERROR.3 b/docs/libcurl/opts/CURLINFO_PROXY_ERROR.3
new file mode 100644
index 00000000..5d95a436
--- /dev/null
+++ b/docs/libcurl/opts/CURLINFO_PROXY_ERROR.3
@@ -0,0 +1,105 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at https://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH CURLINFO_PROXY_ERROR 3 "August 24, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
+
+.SH NAME
+CURLINFO_PROXY_ERROR \- get the detailed (SOCKS) proxy error
+.SH SYNOPSIS
+.nf
+#include <curl/curl.h>
+
+typedef enum {
+ CURLPX_OK,
+ CURLPX_BAD_ADDRESS_TYPE,
+ CURLPX_BAD_VERSION,
+ CURLPX_CLOSED,
+ CURLPX_GSSAPI,
+ CURLPX_GSSAPI_PERMSG,
+ CURLPX_GSSAPI_PROTECTION,
+ CURLPX_IDENTD,
+ CURLPX_IDENTD_DIFFER,
+ CURLPX_LONG_HOSTNAME,
+ CURLPX_LONG_PASSWD,
+ CURLPX_LONG_USER,
+ CURLPX_NO_AUTH,
+ CURLPX_RECV_ADDRESS,
+ CURLPX_RECV_AUTH,
+ CURLPX_RECV_CONNECT,
+ CURLPX_RECV_REQACK,
+ CURLPX_REPLY_ADDRESS_TYPE_NOT_SUPPORTED,
+ CURLPX_REPLY_COMMAND_NOT_SUPPORTED,
+ CURLPX_REPLY_CONNECTION_REFUSED,
+ CURLPX_REPLY_GENERAL_SERVER_FAILURE,
+ CURLPX_REPLY_HOST_UNREACHABLE,
+ CURLPX_REPLY_NETWORK_UNREACHABLE,
+ CURLPX_REPLY_NOT_ALLOWED,
+ CURLPX_REPLY_TTL_EXPIRED,
+ CURLPX_REPLY_UNASSIGNED,
+ CURLPX_REQUEST_FAILED,
+ CURLPX_RESOLVE_HOST,
+ CURLPX_SEND_AUTH,
+ CURLPX_SEND_CONNECT,
+ CURLPX_SEND_REQUEST,
+ CURLPX_UNKNOWN_FAIL,
+ CURLPX_UNKNOWN_MODE,
+ CURLPX_USER_REJECTED,
+ CURLPX_LAST /* never use */
+} CURLproxycode;
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_PROXY_ERROR, long *detail);
+.fi
+.SH DESCRIPTION
+Pass a pointer to a long to receive a detailed error code when the most recent
+transfer returned a CURLE_PROXY error.
+
+The return value will match the CURLproxycode set.
+
+The returned value will be zero (equal to CURLPX_OK) if no such response code
+was available.
+.SH PROTOCOLS
+All that can be done over SOCKS
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode res;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ curl_easy_setopt(curl, CURLOPT_PROXY, "socks5://127.0.0.1");
+ res = curl_easy_perform(curl);
+ if(res == CURLE_PROXY) {
+ long proxycode;
+ res = curl_easy_getinfo(curl, CURLINFO_PROXY_ERROR, &proxycode);
+ if(!res && proxycode)
+ printf("The detailed proxy error: %ld\\n", proxycode);
+ }
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.73.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLINFO_RESPONSE_CODE "(3), " libcurl-errors "(3), "
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
diff --git a/docs/libcurl/opts/CURLINFO_PROXY_SSL_VERIFYRESULT.3 b/docs/libcurl/opts/CURLINFO_PROXY_SSL_VERIFYRESULT.3
index 68944b2d..c48e6ba0 100644
--- a/docs/libcurl/opts/CURLINFO_PROXY_SSL_VERIFYRESULT.3
+++ b/docs/libcurl/opts/CURLINFO_PROXY_SSL_VERIFYRESULT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_PROXY_SSL_VERIFYRESULT 3 "May 31, 2017" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_PROXY_SSL_VERIFYRESULT 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_PROXY_SSL_VERIFYRESULT \- get the result of the proxy certificate verification
diff --git a/docs/libcurl/opts/CURLINFO_REDIRECT_COUNT.3 b/docs/libcurl/opts/CURLINFO_REDIRECT_COUNT.3
index 8bd50929..bf88f449 100644
--- a/docs/libcurl/opts/CURLINFO_REDIRECT_COUNT.3
+++ b/docs/libcurl/opts/CURLINFO_REDIRECT_COUNT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_REDIRECT_COUNT 3 "May 05, 2017" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_REDIRECT_COUNT 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_REDIRECT_COUNT \- get the number of redirects
@@ -38,7 +38,7 @@ HTTP(S)
CURL *curl = curl_easy_init();
if(curl) {
CURLcode res;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
res = curl_easy_perform(curl);
if(res == CURLE_OK) {
diff --git a/docs/libcurl/opts/CURLINFO_REDIRECT_TIME.3 b/docs/libcurl/opts/CURLINFO_REDIRECT_TIME.3
index 5c78b102..5748f169 100644
--- a/docs/libcurl/opts/CURLINFO_REDIRECT_TIME.3
+++ b/docs/libcurl/opts/CURLINFO_REDIRECT_TIME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_REDIRECT_TIME 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_REDIRECT_TIME 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_REDIRECT_TIME \- get the time for all redirection steps
diff --git a/docs/libcurl/opts/CURLINFO_REDIRECT_TIME_T.3 b/docs/libcurl/opts/CURLINFO_REDIRECT_TIME_T.3
index 191cb8bd..ca87a6f5 100644
--- a/docs/libcurl/opts/CURLINFO_REDIRECT_TIME_T.3
+++ b/docs/libcurl/opts/CURLINFO_REDIRECT_TIME_T.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_REDIRECT_TIME_T 3 "May 17, 2018" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_REDIRECT_TIME_T 3 "May 17, 2018" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_REDIRECT_TIME_T \- get the time for all redirection steps
diff --git a/docs/libcurl/opts/CURLINFO_REDIRECT_URL.3 b/docs/libcurl/opts/CURLINFO_REDIRECT_URL.3
index 7122b65f..8d3f9179 100644
--- a/docs/libcurl/opts/CURLINFO_REDIRECT_URL.3
+++ b/docs/libcurl/opts/CURLINFO_REDIRECT_URL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_REDIRECT_URL 3 "June 24, 2017" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_REDIRECT_URL 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_REDIRECT_URL \- get the URL a redirect would go to
@@ -44,7 +44,7 @@ HTTP(S)
CURL *curl = curl_easy_init();
if(curl) {
CURLcode res;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
res = curl_easy_perform(curl);
if(res == CURLE_OK) {
char *url = NULL;
diff --git a/docs/libcurl/opts/CURLINFO_REQUEST_SIZE.3 b/docs/libcurl/opts/CURLINFO_REQUEST_SIZE.3
index e2e95762..af83f1e4 100644
--- a/docs/libcurl/opts/CURLINFO_REQUEST_SIZE.3
+++ b/docs/libcurl/opts/CURLINFO_REQUEST_SIZE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_REQUEST_SIZE 3 "May 06, 2017" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_REQUEST_SIZE 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_REQUEST_SIZE \- get size of sent request
@@ -39,7 +39,7 @@ All
CURL *curl = curl_easy_init();
if(curl) {
CURLcode res;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
res = curl_easy_perform(curl);
if(res == CURLE_OK) {
long req;
diff --git a/docs/libcurl/opts/CURLINFO_RESPONSE_CODE.3 b/docs/libcurl/opts/CURLINFO_RESPONSE_CODE.3
index 3195ee8f..649f9d66 100644
--- a/docs/libcurl/opts/CURLINFO_RESPONSE_CODE.3
+++ b/docs/libcurl/opts/CURLINFO_RESPONSE_CODE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_RESPONSE_CODE 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_RESPONSE_CODE 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_RESPONSE_CODE \- get the last response code
@@ -43,7 +43,7 @@ HTTP, FTP and SMTP
CURL *curl = curl_easy_init();
if(curl) {
CURLcode res;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
res = curl_easy_perform(curl);
if(res == CURLE_OK) {
long response_code;
diff --git a/docs/libcurl/opts/CURLINFO_RETRY_AFTER.3 b/docs/libcurl/opts/CURLINFO_RETRY_AFTER.3
index 7632386d..8ad9e56a 100644
--- a/docs/libcurl/opts/CURLINFO_RETRY_AFTER.3
+++ b/docs/libcurl/opts/CURLINFO_RETRY_AFTER.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_RETRY_AFTER 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_RETRY_AFTER 3 "October 03, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_RETRY_AFTER \- returns the Retry-After retry delay
@@ -30,7 +30,7 @@ CURLINFO_RETRY_AFTER \- returns the Retry-After retry delay
CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_RETRY_AFTER, curl_off_t *retry);
.SH DESCRIPTION
Pass a pointer to a curl_off_t variable to receive the number of seconds the
-HTTP server suggesets the client should wait until the next request is
+HTTP server suggests the client should wait until the next request is
issued. The information from the "Retry-After:" header.
While the HTTP header might contain a fixed date string, the
@@ -45,7 +45,7 @@ HTTP(S)
CURL *curl = curl_easy_init();
if(curl) {
CURLcode res;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
res = curl_easy_perform(curl);
if(res == CURLE_OK) {
curl_off_t wait = 0;
diff --git a/docs/libcurl/opts/CURLINFO_RTSP_CLIENT_CSEQ.3 b/docs/libcurl/opts/CURLINFO_RTSP_CLIENT_CSEQ.3
index 4bbd7d11..4dfe53d0 100644
--- a/docs/libcurl/opts/CURLINFO_RTSP_CLIENT_CSEQ.3
+++ b/docs/libcurl/opts/CURLINFO_RTSP_CLIENT_CSEQ.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_RTSP_CLIENT_CSEQ 3 "May 31, 2017" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_RTSP_CLIENT_CSEQ 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_RTSP_CLIENT_CSEQ \- get the next RTSP client CSeq
diff --git a/docs/libcurl/opts/CURLINFO_RTSP_CSEQ_RECV.3 b/docs/libcurl/opts/CURLINFO_RTSP_CSEQ_RECV.3
index e6d859c8..33edf441 100644
--- a/docs/libcurl/opts/CURLINFO_RTSP_CSEQ_RECV.3
+++ b/docs/libcurl/opts/CURLINFO_RTSP_CSEQ_RECV.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_RTSP_CSEQ_RECV 3 "May 31, 2017" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_RTSP_CSEQ_RECV 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_RTSP_CSEQ_RECV \- get the recently received CSeq
diff --git a/docs/libcurl/opts/CURLINFO_RTSP_SERVER_CSEQ.3 b/docs/libcurl/opts/CURLINFO_RTSP_SERVER_CSEQ.3
index acc2d9bd..dd3f0ded 100644
--- a/docs/libcurl/opts/CURLINFO_RTSP_SERVER_CSEQ.3
+++ b/docs/libcurl/opts/CURLINFO_RTSP_SERVER_CSEQ.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_RTSP_SERVER_CSEQ 3 "May 31, 2017" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_RTSP_SERVER_CSEQ 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_RTSP_SERVER_CSEQ \- get the next RTSP server CSeq
diff --git a/docs/libcurl/opts/CURLINFO_RTSP_SESSION_ID.3 b/docs/libcurl/opts/CURLINFO_RTSP_SESSION_ID.3
index 33116800..24672096 100644
--- a/docs/libcurl/opts/CURLINFO_RTSP_SESSION_ID.3
+++ b/docs/libcurl/opts/CURLINFO_RTSP_SESSION_ID.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_RTSP_SESSION_ID 3 "May 31, 2017" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_RTSP_SESSION_ID 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_RTSP_SESSION_ID \- get RTSP session ID
diff --git a/docs/libcurl/opts/CURLINFO_SCHEME.3 b/docs/libcurl/opts/CURLINFO_SCHEME.3
index 7d7595bf..ed101540 100644
--- a/docs/libcurl/opts/CURLINFO_SCHEME.3
+++ b/docs/libcurl/opts/CURLINFO_SCHEME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_SCHEME 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_SCHEME 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_SCHEME \- get the URL scheme (sometimes called protocol) used in the connection
@@ -43,7 +43,7 @@ All
CURL *curl = curl_easy_init();
if(curl) {
CURLcode res;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
res = curl_easy_perform(curl);
if(res == CURLE_OK) {
char *scheme = NULL;
diff --git a/docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD.3 b/docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD.3
index db08d049..db5763a4 100644
--- a/docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD.3
+++ b/docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_SIZE_DOWNLOAD 3 "June 15, 2017" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_SIZE_DOWNLOAD 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_SIZE_DOWNLOAD \- get the number of downloaded bytes
@@ -43,7 +43,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* Perform the request */
res = curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD_T.3 b/docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD_T.3
index 91fefc9e..8efd0a8e 100644
--- a/docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD_T.3
+++ b/docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD_T.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_SIZE_DOWNLOAD_T 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_SIZE_DOWNLOAD_T 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_SIZE_DOWNLOAD_T \- get the number of downloaded bytes
@@ -40,7 +40,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* Perform the request */
res = curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLINFO_SIZE_UPLOAD.3 b/docs/libcurl/opts/CURLINFO_SIZE_UPLOAD.3
index 41ba8e95..3f2bd192 100644
--- a/docs/libcurl/opts/CURLINFO_SIZE_UPLOAD.3
+++ b/docs/libcurl/opts/CURLINFO_SIZE_UPLOAD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_SIZE_UPLOAD 3 "June 15, 2017" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_SIZE_UPLOAD 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_SIZE_UPLOAD \- get the number of uploaded bytes
@@ -40,7 +40,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* Perform the request */
res = curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLINFO_SIZE_UPLOAD_T.3 b/docs/libcurl/opts/CURLINFO_SIZE_UPLOAD_T.3
index 71c80404..bc639ddb 100644
--- a/docs/libcurl/opts/CURLINFO_SIZE_UPLOAD_T.3
+++ b/docs/libcurl/opts/CURLINFO_SIZE_UPLOAD_T.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_SIZE_UPLOAD_T 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_SIZE_UPLOAD_T 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_SIZE_UPLOAD_T \- get the number of uploaded bytes
@@ -37,7 +37,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* Perform the request */
res = curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD.3 b/docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD.3
index d5881f9f..e8a78d5d 100644
--- a/docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD.3
+++ b/docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_SPEED_DOWNLOAD 3 "June 15, 2017" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_SPEED_DOWNLOAD 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_SPEED_DOWNLOAD \- get download speed
@@ -39,7 +39,7 @@ sensible variable type.
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* Perform the request */
res = curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD_T.3 b/docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD_T.3
index 9f34c215..9a9f66a1 100644
--- a/docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD_T.3
+++ b/docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD_T.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_SPEED_DOWNLOAD_T 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_SPEED_DOWNLOAD_T 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_SPEED_DOWNLOAD_T \- get download speed
@@ -36,7 +36,7 @@ that curl measured for the complete download. Measured in bytes/second.
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* Perform the request */
res = curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLINFO_SPEED_UPLOAD.3 b/docs/libcurl/opts/CURLINFO_SPEED_UPLOAD.3
index c85dc1d8..fccc1cec 100644
--- a/docs/libcurl/opts/CURLINFO_SPEED_UPLOAD.3
+++ b/docs/libcurl/opts/CURLINFO_SPEED_UPLOAD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_SPEED_UPLOAD 3 "June 15, 2017" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_SPEED_UPLOAD 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_SPEED_UPLOAD \- get upload speed
@@ -39,7 +39,7 @@ sensible variable type.
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* Perform the request */
res = curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLINFO_SPEED_UPLOAD_T.3 b/docs/libcurl/opts/CURLINFO_SPEED_UPLOAD_T.3
index b314d19a..75904978 100644
--- a/docs/libcurl/opts/CURLINFO_SPEED_UPLOAD_T.3
+++ b/docs/libcurl/opts/CURLINFO_SPEED_UPLOAD_T.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_SPEED_UPLOAD_T 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_SPEED_UPLOAD_T 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_SPEED_UPLOAD_T \- get upload speed
@@ -36,7 +36,7 @@ curl measured for the complete upload. Measured in bytes/second.
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* Perform the request */
res = curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLINFO_SSL_ENGINES.3 b/docs/libcurl/opts/CURLINFO_SSL_ENGINES.3
index 888019ed..6cccb93e 100644
--- a/docs/libcurl/opts/CURLINFO_SSL_ENGINES.3
+++ b/docs/libcurl/opts/CURLINFO_SSL_ENGINES.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_SSL_ENGINES 3 "May 31, 2017" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_SSL_ENGINES 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_SSL_ENGINES \- get an slist of OpenSSL crypto-engines
diff --git a/docs/libcurl/opts/CURLINFO_SSL_VERIFYRESULT.3 b/docs/libcurl/opts/CURLINFO_SSL_VERIFYRESULT.3
index 71c58a0c..2ab59be6 100644
--- a/docs/libcurl/opts/CURLINFO_SSL_VERIFYRESULT.3
+++ b/docs/libcurl/opts/CURLINFO_SSL_VERIFYRESULT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_SSL_VERIFYRESULT 3 "May 02, 2020" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_SSL_VERIFYRESULT 3 "May 02, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_SSL_VERIFYRESULT \- get the result of the certificate verification
diff --git a/docs/libcurl/opts/CURLINFO_STARTTRANSFER_TIME.3 b/docs/libcurl/opts/CURLINFO_STARTTRANSFER_TIME.3
index 26d481fd..e0407fd2 100644
--- a/docs/libcurl/opts/CURLINFO_STARTTRANSFER_TIME.3
+++ b/docs/libcurl/opts/CURLINFO_STARTTRANSFER_TIME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_STARTTRANSFER_TIME 3 "August 26, 2019" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_STARTTRANSFER_TIME 3 "August 26, 2019" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_STARTTRANSFER_TIME \- get the time until the first byte is received
diff --git a/docs/libcurl/opts/CURLINFO_STARTTRANSFER_TIME_T.3 b/docs/libcurl/opts/CURLINFO_STARTTRANSFER_TIME_T.3
index bf4d73b8..972ebe3f 100644
--- a/docs/libcurl/opts/CURLINFO_STARTTRANSFER_TIME_T.3
+++ b/docs/libcurl/opts/CURLINFO_STARTTRANSFER_TIME_T.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_STARTTRANSFER_TIME_T 3 "August 26, 2019" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_STARTTRANSFER_TIME_T 3 "August 26, 2019" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_STARTTRANSFER_TIME_T \- get the time until the first byte is received
diff --git a/docs/libcurl/opts/CURLINFO_TLS_SESSION.3 b/docs/libcurl/opts/CURLINFO_TLS_SESSION.3
index aaa9d777..05c88e14 100644
--- a/docs/libcurl/opts/CURLINFO_TLS_SESSION.3
+++ b/docs/libcurl/opts/CURLINFO_TLS_SESSION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_TLS_SESSION 3 "May 31, 2017" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_TLS_SESSION 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_TLS_SESSION \- get TLS session info
diff --git a/docs/libcurl/opts/CURLINFO_TLS_SSL_PTR.3 b/docs/libcurl/opts/CURLINFO_TLS_SSL_PTR.3
index 89a96150..a74e519e 100644
--- a/docs/libcurl/opts/CURLINFO_TLS_SSL_PTR.3
+++ b/docs/libcurl/opts/CURLINFO_TLS_SSL_PTR.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_TLS_SSL_PTR 3 "August 07, 2020" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_TLS_SSL_PTR 3 "August 07, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_TLS_SESSION, CURLINFO_TLS_SSL_PTR \- get TLS session info
diff --git a/docs/libcurl/opts/CURLINFO_TOTAL_TIME.3 b/docs/libcurl/opts/CURLINFO_TOTAL_TIME.3
index 525d9c9b..13f84ee3 100644
--- a/docs/libcurl/opts/CURLINFO_TOTAL_TIME.3
+++ b/docs/libcurl/opts/CURLINFO_TOTAL_TIME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_TOTAL_TIME 3 "August 26, 2019" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_TOTAL_TIME 3 "August 26, 2019" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_TOTAL_TIME \- get total time of previous transfer
diff --git a/docs/libcurl/opts/CURLINFO_TOTAL_TIME_T.3 b/docs/libcurl/opts/CURLINFO_TOTAL_TIME_T.3
index 8dd49afc..a96148c1 100644
--- a/docs/libcurl/opts/CURLINFO_TOTAL_TIME_T.3
+++ b/docs/libcurl/opts/CURLINFO_TOTAL_TIME_T.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_TOTAL_TIME_T 3 "August 26, 2019" "libcurl 7.72.0" "curl_easy_getinfo options"
+.TH CURLINFO_TOTAL_TIME_T 3 "August 26, 2019" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_TOTAL_TIME_T \- get total time of previous transfer in microseconds
diff --git a/docs/libcurl/opts/CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.3 b/docs/libcurl/opts/CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.3
index b87e5edf..6971263b 100644
--- a/docs/libcurl/opts/CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.3
+++ b/docs/libcurl/opts/CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE 3 "April 05, 2019" "libcurl 7.72.0" "curl_multi_setopt options"
+.TH CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE 3 "April 05, 2019" "libcurl 7.73.0" "curl_multi_setopt options"
.SH NAME
CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE \- chunk length threshold for pipelining
diff --git a/docs/libcurl/opts/CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.3 b/docs/libcurl/opts/CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.3
index 5b8e230a..c2728ea2 100644
--- a/docs/libcurl/opts/CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.3
+++ b/docs/libcurl/opts/CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE 3 "April 05, 2019" "libcurl 7.72.0" "curl_multi_setopt options"
+.TH CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE 3 "April 05, 2019" "libcurl 7.73.0" "curl_multi_setopt options"
.SH NAME
CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE \- size threshold for pipelining penalty
diff --git a/docs/libcurl/opts/CURLMOPT_MAXCONNECTS.3 b/docs/libcurl/opts/CURLMOPT_MAXCONNECTS.3
index b7627375..6420cff9 100644
--- a/docs/libcurl/opts/CURLMOPT_MAXCONNECTS.3
+++ b/docs/libcurl/opts/CURLMOPT_MAXCONNECTS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_MAXCONNECTS 3 "March 23, 2020" "libcurl 7.72.0" "curl_multi_setopt options"
+.TH CURLMOPT_MAXCONNECTS 3 "March 23, 2020" "libcurl 7.73.0" "curl_multi_setopt options"
.SH NAME
CURLMOPT_MAXCONNECTS \- set size of connection cache
diff --git a/docs/libcurl/opts/CURLMOPT_MAX_HOST_CONNECTIONS.3 b/docs/libcurl/opts/CURLMOPT_MAX_HOST_CONNECTIONS.3
index ff6d35c9..d825dc8d 100644
--- a/docs/libcurl/opts/CURLMOPT_MAX_HOST_CONNECTIONS.3
+++ b/docs/libcurl/opts/CURLMOPT_MAX_HOST_CONNECTIONS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_MAX_HOST_CONNECTIONS 3 "May 27, 2017" "libcurl 7.72.0" "curl_multi_setopt options"
+.TH CURLMOPT_MAX_HOST_CONNECTIONS 3 "May 27, 2017" "libcurl 7.73.0" "curl_multi_setopt options"
.SH NAME
CURLMOPT_MAX_HOST_CONNECTIONS \- set max number of connections to a single host
diff --git a/docs/libcurl/opts/CURLMOPT_MAX_PIPELINE_LENGTH.3 b/docs/libcurl/opts/CURLMOPT_MAX_PIPELINE_LENGTH.3
index d67e6646..dc97a650 100644
--- a/docs/libcurl/opts/CURLMOPT_MAX_PIPELINE_LENGTH.3
+++ b/docs/libcurl/opts/CURLMOPT_MAX_PIPELINE_LENGTH.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_MAX_PIPELINE_LENGTH 3 "April 05, 2019" "libcurl 7.72.0" "curl_multi_setopt options"
+.TH CURLMOPT_MAX_PIPELINE_LENGTH 3 "April 05, 2019" "libcurl 7.73.0" "curl_multi_setopt options"
.SH NAME
CURLMOPT_MAX_PIPELINE_LENGTH \- maximum number of requests in a pipeline
diff --git a/docs/libcurl/opts/CURLMOPT_MAX_TOTAL_CONNECTIONS.3 b/docs/libcurl/opts/CURLMOPT_MAX_TOTAL_CONNECTIONS.3
index 90f4f57a..a616bdb3 100644
--- a/docs/libcurl/opts/CURLMOPT_MAX_TOTAL_CONNECTIONS.3
+++ b/docs/libcurl/opts/CURLMOPT_MAX_TOTAL_CONNECTIONS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_MAX_TOTAL_CONNECTIONS 3 "May 27, 2017" "libcurl 7.72.0" "curl_multi_setopt options"
+.TH CURLMOPT_MAX_TOTAL_CONNECTIONS 3 "May 27, 2017" "libcurl 7.73.0" "curl_multi_setopt options"
.SH NAME
CURLMOPT_MAX_TOTAL_CONNECTIONS \- max simultaneously open connections
diff --git a/docs/libcurl/opts/CURLMOPT_PIPELINING.3 b/docs/libcurl/opts/CURLMOPT_PIPELINING.3
index 0b95da59..d8f1475f 100644
--- a/docs/libcurl/opts/CURLMOPT_PIPELINING.3
+++ b/docs/libcurl/opts/CURLMOPT_PIPELINING.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_PIPELINING 3 "April 05, 2019" "libcurl 7.72.0" "curl_multi_setopt options"
+.TH CURLMOPT_PIPELINING 3 "April 05, 2019" "libcurl 7.73.0" "curl_multi_setopt options"
.SH NAME
CURLMOPT_PIPELINING \- enable HTTP pipelining and multiplexing
diff --git a/docs/libcurl/opts/CURLMOPT_PIPELINING_SERVER_BL.3 b/docs/libcurl/opts/CURLMOPT_PIPELINING_SERVER_BL.3
index 1cd44ec1..89823595 100644
--- a/docs/libcurl/opts/CURLMOPT_PIPELINING_SERVER_BL.3
+++ b/docs/libcurl/opts/CURLMOPT_PIPELINING_SERVER_BL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_PIPELINING_SERVER_BL 3 "June 09, 2020" "libcurl 7.72.0" "curl_multi_setopt options"
+.TH CURLMOPT_PIPELINING_SERVER_BL 3 "June 09, 2020" "libcurl 7.73.0" "curl_multi_setopt options"
.SH NAME
CURLMOPT_PIPELINING_SERVER_BL \- pipelining server block list
diff --git a/docs/libcurl/opts/CURLMOPT_PIPELINING_SITE_BL.3 b/docs/libcurl/opts/CURLMOPT_PIPELINING_SITE_BL.3
index bab89830..1cc3da3e 100644
--- a/docs/libcurl/opts/CURLMOPT_PIPELINING_SITE_BL.3
+++ b/docs/libcurl/opts/CURLMOPT_PIPELINING_SITE_BL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_PIPELINING_SITE_BL 3 "June 09, 2020" "libcurl 7.72.0" "curl_multi_setopt options"
+.TH CURLMOPT_PIPELINING_SITE_BL 3 "June 09, 2020" "libcurl 7.73.0" "curl_multi_setopt options"
.SH NAME
CURLMOPT_PIPELINING_SITE_BL \- pipelining host block list
diff --git a/docs/libcurl/opts/CURLMOPT_PUSHDATA.3 b/docs/libcurl/opts/CURLMOPT_PUSHDATA.3
index 07736b75..50d9291b 100644
--- a/docs/libcurl/opts/CURLMOPT_PUSHDATA.3
+++ b/docs/libcurl/opts/CURLMOPT_PUSHDATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_PUSHDATA 3 "May 27, 2017" "libcurl 7.72.0" "curl_multi_setopt options"
+.TH CURLMOPT_PUSHDATA 3 "May 27, 2017" "libcurl 7.73.0" "curl_multi_setopt options"
.SH NAME
CURLMOPT_PUSHDATA \- pointer to pass to push callback
diff --git a/docs/libcurl/opts/CURLMOPT_PUSHFUNCTION.3 b/docs/libcurl/opts/CURLMOPT_PUSHFUNCTION.3
index cf8005d8..ca468130 100644
--- a/docs/libcurl/opts/CURLMOPT_PUSHFUNCTION.3
+++ b/docs/libcurl/opts/CURLMOPT_PUSHFUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_PUSHFUNCTION 3 "July 16, 2020" "libcurl 7.72.0" "curl_multi_setopt options"
+.TH CURLMOPT_PUSHFUNCTION 3 "July 16, 2020" "libcurl 7.73.0" "curl_multi_setopt options"
.SH NAME
CURLMOPT_PUSHFUNCTION \- callback that approves or denies server pushes
diff --git a/docs/libcurl/opts/CURLMOPT_SOCKETDATA.3 b/docs/libcurl/opts/CURLMOPT_SOCKETDATA.3
index 875ab5b2..e547e9e3 100644
--- a/docs/libcurl/opts/CURLMOPT_SOCKETDATA.3
+++ b/docs/libcurl/opts/CURLMOPT_SOCKETDATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_SOCKETDATA 3 "May 31, 2017" "libcurl 7.72.0" "curl_multi_setopt options"
+.TH CURLMOPT_SOCKETDATA 3 "May 31, 2017" "libcurl 7.73.0" "curl_multi_setopt options"
.SH NAME
CURLMOPT_SOCKETDATA \- custom pointer passed to the socket callback
diff --git a/docs/libcurl/opts/CURLMOPT_SOCKETFUNCTION.3 b/docs/libcurl/opts/CURLMOPT_SOCKETFUNCTION.3
index ef8e63ac..5cfcad95 100644
--- a/docs/libcurl/opts/CURLMOPT_SOCKETFUNCTION.3
+++ b/docs/libcurl/opts/CURLMOPT_SOCKETFUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_SOCKETFUNCTION 3 "June 24, 2019" "libcurl 7.72.0" "curl_multi_setopt options"
+.TH CURLMOPT_SOCKETFUNCTION 3 "June 24, 2019" "libcurl 7.73.0" "curl_multi_setopt options"
.SH NAME
CURLMOPT_SOCKETFUNCTION \- callback informed about what to wait for
diff --git a/docs/libcurl/opts/CURLMOPT_TIMERDATA.3 b/docs/libcurl/opts/CURLMOPT_TIMERDATA.3
index 56b34cb7..72d23262 100644
--- a/docs/libcurl/opts/CURLMOPT_TIMERDATA.3
+++ b/docs/libcurl/opts/CURLMOPT_TIMERDATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_TIMERDATA 3 "May 27, 2017" "libcurl 7.72.0" "curl_multi_setopt options"
+.TH CURLMOPT_TIMERDATA 3 "May 27, 2017" "libcurl 7.73.0" "curl_multi_setopt options"
.SH NAME
CURLMOPT_TIMERDATA \- custom pointer to pass to timer callback
diff --git a/docs/libcurl/opts/CURLMOPT_TIMERFUNCTION.3 b/docs/libcurl/opts/CURLMOPT_TIMERFUNCTION.3
index b9b0a7e6..4498c246 100644
--- a/docs/libcurl/opts/CURLMOPT_TIMERFUNCTION.3
+++ b/docs/libcurl/opts/CURLMOPT_TIMERFUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_TIMERFUNCTION 3 "May 03, 2019" "libcurl 7.72.0" "curl_multi_setopt options"
+.TH CURLMOPT_TIMERFUNCTION 3 "May 03, 2019" "libcurl 7.73.0" "curl_multi_setopt options"
.SH NAME
CURLMOPT_TIMERFUNCTION \- set callback to receive timeout values
diff --git a/docs/libcurl/opts/CURLOPT_ABSTRACT_UNIX_SOCKET.3 b/docs/libcurl/opts/CURLOPT_ABSTRACT_UNIX_SOCKET.3
index 9627e33c..85ddd2b1 100644
--- a/docs/libcurl/opts/CURLOPT_ABSTRACT_UNIX_SOCKET.3
+++ b/docs/libcurl/opts/CURLOPT_ABSTRACT_UNIX_SOCKET.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_ABSTRACT_UNIX_SOCKET 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_ABSTRACT_UNIX_SOCKET 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_ABSTRACT_UNIX_SOCKET \- set an abstract Unix domain socket
diff --git a/docs/libcurl/opts/CURLOPT_ACCEPTTIMEOUT_MS.3 b/docs/libcurl/opts/CURLOPT_ACCEPTTIMEOUT_MS.3
index 7346758e..bb436fec 100644
--- a/docs/libcurl/opts/CURLOPT_ACCEPTTIMEOUT_MS.3
+++ b/docs/libcurl/opts/CURLOPT_ACCEPTTIMEOUT_MS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_ACCEPTTIMEOUT_MS 3 "March 06, 2016" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_ACCEPTTIMEOUT_MS 3 "March 06, 2016" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_ACCEPTTIMEOUT_MS \- timeout waiting for FTP server to connect back
diff --git a/docs/libcurl/opts/CURLOPT_ACCEPT_ENCODING.3 b/docs/libcurl/opts/CURLOPT_ACCEPT_ENCODING.3
index 96ce48d8..0e2d3708 100644
--- a/docs/libcurl/opts/CURLOPT_ACCEPT_ENCODING.3
+++ b/docs/libcurl/opts/CURLOPT_ACCEPT_ENCODING.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_ACCEPT_ENCODING 3 "May 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_ACCEPT_ENCODING 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_ACCEPT_ENCODING \- enables automatic decompression of HTTP downloads
@@ -83,7 +83,7 @@ HTTP
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* enable all supported built-in compressions */
curl_easy_setopt(curl, CURLOPT_ACCEPT_ENCODING, "");
diff --git a/docs/libcurl/opts/CURLOPT_ADDRESS_SCOPE.3 b/docs/libcurl/opts/CURLOPT_ADDRESS_SCOPE.3
index f204bd9c..13de8f0b 100644
--- a/docs/libcurl/opts/CURLOPT_ADDRESS_SCOPE.3
+++ b/docs/libcurl/opts/CURLOPT_ADDRESS_SCOPE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_ADDRESS_SCOPE 3 "March 07, 2019" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_ADDRESS_SCOPE 3 "March 07, 2019" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_ADDRESS_SCOPE \- set scope id for IPv6 addresses
diff --git a/docs/libcurl/opts/CURLOPT_ALTSVC.3 b/docs/libcurl/opts/CURLOPT_ALTSVC.3
index 2ba231b0..f229e8bf 100644
--- a/docs/libcurl/opts/CURLOPT_ALTSVC.3
+++ b/docs/libcurl/opts/CURLOPT_ALTSVC.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_ALTSVC 3 "August 14, 2019" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_ALTSVC 3 "August 14, 2019" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_ALTSVC \- set alt-svc cache file name
diff --git a/docs/libcurl/opts/CURLOPT_ALTSVC_CTRL.3 b/docs/libcurl/opts/CURLOPT_ALTSVC_CTRL.3
index ee899e04..a14737d9 100644
--- a/docs/libcurl/opts/CURLOPT_ALTSVC_CTRL.3
+++ b/docs/libcurl/opts/CURLOPT_ALTSVC_CTRL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_ALTSVC_CTRL 3 "February 11, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_ALTSVC_CTRL 3 "February 11, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_ALTSVC_CTRL \- control alt-svc behavior
diff --git a/docs/libcurl/opts/CURLOPT_APPEND.3 b/docs/libcurl/opts/CURLOPT_APPEND.3
index f4744e56..8f0724e8 100644
--- a/docs/libcurl/opts/CURLOPT_APPEND.3
+++ b/docs/libcurl/opts/CURLOPT_APPEND.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_APPEND 3 "March 06, 2016" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_APPEND 3 "March 06, 2016" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_APPEND \- enable appending to the remote file
diff --git a/docs/libcurl/opts/CURLOPT_AUTOREFERER.3 b/docs/libcurl/opts/CURLOPT_AUTOREFERER.3
index 681113d5..c020fe1e 100644
--- a/docs/libcurl/opts/CURLOPT_AUTOREFERER.3
+++ b/docs/libcurl/opts/CURLOPT_AUTOREFERER.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_AUTOREFERER 3 "May 05, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_AUTOREFERER 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_AUTOREFERER \- automatically update the referer header
@@ -40,7 +40,7 @@ HTTP
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
/* follow redirects */
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
diff --git a/docs/libcurl/opts/CURLOPT_BUFFERSIZE.3 b/docs/libcurl/opts/CURLOPT_BUFFERSIZE.3
index f99ffb04..70bea72d 100644
--- a/docs/libcurl/opts/CURLOPT_BUFFERSIZE.3
+++ b/docs/libcurl/opts/CURLOPT_BUFFERSIZE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_BUFFERSIZE 3 "May 13, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_BUFFERSIZE 3 "May 13, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_BUFFERSIZE \- set preferred receive buffer size
diff --git a/docs/libcurl/opts/CURLOPT_CAINFO.3 b/docs/libcurl/opts/CURLOPT_CAINFO.3
index 2e27547e..a3b5719d 100644
--- a/docs/libcurl/opts/CURLOPT_CAINFO.3
+++ b/docs/libcurl/opts/CURLOPT_CAINFO.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CAINFO 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_CAINFO 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_CAINFO \- path to Certificate Authority (CA) bundle
diff --git a/docs/libcurl/opts/CURLOPT_CAPATH.3 b/docs/libcurl/opts/CURLOPT_CAPATH.3
index 288b57be..00c7d627 100644
--- a/docs/libcurl/opts/CURLOPT_CAPATH.3
+++ b/docs/libcurl/opts/CURLOPT_CAPATH.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CAPATH 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_CAPATH 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_CAPATH \- specify directory holding CA certificates
diff --git a/docs/libcurl/opts/CURLOPT_CERTINFO.3 b/docs/libcurl/opts/CURLOPT_CERTINFO.3
index 2e91e9d9..d406c714 100644
--- a/docs/libcurl/opts/CURLOPT_CERTINFO.3
+++ b/docs/libcurl/opts/CURLOPT_CERTINFO.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CERTINFO 3 "January 29, 2019" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_CERTINFO 3 "January 29, 2019" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_CERTINFO \- request SSL certificate information
diff --git a/docs/libcurl/opts/CURLOPT_CHUNK_BGN_FUNCTION.3 b/docs/libcurl/opts/CURLOPT_CHUNK_BGN_FUNCTION.3
index a761284d..a49568dc 100644
--- a/docs/libcurl/opts/CURLOPT_CHUNK_BGN_FUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_CHUNK_BGN_FUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CHUNK_BGN_FUNCTION 3 "May 03, 2019" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_CHUNK_BGN_FUNCTION 3 "May 03, 2019" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_CHUNK_BGN_FUNCTION \- callback before a transfer with FTP wildcardmatch
diff --git a/docs/libcurl/opts/CURLOPT_CHUNK_DATA.3 b/docs/libcurl/opts/CURLOPT_CHUNK_DATA.3
index 0d9521a6..c92002ce 100644
--- a/docs/libcurl/opts/CURLOPT_CHUNK_DATA.3
+++ b/docs/libcurl/opts/CURLOPT_CHUNK_DATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CHUNK_DATA 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_CHUNK_DATA 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_CHUNK_DATA \- custom pointer to the FTP chunk callbacks
diff --git a/docs/libcurl/opts/CURLOPT_CHUNK_END_FUNCTION.3 b/docs/libcurl/opts/CURLOPT_CHUNK_END_FUNCTION.3
index e144afa5..c680aeca 100644
--- a/docs/libcurl/opts/CURLOPT_CHUNK_END_FUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_CHUNK_END_FUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CHUNK_END_FUNCTION 3 "May 31, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_CHUNK_END_FUNCTION 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_CHUNK_END_FUNCTION \- callback after a transfer with FTP wildcardmatch
diff --git a/docs/libcurl/opts/CURLOPT_CLOSESOCKETDATA.3 b/docs/libcurl/opts/CURLOPT_CLOSESOCKETDATA.3
index 970f7286..4399b39e 100644
--- a/docs/libcurl/opts/CURLOPT_CLOSESOCKETDATA.3
+++ b/docs/libcurl/opts/CURLOPT_CLOSESOCKETDATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CLOSESOCKETDATA 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_CLOSESOCKETDATA 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_CLOSESOCKETDATA \- pointer passed to the socket close callback
diff --git a/docs/libcurl/opts/CURLOPT_CLOSESOCKETFUNCTION.3 b/docs/libcurl/opts/CURLOPT_CLOSESOCKETFUNCTION.3
index d39511fe..a5c16a96 100644
--- a/docs/libcurl/opts/CURLOPT_CLOSESOCKETFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_CLOSESOCKETFUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CLOSESOCKETFUNCTION 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_CLOSESOCKETFUNCTION 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_CLOSESOCKETFUNCTION \- callback to socket close replacement function
diff --git a/docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT.3 b/docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT.3
index 4a4a3763..f63fd306 100644
--- a/docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT.3
+++ b/docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CONNECTTIMEOUT 3 "October 03, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_CONNECTTIMEOUT 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_CONNECTTIMEOUT \- timeout for the connect phase
@@ -48,7 +48,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* complete connection within 10 seconds */
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 10L);
diff --git a/docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT_MS.3 b/docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT_MS.3
index 92f5211d..03c41099 100644
--- a/docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT_MS.3
+++ b/docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT_MS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CONNECTTIMEOUT_MS 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_CONNECTTIMEOUT_MS 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_CONNECTTIMEOUT_MS \- timeout for the connect phase
@@ -48,7 +48,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* complete connection within 10000 milliseconds */
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT_MS, 10000L);
diff --git a/docs/libcurl/opts/CURLOPT_CONNECT_ONLY.3 b/docs/libcurl/opts/CURLOPT_CONNECT_ONLY.3
index 518a59d2..60ca5352 100644
--- a/docs/libcurl/opts/CURLOPT_CONNECT_ONLY.3
+++ b/docs/libcurl/opts/CURLOPT_CONNECT_ONLY.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CONNECT_ONLY 3 "February 18, 2019" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_CONNECT_ONLY 3 "February 18, 2019" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_CONNECT_ONLY \- stop when connected to target server
diff --git a/docs/libcurl/opts/CURLOPT_CONNECT_TO.3 b/docs/libcurl/opts/CURLOPT_CONNECT_TO.3
index afea2107..ecf3d42b 100644
--- a/docs/libcurl/opts/CURLOPT_CONNECT_TO.3
+++ b/docs/libcurl/opts/CURLOPT_CONNECT_TO.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CONNECT_TO 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_CONNECT_TO 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_CONNECT_TO \- Connect to a specific host and port instead of the URL's host and port
@@ -94,7 +94,7 @@ connect_to = curl_slist_append(NULL, "example.com::server1.example.com:");
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_CONNECT_TO, connect_to);
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLOPT_CONV_FROM_NETWORK_FUNCTION.3 b/docs/libcurl/opts/CURLOPT_CONV_FROM_NETWORK_FUNCTION.3
index e3d511ec..3d23dec9 100644
--- a/docs/libcurl/opts/CURLOPT_CONV_FROM_NETWORK_FUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_CONV_FROM_NETWORK_FUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CONV_FROM_NETWORK_FUNCTION 3 "May 31, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_CONV_FROM_NETWORK_FUNCTION 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_CONV_FROM_NETWORK_FUNCTION \- convert data from network to host encoding
diff --git a/docs/libcurl/opts/CURLOPT_CONV_FROM_UTF8_FUNCTION.3 b/docs/libcurl/opts/CURLOPT_CONV_FROM_UTF8_FUNCTION.3
index dca22410..8fd45af2 100644
--- a/docs/libcurl/opts/CURLOPT_CONV_FROM_UTF8_FUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_CONV_FROM_UTF8_FUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CONV_FROM_UTF8_FUNCTION 3 "May 31, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_CONV_FROM_UTF8_FUNCTION 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_CONV_FROM_UTF8_FUNCTION \- convert data from UTF8 to host encoding
diff --git a/docs/libcurl/opts/CURLOPT_CONV_TO_NETWORK_FUNCTION.3 b/docs/libcurl/opts/CURLOPT_CONV_TO_NETWORK_FUNCTION.3
index d44a1ea6..fb682b2f 100644
--- a/docs/libcurl/opts/CURLOPT_CONV_TO_NETWORK_FUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_CONV_TO_NETWORK_FUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CONV_TO_NETWORK_FUNCTION 3 "May 31, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_CONV_TO_NETWORK_FUNCTION 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_CONV_TO_NETWORK_FUNCTION \- convert data to network from host encoding
diff --git a/docs/libcurl/opts/CURLOPT_COOKIE.3 b/docs/libcurl/opts/CURLOPT_COOKIE.3
index 31e9a70b..c169efaa 100644
--- a/docs/libcurl/opts/CURLOPT_COOKIE.3
+++ b/docs/libcurl/opts/CURLOPT_COOKIE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_COOKIE 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_COOKIE 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_COOKIE \- set contents of HTTP Cookie header
@@ -67,7 +67,7 @@ HTTP
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
curl_easy_setopt(curl, CURLOPT_COOKIE, "tool=curl; fun=yes;");
diff --git a/docs/libcurl/opts/CURLOPT_COOKIEFILE.3 b/docs/libcurl/opts/CURLOPT_COOKIEFILE.3
index 59771f08..fc4bf93a 100644
--- a/docs/libcurl/opts/CURLOPT_COOKIEFILE.3
+++ b/docs/libcurl/opts/CURLOPT_COOKIEFILE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_COOKIEFILE 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_COOKIEFILE 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_COOKIEFILE \- file name to read cookies from
@@ -66,7 +66,7 @@ HTTP
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
/* get cookies from an existing file */
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "/tmp/cookies.txt");
diff --git a/docs/libcurl/opts/CURLOPT_COOKIEJAR.3 b/docs/libcurl/opts/CURLOPT_COOKIEJAR.3
index 93ab4623..c5c4294b 100644
--- a/docs/libcurl/opts/CURLOPT_COOKIEJAR.3
+++ b/docs/libcurl/opts/CURLOPT_COOKIEJAR.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_COOKIEJAR 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_COOKIEJAR 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_COOKIEJAR \- file name to store cookies to
@@ -58,7 +58,7 @@ HTTP
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
/* export cookies to this file when closing the handle */
curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "/tmp/cookies.txt");
diff --git a/docs/libcurl/opts/CURLOPT_COOKIELIST.3 b/docs/libcurl/opts/CURLOPT_COOKIELIST.3
index 4de29954..007baf5c 100644
--- a/docs/libcurl/opts/CURLOPT_COOKIELIST.3
+++ b/docs/libcurl/opts/CURLOPT_COOKIELIST.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_COOKIELIST 3 "January 10, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_COOKIELIST 3 "January 10, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_COOKIELIST \- add to or manipulate cookies held in memory
diff --git a/docs/libcurl/opts/CURLOPT_COOKIESESSION.3 b/docs/libcurl/opts/CURLOPT_COOKIESESSION.3
index 06d5957e..d3a57b07 100644
--- a/docs/libcurl/opts/CURLOPT_COOKIESESSION.3
+++ b/docs/libcurl/opts/CURLOPT_COOKIESESSION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_COOKIESESSION 3 "May 05, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_COOKIESESSION 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_COOKIESESSION \- start a new cookie session
@@ -46,7 +46,7 @@ HTTP
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
/* new "session", don't load session cookies */
curl_easy_setopt(curl, CURLOPT_COOKIESESSION, 1L);
diff --git a/docs/libcurl/opts/CURLOPT_COPYPOSTFIELDS.3 b/docs/libcurl/opts/CURLOPT_COPYPOSTFIELDS.3
index 627285d8..98be4328 100644
--- a/docs/libcurl/opts/CURLOPT_COPYPOSTFIELDS.3
+++ b/docs/libcurl/opts/CURLOPT_COPYPOSTFIELDS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_COPYPOSTFIELDS 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_COPYPOSTFIELDS 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_COPYPOSTFIELDS \- have libcurl copy data to POST
@@ -51,7 +51,7 @@ HTTP(S)
CURL *curl = curl_easy_init();
if(curl) {
char local_buffer[1024]="data to send";
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* size of the data to copy from the buffer and send in the request */
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, 12L);
diff --git a/docs/libcurl/opts/CURLOPT_CRLF.3 b/docs/libcurl/opts/CURLOPT_CRLF.3
index 5f4c31e6..8a5912fa 100644
--- a/docs/libcurl/opts/CURLOPT_CRLF.3
+++ b/docs/libcurl/opts/CURLOPT_CRLF.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CRLF 3 "May 31, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_CRLF 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_CRLF \- enable/disable CRLF conversion
diff --git a/docs/libcurl/opts/CURLOPT_CRLFILE.3 b/docs/libcurl/opts/CURLOPT_CRLFILE.3
index 808bdae1..b8995d2d 100644
--- a/docs/libcurl/opts/CURLOPT_CRLFILE.3
+++ b/docs/libcurl/opts/CURLOPT_CRLFILE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CRLFILE 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_CRLFILE 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_CRLFILE \- specify a Certificate Revocation List file
diff --git a/docs/libcurl/opts/CURLOPT_CURLU.3 b/docs/libcurl/opts/CURLOPT_CURLU.3
index 34c81ede..d5e1d7fe 100644
--- a/docs/libcurl/opts/CURLOPT_CURLU.3
+++ b/docs/libcurl/opts/CURLOPT_CURLU.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CURLU 3 "October 31, 2019" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_CURLU 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_CURLU \- set URL with CURLU *
@@ -51,7 +51,7 @@ CURLU *urlp = curl_url();
int res = 0;
if(curl) {
- res = curl_url_set(urlp, CURLUPART_URL, "http://example.com", 0);
+ res = curl_url_set(urlp, CURLUPART_URL, "https://example.com", 0);
curl_easy_setopt(handle, CURLOPT_CURLU, urlp);
diff --git a/docs/libcurl/opts/CURLOPT_CUSTOMREQUEST.3 b/docs/libcurl/opts/CURLOPT_CUSTOMREQUEST.3
index 8a5d9cb2..77da01bb 100644
--- a/docs/libcurl/opts/CURLOPT_CUSTOMREQUEST.3
+++ b/docs/libcurl/opts/CURLOPT_CUSTOMREQUEST.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CUSTOMREQUEST 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_CUSTOMREQUEST 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_CUSTOMREQUEST \- custom string for request
@@ -92,7 +92,7 @@ HTTP, FTP, IMAP, POP3 and SMTP
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
/* DELETE the given path */
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "DELETE");
diff --git a/docs/libcurl/opts/CURLOPT_DEBUGDATA.3 b/docs/libcurl/opts/CURLOPT_DEBUGDATA.3
index 6f5874ab..1a6e8f52 100644
--- a/docs/libcurl/opts/CURLOPT_DEBUGDATA.3
+++ b/docs/libcurl/opts/CURLOPT_DEBUGDATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DEBUGDATA 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_DEBUGDATA 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_DEBUGDATA \- custom pointer for debug callback
diff --git a/docs/libcurl/opts/CURLOPT_DEBUGFUNCTION.3 b/docs/libcurl/opts/CURLOPT_DEBUGFUNCTION.3
index 38274f9b..9b6f984c 100644
--- a/docs/libcurl/opts/CURLOPT_DEBUGFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_DEBUGFUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DEBUGFUNCTION 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_DEBUGFUNCTION 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_DEBUGFUNCTION \- debug callback
@@ -167,7 +167,7 @@ int main(void)
/* example.com is redirected, so we tell libcurl to follow redirection */
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
res = curl_easy_perform(curl);
/* Check for errors */
if(res != CURLE_OK)
diff --git a/docs/libcurl/opts/CURLOPT_DEFAULT_PROTOCOL.3 b/docs/libcurl/opts/CURLOPT_DEFAULT_PROTOCOL.3
index 4214f9d6..3a2c33d3 100644
--- a/docs/libcurl/opts/CURLOPT_DEFAULT_PROTOCOL.3
+++ b/docs/libcurl/opts/CURLOPT_DEFAULT_PROTOCOL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DEFAULT_PROTOCOL 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_DEFAULT_PROTOCOL 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_DEFAULT_PROTOCOL \- default protocol to use if the URL is missing a
diff --git a/docs/libcurl/opts/CURLOPT_DIRLISTONLY.3 b/docs/libcurl/opts/CURLOPT_DIRLISTONLY.3
index 11a50e3c..ad496d73 100644
--- a/docs/libcurl/opts/CURLOPT_DIRLISTONLY.3
+++ b/docs/libcurl/opts/CURLOPT_DIRLISTONLY.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DIRLISTONLY 3 "May 05, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_DIRLISTONLY 3 "May 05, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_DIRLISTONLY \- ask for names only in a directory listing
diff --git a/docs/libcurl/opts/CURLOPT_DISALLOW_USERNAME_IN_URL.3 b/docs/libcurl/opts/CURLOPT_DISALLOW_USERNAME_IN_URL.3
index 060d6aad..0a00131a 100644
--- a/docs/libcurl/opts/CURLOPT_DISALLOW_USERNAME_IN_URL.3
+++ b/docs/libcurl/opts/CURLOPT_DISALLOW_USERNAME_IN_URL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DISALLOW_USERNAME_IN_URL 3 "February 25, 2018" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_DISALLOW_USERNAME_IN_URL 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_DISALLOW_USERNAME_IN_URL \- disallow specifying username in the url
@@ -40,7 +40,7 @@ Several
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
curl_easy_setopt(curl, CURLOPT_DISALLOW_USERNAME_IN_URL, 1L);
curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLOPT_DNS_CACHE_TIMEOUT.3 b/docs/libcurl/opts/CURLOPT_DNS_CACHE_TIMEOUT.3
index a01884e1..db2d648b 100644
--- a/docs/libcurl/opts/CURLOPT_DNS_CACHE_TIMEOUT.3
+++ b/docs/libcurl/opts/CURLOPT_DNS_CACHE_TIMEOUT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DNS_CACHE_TIMEOUT 3 "December 09, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_DNS_CACHE_TIMEOUT 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_DNS_CACHE_TIMEOUT \- set life-time for DNS cache entries
@@ -51,7 +51,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
/* only reuse addresses for a very short time */
curl_easy_setopt(curl, CURLOPT_DNS_CACHE_TIMEOUT, 2L);
diff --git a/docs/libcurl/opts/CURLOPT_DNS_INTERFACE.3 b/docs/libcurl/opts/CURLOPT_DNS_INTERFACE.3
index fe9e8d85..a675ca81 100644
--- a/docs/libcurl/opts/CURLOPT_DNS_INTERFACE.3
+++ b/docs/libcurl/opts/CURLOPT_DNS_INTERFACE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DNS_INTERFACE 3 "May 31, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_DNS_INTERFACE 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_DNS_INTERFACE \- set interface to speak DNS over
@@ -43,7 +43,7 @@ NULL
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
curl_easy_setopt(curl, CURLOPT_DNS_INTERFACE, "eth0");
ret = curl_easy_perform(curl);
curl_easy_cleanup(curl);
diff --git a/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP4.3 b/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP4.3
index 8b18f680..18f9a51a 100644
--- a/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP4.3
+++ b/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP4.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DNS_LOCAL_IP4 3 "December 10, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_DNS_LOCAL_IP4 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_DNS_LOCAL_IP4 \- IPv4 address to bind DNS resolves to
@@ -44,7 +44,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
curl_easy_setopt(curl, CURLOPT_DNS_LOCAL_IP4, "192.168.0.14");
ret = curl_easy_perform(curl);
curl_easy_cleanup(curl);
diff --git a/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP6.3 b/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP6.3
index 75858455..5acb8f67 100644
--- a/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP6.3
+++ b/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP6.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DNS_LOCAL_IP6 3 "May 31, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_DNS_LOCAL_IP6 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_DNS_LOCAL_IP6 \- IPv6 address to bind DNS resolves to
@@ -44,7 +44,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
curl_easy_setopt(curl, CURLOPT_DNS_LOCAL_IP6, "fe80::a9ff:fe46:b619");
ret = curl_easy_perform(curl);
curl_easy_cleanup(curl);
diff --git a/docs/libcurl/opts/CURLOPT_DNS_SERVERS.3 b/docs/libcurl/opts/CURLOPT_DNS_SERVERS.3
index a524badc..7ad020b6 100644
--- a/docs/libcurl/opts/CURLOPT_DNS_SERVERS.3
+++ b/docs/libcurl/opts/CURLOPT_DNS_SERVERS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DNS_SERVERS 3 "May 31, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_DNS_SERVERS 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_DNS_SERVERS \- set preferred DNS servers
@@ -48,7 +48,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
curl_easy_setopt(curl, CURLOPT_DNS_SERVERS, "192.168.1.100:53,192.168.1.101");
ret = curl_easy_perform(curl);
curl_easy_cleanup(curl);
diff --git a/docs/libcurl/opts/CURLOPT_DNS_SHUFFLE_ADDRESSES.3 b/docs/libcurl/opts/CURLOPT_DNS_SHUFFLE_ADDRESSES.3
index e58e68fd..74011b40 100644
--- a/docs/libcurl/opts/CURLOPT_DNS_SHUFFLE_ADDRESSES.3
+++ b/docs/libcurl/opts/CURLOPT_DNS_SHUFFLE_ADDRESSES.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DNS_SHUFFLE_ADDRESSES 3 "March 17, 2018" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_DNS_SHUFFLE_ADDRESSES 3 "March 17, 2018" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_DNS_SHUFFLE_ADDRESSES \- Shuffle addresses when a hostname returns more than one
diff --git a/docs/libcurl/opts/CURLOPT_DNS_USE_GLOBAL_CACHE.3 b/docs/libcurl/opts/CURLOPT_DNS_USE_GLOBAL_CACHE.3
index 037442e8..c098a618 100644
--- a/docs/libcurl/opts/CURLOPT_DNS_USE_GLOBAL_CACHE.3
+++ b/docs/libcurl/opts/CURLOPT_DNS_USE_GLOBAL_CACHE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DNS_USE_GLOBAL_CACHE 3 "March 07, 2019" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_DNS_USE_GLOBAL_CACHE 3 "March 07, 2019" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_DNS_USE_GLOBAL_CACHE \- enable/disable global DNS cache
diff --git a/docs/libcurl/opts/CURLOPT_DOH_URL.3 b/docs/libcurl/opts/CURLOPT_DOH_URL.3
index 083de48a..007f4c2c 100644
--- a/docs/libcurl/opts/CURLOPT_DOH_URL.3
+++ b/docs/libcurl/opts/CURLOPT_DOH_URL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DOH_URL 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_DOH_URL 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_DOH_URL \- provide the DNS-over-HTTPS URL
@@ -54,7 +54,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
curl_easy_setopt(curl, CURLOPT_DOH_URL, "https://dns.example.com");
curl_easy_perform(curl);
}
diff --git a/docs/libcurl/opts/CURLOPT_EGDSOCKET.3 b/docs/libcurl/opts/CURLOPT_EGDSOCKET.3
index b4f7743e..bf59784e 100644
--- a/docs/libcurl/opts/CURLOPT_EGDSOCKET.3
+++ b/docs/libcurl/opts/CURLOPT_EGDSOCKET.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_EGDSOCKET 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_EGDSOCKET 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_EGDSOCKET \- set EGD socket path
diff --git a/docs/libcurl/opts/CURLOPT_ERRORBUFFER.3 b/docs/libcurl/opts/CURLOPT_ERRORBUFFER.3
index 2d190827..17f2bc78 100644
--- a/docs/libcurl/opts/CURLOPT_ERRORBUFFER.3
+++ b/docs/libcurl/opts/CURLOPT_ERRORBUFFER.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_ERRORBUFFER 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_ERRORBUFFER 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_ERRORBUFFER \- set error buffer for error messages
@@ -57,7 +57,7 @@ if(curl) {
CURLcode res;
char errbuf[CURL_ERROR_SIZE];
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* provide a buffer to store errors in */
curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errbuf);
diff --git a/docs/libcurl/opts/CURLOPT_EXPECT_100_TIMEOUT_MS.3 b/docs/libcurl/opts/CURLOPT_EXPECT_100_TIMEOUT_MS.3
index 02e2af6e..c33f324b 100644
--- a/docs/libcurl/opts/CURLOPT_EXPECT_100_TIMEOUT_MS.3
+++ b/docs/libcurl/opts/CURLOPT_EXPECT_100_TIMEOUT_MS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_EXPECT_100_TIMEOUT_MS 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_EXPECT_100_TIMEOUT_MS 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_EXPECT_100_TIMEOUT_MS \- timeout for Expect: 100-continue response
@@ -44,7 +44,7 @@ HTTP
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* wait 3 seconds for 100-continue */
curl_easy_setopt(curl, CURLOPT_EXPECT_100_TIMEOUT_MS, 3000L);
diff --git a/docs/libcurl/opts/CURLOPT_FAILONERROR.3 b/docs/libcurl/opts/CURLOPT_FAILONERROR.3
index c2ee9dda..8d15b4fe 100644
--- a/docs/libcurl/opts/CURLOPT_FAILONERROR.3
+++ b/docs/libcurl/opts/CURLOPT_FAILONERROR.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FAILONERROR 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_FAILONERROR 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FAILONERROR \- request failure on HTTP response >= 400
diff --git a/docs/libcurl/opts/CURLOPT_FILETIME.3 b/docs/libcurl/opts/CURLOPT_FILETIME.3
index 56e92893..1f33d67f 100644
--- a/docs/libcurl/opts/CURLOPT_FILETIME.3
+++ b/docs/libcurl/opts/CURLOPT_FILETIME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FILETIME 3 "April 03, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_FILETIME 3 "April 03, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FILETIME \- get the modification time of the remote resource
diff --git a/docs/libcurl/opts/CURLOPT_FNMATCH_DATA.3 b/docs/libcurl/opts/CURLOPT_FNMATCH_DATA.3
index 559f7d15..c41be716 100644
--- a/docs/libcurl/opts/CURLOPT_FNMATCH_DATA.3
+++ b/docs/libcurl/opts/CURLOPT_FNMATCH_DATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FNMATCH_DATA 3 "May 31, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_FNMATCH_DATA 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FNMATCH_DATA \- custom pointer to fnmatch callback
diff --git a/docs/libcurl/opts/CURLOPT_FNMATCH_FUNCTION.3 b/docs/libcurl/opts/CURLOPT_FNMATCH_FUNCTION.3
index e7234b5b..afa6febd 100644
--- a/docs/libcurl/opts/CURLOPT_FNMATCH_FUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_FNMATCH_FUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FNMATCH_FUNCTION 3 "May 31, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_FNMATCH_FUNCTION 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FNMATCH_FUNCTION \- wildcard matching function callback
diff --git a/docs/libcurl/opts/CURLOPT_FOLLOWLOCATION.3 b/docs/libcurl/opts/CURLOPT_FOLLOWLOCATION.3
index 12578e01..aa656257 100644
--- a/docs/libcurl/opts/CURLOPT_FOLLOWLOCATION.3
+++ b/docs/libcurl/opts/CURLOPT_FOLLOWLOCATION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FOLLOWLOCATION 3 "January 28, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_FOLLOWLOCATION 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FOLLOWLOCATION \- follow HTTP 3xx redirects
@@ -64,7 +64,7 @@ HTTP(S)
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* example.com is redirected, so we tell libcurl to follow redirection */
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
diff --git a/docs/libcurl/opts/CURLOPT_FORBID_REUSE.3 b/docs/libcurl/opts/CURLOPT_FORBID_REUSE.3
index bcc4ad0e..0830b5fe 100644
--- a/docs/libcurl/opts/CURLOPT_FORBID_REUSE.3
+++ b/docs/libcurl/opts/CURLOPT_FORBID_REUSE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FORBID_REUSE 3 "May 31, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_FORBID_REUSE 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FORBID_REUSE \- make connection get closed at once after use
diff --git a/docs/libcurl/opts/CURLOPT_FRESH_CONNECT.3 b/docs/libcurl/opts/CURLOPT_FRESH_CONNECT.3
index 131ff9e9..408b11e6 100644
--- a/docs/libcurl/opts/CURLOPT_FRESH_CONNECT.3
+++ b/docs/libcurl/opts/CURLOPT_FRESH_CONNECT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FRESH_CONNECT 3 "May 31, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_FRESH_CONNECT 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FRESH_CONNECT \- force a new connection to be used
diff --git a/docs/libcurl/opts/CURLOPT_FTPPORT.3 b/docs/libcurl/opts/CURLOPT_FTPPORT.3
index 0fb9be88..66f65e50 100644
--- a/docs/libcurl/opts/CURLOPT_FTPPORT.3
+++ b/docs/libcurl/opts/CURLOPT_FTPPORT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTPPORT 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_FTPPORT 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FTPPORT \- make FTP transfer active
diff --git a/docs/libcurl/opts/CURLOPT_FTPSSLAUTH.3 b/docs/libcurl/opts/CURLOPT_FTPSSLAUTH.3
index ecbf04d8..79a14c8a 100644
--- a/docs/libcurl/opts/CURLOPT_FTPSSLAUTH.3
+++ b/docs/libcurl/opts/CURLOPT_FTPSSLAUTH.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTPSSLAUTH 3 "May 31, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_FTPSSLAUTH 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FTPSSLAUTH \- set order in which to attempt TLS vs SSL when using FTP
diff --git a/docs/libcurl/opts/CURLOPT_FTP_ACCOUNT.3 b/docs/libcurl/opts/CURLOPT_FTP_ACCOUNT.3
index e97b660c..47d46f38 100644
--- a/docs/libcurl/opts/CURLOPT_FTP_ACCOUNT.3
+++ b/docs/libcurl/opts/CURLOPT_FTP_ACCOUNT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTP_ACCOUNT 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_FTP_ACCOUNT 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FTP_ACCOUNT \- set account info for FTP
diff --git a/docs/libcurl/opts/CURLOPT_FTP_ALTERNATIVE_TO_USER.3 b/docs/libcurl/opts/CURLOPT_FTP_ALTERNATIVE_TO_USER.3
index 331cecae..0ef996f1 100644
--- a/docs/libcurl/opts/CURLOPT_FTP_ALTERNATIVE_TO_USER.3
+++ b/docs/libcurl/opts/CURLOPT_FTP_ALTERNATIVE_TO_USER.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTP_ALTERNATIVE_TO_USER 3 "May 05, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_FTP_ALTERNATIVE_TO_USER 3 "May 05, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FTP_ALTERNATIVE_TO_USER \- command to use instead of USER with FTP
diff --git a/docs/libcurl/opts/CURLOPT_FTP_CREATE_MISSING_DIRS.3 b/docs/libcurl/opts/CURLOPT_FTP_CREATE_MISSING_DIRS.3
index 77789f41..e037d984 100644
--- a/docs/libcurl/opts/CURLOPT_FTP_CREATE_MISSING_DIRS.3
+++ b/docs/libcurl/opts/CURLOPT_FTP_CREATE_MISSING_DIRS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTP_CREATE_MISSING_DIRS 3 "May 05, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_FTP_CREATE_MISSING_DIRS 3 "May 05, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FTP_CREATE_MISSING_DIRS \- create missing dirs for FTP and SFTP
diff --git a/docs/libcurl/opts/CURLOPT_FTP_FILEMETHOD.3 b/docs/libcurl/opts/CURLOPT_FTP_FILEMETHOD.3
index dfca3510..1c7059f9 100644
--- a/docs/libcurl/opts/CURLOPT_FTP_FILEMETHOD.3
+++ b/docs/libcurl/opts/CURLOPT_FTP_FILEMETHOD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTP_FILEMETHOD 3 "May 05, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_FTP_FILEMETHOD 3 "May 05, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FTP_FILEMETHOD \- select directory traversing method for FTP
diff --git a/docs/libcurl/opts/CURLOPT_FTP_RESPONSE_TIMEOUT.3 b/docs/libcurl/opts/CURLOPT_FTP_RESPONSE_TIMEOUT.3
index 576768a7..739c2618 100644
--- a/docs/libcurl/opts/CURLOPT_FTP_RESPONSE_TIMEOUT.3
+++ b/docs/libcurl/opts/CURLOPT_FTP_RESPONSE_TIMEOUT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTP_RESPONSE_TIMEOUT 3 "October 03, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_FTP_RESPONSE_TIMEOUT 3 "October 03, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FTP_RESPONSE_TIMEOUT \- time allowed to wait for FTP response
diff --git a/docs/libcurl/opts/CURLOPT_FTP_SKIP_PASV_IP.3 b/docs/libcurl/opts/CURLOPT_FTP_SKIP_PASV_IP.3
index 8827a1a5..8fb839e4 100644
--- a/docs/libcurl/opts/CURLOPT_FTP_SKIP_PASV_IP.3
+++ b/docs/libcurl/opts/CURLOPT_FTP_SKIP_PASV_IP.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTP_SKIP_PASV_IP 3 "May 05, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_FTP_SKIP_PASV_IP 3 "May 05, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FTP_SKIP_PASV_IP \- ignore the IP address in the PASV response
diff --git a/docs/libcurl/opts/CURLOPT_FTP_SSL_CCC.3 b/docs/libcurl/opts/CURLOPT_FTP_SSL_CCC.3
index 6556c36d..febf3115 100644
--- a/docs/libcurl/opts/CURLOPT_FTP_SSL_CCC.3
+++ b/docs/libcurl/opts/CURLOPT_FTP_SSL_CCC.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTP_SSL_CCC 3 "May 31, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_FTP_SSL_CCC 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FTP_SSL_CCC \- switch off SSL again with FTP after auth
diff --git a/docs/libcurl/opts/CURLOPT_FTP_USE_EPRT.3 b/docs/libcurl/opts/CURLOPT_FTP_USE_EPRT.3
index 3a1492af..c29d03d4 100644
--- a/docs/libcurl/opts/CURLOPT_FTP_USE_EPRT.3
+++ b/docs/libcurl/opts/CURLOPT_FTP_USE_EPRT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTP_USE_EPRT 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_FTP_USE_EPRT 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FTP_USE_EPRT \- enable/disable use of EPRT with FTP
diff --git a/docs/libcurl/opts/CURLOPT_FTP_USE_EPSV.3 b/docs/libcurl/opts/CURLOPT_FTP_USE_EPSV.3
index 4e36f471..9a00ef35 100644
--- a/docs/libcurl/opts/CURLOPT_FTP_USE_EPSV.3
+++ b/docs/libcurl/opts/CURLOPT_FTP_USE_EPSV.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTP_USE_EPSV 3 "May 05, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_FTP_USE_EPSV 3 "May 05, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FTP_USE_EPSV \- enable/disable use of EPSV
diff --git a/docs/libcurl/opts/CURLOPT_FTP_USE_PRET.3 b/docs/libcurl/opts/CURLOPT_FTP_USE_PRET.3
index 3b01b118..aa3e5151 100644
--- a/docs/libcurl/opts/CURLOPT_FTP_USE_PRET.3
+++ b/docs/libcurl/opts/CURLOPT_FTP_USE_PRET.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTP_USE_PRET 3 "May 05, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_FTP_USE_PRET 3 "May 05, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FTP_USE_PRET \- enable the PRET command
diff --git a/docs/libcurl/opts/CURLOPT_GSSAPI_DELEGATION.3 b/docs/libcurl/opts/CURLOPT_GSSAPI_DELEGATION.3
index a0014d5b..f3c4b0ec 100644
--- a/docs/libcurl/opts/CURLOPT_GSSAPI_DELEGATION.3
+++ b/docs/libcurl/opts/CURLOPT_GSSAPI_DELEGATION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_GSSAPI_DELEGATION 3 "May 31, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_GSSAPI_DELEGATION 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_GSSAPI_DELEGATION \- set allowed GSS-API delegation
diff --git a/docs/libcurl/opts/CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS.3 b/docs/libcurl/opts/CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS.3
index 3d729a4c..ef843d00 100644
--- a/docs/libcurl/opts/CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS.3
+++ b/docs/libcurl/opts/CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS \- head start for ipv6 for happy eyeballs
diff --git a/docs/libcurl/opts/CURLOPT_HAPROXYPROTOCOL.3 b/docs/libcurl/opts/CURLOPT_HAPROXYPROTOCOL.3
index 4268069d..843f75cc 100644
--- a/docs/libcurl/opts/CURLOPT_HAPROXYPROTOCOL.3
+++ b/docs/libcurl/opts/CURLOPT_HAPROXYPROTOCOL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HAPROXYPROTOCOL 3 "May 18, 2018" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_HAPROXYPROTOCOL 3 "May 18, 2018" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_HAPROXYPROTOCOL \- send HAProxy PROXY protocol v1 header
diff --git a/docs/libcurl/opts/CURLOPT_HEADER.3 b/docs/libcurl/opts/CURLOPT_HEADER.3
index e25c8c7c..4a7c5d2f 100644
--- a/docs/libcurl/opts/CURLOPT_HEADER.3
+++ b/docs/libcurl/opts/CURLOPT_HEADER.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HEADER 3 "October 03, 2018" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_HEADER 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_HEADER \- pass headers to the data stream
@@ -56,7 +56,7 @@ Most
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
curl_easy_setopt(curl, CURLOPT_HEADER, 1L);
diff --git a/docs/libcurl/opts/CURLOPT_HEADERDATA.3 b/docs/libcurl/opts/CURLOPT_HEADERDATA.3
index e5a5726f..af3b8c7e 100644
--- a/docs/libcurl/opts/CURLOPT_HEADERDATA.3
+++ b/docs/libcurl/opts/CURLOPT_HEADERDATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HEADERDATA 3 "May 05, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_HEADERDATA 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_HEADERDATA \- pointer to pass to header callback
@@ -61,7 +61,7 @@ static size_t header_callback(char *buffer, size_t size,
CURL *curl = curl_easy_init();
if(curl) {
struct my_info my = { 10, "the cookies are in the cupboard" };
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, header_callback);
diff --git a/docs/libcurl/opts/CURLOPT_HEADERFUNCTION.3 b/docs/libcurl/opts/CURLOPT_HEADERFUNCTION.3
index ff460e08..9b2ce77d 100644
--- a/docs/libcurl/opts/CURLOPT_HEADERFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_HEADERFUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HEADERFUNCTION 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_HEADERFUNCTION 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_HEADERFUNCTION \- callback that receives header data
@@ -103,7 +103,7 @@ static size_t header_callback(char *buffer, size_t size,
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, header_callback);
diff --git a/docs/libcurl/opts/CURLOPT_HEADEROPT.3 b/docs/libcurl/opts/CURLOPT_HEADEROPT.3
index e86d84dd..9f1a7b43 100644
--- a/docs/libcurl/opts/CURLOPT_HEADEROPT.3
+++ b/docs/libcurl/opts/CURLOPT_HEADEROPT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HEADEROPT 3 "October 31, 2019" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_HEADEROPT 3 "October 31, 2019" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_HEADEROPT \- set how to send HTTP headers
diff --git a/docs/libcurl/opts/CURLOPT_HTTP09_ALLOWED.3 b/docs/libcurl/opts/CURLOPT_HTTP09_ALLOWED.3
index 25304298..53718dbb 100644
--- a/docs/libcurl/opts/CURLOPT_HTTP09_ALLOWED.3
+++ b/docs/libcurl/opts/CURLOPT_HTTP09_ALLOWED.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HTTP09_ALLOWED 3 "August 05, 2019" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_HTTP09_ALLOWED 3 "August 05, 2019" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_HTTP09 \- allow HTTP/0.9 response
diff --git a/docs/libcurl/opts/CURLOPT_HTTP200ALIASES.3 b/docs/libcurl/opts/CURLOPT_HTTP200ALIASES.3
index 675074e4..8c66345a 100644
--- a/docs/libcurl/opts/CURLOPT_HTTP200ALIASES.3
+++ b/docs/libcurl/opts/CURLOPT_HTTP200ALIASES.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HTTP200ALIASES 3 "May 31, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_HTTP200ALIASES 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_HTTP200ALIASES \- specify alternative matches for HTTP 200 OK
@@ -54,7 +54,7 @@ HTTP
CURL *curl = curl_easy_init();
if(curl) {
struct curl_slist *list;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
list = curl_slist_append(NULL, "ICY 200 OK");
list = curl_slist_append(list, "WEIRDO 99 FINE");
diff --git a/docs/libcurl/opts/CURLOPT_HTTPAUTH.3 b/docs/libcurl/opts/CURLOPT_HTTPAUTH.3
index 00753eac..75796957 100644
--- a/docs/libcurl/opts/CURLOPT_HTTPAUTH.3
+++ b/docs/libcurl/opts/CURLOPT_HTTPAUTH.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HTTPAUTH 3 "June 15, 2018" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_HTTPAUTH 3 "June 15, 2018" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_HTTPAUTH \- set HTTP server authentication methods to try
diff --git a/docs/libcurl/opts/CURLOPT_HTTPGET.3 b/docs/libcurl/opts/CURLOPT_HTTPGET.3
index c8194302..305ce272 100644
--- a/docs/libcurl/opts/CURLOPT_HTTPGET.3
+++ b/docs/libcurl/opts/CURLOPT_HTTPGET.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HTTPGET 3 "May 21, 2018" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_HTTPGET 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_HTTPGET \- ask for an HTTP GET request
@@ -47,7 +47,7 @@ HTTP(S)
.nf
curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* use a GET to fetch this */
curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L);
diff --git a/docs/libcurl/opts/CURLOPT_HTTPHEADER.3 b/docs/libcurl/opts/CURLOPT_HTTPHEADER.3
index 42a7ffdc..f13b9d33 100644
--- a/docs/libcurl/opts/CURLOPT_HTTPHEADER.3
+++ b/docs/libcurl/opts/CURLOPT_HTTPHEADER.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HTTPHEADER 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_HTTPHEADER 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_HTTPHEADER \- set custom HTTP headers
@@ -103,7 +103,7 @@ CURL *curl = curl_easy_init();
struct curl_slist *list = NULL;
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
list = curl_slist_append(list, "Shoesize: 10");
list = curl_slist_append(list, "Accept:");
diff --git a/docs/libcurl/opts/CURLOPT_HTTPPOST.3 b/docs/libcurl/opts/CURLOPT_HTTPPOST.3
index a3edc40e..41af0236 100644
--- a/docs/libcurl/opts/CURLOPT_HTTPPOST.3
+++ b/docs/libcurl/opts/CURLOPT_HTTPPOST.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HTTPPOST 3 "September 02, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_HTTPPOST 3 "September 02, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_HTTPPOST \- specify the multipart formpost content
diff --git a/docs/libcurl/opts/CURLOPT_HTTPPROXYTUNNEL.3 b/docs/libcurl/opts/CURLOPT_HTTPPROXYTUNNEL.3
index 1a28a47f..639f64f7 100644
--- a/docs/libcurl/opts/CURLOPT_HTTPPROXYTUNNEL.3
+++ b/docs/libcurl/opts/CURLOPT_HTTPPROXYTUNNEL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HTTPPROXYTUNNEL 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_HTTPPROXYTUNNEL 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_HTTPPROXYTUNNEL \- tunnel through HTTP proxy
diff --git a/docs/libcurl/opts/CURLOPT_HTTP_CONTENT_DECODING.3 b/docs/libcurl/opts/CURLOPT_HTTP_CONTENT_DECODING.3
index 90a273ce..812d7740 100644
--- a/docs/libcurl/opts/CURLOPT_HTTP_CONTENT_DECODING.3
+++ b/docs/libcurl/opts/CURLOPT_HTTP_CONTENT_DECODING.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HTTP_CONTENT_DECODING 3 "May 31, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_HTTP_CONTENT_DECODING 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_HTTP_CONTENT_DECODING \- enable/disable HTTP content decoding
diff --git a/docs/libcurl/opts/CURLOPT_HTTP_TRANSFER_DECODING.3 b/docs/libcurl/opts/CURLOPT_HTTP_TRANSFER_DECODING.3
index a23d8296..bd0a45db 100644
--- a/docs/libcurl/opts/CURLOPT_HTTP_TRANSFER_DECODING.3
+++ b/docs/libcurl/opts/CURLOPT_HTTP_TRANSFER_DECODING.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HTTP_TRANSFER_DECODING 3 "May 31, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_HTTP_TRANSFER_DECODING 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_HTTP_TRANSFER_DECODING \- enable/disable HTTP transfer decoding
diff --git a/docs/libcurl/opts/CURLOPT_HTTP_VERSION.3 b/docs/libcurl/opts/CURLOPT_HTTP_VERSION.3
index b5a66b72..8674519b 100644
--- a/docs/libcurl/opts/CURLOPT_HTTP_VERSION.3
+++ b/docs/libcurl/opts/CURLOPT_HTTP_VERSION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HTTP_VERSION 3 "September 14, 2019" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_HTTP_VERSION 3 "September 14, 2019" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_HTTP_VERSION \- specify HTTP protocol version to use
diff --git a/docs/libcurl/opts/CURLOPT_IGNORE_CONTENT_LENGTH.3 b/docs/libcurl/opts/CURLOPT_IGNORE_CONTENT_LENGTH.3
index 2e15dab9..d350d302 100644
--- a/docs/libcurl/opts/CURLOPT_IGNORE_CONTENT_LENGTH.3
+++ b/docs/libcurl/opts/CURLOPT_IGNORE_CONTENT_LENGTH.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_IGNORE_CONTENT_LENGTH 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_IGNORE_CONTENT_LENGTH 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_IGNORE_CONTENT_LENGTH \- ignore content length
@@ -52,7 +52,7 @@ HTTP
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* we know the server is silly, ignore content-length */
curl_easy_setopt(curl, CURLOPT_IGNORE_CONTENT_LENGTH, 1L);
diff --git a/docs/libcurl/opts/CURLOPT_INFILESIZE.3 b/docs/libcurl/opts/CURLOPT_INFILESIZE.3
index 234aafb2..f1b8291b 100644
--- a/docs/libcurl/opts/CURLOPT_INFILESIZE.3
+++ b/docs/libcurl/opts/CURLOPT_INFILESIZE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_INFILESIZE 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_INFILESIZE 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_INFILESIZE \- set size of the input file to send off
diff --git a/docs/libcurl/opts/CURLOPT_INFILESIZE_LARGE.3 b/docs/libcurl/opts/CURLOPT_INFILESIZE_LARGE.3
index 4055b5e5..def8299b 100644
--- a/docs/libcurl/opts/CURLOPT_INFILESIZE_LARGE.3
+++ b/docs/libcurl/opts/CURLOPT_INFILESIZE_LARGE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_INFILESIZE_LARGE 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_INFILESIZE_LARGE 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_INFILESIZE_LARGE \- set size of the input file to send off
diff --git a/docs/libcurl/opts/CURLOPT_INTERFACE.3 b/docs/libcurl/opts/CURLOPT_INTERFACE.3
index 54161a62..52e73de8 100644
--- a/docs/libcurl/opts/CURLOPT_INTERFACE.3
+++ b/docs/libcurl/opts/CURLOPT_INTERFACE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_INTERFACE 3 "June 18, 2018" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_INTERFACE 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_INTERFACE \- source interface for outgoing traffic
@@ -55,7 +55,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
curl_easy_setopt(curl, CURLOPT_INTERFACE, "eth0");
diff --git a/docs/libcurl/opts/CURLOPT_INTERLEAVEDATA.3 b/docs/libcurl/opts/CURLOPT_INTERLEAVEDATA.3
index f7e482dc..95f695cf 100644
--- a/docs/libcurl/opts/CURLOPT_INTERLEAVEDATA.3
+++ b/docs/libcurl/opts/CURLOPT_INTERLEAVEDATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_INTERLEAVEDATA 3 "September 15, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_INTERLEAVEDATA 3 "September 15, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_INTERLEAVEDATA \- custom pointer passed to RTSP interleave callback
diff --git a/docs/libcurl/opts/CURLOPT_INTERLEAVEFUNCTION.3 b/docs/libcurl/opts/CURLOPT_INTERLEAVEFUNCTION.3
index e20a987f..5f9755ca 100644
--- a/docs/libcurl/opts/CURLOPT_INTERLEAVEFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_INTERLEAVEFUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_INTERLEAVEFUNCTION 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_INTERLEAVEFUNCTION 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_INTERLEAVEFUNCTION \- callback function for RTSP interleaved data
diff --git a/docs/libcurl/opts/CURLOPT_IOCTLDATA.3 b/docs/libcurl/opts/CURLOPT_IOCTLDATA.3
index fc59917c..d05b4add 100644
--- a/docs/libcurl/opts/CURLOPT_IOCTLDATA.3
+++ b/docs/libcurl/opts/CURLOPT_IOCTLDATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_IOCTLDATA 3 "May 31, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_IOCTLDATA 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_IOCTLDATA \- custom pointer passed to I/O callback
diff --git a/docs/libcurl/opts/CURLOPT_IOCTLFUNCTION.3 b/docs/libcurl/opts/CURLOPT_IOCTLFUNCTION.3
index 3a8cd487..ba5606c5 100644
--- a/docs/libcurl/opts/CURLOPT_IOCTLFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_IOCTLFUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_IOCTLFUNCTION 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_IOCTLFUNCTION 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_IOCTLFUNCTION \- callback for I/O operations
diff --git a/docs/libcurl/opts/CURLOPT_IPRESOLVE.3 b/docs/libcurl/opts/CURLOPT_IPRESOLVE.3
index e6c9f8c8..9516852c 100644
--- a/docs/libcurl/opts/CURLOPT_IPRESOLVE.3
+++ b/docs/libcurl/opts/CURLOPT_IPRESOLVE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_IPRESOLVE 3 "May 05, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_IPRESOLVE 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_IPRESOLVE \- specify which IP protocol version to use
@@ -46,7 +46,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
/* resolve host name using IPv6-names only */
curl_easy_setopt(curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V6);
diff --git a/docs/libcurl/opts/CURLOPT_ISSUERCERT.3 b/docs/libcurl/opts/CURLOPT_ISSUERCERT.3
index 83942ba3..7abe206c 100644
--- a/docs/libcurl/opts/CURLOPT_ISSUERCERT.3
+++ b/docs/libcurl/opts/CURLOPT_ISSUERCERT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_ISSUERCERT 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_ISSUERCERT 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_ISSUERCERT \- issuer SSL certificate filename
diff --git a/docs/libcurl/opts/CURLOPT_KEEP_SENDING_ON_ERROR.3 b/docs/libcurl/opts/CURLOPT_KEEP_SENDING_ON_ERROR.3
index 83eee3ee..46e4f01f 100644
--- a/docs/libcurl/opts/CURLOPT_KEEP_SENDING_ON_ERROR.3
+++ b/docs/libcurl/opts/CURLOPT_KEEP_SENDING_ON_ERROR.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_KEEP_SENDING_ON_ERROR 3 "May 31, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_KEEP_SENDING_ON_ERROR 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_KEEP_SENDING_ON_ERROR \- keep sending on early HTTP response >= 300
diff --git a/docs/libcurl/opts/CURLOPT_KEYPASSWD.3 b/docs/libcurl/opts/CURLOPT_KEYPASSWD.3
index 6fc96c7a..d8c27d09 100644
--- a/docs/libcurl/opts/CURLOPT_KEYPASSWD.3
+++ b/docs/libcurl/opts/CURLOPT_KEYPASSWD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_KEYPASSWD 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_KEYPASSWD 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_KEYPASSWD \- set passphrase to private key
@@ -44,7 +44,7 @@ All TLS based protocols: HTTPS, FTPS, IMAPS, POP3S, SMTPS etc.
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
curl_easy_setopt(curl, CURLOPT_SSLCERT, "client.pem");
curl_easy_setopt(curl, CURLOPT_SSLKEY, "key.pem");
curl_easy_setopt(curl, CURLOPT_KEYPASSWD, "superman");
diff --git a/docs/libcurl/opts/CURLOPT_KRBLEVEL.3 b/docs/libcurl/opts/CURLOPT_KRBLEVEL.3
index 0d841d6a..ac8497d4 100644
--- a/docs/libcurl/opts/CURLOPT_KRBLEVEL.3
+++ b/docs/libcurl/opts/CURLOPT_KRBLEVEL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_KRBLEVEL 3 "May 31, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_KRBLEVEL 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_KRBLEVEL \- set FTP kerberos security level
diff --git a/docs/libcurl/opts/CURLOPT_LOCALPORT.3 b/docs/libcurl/opts/CURLOPT_LOCALPORT.3
index e9d163d4..18e08014 100644
--- a/docs/libcurl/opts/CURLOPT_LOCALPORT.3
+++ b/docs/libcurl/opts/CURLOPT_LOCALPORT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_LOCALPORT 3 "October 31, 2019" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_LOCALPORT 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_LOCALPORT \- set local port number to use for socket
@@ -41,7 +41,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
curl_easy_setopt(curl, CURLOPT_LOCALPORT, 49152L);
/* and try 20 more ports following that */
curl_easy_setopt(curl, CURLOPT_LOCALPORTRANGE, 20L);
diff --git a/docs/libcurl/opts/CURLOPT_LOCALPORTRANGE.3 b/docs/libcurl/opts/CURLOPT_LOCALPORTRANGE.3
index e38e68e0..63a2f196 100644
--- a/docs/libcurl/opts/CURLOPT_LOCALPORTRANGE.3
+++ b/docs/libcurl/opts/CURLOPT_LOCALPORTRANGE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_LOCALPORTRANGE 3 "October 31, 2019" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_LOCALPORTRANGE 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_LOCALPORTRANGE \- number of additional local ports to try
@@ -45,7 +45,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
curl_easy_setopt(curl, CURLOPT_LOCALPORT, 49152L);
/* and try 20 more ports following that */
curl_easy_setopt(curl, CURLOPT_LOCALPORTRANGE, 20L);
diff --git a/docs/libcurl/opts/CURLOPT_LOGIN_OPTIONS.3 b/docs/libcurl/opts/CURLOPT_LOGIN_OPTIONS.3
index 7402b5d4..6b593f4f 100644
--- a/docs/libcurl/opts/CURLOPT_LOGIN_OPTIONS.3
+++ b/docs/libcurl/opts/CURLOPT_LOGIN_OPTIONS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_LOGIN_OPTIONS 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_LOGIN_OPTIONS 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_LOGIN_OPTIONS \- set login options
diff --git a/docs/libcurl/opts/CURLOPT_LOW_SPEED_LIMIT.3 b/docs/libcurl/opts/CURLOPT_LOW_SPEED_LIMIT.3
index 1b295fd2..f29df3ac 100644
--- a/docs/libcurl/opts/CURLOPT_LOW_SPEED_LIMIT.3
+++ b/docs/libcurl/opts/CURLOPT_LOW_SPEED_LIMIT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_LOW_SPEED_LIMIT 3 "May 06, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_LOW_SPEED_LIMIT 3 "May 06, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_LOW_SPEED_LIMIT \- set low speed limit in bytes per second
diff --git a/docs/libcurl/opts/CURLOPT_LOW_SPEED_TIME.3 b/docs/libcurl/opts/CURLOPT_LOW_SPEED_TIME.3
index 3779f8b3..2696e542 100644
--- a/docs/libcurl/opts/CURLOPT_LOW_SPEED_TIME.3
+++ b/docs/libcurl/opts/CURLOPT_LOW_SPEED_TIME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_LOW_SPEED_TIME 3 "May 06, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_LOW_SPEED_TIME 3 "May 06, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_LOW_SPEED_TIME \- set low speed limit time period
diff --git a/docs/libcurl/opts/CURLOPT_MAIL_AUTH.3 b/docs/libcurl/opts/CURLOPT_MAIL_AUTH.3
index c9d15d46..61ce76c6 100644
--- a/docs/libcurl/opts/CURLOPT_MAIL_AUTH.3
+++ b/docs/libcurl/opts/CURLOPT_MAIL_AUTH.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_MAIL_AUTH 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_MAIL_AUTH 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_MAIL_AUTH \- SMTP authentication address
diff --git a/docs/libcurl/opts/CURLOPT_MAIL_FROM.3 b/docs/libcurl/opts/CURLOPT_MAIL_FROM.3
index bfb66f62..f707022c 100644
--- a/docs/libcurl/opts/CURLOPT_MAIL_FROM.3
+++ b/docs/libcurl/opts/CURLOPT_MAIL_FROM.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_MAIL_FROM 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_MAIL_FROM 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_MAIL_FROM \- SMTP sender address
diff --git a/docs/libcurl/opts/CURLOPT_MAIL_RCPT.3 b/docs/libcurl/opts/CURLOPT_MAIL_RCPT.3
index 9264f9da..cc6026b6 100644
--- a/docs/libcurl/opts/CURLOPT_MAIL_RCPT.3
+++ b/docs/libcurl/opts/CURLOPT_MAIL_RCPT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_MAIL_RCPT 3 "July 16, 2019" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_MAIL_RCPT 3 "July 16, 2019" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_MAIL_RCPT \- list of SMTP mail recipients
diff --git a/docs/libcurl/opts/CURLOPT_MAIL_RCPT_ALLLOWFAILS.3 b/docs/libcurl/opts/CURLOPT_MAIL_RCPT_ALLLOWFAILS.3
index cf5e302f..99661917 100644
--- a/docs/libcurl/opts/CURLOPT_MAIL_RCPT_ALLLOWFAILS.3
+++ b/docs/libcurl/opts/CURLOPT_MAIL_RCPT_ALLLOWFAILS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_MAIL_RCPT_ALLLOWFAILS 3 "January 14, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_MAIL_RCPT_ALLLOWFAILS 3 "January 14, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_MAIL_RCPT_ALLLOWFAILS \- allow RCPT TO command to fail for some recipients
diff --git a/docs/libcurl/opts/CURLOPT_MAXAGE_CONN.3 b/docs/libcurl/opts/CURLOPT_MAXAGE_CONN.3
index c3b4d3af..d36767bf 100644
--- a/docs/libcurl/opts/CURLOPT_MAXAGE_CONN.3
+++ b/docs/libcurl/opts/CURLOPT_MAXAGE_CONN.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_MAXAGE_CONN 3 "April 14, 2019" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_MAXAGE_CONN 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_MAXAGE_CONN \- max idle time allowed for reusing a connection
@@ -49,7 +49,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* only allow 30 seconds idle time */
curl_easy_setopt(curl, CURLOPT_MAXAGE_CONN, 30L);
diff --git a/docs/libcurl/opts/CURLOPT_MAXCONNECTS.3 b/docs/libcurl/opts/CURLOPT_MAXCONNECTS.3
index 2d5cfd7e..85821f5b 100644
--- a/docs/libcurl/opts/CURLOPT_MAXCONNECTS.3
+++ b/docs/libcurl/opts/CURLOPT_MAXCONNECTS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_MAXCONNECTS 3 "May 30, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_MAXCONNECTS 3 "May 30, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_MAXCONNECTS \- maximum connection cache size
diff --git a/docs/libcurl/opts/CURLOPT_MAXFILESIZE.3 b/docs/libcurl/opts/CURLOPT_MAXFILESIZE.3
index f61270f0..ab2ae4ea 100644
--- a/docs/libcurl/opts/CURLOPT_MAXFILESIZE.3
+++ b/docs/libcurl/opts/CURLOPT_MAXFILESIZE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_MAXFILESIZE 3 "May 30, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_MAXFILESIZE 3 "May 30, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_MAXFILESIZE \- maximum file size allowed to download
diff --git a/docs/libcurl/opts/CURLOPT_MAXFILESIZE_LARGE.3 b/docs/libcurl/opts/CURLOPT_MAXFILESIZE_LARGE.3
index 38227475..f4166e06 100644
--- a/docs/libcurl/opts/CURLOPT_MAXFILESIZE_LARGE.3
+++ b/docs/libcurl/opts/CURLOPT_MAXFILESIZE_LARGE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_MAXFILESIZE_LARGE 3 "May 30, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_MAXFILESIZE_LARGE 3 "May 30, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_MAXFILESIZE_LARGE \- maximum file size allowed to download
diff --git a/docs/libcurl/opts/CURLOPT_MAXREDIRS.3 b/docs/libcurl/opts/CURLOPT_MAXREDIRS.3
index 4f430a49..ec026795 100644
--- a/docs/libcurl/opts/CURLOPT_MAXREDIRS.3
+++ b/docs/libcurl/opts/CURLOPT_MAXREDIRS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_MAXREDIRS 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_MAXREDIRS 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_MAXREDIRS \- maximum number of redirects allowed
@@ -45,7 +45,7 @@ HTTP(S)
.nf
curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
/* enable redirect following */
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
diff --git a/docs/libcurl/opts/CURLOPT_MAX_RECV_SPEED_LARGE.3 b/docs/libcurl/opts/CURLOPT_MAX_RECV_SPEED_LARGE.3
index 541a1276..264a40d4 100644
--- a/docs/libcurl/opts/CURLOPT_MAX_RECV_SPEED_LARGE.3
+++ b/docs/libcurl/opts/CURLOPT_MAX_RECV_SPEED_LARGE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_MAX_RECV_SPEED_LARGE 3 "August 14, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_MAX_RECV_SPEED_LARGE 3 "August 14, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_MAX_RECV_SPEED_LARGE \- rate limit data download speed
diff --git a/docs/libcurl/opts/CURLOPT_MAX_SEND_SPEED_LARGE.3 b/docs/libcurl/opts/CURLOPT_MAX_SEND_SPEED_LARGE.3
index 877b2ce0..31e0db06 100644
--- a/docs/libcurl/opts/CURLOPT_MAX_SEND_SPEED_LARGE.3
+++ b/docs/libcurl/opts/CURLOPT_MAX_SEND_SPEED_LARGE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_MAX_SEND_SPEED_LARGE 3 "August 14, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_MAX_SEND_SPEED_LARGE 3 "August 14, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_MAX_SEND_SPEED_LARGE \- rate limit data upload speed
diff --git a/docs/libcurl/opts/CURLOPT_MIMEPOST.3 b/docs/libcurl/opts/CURLOPT_MIMEPOST.3
index 3b231476..79d7b8ba 100644
--- a/docs/libcurl/opts/CURLOPT_MIMEPOST.3
+++ b/docs/libcurl/opts/CURLOPT_MIMEPOST.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_MIMEPOST 3 "September 04, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_MIMEPOST 3 "September 04, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_MIMEPOST \- set post/send data from mime structure
diff --git a/docs/libcurl/opts/CURLOPT_NETRC.3 b/docs/libcurl/opts/CURLOPT_NETRC.3
index 90dcd71f..2e9476b0 100644
--- a/docs/libcurl/opts/CURLOPT_NETRC.3
+++ b/docs/libcurl/opts/CURLOPT_NETRC.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_NETRC 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_NETRC 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_NETRC \- request that .netrc is used
diff --git a/docs/libcurl/opts/CURLOPT_NETRC_FILE.3 b/docs/libcurl/opts/CURLOPT_NETRC_FILE.3
index dff2b2d9..544a7670 100644
--- a/docs/libcurl/opts/CURLOPT_NETRC_FILE.3
+++ b/docs/libcurl/opts/CURLOPT_NETRC_FILE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_NETRC_FILE 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_NETRC_FILE 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_NETRC_FILE \- file name to read .netrc info from
diff --git a/docs/libcurl/opts/CURLOPT_NEW_DIRECTORY_PERMS.3 b/docs/libcurl/opts/CURLOPT_NEW_DIRECTORY_PERMS.3
index 5267b00c..89db0bc0 100644
--- a/docs/libcurl/opts/CURLOPT_NEW_DIRECTORY_PERMS.3
+++ b/docs/libcurl/opts/CURLOPT_NEW_DIRECTORY_PERMS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_NEW_DIRECTORY_PERMS 3 "May 31, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_NEW_DIRECTORY_PERMS 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_NEW_DIRECTORY_PERMS \- permissions for remotely created directories
diff --git a/docs/libcurl/opts/CURLOPT_NEW_FILE_PERMS.3 b/docs/libcurl/opts/CURLOPT_NEW_FILE_PERMS.3
index d60fa08b..d22de64e 100644
--- a/docs/libcurl/opts/CURLOPT_NEW_FILE_PERMS.3
+++ b/docs/libcurl/opts/CURLOPT_NEW_FILE_PERMS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_NEW_FILE_PERMS 3 "May 31, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_NEW_FILE_PERMS 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_NEW_FILE_PERMS \- permissions for remotely created files
diff --git a/docs/libcurl/opts/CURLOPT_NOBODY.3 b/docs/libcurl/opts/CURLOPT_NOBODY.3
index d957f993..e87b17a4 100644
--- a/docs/libcurl/opts/CURLOPT_NOBODY.3
+++ b/docs/libcurl/opts/CURLOPT_NOBODY.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_NOBODY 3 "July 27, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_NOBODY 3 "July 27, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_NOBODY \- do the download request without getting the body
diff --git a/docs/libcurl/opts/CURLOPT_NOPROGRESS.3 b/docs/libcurl/opts/CURLOPT_NOPROGRESS.3
index c1f4e8c5..13512ecd 100644
--- a/docs/libcurl/opts/CURLOPT_NOPROGRESS.3
+++ b/docs/libcurl/opts/CURLOPT_NOPROGRESS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_NOPROGRESS 3 "October 09, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_NOPROGRESS 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_NOPROGRESS \- switch off the progress meter
@@ -41,7 +41,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* enable progress meter */
curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0L);
diff --git a/docs/libcurl/opts/CURLOPT_NOPROXY.3 b/docs/libcurl/opts/CURLOPT_NOPROXY.3
index b64deca3..597468e1 100644
--- a/docs/libcurl/opts/CURLOPT_NOPROXY.3
+++ b/docs/libcurl/opts/CURLOPT_NOPROXY.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_NOPROXY 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_NOPROXY 3 "August 22, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_NOPROXY \- disable proxy use for specific hosts
@@ -50,6 +50,10 @@ brackets:
"example.com,::1,localhost"
+IPv6 numerical addresses are compared as strings, so they will only match if
+the representations are the same: "::1" is the same as "::0:1" but they don't
+match.
+
The application does not have to keep the string around after setting this
option.
.SH "Environment variables"
diff --git a/docs/libcurl/opts/CURLOPT_NOSIGNAL.3 b/docs/libcurl/opts/CURLOPT_NOSIGNAL.3
index 03b77033..466273de 100644
--- a/docs/libcurl/opts/CURLOPT_NOSIGNAL.3
+++ b/docs/libcurl/opts/CURLOPT_NOSIGNAL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_NOSIGNAL 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_NOSIGNAL 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_NOSIGNAL \- skip all signal handling
diff --git a/docs/libcurl/opts/CURLOPT_OPENSOCKETDATA.3 b/docs/libcurl/opts/CURLOPT_OPENSOCKETDATA.3
index 39e26366..10beb2c5 100644
--- a/docs/libcurl/opts/CURLOPT_OPENSOCKETDATA.3
+++ b/docs/libcurl/opts/CURLOPT_OPENSOCKETDATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_OPENSOCKETDATA 3 "May 15, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_OPENSOCKETDATA 3 "May 15, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_OPENSOCKETDATA \- custom pointer passed to open socket callback
diff --git a/docs/libcurl/opts/CURLOPT_OPENSOCKETFUNCTION.3 b/docs/libcurl/opts/CURLOPT_OPENSOCKETFUNCTION.3
index 1f1bbdbf..0f88f19a 100644
--- a/docs/libcurl/opts/CURLOPT_OPENSOCKETFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_OPENSOCKETFUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_OPENSOCKETFUNCTION 3 "June 09, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_OPENSOCKETFUNCTION 3 "June 09, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_OPENSOCKETFUNCTION \- set callback for opening sockets
diff --git a/docs/libcurl/opts/CURLOPT_PASSWORD.3 b/docs/libcurl/opts/CURLOPT_PASSWORD.3
index 1fb4cebf..eff48dc9 100644
--- a/docs/libcurl/opts/CURLOPT_PASSWORD.3
+++ b/docs/libcurl/opts/CURLOPT_PASSWORD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PASSWORD 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_PASSWORD 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PASSWORD \- password to use in authentication
@@ -45,7 +45,7 @@ Most
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
curl_easy_setopt(curl, CURLOPT_PASSWORD, "qwerty");
diff --git a/docs/libcurl/opts/CURLOPT_PATH_AS_IS.3 b/docs/libcurl/opts/CURLOPT_PATH_AS_IS.3
index d79920bf..8d8ca0d7 100644
--- a/docs/libcurl/opts/CURLOPT_PATH_AS_IS.3
+++ b/docs/libcurl/opts/CURLOPT_PATH_AS_IS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PATH_AS_IS 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_PATH_AS_IS 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PATH_AS_IS \- do not handle dot dot sequences
@@ -49,7 +49,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/../../etc/password");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/../../etc/password");
curl_easy_setopt(curl, CURLOPT_PATH_AS_IS, 1L);
diff --git a/docs/libcurl/opts/CURLOPT_PINNEDPUBLICKEY.3 b/docs/libcurl/opts/CURLOPT_PINNEDPUBLICKEY.3
index d43bbda4..21ed6e9e 100644
--- a/docs/libcurl/opts/CURLOPT_PINNEDPUBLICKEY.3
+++ b/docs/libcurl/opts/CURLOPT_PINNEDPUBLICKEY.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PINNEDPUBLICKEY 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_PINNEDPUBLICKEY 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PINNEDPUBLICKEY \- set pinned public key
diff --git a/docs/libcurl/opts/CURLOPT_PIPEWAIT.3 b/docs/libcurl/opts/CURLOPT_PIPEWAIT.3
index fcbd2586..32fcdb5a 100644
--- a/docs/libcurl/opts/CURLOPT_PIPEWAIT.3
+++ b/docs/libcurl/opts/CURLOPT_PIPEWAIT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PIPEWAIT 3 "May 01, 2016" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_PIPEWAIT 3 "May 01, 2016" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PIPEWAIT \- wait for pipelining/multiplexing
diff --git a/docs/libcurl/opts/CURLOPT_PORT.3 b/docs/libcurl/opts/CURLOPT_PORT.3
index b12ba391..c50828d6 100644
--- a/docs/libcurl/opts/CURLOPT_PORT.3
+++ b/docs/libcurl/opts/CURLOPT_PORT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PORT 3 "May 31, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_PORT 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PORT \- set remote port number to work with
@@ -46,7 +46,7 @@ Used for all protocols that speak to a port number.
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
curl_easy_setopt(curl, CURLOPT_PORT, 8080L);
ret = curl_easy_perform(curl);
curl_easy_cleanup(curl);
diff --git a/docs/libcurl/opts/CURLOPT_POST.3 b/docs/libcurl/opts/CURLOPT_POST.3
index b549c373..e43203b8 100644
--- a/docs/libcurl/opts/CURLOPT_POST.3
+++ b/docs/libcurl/opts/CURLOPT_POST.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_POST 3 "July 22, 2019" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_POST 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_POST \- request an HTTP POST
@@ -73,7 +73,7 @@ HTTP
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
curl_easy_setopt(curl, CURLOPT_POST, 1L);
/* set up the read callback with CURLOPT_READFUNCTION */
diff --git a/docs/libcurl/opts/CURLOPT_POSTFIELDS.3 b/docs/libcurl/opts/CURLOPT_POSTFIELDS.3
index bc10ea5b..67272220 100644
--- a/docs/libcurl/opts/CURLOPT_POSTFIELDS.3
+++ b/docs/libcurl/opts/CURLOPT_POSTFIELDS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_POSTFIELDS 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_POSTFIELDS 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_POSTFIELDS \- specify data to POST to server
@@ -70,7 +70,7 @@ CURL *curl = curl_easy_init();
if(curl) {
const char *data = "data to send";
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* size of the POST data */
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, 12L);
diff --git a/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE.3 b/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE.3
index 7da5a38b..c3ea8c92 100644
--- a/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE.3
+++ b/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_POSTFIELDSIZE 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_POSTFIELDSIZE 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_POSTFIELDSIZE \- size of POST data pointed to
@@ -45,7 +45,7 @@ CURL *curl = curl_easy_init();
if(curl) {
const char *data = "data to send";
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* size of the POST data */
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (long) strlen(data));
diff --git a/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE_LARGE.3 b/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE_LARGE.3
index e15b8f78..d330c25d 100644
--- a/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE_LARGE.3
+++ b/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE_LARGE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_POSTFIELDSIZE_LARGE 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_POSTFIELDSIZE_LARGE 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_POSTFIELDSIZE_LARGE \- size of POST data pointed to
@@ -46,7 +46,7 @@ if(curl) {
const char *data = large_chunk;
curl_off_t length_of_data; /* set somehow */
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* size of the POST data */
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE_LARGE, length_of_data);
diff --git a/docs/libcurl/opts/CURLOPT_POSTQUOTE.3 b/docs/libcurl/opts/CURLOPT_POSTQUOTE.3
index a6d7133a..9d1f433a 100644
--- a/docs/libcurl/opts/CURLOPT_POSTQUOTE.3
+++ b/docs/libcurl/opts/CURLOPT_POSTQUOTE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_POSTQUOTE 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_POSTQUOTE 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_POSTQUOTE \- (S)FTP commands to run after the transfer
diff --git a/docs/libcurl/opts/CURLOPT_POSTREDIR.3 b/docs/libcurl/opts/CURLOPT_POSTREDIR.3
index 671c1890..6ee06204 100644
--- a/docs/libcurl/opts/CURLOPT_POSTREDIR.3
+++ b/docs/libcurl/opts/CURLOPT_POSTREDIR.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_POSTREDIR 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_POSTREDIR 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_POSTREDIR \- how to act on an HTTP POST redirect
@@ -53,7 +53,7 @@ HTTP(S)
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* a silly POST example */
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "data=true");
diff --git a/docs/libcurl/opts/CURLOPT_PREQUOTE.3 b/docs/libcurl/opts/CURLOPT_PREQUOTE.3
index c10ca408..959fbbbf 100644
--- a/docs/libcurl/opts/CURLOPT_PREQUOTE.3
+++ b/docs/libcurl/opts/CURLOPT_PREQUOTE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PREQUOTE 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_PREQUOTE 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PREQUOTE \- commands to run before an FTP transfer
diff --git a/docs/libcurl/opts/CURLOPT_PRE_PROXY.3 b/docs/libcurl/opts/CURLOPT_PRE_PROXY.3
index 7e2cea5e..c5355658 100644
--- a/docs/libcurl/opts/CURLOPT_PRE_PROXY.3
+++ b/docs/libcurl/opts/CURLOPT_PRE_PROXY.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PRE_PROXY 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_PRE_PROXY 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PRE_PROXY \- set pre-proxy to use
@@ -65,7 +65,7 @@ All except file://. Note that some protocols don't do very well over proxy.
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/file.txt");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/file.txt");
curl_easy_setopt(curl, CURLOPT_PREPROXY, "socks4://socks-proxy:1080");
curl_easy_setopt(curl, CURLOPT_PROXY, "http://proxy:80");
curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLOPT_PRIVATE.3 b/docs/libcurl/opts/CURLOPT_PRIVATE.3
index 9b7be910..e8144574 100644
--- a/docs/libcurl/opts/CURLOPT_PRIVATE.3
+++ b/docs/libcurl/opts/CURLOPT_PRIVATE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PRIVATE 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_PRIVATE 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PRIVATE \- store a private pointer
@@ -43,7 +43,7 @@ CURL *curl = curl_easy_init();
struct private secrets;
if(curl) {
struct private *extracted;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* store a pointer to our private struct */
curl_easy_setopt(curl, CURLOPT_PRIVATE, &secrets);
diff --git a/docs/libcurl/opts/CURLOPT_PROGRESSDATA.3 b/docs/libcurl/opts/CURLOPT_PROGRESSDATA.3
index 34d69f17..1ff69e22 100644
--- a/docs/libcurl/opts/CURLOPT_PROGRESSDATA.3
+++ b/docs/libcurl/opts/CURLOPT_PROGRESSDATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROGRESSDATA 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_PROGRESSDATA 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROGRESSDATA \- custom pointer passed to the progress callback
diff --git a/docs/libcurl/opts/CURLOPT_PROGRESSFUNCTION.3 b/docs/libcurl/opts/CURLOPT_PROGRESSFUNCTION.3
index 83d45362..9d338787 100644
--- a/docs/libcurl/opts/CURLOPT_PROGRESSFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_PROGRESSFUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROGRESSFUNCTION 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_PROGRESSFUNCTION 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROGRESSFUNCTION \- callback to progress meter function
diff --git a/docs/libcurl/opts/CURLOPT_PROTOCOLS.3 b/docs/libcurl/opts/CURLOPT_PROTOCOLS.3
index 01c7a36a..2f3e8c5e 100644
--- a/docs/libcurl/opts/CURLOPT_PROTOCOLS.3
+++ b/docs/libcurl/opts/CURLOPT_PROTOCOLS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROTOCOLS 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_PROTOCOLS 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROTOCOLS \- set allowed protocols
diff --git a/docs/libcurl/opts/CURLOPT_PROXY.3 b/docs/libcurl/opts/CURLOPT_PROXY.3
index 4a11969e..9f1c45b1 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY \- set proxy to use
@@ -96,7 +96,7 @@ All except file://. Note that some protocols don't do very well over proxy.
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/file.txt");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/file.txt");
curl_easy_setopt(curl, CURLOPT_PROXY, "http://proxy:80");
curl_easy_perform(curl);
}
diff --git a/docs/libcurl/opts/CURLOPT_PROXYAUTH.3 b/docs/libcurl/opts/CURLOPT_PROXYAUTH.3
index f126ed54..cf3c083c 100644
--- a/docs/libcurl/opts/CURLOPT_PROXYAUTH.3
+++ b/docs/libcurl/opts/CURLOPT_PROXYAUTH.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXYAUTH 3 "May 30, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXYAUTH 3 "May 30, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXYAUTH \- set HTTP proxy authentication methods to try
diff --git a/docs/libcurl/opts/CURLOPT_PROXYHEADER.3 b/docs/libcurl/opts/CURLOPT_PROXYHEADER.3
index 986e23b8..a1b9aaa8 100644
--- a/docs/libcurl/opts/CURLOPT_PROXYHEADER.3
+++ b/docs/libcurl/opts/CURLOPT_PROXYHEADER.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXYHEADER 3 "May 30, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXYHEADER 3 "May 30, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXYHEADER \- custom HTTP headers to pass to proxy
diff --git a/docs/libcurl/opts/CURLOPT_PROXYPASSWORD.3 b/docs/libcurl/opts/CURLOPT_PROXYPASSWORD.3
index 2435f2d6..49a7c31c 100644
--- a/docs/libcurl/opts/CURLOPT_PROXYPASSWORD.3
+++ b/docs/libcurl/opts/CURLOPT_PROXYPASSWORD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXYPASSWORD 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXYPASSWORD 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXYPASSWORD \- password to use with proxy authentication
@@ -45,7 +45,7 @@ Most
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
curl_easy_setopt(curl, CURLOPT_PROXY, "http://localhost:8080");
curl_easy_setopt(curl, CURLOPT_PROXYUSERNAME, "mrsmith");
curl_easy_setopt(curl, CURLOPT_PROXYPASSWORD, "qwerty");
diff --git a/docs/libcurl/opts/CURLOPT_PROXYPORT.3 b/docs/libcurl/opts/CURLOPT_PROXYPORT.3
index 53d4304d..d72fd0a1 100644
--- a/docs/libcurl/opts/CURLOPT_PROXYPORT.3
+++ b/docs/libcurl/opts/CURLOPT_PROXYPORT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXYPORT 3 "May 31, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXYPORT 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXYPORT \- port number the proxy listens on
@@ -43,7 +43,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
curl_easy_setopt(curl, CURLOPT_PROXY, "localhost");
curl_easy_setopt(curl, CURLOPT_PROXYPORT, 8080L);
ret = curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLOPT_PROXYTYPE.3 b/docs/libcurl/opts/CURLOPT_PROXYTYPE.3
index 03fd0396..14d36034 100644
--- a/docs/libcurl/opts/CURLOPT_PROXYTYPE.3
+++ b/docs/libcurl/opts/CURLOPT_PROXYTYPE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXYTYPE 3 "May 30, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXYTYPE 3 "May 30, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXYTYPE \- proxy protocol type
diff --git a/docs/libcurl/opts/CURLOPT_PROXYUSERNAME.3 b/docs/libcurl/opts/CURLOPT_PROXYUSERNAME.3
index 1c572cb9..55b8ac49 100644
--- a/docs/libcurl/opts/CURLOPT_PROXYUSERNAME.3
+++ b/docs/libcurl/opts/CURLOPT_PROXYUSERNAME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXYUSERNAME 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXYUSERNAME 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXYUSERNAME \- user name to use for proxy authentication
@@ -49,7 +49,7 @@ Most
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
curl_easy_setopt(curl, CURLOPT_PROXY, "http://localhost:8080");
curl_easy_setopt(curl, CURLOPT_PROXYUSERNAME, "mrsmith");
curl_easy_setopt(curl, CURLOPT_PROXYPASSWORD, "qwerty");
diff --git a/docs/libcurl/opts/CURLOPT_PROXYUSERPWD.3 b/docs/libcurl/opts/CURLOPT_PROXYUSERPWD.3
index 754b5705..868fcfa1 100644
--- a/docs/libcurl/opts/CURLOPT_PROXYUSERPWD.3
+++ b/docs/libcurl/opts/CURLOPT_PROXYUSERPWD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXYUSERPWD 3 "May 30, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXYUSERPWD 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXYUSERPWD \- user name and password to use for proxy authentication
@@ -47,7 +47,7 @@ Used with all protocols that can use a proxy
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
curl_easy_setopt(curl, CURLOPT_PROXY, "http://localhost:8080");
curl_easy_setopt(curl, CURLOPT_PROXYUSERPWD, "clark%20kent:superman");
ret = curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_CAINFO.3 b/docs/libcurl/opts/CURLOPT_PROXY_CAINFO.3
index 12aeaa53..e838f86e 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_CAINFO.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_CAINFO.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_CAINFO 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_CAINFO 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_CAINFO \- path to proxy Certificate Authority (CA) bundle
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_CAPATH.3 b/docs/libcurl/opts/CURLOPT_PROXY_CAPATH.3
index b0d0468a..6b36f72f 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_CAPATH.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_CAPATH.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_CAPATH 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_CAPATH 3 "August 24, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_CAPATH \- specify directory holding proxy CA certificates
@@ -68,5 +68,5 @@ CURLE_UNKNOWN_OPTION
CURLE_OUT_OF_MEMORY
.SH "SEE ALSO"
.BR CURLOPT_PROXY_CAINFO "(3), "
-.Br CURLOPT_CAINFO "(3), " CURLOPT_PROXY_SSL_VERIFYHOST "(3), "
+.BR CURLOPT_CAINFO "(3), " CURLOPT_PROXY_SSL_VERIFYHOST "(3), "
.BR CURLOPT_STDERR "(3), " CURLOPT_DEBUGFUNCTION "(3), "
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_CRLFILE.3 b/docs/libcurl/opts/CURLOPT_PROXY_CRLFILE.3
index 27bd9f58..5465fa28 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_CRLFILE.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_CRLFILE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_CRLFILE 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_CRLFILE 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_CRLFILE \- specify a proxy Certificate Revocation List file
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_ISSUERCERT.3 b/docs/libcurl/opts/CURLOPT_PROXY_ISSUERCERT.3
index bcc79a6d..821ebe77 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_ISSUERCERT.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_ISSUERCERT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_ISSUERCERT 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_ISSUERCERT 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_ISSUERCERT \- proxy issuer SSL certificate filename
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_KEYPASSWD.3 b/docs/libcurl/opts/CURLOPT_PROXY_KEYPASSWD.3
index e75c44ec..29128d4d 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_KEYPASSWD.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_KEYPASSWD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_KEYPASSWD 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_KEYPASSWD 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_KEYPASSWD \- set passphrase to proxy private key
@@ -46,7 +46,7 @@ Used with HTTPS proxy
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
curl_easy_setopt(curl, CURLOPT_PROXY, "https://proxy:443");
curl_easy_setopt(curl, CURLOPT_PROXY_KEYPASSWD, "superman");
ret = curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_PINNEDPUBLICKEY.3 b/docs/libcurl/opts/CURLOPT_PROXY_PINNEDPUBLICKEY.3
index 10c029a0..2b3eac52 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_PINNEDPUBLICKEY.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_PINNEDPUBLICKEY.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_PINNEDPUBLICKEY 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_PINNEDPUBLICKEY 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_PINNEDPUBLICKEY \- set pinned public key for https proxy
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SERVICE_NAME.3 b/docs/libcurl/opts/CURLOPT_PROXY_SERVICE_NAME.3
index b37c508b..2850258f 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_SERVICE_NAME.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SERVICE_NAME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_SERVICE_NAME 3 "May 31, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SERVICE_NAME 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_SERVICE_NAME \- proxy authentication service name
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SSLCERT.3 b/docs/libcurl/opts/CURLOPT_PROXY_SSLCERT.3
index 0820236d..1bfb8e86 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_SSLCERT.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SSLCERT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_SSLCERT 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SSLCERT 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_SSLCERT \- set SSL proxy client certificate
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SSLCERTTYPE.3 b/docs/libcurl/opts/CURLOPT_PROXY_SSLCERTTYPE.3
index 2648da12..917c0264 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_SSLCERTTYPE.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SSLCERTTYPE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_SSLCERTTYPE 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SSLCERTTYPE 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_SSLCERTTYPE \- specify type of the proxy client SSL certificate
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SSLKEY.3 b/docs/libcurl/opts/CURLOPT_PROXY_SSLKEY.3
index 43ee0d3a..4cc4bcde 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_SSLKEY.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SSLKEY.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_SSLKEY 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SSLKEY 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_SSLKEY \- specify private keyfile for TLS and SSL proxy client cert
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SSLKEYTYPE.3 b/docs/libcurl/opts/CURLOPT_PROXY_SSLKEYTYPE.3
index ef8b8334..e1c615f6 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_SSLKEYTYPE.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SSLKEYTYPE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_SSLKEYTYPE 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SSLKEYTYPE 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_SSLKEYTYPE \- set type of the proxy private key file
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SSLVERSION.3 b/docs/libcurl/opts/CURLOPT_PROXY_SSLVERSION.3
index 5dbaf572..f436be5d 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_SSLVERSION.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SSLVERSION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_SSLVERSION 3 "October 31, 2019" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SSLVERSION 3 "October 31, 2019" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_SSLVERSION \- set preferred proxy TLS/SSL version
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SSL_CIPHER_LIST.3 b/docs/libcurl/opts/CURLOPT_PROXY_SSL_CIPHER_LIST.3
index 38cc055b..626a782c 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_SSL_CIPHER_LIST.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SSL_CIPHER_LIST.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_SSL_CIPHER_LIST 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SSL_CIPHER_LIST 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_SSL_CIPHER_LIST \- specify ciphers to use for proxy TLS
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SSL_OPTIONS.3 b/docs/libcurl/opts/CURLOPT_PROXY_SSL_OPTIONS.3
index 029c6d69..0a6bbf0c 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_SSL_OPTIONS.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SSL_OPTIONS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_SSL_OPTIONS 3 "July 16, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SSL_OPTIONS 3 "July 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_SSL_OPTIONS \- set proxy SSL behavior options
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SSL_VERIFYHOST.3 b/docs/libcurl/opts/CURLOPT_PROXY_SSL_VERIFYHOST.3
index a5224c62..e3bc216b 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_SSL_VERIFYHOST.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SSL_VERIFYHOST.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_SSL_VERIFYHOST 3 "August 20, 2019" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SSL_VERIFYHOST 3 "August 20, 2019" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_SSL_VERIFYHOST \- verify the proxy certificate's name against host
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SSL_VERIFYPEER.3 b/docs/libcurl/opts/CURLOPT_PROXY_SSL_VERIFYPEER.3
index 0eb9bdbf..ec54366f 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_SSL_VERIFYPEER.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SSL_VERIFYPEER.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_SSL_VERIFYPEER 3 "December 16, 2016" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SSL_VERIFYPEER 3 "December 16, 2016" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_SSL_VERIFYPEER \- verify the proxy's SSL certificate
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_TLS13_CIPHERS.3 b/docs/libcurl/opts/CURLOPT_PROXY_TLS13_CIPHERS.3
index 7f2a6b61..c8623598 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_TLS13_CIPHERS.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_TLS13_CIPHERS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_TLS13_CIPHERS 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_TLS13_CIPHERS 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_TLS13_CIPHERS \- ciphers suites for proxy TLS 1.3
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_PASSWORD.3 b/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_PASSWORD.3
index 0f1f56ab..4f318d52 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_PASSWORD.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_PASSWORD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_TLSAUTH_PASSWORD 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_TLSAUTH_PASSWORD 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_TLSAUTH_PASSWORD \- password to use for proxy TLS authentication
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_TYPE.3 b/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_TYPE.3
index 8981a809..917bc4ff 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_TYPE.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_TYPE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_TLSAUTH_TYPE 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_TLSAUTH_TYPE 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_TLSAUTH_TYPE \- set proxy TLS authentication methods
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_USERNAME.3 b/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_USERNAME.3
index d0a6202f..7e54fbf0 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_USERNAME.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_USERNAME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_TLSAUTH_USERNAME 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_TLSAUTH_USERNAME 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_TLSAUTH_USERNAME \- user name to use for proxy TLS authentication
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_TRANSFER_MODE.3 b/docs/libcurl/opts/CURLOPT_PROXY_TRANSFER_MODE.3
index 7f36bfa0..fc33373b 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_TRANSFER_MODE.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_TRANSFER_MODE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_TRANSFER_MODE 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_TRANSFER_MODE 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_TRANSFER_MODE \- append FTP transfer mode to URL for proxy
diff --git a/docs/libcurl/opts/CURLOPT_PUT.3 b/docs/libcurl/opts/CURLOPT_PUT.3
index bec5bcef..0581b7f5 100644
--- a/docs/libcurl/opts/CURLOPT_PUT.3
+++ b/docs/libcurl/opts/CURLOPT_PUT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PUT 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_PUT 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PUT \- make an HTTP PUT request
diff --git a/docs/libcurl/opts/CURLOPT_QUOTE.3 b/docs/libcurl/opts/CURLOPT_QUOTE.3
index 977c1d4a..d5501f5d 100644
--- a/docs/libcurl/opts/CURLOPT_QUOTE.3
+++ b/docs/libcurl/opts/CURLOPT_QUOTE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_QUOTE 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_QUOTE 3 "August 14, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_QUOTE \- (S)FTP commands to run before transfer
@@ -44,6 +44,10 @@ mandatory commands).
The valid SFTP commands are:
.RS
+.IP "atime date file"
+The atime command sets the last access time of the file named by the file
+operand. The <date expression> can be all sorts of date strings, see the
+\fIcurl_getdate(3)\fP man page for date expression details. (Added in 7.73.0)
.IP "chgrp group file"
The chgrp command sets the group ID of the file named by the file operand to
the group ID specified by the group operand. The group operand is a decimal
@@ -60,6 +64,10 @@ The ln and symlink commands create a symbolic link at the target_file location
pointing to the source_file location.
.IP "mkdir directory_name"
The mkdir command creates the directory named by the directory_name operand.
+.IP "mtime date file"
+The mtime command sets the last modification time of the file named by the
+file operand. The <date expression> can be all sorts of date strings, see the
+\fIcurl_getdate(3)\fP man page for date expression details. (Added in 7.73.0)
.IP "pwd"
The pwd command returns the absolute pathname of the current working directory.
.IP "rename source target"
diff --git a/docs/libcurl/opts/CURLOPT_RANDOM_FILE.3 b/docs/libcurl/opts/CURLOPT_RANDOM_FILE.3
index 3836875d..04774853 100644
--- a/docs/libcurl/opts/CURLOPT_RANDOM_FILE.3
+++ b/docs/libcurl/opts/CURLOPT_RANDOM_FILE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RANDOM_FILE 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_RANDOM_FILE 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_RANDOM_FILE \- specify a source for random data
diff --git a/docs/libcurl/opts/CURLOPT_RANGE.3 b/docs/libcurl/opts/CURLOPT_RANGE.3
index ce33143e..cf77786f 100644
--- a/docs/libcurl/opts/CURLOPT_RANGE.3
+++ b/docs/libcurl/opts/CURLOPT_RANGE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RANGE 3 "October 31, 2019" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_RANGE 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_RANGE \- set byte range to request
@@ -64,7 +64,7 @@ HTTP, FTP, FILE, RTSP and SFTP.
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* get the first 200 bytes */
curl_easy_setopt(curl, CURLOPT_RANGE, "0-199");
diff --git a/docs/libcurl/opts/CURLOPT_READDATA.3 b/docs/libcurl/opts/CURLOPT_READDATA.3
index 43bb2006..778a6d04 100644
--- a/docs/libcurl/opts/CURLOPT_READDATA.3
+++ b/docs/libcurl/opts/CURLOPT_READDATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_READDATA 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_READDATA 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_READDATA \- custom pointer passed to the read callback
@@ -48,7 +48,7 @@ This is used for all protocols when sending data.
CURL *curl = curl_easy_init();
struct MyData this;
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* pass pointer that gets passed in to the
CURLOPT_READFUNCTION callback */
diff --git a/docs/libcurl/opts/CURLOPT_READFUNCTION.3 b/docs/libcurl/opts/CURLOPT_READFUNCTION.3
index 51874866..c6c3af11 100644
--- a/docs/libcurl/opts/CURLOPT_READFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_READFUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_READFUNCTION 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_READFUNCTION 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_READFUNCTION \- read callback for data uploads
diff --git a/docs/libcurl/opts/CURLOPT_REDIR_PROTOCOLS.3 b/docs/libcurl/opts/CURLOPT_REDIR_PROTOCOLS.3
index 750c4d39..1bc786fe 100644
--- a/docs/libcurl/opts/CURLOPT_REDIR_PROTOCOLS.3
+++ b/docs/libcurl/opts/CURLOPT_REDIR_PROTOCOLS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_REDIR_PROTOCOLS 3 "February 18, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_REDIR_PROTOCOLS 3 "February 18, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_REDIR_PROTOCOLS \- set protocols allowed to redirect to
diff --git a/docs/libcurl/opts/CURLOPT_REFERER.3 b/docs/libcurl/opts/CURLOPT_REFERER.3
index 47320344..b95f8974 100644
--- a/docs/libcurl/opts/CURLOPT_REFERER.3
+++ b/docs/libcurl/opts/CURLOPT_REFERER.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_REFERER 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_REFERER 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_REFERER \- set the HTTP referer header
@@ -44,10 +44,10 @@ HTTP
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* tell it where we found the link to this place */
- curl_easy_setopt(curl, CURLOPT_REFERER, "http://example.com/aboutme.html");
+ curl_easy_setopt(curl, CURLOPT_REFERER, "https://example.com/aboutme.html");
curl_easy_perform(curl);
}
diff --git a/docs/libcurl/opts/CURLOPT_REQUEST_TARGET.3 b/docs/libcurl/opts/CURLOPT_REQUEST_TARGET.3
index abb6d58a..04ed9f3a 100644
--- a/docs/libcurl/opts/CURLOPT_REQUEST_TARGET.3
+++ b/docs/libcurl/opts/CURLOPT_REQUEST_TARGET.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_REQUEST_TARGET 3 "June 21, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_REQUEST_TARGET 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_REQUEST_TARGET \- specify an alternative target for this request
@@ -39,7 +39,7 @@ HTTP
.nf
curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/*");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/*");
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "OPTIONS");
/* issue an OPTIONS * request (no leading slash) */
diff --git a/docs/libcurl/opts/CURLOPT_RESOLVE.3 b/docs/libcurl/opts/CURLOPT_RESOLVE.3
index bf1bbbde..43763cfb 100644
--- a/docs/libcurl/opts/CURLOPT_RESOLVE.3
+++ b/docs/libcurl/opts/CURLOPT_RESOLVE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RESOLVE 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_RESOLVE 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_RESOLVE \- provide custom host name to IP address resolves
@@ -80,7 +80,7 @@ host = curl_slist_append(NULL, "example.com:80:127.0.0.1");
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_RESOLVE, host);
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLOPT_RESOLVER_START_DATA.3 b/docs/libcurl/opts/CURLOPT_RESOLVER_START_DATA.3
index 3ae58614..4347e49e 100644
--- a/docs/libcurl/opts/CURLOPT_RESOLVER_START_DATA.3
+++ b/docs/libcurl/opts/CURLOPT_RESOLVER_START_DATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RESOLVER_START_DATA 3 "February 14, 2018" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_RESOLVER_START_DATA 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_RESOLVER_START_DATA \- custom pointer passed to the resolver start callback
@@ -51,7 +51,7 @@ CURL *curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_RESOLVER_START_FUNCTION, resolver_start_cb);
curl_easy_setopt(curl, CURLOPT_RESOLVER_START_DATA, curl);
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
curl_easy_perform(curl);
curl_easy_cleanup(curl);
}
diff --git a/docs/libcurl/opts/CURLOPT_RESOLVER_START_FUNCTION.3 b/docs/libcurl/opts/CURLOPT_RESOLVER_START_FUNCTION.3
index 335c2662..9b8250c6 100644
--- a/docs/libcurl/opts/CURLOPT_RESOLVER_START_FUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_RESOLVER_START_FUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RESOLVER_START_FUNCTION 3 "February 14, 2018" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_RESOLVER_START_FUNCTION 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_RESOLVER_START_FUNCTION \- set callback to be called before a new resolve request is started
@@ -71,7 +71,7 @@ CURL *curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_RESOLVER_START_FUNCTION, resolver_start_cb);
curl_easy_setopt(curl, CURLOPT_RESOLVER_START_DATA, curl);
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
curl_easy_perform(curl);
curl_easy_cleanup(curl);
}
diff --git a/docs/libcurl/opts/CURLOPT_RESUME_FROM.3 b/docs/libcurl/opts/CURLOPT_RESUME_FROM.3
index 1dae5c5e..fa0484c7 100644
--- a/docs/libcurl/opts/CURLOPT_RESUME_FROM.3
+++ b/docs/libcurl/opts/CURLOPT_RESUME_FROM.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RESUME_FROM 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_RESUME_FROM 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_RESUME_FROM \- set a point to resume transfer from
diff --git a/docs/libcurl/opts/CURLOPT_RESUME_FROM_LARGE.3 b/docs/libcurl/opts/CURLOPT_RESUME_FROM_LARGE.3
index 552d5d11..98265523 100644
--- a/docs/libcurl/opts/CURLOPT_RESUME_FROM_LARGE.3
+++ b/docs/libcurl/opts/CURLOPT_RESUME_FROM_LARGE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RESUME_FROM_LARGE 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_RESUME_FROM_LARGE 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_RESUME_FROM_LARGE \- set a point to resume transfer from
diff --git a/docs/libcurl/opts/CURLOPT_RTSP_CLIENT_CSEQ.3 b/docs/libcurl/opts/CURLOPT_RTSP_CLIENT_CSEQ.3
index a564681a..c944cf63 100644
--- a/docs/libcurl/opts/CURLOPT_RTSP_CLIENT_CSEQ.3
+++ b/docs/libcurl/opts/CURLOPT_RTSP_CLIENT_CSEQ.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RTSP_CLIENT_CSEQ 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_RTSP_CLIENT_CSEQ 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_RTSP_CLIENT_CSEQ \- set the RTSP client CSEQ number
diff --git a/docs/libcurl/opts/CURLOPT_RTSP_REQUEST.3 b/docs/libcurl/opts/CURLOPT_RTSP_REQUEST.3
index 0f0a1709..49a5c7b4 100644
--- a/docs/libcurl/opts/CURLOPT_RTSP_REQUEST.3
+++ b/docs/libcurl/opts/CURLOPT_RTSP_REQUEST.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RTSP_REQUEST 3 "July 16, 2019" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_RTSP_REQUEST 3 "July 16, 2019" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_RTSP_REQUEST \- specify RTSP request
diff --git a/docs/libcurl/opts/CURLOPT_RTSP_SERVER_CSEQ.3 b/docs/libcurl/opts/CURLOPT_RTSP_SERVER_CSEQ.3
index 1a824dd8..96fb872c 100644
--- a/docs/libcurl/opts/CURLOPT_RTSP_SERVER_CSEQ.3
+++ b/docs/libcurl/opts/CURLOPT_RTSP_SERVER_CSEQ.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RTSP_SERVER_CSEQ 3 "May 31, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_RTSP_SERVER_CSEQ 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_RTSP_SERVER_CSEQ \- set the RTSP server CSEQ number
diff --git a/docs/libcurl/opts/CURLOPT_RTSP_SESSION_ID.3 b/docs/libcurl/opts/CURLOPT_RTSP_SESSION_ID.3
index 2b6edf23..131a2105 100644
--- a/docs/libcurl/opts/CURLOPT_RTSP_SESSION_ID.3
+++ b/docs/libcurl/opts/CURLOPT_RTSP_SESSION_ID.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RTSP_SESSION_ID 3 "May 31, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_RTSP_SESSION_ID 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_RTSP_SESSION_ID \- set RTSP session ID
diff --git a/docs/libcurl/opts/CURLOPT_RTSP_STREAM_URI.3 b/docs/libcurl/opts/CURLOPT_RTSP_STREAM_URI.3
index 31ce548c..6d8c4508 100644
--- a/docs/libcurl/opts/CURLOPT_RTSP_STREAM_URI.3
+++ b/docs/libcurl/opts/CURLOPT_RTSP_STREAM_URI.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RTSP_STREAM_URI 3 "July 16, 2019" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_RTSP_STREAM_URI 3 "July 16, 2019" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_RTSP_STREAM_URI \- set RTSP stream URI
diff --git a/docs/libcurl/opts/CURLOPT_RTSP_TRANSPORT.3 b/docs/libcurl/opts/CURLOPT_RTSP_TRANSPORT.3
index e4274d5c..96c262fb 100644
--- a/docs/libcurl/opts/CURLOPT_RTSP_TRANSPORT.3
+++ b/docs/libcurl/opts/CURLOPT_RTSP_TRANSPORT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RTSP_TRANSPORT 3 "May 31, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_RTSP_TRANSPORT 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_RTSP_TRANSPORT \- set RTSP Transport: header
diff --git a/docs/libcurl/opts/CURLOPT_SASL_AUTHZID.3 b/docs/libcurl/opts/CURLOPT_SASL_AUTHZID.3
index 3a57f412..35e6c001 100644
--- a/docs/libcurl/opts/CURLOPT_SASL_AUTHZID.3
+++ b/docs/libcurl/opts/CURLOPT_SASL_AUTHZID.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SASL_AUTHZID 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_SASL_AUTHZID 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SASL_AUTHZID \- authorisation identity (identity to act as)
diff --git a/docs/libcurl/opts/CURLOPT_SASL_IR.3 b/docs/libcurl/opts/CURLOPT_SASL_IR.3
index 6db92e4a..09a2beca 100644
--- a/docs/libcurl/opts/CURLOPT_SASL_IR.3
+++ b/docs/libcurl/opts/CURLOPT_SASL_IR.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SASL_IR 3 "May 31, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_SASL_IR 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SASL_IR \- enable sending initial response in first packet
diff --git a/docs/libcurl/opts/CURLOPT_SEEKDATA.3 b/docs/libcurl/opts/CURLOPT_SEEKDATA.3
index cb3ff045..4c71c5a6 100644
--- a/docs/libcurl/opts/CURLOPT_SEEKDATA.3
+++ b/docs/libcurl/opts/CURLOPT_SEEKDATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SEEKDATA 3 "October 31, 2019" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_SEEKDATA 3 "October 31, 2019" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SEEKDATA \- custom pointer passed to the seek callback
diff --git a/docs/libcurl/opts/CURLOPT_SEEKFUNCTION.3 b/docs/libcurl/opts/CURLOPT_SEEKFUNCTION.3
index d5fe4c35..d740abfc 100644
--- a/docs/libcurl/opts/CURLOPT_SEEKFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_SEEKFUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SEEKFUNCTION 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_SEEKFUNCTION 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SEEKFUNCTION \- user callback for seeking in input stream
diff --git a/docs/libcurl/opts/CURLOPT_SERVICE_NAME.3 b/docs/libcurl/opts/CURLOPT_SERVICE_NAME.3
index 8295363b..94117722 100644
--- a/docs/libcurl/opts/CURLOPT_SERVICE_NAME.3
+++ b/docs/libcurl/opts/CURLOPT_SERVICE_NAME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SERVICE_NAME 3 "May 31, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_SERVICE_NAME 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SERVICE_NAME \- authentication service name
diff --git a/docs/libcurl/opts/CURLOPT_SHARE.3 b/docs/libcurl/opts/CURLOPT_SHARE.3
index 28ce2b72..193d811a 100644
--- a/docs/libcurl/opts/CURLOPT_SHARE.3
+++ b/docs/libcurl/opts/CURLOPT_SHARE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SHARE 3 "May 31, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_SHARE 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SHARE \- specify share handle to use
diff --git a/docs/libcurl/opts/CURLOPT_SOCKOPTDATA.3 b/docs/libcurl/opts/CURLOPT_SOCKOPTDATA.3
index a1590759..cc43ac45 100644
--- a/docs/libcurl/opts/CURLOPT_SOCKOPTDATA.3
+++ b/docs/libcurl/opts/CURLOPT_SOCKOPTDATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SOCKOPTDATA 3 "May 15, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_SOCKOPTDATA 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SOCKOPTDATA \- custom pointer to pass to sockopt callback
@@ -49,7 +49,7 @@ curl = curl_easy_init();
if(curl) {
int recvbuffersize = 256 * 1024;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
/* call this function to set options for the socket */
curl_easy_setopt(curl, CURLOPT_SOCKOPTFUNCTION, sockopt_callback);
diff --git a/docs/libcurl/opts/CURLOPT_SOCKOPTFUNCTION.3 b/docs/libcurl/opts/CURLOPT_SOCKOPTFUNCTION.3
index 2be9fd09..efce2a6f 100644
--- a/docs/libcurl/opts/CURLOPT_SOCKOPTFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_SOCKOPTFUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SOCKOPTFUNCTION 3 "May 15, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_SOCKOPTFUNCTION 3 "May 15, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SOCKOPTFUNCTION \- set callback for setting socket options
diff --git a/docs/libcurl/opts/CURLOPT_SOCKS5_AUTH.3 b/docs/libcurl/opts/CURLOPT_SOCKS5_AUTH.3
index 17e959a1..1dc698fd 100644
--- a/docs/libcurl/opts/CURLOPT_SOCKS5_AUTH.3
+++ b/docs/libcurl/opts/CURLOPT_SOCKS5_AUTH.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SOCKS5_AUTH 3 "April 27, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_SOCKS5_AUTH 3 "April 27, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SOCKS5_AUTH \- set allowed methods for SOCKS5 proxy authentication
diff --git a/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_NEC.3 b/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_NEC.3
index 04be6a30..7bbae66e 100644
--- a/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_NEC.3
+++ b/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_NEC.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SOCKS5_GSSAPI_NEC 3 "May 31, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_SOCKS5_GSSAPI_NEC 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SOCKS5_GSSAPI_NEC \- set socks proxy gssapi negotiation protection
diff --git a/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_SERVICE.3 b/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_SERVICE.3
index 85ac0001..59d5b63c 100644
--- a/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_SERVICE.3
+++ b/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_SERVICE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SOCKS5_GSSAPI_SERVICE 3 "May 31, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_SOCKS5_GSSAPI_SERVICE 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SOCKS5_GSSAPI_SERVICE \- SOCKS5 proxy authentication service name
diff --git a/docs/libcurl/opts/CURLOPT_SSH_AUTH_TYPES.3 b/docs/libcurl/opts/CURLOPT_SSH_AUTH_TYPES.3
index a60394d0..09b8b403 100644
--- a/docs/libcurl/opts/CURLOPT_SSH_AUTH_TYPES.3
+++ b/docs/libcurl/opts/CURLOPT_SSH_AUTH_TYPES.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSH_AUTH_TYPES 3 "May 31, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_SSH_AUTH_TYPES 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSH_AUTH_TYPES \- set desired auth types for SFTP and SCP
diff --git a/docs/libcurl/opts/CURLOPT_SSH_COMPRESSION.3 b/docs/libcurl/opts/CURLOPT_SSH_COMPRESSION.3
index dd53a442..9fea8611 100644
--- a/docs/libcurl/opts/CURLOPT_SSH_COMPRESSION.3
+++ b/docs/libcurl/opts/CURLOPT_SSH_COMPRESSION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSH_COMPRESSION 3 "August 10, 2018" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_SSH_COMPRESSION 3 "August 10, 2018" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSH_COMPRESSION \- enables compression / decompression of SSH traffic
diff --git a/docs/libcurl/opts/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.3 b/docs/libcurl/opts/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.3
index cd17969f..cb8b3fa6 100644
--- a/docs/libcurl/opts/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.3
+++ b/docs/libcurl/opts/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 3 "May 31, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 \- checksum of SSH server public key
diff --git a/docs/libcurl/opts/CURLOPT_SSH_KEYDATA.3 b/docs/libcurl/opts/CURLOPT_SSH_KEYDATA.3
index f091fafc..2c09702f 100644
--- a/docs/libcurl/opts/CURLOPT_SSH_KEYDATA.3
+++ b/docs/libcurl/opts/CURLOPT_SSH_KEYDATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSH_KEYDATA 3 "May 31, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_SSH_KEYDATA 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSH_KEYDATA \- pointer to pass to the SSH key callback
diff --git a/docs/libcurl/opts/CURLOPT_SSH_KEYFUNCTION.3 b/docs/libcurl/opts/CURLOPT_SSH_KEYFUNCTION.3
index f1571f17..fcd95a24 100644
--- a/docs/libcurl/opts/CURLOPT_SSH_KEYFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_SSH_KEYFUNCTION.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSH_KEYFUNCTION 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_SSH_KEYFUNCTION 3 "July 15, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSH_KEYFUNCTION \- callback for known host matching logic
@@ -36,6 +36,7 @@ enum curl_khstat {
now so this causes a CURLE_DEFER error but
otherwise the connection will be left intact
etc */
+ CURLKHSTAT_FINE_REPLACE
};
enum curl_khmatch {
@@ -73,7 +74,13 @@ known_hosts file \fIknownkey\fP, the key from the remote site \fIfoundkey\fP,
info from libcurl on the matching status and a custom pointer (set with
\fICURLOPT_SSH_KEYDATA(3)\fP). It MUST return one of the following return
codes to tell libcurl how to act:
-
+.IP CURLKHSTAT_FINE_REPLACE
+The new host+key is accepted and libcurl will replace the old host+key into
+the known_hosts file before continuing with the connection. This will also
+add the new host+key combo to the known_host pool kept in memory if it wasn't
+already present there. The adding of data to the file is done by completely
+replacing the file with a new copy, so the permissions of the file must allow
+this. (Added in 7.73.0)
.IP CURLKHSTAT_FINE_ADD_TO_FILE
The host+key is accepted and libcurl will append it to the known_hosts file
before continuing with the connection. This will also add the host+key combo
diff --git a/docs/libcurl/opts/CURLOPT_SSH_KNOWNHOSTS.3 b/docs/libcurl/opts/CURLOPT_SSH_KNOWNHOSTS.3
index 4530b0c6..dcdc9091 100644
--- a/docs/libcurl/opts/CURLOPT_SSH_KNOWNHOSTS.3
+++ b/docs/libcurl/opts/CURLOPT_SSH_KNOWNHOSTS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSH_KNOWNHOSTS 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_SSH_KNOWNHOSTS 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSH_KNOWNHOSTS \- file name holding the SSH known hosts
diff --git a/docs/libcurl/opts/CURLOPT_SSH_PRIVATE_KEYFILE.3 b/docs/libcurl/opts/CURLOPT_SSH_PRIVATE_KEYFILE.3
index d6af64ca..402e57b3 100644
--- a/docs/libcurl/opts/CURLOPT_SSH_PRIVATE_KEYFILE.3
+++ b/docs/libcurl/opts/CURLOPT_SSH_PRIVATE_KEYFILE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSH_PRIVATE_KEYFILE 3 "May 31, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_SSH_PRIVATE_KEYFILE 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSH_PRIVATE_KEYFILE \- set private key file for SSH auth
diff --git a/docs/libcurl/opts/CURLOPT_SSH_PUBLIC_KEYFILE.3 b/docs/libcurl/opts/CURLOPT_SSH_PUBLIC_KEYFILE.3
index 9432febc..75c05ecd 100644
--- a/docs/libcurl/opts/CURLOPT_SSH_PUBLIC_KEYFILE.3
+++ b/docs/libcurl/opts/CURLOPT_SSH_PUBLIC_KEYFILE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSH_PUBLIC_KEYFILE 3 "May 31, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_SSH_PUBLIC_KEYFILE 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSH_PUBLIC_KEYFILE \- set public key file for SSH auth
diff --git a/docs/libcurl/opts/CURLOPT_SSLCERT.3 b/docs/libcurl/opts/CURLOPT_SSLCERT.3
index f1cd65d8..5af0e956 100644
--- a/docs/libcurl/opts/CURLOPT_SSLCERT.3
+++ b/docs/libcurl/opts/CURLOPT_SSLCERT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSLCERT 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_SSLCERT 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSLCERT \- set SSL client certificate
diff --git a/docs/libcurl/opts/CURLOPT_SSLCERTTYPE.3 b/docs/libcurl/opts/CURLOPT_SSLCERTTYPE.3
index c2e4579f..324996a3 100644
--- a/docs/libcurl/opts/CURLOPT_SSLCERTTYPE.3
+++ b/docs/libcurl/opts/CURLOPT_SSLCERTTYPE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSLCERTTYPE 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_SSLCERTTYPE 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSLCERTTYPE \- specify type of the client SSL certificate
diff --git a/docs/libcurl/opts/CURLOPT_SSLENGINE.3 b/docs/libcurl/opts/CURLOPT_SSLENGINE.3
index aa49fff7..7be56ead 100644
--- a/docs/libcurl/opts/CURLOPT_SSLENGINE.3
+++ b/docs/libcurl/opts/CURLOPT_SSLENGINE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSLENGINE 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_SSLENGINE 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSLENGINE \- set SSL engine identifier
diff --git a/docs/libcurl/opts/CURLOPT_SSLENGINE_DEFAULT.3 b/docs/libcurl/opts/CURLOPT_SSLENGINE_DEFAULT.3
index c671b91d..559a4f05 100644
--- a/docs/libcurl/opts/CURLOPT_SSLENGINE_DEFAULT.3
+++ b/docs/libcurl/opts/CURLOPT_SSLENGINE_DEFAULT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSLENGINE_DEFAULT 3 "May 31, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_SSLENGINE_DEFAULT 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSLENGINE_DEFAULT \- make SSL engine default
diff --git a/docs/libcurl/opts/CURLOPT_SSLKEY.3 b/docs/libcurl/opts/CURLOPT_SSLKEY.3
index f9655b29..ce1208a2 100644
--- a/docs/libcurl/opts/CURLOPT_SSLKEY.3
+++ b/docs/libcurl/opts/CURLOPT_SSLKEY.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSLKEY 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_SSLKEY 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSLKEY \- specify private keyfile for TLS and SSL client cert
diff --git a/docs/libcurl/opts/CURLOPT_SSLKEYTYPE.3 b/docs/libcurl/opts/CURLOPT_SSLKEYTYPE.3
index 1aff9cf0..2b71c081 100644
--- a/docs/libcurl/opts/CURLOPT_SSLKEYTYPE.3
+++ b/docs/libcurl/opts/CURLOPT_SSLKEYTYPE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSLKEYTYPE 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_SSLKEYTYPE 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSLKEYTYPE \- set type of the private key file
diff --git a/docs/libcurl/opts/CURLOPT_SSLVERSION.3 b/docs/libcurl/opts/CURLOPT_SSLVERSION.3
index d2e44b3e..7b12b9d7 100644
--- a/docs/libcurl/opts/CURLOPT_SSLVERSION.3
+++ b/docs/libcurl/opts/CURLOPT_SSLVERSION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSLVERSION 3 "October 31, 2019" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_SSLVERSION 3 "October 31, 2019" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSLVERSION \- set preferred TLS/SSL version
diff --git a/docs/libcurl/opts/CURLOPT_SSL_CIPHER_LIST.3 b/docs/libcurl/opts/CURLOPT_SSL_CIPHER_LIST.3
index d316fe23..2c6ef0d0 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_CIPHER_LIST.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_CIPHER_LIST.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSL_CIPHER_LIST 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_SSL_CIPHER_LIST 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSL_CIPHER_LIST \- specify ciphers to use for TLS
diff --git a/docs/libcurl/opts/CURLOPT_SSL_CTX_DATA.3 b/docs/libcurl/opts/CURLOPT_SSL_CTX_DATA.3
index 04561ff8..167fe327 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_CTX_DATA.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_CTX_DATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSL_CTX_DATA 3 "June 02, 2019" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_SSL_CTX_DATA 3 "June 02, 2019" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSL_CTX_DATA \- custom pointer passed to ssl_ctx callback
diff --git a/docs/libcurl/opts/CURLOPT_SSL_CTX_FUNCTION.3 b/docs/libcurl/opts/CURLOPT_SSL_CTX_FUNCTION.3
index 986da2cf..ed238895 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_CTX_FUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_CTX_FUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSL_CTX_FUNCTION 3 "June 02, 2019" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_SSL_CTX_FUNCTION 3 "June 02, 2019" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSL_CTX_FUNCTION \- SSL context callback for OpenSSL, wolfSSL or mbedTLS
diff --git a/docs/libcurl/opts/CURLOPT_SSL_EC_CURVES.3 b/docs/libcurl/opts/CURLOPT_SSL_EC_CURVES.3
new file mode 100644
index 00000000..db2d8737
--- /dev/null
+++ b/docs/libcurl/opts/CURLOPT_SSL_EC_CURVES.3
@@ -0,0 +1,55 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at https://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH CURLOPT_SSL_EC_CURVES 3 "August 29, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
+
+.SH NAME
+CURLOPT_SSL_EC_CURVES \- set key exchange curves
+.SH SYNOPSIS
+#include <curl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_EC_CURVES, char *alg_list);
+.SH DESCRIPTION
+Pass a string as parameter with a colon delimited list of (EC) algorithms. This
+option defines the client's key exchange algorithms in the SSL handshake (if
+the SSL backend libcurl is built to use supports it).
+.SH DEFAULT
+"", embedded in SSL backend
+.SH PROTOCOLS
+HTTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_SSL_EC_CURVES, "X25519:P-521");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.73.0. Supported by the OpenSSL backend.
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_SSL_OPTIONS "(3), " CURLOPT_SSL_CIPHER_LIST "(3), "
+.BR CURLOPT_TLS13_CIPHERS "(3), "
diff --git a/docs/libcurl/opts/CURLOPT_SSL_ENABLE_ALPN.3 b/docs/libcurl/opts/CURLOPT_SSL_ENABLE_ALPN.3
index e698441b..db7b7c2b 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_ENABLE_ALPN.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_ENABLE_ALPN.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSL_ENABLE_ALPN 3 "May 31, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_SSL_ENABLE_ALPN 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSL_ENABLE_ALPN \- enable ALPN
diff --git a/docs/libcurl/opts/CURLOPT_SSL_ENABLE_NPN.3 b/docs/libcurl/opts/CURLOPT_SSL_ENABLE_NPN.3
index da29378d..5f4fae63 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_ENABLE_NPN.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_ENABLE_NPN.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSL_ENABLE_NPN 3 "May 31, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_SSL_ENABLE_NPN 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSL_ENABLE_NPN \- enable NPN
diff --git a/docs/libcurl/opts/CURLOPT_SSL_FALSESTART.3 b/docs/libcurl/opts/CURLOPT_SSL_FALSESTART.3
index 1f9f7e3e..c0bb7671 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_FALSESTART.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_FALSESTART.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSL_FALSESTART 3 "May 15, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_SSL_FALSESTART 3 "May 15, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSL_FALSESTART \- enable TLS false start
diff --git a/docs/libcurl/opts/CURLOPT_SSL_OPTIONS.3 b/docs/libcurl/opts/CURLOPT_SSL_OPTIONS.3
index b7374f9f..46b5f08f 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_OPTIONS.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_OPTIONS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSL_OPTIONS 3 "July 16, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_SSL_OPTIONS 3 "July 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSL_OPTIONS \- set SSL behavior options
diff --git a/docs/libcurl/opts/CURLOPT_SSL_SESSIONID_CACHE.3 b/docs/libcurl/opts/CURLOPT_SSL_SESSIONID_CACHE.3
index 13b3ef4d..fdc1077c 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_SESSIONID_CACHE.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_SESSIONID_CACHE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSL_SESSIONID_CACHE 3 "May 31, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_SSL_SESSIONID_CACHE 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSL_SESSIONID_CACHE \- enable/disable use of the SSL session-ID cache
diff --git a/docs/libcurl/opts/CURLOPT_SSL_VERIFYHOST.3 b/docs/libcurl/opts/CURLOPT_SSL_VERIFYHOST.3
index 62fa589d..21905413 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_VERIFYHOST.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_VERIFYHOST.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSL_VERIFYHOST 3 "July 16, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_SSL_VERIFYHOST 3 "July 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSL_VERIFYHOST \- verify the certificate's name against host
diff --git a/docs/libcurl/opts/CURLOPT_SSL_VERIFYPEER.3 b/docs/libcurl/opts/CURLOPT_SSL_VERIFYPEER.3
index 3c29ee7d..47d5a26b 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_VERIFYPEER.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_VERIFYPEER.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSL_VERIFYPEER 3 "June 24, 2018" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_SSL_VERIFYPEER 3 "June 24, 2018" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSL_VERIFYPEER \- verify the peer's SSL certificate
diff --git a/docs/libcurl/opts/CURLOPT_SSL_VERIFYSTATUS.3 b/docs/libcurl/opts/CURLOPT_SSL_VERIFYSTATUS.3
index ddb2ccb8..fcbfe6fd 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_VERIFYSTATUS.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_VERIFYSTATUS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSL_VERIFYSTATUS 3 "October 09, 2018" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_SSL_VERIFYSTATUS 3 "October 09, 2018" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSL_VERIFYSTATUS \- verify the certificate's status
diff --git a/docs/libcurl/opts/CURLOPT_STDERR.3 b/docs/libcurl/opts/CURLOPT_STDERR.3
index 93ecaae0..ce20f2da 100644
--- a/docs/libcurl/opts/CURLOPT_STDERR.3
+++ b/docs/libcurl/opts/CURLOPT_STDERR.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_STDERR 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_STDERR 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_STDERR \- redirect stderr to another stream
@@ -41,7 +41,7 @@ All
CURL *curl = curl_easy_init();
FILE *filep = fopen("dump", "wb");
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
curl_easy_setopt(curl, CURLOPT_STDERR, filep);
curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLOPT_STREAM_DEPENDS.3 b/docs/libcurl/opts/CURLOPT_STREAM_DEPENDS.3
index 3e5b7e06..38da9c83 100644
--- a/docs/libcurl/opts/CURLOPT_STREAM_DEPENDS.3
+++ b/docs/libcurl/opts/CURLOPT_STREAM_DEPENDS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_STREAM_DEPENDS 3 "May 31, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_STREAM_DEPENDS 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_STREAM_DEPENDS \- set stream this transfer depends on
diff --git a/docs/libcurl/opts/CURLOPT_STREAM_DEPENDS_E.3 b/docs/libcurl/opts/CURLOPT_STREAM_DEPENDS_E.3
index 832de2df..f472a75f 100644
--- a/docs/libcurl/opts/CURLOPT_STREAM_DEPENDS_E.3
+++ b/docs/libcurl/opts/CURLOPT_STREAM_DEPENDS_E.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_STREAM_DEPENDS_E 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_STREAM_DEPENDS_E 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_STREAM_DEPENDS_E \- set stream this transfer depends on exclusively
diff --git a/docs/libcurl/opts/CURLOPT_STREAM_WEIGHT.3 b/docs/libcurl/opts/CURLOPT_STREAM_WEIGHT.3
index d405753a..c063050f 100644
--- a/docs/libcurl/opts/CURLOPT_STREAM_WEIGHT.3
+++ b/docs/libcurl/opts/CURLOPT_STREAM_WEIGHT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_STREAM_WEIGHT 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_STREAM_WEIGHT 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_STREAM_WEIGHT \- set numerical stream weight
diff --git a/docs/libcurl/opts/CURLOPT_SUPPRESS_CONNECT_HEADERS.3 b/docs/libcurl/opts/CURLOPT_SUPPRESS_CONNECT_HEADERS.3
index 41d7a304..e23b5574 100644
--- a/docs/libcurl/opts/CURLOPT_SUPPRESS_CONNECT_HEADERS.3
+++ b/docs/libcurl/opts/CURLOPT_SUPPRESS_CONNECT_HEADERS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SUPPRESS_CONNECT_HEADERS 3 "April 28, 2016" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_SUPPRESS_CONNECT_HEADERS 3 "April 28, 2016" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SUPPRESS_CONNECT_HEADERS \- Suppress proxy CONNECT response headers from user callbacks
diff --git a/docs/libcurl/opts/CURLOPT_TCP_FASTOPEN.3 b/docs/libcurl/opts/CURLOPT_TCP_FASTOPEN.3
index 8873c058..1a39db2d 100644
--- a/docs/libcurl/opts/CURLOPT_TCP_FASTOPEN.3
+++ b/docs/libcurl/opts/CURLOPT_TCP_FASTOPEN.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TCP_FASTOPEN 3 "May 15, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_TCP_FASTOPEN 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TCP_FASTOPEN \- enable TCP Fast Open
@@ -42,7 +42,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
curl_easy_setopt(curl, CURLOPT_TCP_FASTOPEN, 1L);
curl_easy_perform(curl);
}
diff --git a/docs/libcurl/opts/CURLOPT_TCP_KEEPALIVE.3 b/docs/libcurl/opts/CURLOPT_TCP_KEEPALIVE.3
index 5b9c06a7..3a4a69ed 100644
--- a/docs/libcurl/opts/CURLOPT_TCP_KEEPALIVE.3
+++ b/docs/libcurl/opts/CURLOPT_TCP_KEEPALIVE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TCP_KEEPALIVE 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_TCP_KEEPALIVE 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TCP_KEEPALIVE \- enable TCP keep-alive probing
@@ -42,7 +42,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* enable TCP keep-alive for this transfer */
curl_easy_setopt(curl, CURLOPT_TCP_KEEPALIVE, 1L);
diff --git a/docs/libcurl/opts/CURLOPT_TCP_KEEPIDLE.3 b/docs/libcurl/opts/CURLOPT_TCP_KEEPIDLE.3
index e9513649..26bb554e 100644
--- a/docs/libcurl/opts/CURLOPT_TCP_KEEPIDLE.3
+++ b/docs/libcurl/opts/CURLOPT_TCP_KEEPIDLE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TCP_KEEPIDLE 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_TCP_KEEPIDLE 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TCP_KEEPIDLE \- set TCP keep-alive idle time wait
@@ -40,7 +40,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* enable TCP keep-alive for this transfer */
curl_easy_setopt(curl, CURLOPT_TCP_KEEPALIVE, 1L);
diff --git a/docs/libcurl/opts/CURLOPT_TCP_KEEPINTVL.3 b/docs/libcurl/opts/CURLOPT_TCP_KEEPINTVL.3
index 94bef72a..b4d2c6f1 100644
--- a/docs/libcurl/opts/CURLOPT_TCP_KEEPINTVL.3
+++ b/docs/libcurl/opts/CURLOPT_TCP_KEEPINTVL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TCP_KEEPINTVL 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_TCP_KEEPINTVL 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TCP_KEEPINTVL \- set TCP keep-alive interval
@@ -40,7 +40,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* enable TCP keep-alive for this transfer */
curl_easy_setopt(curl, CURLOPT_TCP_KEEPALIVE, 1L);
diff --git a/docs/libcurl/opts/CURLOPT_TCP_NODELAY.3 b/docs/libcurl/opts/CURLOPT_TCP_NODELAY.3
index 143da130..53a41d72 100644
--- a/docs/libcurl/opts/CURLOPT_TCP_NODELAY.3
+++ b/docs/libcurl/opts/CURLOPT_TCP_NODELAY.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TCP_NODELAY 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_TCP_NODELAY 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TCP_NODELAY \- set the TCP_NODELAY option
@@ -51,7 +51,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* disable Nagle */
curl_easy_setopt(curl, CURLOPT_TCP_NODELAY, 0);
curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLOPT_TELNETOPTIONS.3 b/docs/libcurl/opts/CURLOPT_TELNETOPTIONS.3
index 0d599b12..913a5f3d 100644
--- a/docs/libcurl/opts/CURLOPT_TELNETOPTIONS.3
+++ b/docs/libcurl/opts/CURLOPT_TELNETOPTIONS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TELNETOPTIONS 3 "May 31, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_TELNETOPTIONS 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TELNETOPTIONS \- custom telnet options
diff --git a/docs/libcurl/opts/CURLOPT_TFTP_BLKSIZE.3 b/docs/libcurl/opts/CURLOPT_TFTP_BLKSIZE.3
index 2bf7a961..55bd09dd 100644
--- a/docs/libcurl/opts/CURLOPT_TFTP_BLKSIZE.3
+++ b/docs/libcurl/opts/CURLOPT_TFTP_BLKSIZE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TFTP_BLKSIZE 3 "May 31, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_TFTP_BLKSIZE 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TFTP_BLKSIZE \- TFTP block size
diff --git a/docs/libcurl/opts/CURLOPT_TFTP_NO_OPTIONS.3 b/docs/libcurl/opts/CURLOPT_TFTP_NO_OPTIONS.3
index 2051fb85..9d9ab50b 100644
--- a/docs/libcurl/opts/CURLOPT_TFTP_NO_OPTIONS.3
+++ b/docs/libcurl/opts/CURLOPT_TFTP_NO_OPTIONS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TFTP_NO_OPTIONS 3 "April 06, 2016" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_TFTP_NO_OPTIONS 3 "April 06, 2016" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TFTP_NO_OPTIONS \- Do not send TFTP options requests.
diff --git a/docs/libcurl/opts/CURLOPT_TIMECONDITION.3 b/docs/libcurl/opts/CURLOPT_TIMECONDITION.3
index a5e6ae3b..00e9432a 100644
--- a/docs/libcurl/opts/CURLOPT_TIMECONDITION.3
+++ b/docs/libcurl/opts/CURLOPT_TIMECONDITION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TIMECONDITION 3 "April 03, 2016" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_TIMECONDITION 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TIMECONDITION \- select condition for a time request
@@ -46,7 +46,7 @@ HTTP, FTP, RTSP, and FILE
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* January 1, 2020 is 1577833200 */
curl_easy_setopt(curl, CURLOPT_TIMEVALUE, 1577833200L);
diff --git a/docs/libcurl/opts/CURLOPT_TIMEOUT.3 b/docs/libcurl/opts/CURLOPT_TIMEOUT.3
index 1f22d30c..19d57497 100644
--- a/docs/libcurl/opts/CURLOPT_TIMEOUT.3
+++ b/docs/libcurl/opts/CURLOPT_TIMEOUT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TIMEOUT 3 "October 15, 2019" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_TIMEOUT 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TIMEOUT \- set maximum time the request is allowed to take
@@ -55,7 +55,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* complete within 20 seconds */
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 20L);
diff --git a/docs/libcurl/opts/CURLOPT_TIMEOUT_MS.3 b/docs/libcurl/opts/CURLOPT_TIMEOUT_MS.3
index b36ffe95..103692b1 100644
--- a/docs/libcurl/opts/CURLOPT_TIMEOUT_MS.3
+++ b/docs/libcurl/opts/CURLOPT_TIMEOUT_MS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TIMEOUT_MS 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_TIMEOUT_MS 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TIMEOUT_MS \- set maximum time the request is allowed to take
@@ -58,7 +58,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* complete within 20000 milliseconds */
curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, 20000L);
diff --git a/docs/libcurl/opts/CURLOPT_TIMEVALUE.3 b/docs/libcurl/opts/CURLOPT_TIMEVALUE.3
index 814ebc6e..b352f671 100644
--- a/docs/libcurl/opts/CURLOPT_TIMEVALUE.3
+++ b/docs/libcurl/opts/CURLOPT_TIMEVALUE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TIMEVALUE 3 "January 25, 2018" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_TIMEVALUE 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TIMEVALUE \- set time value for conditional
@@ -43,7 +43,7 @@ HTTP, FTP, RTSP, and FILE
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* January 1, 2020 is 1577833200 */
curl_easy_setopt(curl, CURLOPT_TIMEVALUE, 1577833200L);
diff --git a/docs/libcurl/opts/CURLOPT_TIMEVALUE_LARGE.3 b/docs/libcurl/opts/CURLOPT_TIMEVALUE_LARGE.3
index 0413c068..4ebfb017 100644
--- a/docs/libcurl/opts/CURLOPT_TIMEVALUE_LARGE.3
+++ b/docs/libcurl/opts/CURLOPT_TIMEVALUE_LARGE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TIMEVALUE_LARGE 3 "January 25, 2018" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_TIMEVALUE_LARGE 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TIMEVALUE_LARGE \- set time value for conditional
@@ -44,7 +44,7 @@ HTTP, FTP, RTSP, and FILE
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* January 1, 2020 is 1577833200 */
curl_easy_setopt(curl, CURLOPT_TIMEVALUE_LARGE, (curl_off_t)1577833200);
diff --git a/docs/libcurl/opts/CURLOPT_TLS13_CIPHERS.3 b/docs/libcurl/opts/CURLOPT_TLS13_CIPHERS.3
index 42ddcc37..abd767b4 100644
--- a/docs/libcurl/opts/CURLOPT_TLS13_CIPHERS.3
+++ b/docs/libcurl/opts/CURLOPT_TLS13_CIPHERS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TLS13_CIPHERS 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_TLS13_CIPHERS 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TLS13_CIPHERS \- specify ciphers suites to use for TLS 1.3
diff --git a/docs/libcurl/opts/CURLOPT_TLSAUTH_PASSWORD.3 b/docs/libcurl/opts/CURLOPT_TLSAUTH_PASSWORD.3
index 9473cbe8..7b9a97cc 100644
--- a/docs/libcurl/opts/CURLOPT_TLSAUTH_PASSWORD.3
+++ b/docs/libcurl/opts/CURLOPT_TLSAUTH_PASSWORD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TLSAUTH_PASSWORD 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_TLSAUTH_PASSWORD 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TLSAUTH_PASSWORD \- password to use for TLS authentication
diff --git a/docs/libcurl/opts/CURLOPT_TLSAUTH_TYPE.3 b/docs/libcurl/opts/CURLOPT_TLSAUTH_TYPE.3
index d7bf7ed8..e52efb45 100644
--- a/docs/libcurl/opts/CURLOPT_TLSAUTH_TYPE.3
+++ b/docs/libcurl/opts/CURLOPT_TLSAUTH_TYPE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TLSAUTH_TYPE 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_TLSAUTH_TYPE 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TLSAUTH_TYPE \- set TLS authentication methods
diff --git a/docs/libcurl/opts/CURLOPT_TLSAUTH_USERNAME.3 b/docs/libcurl/opts/CURLOPT_TLSAUTH_USERNAME.3
index 3d94aad1..ceecec0e 100644
--- a/docs/libcurl/opts/CURLOPT_TLSAUTH_USERNAME.3
+++ b/docs/libcurl/opts/CURLOPT_TLSAUTH_USERNAME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TLSAUTH_USERNAME 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_TLSAUTH_USERNAME 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TLSAUTH_USERNAME \- user name to use for TLS authentication
diff --git a/docs/libcurl/opts/CURLOPT_TRAILERDATA.3 b/docs/libcurl/opts/CURLOPT_TRAILERDATA.3
index 23f20871..d5133d7b 100644
--- a/docs/libcurl/opts/CURLOPT_TRAILERDATA.3
+++ b/docs/libcurl/opts/CURLOPT_TRAILERDATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TRAILERDATA 3 "October 31, 2019" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_TRAILERDATA 3 "October 31, 2019" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TRAILERDATA \- Custom pointer passed to the trailing headers callback
diff --git a/docs/libcurl/opts/CURLOPT_TRAILERFUNCTION.3 b/docs/libcurl/opts/CURLOPT_TRAILERFUNCTION.3
index 7f986208..42bcc163 100644
--- a/docs/libcurl/opts/CURLOPT_TRAILERFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_TRAILERFUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TRAILERFUNCTION 3 "October 31, 2019" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_TRAILERFUNCTION 3 "October 03, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TRAILERFUNCTION \- Set callback for sending trailing headers
@@ -74,7 +74,7 @@ static int trailer_cb(struct curl_slist **tr, void *data)
CURL *curl = curl_easy_init();
if(curl) {
/* Set the URL of the request */
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
/* Now set it as a put */
curl_easy_setopt(curl, CURLOPT_PUT, 1L);
@@ -83,7 +83,7 @@ if(curl) {
curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_cb);
struct curl_slist *headers = NULL;
- headers = curl_slist_append(headers, "Trailer: My-super-awsome-trailer");
+ headers = curl_slist_append(headers, "Trailer: My-super-awesome-trailer");
res = curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
/* Set the trailers filling callback */
diff --git a/docs/libcurl/opts/CURLOPT_TRANSFERTEXT.3 b/docs/libcurl/opts/CURLOPT_TRANSFERTEXT.3
index 28891477..cb59cb7e 100644
--- a/docs/libcurl/opts/CURLOPT_TRANSFERTEXT.3
+++ b/docs/libcurl/opts/CURLOPT_TRANSFERTEXT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TRANSFERTEXT 3 "May 31, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_TRANSFERTEXT 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TRANSFERTEXT \- request a text based transfer for FTP
diff --git a/docs/libcurl/opts/CURLOPT_TRANSFER_ENCODING.3 b/docs/libcurl/opts/CURLOPT_TRANSFER_ENCODING.3
index afe7ff96..c3cc93f8 100644
--- a/docs/libcurl/opts/CURLOPT_TRANSFER_ENCODING.3
+++ b/docs/libcurl/opts/CURLOPT_TRANSFER_ENCODING.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TRANSFER_ENCODING 3 "May 15, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_TRANSFER_ENCODING 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TRANSFER_ENCODING \- ask for HTTP Transfer Encoding
@@ -49,7 +49,7 @@ HTTP
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
curl_easy_setopt(curl, CURLOPT_TRANSFER_ENCODING, 1L);
curl_easy_perform(curl);
}
diff --git a/docs/libcurl/opts/CURLOPT_UNIX_SOCKET_PATH.3 b/docs/libcurl/opts/CURLOPT_UNIX_SOCKET_PATH.3
index 20c47be4..fa6544ff 100644
--- a/docs/libcurl/opts/CURLOPT_UNIX_SOCKET_PATH.3
+++ b/docs/libcurl/opts/CURLOPT_UNIX_SOCKET_PATH.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_UNIX_SOCKET_PATH 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_UNIX_SOCKET_PATH 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_UNIX_SOCKET_PATH \- set Unix domain socket
diff --git a/docs/libcurl/opts/CURLOPT_UNRESTRICTED_AUTH.3 b/docs/libcurl/opts/CURLOPT_UNRESTRICTED_AUTH.3
index bc08637f..92fede0a 100644
--- a/docs/libcurl/opts/CURLOPT_UNRESTRICTED_AUTH.3
+++ b/docs/libcurl/opts/CURLOPT_UNRESTRICTED_AUTH.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_UNRESTRICTED_AUTH 3 "May 15, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_UNRESTRICTED_AUTH 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_UNRESTRICTED_AUTH \- send credentials to other hosts too
@@ -47,7 +47,7 @@ HTTP
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
curl_easy_setopt(curl, CURLOPT_UNRESTRICTED_AUTH, 1L);
curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLOPT_UPLOAD.3 b/docs/libcurl/opts/CURLOPT_UPLOAD.3
index 54dff9f5..668ee89c 100644
--- a/docs/libcurl/opts/CURLOPT_UPLOAD.3
+++ b/docs/libcurl/opts/CURLOPT_UPLOAD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_UPLOAD 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_UPLOAD 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_UPLOAD \- enable data upload
diff --git a/docs/libcurl/opts/CURLOPT_UPLOAD_BUFFERSIZE.3 b/docs/libcurl/opts/CURLOPT_UPLOAD_BUFFERSIZE.3
index 3cf81d07..184b12b7 100644
--- a/docs/libcurl/opts/CURLOPT_UPLOAD_BUFFERSIZE.3
+++ b/docs/libcurl/opts/CURLOPT_UPLOAD_BUFFERSIZE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_UPLOAD_BUFFERSIZE 3 "August 18, 2018" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_UPLOAD_BUFFERSIZE 3 "August 18, 2018" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_UPLOAD_BUFFERSIZE \- set preferred upload buffer size
diff --git a/docs/libcurl/opts/CURLOPT_URL.3 b/docs/libcurl/opts/CURLOPT_URL.3
index c5eef781..bb2916d9 100644
--- a/docs/libcurl/opts/CURLOPT_URL.3
+++ b/docs/libcurl/opts/CURLOPT_URL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_URL 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_URL 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_URL \- provide the URL to use in the request
@@ -340,7 +340,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
curl_easy_perform(curl);
}
diff --git a/docs/libcurl/opts/CURLOPT_USERAGENT.3 b/docs/libcurl/opts/CURLOPT_USERAGENT.3
index b943ba24..06bf2a22 100644
--- a/docs/libcurl/opts/CURLOPT_USERAGENT.3
+++ b/docs/libcurl/opts/CURLOPT_USERAGENT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_USERAGENT 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_USERAGENT 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_USERAGENT \- set HTTP user-agent header
@@ -44,7 +44,7 @@ HTTP, HTTPS
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
curl_easy_setopt(curl, CURLOPT_USERAGENT, "Dark Secret Ninja/1.0");
diff --git a/docs/libcurl/opts/CURLOPT_USERNAME.3 b/docs/libcurl/opts/CURLOPT_USERNAME.3
index 8ae3af34..89497e76 100644
--- a/docs/libcurl/opts/CURLOPT_USERNAME.3
+++ b/docs/libcurl/opts/CURLOPT_USERNAME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_USERNAME 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_USERNAME 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_USERNAME \- user name to use in authentication
@@ -67,7 +67,7 @@ Most
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
curl_easy_setopt(curl, CURLOPT_USERNAME, "clark");
diff --git a/docs/libcurl/opts/CURLOPT_USERPWD.3 b/docs/libcurl/opts/CURLOPT_USERPWD.3
index 193a9d29..2706bbf6 100644
--- a/docs/libcurl/opts/CURLOPT_USERPWD.3
+++ b/docs/libcurl/opts/CURLOPT_USERPWD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_USERPWD 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_USERPWD 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_USERPWD \- user name and password to use in authentication
@@ -73,7 +73,7 @@ Most
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
curl_easy_setopt(curl, CURLOPT_USERPWD, "clark:kent");
diff --git a/docs/libcurl/opts/CURLOPT_USE_SSL.3 b/docs/libcurl/opts/CURLOPT_USE_SSL.3
index d05c8a30..8382a37f 100644
--- a/docs/libcurl/opts/CURLOPT_USE_SSL.3
+++ b/docs/libcurl/opts/CURLOPT_USE_SSL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_USE_SSL 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_USE_SSL 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_USE_SSL \- request using SSL / TLS for the transfer
diff --git a/docs/libcurl/opts/CURLOPT_VERBOSE.3 b/docs/libcurl/opts/CURLOPT_VERBOSE.3
index 1757ed6d..8b307c17 100644
--- a/docs/libcurl/opts/CURLOPT_VERBOSE.3
+++ b/docs/libcurl/opts/CURLOPT_VERBOSE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_VERBOSE 3 "December 04, 2019" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_VERBOSE 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_VERBOSE \- set verbose mode on/off
@@ -47,7 +47,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* ask libcurl to show us the verbose output */
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
diff --git a/docs/libcurl/opts/CURLOPT_WILDCARDMATCH.3 b/docs/libcurl/opts/CURLOPT_WILDCARDMATCH.3
index afde1c26..b90fca6a 100644
--- a/docs/libcurl/opts/CURLOPT_WILDCARDMATCH.3
+++ b/docs/libcurl/opts/CURLOPT_WILDCARDMATCH.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_WILDCARDMATCH 3 "May 18, 2018" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_WILDCARDMATCH 3 "May 18, 2018" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_WILDCARDMATCH \- enable directory wildcard transfers
diff --git a/docs/libcurl/opts/CURLOPT_WRITEDATA.3 b/docs/libcurl/opts/CURLOPT_WRITEDATA.3
index 80aae467..f6b6764d 100644
--- a/docs/libcurl/opts/CURLOPT_WRITEDATA.3
+++ b/docs/libcurl/opts/CURLOPT_WRITEDATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_WRITEDATA 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_WRITEDATA 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_WRITEDATA \- custom pointer passed to the write callback
diff --git a/docs/libcurl/opts/CURLOPT_WRITEFUNCTION.3 b/docs/libcurl/opts/CURLOPT_WRITEFUNCTION.3
index 4d433ac0..3156c8f7 100644
--- a/docs/libcurl/opts/CURLOPT_WRITEFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_WRITEFUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_WRITEFUNCTION 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_WRITEFUNCTION 3 "August 24, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_WRITEFUNCTION \- set callback for writing received data
@@ -77,7 +77,7 @@ Support for the CURL_WRITEFUNC_PAUSE return code was added in version 7.18.0.
.SH RETURN VALUE
This will return CURLE_OK.
.SH EXAMPLE
-.NF
+.nf
struct memory {
char *response;
size_t size;
@@ -107,7 +107,7 @@ This will return CURLE_OK.
/* we pass our 'chunk' struct to the callback function */
curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&chunk);
-.FI
+.fi
.SH "SEE ALSO"
.BR CURLOPT_WRITEDATA "(3), " CURLOPT_READFUNCTION "(3), "
.BR CURLOPT_HEADERFUNCTION "(3), "
diff --git a/docs/libcurl/opts/CURLOPT_XFERINFODATA.3 b/docs/libcurl/opts/CURLOPT_XFERINFODATA.3
index 126bcfaf..16789321 100644
--- a/docs/libcurl/opts/CURLOPT_XFERINFODATA.3
+++ b/docs/libcurl/opts/CURLOPT_XFERINFODATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_XFERINFODATA 3 "October 09, 2017" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_XFERINFODATA 3 "October 09, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_XFERINFODATA \- custom pointer passed to the progress callback
diff --git a/docs/libcurl/opts/CURLOPT_XFERINFOFUNCTION.3 b/docs/libcurl/opts/CURLOPT_XFERINFOFUNCTION.3
index 4149a8e0..0deb566d 100644
--- a/docs/libcurl/opts/CURLOPT_XFERINFOFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_XFERINFOFUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_XFERINFOFUNCTION 3 "March 23, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_XFERINFOFUNCTION 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_XFERINFOFUNCTION \- callback to progress meter function
diff --git a/docs/libcurl/opts/CURLOPT_XOAUTH2_BEARER.3 b/docs/libcurl/opts/CURLOPT_XOAUTH2_BEARER.3
index 70b8f126..bbdfb9f0 100644
--- a/docs/libcurl/opts/CURLOPT_XOAUTH2_BEARER.3
+++ b/docs/libcurl/opts/CURLOPT_XOAUTH2_BEARER.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_XOAUTH2_BEARER 3 "June 25, 2020" "libcurl 7.72.0" "curl_easy_setopt options"
+.TH CURLOPT_XOAUTH2_BEARER 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_XOAUTH2_BEARER \- specify OAuth 2.0 access token
diff --git a/docs/libcurl/opts/Makefile.inc b/docs/libcurl/opts/Makefile.inc
index 8708f32e..fe417757 100644
--- a/docs/libcurl/opts/Makefile.inc
+++ b/docs/libcurl/opts/Makefile.inc
@@ -57,8 +57,9 @@ man_MANS = \
CURLINFO_PRIMARY_PORT.3 \
CURLINFO_PRIVATE.3 \
CURLINFO_PROTOCOL.3 \
- CURLINFO_PROXYAUTH_AVAIL.3 \
+ CURLINFO_PROXY_ERROR.3 \
CURLINFO_PROXY_SSL_VERIFYRESULT.3 \
+ CURLINFO_PROXYAUTH_AVAIL.3 \
CURLINFO_REDIRECT_COUNT.3 \
CURLINFO_REDIRECT_TIME.3 \
CURLINFO_REDIRECT_TIME_T.3 \
@@ -330,6 +331,7 @@ man_MANS = \
CURLOPT_SSL_CIPHER_LIST.3 \
CURLOPT_SSL_CTX_DATA.3 \
CURLOPT_SSL_CTX_FUNCTION.3 \
+ CURLOPT_SSL_EC_CURVES.3 \
CURLOPT_SSL_ENABLE_ALPN.3 \
CURLOPT_SSL_ENABLE_NPN.3 \
CURLOPT_SSL_FALSESTART.3 \
diff --git a/docs/libcurl/symbols-in-versions b/docs/libcurl/symbols-in-versions
index c0cdbdc0..74b95509 100644
--- a/docs/libcurl/symbols-in-versions
+++ b/docs/libcurl/symbols-in-versions
@@ -105,6 +105,7 @@ CURLE_OPERATION_TIMEOUTED 7.1 7.17.0
CURLE_OUT_OF_MEMORY 7.1
CURLE_PARTIAL_FILE 7.1
CURLE_PEER_FAILED_VERIFICATION 7.17.1
+CURLE_PROXY 7.73.0
CURLE_QUIC_CONNECT_ERROR 7.69.0
CURLE_QUOTE_ERROR 7.17.0
CURLE_RANGE_ERROR 7.17.0
@@ -261,6 +262,7 @@ CURLINFO_PRIMARY_PORT 7.21.0
CURLINFO_PRIVATE 7.10.3
CURLINFO_PROTOCOL 7.52.0
CURLINFO_PROXYAUTH_AVAIL 7.10.8
+CURLINFO_PROXY_ERROR 7.73.0
CURLINFO_PROXY_SSL_VERIFYRESULT 7.52.0
CURLINFO_PTR 7.54.1
CURLINFO_REDIRECT_COUNT 7.9.7
@@ -309,6 +311,7 @@ CURLKHMATCH_OK 7.19.6
CURLKHSTAT_DEFER 7.19.6
CURLKHSTAT_FINE 7.19.6
CURLKHSTAT_FINE_ADD_TO_FILE 7.19.6
+CURLKHSTAT_FINE_REPLACE 7.73.0
CURLKHSTAT_REJECT 7.19.6
CURLKHTYPE_DSS 7.19.6
CURLKHTYPE_ECDSA 7.58.0
@@ -349,12 +352,14 @@ CURLM_UNKNOWN_OPTION 7.15.4
CURLM_WAKEUP_FAILURE 7.68.0
CURLOPT 7.69.0
CURLOPTTYPE_BLOB 7.71.0
+CURLOPTTYPE_CBPOINT 7.73.0
CURLOPTTYPE_FUNCTIONPOINT 7.1
CURLOPTTYPE_LONG 7.1
CURLOPTTYPE_OBJECTPOINT 7.1
CURLOPTTYPE_OFF_T 7.11.0
CURLOPTTYPE_SLISTPOINT 7.65.2
CURLOPTTYPE_STRINGPOINT 7.46.0
+CURLOPTTYPE_VALUES 7.73.0
CURLOPT_ABSTRACT_UNIX_SOCKET 7.53.0
CURLOPT_ACCEPTTIMEOUT_MS 7.24.0
CURLOPT_ACCEPT_ENCODING 7.21.6
@@ -517,8 +522,6 @@ CURLOPT_PROGRESSDATA 7.1
CURLOPT_PROGRESSFUNCTION 7.1 7.32.0
CURLOPT_PROTOCOLS 7.19.4
CURLOPT_PROXY 7.1
-CURLOPT_PROXY_ISSUERCERT 7.71.0
-CURLOPT_PROXY_ISSUERCERT_BLOB 7.71.0
CURLOPT_PROXYAUTH 7.10.7
CURLOPT_PROXYHEADER 7.37.0
CURLOPT_PROXYPASSWORD 7.19.1
@@ -529,15 +532,17 @@ CURLOPT_PROXYUSERPWD 7.1
CURLOPT_PROXY_CAINFO 7.52.0
CURLOPT_PROXY_CAPATH 7.52.0
CURLOPT_PROXY_CRLFILE 7.52.0
+CURLOPT_PROXY_ISSUERCERT 7.71.0
+CURLOPT_PROXY_ISSUERCERT_BLOB 7.71.0
CURLOPT_PROXY_KEYPASSWD 7.52.0
CURLOPT_PROXY_PINNEDPUBLICKEY 7.52.0
CURLOPT_PROXY_SERVICE_NAME 7.43.0
CURLOPT_PROXY_SSLCERT 7.52.0
-CURLOPT_PROXY_SSLCERT_BLOB 7.71.0
CURLOPT_PROXY_SSLCERTTYPE 7.52.0
+CURLOPT_PROXY_SSLCERT_BLOB 7.71.0
CURLOPT_PROXY_SSLKEY 7.52.0
-CURLOPT_PROXY_SSLKEY_BLOB 7.71.0
CURLOPT_PROXY_SSLKEYTYPE 7.52.0
+CURLOPT_PROXY_SSLKEY_BLOB 7.71.0
CURLOPT_PROXY_SSLVERSION 7.52.0
CURLOPT_PROXY_SSL_CIPHER_LIST 7.52.0
CURLOPT_PROXY_SSL_OPTIONS 7.52.0
@@ -598,19 +603,20 @@ CURLOPT_SSH_KNOWNHOSTS 7.19.6
CURLOPT_SSH_PRIVATE_KEYFILE 7.16.1
CURLOPT_SSH_PUBLIC_KEYFILE 7.16.1
CURLOPT_SSLCERT 7.1
-CURLOPT_SSLCERT_BLOB 7.71.0
CURLOPT_SSLCERTPASSWD 7.1.1 7.17.0
CURLOPT_SSLCERTTYPE 7.9.3
+CURLOPT_SSLCERT_BLOB 7.71.0
CURLOPT_SSLENGINE 7.9.3
CURLOPT_SSLENGINE_DEFAULT 7.9.3
CURLOPT_SSLKEY 7.9.3
-CURLOPT_SSLKEY_BLOB 7.71.0
CURLOPT_SSLKEYPASSWD 7.9.3 7.17.0
CURLOPT_SSLKEYTYPE 7.9.3
+CURLOPT_SSLKEY_BLOB 7.71.0
CURLOPT_SSLVERSION 7.1
CURLOPT_SSL_CIPHER_LIST 7.9
CURLOPT_SSL_CTX_DATA 7.10.6
CURLOPT_SSL_CTX_FUNCTION 7.10.6
+CURLOPT_SSL_EC_CURVES 7.73.0
CURLOPT_SSL_ENABLE_ALPN 7.36.0
CURLOPT_SSL_ENABLE_NPN 7.36.0
CURLOPT_SSL_FALSESTART 7.42.0
@@ -664,6 +670,15 @@ CURLOPT_WRITEINFO 7.1
CURLOPT_XFERINFODATA 7.32.0
CURLOPT_XFERINFOFUNCTION 7.32.0
CURLOPT_XOAUTH2_BEARER 7.33.0
+CURLOT_BLOB 7.73.0
+CURLOT_CBPTR 7.73.0
+CURLOT_FUNCTION 7.73.0
+CURLOT_LONG 7.73.0
+CURLOT_OBJECT 7.73.0
+CURLOT_OFF_T 7.73.0
+CURLOT_SLIST 7.73.0
+CURLOT_STRING 7.73.0
+CURLOT_VALUES 7.73.0
CURLPAUSE_ALL 7.18.0
CURLPAUSE_CONT 7.18.0
CURLPAUSE_RECV 7.18.0
@@ -710,6 +725,40 @@ CURLPROXY_SOCKS4 7.10
CURLPROXY_SOCKS4A 7.18.0
CURLPROXY_SOCKS5 7.10
CURLPROXY_SOCKS5_HOSTNAME 7.18.0
+CURLPX_BAD_ADDRESS_TYPE 7.73.0
+CURLPX_BAD_VERSION 7.73.0
+CURLPX_CLOSED 7.73.0
+CURLPX_GSSAPI 7.73.0
+CURLPX_GSSAPI_PERMSG 7.73.0
+CURLPX_GSSAPI_PROTECTION 7.73.0
+CURLPX_IDENTD 7.73.0
+CURLPX_IDENTD_DIFFER 7.73.0
+CURLPX_LONG_HOSTNAME 7.73.0
+CURLPX_LONG_PASSWD 7.73.0
+CURLPX_LONG_USER 7.73.0
+CURLPX_NO_AUTH 7.73.0
+CURLPX_OK 7.73.0
+CURLPX_RECV_ADDRESS 7.73.0
+CURLPX_RECV_AUTH 7.73.0
+CURLPX_RECV_CONNECT 7.73.0
+CURLPX_RECV_REQACK 7.73.0
+CURLPX_REPLY_ADDRESS_TYPE_NOT_SUPPORTED 7.73.0
+CURLPX_REPLY_COMMAND_NOT_SUPPORTED 7.73.0
+CURLPX_REPLY_CONNECTION_REFUSED 7.73.0
+CURLPX_REPLY_GENERAL_SERVER_FAILURE 7.73.0
+CURLPX_REPLY_HOST_UNREACHABLE 7.73.0
+CURLPX_REPLY_NETWORK_UNREACHABLE 7.73.0
+CURLPX_REPLY_NOT_ALLOWED 7.73.0
+CURLPX_REPLY_TTL_EXPIRED 7.73.0
+CURLPX_REPLY_UNASSIGNED 7.73.0
+CURLPX_REQUEST_FAILED 7.73.0
+CURLPX_RESOLVE_HOST 7.73.0
+CURLPX_SEND_AUTH 7.73.0
+CURLPX_SEND_CONNECT 7.73.0
+CURLPX_SEND_REQUEST 7.73.0
+CURLPX_UNKNOWN_FAIL 7.73.0
+CURLPX_UNKNOWN_MODE 7.73.0
+CURLPX_USER_REJECTED 7.73.0
CURLSHE_BAD_OPTION 7.10.3
CURLSHE_INVALID 7.10.3
CURLSHE_IN_USE 7.10.3
@@ -755,9 +804,9 @@ CURLSSLOPT_ALLOW_BEAST 7.25.0
CURLSSLOPT_NATIVE_CA 7.71.0
CURLSSLOPT_NO_PARTIALCHAIN 7.68.0
CURLSSLOPT_NO_REVOKE 7.44.0
+CURLSSLOPT_REVOKE_BEST_EFFORT 7.70.0
CURLSSLSET_NO_BACKENDS 7.56.0
CURLSSLSET_OK 7.56.0
-CURLSSLOPT_REVOKE_BEST_EFFORT 7.70.0
CURLSSLSET_TOO_LATE 7.56.0
CURLSSLSET_UNKNOWN_BACKEND 7.56.0
CURLUE_BAD_HANDLE 7.62.0
@@ -970,9 +1019,9 @@ CURL_VERSION_SPNEGO 7.10.8
CURL_VERSION_SSL 7.10
CURL_VERSION_SSPI 7.13.2
CURL_VERSION_TLSAUTH_SRP 7.21.4
+CURL_VERSION_UNICODE 7.72.0
CURL_VERSION_UNIX_SOCKETS 7.40.0
CURL_VERSION_ZSTD 7.72.0
-CURL_VERSION_UNICODE 7.72.0
CURL_WAIT_POLLIN 7.28.0
CURL_WAIT_POLLOUT 7.28.0
CURL_WAIT_POLLPRI 7.28.0
diff --git a/docs/options-in-versions b/docs/options-in-versions
index 1a27306a..68336323 100644
--- a/docs/options-in-versions
+++ b/docs/options-in-versions
@@ -32,6 +32,7 @@
--create-dirs 7.10.3
--crlf 5.7
--crlfile 7.19.7
+--curves 7.73.0
--data (-d) 4.0
--data-ascii 7.2
--data-binary 7.2
@@ -127,6 +128,7 @@
--ntlm-wb 7.22.0
--oauth2-bearer 7.33.0
--output (-o) 4.0
+--output-dir 7.73.0
--parallel (-Z) 7.66.0
--parallel-immediate 7.68.0
--parallel-max 7.66.0
diff --git a/include/Makefile.am b/include/Makefile.am
index e33aecc0..611ebdfa 100644
--- a/include/Makefile.am
+++ b/include/Makefile.am
@@ -21,6 +21,6 @@
###########################################################################
SUBDIRS = curl
-EXTRA_DIST = README
+EXTRA_DIST = README.md
AUTOMAKE_OPTIONS = foreign no-dependencies
diff --git a/include/README b/include/README
deleted file mode 100644
index 091ef76d..00000000
--- a/include/README
+++ /dev/null
@@ -1,18 +0,0 @@
- _ _ ____ _
- ___| | | | _ \| |
- / __| | | | |_) | |
- | (__| |_| | _ <| |___
- \___|\___/|_| \_\_____|
-
-Include files for libcurl, external users.
-
-They're all placed in the curl subdirectory here for better fit in any kind
-of environment. You must include files from here using...
-
- #include <curl/curl.h>
-
-... style and point the compiler's include path to the directory holding the
-curl subdirectory. It makes it more likely to survive future modifications.
-
-The public curl include files can be shared freely between different platforms
-and different architectures.
diff --git a/include/README.md b/include/README.md
new file mode 100644
index 00000000..bd28a30e
--- /dev/null
+++ b/include/README.md
@@ -0,0 +1,14 @@
+# include
+
+Public include files for libcurl, external users.
+
+They're all placed in the curl subdirectory here for better fit in any kind of
+environment. You must include files from here using...
+
+ #include <curl/curl.h>
+
+... style and point the compiler's include path to the directory holding the
+curl subdirectory. It makes it more likely to survive future modifications.
+
+The public curl include files can be shared freely between different platforms
+and different architectures.
diff --git a/include/curl/Makefile.am b/include/curl/Makefile.am
index a31f61b1..db96ace8 100644
--- a/include/curl/Makefile.am
+++ b/include/curl/Makefile.am
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -21,7 +21,7 @@
###########################################################################
pkginclude_HEADERS = \
curl.h curlver.h easy.h mprintf.h stdcheaders.h multi.h \
- typecheck-gcc.h system.h urlapi.h
+ typecheck-gcc.h system.h urlapi.h options.h
pkgincludedir= $(includedir)/curl
diff --git a/include/curl/curl.h b/include/curl/curl.h
index 5aeaca91..9026aa5c 100644
--- a/include/curl/curl.h
+++ b/include/curl/curl.h
@@ -610,6 +610,7 @@ typedef enum {
error */
CURLE_HTTP3, /* 95 - An HTTP/3 layer problem */
CURLE_QUIC_CONNECT_ERROR, /* 96 - QUIC connection error */
+ CURLE_PROXY, /* 97 - proxy handshake error */
CURL_LAST /* never use! */
} CURLcode;
@@ -689,6 +690,48 @@ typedef enum {
#endif /*!CURL_NO_OLDIES*/
+/*
+ * Proxy error codes. Returned in CURLINFO_PROXY_ERROR if CURLE_PROXY was
+ * return for the transfers.
+ */
+typedef enum {
+ CURLPX_OK,
+ CURLPX_BAD_ADDRESS_TYPE,
+ CURLPX_BAD_VERSION,
+ CURLPX_CLOSED,
+ CURLPX_GSSAPI,
+ CURLPX_GSSAPI_PERMSG,
+ CURLPX_GSSAPI_PROTECTION,
+ CURLPX_IDENTD,
+ CURLPX_IDENTD_DIFFER,
+ CURLPX_LONG_HOSTNAME,
+ CURLPX_LONG_PASSWD,
+ CURLPX_LONG_USER,
+ CURLPX_NO_AUTH,
+ CURLPX_RECV_ADDRESS,
+ CURLPX_RECV_AUTH,
+ CURLPX_RECV_CONNECT,
+ CURLPX_RECV_REQACK,
+ CURLPX_REPLY_ADDRESS_TYPE_NOT_SUPPORTED,
+ CURLPX_REPLY_COMMAND_NOT_SUPPORTED,
+ CURLPX_REPLY_CONNECTION_REFUSED,
+ CURLPX_REPLY_GENERAL_SERVER_FAILURE,
+ CURLPX_REPLY_HOST_UNREACHABLE,
+ CURLPX_REPLY_NETWORK_UNREACHABLE,
+ CURLPX_REPLY_NOT_ALLOWED,
+ CURLPX_REPLY_TTL_EXPIRED,
+ CURLPX_REPLY_UNASSIGNED,
+ CURLPX_REQUEST_FAILED,
+ CURLPX_RESOLVE_HOST,
+ CURLPX_SEND_AUTH,
+ CURLPX_SEND_CONNECT,
+ CURLPX_SEND_REQUEST,
+ CURLPX_UNKNOWN_FAIL,
+ CURLPX_UNKNOWN_MODE,
+ CURLPX_USER_REJECTED,
+ CURLPX_LAST /* never use */
+} CURLproxycode;
+
/* This prototype applies to all conversion callbacks */
typedef CURLcode (*curl_conv_callback)(char *buffer, size_t length);
@@ -789,6 +832,7 @@ enum curl_khstat {
CURLKHSTAT_DEFER, /* do not accept it, but we can't answer right now so
this causes a CURLE_DEFER error but otherwise the
connection will be left intact etc */
+ CURLKHSTAT_FINE_REPLACE, /* accept and replace the wrong key*/
CURLKHSTAT_LAST /* not for use, only a marker for last-in-list */
};
@@ -958,17 +1002,27 @@ typedef enum {
#define CURLOPT(na,t,nu) na = t + nu
-/* handy aliases that make no run-time difference */
-#define CURLOPTTYPE_STRINGPOINT CURLOPTTYPE_OBJECTPOINT
+/* CURLOPT aliases that make no run-time difference */
+
+/* 'char *' argument to a string with a trailing zero */
+#define CURLOPTTYPE_STRINGPOINT CURLOPTTYPE_OBJECTPOINT
+
+/* 'struct curl_slist *' argument */
#define CURLOPTTYPE_SLISTPOINT CURLOPTTYPE_OBJECTPOINT
+/* 'void *' argument passed untouched to callback */
+#define CURLOPTTYPE_CBPOINT CURLOPTTYPE_OBJECTPOINT
+
+/* 'long' argument with a set of values/bitmask */
+#define CURLOPTTYPE_VALUES CURLOPTTYPE_LONG
+
/*
* All CURLOPT_* values.
*/
typedef enum {
/* This is the FILE * or void * the regular output should be written to. */
- CURLOPT(CURLOPT_WRITEDATA, CURLOPTTYPE_OBJECTPOINT, 1),
+ CURLOPT(CURLOPT_WRITEDATA, CURLOPTTYPE_CBPOINT, 1),
/* The full URL to get/put */
CURLOPT(CURLOPT_URL, CURLOPTTYPE_STRINGPOINT, 2),
@@ -991,7 +1045,7 @@ typedef enum {
/* not used */
/* Specified file stream to upload from (use as input): */
- CURLOPT(CURLOPT_READDATA, CURLOPTTYPE_OBJECTPOINT, 9),
+ CURLOPT(CURLOPT_READDATA, CURLOPTTYPE_CBPOINT, 9),
/* Buffer to receive error messages in, must be at least CURL_ERROR_SIZE
* bytes big. */
@@ -1076,7 +1130,7 @@ typedef enum {
/* send FILE * or void * to store headers to, if you use a callback it
is simply passed to the callback unmodified */
- CURLOPT(CURLOPT_HEADERDATA, CURLOPTTYPE_OBJECTPOINT, 29),
+ CURLOPT(CURLOPT_HEADERDATA, CURLOPTTYPE_CBPOINT, 29),
/* point to a file to read the initial cookies from, also enables
"cookie awareness" */
@@ -1084,10 +1138,10 @@ typedef enum {
/* What version to specifically try to use.
See CURL_SSLVERSION defines below. */
- CURLOPT(CURLOPT_SSLVERSION, CURLOPTTYPE_LONG, 32),
+ CURLOPT(CURLOPT_SSLVERSION, CURLOPTTYPE_VALUES, 32),
/* What kind of HTTP time condition to use, see defines */
- CURLOPT(CURLOPT_TIMECONDITION, CURLOPTTYPE_LONG, 33),
+ CURLOPT(CURLOPT_TIMECONDITION, CURLOPTTYPE_VALUES, 33),
/* Time to use with the above condition. Specified in number of seconds
since 1 Jan 1970 */
@@ -1141,7 +1195,7 @@ typedef enum {
/* Specify whether to read the user+password from the .netrc or the URL.
* This must be one of the CURL_NETRC_* enums below. */
- CURLOPT(CURLOPT_NETRC, CURLOPTTYPE_LONG, 51),
+ CURLOPT(CURLOPT_NETRC, CURLOPTTYPE_VALUES, 51),
/* use Location: Luke! */
CURLOPT(CURLOPT_FOLLOWLOCATION, CURLOPTTYPE_LONG, 52),
@@ -1162,8 +1216,8 @@ typedef enum {
/* Data passed to the CURLOPT_PROGRESSFUNCTION and CURLOPT_XFERINFOFUNCTION
callbacks */
- CURLOPT(CURLOPT_PROGRESSDATA, CURLOPTTYPE_OBJECTPOINT, 57),
-#define CURLOPT_XFERINFODATA CURLOPT_PROGRESSDATA
+ CURLOPT(CURLOPT_XFERINFODATA, CURLOPTTYPE_CBPOINT, 57),
+#define CURLOPT_PROGRESSDATA CURLOPT_XFERINFODATA
/* We want the referrer field set automatically when following locations */
CURLOPT(CURLOPT_AUTOREFERER, CURLOPTTYPE_LONG, 58),
@@ -1258,7 +1312,7 @@ typedef enum {
/* Specify which HTTP version to use! This must be set to one of the
CURL_HTTP_VERSION* enums set below. */
- CURLOPT(CURLOPT_HTTP_VERSION, CURLOPTTYPE_LONG, 84),
+ CURLOPT(CURLOPT_HTTP_VERSION, CURLOPTTYPE_VALUES, 84),
/* Specifically switch on or off the FTP engine's use of the EPSV command. By
default, that one will always be attempted before the more traditional
@@ -1296,7 +1350,7 @@ typedef enum {
CURLOPT(CURLOPT_DEBUGFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 94),
/* set the data for the debug function */
- CURLOPT(CURLOPT_DEBUGDATA, CURLOPTTYPE_OBJECTPOINT, 95),
+ CURLOPT(CURLOPT_DEBUGDATA, CURLOPTTYPE_CBPOINT, 95),
/* mark this as start of a cookie session */
CURLOPT(CURLOPT_COOKIESESSION, CURLOPTTYPE_LONG, 96),
@@ -1319,7 +1373,7 @@ typedef enum {
/* indicates type of proxy. accepted values are CURLPROXY_HTTP (default),
CURLPROXY_HTTPS, CURLPROXY_SOCKS4, CURLPROXY_SOCKS4A and
CURLPROXY_SOCKS5. */
- CURLOPT(CURLOPT_PROXYTYPE, CURLOPTTYPE_LONG, 101),
+ CURLOPT(CURLOPT_PROXYTYPE, CURLOPTTYPE_VALUES, 101),
/* Set the Accept-Encoding string. Use this to tell a server you would like
the response to be compressed. Before 7.21.6, this was known as
@@ -1345,7 +1399,7 @@ typedef enum {
/* Set this to a bitmask value to enable the particular authentications
methods you like. Use this in combination with CURLOPT_USERPWD.
Note that setting multiple bits may cause extra network round-trips. */
- CURLOPT(CURLOPT_HTTPAUTH, CURLOPTTYPE_LONG, 107),
+ CURLOPT(CURLOPT_HTTPAUTH, CURLOPTTYPE_VALUES, 107),
/* Set the ssl context callback function, currently only for OpenSSL or
WolfSSL ssl_ctx, or mbedTLS mbedtls_ssl_config in the second argument.
@@ -1354,7 +1408,7 @@ typedef enum {
/* Set the userdata for the ssl context callback function's third
argument */
- CURLOPT(CURLOPT_SSL_CTX_DATA, CURLOPTTYPE_OBJECTPOINT, 109),
+ CURLOPT(CURLOPT_SSL_CTX_DATA, CURLOPTTYPE_CBPOINT, 109),
/* FTP Option that causes missing dirs to be created on the remote server.
In 7.19.4 we introduced the convenience enums for this option using the
@@ -1365,7 +1419,7 @@ typedef enum {
/* Set this to a bitmask value to enable the particular authentications
methods you like. Use this in combination with CURLOPT_PROXYUSERPWD.
Note that setting multiple bits may cause extra network round-trips. */
- CURLOPT(CURLOPT_PROXYAUTH, CURLOPTTYPE_LONG, 111),
+ CURLOPT(CURLOPT_PROXYAUTH, CURLOPTTYPE_VALUES, 111),
/* FTP option that changes the timeout, in seconds, associated with
getting a response. This is different from transfer timeout time and
@@ -1377,7 +1431,7 @@ typedef enum {
/* Set this option to one of the CURL_IPRESOLVE_* defines (see below) to
tell libcurl to resolve names to those IP versions only. This only has
affect on systems with support for more than one, i.e IPv4 _and_ IPv6. */
- CURLOPT(CURLOPT_IPRESOLVE, CURLOPTTYPE_LONG, 113),
+ CURLOPT(CURLOPT_IPRESOLVE, CURLOPTTYPE_VALUES, 113),
/* Set this option to limit the size of a file that will be downloaded from
an HTTP or FTP server.
@@ -1412,7 +1466,7 @@ typedef enum {
CURLUSESSL_CONTROL - SSL for the control connection or fail
CURLUSESSL_ALL - SSL for all communication or fail
*/
- CURLOPT(CURLOPT_USE_SSL, CURLOPTTYPE_LONG, 119),
+ CURLOPT(CURLOPT_USE_SSL, CURLOPTTYPE_VALUES, 119),
/* The _LARGE version of the standard POSTFIELDSIZE option */
CURLOPT(CURLOPT_POSTFIELDSIZE_LARGE, CURLOPTTYPE_OFF_T, 120),
@@ -1438,10 +1492,10 @@ typedef enum {
CURLFTPAUTH_SSL - try "AUTH SSL" first, then TLS
CURLFTPAUTH_TLS - try "AUTH TLS" first, then SSL
*/
- CURLOPT(CURLOPT_FTPSSLAUTH, CURLOPTTYPE_LONG, 129),
+ CURLOPT(CURLOPT_FTPSSLAUTH, CURLOPTTYPE_VALUES, 129),
CURLOPT(CURLOPT_IOCTLFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 130),
- CURLOPT(CURLOPT_IOCTLDATA, CURLOPTTYPE_OBJECTPOINT, 131),
+ CURLOPT(CURLOPT_IOCTLDATA, CURLOPTTYPE_CBPOINT, 131),
/* 132 OBSOLETE. Gone in 7.16.0 */
/* 133 OBSOLETE. Gone in 7.16.0 */
@@ -1464,7 +1518,7 @@ typedef enum {
/* Select "file method" to use when doing FTP, see the curl_ftpmethod
above. */
- CURLOPT(CURLOPT_FTP_FILEMETHOD, CURLOPTTYPE_LONG, 138),
+ CURLOPT(CURLOPT_FTP_FILEMETHOD, CURLOPTTYPE_VALUES, 138),
/* Local port number to bind the socket to */
CURLOPT(CURLOPT_LOCALPORT, CURLOPTTYPE_LONG, 139),
@@ -1501,14 +1555,14 @@ typedef enum {
/* callback function for setting socket options */
CURLOPT(CURLOPT_SOCKOPTFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 148),
- CURLOPT(CURLOPT_SOCKOPTDATA, CURLOPTTYPE_OBJECTPOINT, 149),
+ CURLOPT(CURLOPT_SOCKOPTDATA, CURLOPTTYPE_CBPOINT, 149),
/* set to 0 to disable session ID re-use for this transfer, default is
enabled (== 1) */
CURLOPT(CURLOPT_SSL_SESSIONID_CACHE, CURLOPTTYPE_LONG, 150),
/* allowed SSH authentication methods */
- CURLOPT(CURLOPT_SSH_AUTH_TYPES, CURLOPTTYPE_LONG, 151),
+ CURLOPT(CURLOPT_SSH_AUTH_TYPES, CURLOPTTYPE_VALUES, 151),
/* Used by scp/sftp to do public/private key authentication */
CURLOPT(CURLOPT_SSH_PUBLIC_KEYFILE, CURLOPTTYPE_STRINGPOINT, 152),
@@ -1533,7 +1587,7 @@ typedef enum {
/* Set the behaviour of POST when redirecting. Values must be set to one
of CURL_REDIR* defines below. This used to be called CURLOPT_POST301 */
- CURLOPT(CURLOPT_POSTREDIR, CURLOPTTYPE_LONG, 161),
+ CURLOPT(CURLOPT_POSTREDIR, CURLOPTTYPE_VALUES, 161),
/* used by scp/sftp to verify the host's public key */
CURLOPT(CURLOPT_SSH_HOST_PUBLIC_KEY_MD5, CURLOPTTYPE_STRINGPOINT, 162),
@@ -1543,7 +1597,7 @@ typedef enum {
CURL_SOCKET_BAD. The callback should have type
curl_opensocket_callback */
CURLOPT(CURLOPT_OPENSOCKETFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 163),
- CURLOPT(CURLOPT_OPENSOCKETDATA, CURLOPTTYPE_OBJECTPOINT, 164),
+ CURLOPT(CURLOPT_OPENSOCKETDATA, CURLOPTTYPE_CBPOINT, 164),
/* POST volatile input fields. */
CURLOPT(CURLOPT_COPYPOSTFIELDS, CURLOPTTYPE_OBJECTPOINT, 165),
@@ -1553,7 +1607,7 @@ typedef enum {
/* Callback function for seeking in the input stream */
CURLOPT(CURLOPT_SEEKFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 167),
- CURLOPT(CURLOPT_SEEKDATA, CURLOPTTYPE_OBJECTPOINT, 168),
+ CURLOPT(CURLOPT_SEEKDATA, CURLOPTTYPE_CBPOINT, 168),
/* CRL file */
CURLOPT(CURLOPT_CRLFILE, CURLOPTTYPE_STRINGPOINT, 169),
@@ -1614,7 +1668,7 @@ typedef enum {
CURLOPT(CURLOPT_SSH_KEYFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 184),
/* set the SSH host key callback custom pointer */
- CURLOPT(CURLOPT_SSH_KEYDATA, CURLOPTTYPE_OBJECTPOINT, 185),
+ CURLOPT(CURLOPT_SSH_KEYDATA, CURLOPTTYPE_CBPOINT, 185),
/* set the SMTP mail originator */
CURLOPT(CURLOPT_MAIL_FROM, CURLOPTTYPE_STRINGPOINT, 186),
@@ -1626,7 +1680,7 @@ typedef enum {
CURLOPT(CURLOPT_FTP_USE_PRET, CURLOPTTYPE_LONG, 188),
/* RTSP request method (OPTIONS, SETUP, PLAY, etc...) */
- CURLOPT(CURLOPT_RTSP_REQUEST, CURLOPTTYPE_LONG, 189),
+ CURLOPT(CURLOPT_RTSP_REQUEST, CURLOPTTYPE_VALUES, 189),
/* The RTSP session identifier */
CURLOPT(CURLOPT_RTSP_SESSION_ID, CURLOPTTYPE_STRINGPOINT, 190),
@@ -1644,7 +1698,7 @@ typedef enum {
CURLOPT(CURLOPT_RTSP_SERVER_CSEQ, CURLOPTTYPE_LONG, 194),
/* The stream to pass to INTERLEAVEFUNCTION. */
- CURLOPT(CURLOPT_INTERLEAVEDATA, CURLOPTTYPE_OBJECTPOINT, 195),
+ CURLOPT(CURLOPT_INTERLEAVEDATA, CURLOPTTYPE_CBPOINT, 195),
/* Let the application define a custom write method for RTP data */
CURLOPT(CURLOPT_INTERLEAVEFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 196),
@@ -1664,10 +1718,10 @@ typedef enum {
CURLOPT(CURLOPT_FNMATCH_FUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 200),
/* Let the application define custom chunk data pointer */
- CURLOPT(CURLOPT_CHUNK_DATA, CURLOPTTYPE_OBJECTPOINT, 201),
+ CURLOPT(CURLOPT_CHUNK_DATA, CURLOPTTYPE_CBPOINT, 201),
/* FNMATCH_FUNCTION user pointer */
- CURLOPT(CURLOPT_FNMATCH_DATA, CURLOPTTYPE_OBJECTPOINT, 202),
+ CURLOPT(CURLOPT_FNMATCH_DATA, CURLOPTTYPE_CBPOINT, 202),
/* send linked-list of name:port:address sets */
CURLOPT(CURLOPT_RESOLVE, CURLOPTTYPE_SLISTPOINT, 203),
@@ -1696,10 +1750,10 @@ typedef enum {
/* Callback function for closing socket (instead of close(2)). The callback
should have type curl_closesocket_callback */
CURLOPT(CURLOPT_CLOSESOCKETFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 208),
- CURLOPT(CURLOPT_CLOSESOCKETDATA, CURLOPTTYPE_OBJECTPOINT, 209),
+ CURLOPT(CURLOPT_CLOSESOCKETDATA, CURLOPTTYPE_CBPOINT, 209),
/* allow GSSAPI credential delegation */
- CURLOPT(CURLOPT_GSSAPI_DELEGATION, CURLOPTTYPE_LONG, 210),
+ CURLOPT(CURLOPT_GSSAPI_DELEGATION, CURLOPTTYPE_VALUES, 210),
/* Set the name servers to use for DNS resolution */
CURLOPT(CURLOPT_DNS_SERVERS, CURLOPTTYPE_STRINGPOINT, 211),
@@ -1716,7 +1770,7 @@ typedef enum {
CURLOPT(CURLOPT_TCP_KEEPINTVL, CURLOPTTYPE_LONG, 215),
/* Enable/disable specific SSL features with a bitmask, see CURLSSLOPT_* */
- CURLOPT(CURLOPT_SSL_OPTIONS, CURLOPTTYPE_LONG, 216),
+ CURLOPT(CURLOPT_SSL_OPTIONS, CURLOPTTYPE_VALUES, 216),
/* Set the SMTP auth originator */
CURLOPT(CURLOPT_MAIL_AUTH, CURLOPTTYPE_STRINGPOINT, 217),
@@ -1763,7 +1817,7 @@ typedef enum {
CURLOPT(CURLOPT_PROXYHEADER, CURLOPTTYPE_SLISTPOINT, 228),
/* Pass in a bitmask of "header options" */
- CURLOPT(CURLOPT_HEADEROPT, CURLOPTTYPE_LONG, 229),
+ CURLOPT(CURLOPT_HEADEROPT, CURLOPTTYPE_VALUES, 229),
/* The public key in DER form used to validate the peer public key
this option is used only if SSL_VERIFYPEER is true */
@@ -1835,7 +1889,7 @@ typedef enum {
/* What version to specifically try to use for proxy.
See CURL_SSLVERSION defines below. */
- CURLOPT(CURLOPT_PROXY_SSLVERSION, CURLOPTTYPE_LONG, 250),
+ CURLOPT(CURLOPT_PROXY_SSLVERSION, CURLOPTTYPE_VALUES, 250),
/* Set a username for authenticated TLS for proxy */
CURLOPT(CURLOPT_PROXY_TLSAUTH_USERNAME, CURLOPTTYPE_STRINGPOINT, 251),
@@ -1909,7 +1963,7 @@ typedef enum {
CURLOPT(CURLOPT_RESOLVER_START_FUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 272),
/* User data to pass to the resolver start callback. */
- CURLOPT(CURLOPT_RESOLVER_START_DATA, CURLOPTTYPE_OBJECTPOINT, 273),
+ CURLOPT(CURLOPT_RESOLVER_START_DATA, CURLOPTTYPE_CBPOINT, 273),
/* send HAProxy PROXY protocol header? */
CURLOPT(CURLOPT_HAPROXYPROTOCOL, CURLOPTTYPE_LONG, 274),
@@ -1940,7 +1994,7 @@ typedef enum {
CURLOPT(CURLOPT_TRAILERFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 283),
/* pointer to be passed to HTTP_TRAILER_FUNCTION */
- CURLOPT(CURLOPT_TRAILERDATA, CURLOPTTYPE_OBJECTPOINT, 284),
+ CURLOPT(CURLOPT_TRAILERDATA, CURLOPTTYPE_CBPOINT, 284),
/* set this to 1L to allow HTTP/0.9 responses or 0L to disallow */
CURLOPT(CURLOPT_HTTP09_ALLOWED, CURLOPTTYPE_LONG, 285),
@@ -1971,6 +2025,12 @@ typedef enum {
CURLOPT(CURLOPT_PROXY_ISSUERCERT, CURLOPTTYPE_STRINGPOINT, 296),
CURLOPT(CURLOPT_PROXY_ISSUERCERT_BLOB, CURLOPTTYPE_BLOB, 297),
+ /* the EC curves requested by the TLS client (RFC 8422, 5.1);
+ * OpenSSL support via 'set_groups'/'set_curves':
+ * https://www.openssl.org/docs/manmaster/man3/SSL_CTX_set1_groups.html
+ */
+ CURLOPT(CURLOPT_SSL_EC_CURVES, CURLOPTTYPE_STRINGPOINT, 298),
+
CURLOPT_LASTENTRY /* the last unused */
} CURLoption;
@@ -2643,8 +2703,9 @@ typedef enum {
CURLINFO_APPCONNECT_TIME_T = CURLINFO_OFF_T + 56,
CURLINFO_RETRY_AFTER = CURLINFO_OFF_T + 57,
CURLINFO_EFFECTIVE_METHOD = CURLINFO_STRING + 58,
+ CURLINFO_PROXY_ERROR = CURLINFO_LONG + 59,
- CURLINFO_LASTONE = 58
+ CURLINFO_LASTONE = 59
} CURLINFO;
/* CURLINFO_RESPONSE_CODE is the new name for the option previously known as
@@ -2903,6 +2964,7 @@ CURL_EXTERN CURLcode curl_easy_pause(CURL *handle, int bitmask);
#include "easy.h" /* nothing in curl is fun without the easy stuff */
#include "multi.h"
#include "urlapi.h"
+#include "options.h"
/* the typechecker doesn't work in C++ (yet) */
#if defined(__GNUC__) && defined(__GNUC_MINOR__) && \
diff --git a/include/curl/curlver.h b/include/curl/curlver.h
index ce0f7ac9..2c3010e1 100644
--- a/include/curl/curlver.h
+++ b/include/curl/curlver.h
@@ -30,12 +30,12 @@
/* This is the version number of the libcurl package from which this header
file origins: */
-#define LIBCURL_VERSION "7.72.0"
+#define LIBCURL_VERSION "7.73.0"
/* The numeric version number is also available "in parts" by using these
defines: */
#define LIBCURL_VERSION_MAJOR 7
-#define LIBCURL_VERSION_MINOR 72
+#define LIBCURL_VERSION_MINOR 73
#define LIBCURL_VERSION_PATCH 0
/* This is the numeric version of the libcurl version number, meant for easier
@@ -57,7 +57,7 @@
CURL_VERSION_BITS() macro since curl's own configure script greps for it
and needs it to contain the full number.
*/
-#define LIBCURL_VERSION_NUM 0x074800
+#define LIBCURL_VERSION_NUM 0x074900
/*
* This is the date and time when the full source package was created. The
@@ -68,7 +68,7 @@
*
* "2007-11-23"
*/
-#define LIBCURL_TIMESTAMP "2020-08-19"
+#define LIBCURL_TIMESTAMP "2020-10-14"
#define CURL_VERSION_BITS(x,y,z) ((x)<<16|(y)<<8|(z))
#define CURL_AT_LEAST_VERSION(x,y,z) \
diff --git a/include/curl/options.h b/include/curl/options.h
new file mode 100644
index 00000000..f3bd8e19
--- /dev/null
+++ b/include/curl/options.h
@@ -0,0 +1,68 @@
+#ifndef CURLINC_OPTIONS_H
+#define CURLINC_OPTIONS_H
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 2018 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef enum {
+ CURLOT_LONG, /* long (a range of values) */
+ CURLOT_VALUES, /* (a defined set or bitmask) */
+ CURLOT_OFF_T, /* curl_off_t (a range of values) */
+ CURLOT_OBJECT, /* pointer (void *) */
+ CURLOT_STRING, /* (char * to zero terminated buffer) */
+ CURLOT_SLIST, /* (struct curl_slist *) */
+ CURLOT_CBPTR, /* (void * passed as-is to a callback) */
+ CURLOT_BLOB, /* blob (struct curl_blob *) */
+ CURLOT_FUNCTION /* function pointer */
+} curl_easytype;
+
+/* Flag bits */
+
+/* "alias" means it is provided for old programs to remain functional,
+ we prefer another name */
+#define CURLOT_FLAG_ALIAS (1<<0)
+
+/* The CURLOPTTYPE_* id ranges can still be used to figure out what type/size
+ to use for curl_easy_setopt() for the given id */
+struct curl_easyoption {
+ const char *name;
+ CURLoption id;
+ curl_easytype type;
+ unsigned int flags;
+};
+
+CURL_EXTERN const struct curl_easyoption *
+curl_easy_option_by_name(const char *name);
+
+CURL_EXTERN const struct curl_easyoption *
+curl_easy_option_by_id (CURLoption id);
+
+CURL_EXTERN const struct curl_easyoption *
+curl_easy_option_next(const struct curl_easyoption *prev);
+
+#ifdef __cplusplus
+} /* end of extern "C" */
+#endif
+#endif /* CURLINC_OPTIONS_H */
diff --git a/include/curl/typecheck-gcc.h b/include/curl/typecheck-gcc.h
index f8cb921f..318ab0ab 100644
--- a/include/curl/typecheck-gcc.h
+++ b/include/curl/typecheck-gcc.h
@@ -292,6 +292,7 @@ CURLWARNING(_curl_easy_getinfo_err_curl_off_t,
(option) == CURLOPT_PROXY_CAINFO || \
(option) == CURLOPT_PROXY_CAPATH || \
(option) == CURLOPT_PROXY_CRLFILE || \
+ (option) == CURLOPT_PROXY_ISSUERCERT || \
(option) == CURLOPT_PROXY_KEYPASSWD || \
(option) == CURLOPT_PROXY_PINNEDPUBLICKEY || \
(option) == CURLOPT_PROXY_SERVICE_NAME || \
@@ -334,6 +335,7 @@ CURLWARNING(_curl_easy_getinfo_err_curl_off_t,
(option) == CURLOPT_USERNAME || \
(option) == CURLOPT_USERPWD || \
(option) == CURLOPT_XOAUTH2_BEARER || \
+ (option) == CURLOPT_SSL_EC_CURVES || \
0)
/* evaluates to true if option takes a curl_write_callback argument */
@@ -357,7 +359,6 @@ CURLWARNING(_curl_easy_getinfo_err_curl_off_t,
(option) == CURLOPT_INTERLEAVEDATA || \
(option) == CURLOPT_IOCTLDATA || \
(option) == CURLOPT_OPENSOCKETDATA || \
- (option) == CURLOPT_PRIVATE || \
(option) == CURLOPT_PROGRESSDATA || \
(option) == CURLOPT_READDATA || \
(option) == CURLOPT_SEEKDATA || \
diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt
index 1d71e149..911c9096 100644
--- a/lib/CMakeLists.txt
+++ b/lib/CMakeLists.txt
@@ -50,15 +50,6 @@ endif()
# # strtoofft.c - specify later
# )
-# # if we have Kerberos 4, right now this is never on
-# #OPTION(CURL_KRB4 "Use Kerberos 4" OFF)
-# IF(CURL_KRB4)
-# SET(CSOURCES ${CSOURCES}
-# krb4.c
-# security.c
-# )
-# ENDIF(CURL_KRB4)
-
# #OPTION(CURL_MALLOC_DEBUG "Debug mallocs in Curl" OFF)
# MARK_AS_ADVANCED(CURL_MALLOC_DEBUG)
# IF(CURL_MALLOC_DEBUG)
diff --git a/lib/Makefile.Watcom b/lib/Makefile.Watcom
deleted file mode 100644
index 6ea975b5..00000000
--- a/lib/Makefile.Watcom
+++ /dev/null
@@ -1,274 +0,0 @@
-#***************************************************************************
-# _ _ ____ _
-# Project ___| | | | _ \| |
-# / __| | | | |_) | |
-# | (__| |_| | _ <| |___
-# \___|\___/|_| \_\_____|
-#
-# Copyright (C) 2005 - 2009, Gisle Vanem <gvanem@yahoo.no>.
-# Copyright (C) 2005 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
-#
-# This software is licensed as described in the file COPYING, which
-# you should have received as part of this distribution. The terms
-# are also available at https://curl.haxx.se/docs/copyright.html.
-#
-# You may opt to use, copy, modify, merge, publish, distribute and/or sell
-# copies of the Software, and permit persons to whom the Software is
-# furnished to do so, under the terms of the COPYING file.
-#
-# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
-# KIND, either express or implied.
-#
-#***************************************************************************
-
-#
-# Watcom / OpenWatcom / Win32 makefile for libcurl.
-#
-
-.ERASE
-
-!if $(__VERSION__) < 1280
-!message !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!message ! This Open Watcom version is too old and is no longer supported !
-!message ! Please download latest version from www.openwatcom.org !
-!message !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!error Unsupported version of Open Watcom
-!endif
-
-!ifndef %watcom
-!error WATCOM environment variable not set!
-!endif
-
-# In order to process Makefile.inc wmake must be called with -u switch!
-!ifndef %MAKEFLAGS
-!error You MUST call wmake with the -u switch!
-!endif
-
-!ifdef %libname
-LIBNAME = $(%libname)
-!else
-LIBNAME = libcurl
-!endif
-TARGETS = $(LIBNAME).dll $(LIBNAME).lib
-
-CC = wcc386
-LD = wlink
-AR = wlib
-RC = wrc
-
-!ifdef __LOADDLL__
-! loaddll wcc386 wccd386
-! loaddll wpp386 wppd386
-! loaddll wlib wlibd
-! loaddll wlink wlinkd
-!endif
-
-!ifdef __LINUX__
-CP = cp
-MD = mkdir -p
-!else
-CP = copy 2>NUL
-MD = mkdir
-!endif
-!if $(__VERSION__) > 1290
-RD = rm -rf
-!else ifdef __UNIX__
-RD = rm -rf
-!else
-RD = rmdir /q /s 2>NUL
-!endif
-
-SYS_INCL = -I"$(%watcom)/h/nt" -I"$(%watcom)/h"
-
-CFLAGS = -3r -mf -hc -zff -zgf -zq -zm -zc -s -fr=con -w2 -fpi -oilrtfm &
- -wcd=201 -bt=nt -d+ -dWIN32 &
- -dBUILDING_LIBCURL -I. -I"../include" $(SYS_INCL)
-
-!ifdef %debug
-DEBUG = -dDEBUG=1 -dDEBUGBUILD
-CFLAGS += -d3 $(DEBUG)
-!else
-CFLAGS += -d0
-!endif
-
-!ifdef %use_ipv6
-CFLAGS += -d_WIN32_WINNT=0x0501 -dENABLE_IPV6
-!endif
-
-!ifdef %use_sspi
-CFLAGS += -dUSE_WINDOWS_SSPI
-!endif
-
-!ifdef %use_winssl
-CFLAGS += -dUSE_WINDOWS_SSPI
-CFLAGS += -DUSE_SCHANNEL
-!endif
-
-!ifdef %use_winidn
-CFLAGS += -dWINVER=0x0600 -dUSE_WIN32_IDN
-! if $(__VERSION__) <= 1290
-CFLAGS += -dWANT_IDN_PROTOTYPES
-! endif
-!endif
-
-#
-# Change to suite.
-#
-!ifdef %zlib_root
-ZLIB_ROOT = $(%zlib_root)
-!else
-ZLIB_ROOT = ../../zlib-1.2.8
-!endif
-
-!ifdef %libssh2_root
-LIBSSH2_ROOT = $(%libssh2_root)
-!else
-LIBSSH2_ROOT = ../../libssh2-1.5.0
-!endif
-
-!ifdef %librtmp_root
-LIBRTMP_ROOT = $(%librtmp_root)
-!else
-LIBRTMP_ROOT = ../../rtmpdump-2.3
-!endif
-
-!ifdef %openssl_root
-OPENSSL_ROOT = $(%openssl_root)
-!else
-OPENSSL_ROOT = ../../openssl-1.0.2a
-!endif
-
-!ifdef %ares_root
-ARES_ROOT = $(%ares_root)
-!else
-ARES_ROOT = ../ares
-!endif
-
-!ifdef %use_zlib
-CFLAGS += -dHAVE_ZLIB_H -dHAVE_LIBZ -I"$(ZLIB_ROOT)"
-!endif
-
-!ifdef %use_rtmp
-CFLAGS += -dUSE_LIBRTMP -I"$(LIBRTMP_ROOT)"
-!endif
-
-!ifdef %use_ssh2
-CFLAGS += -DUSE_LIBSSH2 -DHAVE_LIBSSH2_H -I"$(LIBSSH2_ROOT)/include" -I"$(LIBSSH2_ROOT)/win32"
-!endif
-
-!ifdef %use_ssl
-CFLAGS += -wcd=138 -dUSE_OPENSSL -I"$(OPENSSL_ROOT)/inc32"
-!endif
-
-!ifdef %use_ares
-CFLAGS += -dUSE_ARES -I"$(ARES_ROOT)"
-!endif
-
-!ifdef %use_watt32
-CFLAGS += -dUSE_WATT32 -I"$(%watt_root)/inc"
-!endif
-
-OBJ_BASE = WC_Win32.obj
-!if $(__VERSION__) > 1290
-OBJ_STAT = $(OBJ_BASE)/stat
-OBJ_DYN = $(OBJ_BASE)/dyn
-!else ifdef __UNIX__
-OBJ_STAT = $(OBJ_BASE)/stat
-OBJ_DYN = $(OBJ_BASE)/dyn
-!else
-OBJ_STAT = $(OBJ_BASE)\stat
-OBJ_DYN = $(OBJ_BASE)\dyn
-!endif
-
-LINK_ARG = $(OBJ_DYN)/wlink.arg
-LIB_ARG = $(OBJ_STAT)/wlib.arg
-
-!include Makefile.inc
-
-OBJS1 = ./$(CSOURCES:.c=.obj)
-OBJS2 = $(OBJS1:vtls/=)
-OBJS3 = $(OBJS2:vauth/=)
-OBJS4 = $(OBJS3: = ./)
-OBJS_STAT = $(OBJS4:./=$(OBJ_STAT)/)
-OBJS_DYN = $(OBJS4:./=$(OBJ_DYN)/)
-
-RESOURCE = $(OBJ_DYN)/libcurl.res
-
-DIRS = $(OBJ_BASE) $(OBJ_BASE)/stat $(OBJ_BASE)/dyn
-
-.c : vauth vtls
-
-all: $(DIRS) $(TARGETS) .SYMBOLIC
- @echo Welcome to libcurl
-
-clean: .SYMBOLIC
- -rm -f $(OBJS_STAT)
- -rm -f $(OBJS_DYN)
- -rm -f $(RESOURCE) $(LINK_ARG) $(LIB_ARG)
-
-vclean distclean: clean .SYMBOLIC
- -rm -f $(TARGETS) $(LIBNAME).map $(LIBNAME).sym
- -$(RD) $(OBJ_STAT)
- -$(RD) $(OBJ_DYN)
- -$(RD) $(OBJ_BASE)
-
-$(DIRS):
- -$(MD) $^@
-
-$(LIBNAME).dll: $(OBJS_DYN) $(RESOURCE) $(__MAKEFILES__)
- %create $(LINK_ARG)
- @%append $(LINK_ARG) system nt dll
-!ifdef %debug
- @%append $(LINK_ARG) debug all
- @%append $(LINK_ARG) option symfile
-!endif
- @%append $(LINK_ARG) option quiet, caseexact, eliminate
- @%append $(LINK_ARG) option map=$(OBJ_DYN)/$(LIBNAME).map
- @%append $(LINK_ARG) option implib=$(LIBNAME)_imp.lib
- @%append $(LINK_ARG) option res=$(RESOURCE)
- @for %f in ($(OBJS_DYN)) do @%append $(LINK_ARG) file %f
- @%append $(LINK_ARG) library wldap32.lib
-!ifdef %use_watt32
- @%append $(LINK_ARG) library '$(%watt_root)/lib/wattcpw_imp.lib'
-!else
- @%append $(LINK_ARG) library ws2_32.lib
-!endif
-!ifdef %use_zlib
- @%append $(LINK_ARG) library '$(ZLIB_ROOT)/zlib.lib'
-!endif
-!ifdef %use_rtmp
- @%append $(LINK_ARG) library '$(LIBRTMP_ROOT)/librtmp/librtmp.lib'
-!endif
-!ifdef %use_ssh2
- @%append $(LINK_ARG) library '$(LIBSSH2_ROOT)/win32/libssh2.lib'
-!endif
-!ifdef %use_ssl
- @%append $(LINK_ARG) library '$(OPENSSL_ROOT)/out32/libeay32.lib'
- @%append $(LINK_ARG) library '$(OPENSSL_ROOT)/out32/ssleay32.lib'
-!endif
-!ifdef %use_ares
- @%append $(LINK_ARG) library '$(ARES_ROOT)/cares.lib'
-!endif
-!ifdef %use_winidn
-! if $(__VERSION__) > 1290
- @%append $(LINK_ARG) library normaliz.lib
-! else
- @%append $(LINK_ARG) import '_IdnToAscii@20' 'NORMALIZ.DLL'.'IdnToAscii'
- @%append $(LINK_ARG) import '_IdnToUnicode@20' 'NORMALIZ.DLL'.'IdnToUnicode'
-! endif
-!endif
- $(LD) name $^@ @$(LINK_ARG)
-
-$(LIBNAME).lib: $(OBJS_STAT)
- %create $(LIB_ARG)
- @for %f in ($<) do @%append $(LIB_ARG) +- %f
- $(AR) -q -b -c -pa $^@ @$(LIB_ARG)
-
-$(RESOURCE): libcurl.rc
- $(RC) $(DEBUG) -q -r -zm -bt=nt -I"../include" $(SYS_INCL) $[@ -fo=$^@
-
-.c{$(OBJ_DYN)}.obj:
- $(CC) $(CFLAGS) -bd -br $[@ -fo=$^@
-
-.c{$(OBJ_STAT)}.obj:
- $(CC) $(CFLAGS) -DCURL_STATICLIB $[@ -fo=$^@
diff --git a/lib/Makefile.am b/lib/Makefile.am
index f2886ec6..78b068ff 100644
--- a/lib/Makefile.am
+++ b/lib/Makefile.am
@@ -27,7 +27,7 @@ EXTRA_DIST = Makefile.m32 config-win32.h config-win32ce.h \
config-plan9.h config-riscos.h config-mac.h curl_config.h.in \
makefile.dj config-dos.h libcurl.plist libcurl.rc config-amigaos.h \
makefile.amiga Makefile.netware nwlib.c nwos.c config-win32ce.h \
- config-os400.h setup-os400.h config-symbian.h Makefile.Watcom \
+ config-os400.h setup-os400.h \
config-tpf.h mk-ca-bundle.pl mk-ca-bundle.vbs $(CMAKE_DIST) \
firefox-db2pem.sh config-vxworks.h Makefile.vxworks checksrc.pl \
setup-win32.h
@@ -66,7 +66,7 @@ endif
# Prevent LIBS from being used for all link targets
LIBS = $(BLANK_AT_MAKETIME)
-VERSIONINFO=-version-info 10:0:6
+VERSIONINFO=-version-info 11:0:7
# This flag accepts an argument of the form current[:revision[:age]]. So,
# passing -version-info 3:12:1 sets current to 3, revision to 12, and age to
# 1.
@@ -153,3 +153,6 @@ TIDY:=clang-tidy
tidy:
$(TIDY) $(CSOURCES) $(TIDYFLAGS) -- $(AM_CPPFLAGS) $(CPPFLAGS) -DHAVE_CONFIG_H
+
+optiontable:
+ perl optiontable.pl < $(top_srcdir)/include/curl/curl.h > easyoptions.c
diff --git a/lib/Makefile.inc b/lib/Makefile.inc
index ae3f961c..a2fd57a8 100644
--- a/lib/Makefile.inc
+++ b/lib/Makefile.inc
@@ -56,19 +56,19 @@ LIB_CFILES = altsvc.c amigaos.c asyn-ares.c asyn-thread.c base64.c \
http_ntlm.c http_proxy.c idn_win32.c if2ip.c imap.c inet_ntop.c inet_pton.c \
krb5.c ldap.c llist.c md4.c md5.c memdebug.c mime.c mprintf.c mqtt.c \
multi.c netrc.c non-ascii.c nonblock.c openldap.c parsedate.c pingpong.c \
- pop3.c progress.c psl.c doh.c rand.c rename.c rtsp.c security.c select.c \
+ pop3.c progress.c psl.c doh.c rand.c rename.c rtsp.c select.c \
sendf.c setopt.c sha256.c share.c slist.c smb.c smtp.c socketpair.c socks.c \
socks_gssapi.c socks_sspi.c speedcheck.c splay.c strcase.c strdup.c \
strerror.c strtok.c strtoofft.c system_win32.c telnet.c tftp.c timeval.c \
transfer.c urlapi.c version.c warnless.c wildcard.c x509asn1.c dynbuf.c \
- version_win32.c
+ version_win32.c easyoptions.c easygetopt.c
LIB_HFILES = altsvc.h amigaos.h arpa_telnet.h asyn.h conncache.h connect.h \
content_encoding.h cookie.h curl_addrinfo.h curl_base64.h curl_ctype.h \
curl_des.h curl_endian.h curl_fnmatch.h curl_get_line.h curl_gethostname.h \
curl_gssapi.h curl_hmac.h curl_ldap.h curl_md4.h curl_md5.h curl_memory.h \
curl_memrchr.h curl_multibyte.h curl_ntlm_core.h curl_ntlm_wb.h curl_path.h \
- curl_printf.h curl_range.h curl_rtmp.h curl_sasl.h curl_sec.h curl_setup.h \
+ curl_printf.h curl_range.h curl_rtmp.h curl_sasl.h curl_krb5.h curl_setup.h \
curl_setup_once.h curl_sha256.h curl_sspi.h curl_threads.h curlx.h dict.h \
dotdot.h easyif.h escape.h file.h fileinfo.h formdata.h ftp.h url.h \
ftplistparser.h getinfo.h gopher.h hash.h hostcheck.h hostip.h http.h \
@@ -80,7 +80,7 @@ LIB_HFILES = altsvc.h amigaos.h arpa_telnet.h asyn.h conncache.h connect.h \
smb.h smtp.h sockaddr.h socketpair.h socks.h speedcheck.h splay.h strcase.h \
strdup.h strerror.h strtok.h strtoofft.h system_win32.h telnet.h tftp.h \
timeval.h transfer.h urlapi-int.h urldata.h warnless.h wildcard.h \
- x509asn1.h dynbuf.h version_win32.h
+ x509asn1.h dynbuf.h version_win32.h easyoptions.h
LIB_RCFILES = libcurl.rc
diff --git a/lib/Makefile.m32 b/lib/Makefile.m32
index 02b31106..37887eed 100644
--- a/lib/Makefile.m32
+++ b/lib/Makefile.m32
@@ -298,7 +298,12 @@ endif
ifdef ZSTD
INCLUDES += -I"$(ZSTD_PATH)/include"
CFLAGS += -DHAVE_ZSTD
- DLL_LIBS += -L"$(ZSTD_PATH)/lib" -lzstd
+ DLL_LIBS += -L"$(ZSTD_PATH)/lib"
+ ifdef ZSTD_LIBS
+ DLL_LIBS += $(ZSTD_LIBS)
+ else
+ DLL_LIBS += -lzstd
+ endif
endif
ifdef BROTLI
INCLUDES += -I"$(BROTLI_PATH)/include"
diff --git a/lib/altsvc.c b/lib/altsvc.c
index c2ec489d..d3deba3e 100644
--- a/lib/altsvc.c
+++ b/lib/altsvc.c
@@ -302,11 +302,12 @@ CURLcode Curl_altsvc_ctrl(struct altsvcinfo *asi, const long ctrl)
* Curl_altsvc_cleanup() frees an altsvc cache instance and all associated
* resources.
*/
-void Curl_altsvc_cleanup(struct altsvcinfo *altsvc)
+void Curl_altsvc_cleanup(struct altsvcinfo **altsvcp)
{
- struct curl_llist_element *e;
- struct curl_llist_element *n;
- if(altsvc) {
+ struct Curl_llist_element *e;
+ struct Curl_llist_element *n;
+ if(*altsvcp) {
+ struct altsvcinfo *altsvc = *altsvcp;
for(e = altsvc->list.head; e; e = n) {
struct altsvc *as = e->ptr;
n = e->next;
@@ -314,6 +315,7 @@ void Curl_altsvc_cleanup(struct altsvcinfo *altsvc)
}
free(altsvc->filename);
free(altsvc);
+ *altsvcp = NULL; /* clear the pointer */
}
}
@@ -323,8 +325,8 @@ void Curl_altsvc_cleanup(struct altsvcinfo *altsvc)
CURLcode Curl_altsvc_save(struct Curl_easy *data,
struct altsvcinfo *altsvc, const char *file)
{
- struct curl_llist_element *e;
- struct curl_llist_element *n;
+ struct Curl_llist_element *e;
+ struct Curl_llist_element *n;
CURLcode result = CURLE_OK;
FILE *out;
char *tempstore;
@@ -399,8 +401,8 @@ static CURLcode getalnum(const char **ptr, char *alpnbuf, size_t buflen)
static void altsvc_flush(struct altsvcinfo *asi, enum alpnid srcalpnid,
const char *srchost, unsigned short srcport)
{
- struct curl_llist_element *e;
- struct curl_llist_element *n;
+ struct Curl_llist_element *e;
+ struct Curl_llist_element *n;
for(e = asi->list.head; e; e = n) {
struct altsvc *as = e->ptr;
n = e->next;
@@ -612,8 +614,8 @@ bool Curl_altsvc_lookup(struct altsvcinfo *asi,
struct altsvc **dstentry,
const int versions) /* one or more bits */
{
- struct curl_llist_element *e;
- struct curl_llist_element *n;
+ struct Curl_llist_element *e;
+ struct Curl_llist_element *n;
time_t now = time(NULL);
DEBUGASSERT(asi);
DEBUGASSERT(srchost);
diff --git a/lib/altsvc.h b/lib/altsvc.h
index 578a4fbf..1aeb625a 100644
--- a/lib/altsvc.h
+++ b/lib/altsvc.h
@@ -46,12 +46,12 @@ struct altsvc {
time_t expires;
bool persist;
int prio;
- struct curl_llist_element node;
+ struct Curl_llist_element node;
};
struct altsvcinfo {
char *filename;
- struct curl_llist list; /* list of entries */
+ struct Curl_llist list; /* list of entries */
long flags; /* the publicly set bitmask */
};
@@ -61,7 +61,7 @@ CURLcode Curl_altsvc_load(struct altsvcinfo *asi, const char *file);
CURLcode Curl_altsvc_save(struct Curl_easy *data,
struct altsvcinfo *asi, const char *file);
CURLcode Curl_altsvc_ctrl(struct altsvcinfo *asi, const long ctrl);
-void Curl_altsvc_cleanup(struct altsvcinfo *altsvc);
+void Curl_altsvc_cleanup(struct altsvcinfo **altsvc);
CURLcode Curl_altsvc_parse(struct Curl_easy *data,
struct altsvcinfo *altsvc, const char *value,
enum alpnid srcalpn, const char *srchost,
@@ -74,5 +74,6 @@ bool Curl_altsvc_lookup(struct altsvcinfo *asi,
#else
/* disabled */
#define Curl_altsvc_save(a,b,c)
+#define Curl_altsvc_cleanup(x)
#endif /* CURL_DISABLE_HTTP || USE_ALTSVC */
#endif /* HEADER_CURL_ALTSVC_H */
diff --git a/lib/asyn-ares.c b/lib/asyn-ares.c
index e6515074..725d6cd5 100644
--- a/lib/asyn-ares.c
+++ b/lib/asyn-ares.c
@@ -67,8 +67,8 @@
#include "select.h"
#include "progress.h"
-# if defined(CURL_STATICLIB) && !defined(CARES_STATICLIB) && \
- (defined(WIN32) || defined(__SYMBIAN32__))
+# if defined(CURL_STATICLIB) && !defined(CARES_STATICLIB) && \
+ defined(WIN32)
# define CARES_STATICLIB
# endif
# include <ares.h>
diff --git a/lib/base64.c b/lib/base64.c
index 643cef62..ec632e6f 100644
--- a/lib/base64.c
+++ b/lib/base64.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -26,6 +26,9 @@
#if !defined(CURL_DISABLE_HTTP_AUTH) || defined(USE_SSH) || \
!defined(CURL_DISABLE_LDAP) || \
+ !defined(CURL_DISABLE_SMTP) || \
+ !defined(CURL_DISABLE_POP3) || \
+ !defined(CURL_DISABLE_IMAP) || \
!defined(CURL_DISABLE_DOH) || defined(USE_SSL)
#include "urldata.h" /* for the Curl_easy definition */
diff --git a/lib/checksrc.pl b/lib/checksrc.pl
index 498da94b..78b9cef5 100755
--- a/lib/checksrc.pl
+++ b/lib/checksrc.pl
@@ -52,7 +52,7 @@ my %warnings_extended = (
my %warnings = (
'LONGLINE' => "Line longer than $max_column",
'TABS' => 'TAB characters not allowed',
- 'TRAILINGSPACE' => 'Trailing white space on the line',
+ 'TRAILINGSPACE' => 'Trailing whitespace on the line',
'CPPCOMMENTS' => '// comment detected',
'SPACEBEFOREPAREN' => 'space before an open parenthesis',
'SPACEAFTERPAREN' => 'space after open parenthesis',
@@ -82,6 +82,9 @@ my %warnings = (
'SNPRINTF' => 'use of snprintf',
'ONELINECONDITION' => 'conditional block on the same line as the if()',
'TYPEDEFSTRUCT' => 'typedefed struct',
+ 'DOBRACE' => 'A single space between do and open brace',
+ 'BRACEWHILE' => 'A single space between open brace and while',
+ 'EXCLAMATIONSPACE' => 'Whitespace after exclamation mark in expression',
);
sub readskiplist {
@@ -397,7 +400,7 @@ sub scanfile {
checkwarn("TABS",
$line, length($1), $file, $l, "Contains TAB character", 1);
}
- # detect trailing white space
+ # detect trailing whitespace
if($l =~ /^(.*)[ \t]+\z/) {
checkwarn("TRAILINGSPACE",
$line, length($1), $file, $l, "Trailing whitespace");
@@ -439,7 +442,7 @@ sub scanfile {
# crude attempt to detect // comments without too many false
# positives
- if($l =~ /^([^"\*]*)[^:"]\/\//) {
+ if($l =~ /^(([^"\*]*)[^:"]|)\/\//) {
checkwarn("CPPCOMMENTS",
$line, length($1), $file, $l, "\/\/ comment");
}
@@ -468,6 +471,14 @@ sub scanfile {
}
}
+ # check spaces in 'do {'
+ if($nostr =~ /^( *)do( *)\{/ && length($2) != 1) {
+ checkwarn("DOBRACE", $line, length($1) + 2, $file, $l, "one space after do before brace");
+ }
+ # check spaces in 'do {'
+ elsif($nostr =~ /^( *)\}( *)while/ && length($2) != 1) {
+ checkwarn("BRACEWHILE", $line, length($1) + 2, $file, $l, "one space between brace and while");
+ }
if($nostr =~ /^((.*\s)(if) *\()(.*)\)(.*)/) {
my $pos = length($1);
my $postparen = $5;
@@ -715,6 +726,12 @@ sub scanfile {
"typedef'ed struct");
}
+ if($nostr =~ /(.*)! +(\w|\()/) {
+ checkwarn("EXCLAMATIONSPACE",
+ $line, length($1)+1, $file, $ol,
+ "space after exclamation mark");
+ }
+
# check for more than one consecutive space before open brace or
# question mark. Skip lines containing strings since they make it hard
# due to artificially getting multiple spaces
diff --git a/lib/config-symbian.h b/lib/config-symbian.h
deleted file mode 100644
index 7f17dce2..00000000
--- a/lib/config-symbian.h
+++ /dev/null
@@ -1,793 +0,0 @@
-#ifndef HEADER_CURL_CONFIG_SYMBIAN_H
-#define HEADER_CURL_CONFIG_SYMBIAN_H
-/***************************************************************************
- * _ _ ____ _
- * Project ___| | | | _ \| |
- * / __| | | | |_) | |
- * | (__| |_| | _ <| |___
- * \___|\___/|_| \_\_____|
- *
- * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
- *
- * This software is licensed as described in the file COPYING, which
- * you should have received as part of this distribution. The terms
- * are also available at https://curl.haxx.se/docs/copyright.html.
- *
- * You may opt to use, copy, modify, merge, publish, distribute and/or sell
- * copies of the Software, and permit persons to whom the Software is
- * furnished to do so, under the terms of the COPYING file.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ***************************************************************************/
-
-/* ================================================================ */
-/* Hand crafted config file for Symbian */
-/* ================================================================ */
-
-/* Location of default ca bundle */
-/* #define CURL_CA_BUNDLE "/etc/pki/tls/certs/ca-bundle.crt"*/
-
-/* Location of default ca path */
-/* #undef CURL_CA_PATH */
-
-/* to disable cookies support */
-/* #undef CURL_DISABLE_COOKIES */
-
-/* to disable cryptographic authentication */
-/* #undef CURL_DISABLE_CRYPTO_AUTH */
-
-/* to disable DICT */
-/* #undef CURL_DISABLE_DICT */
-
-/* to disable FILE */
-/* #undef CURL_DISABLE_FILE */
-
-/* to disable FTP */
-/* #undef CURL_DISABLE_FTP */
-
-/* to disable HTTP */
-/* #undef CURL_DISABLE_HTTP */
-
-/* to disable LDAP */
-#define CURL_DISABLE_LDAP 1
-
-/* to disable LDAPS */
-#define CURL_DISABLE_LDAPS 1
-
-/* to disable TELNET */
-/* #undef CURL_DISABLE_TELNET */
-
-/* to disable TFTP */
-/* #undef CURL_DISABLE_TFTP */
-
-/* to disable verbose strings */
-/* #define CURL_DISABLE_VERBOSE_STRINGS 1*/
-
-/* Definition to make a library symbol externally visible. */
-/* #undef CURL_EXTERN_SYMBOL */
-
-/* Use Windows LDAP implementation */
-/* #undef USE_WIN32_LDAP */
-
-/* your Entropy Gathering Daemon socket pathname */
-/* #undef EGD_SOCKET */
-
-/* Define if you want to enable IPv6 support */
-#define ENABLE_IPV6 1
-
-/* Define if struct sockaddr_in6 has the sin6_scope_id member */
-#define HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID 1
-
-/* Define to the type qualifier of arg 1 for getnameinfo. */
-#define GETNAMEINFO_QUAL_ARG1 const
-
-/* Define to the type of arg 1 for getnameinfo. */
-#define GETNAMEINFO_TYPE_ARG1 struct sockaddr *
-
-/* Define to the type of arg 2 for getnameinfo. */
-#define GETNAMEINFO_TYPE_ARG2 socklen_t
-
-/* Define to the type of args 4 and 6 for getnameinfo. */
-#define GETNAMEINFO_TYPE_ARG46 size_t
-
-/* Define to the type of arg 7 for getnameinfo. */
-#define GETNAMEINFO_TYPE_ARG7 int
-
-/* Define to 1 if you have the <alloca.h> header file. */
-/*#define HAVE_ALLOCA_H 1*/
-
-/* Define to 1 if you have the <arpa/inet.h> header file. */
-#define HAVE_ARPA_INET_H 1
-
-/* Define to 1 if you have the <arpa/tftp.h> header file. */
-/*#define HAVE_ARPA_TFTP_H 1*/
-
-/* Define to 1 if you have the <assert.h> header file. */
-#define HAVE_ASSERT_H 1
-
-/* Define to 1 if you have the `basename' function. */
-/*#define HAVE_BASENAME 1*/
-
-/* Define to 1 if bool is an available type. */
-/*#define HAVE_BOOL_T 1*/
-
-/* Define to 1 if you have the `closesocket' function. */
-/* #undef HAVE_CLOSESOCKET */
-
-/* Define to 1 if you have the `CRYPTO_cleanup_all_ex_data' function. */
-/*#define HAVE_CRYPTO_CLEANUP_ALL_EX_DATA 1*/
-
-/* Define to 1 if you have the <crypto.h> header file. */
-/* #undef HAVE_CRYPTO_H */
-
-/* Define to 1 if you have the <dlfcn.h> header file. */
-#define HAVE_DLFCN_H 1
-
-/* Define to 1 if you have the <errno.h> header file. */
-#define HAVE_ERRNO_H 1
-
-/* Define to 1 if you have the <err.h> header file. */
-#define HAVE_ERR_H 1
-
-/* Define to 1 if you have the <fcntl.h> header file. */
-#define HAVE_FCNTL_H 1
-
-/* Define to 1 if you have the fcntl function. */
-#define HAVE_FCNTL 1
-
-/* Define to 1 if you have a working fcntl O_NONBLOCK function. */
-#define HAVE_FCNTL_O_NONBLOCK 1
-
-/* Define to 1 if you have the `fork' function. */
-/*#define HAVE_FORK 1*/
-
-/* Define to 1 if you have the `ftruncate' function. */
-#define HAVE_FTRUNCATE 1
-
-/* Define if getaddrinfo exists and works */
-#define HAVE_GETADDRINFO 1
-
-/* Define to 1 if you have the `geteuid' function. */
-#define HAVE_GETEUID 1
-
-/* Define to 1 if you have the `gethostbyaddr' function. */
-#define HAVE_GETHOSTBYADDR 1
-
-/* If you have gethostbyname */
-#define HAVE_GETHOSTBYNAME 1
-
-/* Define to 1 if you have the `gethostbyname_r' function. */
-/* #undef HAVE_GETHOSTBYNAME_R */
-
-/* gethostbyname_r() takes 3 args */
-/* #undef HAVE_GETHOSTBYNAME_R_3 */
-
-/* gethostbyname_r() takes 5 args */
-/* #undef HAVE_GETHOSTBYNAME_R_5 */
-
-/* gethostbyname_r() takes 6 args */
-/* #undef HAVE_GETHOSTBYNAME_R_6 */
-
-/* Define to 1 if you have the getnameinfo function. */
-#define HAVE_GETNAMEINFO 1
-
-/* Define to 1 if you have the `getpass_r' function. */
-/* #undef HAVE_GETPASS_R */
-
-/* Define to 1 if you have the `getppid' function. */
-#define HAVE_GETPPID 1
-
-/* Define to 1 if you have the `getprotobyname' function. */
-#define HAVE_GETPROTOBYNAME 1
-
-/* Define to 1 if you have the `getpwuid' function. */
-#define HAVE_GETPWUID 1
-
-/* Define to 1 if you have the `getrlimit' function. */
-/*#define HAVE_GETRLIMIT 1*/
-
-/* Define to 1 if you have the `gettimeofday' function. */
-#define HAVE_GETTIMEOFDAY 1
-
-/* we have a glibc-style strerror_r() */
-/* #undef HAVE_GLIBC_STRERROR_R */
-
-/* Define to 1 if you have the `gmtime_r' function. */
-#define HAVE_GMTIME_R 1
-
-/* if you have the gssapi libraries */
-/* #undef HAVE_GSSAPI */
-
-/* Define to 1 if you have the <gssapi/gssapi_generic.h> header file. */
-/* #undef HAVE_GSSAPI_GSSAPI_GENERIC_H */
-
-/* Define to 1 if you have the <gssapi/gssapi.h> header file. */
-/* #undef HAVE_GSSAPI_GSSAPI_H */
-
-/* Define to 1 if you have the <gssapi/gssapi_krb5.h> header file. */
-/* #undef HAVE_GSSAPI_GSSAPI_KRB5_H */
-
-/* if you have the GNU gssapi libraries */
-/* #undef HAVE_GSSGNU */
-
-/* if you have the Heimdal gssapi libraries */
-/* #undef HAVE_GSSHEIMDAL */
-
-/* if you have the MIT gssapi libraries */
-/* #undef HAVE_GSSMIT */
-
-/* Define to 1 if you have the `idna_strerror' function. */
-/*#define HAVE_IDNA_STRERROR 1*/
-
-/* Define to 1 if you have the `idn_free' function. */
-/*#define HAVE_IDN_FREE 1*/
-
-/* Define to 1 if you have the <idn-free.h> header file. */
-/*#define HAVE_IDN_FREE_H 1*/
-
-/* Define to 1 if you have the `inet_addr' function. */
-/*#define HAVE_INET_ADDR 1*/
-
-/* Define to 1 if you have a IPv6 capable working inet_ntop function. */
-/*#define HAVE_INET_NTOP 1*/
-
-/* Define to 1 if you have a IPv6 capable working inet_pton function. */
-/*#define HAVE_INET_PTON 1*/
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-#define HAVE_INTTYPES_H 1
-
-/* Define to 1 if you have the ioctl function. */
-#define HAVE_IOCTL 1
-
-/* Define to 1 if you have a working ioctl FIONBIO function. */
-#define HAVE_IOCTL_FIONBIO 1
-
-/* Define to 1 if you have the ioctlsocket function. */
-/* #undef HAVE_IOCTLSOCKET */
-
-/* Define to 1 if you have a working ioctlsocket FIONBIO function. */
-/* #undef HAVE_IOCTLSOCKET_FIONBIO */
-
-/* Define to 1 if you have the IoctlSocket camel case function. */
-/* #undef HAVE_IOCTLSOCKET_CAMEL */
-
-/* Define to 1 if you have a working IoctlSocket camel case FIONBIO
- function. */
-/* #undef HAVE_IOCTLSOCKET_CAMEL_FIONBIO */
-
-/* Define to 1 if you have the <io.h> header file. */
-/* #undef HAVE_IO_H */
-
-/* if you have the Kerberos4 libraries (including -ldes) */
-/* #undef HAVE_KRB4 */
-
-/* Define to 1 if you have the `krb_get_our_ip_for_realm' function. */
-/* #undef HAVE_KRB_GET_OUR_IP_FOR_REALM */
-
-/* Define to 1 if you have the <krb.h> header file. */
-/* #undef HAVE_KRB_H */
-
-/* Define to 1 if you have the lber.h header file. */
-/*#define HAVE_LBER_H 1*/
-
-/* Define to 1 if you have the ldapssl.h header file. */
-/* #undef HAVE_LDAPSSL_H */
-
-/* Define to 1 if you have the ldap.h header file. */
-/*#define HAVE_LDAP_H 1*/
-
-/* Use LDAPS implementation */
-/*#define HAVE_LDAP_SSL 1*/
-
-/* Define to 1 if you have the ldap_ssl.h header file. */
-/* #undef HAVE_LDAP_SSL_H */
-
-/* Define to 1 if you have the `ldap_url_parse' function. */
-/*#define HAVE_LDAP_URL_PARSE 1*/
-
-/* Define to 1 if you have the <libgen.h> header file. */
-/*#define HAVE_LIBGEN_H 1*/
-
-/* Define to 1 if you have the `idn' library (-lidn). */
-/*#define HAVE_LIBIDN 1*/
-
-/* Define to 1 if you have the `resolv' library (-lresolv). */
-/* #undef HAVE_LIBRESOLV */
-
-/* Define to 1 if you have the `resolve' library (-lresolve). */
-/* #undef HAVE_LIBRESOLVE */
-
-/* Define to 1 if you have the `socket' library (-lsocket). */
-/* #undef HAVE_LIBSOCKET */
-
-/* Define to 1 if you have the `ssh2' library (-lssh2). */
-/*#define HAVE_LIBSSH2 1*/
-
-/* Define to 1 if you have the <libssh2.h> header file. */
-/*#define HAVE_LIBSSH2_H 1*/
-
-/* if your compiler supports LL */
-#define HAVE_LL 1
-
-/* Define to 1 if you have the <locale.h> header file. */
-#define HAVE_LOCALE_H 1
-
-/* Define to 1 if you have the `localtime_r' function. */
-#define HAVE_LOCALTIME_R 1
-
-/* Define to 1 if the compiler supports the 'long long' data type. */
-#define HAVE_LONGLONG 1
-
-/* Define to 1 if you have the malloc.h header file. */
-/*#define HAVE_MALLOC_H 1*/
-
-/* Define to 1 if you have the <memory.h> header file. */
-#define HAVE_MEMORY_H 1
-
-/* Define to 1 if you have the MSG_NOSIGNAL flag. */
-/*#define HAVE_MSG_NOSIGNAL 1*/
-
-/* Define to 1 if you have the <netdb.h> header file. */
-#define HAVE_NETDB_H 1
-
-/* Define to 1 if you have the <netinet/in.h> header file. */
-#define HAVE_NETINET_IN_H 1
-
-/* Define to 1 if you have the <netinet/tcp.h> header file. */
-/*#define HAVE_NETINET_TCP_H 1*/
-
-/* Define to 1 if you have the <net/if.h> header file. */
-#define HAVE_NET_IF_H 1
-
-/* Define to 1 if NI_WITHSCOPEID exists and works. */
-/*#define HAVE_NI_WITHSCOPEID 1*/
-
-/* we have no strerror_r() proto */
-/* #undef HAVE_NO_STRERROR_R_DECL */
-
-/* if you have an old MIT gssapi library, lacking GSS_C_NT_HOSTBASED_SERVICE
- */
-/* #undef HAVE_OLD_GSSMIT */
-
-/* Define to 1 if you have the <openssl/crypto.h> header file. */
-/*#define HAVE_OPENSSL_CRYPTO_H 1*/
-
-/* Define to 1 if you have the <openssl/err.h> header file. */
-/*#define HAVE_OPENSSL_ERR_H 1*/
-
-/* Define to 1 if you have the <openssl/pem.h> header file. */
-/*#define HAVE_OPENSSL_PEM_H 1*/
-
-/* Define to 1 if you have the <openssl/pkcs12.h> header file. */
-/*#define HAVE_OPENSSL_PKCS12_H 1*/
-
-/* Define to 1 if you have the <openssl/rsa.h> header file. */
-/*#define HAVE_OPENSSL_RSA_H 1*/
-
-/* Define to 1 if you have the <openssl/ssl.h> header file. */
-/*#define HAVE_OPENSSL_SSL_H 1*/
-
-/* Define to 1 if you have the <openssl/x509.h> header file. */
-/*#define HAVE_OPENSSL_X509_H 1*/
-
-/* Define to 1 if you have the <pem.h> header file. */
-/* #undef HAVE_PEM_H */
-
-/* Define to 1 if you have the `perror' function. */
-#define HAVE_PERROR 1
-
-/* Define to 1 if you have the `pipe' function. */
-#define HAVE_PIPE 1
-
-/* Define to 1 if you have the `poll' function. */
-/*#define HAVE_POLL 1*/
-
-/* If you have a fine poll */
-/*#define HAVE_POLL_FINE 1*/
-
-/* Define to 1 if you have the <poll.h> header file. */
-/*#define HAVE_POLL_H 1*/
-
-/* we have a POSIX-style strerror_r() */
-#define HAVE_POSIX_STRERROR_R 1
-
-/* Define to 1 if you have the <pwd.h> header file. */
-#define HAVE_PWD_H 1
-
-/* Define to 1 if you have the `RAND_egd' function. */
-#define HAVE_RAND_EGD 1
-
-/* Define to 1 if you have the `RAND_screen' function. */
-/* #undef HAVE_RAND_SCREEN */
-
-/* Define to 1 if you have the `RAND_status' function. */
-/*#define HAVE_RAND_STATUS 1*/
-
-/* Define to 1 if you have the recv function. */
-#define HAVE_RECV 1
-
-/* Define to 1 if you have the recvfrom function. */
-#define HAVE_RECVFROM 1
-
-/* Define to 1 if you have the <rsa.h> header file. */
-/* #undef HAVE_RSA_H */
-
-/* Define to 1 if you have the select function. */
-#define HAVE_SELECT 1
-
-/* Define to 1 if you have the send function. */
-#define HAVE_SEND 1
-
-/* Define to 1 if you have the <setjmp.h> header file. */
-#define HAVE_SETJMP_H 1
-
-/* Define to 1 if you have the `setlocale' function. */
-#define HAVE_SETLOCALE 1
-
-/* Define to 1 if you have the `setmode' function. */
-/* #undef HAVE_SETMODE */
-
-/* Define to 1 if you have the `setrlimit' function. */
-/*#define HAVE_SETRLIMIT 1*/
-
-/* Define to 1 if you have the setsockopt function. */
-/* #undef HAVE_SETSOCKOPT */
-
-/* Define to 1 if you have a working setsockopt SO_NONBLOCK function. */
-/* #undef HAVE_SETSOCKOPT_SO_NONBLOCK */
-
-/* Define to 1 if you have the <sgtty.h> header file. */
-/*#define HAVE_SGTTY_H 1*/
-
-/* Define to 1 if you have the `sigaction' function. */
-/*#define HAVE_SIGACTION 1*/
-
-/* Define to 1 if you have the `siginterrupt' function. */
-/*#define HAVE_SIGINTERRUPT 1*/
-
-/* Define to 1 if you have the `signal' function. */
-/*#define HAVE_SIGNAL 1*/
-
-/* Define to 1 if you have the <signal.h> header file. */
-#define HAVE_SIGNAL_H 1
-
-/* If you have sigsetjmp */
-/*#define HAVE_SIGSETJMP 1*/
-
-/* Define to 1 if sig_atomic_t is an available typedef. */
-/*#define HAVE_SIG_ATOMIC_T 1*/
-
-/* Define to 1 if sig_atomic_t is already defined as volatile. */
-/* #undef HAVE_SIG_ATOMIC_T_VOLATILE */
-
-/* Define to 1 if you have the `socket' function. */
-#define HAVE_SOCKET 1
-
-/* Define to 1 if you have the <ssl.h> header file. */
-/* #undef HAVE_SSL_H */
-
-/* Define to 1 if you have the <stdbool.h> header file. */
-#define HAVE_STDBOOL_H 1
-
-/* Define to 1 if you have the <stdint.h> header file. */
-#define HAVE_STDINT_H 1
-
-/* Define to 1 if you have the <stdio.h> header file. */
-#define HAVE_STDIO_H 1
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#define HAVE_STDLIB_H 1
-
-/* Define to 1 if you have the `strcasecmp' function. */
-#define HAVE_STRCASECMP 1
-
-/* Define to 1 if you have the `strcmpi' function. */
-/* #undef HAVE_STRCMPI */
-
-/* Define to 1 if you have the `strdup' function. */
-#define HAVE_STRDUP 1
-
-/* Define to 1 if you have the `strerror_r' function. */
-#define HAVE_STRERROR_R 1
-
-/* Define to 1 if you have the `stricmp' function. */
-/* #undef HAVE_STRICMP */
-
-/* Define to 1 if you have the <strings.h> header file. */
-#define HAVE_STRINGS_H 1
-
-/* Define to 1 if you have the <string.h> header file. */
-#define HAVE_STRING_H 1
-
-/* Define to 1 if you have the `strlcpy' function. */
-#define HAVE_STRLCPY 1
-
-/* Define to 1 if you have the `strstr' function. */
-#define HAVE_STRSTR 1
-
-/* Define to 1 if you have the `strtok_r' function. */
-#define HAVE_STRTOK_R 1
-
-/* Define to 1 if you have the `strtoll' function. */
-#define HAVE_STRTOLL 1
-
-/* if struct sockaddr_storage is defined */
-#define HAVE_STRUCT_SOCKADDR_STORAGE 1
-
-/* Define to 1 if you have the timeval struct. */
-#define HAVE_STRUCT_TIMEVAL 1
-
-/* Define to 1 if you have the <sys/filio.h> header file. */
-#define HAVE_SYS_FILIO_H 1
-
-/* Define to 1 if you have the <sys/ioctl.h> header file. */
-#define HAVE_SYS_IOCTL_H 1
-
-/* Define to 1 if you have the <sys/param.h> header file. */
-#define HAVE_SYS_PARAM_H 1
-
-/* Define to 1 if you have the <sys/poll.h> header file. */
-/*#define HAVE_SYS_POLL_H 1*/
-
-/* Define to 1 if you have the <sys/resource.h> header file. */
-#define HAVE_SYS_RESOURCE_H 1
-
-/* Define to 1 if you have the <sys/select.h> header file. */
-#define HAVE_SYS_SELECT_H 1
-
-/* Define to 1 if you have the <sys/socket.h> header file. */
-#define HAVE_SYS_SOCKET_H 1
-
-/* Define to 1 if you have the <sys/sockio.h> header file. */
-#define HAVE_SYS_SOCKIO_H 1
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-#define HAVE_SYS_STAT_H 1
-
-/* Define to 1 if you have the <sys/time.h> header file. */
-#define HAVE_SYS_TIME_H 1
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#define HAVE_SYS_TYPES_H 1
-
-/* Define to 1 if you have the <sys/utime.h> header file. */
-/* #undef HAVE_SYS_UTIME_H */
-
-/* Define to 1 if you have the <termios.h> header file. */
-/*#define HAVE_TERMIOS_H 1*/
-
-/* Define to 1 if you have the <termio.h> header file. */
-/*#define HAVE_TERMIO_H 1*/
-
-/* Define to 1 if you have the <time.h> header file. */
-#define HAVE_TIME_H 1
-
-/* Define to 1 if you have the <tld.h> header file. */
-/*#define HAVE_TLD_H 1*/
-
-/* Define to 1 if you have the `tld_strerror' function. */
-/*#define HAVE_TLD_STRERROR 1*/
-
-/* Define to 1 if you have the `uname' function. */
-#define HAVE_UNAME 1
-
-/* Define to 1 if you have the <unistd.h> header file. */
-#define HAVE_UNISTD_H 1
-
-/* Define to 1 if you have the `utime' function. */
-#define HAVE_UTIME 1
-
-/* Define to 1 if you have the <utime.h> header file. */
-#define HAVE_UTIME_H 1
-
-/* Define to 1 if compiler supports C99 variadic macro style. */
-#define HAVE_VARIADIC_MACROS_C99 1
-
-/* Define to 1 if compiler supports old gcc variadic macro style. */
-/*#define HAVE_VARIADIC_MACROS_GCC 1*/
-
-/* Define to 1 if you have the winber.h header file. */
-/* #undef HAVE_WINBER_H */
-
-/* Define to 1 if you have the windows.h header file. */
-/* #undef HAVE_WINDOWS_H */
-
-/* Define to 1 if you have the winldap.h header file. */
-/* #undef HAVE_WINLDAP_H */
-
-/* Define to 1 if you have the winsock2.h header file. */
-/* #undef HAVE_WINSOCK2_H */
-
-/* Define to 1 if you have the winsock.h header file. */
-/* #undef HAVE_WINSOCK_H */
-
-/* Define this symbol if your OS supports changing the contents of argv */
-/*#define HAVE_WRITABLE_ARGV 1*/
-
-/* Define to 1 if you have the ws2tcpip.h header file. */
-/* #undef HAVE_WS2TCPIP_H */
-
-/* Define to 1 if you have the <x509.h> header file. */
-/* #undef HAVE_X509_H */
-
-/* Define to 1 if you need the lber.h header file even with ldap.h */
-/* #undef NEED_LBER_H */
-
-/* Define to 1 if you need the malloc.h header file even with stdlib.h */
-/* #undef NEED_MALLOC_H */
-
-/* Define to 1 if _REENTRANT preprocessor symbol must be defined. */
-/* #undef NEED_REENTRANT */
-
-/* Define to 1 if _THREAD_SAFE preprocessor symbol must be defined. */
-/* #undef NEED_THREAD_SAFE */
-
-/* cpu-machine-OS */
-#ifdef __WINS__
-#define OS "i386-pc-epoc32"
-#elif __MARM__
-#define OS "arm-unknown-epoc32"
-#else
-/* This won't happen on any current Symbian version */
-#define OS "unknown-unknown-epoc32"
-#endif
-
-/* Name of package */
-/*#define PACKAGE "curl"*/
-
-/* Define to the address where bug reports for this package should be sent. */
-/*#define PACKAGE_BUGREPORT \
- "a suitable curl mailing list => https://curl.haxx.se/mail/"*/
-
-/* Define to the full name of this package. */
-/*#define PACKAGE_NAME "curl"*/
-
-/* Define to the full name and version of this package. */
-/*#define PACKAGE_STRING "curl -"*/
-
-/* Define to the one symbol short name of this package. */
-/*#define PACKAGE_TARNAME "curl"*/
-
-/* Define to the version of this package. */
-/*#define PACKAGE_VERSION "-"*/
-
-/* a suitable file to read random data from */
-/*#define RANDOM_FILE "/dev/urandom"*/
-
-#define RECV_TYPE_ARG1 int
-#define RECV_TYPE_ARG2 void *
-#define RECV_TYPE_ARG3 size_t
-#define RECV_TYPE_ARG4 int
-#define RECV_TYPE_RETV ssize_t
-
-#define RECVFROM_TYPE_ARG1 int
-#define RECVFROM_TYPE_ARG2 void
-#define RECVFROM_TYPE_ARG3 size_t
-#define RECVFROM_TYPE_ARG4 int
-#define RECVFROM_TYPE_ARG5 struct sockaddr
-#define RECVFROM_TYPE_ARG6 size_t
-#define RECVFROM_TYPE_RETV ssize_t
-#define RECVFROM_TYPE_ARG2_IS_VOID 1
-
-#define SEND_TYPE_ARG1 int
-#define SEND_QUAL_ARG2 const
-#define SEND_TYPE_ARG2 void *
-#define SEND_TYPE_ARG3 size_t
-#define SEND_TYPE_ARG4 int
-#define SEND_TYPE_RETV ssize_t
-
-
-/* Define as the return type of signal handlers (`int' or `void'). */
-/*#define RETSIGTYPE void*/
-
-/* Define to the type of arg 1 for `select'. */
-#define SELECT_TYPE_ARG1 int
-
-/* Define to the type of args 2, 3 and 4 for `select'. */
-#define SELECT_TYPE_ARG234 (fd_set *)
-
-/* Define to the type of arg 5 for `select'. */
-#define SELECT_TYPE_ARG5 (struct timeval *)
-
-/* The size of `int', as computed by sizeof. */
-#define SIZEOF_INT 4
-
-/* The size of `off_t', as computed by sizeof. */
-#define SIZEOF_OFF_T 8
-
-/* The size of `short', as computed by sizeof. */
-#define SIZEOF_SHORT 2
-
-/* The size of `size_t', as computed by sizeof. */
-#define SIZEOF_SIZE_T 4
-
-/* The size of `time_t', as computed by sizeof. */
-#define SIZEOF_TIME_T 4
-
-/* Define to 1 if you have the ANSI C header files. */
-#define STDC_HEADERS 1
-
-/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
-#define TIME_WITH_SYS_TIME 1
-
-/* Define if you want to enable c-ares support */
-/* #undef USE_ARES */
-
-/* Define to disable non-blocking sockets */
-/* #undef USE_BLOCKING_SOCKETS */
-
-/* if GnuTLS is enabled */
-/* #undef USE_GNUTLS */
-
-/* if libSSH2 is in use */
-/*#define USE_LIBSSH2 1*/
-
-/* If you want to build curl with the built-in manual */
-/*#define USE_MANUAL 1*/
-
-/* if NSS is enabled */
-/* #undef USE_NSS */
-
-/* to enable SSPI support */
-/* #undef USE_WINDOWS_SSPI */
-
-/* Define to 1 if using yaSSL in OpenSSL compatibility mode. */
-/* #undef USE_YASSLEMUL */
-
-/* Version number of package */
-/*#define VERSION "7.18.2-CVS"*/
-
-/* Define to avoid automatic inclusion of winsock.h */
-/* #undef WIN32_LEAN_AND_MEAN */
-
-/* Define to 1 if on AIX 3.
- System headers sometimes define this.
- We just want to avoid a redefinition error message. */
-#ifndef _ALL_SOURCE
-/* # undef _ALL_SOURCE */
-#endif
-
-/* Number of bits in a file offset, on hosts where this is settable. */
-#define _FILE_OFFSET_BITS 64
-
-/* Define for large files, on AIX-style hosts. */
-/* #undef _LARGE_FILES */
-
-/* Define to empty if `const' does not conform to ANSI C. */
-/* #undef const */
-
-/* type to use in place of in_addr_t if not defined */
-/* #undef in_addr_t */
-
-/* Define to `__inline__' or `__inline' if that's what the C compiler
- calls it, or to nothing if 'inline' is not supported under any name. */
-#ifndef __cplusplus
-/* #undef inline */
-#endif
-
-/* Define to `unsigned int' if <sys/types.h> does not define. */
-/* #undef size_t */
-
-/* the signed version of size_t */
-/* #undef ssize_t */
-
-/* Enabling curl debug mode when building in Symbian debug mode would work */
-/* except that debug mode introduces new exports that must be frozen. */
-#ifdef _DEBUG
-/* #define CURLDEBUG */
-#endif
-
-/* sys/cdefs.h fails to define this for WINSCW prior to Symbian OS ver. 9.4 */
-#ifndef __LONG_LONG_SUPPORTED
-#define __LONG_LONG_SUPPORTED
-#endif
-
-/* Enable appropriate header only when zlib support is enabled */
-#ifdef HAVE_LIBZ
-#define HAVE_ZLIB_H 1
-#endif
-
-#endif /* HEADER_CURL_CONFIG_SYMBIAN_H */
diff --git a/lib/conncache.c b/lib/conncache.c
index d21a00cf..c0e4d3e3 100644
--- a/lib/conncache.c
+++ b/lib/conncache.c
@@ -59,7 +59,7 @@ static CURLcode bundle_create(struct connectbundle **bundlep)
(*bundlep)->num_connections = 0;
(*bundlep)->multiuse = BUNDLE_UNKNOWN;
- Curl_llist_init(&(*bundlep)->conn_list, (curl_llist_dtor) conn_llist_dtor);
+ Curl_llist_init(&(*bundlep)->conn_list, (Curl_llist_dtor) conn_llist_dtor);
return CURLE_OK;
}
@@ -87,7 +87,7 @@ static void bundle_add_conn(struct connectbundle *bundle,
static int bundle_remove_conn(struct connectbundle *bundle,
struct connectdata *conn)
{
- struct curl_llist_element *curr;
+ struct Curl_llist_element *curr;
curr = bundle->conn_list.head;
while(curr) {
@@ -206,8 +206,8 @@ static bool conncache_add_bundle(struct conncache *connc,
static void conncache_remove_bundle(struct conncache *connc,
struct connectbundle *bundle)
{
- struct curl_hash_iterator iter;
- struct curl_hash_element *he;
+ struct Curl_hash_iterator iter;
+ struct Curl_hash_element *he;
if(!connc)
return;
@@ -320,9 +320,9 @@ bool Curl_conncache_foreach(struct Curl_easy *data,
void *param,
int (*func)(struct connectdata *conn, void *param))
{
- struct curl_hash_iterator iter;
- struct curl_llist_element *curr;
- struct curl_hash_element *he;
+ struct Curl_hash_iterator iter;
+ struct Curl_llist_element *curr;
+ struct Curl_hash_element *he;
if(!connc)
return FALSE;
@@ -363,15 +363,15 @@ bool Curl_conncache_foreach(struct Curl_easy *data,
static struct connectdata *
conncache_find_first_connection(struct conncache *connc)
{
- struct curl_hash_iterator iter;
- struct curl_hash_element *he;
+ struct Curl_hash_iterator iter;
+ struct Curl_hash_element *he;
struct connectbundle *bundle;
Curl_hash_start_iterate(&connc->hash, &iter);
he = Curl_hash_next_element(&iter);
while(he) {
- struct curl_llist_element *curr;
+ struct Curl_llist_element *curr;
bundle = he->ptr;
curr = bundle->conn_list.head;
@@ -429,7 +429,7 @@ struct connectdata *
Curl_conncache_extract_bundle(struct Curl_easy *data,
struct connectbundle *bundle)
{
- struct curl_llist_element *curr;
+ struct Curl_llist_element *curr;
timediff_t highscore = -1;
timediff_t score;
struct curltime now;
@@ -477,9 +477,9 @@ struct connectdata *
Curl_conncache_extract_oldest(struct Curl_easy *data)
{
struct conncache *connc = data->state.conn_cache;
- struct curl_hash_iterator iter;
- struct curl_llist_element *curr;
- struct curl_hash_element *he;
+ struct Curl_hash_iterator iter;
+ struct Curl_llist_element *curr;
+ struct Curl_hash_element *he;
timediff_t highscore =- 1;
timediff_t score;
struct curltime now;
@@ -571,9 +571,9 @@ void Curl_conncache_close_all_connections(struct conncache *connc)
/* Useful for debugging the connection cache */
void Curl_conncache_print(struct conncache *connc)
{
- struct curl_hash_iterator iter;
- struct curl_llist_element *curr;
- struct curl_hash_element *he;
+ struct Curl_hash_iterator iter;
+ struct Curl_llist_element *curr;
+ struct Curl_hash_element *he;
if(!connc)
return;
diff --git a/lib/conncache.h b/lib/conncache.h
index 3dda21cd..c3e9ff51 100644
--- a/lib/conncache.h
+++ b/lib/conncache.h
@@ -30,7 +30,7 @@
*/
struct conncache {
- struct curl_hash hash;
+ struct Curl_hash hash;
size_t num_conn;
long next_connection_id;
struct curltime last_cleanup;
@@ -66,7 +66,7 @@ struct conncache {
struct connectbundle {
int multiuse; /* supports multi-use */
size_t num_connections; /* Number of connections in the bundle */
- struct curl_llist conn_list; /* The connectdata members of the bundle */
+ struct Curl_llist conn_list; /* The connectdata members of the bundle */
};
/* returns 1 on error, 0 is fine */
diff --git a/lib/connect.c b/lib/connect.c
index b000b1b2..5f23b79c 100644
--- a/lib/connect.c
+++ b/lib/connect.c
@@ -83,11 +83,6 @@
#include "curl_memory.h"
#include "memdebug.h"
-#ifdef __SYMBIAN32__
-/* This isn't actually supported under Symbian OS */
-#undef SO_NOSIGPIPE
-#endif
-
static bool verifyconnect(curl_socket_t sockfd, int *error);
#if defined(__DragonFly__) || defined(HAVE_WINSOCK_H)
@@ -746,8 +741,8 @@ static CURLcode connect_SOCKS(struct connectdata *conn, int sockindex,
bool *done)
{
CURLcode result = CURLE_OK;
-
#ifndef CURL_DISABLE_PROXY
+ CURLproxycode pxresult = CURLPX_OK;
if(conn->bits.socksproxy) {
/* for the secondary socket (FTP), use the "connect to host"
* but ignore the "connect to port" (use the secondary port)
@@ -767,20 +762,24 @@ static CURLcode connect_SOCKS(struct connectdata *conn, int sockindex,
switch(conn->socks_proxy.proxytype) {
case CURLPROXY_SOCKS5:
case CURLPROXY_SOCKS5_HOSTNAME:
- result = Curl_SOCKS5(conn->socks_proxy.user, conn->socks_proxy.passwd,
- host, port, sockindex, conn, done);
+ pxresult = Curl_SOCKS5(conn->socks_proxy.user, conn->socks_proxy.passwd,
+ host, port, sockindex, conn, done);
break;
case CURLPROXY_SOCKS4:
case CURLPROXY_SOCKS4A:
- result = Curl_SOCKS4(conn->socks_proxy.user, host, port, sockindex,
- conn, done);
+ pxresult = Curl_SOCKS4(conn->socks_proxy.user, host, port, sockindex,
+ conn, done);
break;
default:
failf(conn->data, "unknown proxytype option given");
result = CURLE_COULDNT_CONNECT;
} /* switch proxytype */
+ if(pxresult) {
+ result = CURLE_PROXY;
+ conn->data->info.pxcode = pxresult;
+ }
}
else
#else
@@ -1313,10 +1312,9 @@ CURLcode Curl_connecthost(struct connectdata *conn, /* context */
const struct Curl_dns_entry *remotehost)
{
struct Curl_easy *data = conn->data;
- struct curltime before = Curl_now();
CURLcode result = CURLE_COULDNT_CONNECT;
int i;
- timediff_t timeout_ms = Curl_timeleft(data, &before, TRUE);
+ timediff_t timeout_ms = Curl_timeleft(data, NULL, TRUE);
if(timeout_ms < 0) {
/* a precaution, no need to continue if time already is up */
@@ -1416,8 +1414,7 @@ curl_socket_t Curl_getconnectinfo(struct Curl_easy *data,
}
return c->sock[FIRSTSOCKET];
}
- else
- return CURL_SOCKET_BAD;
+ return CURL_SOCKET_BAD;
}
/*
diff --git a/lib/content_encoding.c b/lib/content_encoding.c
index 2fc3d43c..a6dce488 100644
--- a/lib/content_encoding.c
+++ b/lib/content_encoding.c
@@ -28,10 +28,6 @@
#ifdef HAVE_ZLIB_H
#include <zlib.h>
-#ifdef __SYMBIAN32__
-/* zlib pollutes the namespace with this definition */
-#undef WIN32
-#endif
#endif
#ifdef HAVE_BROTLI
diff --git a/lib/curl_config.h b/lib/curl_config.h
index 27ff251e..2476fc28 100644
--- a/lib/curl_config.h
+++ b/lib/curl_config.h
@@ -34,6 +34,9 @@
/* to disable FTP */
#define CURL_DISABLE_FTP 1
+/* to disable curl_easy_options */
+/* #undef CURL_DISABLE_GETOPTIONS */
+
/* to disable Gopher */
#define CURL_DISABLE_GOPHER 1
@@ -58,6 +61,9 @@
/* disable mime API */
/* #undef CURL_DISABLE_MIME */
+/* to disable MQTT */
+/* #undef CURL_DISABLE_MQTT */
+
/* disable netrc parsing */
/* #undef CURL_DISABLE_NETRC */
@@ -88,6 +94,9 @@
/* to disable SMTP */
#define CURL_DISABLE_SMTP 1
+/* to disable socketpair support */
+/* #undef CURL_DISABLE_SOCKETPAIR */
+
/* to disable TELNET */
#define CURL_DISABLE_TELNET 1
@@ -97,9 +106,6 @@
/* to disable verbose strings */
/* #undef CURL_DISABLE_VERBOSE_STRINGS */
-/* to enable MQTT */
-/* #undef CURL_ENABLE_MQTT */
-
/* Definition to make a library symbol externally visible. */
#define CURL_EXTERN_SYMBOL __attribute__ ((__visibility__ ("default")))
@@ -634,8 +640,8 @@
/* Define to 1 if you have the `SSLv2_client_method' function. */
/* #undef HAVE_SSLV2_CLIENT_METHOD */
-/* Define to 1 if you have the `SSL_get_esni_status' function. */
-/* #undef HAVE_SSL_GET_ESNI_STATUS */
+/* Define to 1 if you have the `SSL_get_ech_status' function. */
+/* #undef HAVE_SSL_GET_ECH_STATUS */
/* Define to 1 if you have the <ssl.h> header file. */
/* #undef HAVE_SSL_H */
@@ -961,8 +967,8 @@
/* if BearSSL is enabled */
/* #undef USE_BEARSSL */
-/* if ESNI support is available */
-/* #undef USE_ESNI */
+/* if ECH support is available */
+/* #undef USE_ECH */
/* if GnuTLS is enabled */
/* #undef USE_GNUTLS */
diff --git a/lib/curl_config.h.cmake b/lib/curl_config.h.cmake
index dd870789..eca3734b 100644
--- a/lib/curl_config.h.cmake
+++ b/lib/curl_config.h.cmake
@@ -63,8 +63,8 @@
/* to disable LDAPS */
#cmakedefine CURL_DISABLE_LDAPS 1
-/* to enable MQTT */
-#undef CURL_ENABLE_MQTT
+/* to disable MQTT */
+#cmakedefine CURL_DISABLE_MQTT 1
/* to disable POP3 */
#cmakedefine CURL_DISABLE_POP3 1
diff --git a/lib/curl_config.h.in b/lib/curl_config.h.in
index 2f5511a7..ab8651a5 100644
--- a/lib/curl_config.h.in
+++ b/lib/curl_config.h.in
@@ -33,6 +33,9 @@
/* to disable FTP */
#undef CURL_DISABLE_FTP
+/* to disable curl_easy_options */
+#undef CURL_DISABLE_GETOPTIONS
+
/* to disable Gopher */
#undef CURL_DISABLE_GOPHER
@@ -57,6 +60,9 @@
/* disable mime API */
#undef CURL_DISABLE_MIME
+/* to disable MQTT */
+#undef CURL_DISABLE_MQTT
+
/* disable netrc parsing */
#undef CURL_DISABLE_NETRC
@@ -87,6 +93,9 @@
/* to disable SMTP */
#undef CURL_DISABLE_SMTP
+/* to disable socketpair support */
+#undef CURL_DISABLE_SOCKETPAIR
+
/* to disable TELNET */
#undef CURL_DISABLE_TELNET
@@ -96,9 +105,6 @@
/* to disable verbose strings */
#undef CURL_DISABLE_VERBOSE_STRINGS
-/* to enable MQTT */
-#undef CURL_ENABLE_MQTT
-
/* Definition to make a library symbol externally visible. */
#undef CURL_EXTERN_SYMBOL
@@ -633,8 +639,8 @@
/* Define to 1 if you have the `SSLv2_client_method' function. */
#undef HAVE_SSLV2_CLIENT_METHOD
-/* Define to 1 if you have the `SSL_get_esni_status' function. */
-#undef HAVE_SSL_GET_ESNI_STATUS
+/* Define to 1 if you have the `SSL_get_ech_status' function. */
+#undef HAVE_SSL_GET_ECH_STATUS
/* Define to 1 if you have the <ssl.h> header file. */
#undef HAVE_SSL_H
@@ -978,8 +984,8 @@
/* if BearSSL is enabled */
#undef USE_BEARSSL
-/* if ESNI support is available */
-#undef USE_ESNI
+/* if ECH support is available */
+#undef USE_ECH
/* if GnuTLS is enabled */
#undef USE_GNUTLS
diff --git a/lib/curl_get_line.c b/lib/curl_get_line.c
index c4194851..3c77be9a 100644
--- a/lib/curl_get_line.c
+++ b/lib/curl_get_line.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -22,6 +22,8 @@
#include "curl_setup.h"
+#if !defined(CURL_DISABLE_COOKIES) && !defined(CURL_DISABLE_ALTSVC)
+
#include "curl_get_line.h"
#include "curl_memory.h"
/* The last #include file should be: */
@@ -53,3 +55,5 @@ char *Curl_get_line(char *buf, int len, FILE *input)
}
return NULL;
}
+
+#endif /* if not disabled */
diff --git a/lib/curl_gethostname.c b/lib/curl_gethostname.c
index 8337c72e..5f1c9998 100644
--- a/lib/curl_gethostname.c
+++ b/lib/curl_gethostname.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -48,7 +48,7 @@
* For libcurl static library release builds no overriding takes place.
*/
-int Curl_gethostname(char *name, GETHOSTNAME_TYPE_ARG2 namelen)
+int Curl_gethostname(char * const name, GETHOSTNAME_TYPE_ARG2 namelen)
{
#ifndef HAVE_GETHOSTNAME
diff --git a/lib/curl_gethostname.h b/lib/curl_gethostname.h
index 8ae15e6c..2d78bc54 100644
--- a/lib/curl_gethostname.h
+++ b/lib/curl_gethostname.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -26,6 +26,6 @@
#define HOSTNAME_MAX 1024
/* This returns the local machine's un-qualified hostname */
-int Curl_gethostname(char *name, GETHOSTNAME_TYPE_ARG2 namelen);
+int Curl_gethostname(char * const name, GETHOSTNAME_TYPE_ARG2 namelen);
#endif /* HEADER_CURL_GETHOSTNAME_H */
diff --git a/lib/curl_sec.h b/lib/curl_krb5.h
index 7bdde269..ae9b7e0d 100644
--- a/lib/curl_sec.h
+++ b/lib/curl_krb5.h
@@ -1,5 +1,5 @@
-#ifndef HEADER_CURL_SECURITY_H
-#define HEADER_CURL_SECURITY_H
+#ifndef HEADER_CURL_KRB5_H
+#define HEADER_CURL_KRB5_H
/***************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -44,8 +44,8 @@ int Curl_sec_read_msg(struct connectdata *conn, char *,
void Curl_sec_end(struct connectdata *);
CURLcode Curl_sec_login(struct connectdata *);
int Curl_sec_request_prot(struct connectdata *conn, const char *level);
-
-extern struct Curl_sec_client_mech Curl_krb5_client_mech;
+#else
+#define Curl_sec_end(x)
#endif
-#endif /* HEADER_CURL_SECURITY_H */
+#endif /* HEADER_CURL_KRB5_H */
diff --git a/lib/curl_ntlm_core.c b/lib/curl_ntlm_core.c
index 0eefb158..defae772 100644
--- a/lib/curl_ntlm_core.c
+++ b/lib/curl_ntlm_core.c
@@ -22,7 +22,7 @@
#include "curl_setup.h"
-#if defined(USE_NTLM)
+#if defined(USE_CURL_NTLM_CORE)
/*
* NTLM details:
@@ -50,8 +50,6 @@
in NTLM type-3 messages.
*/
-#if !defined(USE_WINDOWS_SSPI) || defined(USE_WIN32_CRYPTO)
-
#if defined(USE_OPENSSL) || defined(USE_WOLFSSL)
#ifdef USE_WOLFSSL
@@ -744,6 +742,4 @@ CURLcode Curl_ntlm_core_mk_lmv2_resp(unsigned char *ntlmv2hash,
#endif /* USE_NTRESPONSES */
-#endif /* !USE_WINDOWS_SSPI || USE_WIN32_CRYPTO */
-
-#endif /* USE_NTLM */
+#endif /* USE_CURL_NTLM_CORE */
diff --git a/lib/curl_ntlm_core.h b/lib/curl_ntlm_core.h
index 7895b647..6d391c4c 100644
--- a/lib/curl_ntlm_core.h
+++ b/lib/curl_ntlm_core.h
@@ -24,7 +24,7 @@
#include "curl_setup.h"
-#if defined(USE_NTLM)
+#if defined(USE_CURL_NTLM_CORE)
/* If NSS is the first available SSL backend (see order in curl_ntlm_core.c)
then it must be initialized to be used by NTLM. */
@@ -36,8 +36,6 @@
#define NTLM_NEEDS_NSS_INIT
#endif
-#if !defined(USE_WINDOWS_SSPI) || defined(USE_WIN32_CRYPTO)
-
#if defined(USE_OPENSSL) || defined(USE_WOLFSSL)
#ifdef USE_WOLFSSL
# include <wolfssl/options.h>
@@ -102,8 +100,6 @@ CURLcode Curl_ntlm_core_mk_lmv2_resp(unsigned char *ntlmv2hash,
#endif /* USE_NTRESPONSES */
-#endif /* !USE_WINDOWS_SSPI || USE_WIN32_CRYPTO */
-
-#endif /* USE_NTLM */
+#endif /* USE_CURL_NTLM_CORE */
#endif /* HEADER_CURL_NTLM_CORE_H */
diff --git a/lib/curl_path.c b/lib/curl_path.c
index fbd98cb3..7b3fb27a 100644
--- a/lib/curl_path.c
+++ b/lib/curl_path.c
@@ -168,7 +168,7 @@ CURLcode Curl_get_pathname(const char **cpp, char **path, char *homedir)
*cpp = cp + i + strspn(cp + i, WHITESPACE);
}
else {
- /* Read to end of filename - either to white space or terminator */
+ /* Read to end of filename - either to whitespace or terminator */
end = strpbrk(cp, WHITESPACE);
if(end == NULL)
end = strchr(cp, '\0');
@@ -184,7 +184,7 @@ CURLcode Curl_get_pathname(const char **cpp, char **path, char *homedir)
(*path)[pathLength] = '\0';
cp += 3;
}
- /* Copy path name up until first "white space" */
+ /* Copy path name up until first "whitespace" */
memcpy(&(*path)[pathLength], cp, (int)(end - cp));
pathLength += (int)(end - cp);
(*path)[pathLength] = '\0';
diff --git a/lib/curl_printf.h b/lib/curl_printf.h
index 0d37b8e5..9d2de7ba 100644
--- a/lib/curl_printf.h
+++ b/lib/curl_printf.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/lib/curl_rtmp.c b/lib/curl_rtmp.c
index df8f2b1d..32f11130 100644
--- a/lib/curl_rtmp.c
+++ b/lib/curl_rtmp.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2012 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2012 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
* Copyright (C) 2010, Howard Chu, <hyc@highlandsun.com>
*
* This software is licensed as described in the file COPYING, which
@@ -79,6 +79,7 @@ const struct Curl_handler Curl_handler_rtmp = {
ZERO_NULL, /* connection_check */
PORT_RTMP, /* defport */
CURLPROTO_RTMP, /* protocol */
+ CURLPROTO_RTMP, /* family */
PROTOPT_NONE /* flags*/
};
@@ -100,6 +101,7 @@ const struct Curl_handler Curl_handler_rtmpt = {
ZERO_NULL, /* connection_check */
PORT_RTMPT, /* defport */
CURLPROTO_RTMPT, /* protocol */
+ CURLPROTO_RTMPT, /* family */
PROTOPT_NONE /* flags*/
};
@@ -121,6 +123,7 @@ const struct Curl_handler Curl_handler_rtmpe = {
ZERO_NULL, /* connection_check */
PORT_RTMP, /* defport */
CURLPROTO_RTMPE, /* protocol */
+ CURLPROTO_RTMPE, /* family */
PROTOPT_NONE /* flags*/
};
@@ -142,6 +145,7 @@ const struct Curl_handler Curl_handler_rtmpte = {
ZERO_NULL, /* connection_check */
PORT_RTMPT, /* defport */
CURLPROTO_RTMPTE, /* protocol */
+ CURLPROTO_RTMPTE, /* family */
PROTOPT_NONE /* flags*/
};
@@ -163,6 +167,7 @@ const struct Curl_handler Curl_handler_rtmps = {
ZERO_NULL, /* connection_check */
PORT_RTMPS, /* defport */
CURLPROTO_RTMPS, /* protocol */
+ CURLPROTO_RTMP, /* family */
PROTOPT_NONE /* flags*/
};
@@ -184,6 +189,7 @@ const struct Curl_handler Curl_handler_rtmpts = {
ZERO_NULL, /* connection_check */
PORT_RTMPS, /* defport */
CURLPROTO_RTMPTS, /* protocol */
+ CURLPROTO_RTMPT, /* family */
PROTOPT_NONE /* flags*/
};
diff --git a/lib/curl_setup.h b/lib/curl_setup.h
index 21c3f348..3872dbb6 100644
--- a/lib/curl_setup.h
+++ b/lib/curl_setup.h
@@ -38,8 +38,7 @@
* Define WIN32 when build target is Win32 API
*/
-#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32) && \
- !defined(__SYMBIAN32__)
+#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32)
#define WIN32
#endif
@@ -88,10 +87,6 @@
# include "config-amigaos.h"
#endif
-#ifdef __SYMBIAN32__
-# include "config-symbian.h"
-#endif
-
#ifdef __OS400__
# include "config-os400.h"
#endif
@@ -560,14 +555,6 @@
/* ---------------------------------------------------------------- */
/*
- * When using WINSOCK, TELNET protocol requires WINSOCK2 API.
- */
-
-#if defined(USE_WINSOCK) && (USE_WINSOCK != 2)
-# define CURL_DISABLE_TELNET 1
-#endif
-
-/*
* msvc 6.0 does not have struct sockaddr_storage and
* does not define IPPROTO_ESP in winsock2.h. But both
* are available if PSDK is properly installed.
@@ -637,13 +624,12 @@ int netware_init(void);
/* Single point where USE_NTLM definition might be defined */
#if !defined(CURL_DISABLE_NTLM) && !defined(CURL_DISABLE_CRYPTO_AUTH)
-#if defined(USE_OPENSSL) || defined(USE_WINDOWS_SSPI) || \
+#if defined(USE_OPENSSL) || defined(USE_MBEDTLS) || \
defined(USE_GNUTLS) || defined(USE_NSS) || defined(USE_SECTRANSP) || \
defined(USE_OS400CRYPTO) || defined(USE_WIN32_CRYPTO) || \
- defined(USE_MBEDTLS) || \
(defined(USE_WOLFSSL) && defined(HAVE_WOLFSSL_DES_ECB_ENCRYPT))
-#define USE_NTLM
+#define USE_CURL_NTLM_CORE
# if defined(USE_MBEDTLS)
/* Get definition of MBEDTLS_MD4_C */
@@ -651,6 +637,10 @@ int netware_init(void);
# endif
#endif
+
+#if defined(USE_CURL_NTLM_CORE) || defined(USE_WINDOWS_SSPI)
+#define USE_NTLM
+#endif
#endif
#ifdef CURL_WANTS_CA_BUNDLE_ENV
@@ -702,7 +692,7 @@ int netware_init(void);
defined(HAVE_WINSOCK_H) || \
defined(HAVE_WINSOCK2_H) || \
defined(HAVE_WS2TCPIP_H)
-# error "Winsock and lwIP TCP/IP stack definitions shall not coexist!"
+# error "WinSock and lwIP TCP/IP stack definitions shall not coexist!"
# endif
#endif
diff --git a/lib/curl_threads.c b/lib/curl_threads.c
index b5f10a20..6f3815e7 100644
--- a/lib/curl_threads.c
+++ b/lib/curl_threads.c
@@ -41,14 +41,14 @@
#if defined(USE_THREADS_POSIX)
-struct curl_actual_call {
+struct Curl_actual_call {
unsigned int (*func)(void *);
void *arg;
};
static void *curl_thread_create_thunk(void *arg)
{
- struct curl_actual_call *ac = arg;
+ struct Curl_actual_call *ac = arg;
unsigned int (*func)(void *) = ac->func;
void *real_arg = ac->arg;
@@ -62,7 +62,7 @@ static void *curl_thread_create_thunk(void *arg)
curl_thread_t Curl_thread_create(unsigned int (*func) (void *), void *arg)
{
curl_thread_t t = malloc(sizeof(pthread_t));
- struct curl_actual_call *ac = malloc(sizeof(struct curl_actual_call));
+ struct Curl_actual_call *ac = malloc(sizeof(struct Curl_actual_call));
if(!(ac && t))
goto err;
diff --git a/lib/dict.c b/lib/dict.c
index f529b48f..8dd4a90f 100644
--- a/lib/dict.c
+++ b/lib/dict.c
@@ -57,6 +57,7 @@
#include "escape.h"
#include "progress.h"
#include "dict.h"
+#include "curl_printf.h"
#include "strcase.h"
#include "curl_memory.h"
/* The last #include file should be: */
@@ -90,7 +91,8 @@ const struct Curl_handler Curl_handler_dict = {
ZERO_NULL, /* connection_check */
PORT_DICT, /* defport */
CURLPROTO_DICT, /* protocol */
- PROTOPT_NONE | PROTOPT_NOURLQUERY /* flags */
+ CURLPROTO_DICT, /* family */
+ PROTOPT_NONE | PROTOPT_NOURLQUERY /* flags */
};
static char *unescape_word(struct Curl_easy *data, const char *inputbuff)
@@ -126,6 +128,52 @@ static char *unescape_word(struct Curl_easy *data, const char *inputbuff)
return dictp;
}
+/* sendf() sends formatted data to the server */
+static CURLcode sendf(curl_socket_t sockfd, struct connectdata *conn,
+ const char *fmt, ...)
+{
+ struct Curl_easy *data = conn->data;
+ ssize_t bytes_written;
+ size_t write_len;
+ CURLcode result = CURLE_OK;
+ char *s;
+ char *sptr;
+ va_list ap;
+ va_start(ap, fmt);
+ s = vaprintf(fmt, ap); /* returns an allocated string */
+ va_end(ap);
+ if(!s)
+ return CURLE_OUT_OF_MEMORY; /* failure */
+
+ bytes_written = 0;
+ write_len = strlen(s);
+ sptr = s;
+
+ for(;;) {
+ /* Write the buffer to the socket */
+ result = Curl_write(conn, sockfd, sptr, write_len, &bytes_written);
+
+ if(result)
+ break;
+
+ if(data->set.verbose)
+ Curl_debug(data, CURLINFO_DATA_OUT, sptr, (size_t)bytes_written);
+
+ if((size_t)bytes_written != write_len) {
+ /* if not all was written at once, we must advance the pointer, decrease
+ the size left and try again! */
+ write_len -= bytes_written;
+ sptr += bytes_written;
+ }
+ else
+ break;
+ }
+
+ free(s); /* free the output string */
+
+ return result;
+}
+
static CURLcode dict_do(struct connectdata *conn, bool *done)
{
char *word;
@@ -183,18 +231,16 @@ static CURLcode dict_do(struct connectdata *conn, bool *done)
if(!eword)
return CURLE_OUT_OF_MEMORY;
- result = Curl_sendf(sockfd, conn,
- "CLIENT " LIBCURL_NAME " " LIBCURL_VERSION "\r\n"
- "MATCH "
- "%s " /* database */
- "%s " /* strategy */
- "%s\r\n" /* word */
- "QUIT\r\n",
-
- database,
- strategy,
- eword
- );
+ result = sendf(sockfd, conn,
+ "CLIENT " LIBCURL_NAME " " LIBCURL_VERSION "\r\n"
+ "MATCH "
+ "%s " /* database */
+ "%s " /* strategy */
+ "%s\r\n" /* word */
+ "QUIT\r\n",
+ database,
+ strategy,
+ eword);
free(eword);
@@ -233,14 +279,14 @@ static CURLcode dict_do(struct connectdata *conn, bool *done)
if(!eword)
return CURLE_OUT_OF_MEMORY;
- result = Curl_sendf(sockfd, conn,
- "CLIENT " LIBCURL_NAME " " LIBCURL_VERSION "\r\n"
- "DEFINE "
- "%s " /* database */
- "%s\r\n" /* word */
- "QUIT\r\n",
- database,
- eword);
+ result = sendf(sockfd, conn,
+ "CLIENT " LIBCURL_NAME " " LIBCURL_VERSION "\r\n"
+ "DEFINE "
+ "%s " /* database */
+ "%s\r\n" /* word */
+ "QUIT\r\n",
+ database,
+ eword);
free(eword);
@@ -261,10 +307,10 @@ static CURLcode dict_do(struct connectdata *conn, bool *done)
if(ppath[i] == ':')
ppath[i] = ' ';
}
- result = Curl_sendf(sockfd, conn,
- "CLIENT " LIBCURL_NAME " " LIBCURL_VERSION "\r\n"
- "%s\r\n"
- "QUIT\r\n", ppath);
+ result = sendf(sockfd, conn,
+ "CLIENT " LIBCURL_NAME " " LIBCURL_VERSION "\r\n"
+ "%s\r\n"
+ "QUIT\r\n", ppath);
if(result) {
failf(data, "Failed sending DICT request");
return result;
diff --git a/lib/doh.c b/lib/doh.c
index 8bc3428f..e8b08011 100644
--- a/lib/doh.c
+++ b/lib/doh.c
@@ -57,12 +57,13 @@ static const char * const errors[]={
"Unexpected TYPE",
"Unexpected CLASS",
"No content",
- "Bad ID"
+ "Bad ID",
+ "Name too long"
};
static const char *doh_strerror(DOHcode code)
{
- if((code >= DOH_OK) && (code <= DOH_DNS_BAD_ID))
+ if((code >= DOH_OK) && (code <= DOH_DNS_NAME_TOO_LONG))
return errors[code];
return "bad error code";
}
@@ -348,6 +349,10 @@ static CURLcode dohprobe(struct Curl_easy *data,
ERROR_CHECK_SETOPT(CURLOPT_SSL_CTX_FUNCTION, data->set.ssl.fsslctx);
if(data->set.ssl.fsslctxp)
ERROR_CHECK_SETOPT(CURLOPT_SSL_CTX_DATA, data->set.ssl.fsslctxp);
+ if(data->set.str[STRING_SSL_EC_CURVES]) {
+ ERROR_CHECK_SETOPT(CURLOPT_SSL_EC_CURVES,
+ data->set.str[STRING_SSL_EC_CURVES]);
+ }
doh->set.fmultidone = Curl_doh_done;
doh->set.dohfor = data; /* identify for which transfer this is done */
diff --git a/lib/dynbuf.c b/lib/dynbuf.c
index 38d370b0..b2465b88 100644
--- a/lib/dynbuf.c
+++ b/lib/dynbuf.c
@@ -21,12 +21,11 @@
***************************************************************************/
#include "curl_setup.h"
-#include "strdup.h"
#include "dynbuf.h"
-
-/* The last 3 #include files should be in this order */
#include "curl_printf.h"
+#ifdef BUILDING_LIBCURL
#include "curl_memory.h"
+#endif
#include "memdebug.h"
#define MIN_FIRST_ALLOC 32
@@ -94,11 +93,15 @@ static CURLcode dyn_nappend(struct dynbuf *s,
}
if(a != s->allc) {
- s->bufr = Curl_saferealloc(s->bufr, a);
- if(!s->bufr) {
+ /* this logic is not using Curl_saferealloc() to make the tool not have to
+ include that as well when it uses this code */
+ void *p = realloc(s->bufr, a);
+ if(!p) {
+ Curl_safefree(s->bufr);
s->leng = s->allc = 0;
return CURLE_OUT_OF_MEMORY;
}
+ s->bufr = p;
s->allc = a;
}
@@ -143,6 +146,7 @@ CURLcode Curl_dyn_tail(struct dynbuf *s, size_t trail)
else {
memmove(&s->bufr[0], &s->bufr[s->leng - trail], trail);
s->leng = trail;
+ s->bufr[s->leng] = 0;
}
return CURLE_OK;
@@ -173,15 +177,22 @@ CURLcode Curl_dyn_add(struct dynbuf *s, const char *str)
}
/*
- * Append a string printf()-style
+ * Append a string vprintf()-style
*/
-CURLcode Curl_dyn_addf(struct dynbuf *s, const char *fmt, ...)
+CURLcode Curl_dyn_vaddf(struct dynbuf *s, const char *fmt, va_list ap)
{
+#ifdef BUILDING_LIBCURL
+ int rc;
+ DEBUGASSERT(s);
+ DEBUGASSERT(s->init == DYNINIT);
+ DEBUGASSERT(!s->leng || s->bufr);
+ rc = Curl_dyn_vprintf(s, fmt, ap);
+
+ if(!rc)
+ return CURLE_OK;
+#else
char *str;
- va_list ap;
- va_start(ap, fmt);
str = vaprintf(fmt, ap); /* this allocs a new string to append */
- va_end(ap);
if(str) {
CURLcode result = dyn_nappend(s, (unsigned char *)str, strlen(str));
@@ -190,10 +201,27 @@ CURLcode Curl_dyn_addf(struct dynbuf *s, const char *fmt, ...)
}
/* If we failed, we cleanup the whole buffer and return error */
Curl_dyn_free(s);
+#endif
return CURLE_OUT_OF_MEMORY;
}
/*
+ * Append a string printf()-style
+ */
+CURLcode Curl_dyn_addf(struct dynbuf *s, const char *fmt, ...)
+{
+ CURLcode result;
+ va_list ap;
+ DEBUGASSERT(s);
+ DEBUGASSERT(s->init == DYNINIT);
+ DEBUGASSERT(!s->leng || s->bufr);
+ va_start(ap, fmt);
+ result = Curl_dyn_vaddf(s, fmt, ap);
+ va_end(ap);
+ return result;
+}
+
+/*
* Returns a pointer to the buffer.
*/
char *Curl_dyn_ptr(const struct dynbuf *s)
diff --git a/lib/dynbuf.h b/lib/dynbuf.h
index ecc99575..39b85957 100644
--- a/lib/dynbuf.h
+++ b/lib/dynbuf.h
@@ -22,6 +22,23 @@
*
***************************************************************************/
+#ifndef BUILDING_LIBCURL
+/* this renames the functions so that the tool code can use the same code
+ without getting symbol collisions */
+#define Curl_dyn_init(a,b) curlx_dyn_init(a,b)
+#define Curl_dyn_add(a,b) curlx_dyn_add(a,b)
+#define Curl_dyn_addn(a,b,c) curlx_dyn_addn(a,b,c)
+#define Curl_dyn_addf curlx_dyn_addf
+#define Curl_dyn_vaddf curlx_dyn_vaddf
+#define Curl_dyn_free(a) curlx_dyn_free(a)
+#define Curl_dyn_ptr(a) curlx_dyn_ptr(a)
+#define Curl_dyn_uptr(a) curlx_dyn_uptr(a)
+#define Curl_dyn_len(a) curlx_dyn_len(a)
+#define Curl_dyn_reset(a) curlx_dyn_reset(a)
+#define Curl_dyn_tail(a,b) curlx_dyn_tail(a,b)
+#define curlx_dynbuf dynbuf /* for the struct name */
+#endif
+
struct dynbuf {
char *bufr; /* point to a null-terminated allocated buffer */
size_t leng; /* number of bytes *EXCLUDING* the zero terminator */
@@ -40,12 +57,18 @@ CURLcode Curl_dyn_add(struct dynbuf *s, const char *str)
WARN_UNUSED_RESULT;
CURLcode Curl_dyn_addf(struct dynbuf *s, const char *fmt, ...)
WARN_UNUSED_RESULT;
+CURLcode Curl_dyn_vaddf(struct dynbuf *s, const char *fmt, va_list ap)
+ WARN_UNUSED_RESULT;
void Curl_dyn_reset(struct dynbuf *s);
CURLcode Curl_dyn_tail(struct dynbuf *s, size_t trail);
char *Curl_dyn_ptr(const struct dynbuf *s);
unsigned char *Curl_dyn_uptr(const struct dynbuf *s);
size_t Curl_dyn_len(const struct dynbuf *s);
+/* returns 0 on success, -1 on error */
+/* The implementation of this function exists in mprintf.c */
+int Curl_dyn_vprintf(struct dynbuf *dyn, const char *format, va_list ap_save);
+
/* Dynamic buffer max sizes */
#define DYN_DOH_RESPONSE 3000
#define DYN_DOH_CNAME 256
@@ -60,4 +83,6 @@ size_t Curl_dyn_len(const struct dynbuf *s);
#define DYN_PROXY_CONNECT_HEADERS 16384
#define DYN_QLOG_NAME 1024
#define DYN_H1_TRAILER 4096
+#define DYN_PINGPPONG_CMD (64*1024)
+#define DYN_IMAP_CMD (64*1024)
#endif
diff --git a/lib/easy.c b/lib/easy.c
index a69eb9e5..60e2befd 100644
--- a/lib/easy.c
+++ b/lib/easy.c
@@ -78,6 +78,7 @@
#include "system_win32.h"
#include "http2.h"
#include "dynbuf.h"
+#include "altsvc.h"
/* The last 3 #include files should be in this order */
#include "curl_printf.h"
@@ -105,7 +106,6 @@ static long init_flags;
# pragma warning(disable:4232) /* MSVC extension, dllimport identity */
#endif
-#ifndef __SYMBIAN32__
/*
* If a memory-using function (like curl_getenv) is used before
* curl_global_init() is called, we need to have these pointers set already.
@@ -118,17 +118,6 @@ curl_calloc_callback Curl_ccalloc = (curl_calloc_callback)calloc;
#if defined(WIN32) && defined(UNICODE)
curl_wcsdup_callback Curl_cwcsdup = (curl_wcsdup_callback)_wcsdup;
#endif
-#else
-/*
- * Symbian OS doesn't support initialization to code in writable static data.
- * Initialization will occur in the curl_global_init() call.
- */
-curl_malloc_callback Curl_cmalloc;
-curl_free_callback Curl_cfree;
-curl_realloc_callback Curl_crealloc;
-curl_strdup_callback Curl_cstrdup;
-curl_calloc_callback Curl_ccalloc;
-#endif
#if defined(_MSC_VER) && defined(_DLL) && !defined(__POCC__)
# pragma warning(default:4232) /* MSVC extension, dllimport identity */
@@ -883,6 +872,15 @@ struct Curl_easy *curl_easy_duphandle(struct Curl_easy *data)
goto fail;
}
+#ifdef USE_ALTSVC
+ if(data->asi) {
+ outcurl->asi = Curl_altsvc_init();
+ if(!outcurl->asi)
+ goto fail;
+ if(outcurl->set.str[STRING_ALTSVC])
+ (void)Curl_altsvc_load(outcurl->asi, outcurl->set.str[STRING_ALTSVC]);
+ }
+#endif
/* Clone the resolver handle, if present, for the new handle */
if(Curl_resolver_duphandle(outcurl,
&outcurl->state.resolver,
@@ -930,6 +928,7 @@ struct Curl_easy *curl_easy_duphandle(struct Curl_easy *data)
Curl_dyn_free(&outcurl->state.headerb);
Curl_safefree(outcurl->change.url);
Curl_safefree(outcurl->change.referer);
+ Curl_altsvc_cleanup(&outcurl->asi);
Curl_freeset(outcurl);
free(outcurl);
}
@@ -958,6 +957,7 @@ void curl_easy_reset(struct Curl_easy *data)
data->progress.flags |= PGRS_HIDE;
data->state.current_speed = -1; /* init to negative == impossible */
+ data->state.retrycount = 0; /* reset the retry counter */
/* zero out authentication data: */
memset(&data->state.authhost, 0, sizeof(struct auth));
@@ -1067,9 +1067,10 @@ CURLcode curl_easy_pause(struct Curl_easy *data, int action)
(KEEP_RECV_PAUSE|KEEP_SEND_PAUSE)) {
Curl_expire(data, 0, EXPIRE_RUN_NOW); /* get this handle going again */
- /* force a recv/send check of this connection, as the data might've been
- read off the socket already */
- data->conn->cselect_bits = CURL_CSELECT_IN | CURL_CSELECT_OUT;
+ if(!data->state.tempcount)
+ /* if not pausing again, force a recv/send check of this connection as
+ the data might've been read off the socket already */
+ data->conn->cselect_bits = CURL_CSELECT_IN | CURL_CSELECT_OUT;
if(data->multi)
Curl_update_timer(data->multi);
}
diff --git a/lib/easygetopt.c b/lib/easygetopt.c
new file mode 100644
index 00000000..cac8378e
--- /dev/null
+++ b/lib/easygetopt.c
@@ -0,0 +1,96 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ | |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * ___|___/|_| ______|
+ *
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+#include "curl_setup.h"
+#include "strcase.h"
+#include "easyoptions.h"
+
+#ifndef CURL_DISABLE_GETOPTIONS
+
+/* Lookups easy options at runtime */
+static struct curl_easyoption *lookup(const char *name, CURLoption id)
+{
+ DEBUGASSERT(name || id);
+ DEBUGASSERT(!Curl_easyopts_check());
+ if(name || id) {
+ struct curl_easyoption *o = &Curl_easyopts[0];
+ do {
+ if(name) {
+ if(strcasecompare(o->name, name))
+ return o;
+ }
+ else {
+ if((o->id == id) && !(o->flags & CURLOT_FLAG_ALIAS))
+ /* don't match alias options */
+ return o;
+ }
+ o++;
+ } while(o->name);
+ }
+ return NULL;
+}
+
+const struct curl_easyoption *curl_easy_option_by_name(const char *name)
+{
+ /* when name is used, the id argument is ignored */
+ return lookup(name, CURLOPT_LASTENTRY);
+}
+
+const struct curl_easyoption *curl_easy_option_by_id(CURLoption id)
+{
+ return lookup(NULL, id);
+}
+
+/* Iterates over available options */
+const struct curl_easyoption *
+curl_easy_option_next(const struct curl_easyoption *prev)
+{
+ if(prev && prev->name) {
+ prev++;
+ if(prev->name)
+ return prev;
+ }
+ else if(!prev)
+ return &Curl_easyopts[0];
+ return NULL;
+}
+
+#else
+const struct curl_easyoption *curl_easy_option_by_name(const char *name)
+{
+ (void)name;
+ return NULL;
+}
+
+const struct curl_easyoption *curl_easy_option_by_id (CURLoption id)
+{
+ (void)id;
+ return NULL;
+}
+
+const struct curl_easyoption *
+curl_easy_option_next(const struct curl_easyoption *prev)
+{
+ (void)prev;
+ return NULL;
+}
+#endif
diff --git a/lib/easyoptions.c b/lib/easyoptions.c
new file mode 100644
index 00000000..0ab6a3fc
--- /dev/null
+++ b/lib/easyoptions.c
@@ -0,0 +1,347 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ | |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * ___|___/|_| ______|
+ *
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+/* This source code is generated by optiontable.pl - DO NOT EDIT BY HAND */
+
+#include "curl_setup.h"
+#include "easyoptions.h"
+
+/* all easy setopt options listed in alphabetical order */
+struct curl_easyoption Curl_easyopts[] = {
+ {"ABSTRACT_UNIX_SOCKET", CURLOPT_ABSTRACT_UNIX_SOCKET, CURLOT_STRING, 0},
+ {"ACCEPTTIMEOUT_MS", CURLOPT_ACCEPTTIMEOUT_MS, CURLOT_LONG, 0},
+ {"ACCEPT_ENCODING", CURLOPT_ACCEPT_ENCODING, CURLOT_STRING, 0},
+ {"ADDRESS_SCOPE", CURLOPT_ADDRESS_SCOPE, CURLOT_LONG, 0},
+ {"ALTSVC", CURLOPT_ALTSVC, CURLOT_STRING, 0},
+ {"ALTSVC_CTRL", CURLOPT_ALTSVC_CTRL, CURLOT_LONG, 0},
+ {"APPEND", CURLOPT_APPEND, CURLOT_LONG, 0},
+ {"AUTOREFERER", CURLOPT_AUTOREFERER, CURLOT_LONG, 0},
+ {"BUFFERSIZE", CURLOPT_BUFFERSIZE, CURLOT_LONG, 0},
+ {"CAINFO", CURLOPT_CAINFO, CURLOT_STRING, 0},
+ {"CAPATH", CURLOPT_CAPATH, CURLOT_STRING, 0},
+ {"CERTINFO", CURLOPT_CERTINFO, CURLOT_LONG, 0},
+ {"CHUNK_BGN_FUNCTION", CURLOPT_CHUNK_BGN_FUNCTION, CURLOT_FUNCTION, 0},
+ {"CHUNK_DATA", CURLOPT_CHUNK_DATA, CURLOT_CBPTR, 0},
+ {"CHUNK_END_FUNCTION", CURLOPT_CHUNK_END_FUNCTION, CURLOT_FUNCTION, 0},
+ {"CLOSESOCKETDATA", CURLOPT_CLOSESOCKETDATA, CURLOT_CBPTR, 0},
+ {"CLOSESOCKETFUNCTION", CURLOPT_CLOSESOCKETFUNCTION, CURLOT_FUNCTION, 0},
+ {"CONNECTTIMEOUT", CURLOPT_CONNECTTIMEOUT, CURLOT_LONG, 0},
+ {"CONNECTTIMEOUT_MS", CURLOPT_CONNECTTIMEOUT_MS, CURLOT_LONG, 0},
+ {"CONNECT_ONLY", CURLOPT_CONNECT_ONLY, CURLOT_LONG, 0},
+ {"CONNECT_TO", CURLOPT_CONNECT_TO, CURLOT_SLIST, 0},
+ {"CONV_FROM_NETWORK_FUNCTION", CURLOPT_CONV_FROM_NETWORK_FUNCTION,
+ CURLOT_FUNCTION, 0},
+ {"CONV_FROM_UTF8_FUNCTION", CURLOPT_CONV_FROM_UTF8_FUNCTION,
+ CURLOT_FUNCTION, 0},
+ {"CONV_TO_NETWORK_FUNCTION", CURLOPT_CONV_TO_NETWORK_FUNCTION,
+ CURLOT_FUNCTION, 0},
+ {"COOKIE", CURLOPT_COOKIE, CURLOT_STRING, 0},
+ {"COOKIEFILE", CURLOPT_COOKIEFILE, CURLOT_STRING, 0},
+ {"COOKIEJAR", CURLOPT_COOKIEJAR, CURLOT_STRING, 0},
+ {"COOKIELIST", CURLOPT_COOKIELIST, CURLOT_STRING, 0},
+ {"COOKIESESSION", CURLOPT_COOKIESESSION, CURLOT_LONG, 0},
+ {"COPYPOSTFIELDS", CURLOPT_COPYPOSTFIELDS, CURLOT_OBJECT, 0},
+ {"CRLF", CURLOPT_CRLF, CURLOT_LONG, 0},
+ {"CRLFILE", CURLOPT_CRLFILE, CURLOT_STRING, 0},
+ {"CURLU", CURLOPT_CURLU, CURLOT_OBJECT, 0},
+ {"CUSTOMREQUEST", CURLOPT_CUSTOMREQUEST, CURLOT_STRING, 0},
+ {"DEBUGDATA", CURLOPT_DEBUGDATA, CURLOT_CBPTR, 0},
+ {"DEBUGFUNCTION", CURLOPT_DEBUGFUNCTION, CURLOT_FUNCTION, 0},
+ {"DEFAULT_PROTOCOL", CURLOPT_DEFAULT_PROTOCOL, CURLOT_STRING, 0},
+ {"DIRLISTONLY", CURLOPT_DIRLISTONLY, CURLOT_LONG, 0},
+ {"DISALLOW_USERNAME_IN_URL", CURLOPT_DISALLOW_USERNAME_IN_URL,
+ CURLOT_LONG, 0},
+ {"DNS_CACHE_TIMEOUT", CURLOPT_DNS_CACHE_TIMEOUT, CURLOT_LONG, 0},
+ {"DNS_INTERFACE", CURLOPT_DNS_INTERFACE, CURLOT_STRING, 0},
+ {"DNS_LOCAL_IP4", CURLOPT_DNS_LOCAL_IP4, CURLOT_STRING, 0},
+ {"DNS_LOCAL_IP6", CURLOPT_DNS_LOCAL_IP6, CURLOT_STRING, 0},
+ {"DNS_SERVERS", CURLOPT_DNS_SERVERS, CURLOT_STRING, 0},
+ {"DNS_SHUFFLE_ADDRESSES", CURLOPT_DNS_SHUFFLE_ADDRESSES, CURLOT_LONG, 0},
+ {"DNS_USE_GLOBAL_CACHE", CURLOPT_DNS_USE_GLOBAL_CACHE, CURLOT_LONG, 0},
+ {"DOH_URL", CURLOPT_DOH_URL, CURLOT_STRING, 0},
+ {"EGDSOCKET", CURLOPT_EGDSOCKET, CURLOT_STRING, 0},
+ {"ENCODING", CURLOPT_ACCEPT_ENCODING, CURLOT_STRING, CURLOT_FLAG_ALIAS},
+ {"ERRORBUFFER", CURLOPT_ERRORBUFFER, CURLOT_OBJECT, 0},
+ {"EXPECT_100_TIMEOUT_MS", CURLOPT_EXPECT_100_TIMEOUT_MS, CURLOT_LONG, 0},
+ {"FAILONERROR", CURLOPT_FAILONERROR, CURLOT_LONG, 0},
+ {"FILE", CURLOPT_WRITEDATA, CURLOT_CBPTR, CURLOT_FLAG_ALIAS},
+ {"FILETIME", CURLOPT_FILETIME, CURLOT_LONG, 0},
+ {"FNMATCH_DATA", CURLOPT_FNMATCH_DATA, CURLOT_CBPTR, 0},
+ {"FNMATCH_FUNCTION", CURLOPT_FNMATCH_FUNCTION, CURLOT_FUNCTION, 0},
+ {"FOLLOWLOCATION", CURLOPT_FOLLOWLOCATION, CURLOT_LONG, 0},
+ {"FORBID_REUSE", CURLOPT_FORBID_REUSE, CURLOT_LONG, 0},
+ {"FRESH_CONNECT", CURLOPT_FRESH_CONNECT, CURLOT_LONG, 0},
+ {"FTPAPPEND", CURLOPT_APPEND, CURLOT_LONG, CURLOT_FLAG_ALIAS},
+ {"FTPLISTONLY", CURLOPT_DIRLISTONLY, CURLOT_LONG, CURLOT_FLAG_ALIAS},
+ {"FTPPORT", CURLOPT_FTPPORT, CURLOT_STRING, 0},
+ {"FTPSSLAUTH", CURLOPT_FTPSSLAUTH, CURLOT_VALUES, 0},
+ {"FTP_ACCOUNT", CURLOPT_FTP_ACCOUNT, CURLOT_STRING, 0},
+ {"FTP_ALTERNATIVE_TO_USER", CURLOPT_FTP_ALTERNATIVE_TO_USER,
+ CURLOT_STRING, 0},
+ {"FTP_CREATE_MISSING_DIRS", CURLOPT_FTP_CREATE_MISSING_DIRS,
+ CURLOT_LONG, 0},
+ {"FTP_FILEMETHOD", CURLOPT_FTP_FILEMETHOD, CURLOT_VALUES, 0},
+ {"FTP_RESPONSE_TIMEOUT", CURLOPT_FTP_RESPONSE_TIMEOUT, CURLOT_LONG, 0},
+ {"FTP_SKIP_PASV_IP", CURLOPT_FTP_SKIP_PASV_IP, CURLOT_LONG, 0},
+ {"FTP_SSL", CURLOPT_USE_SSL, CURLOT_VALUES, CURLOT_FLAG_ALIAS},
+ {"FTP_SSL_CCC", CURLOPT_FTP_SSL_CCC, CURLOT_LONG, 0},
+ {"FTP_USE_EPRT", CURLOPT_FTP_USE_EPRT, CURLOT_LONG, 0},
+ {"FTP_USE_EPSV", CURLOPT_FTP_USE_EPSV, CURLOT_LONG, 0},
+ {"FTP_USE_PRET", CURLOPT_FTP_USE_PRET, CURLOT_LONG, 0},
+ {"GSSAPI_DELEGATION", CURLOPT_GSSAPI_DELEGATION, CURLOT_VALUES, 0},
+ {"HAPPY_EYEBALLS_TIMEOUT_MS", CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS,
+ CURLOT_LONG, 0},
+ {"HAPROXYPROTOCOL", CURLOPT_HAPROXYPROTOCOL, CURLOT_LONG, 0},
+ {"HEADER", CURLOPT_HEADER, CURLOT_LONG, 0},
+ {"HEADERDATA", CURLOPT_HEADERDATA, CURLOT_CBPTR, 0},
+ {"HEADERFUNCTION", CURLOPT_HEADERFUNCTION, CURLOT_FUNCTION, 0},
+ {"HEADEROPT", CURLOPT_HEADEROPT, CURLOT_VALUES, 0},
+ {"HTTP09_ALLOWED", CURLOPT_HTTP09_ALLOWED, CURLOT_LONG, 0},
+ {"HTTP200ALIASES", CURLOPT_HTTP200ALIASES, CURLOT_SLIST, 0},
+ {"HTTPAUTH", CURLOPT_HTTPAUTH, CURLOT_VALUES, 0},
+ {"HTTPGET", CURLOPT_HTTPGET, CURLOT_LONG, 0},
+ {"HTTPHEADER", CURLOPT_HTTPHEADER, CURLOT_SLIST, 0},
+ {"HTTPPOST", CURLOPT_HTTPPOST, CURLOT_OBJECT, 0},
+ {"HTTPPROXYTUNNEL", CURLOPT_HTTPPROXYTUNNEL, CURLOT_LONG, 0},
+ {"HTTP_CONTENT_DECODING", CURLOPT_HTTP_CONTENT_DECODING, CURLOT_LONG, 0},
+ {"HTTP_TRANSFER_DECODING", CURLOPT_HTTP_TRANSFER_DECODING, CURLOT_LONG, 0},
+ {"HTTP_VERSION", CURLOPT_HTTP_VERSION, CURLOT_VALUES, 0},
+ {"IGNORE_CONTENT_LENGTH", CURLOPT_IGNORE_CONTENT_LENGTH, CURLOT_LONG, 0},
+ {"INFILE", CURLOPT_READDATA, CURLOT_CBPTR, CURLOT_FLAG_ALIAS},
+ {"INFILESIZE", CURLOPT_INFILESIZE, CURLOT_LONG, 0},
+ {"INFILESIZE_LARGE", CURLOPT_INFILESIZE_LARGE, CURLOT_OFF_T, 0},
+ {"INTERFACE", CURLOPT_INTERFACE, CURLOT_STRING, 0},
+ {"INTERLEAVEDATA", CURLOPT_INTERLEAVEDATA, CURLOT_CBPTR, 0},
+ {"INTERLEAVEFUNCTION", CURLOPT_INTERLEAVEFUNCTION, CURLOT_FUNCTION, 0},
+ {"IOCTLDATA", CURLOPT_IOCTLDATA, CURLOT_CBPTR, 0},
+ {"IOCTLFUNCTION", CURLOPT_IOCTLFUNCTION, CURLOT_FUNCTION, 0},
+ {"IPRESOLVE", CURLOPT_IPRESOLVE, CURLOT_VALUES, 0},
+ {"ISSUERCERT", CURLOPT_ISSUERCERT, CURLOT_STRING, 0},
+ {"ISSUERCERT_BLOB", CURLOPT_ISSUERCERT_BLOB, CURLOT_BLOB, 0},
+ {"KEEP_SENDING_ON_ERROR", CURLOPT_KEEP_SENDING_ON_ERROR, CURLOT_LONG, 0},
+ {"KEYPASSWD", CURLOPT_KEYPASSWD, CURLOT_STRING, 0},
+ {"KRB4LEVEL", CURLOPT_KRBLEVEL, CURLOT_STRING, CURLOT_FLAG_ALIAS},
+ {"KRBLEVEL", CURLOPT_KRBLEVEL, CURLOT_STRING, 0},
+ {"LOCALPORT", CURLOPT_LOCALPORT, CURLOT_LONG, 0},
+ {"LOCALPORTRANGE", CURLOPT_LOCALPORTRANGE, CURLOT_LONG, 0},
+ {"LOGIN_OPTIONS", CURLOPT_LOGIN_OPTIONS, CURLOT_STRING, 0},
+ {"LOW_SPEED_LIMIT", CURLOPT_LOW_SPEED_LIMIT, CURLOT_LONG, 0},
+ {"LOW_SPEED_TIME", CURLOPT_LOW_SPEED_TIME, CURLOT_LONG, 0},
+ {"MAIL_AUTH", CURLOPT_MAIL_AUTH, CURLOT_STRING, 0},
+ {"MAIL_FROM", CURLOPT_MAIL_FROM, CURLOT_STRING, 0},
+ {"MAIL_RCPT", CURLOPT_MAIL_RCPT, CURLOT_SLIST, 0},
+ {"MAIL_RCPT_ALLLOWFAILS", CURLOPT_MAIL_RCPT_ALLLOWFAILS, CURLOT_LONG, 0},
+ {"MAXAGE_CONN", CURLOPT_MAXAGE_CONN, CURLOT_LONG, 0},
+ {"MAXCONNECTS", CURLOPT_MAXCONNECTS, CURLOT_LONG, 0},
+ {"MAXFILESIZE", CURLOPT_MAXFILESIZE, CURLOT_LONG, 0},
+ {"MAXFILESIZE_LARGE", CURLOPT_MAXFILESIZE_LARGE, CURLOT_OFF_T, 0},
+ {"MAXREDIRS", CURLOPT_MAXREDIRS, CURLOT_LONG, 0},
+ {"MAX_RECV_SPEED_LARGE", CURLOPT_MAX_RECV_SPEED_LARGE, CURLOT_OFF_T, 0},
+ {"MAX_SEND_SPEED_LARGE", CURLOPT_MAX_SEND_SPEED_LARGE, CURLOT_OFF_T, 0},
+ {"MIMEPOST", CURLOPT_MIMEPOST, CURLOT_OBJECT, 0},
+ {"NETRC", CURLOPT_NETRC, CURLOT_VALUES, 0},
+ {"NETRC_FILE", CURLOPT_NETRC_FILE, CURLOT_STRING, 0},
+ {"NEW_DIRECTORY_PERMS", CURLOPT_NEW_DIRECTORY_PERMS, CURLOT_LONG, 0},
+ {"NEW_FILE_PERMS", CURLOPT_NEW_FILE_PERMS, CURLOT_LONG, 0},
+ {"NOBODY", CURLOPT_NOBODY, CURLOT_LONG, 0},
+ {"NOPROGRESS", CURLOPT_NOPROGRESS, CURLOT_LONG, 0},
+ {"NOPROXY", CURLOPT_NOPROXY, CURLOT_STRING, 0},
+ {"NOSIGNAL", CURLOPT_NOSIGNAL, CURLOT_LONG, 0},
+ {"OPENSOCKETDATA", CURLOPT_OPENSOCKETDATA, CURLOT_CBPTR, 0},
+ {"OPENSOCKETFUNCTION", CURLOPT_OPENSOCKETFUNCTION, CURLOT_FUNCTION, 0},
+ {"PASSWORD", CURLOPT_PASSWORD, CURLOT_STRING, 0},
+ {"PATH_AS_IS", CURLOPT_PATH_AS_IS, CURLOT_LONG, 0},
+ {"PINNEDPUBLICKEY", CURLOPT_PINNEDPUBLICKEY, CURLOT_STRING, 0},
+ {"PIPEWAIT", CURLOPT_PIPEWAIT, CURLOT_LONG, 0},
+ {"PORT", CURLOPT_PORT, CURLOT_LONG, 0},
+ {"POST", CURLOPT_POST, CURLOT_LONG, 0},
+ {"POST301", CURLOPT_POSTREDIR, CURLOT_VALUES, CURLOT_FLAG_ALIAS},
+ {"POSTFIELDS", CURLOPT_POSTFIELDS, CURLOT_OBJECT, 0},
+ {"POSTFIELDSIZE", CURLOPT_POSTFIELDSIZE, CURLOT_LONG, 0},
+ {"POSTFIELDSIZE_LARGE", CURLOPT_POSTFIELDSIZE_LARGE, CURLOT_OFF_T, 0},
+ {"POSTQUOTE", CURLOPT_POSTQUOTE, CURLOT_SLIST, 0},
+ {"POSTREDIR", CURLOPT_POSTREDIR, CURLOT_VALUES, 0},
+ {"PREQUOTE", CURLOPT_PREQUOTE, CURLOT_SLIST, 0},
+ {"PRE_PROXY", CURLOPT_PRE_PROXY, CURLOT_STRING, 0},
+ {"PRIVATE", CURLOPT_PRIVATE, CURLOT_OBJECT, 0},
+ {"PROGRESSDATA", CURLOPT_XFERINFODATA, CURLOT_CBPTR, CURLOT_FLAG_ALIAS},
+ {"PROGRESSFUNCTION", CURLOPT_PROGRESSFUNCTION, CURLOT_FUNCTION, 0},
+ {"PROTOCOLS", CURLOPT_PROTOCOLS, CURLOT_LONG, 0},
+ {"PROXY", CURLOPT_PROXY, CURLOT_STRING, 0},
+ {"PROXYAUTH", CURLOPT_PROXYAUTH, CURLOT_VALUES, 0},
+ {"PROXYHEADER", CURLOPT_PROXYHEADER, CURLOT_SLIST, 0},
+ {"PROXYPASSWORD", CURLOPT_PROXYPASSWORD, CURLOT_STRING, 0},
+ {"PROXYPORT", CURLOPT_PROXYPORT, CURLOT_LONG, 0},
+ {"PROXYTYPE", CURLOPT_PROXYTYPE, CURLOT_VALUES, 0},
+ {"PROXYUSERNAME", CURLOPT_PROXYUSERNAME, CURLOT_STRING, 0},
+ {"PROXYUSERPWD", CURLOPT_PROXYUSERPWD, CURLOT_STRING, 0},
+ {"PROXY_CAINFO", CURLOPT_PROXY_CAINFO, CURLOT_STRING, 0},
+ {"PROXY_CAPATH", CURLOPT_PROXY_CAPATH, CURLOT_STRING, 0},
+ {"PROXY_CRLFILE", CURLOPT_PROXY_CRLFILE, CURLOT_STRING, 0},
+ {"PROXY_ISSUERCERT", CURLOPT_PROXY_ISSUERCERT, CURLOT_STRING, 0},
+ {"PROXY_ISSUERCERT_BLOB", CURLOPT_PROXY_ISSUERCERT_BLOB, CURLOT_BLOB, 0},
+ {"PROXY_KEYPASSWD", CURLOPT_PROXY_KEYPASSWD, CURLOT_STRING, 0},
+ {"PROXY_PINNEDPUBLICKEY", CURLOPT_PROXY_PINNEDPUBLICKEY, CURLOT_STRING, 0},
+ {"PROXY_SERVICE_NAME", CURLOPT_PROXY_SERVICE_NAME, CURLOT_STRING, 0},
+ {"PROXY_SSLCERT", CURLOPT_PROXY_SSLCERT, CURLOT_STRING, 0},
+ {"PROXY_SSLCERTTYPE", CURLOPT_PROXY_SSLCERTTYPE, CURLOT_STRING, 0},
+ {"PROXY_SSLCERT_BLOB", CURLOPT_PROXY_SSLCERT_BLOB, CURLOT_BLOB, 0},
+ {"PROXY_SSLKEY", CURLOPT_PROXY_SSLKEY, CURLOT_STRING, 0},
+ {"PROXY_SSLKEYTYPE", CURLOPT_PROXY_SSLKEYTYPE, CURLOT_STRING, 0},
+ {"PROXY_SSLKEY_BLOB", CURLOPT_PROXY_SSLKEY_BLOB, CURLOT_BLOB, 0},
+ {"PROXY_SSLVERSION", CURLOPT_PROXY_SSLVERSION, CURLOT_VALUES, 0},
+ {"PROXY_SSL_CIPHER_LIST", CURLOPT_PROXY_SSL_CIPHER_LIST, CURLOT_STRING, 0},
+ {"PROXY_SSL_OPTIONS", CURLOPT_PROXY_SSL_OPTIONS, CURLOT_LONG, 0},
+ {"PROXY_SSL_VERIFYHOST", CURLOPT_PROXY_SSL_VERIFYHOST, CURLOT_LONG, 0},
+ {"PROXY_SSL_VERIFYPEER", CURLOPT_PROXY_SSL_VERIFYPEER, CURLOT_LONG, 0},
+ {"PROXY_TLS13_CIPHERS", CURLOPT_PROXY_TLS13_CIPHERS, CURLOT_STRING, 0},
+ {"PROXY_TLSAUTH_PASSWORD", CURLOPT_PROXY_TLSAUTH_PASSWORD,
+ CURLOT_STRING, 0},
+ {"PROXY_TLSAUTH_TYPE", CURLOPT_PROXY_TLSAUTH_TYPE, CURLOT_STRING, 0},
+ {"PROXY_TLSAUTH_USERNAME", CURLOPT_PROXY_TLSAUTH_USERNAME,
+ CURLOT_STRING, 0},
+ {"PROXY_TRANSFER_MODE", CURLOPT_PROXY_TRANSFER_MODE, CURLOT_LONG, 0},
+ {"PUT", CURLOPT_PUT, CURLOT_LONG, 0},
+ {"QUOTE", CURLOPT_QUOTE, CURLOT_SLIST, 0},
+ {"RANDOM_FILE", CURLOPT_RANDOM_FILE, CURLOT_STRING, 0},
+ {"RANGE", CURLOPT_RANGE, CURLOT_STRING, 0},
+ {"READDATA", CURLOPT_READDATA, CURLOT_CBPTR, 0},
+ {"READFUNCTION", CURLOPT_READFUNCTION, CURLOT_FUNCTION, 0},
+ {"REDIR_PROTOCOLS", CURLOPT_REDIR_PROTOCOLS, CURLOT_LONG, 0},
+ {"REFERER", CURLOPT_REFERER, CURLOT_STRING, 0},
+ {"REQUEST_TARGET", CURLOPT_REQUEST_TARGET, CURLOT_STRING, 0},
+ {"RESOLVE", CURLOPT_RESOLVE, CURLOT_SLIST, 0},
+ {"RESOLVER_START_DATA", CURLOPT_RESOLVER_START_DATA, CURLOT_CBPTR, 0},
+ {"RESOLVER_START_FUNCTION", CURLOPT_RESOLVER_START_FUNCTION,
+ CURLOT_FUNCTION, 0},
+ {"RESUME_FROM", CURLOPT_RESUME_FROM, CURLOT_LONG, 0},
+ {"RESUME_FROM_LARGE", CURLOPT_RESUME_FROM_LARGE, CURLOT_OFF_T, 0},
+ {"RTSPHEADER", CURLOPT_HTTPHEADER, CURLOT_SLIST, CURLOT_FLAG_ALIAS},
+ {"RTSP_CLIENT_CSEQ", CURLOPT_RTSP_CLIENT_CSEQ, CURLOT_LONG, 0},
+ {"RTSP_REQUEST", CURLOPT_RTSP_REQUEST, CURLOT_VALUES, 0},
+ {"RTSP_SERVER_CSEQ", CURLOPT_RTSP_SERVER_CSEQ, CURLOT_LONG, 0},
+ {"RTSP_SESSION_ID", CURLOPT_RTSP_SESSION_ID, CURLOT_STRING, 0},
+ {"RTSP_STREAM_URI", CURLOPT_RTSP_STREAM_URI, CURLOT_STRING, 0},
+ {"RTSP_TRANSPORT", CURLOPT_RTSP_TRANSPORT, CURLOT_STRING, 0},
+ {"SASL_AUTHZID", CURLOPT_SASL_AUTHZID, CURLOT_STRING, 0},
+ {"SASL_IR", CURLOPT_SASL_IR, CURLOT_LONG, 0},
+ {"SEEKDATA", CURLOPT_SEEKDATA, CURLOT_CBPTR, 0},
+ {"SEEKFUNCTION", CURLOPT_SEEKFUNCTION, CURLOT_FUNCTION, 0},
+ {"SERVER_RESPONSE_TIMEOUT", CURLOPT_FTP_RESPONSE_TIMEOUT,
+ CURLOT_LONG, CURLOT_FLAG_ALIAS},
+ {"SERVICE_NAME", CURLOPT_SERVICE_NAME, CURLOT_STRING, 0},
+ {"SHARE", CURLOPT_SHARE, CURLOT_OBJECT, 0},
+ {"SOCKOPTDATA", CURLOPT_SOCKOPTDATA, CURLOT_CBPTR, 0},
+ {"SOCKOPTFUNCTION", CURLOPT_SOCKOPTFUNCTION, CURLOT_FUNCTION, 0},
+ {"SOCKS5_AUTH", CURLOPT_SOCKS5_AUTH, CURLOT_LONG, 0},
+ {"SOCKS5_GSSAPI_NEC", CURLOPT_SOCKS5_GSSAPI_NEC, CURLOT_LONG, 0},
+ {"SOCKS5_GSSAPI_SERVICE", CURLOPT_SOCKS5_GSSAPI_SERVICE, CURLOT_STRING, 0},
+ {"SSH_AUTH_TYPES", CURLOPT_SSH_AUTH_TYPES, CURLOT_VALUES, 0},
+ {"SSH_COMPRESSION", CURLOPT_SSH_COMPRESSION, CURLOT_LONG, 0},
+ {"SSH_HOST_PUBLIC_KEY_MD5", CURLOPT_SSH_HOST_PUBLIC_KEY_MD5,
+ CURLOT_STRING, 0},
+ {"SSH_KEYDATA", CURLOPT_SSH_KEYDATA, CURLOT_CBPTR, 0},
+ {"SSH_KEYFUNCTION", CURLOPT_SSH_KEYFUNCTION, CURLOT_FUNCTION, 0},
+ {"SSH_KNOWNHOSTS", CURLOPT_SSH_KNOWNHOSTS, CURLOT_STRING, 0},
+ {"SSH_PRIVATE_KEYFILE", CURLOPT_SSH_PRIVATE_KEYFILE, CURLOT_STRING, 0},
+ {"SSH_PUBLIC_KEYFILE", CURLOPT_SSH_PUBLIC_KEYFILE, CURLOT_STRING, 0},
+ {"SSLCERT", CURLOPT_SSLCERT, CURLOT_STRING, 0},
+ {"SSLCERTPASSWD", CURLOPT_KEYPASSWD, CURLOT_STRING, CURLOT_FLAG_ALIAS},
+ {"SSLCERTTYPE", CURLOPT_SSLCERTTYPE, CURLOT_STRING, 0},
+ {"SSLCERT_BLOB", CURLOPT_SSLCERT_BLOB, CURLOT_BLOB, 0},
+ {"SSLENGINE", CURLOPT_SSLENGINE, CURLOT_STRING, 0},
+ {"SSLENGINE_DEFAULT", CURLOPT_SSLENGINE_DEFAULT, CURLOT_LONG, 0},
+ {"SSLKEY", CURLOPT_SSLKEY, CURLOT_STRING, 0},
+ {"SSLKEYPASSWD", CURLOPT_KEYPASSWD, CURLOT_STRING, CURLOT_FLAG_ALIAS},
+ {"SSLKEYTYPE", CURLOPT_SSLKEYTYPE, CURLOT_STRING, 0},
+ {"SSLKEY_BLOB", CURLOPT_SSLKEY_BLOB, CURLOT_BLOB, 0},
+ {"SSLVERSION", CURLOPT_SSLVERSION, CURLOT_VALUES, 0},
+ {"SSL_CIPHER_LIST", CURLOPT_SSL_CIPHER_LIST, CURLOT_STRING, 0},
+ {"SSL_CTX_DATA", CURLOPT_SSL_CTX_DATA, CURLOT_CBPTR, 0},
+ {"SSL_CTX_FUNCTION", CURLOPT_SSL_CTX_FUNCTION, CURLOT_FUNCTION, 0},
+ {"SSL_EC_CURVES", CURLOPT_SSL_EC_CURVES, CURLOT_STRING, 0},
+ {"SSL_ENABLE_ALPN", CURLOPT_SSL_ENABLE_ALPN, CURLOT_LONG, 0},
+ {"SSL_ENABLE_NPN", CURLOPT_SSL_ENABLE_NPN, CURLOT_LONG, 0},
+ {"SSL_FALSESTART", CURLOPT_SSL_FALSESTART, CURLOT_LONG, 0},
+ {"SSL_OPTIONS", CURLOPT_SSL_OPTIONS, CURLOT_VALUES, 0},
+ {"SSL_SESSIONID_CACHE", CURLOPT_SSL_SESSIONID_CACHE, CURLOT_LONG, 0},
+ {"SSL_VERIFYHOST", CURLOPT_SSL_VERIFYHOST, CURLOT_LONG, 0},
+ {"SSL_VERIFYPEER", CURLOPT_SSL_VERIFYPEER, CURLOT_LONG, 0},
+ {"SSL_VERIFYSTATUS", CURLOPT_SSL_VERIFYSTATUS, CURLOT_LONG, 0},
+ {"STDERR", CURLOPT_STDERR, CURLOT_OBJECT, 0},
+ {"STREAM_DEPENDS", CURLOPT_STREAM_DEPENDS, CURLOT_OBJECT, 0},
+ {"STREAM_DEPENDS_E", CURLOPT_STREAM_DEPENDS_E, CURLOT_OBJECT, 0},
+ {"STREAM_WEIGHT", CURLOPT_STREAM_WEIGHT, CURLOT_LONG, 0},
+ {"SUPPRESS_CONNECT_HEADERS", CURLOPT_SUPPRESS_CONNECT_HEADERS,
+ CURLOT_LONG, 0},
+ {"TCP_FASTOPEN", CURLOPT_TCP_FASTOPEN, CURLOT_LONG, 0},
+ {"TCP_KEEPALIVE", CURLOPT_TCP_KEEPALIVE, CURLOT_LONG, 0},
+ {"TCP_KEEPIDLE", CURLOPT_TCP_KEEPIDLE, CURLOT_LONG, 0},
+ {"TCP_KEEPINTVL", CURLOPT_TCP_KEEPINTVL, CURLOT_LONG, 0},
+ {"TCP_NODELAY", CURLOPT_TCP_NODELAY, CURLOT_LONG, 0},
+ {"TELNETOPTIONS", CURLOPT_TELNETOPTIONS, CURLOT_SLIST, 0},
+ {"TFTP_BLKSIZE", CURLOPT_TFTP_BLKSIZE, CURLOT_LONG, 0},
+ {"TFTP_NO_OPTIONS", CURLOPT_TFTP_NO_OPTIONS, CURLOT_LONG, 0},
+ {"TIMECONDITION", CURLOPT_TIMECONDITION, CURLOT_VALUES, 0},
+ {"TIMEOUT", CURLOPT_TIMEOUT, CURLOT_LONG, 0},
+ {"TIMEOUT_MS", CURLOPT_TIMEOUT_MS, CURLOT_LONG, 0},
+ {"TIMEVALUE", CURLOPT_TIMEVALUE, CURLOT_LONG, 0},
+ {"TIMEVALUE_LARGE", CURLOPT_TIMEVALUE_LARGE, CURLOT_OFF_T, 0},
+ {"TLS13_CIPHERS", CURLOPT_TLS13_CIPHERS, CURLOT_STRING, 0},
+ {"TLSAUTH_PASSWORD", CURLOPT_TLSAUTH_PASSWORD, CURLOT_STRING, 0},
+ {"TLSAUTH_TYPE", CURLOPT_TLSAUTH_TYPE, CURLOT_STRING, 0},
+ {"TLSAUTH_USERNAME", CURLOPT_TLSAUTH_USERNAME, CURLOT_STRING, 0},
+ {"TRAILERDATA", CURLOPT_TRAILERDATA, CURLOT_CBPTR, 0},
+ {"TRAILERFUNCTION", CURLOPT_TRAILERFUNCTION, CURLOT_FUNCTION, 0},
+ {"TRANSFERTEXT", CURLOPT_TRANSFERTEXT, CURLOT_LONG, 0},
+ {"TRANSFER_ENCODING", CURLOPT_TRANSFER_ENCODING, CURLOT_LONG, 0},
+ {"UNIX_SOCKET_PATH", CURLOPT_UNIX_SOCKET_PATH, CURLOT_STRING, 0},
+ {"UNRESTRICTED_AUTH", CURLOPT_UNRESTRICTED_AUTH, CURLOT_LONG, 0},
+ {"UPKEEP_INTERVAL_MS", CURLOPT_UPKEEP_INTERVAL_MS, CURLOT_LONG, 0},
+ {"UPLOAD", CURLOPT_UPLOAD, CURLOT_LONG, 0},
+ {"UPLOAD_BUFFERSIZE", CURLOPT_UPLOAD_BUFFERSIZE, CURLOT_LONG, 0},
+ {"URL", CURLOPT_URL, CURLOT_STRING, 0},
+ {"USERAGENT", CURLOPT_USERAGENT, CURLOT_STRING, 0},
+ {"USERNAME", CURLOPT_USERNAME, CURLOT_STRING, 0},
+ {"USERPWD", CURLOPT_USERPWD, CURLOT_STRING, 0},
+ {"USE_SSL", CURLOPT_USE_SSL, CURLOT_VALUES, 0},
+ {"VERBOSE", CURLOPT_VERBOSE, CURLOT_LONG, 0},
+ {"WILDCARDMATCH", CURLOPT_WILDCARDMATCH, CURLOT_LONG, 0},
+ {"WRITEDATA", CURLOPT_WRITEDATA, CURLOT_CBPTR, 0},
+ {"WRITEFUNCTION", CURLOPT_WRITEFUNCTION, CURLOT_FUNCTION, 0},
+ {"WRITEHEADER", CURLOPT_HEADERDATA, CURLOT_CBPTR, CURLOT_FLAG_ALIAS},
+ {"XFERINFODATA", CURLOPT_XFERINFODATA, CURLOT_CBPTR, 0},
+ {"XFERINFOFUNCTION", CURLOPT_XFERINFOFUNCTION, CURLOT_FUNCTION, 0},
+ {"XOAUTH2_BEARER", CURLOPT_XOAUTH2_BEARER, CURLOT_STRING, 0},
+ {NULL, CURLOPT_LASTENTRY, 0, 0} /* end of table */
+};
+
+#ifdef DEBUGBUILD
+/*
+ * Curl_easyopts_check() is a debug-only function that returns non-zero
+ * if this source file is not in sync with the options listed in curl/curl.h
+ */
+int Curl_easyopts_check(void)
+{
+ return (CURLOPT_LASTENTRY != (298 + 1));
+}
+#endif
diff --git a/lib/easyoptions.h b/lib/easyoptions.h
new file mode 100644
index 00000000..cd8b4100
--- /dev/null
+++ b/lib/easyoptions.h
@@ -0,0 +1,35 @@
+#ifndef HEADER_CURL_EASYOPTIONS_H
+#define HEADER_CURL_EASYOPTIONS_H
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+/* should probably go into the public header */
+
+#include <curl/curl.h>
+
+/* generated table with all easy options */
+extern struct curl_easyoption Curl_easyopts[];
+
+#ifdef DEBUGBUILD
+int Curl_easyopts_check(void);
+#endif
+#endif
diff --git a/lib/file.c b/lib/file.c
index cd3e49c3..1872dfef 100644
--- a/lib/file.c
+++ b/lib/file.c
@@ -67,8 +67,7 @@
#include "curl_memory.h"
#include "memdebug.h"
-#if defined(WIN32) || defined(MSDOS) || defined(__EMX__) || \
- defined(__SYMBIAN32__)
+#if defined(WIN32) || defined(MSDOS) || defined(__EMX__)
#define DOS_FILESYSTEM 1
#endif
@@ -112,6 +111,7 @@ const struct Curl_handler Curl_handler_file = {
ZERO_NULL, /* connection_check */
0, /* defport */
CURLPROTO_FILE, /* protocol */
+ CURLPROTO_FILE, /* family */
PROTOPT_NONETWORK | PROTOPT_NOURLQUERY /* flags */
};
diff --git a/lib/fileinfo.h b/lib/fileinfo.h
index f4d8f3b9..fdbad8bf 100644
--- a/lib/fileinfo.h
+++ b/lib/fileinfo.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2010 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2010 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -27,7 +27,7 @@
struct fileinfo {
struct curl_fileinfo info;
- struct curl_llist_element list;
+ struct Curl_llist_element list;
};
struct fileinfo *Curl_fileinfo_alloc(void);
diff --git a/lib/ftp.c b/lib/ftp.c
index 9fadac51..11031da6 100644
--- a/lib/ftp.c
+++ b/lib/ftp.c
@@ -59,7 +59,7 @@
#include "fileinfo.h"
#include "ftplistparser.h"
#include "curl_range.h"
-#include "curl_sec.h"
+#include "curl_krb5.h"
#include "strtoofft.h"
#include "strcase.h"
#include "vtls/vtls.h"
@@ -137,14 +137,10 @@ static int ftp_domore_getsock(struct connectdata *conn, curl_socket_t *socks);
static CURLcode ftp_doing(struct connectdata *conn,
bool *dophase_done);
static CURLcode ftp_setup_connection(struct connectdata *conn);
-
static CURLcode init_wc_data(struct connectdata *conn);
static CURLcode wc_statemach(struct connectdata *conn);
-
static void wc_data_dtor(void *ptr);
-
static CURLcode ftp_state_retr(struct connectdata *conn, curl_off_t filesize);
-
static CURLcode ftp_readresp(curl_socket_t sockfd,
struct pingpong *pp,
int *ftpcode,
@@ -152,12 +148,6 @@ static CURLcode ftp_readresp(curl_socket_t sockfd,
static CURLcode ftp_dophase_done(struct connectdata *conn,
bool connected);
-/* easy-to-use macro: */
-#define PPSENDF(x,y,z) result = Curl_pp_sendf(x,y,z); \
- if(result) \
- return result
-
-
/*
* FTP protocol handler.
*/
@@ -180,6 +170,7 @@ const struct Curl_handler Curl_handler_ftp = {
ZERO_NULL, /* connection_check */
PORT_FTP, /* defport */
CURLPROTO_FTP, /* protocol */
+ CURLPROTO_FTP, /* family */
PROTOPT_DUAL | PROTOPT_CLOSEACTION | PROTOPT_NEEDSPWD |
PROTOPT_NOURLQUERY | PROTOPT_PROXY_AS_HTTP |
PROTOPT_WILDCARD /* flags */
@@ -209,6 +200,7 @@ const struct Curl_handler Curl_handler_ftps = {
ZERO_NULL, /* connection_check */
PORT_FTPS, /* defport */
CURLPROTO_FTPS, /* protocol */
+ CURLPROTO_FTP, /* family */
PROTOPT_SSL | PROTOPT_DUAL | PROTOPT_CLOSEACTION |
PROTOPT_NEEDSPWD | PROTOPT_NOURLQUERY | PROTOPT_WILDCARD /* flags */
};
@@ -775,25 +767,22 @@ static void _state(struct connectdata *conn,
static CURLcode ftp_state_user(struct connectdata *conn)
{
- CURLcode result;
- /* send USER */
- PPSENDF(&conn->proto.ftpc.pp, "USER %s", conn->user?conn->user:"");
-
- state(conn, FTP_USER);
- conn->data->state.ftp_trying_alternative = FALSE;
-
- return CURLE_OK;
+ CURLcode result = Curl_pp_sendf(&conn->proto.ftpc.pp, "USER %s",
+ conn->user?conn->user:"");
+ if(!result) {
+ state(conn, FTP_USER);
+ conn->data->state.ftp_trying_alternative = FALSE;
+ }
+ return result;
}
static CURLcode ftp_state_pwd(struct connectdata *conn)
{
- CURLcode result;
-
- /* send PWD to discover our entry point */
- PPSENDF(&conn->proto.ftpc.pp, "%s", "PWD");
- state(conn, FTP_PWD);
+ CURLcode result = Curl_pp_sendf(&conn->proto.ftpc.pp, "%s", "PWD");
+ if(!result)
+ state(conn, FTP_PWD);
- return CURLE_OK;
+ return result;
}
/* For the FTP "protocol connect" and "doing" phases only */
@@ -881,16 +870,19 @@ static CURLcode ftp_state_cwd(struct connectdata *conn)
where we ended up after login: */
ftpc->cwdcount = 0; /* we count this as the first path, then we add one
for all upcoming ones in the ftp->dirs[] array */
- PPSENDF(&conn->proto.ftpc.pp, "CWD %s", ftpc->entrypath);
- state(conn, FTP_CWD);
+ result = Curl_pp_sendf(&ftpc->pp, "CWD %s", ftpc->entrypath);
+ if(!result)
+ state(conn, FTP_CWD);
}
else {
if(ftpc->dirdepth) {
ftpc->cwdcount = 1;
/* issue the first CWD, the rest is sent when the CWD responses are
received... */
- PPSENDF(&conn->proto.ftpc.pp, "CWD %s", ftpc->dirs[ftpc->cwdcount -1]);
- state(conn, FTP_CWD);
+ result = Curl_pp_sendf(&ftpc->pp, "CWD %s",
+ ftpc->dirs[ftpc->cwdcount -1]);
+ if(!result)
+ state(conn, FTP_CWD);
}
else {
/* No CWD necessary */
@@ -1326,12 +1318,12 @@ static CURLcode ftp_state_use_pasv(struct connectdata *conn)
modeoff = conn->bits.ftp_use_epsv?0:1;
- PPSENDF(&ftpc->pp, "%s", mode[modeoff]);
-
- ftpc->count1 = modeoff;
- state(conn, FTP_PASV);
- infof(conn->data, "Connect data stream passively\n");
-
+ result = Curl_pp_sendf(&ftpc->pp, "%s", mode[modeoff]);
+ if(!result) {
+ ftpc->count1 = modeoff;
+ state(conn, FTP_PASV);
+ infof(conn->data, "Connect data stream passively\n");
+ }
return result;
}
@@ -1364,23 +1356,23 @@ static CURLcode ftp_state_prepare_transfer(struct connectdata *conn)
if(data->set.ftp_use_pret) {
/* The user has requested that we send a PRET command
to prepare the server for the upcoming PASV */
- if(!conn->proto.ftpc.file) {
- PPSENDF(&conn->proto.ftpc.pp, "PRET %s",
- data->set.str[STRING_CUSTOMREQUEST]?
- data->set.str[STRING_CUSTOMREQUEST]:
- (data->set.ftp_list_only?"NLST":"LIST"));
- }
- else if(data->set.upload) {
- PPSENDF(&conn->proto.ftpc.pp, "PRET STOR %s", conn->proto.ftpc.file);
- }
- else {
- PPSENDF(&conn->proto.ftpc.pp, "PRET RETR %s", conn->proto.ftpc.file);
- }
- state(conn, FTP_PRET);
+ struct ftp_conn *ftpc = &conn->proto.ftpc;
+ if(!conn->proto.ftpc.file)
+ result = Curl_pp_sendf(&ftpc->pp, "PRET %s",
+ data->set.str[STRING_CUSTOMREQUEST]?
+ data->set.str[STRING_CUSTOMREQUEST]:
+ (data->set.ftp_list_only?"NLST":"LIST"));
+ else if(data->set.upload)
+ result = Curl_pp_sendf(&ftpc->pp, "PRET STOR %s",
+ conn->proto.ftpc.file);
+ else
+ result = Curl_pp_sendf(&ftpc->pp, "PRET RETR %s",
+ conn->proto.ftpc.file);
+ if(!result)
+ state(conn, FTP_PRET);
}
- else {
+ else
result = ftp_state_use_pasv(conn);
- }
}
return result;
}
@@ -1396,9 +1388,9 @@ static CURLcode ftp_state_rest(struct connectdata *conn)
/* Determine if server can respond to REST command and therefore
whether it supports range */
- PPSENDF(&conn->proto.ftpc.pp, "REST %d", 0);
-
- state(conn, FTP_REST);
+ result = Curl_pp_sendf(&ftpc->pp, "REST %d", 0);
+ if(!result)
+ state(conn, FTP_REST);
}
else
result = ftp_state_prepare_transfer(conn);
@@ -1416,9 +1408,9 @@ static CURLcode ftp_state_size(struct connectdata *conn)
/* if a "head"-like request is being made (on a file) */
/* we know ftpc->file is a valid pointer to a file name */
- PPSENDF(&ftpc->pp, "SIZE %s", ftpc->file);
-
- state(conn, FTP_SIZE);
+ result = Curl_pp_sendf(&ftpc->pp, "SIZE %s", ftpc->file);
+ if(!result)
+ state(conn, FTP_SIZE);
}
else
result = ftp_state_rest(conn);
@@ -1485,10 +1477,8 @@ static CURLcode ftp_state_list(struct connectdata *conn)
result = Curl_pp_sendf(&conn->proto.ftpc.pp, "%s", cmd);
free(cmd);
- if(result)
- return result;
-
- state(conn, FTP_LIST);
+ if(!result)
+ state(conn, FTP_LIST);
return result;
}
@@ -1549,9 +1539,10 @@ static CURLcode ftp_state_mdtm(struct connectdata *conn)
/* we have requested to get the modified-time of the file, this is a white
spot as the MDTM is not mentioned in RFC959 */
- PPSENDF(&ftpc->pp, "MDTM %s", ftpc->file);
+ result = Curl_pp_sendf(&ftpc->pp, "MDTM %s", ftpc->file);
- state(conn, FTP_MDTM);
+ if(!result)
+ state(conn, FTP_MDTM);
}
else
result = ftp_state_type(conn);
@@ -1587,8 +1578,9 @@ static CURLcode ftp_state_ul_setup(struct connectdata *conn,
if(data->state.resume_from < 0) {
/* Got no given size to start from, figure it out */
- PPSENDF(&ftpc->pp, "SIZE %s", ftpc->file);
- state(conn, FTP_STOR_SIZE);
+ result = Curl_pp_sendf(&ftpc->pp, "SIZE %s", ftpc->file);
+ if(!result)
+ state(conn, FTP_STOR_SIZE);
return result;
}
@@ -1650,10 +1642,10 @@ static CURLcode ftp_state_ul_setup(struct connectdata *conn,
/* we've passed, proceed as normal */
} /* resume_from */
- PPSENDF(&ftpc->pp, data->set.ftp_append?"APPE %s":"STOR %s",
- ftpc->file);
-
- state(conn, FTP_STOR);
+ result = Curl_pp_sendf(&ftpc->pp, data->set.ftp_append?"APPE %s":"STOR %s",
+ ftpc->file);
+ if(!result)
+ state(conn, FTP_STOR);
return result;
}
@@ -1711,7 +1703,9 @@ static CURLcode ftp_state_quote(struct connectdata *conn,
else
ftpc->count2 = 0; /* failure means cancel operation */
- PPSENDF(&ftpc->pp, "%s", cmd);
+ result = Curl_pp_sendf(&ftpc->pp, "%s", cmd);
+ if(result)
+ return result;
state(conn, instate);
quote = TRUE;
}
@@ -1740,12 +1734,14 @@ static CURLcode ftp_state_quote(struct connectdata *conn,
the server terminates it, otherwise the client stops if the
received byte count exceeds the reported file size. Set option
CURLOPT_IGNORE_CONTENT_LENGTH to 1 to enable this behavior.*/
- PPSENDF(&ftpc->pp, "RETR %s", ftpc->file);
- state(conn, FTP_RETR);
+ result = Curl_pp_sendf(&ftpc->pp, "RETR %s", ftpc->file);
+ if(!result)
+ state(conn, FTP_RETR);
}
else {
- PPSENDF(&ftpc->pp, "SIZE %s", ftpc->file);
- state(conn, FTP_RETR_SIZE);
+ result = Curl_pp_sendf(&ftpc->pp, "SIZE %s", ftpc->file);
+ if(!result)
+ state(conn, FTP_RETR_SIZE);
}
}
}
@@ -1782,10 +1778,12 @@ static CURLcode ftp_epsv_disable(struct connectdata *conn)
conn->bits.ftp_use_epsv = FALSE;
conn->data->state.errorbuf = FALSE; /* allow error message to get
rewritten */
- PPSENDF(&conn->proto.ftpc.pp, "%s", "PASV");
- conn->proto.ftpc.count1++;
- /* remain in/go to the FTP_PASV state */
- state(conn, FTP_PASV);
+ result = Curl_pp_sendf(&conn->proto.ftpc.pp, "%s", "PASV");
+ if(!result) {
+ conn->proto.ftpc.count1++;
+ /* remain in/go to the FTP_PASV state */
+ state(conn, FTP_PASV);
+ }
return result;
}
@@ -1864,8 +1862,8 @@ static CURLcode ftp_state_pasv_resp(struct connectdata *conn,
else if((ftpc->count1 == 1) &&
(ftpcode == 227)) {
/* positive PASV response */
- unsigned int ip[4];
- unsigned int port[2];
+ unsigned int ip[4] = {0, 0, 0, 0};
+ unsigned int port[2] = {0, 0};
/*
* Scan for a sequence of six comma-separated numbers and use them as
@@ -2092,7 +2090,7 @@ static CURLcode ftp_state_mdtm_resp(struct connectdata *conn,
break;
case 550: /* "No such file or directory" */
failf(data, "Given file does not exist");
- result = CURLE_FTP_COULDNT_RETR_FILE;
+ result = CURLE_REMOTE_FILE_NOT_FOUND;
break;
}
@@ -2229,15 +2227,16 @@ static CURLcode ftp_state_retr(struct connectdata *conn,
infof(data, "Instructs server to resume from offset %"
CURL_FORMAT_CURL_OFF_T "\n", data->state.resume_from);
- PPSENDF(&ftpc->pp, "REST %" CURL_FORMAT_CURL_OFF_T,
- data->state.resume_from);
-
- state(conn, FTP_RETR_REST);
+ result = Curl_pp_sendf(&ftpc->pp, "REST %" CURL_FORMAT_CURL_OFF_T,
+ data->state.resume_from);
+ if(!result)
+ state(conn, FTP_RETR_REST);
}
else {
/* no resume */
- PPSENDF(&ftpc->pp, "RETR %s", ftpc->file);
- state(conn, FTP_RETR);
+ result = Curl_pp_sendf(&ftpc->pp, "RETR %s", ftpc->file);
+ if(!result)
+ state(conn, FTP_RETR);
}
return result;
@@ -2272,6 +2271,10 @@ static CURLcode ftp_state_size_resp(struct connectdata *conn,
(void)curlx_strtoofft(fdigit, NULL, 0, &filesize);
}
+ else if(ftpcode == 550) { /* "No such file or directory" */
+ failf(data, "The file does not exist");
+ return CURLE_REMOTE_FILE_NOT_FOUND;
+ }
if(instate == FTP_SIZE) {
#ifdef CURL_FTP_HTTPSTYLE_HEAD
@@ -2326,8 +2329,9 @@ static CURLcode ftp_state_rest_resp(struct connectdata *conn,
result = CURLE_FTP_COULDNT_USE_REST;
}
else {
- PPSENDF(&ftpc->pp, "RETR %s", ftpc->file);
- state(conn, FTP_RETR);
+ result = Curl_pp_sendf(&ftpc->pp, "RETR %s", ftpc->file);
+ if(!result)
+ state(conn, FTP_RETR);
}
break;
}
@@ -2504,7 +2508,7 @@ static CURLcode ftp_state_loggedin(struct connectdata *conn)
{
CURLcode result = CURLE_OK;
- if(conn->ssl[FIRSTSOCKET].use) {
+ if(conn->bits.ftp_use_control_ssl) {
/* PBSZ = PROTECTION BUFFER SIZE.
The 'draft-murray-auth-ftp-ssl' (draft 12, page 7) says:
@@ -2519,8 +2523,9 @@ static CURLcode ftp_state_loggedin(struct connectdata *conn)
parameter of '0' to indicate that no buffering is taking place
and the data connection should not be encapsulated.
*/
- PPSENDF(&conn->proto.ftpc.pp, "PBSZ %d", 0);
- state(conn, FTP_PBSZ);
+ result = Curl_pp_sendf(&conn->proto.ftpc.pp, "PBSZ %d", 0);
+ if(!result)
+ state(conn, FTP_PBSZ);
}
else {
result = ftp_state_pwd(conn);
@@ -2542,8 +2547,9 @@ static CURLcode ftp_state_user_resp(struct connectdata *conn,
if((ftpcode == 331) && (ftpc->state == FTP_USER)) {
/* 331 Password required for ...
(the server requires to send the user's password too) */
- PPSENDF(&ftpc->pp, "PASS %s", conn->passwd?conn->passwd:"");
- state(conn, FTP_PASS);
+ result = Curl_pp_sendf(&ftpc->pp, "PASS %s", conn->passwd?conn->passwd:"");
+ if(!result)
+ state(conn, FTP_PASS);
}
else if(ftpcode/100 == 2) {
/* 230 User ... logged in.
@@ -2552,8 +2558,10 @@ static CURLcode ftp_state_user_resp(struct connectdata *conn,
}
else if(ftpcode == 332) {
if(data->set.str[STRING_FTP_ACCOUNT]) {
- PPSENDF(&ftpc->pp, "ACCT %s", data->set.str[STRING_FTP_ACCOUNT]);
- state(conn, FTP_ACCT);
+ result = Curl_pp_sendf(&ftpc->pp, "ACCT %s",
+ data->set.str[STRING_FTP_ACCOUNT]);
+ if(!result)
+ state(conn, FTP_ACCT);
}
else {
failf(data, "ACCT requested but none available");
@@ -2569,11 +2577,13 @@ static CURLcode ftp_state_user_resp(struct connectdata *conn,
if(conn->data->set.str[STRING_FTP_ALTERNATIVE_TO_USER] &&
!conn->data->state.ftp_trying_alternative) {
/* Ok, USER failed. Let's try the supplied command. */
- PPSENDF(&conn->proto.ftpc.pp, "%s",
- conn->data->set.str[STRING_FTP_ALTERNATIVE_TO_USER]);
- conn->data->state.ftp_trying_alternative = TRUE;
- state(conn, FTP_USER);
- result = CURLE_OK;
+ result =
+ Curl_pp_sendf(&ftpc->pp, "%s",
+ conn->data->set.str[STRING_FTP_ALTERNATIVE_TO_USER]);
+ if(!result) {
+ conn->data->state.ftp_trying_alternative = TRUE;
+ state(conn, FTP_USER);
+ }
}
else {
failf(data, "Access denied: %03d", ftpcode);
@@ -2649,14 +2659,8 @@ static CURLcode ftp_statemach_act(struct connectdata *conn)
}
#endif
- if(data->set.use_ssl &&
- (!conn->ssl[FIRSTSOCKET].use
-#ifndef CURL_DISABLE_PROXY
- || (conn->bits.proxy_ssl_connected[FIRSTSOCKET] &&
- !conn->proxy_ssl[FIRSTSOCKET].use)
-#endif
- )) {
- /* We don't have a SSL/TLS connection yet, but FTPS is
+ if(data->set.use_ssl && !conn->bits.ftp_use_control_ssl) {
+ /* We don't have a SSL/TLS control connection yet, but FTPS is
requested. Try a FTPS connection now */
ftpc->count3 = 0;
@@ -2675,15 +2679,12 @@ static CURLcode ftp_statemach_act(struct connectdata *conn)
(int)data->set.ftpsslauth);
return CURLE_UNKNOWN_OPTION; /* we don't know what to do */
}
- PPSENDF(&ftpc->pp, "AUTH %s", ftpauth[ftpc->count1]);
- state(conn, FTP_AUTH);
+ result = Curl_pp_sendf(&ftpc->pp, "AUTH %s", ftpauth[ftpc->count1]);
+ if(!result)
+ state(conn, FTP_AUTH);
}
- else {
+ else
result = ftp_state_user(conn);
- if(result)
- return result;
- }
-
break;
case FTP_AUTH:
@@ -2701,6 +2702,7 @@ static CURLcode ftp_statemach_act(struct connectdata *conn)
result = Curl_ssl_connect(conn, FIRSTSOCKET);
if(!result) {
conn->bits.ftp_use_data_ssl = FALSE; /* clear-text data */
+ conn->bits.ftp_use_control_ssl = TRUE; /* SSL on control */
result = ftp_state_user(conn);
}
}
@@ -2718,9 +2720,6 @@ static CURLcode ftp_statemach_act(struct connectdata *conn)
/* ignore the failure and continue */
result = ftp_state_user(conn);
}
-
- if(result)
- return result;
break;
case FTP_USER:
@@ -2733,10 +2732,11 @@ static CURLcode ftp_statemach_act(struct connectdata *conn)
break;
case FTP_PBSZ:
- PPSENDF(&ftpc->pp, "PROT %c",
- data->set.use_ssl == CURLUSESSL_CONTROL ? 'C' : 'P');
- state(conn, FTP_PROT);
-
+ result =
+ Curl_pp_sendf(&ftpc->pp, "PROT %c",
+ data->set.use_ssl == CURLUSESSL_CONTROL ? 'C' : 'P');
+ if(!result)
+ state(conn, FTP_PROT);
break;
case FTP_PROT:
@@ -2753,14 +2753,12 @@ static CURLcode ftp_statemach_act(struct connectdata *conn)
if(data->set.ftp_ccc) {
/* CCC - Clear Command Channel
*/
- PPSENDF(&ftpc->pp, "%s", "CCC");
- state(conn, FTP_CCC);
+ result = Curl_pp_sendf(&ftpc->pp, "%s", "CCC");
+ if(!result)
+ state(conn, FTP_CCC);
}
- else {
+ else
result = ftp_state_pwd(conn);
- if(result)
- return result;
- }
break;
case FTP_CCC:
@@ -2768,16 +2766,12 @@ static CURLcode ftp_statemach_act(struct connectdata *conn)
/* First shut down the SSL layer (note: this call will block) */
result = Curl_ssl_shutdown(conn, FIRSTSOCKET);
- if(result) {
+ if(result)
failf(conn->data, "Failed to clear the command channel (CCC)");
- return result;
- }
}
-
- /* Then continue as normal */
- result = ftp_state_pwd(conn);
- if(result)
- return result;
+ if(!result)
+ /* Then continue as normal */
+ result = ftp_state_pwd(conn);
break;
case FTP_PWD:
@@ -2843,7 +2837,6 @@ static CURLcode ftp_statemach_act(struct connectdata *conn)
systems. */
if(!ftpc->server_os && dir[0] != '/') {
-
result = Curl_pp_sendf(&ftpc->pp, "%s", "SYST");
if(result) {
free(dir);
@@ -2939,12 +2932,10 @@ static CURLcode ftp_statemach_act(struct connectdata *conn)
if((ftpcode >= 400) && !ftpc->count2) {
/* failure response code, and not allowed to fail */
failf(conn->data, "QUOT command failed with %03d", ftpcode);
- return CURLE_QUOTE_ERROR;
+ result = CURLE_QUOTE_ERROR;
}
- result = ftp_state_quote(conn, FALSE, ftpc->state);
- if(result)
- return result;
-
+ else
+ result = ftp_state_quote(conn, FALSE, ftpc->state);
break;
case FTP_CWD:
@@ -2954,29 +2945,28 @@ static CURLcode ftp_statemach_act(struct connectdata *conn)
ftpc->cwdcount && !ftpc->count2) {
/* try making it */
ftpc->count2++; /* counter to prevent CWD-MKD loops */
- PPSENDF(&ftpc->pp, "MKD %s", ftpc->dirs[ftpc->cwdcount - 1]);
- state(conn, FTP_MKD);
+ result = Curl_pp_sendf(&ftpc->pp, "MKD %s",
+ ftpc->dirs[ftpc->cwdcount - 1]);
+ if(!result)
+ state(conn, FTP_MKD);
}
else {
/* return failure */
failf(data, "Server denied you to change to the given directory");
ftpc->cwdfail = TRUE; /* don't remember this path as we failed
to enter it */
- return CURLE_REMOTE_ACCESS_DENIED;
+ result = CURLE_REMOTE_ACCESS_DENIED;
}
}
else {
/* success */
ftpc->count2 = 0;
- if(++ftpc->cwdcount <= ftpc->dirdepth) {
+ if(++ftpc->cwdcount <= ftpc->dirdepth)
/* send next CWD */
- PPSENDF(&ftpc->pp, "CWD %s", ftpc->dirs[ftpc->cwdcount - 1]);
- }
- else {
+ result = Curl_pp_sendf(&ftpc->pp, "CWD %s",
+ ftpc->dirs[ftpc->cwdcount - 1]);
+ else
result = ftp_state_mdtm(conn);
- if(result)
- return result;
- }
}
break;
@@ -2984,11 +2974,14 @@ static CURLcode ftp_statemach_act(struct connectdata *conn)
if((ftpcode/100 != 2) && !ftpc->count3--) {
/* failure to MKD the dir */
failf(data, "Failed to MKD dir: %03d", ftpcode);
- return CURLE_REMOTE_ACCESS_DENIED;
+ result = CURLE_REMOTE_ACCESS_DENIED;
+ }
+ else {
+ state(conn, FTP_CWD);
+ /* send CWD */
+ result = Curl_pp_sendf(&ftpc->pp, "CWD %s",
+ ftpc->dirs[ftpc->cwdcount - 1]);
}
- state(conn, FTP_CWD);
- /* send CWD */
- PPSENDF(&ftpc->pp, "CWD %s", ftpc->dirs[ftpc->cwdcount - 1]);
break;
case FTP_MDTM:
@@ -3091,7 +3084,7 @@ static CURLcode ftp_block_statemach(struct connectdata *conn)
*
*/
static CURLcode ftp_connect(struct connectdata *conn,
- bool *done) /* see description above */
+ bool *done) /* see description above */
{
CURLcode result;
struct ftp_conn *ftpc = &conn->proto.ftpc;
@@ -3112,8 +3105,10 @@ static CURLcode ftp_connect(struct connectdata *conn,
result = Curl_ssl_connect(conn, FIRSTSOCKET);
if(result)
return result;
+ conn->bits.ftp_use_control_ssl = TRUE;
}
+ Curl_pp_setup(pp); /* once per transfer */
Curl_pp_init(pp); /* init the generic pingpong data */
/* When we connect, we start in the state where we await the 220
@@ -3297,9 +3292,18 @@ static CURLcode ftp_done(struct connectdata *conn, CURLcode status,
if(!ftpc->dont_check) {
/* 226 Transfer complete, 250 Requested file action okay, completed. */
- if((ftpcode != 226) && (ftpcode != 250)) {
+ switch(ftpcode) {
+ case 226:
+ case 250:
+ break;
+ case 552:
+ failf(data, "Exceeded storage allocation");
+ result = CURLE_REMOTE_DISK_FULL;
+ break;
+ default:
failf(data, "server did not report OK, got %d", ftpcode);
result = CURLE_PARTIAL_FILE;
+ break;
}
}
}
@@ -3368,17 +3372,17 @@ static
CURLcode ftp_sendquote(struct connectdata *conn, struct curl_slist *quote)
{
struct curl_slist *item;
- ssize_t nread;
- int ftpcode;
- CURLcode result;
struct ftp_conn *ftpc = &conn->proto.ftpc;
struct pingpong *pp = &ftpc->pp;
item = quote;
while(item) {
if(item->data) {
+ ssize_t nread;
char *cmd = item->data;
bool acceptfail = FALSE;
+ CURLcode result;
+ int ftpcode = 0;
/* if a command starts with an asterisk, which a legal FTP command never
can, the command will be allowed to fail without it causing any
@@ -3390,11 +3394,11 @@ CURLcode ftp_sendquote(struct connectdata *conn, struct curl_slist *quote)
acceptfail = TRUE;
}
- PPSENDF(&conn->proto.ftpc.pp, "%s", cmd);
-
- pp->response = Curl_now(); /* timeout relative now */
-
- result = Curl_GetFTPResponse(&nread, conn, &ftpcode);
+ result = Curl_pp_sendf(&ftpc->pp, "%s", cmd);
+ if(!result) {
+ pp->response = Curl_now(); /* timeout relative now */
+ result = Curl_GetFTPResponse(&nread, conn, &ftpcode);
+ }
if(result)
return result;
@@ -3442,12 +3446,14 @@ static CURLcode ftp_nb_type(struct connectdata *conn,
return ftp_state_type_resp(conn, 200, newstate);
}
- PPSENDF(&ftpc->pp, "TYPE %c", want);
- state(conn, newstate);
+ result = Curl_pp_sendf(&ftpc->pp, "TYPE %c", want);
+ if(!result) {
+ state(conn, newstate);
- /* keep track of our current transfer type */
- ftpc->transfertype = want;
- return CURLE_OK;
+ /* keep track of our current transfer type */
+ ftpc->transfertype = want;
+ }
+ return result;
}
/***************************************************************************
@@ -3947,64 +3953,6 @@ static CURLcode ftp_do(struct connectdata *conn, bool *done)
return result;
}
-
-CURLcode Curl_ftpsend(struct connectdata *conn, const char *cmd)
-{
- ssize_t bytes_written;
-#define SBUF_SIZE 1024
- char s[SBUF_SIZE];
- size_t write_len;
- char *sptr = s;
- CURLcode result = CURLE_OK;
-#ifdef HAVE_GSSAPI
- enum protection_level data_sec = conn->data_prot;
-#endif
-
- if(!cmd)
- return CURLE_BAD_FUNCTION_ARGUMENT;
-
- write_len = strlen(cmd);
- if(!write_len || write_len > (sizeof(s) -3))
- return CURLE_BAD_FUNCTION_ARGUMENT;
-
- memcpy(&s, cmd, write_len);
- strcpy(&s[write_len], "\r\n"); /* append a trailing CRLF */
- write_len += 2;
- bytes_written = 0;
-
- result = Curl_convert_to_network(conn->data, s, write_len);
- /* Curl_convert_to_network calls failf if unsuccessful */
- if(result)
- return result;
-
- for(;;) {
-#ifdef HAVE_GSSAPI
- conn->data_prot = PROT_CMD;
-#endif
- result = Curl_write(conn, conn->sock[FIRSTSOCKET], sptr, write_len,
- &bytes_written);
-#ifdef HAVE_GSSAPI
- DEBUGASSERT(data_sec > PROT_NONE && data_sec < PROT_LAST);
- conn->data_prot = data_sec;
-#endif
-
- if(result)
- break;
-
- if(conn->data->set.verbose)
- Curl_debug(conn->data, CURLINFO_HEADER_OUT, sptr, (size_t)bytes_written);
-
- if(bytes_written != (ssize_t)write_len) {
- write_len -= bytes_written;
- sptr += bytes_written;
- }
- else
- break;
- }
-
- return result;
-}
-
/***********************************************************************
*
* ftp_quit()
@@ -4068,22 +4016,14 @@ static CURLcode ftp_disconnect(struct connectdata *conn, bool dead_connection)
if(data->state.most_recent_ftp_entrypath == ftpc->entrypath) {
data->state.most_recent_ftp_entrypath = NULL;
}
- free(ftpc->entrypath);
- ftpc->entrypath = NULL;
+ Curl_safefree(ftpc->entrypath);
}
freedirs(ftpc);
- free(ftpc->prevpath);
- ftpc->prevpath = NULL;
- free(ftpc->server_os);
- ftpc->server_os = NULL;
-
+ Curl_safefree(ftpc->prevpath);
+ Curl_safefree(ftpc->server_os);
Curl_pp_disconnect(pp);
-
-#ifdef HAVE_GSSAPI
Curl_sec_end(conn);
-#endif
-
return CURLE_OK;
}
diff --git a/lib/ftp.h b/lib/ftp.h
index 06421c6a..dbbdeb7c 100644
--- a/lib/ftp.h
+++ b/lib/ftp.h
@@ -31,7 +31,6 @@ extern const struct Curl_handler Curl_handler_ftp;
extern const struct Curl_handler Curl_handler_ftps;
#endif
-CURLcode Curl_ftpsend(struct connectdata *, const char *cmd);
CURLcode Curl_GetFTPResponse(ssize_t *nread, struct connectdata *conn,
int *ftpcode);
#endif /* CURL_DISABLE_FTP */
diff --git a/lib/ftplistparser.c b/lib/ftplistparser.c
index f399a4c2..c7b84a9f 100644
--- a/lib/ftplistparser.c
+++ b/lib/ftplistparser.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -274,7 +274,7 @@ static CURLcode ftp_pl_insert_finfo(struct connectdata *conn,
curl_fnmatch_callback compare;
struct WildcardData *wc = &conn->data->wildcard;
struct ftp_wc *ftpwc = wc->protdata;
- struct curl_llist *llist = &wc->filelist;
+ struct Curl_llist *llist = &wc->filelist;
struct ftp_parselist_data *parser = ftpwc->parser;
bool add = TRUE;
struct curl_fileinfo *finfo = &infop->info;
@@ -418,8 +418,8 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb,
finfo->b_data[parser->item_length - 1] = 0;
if(strncmp("total ", finfo->b_data, 6) == 0) {
char *endptr = finfo->b_data + 6;
- /* here we can deal with directory size, pass the leading white
- spaces and then the digits */
+ /* here we can deal with directory size, pass the leading
+ whitespace and then the digits */
while(ISSPACE(*endptr))
endptr++;
while(ISDIGIT(*endptr))
diff --git a/lib/getinfo.c b/lib/getinfo.c
index 82691dcc..49e79e47 100644
--- a/lib/getinfo.c
+++ b/lib/getinfo.c
@@ -269,6 +269,9 @@ static CURLcode getinfo_long(struct Curl_easy *data, CURLINFO info,
/* Return the local port of the most recent (primary) connection */
*param_longp = data->info.conn_local_port;
break;
+ case CURLINFO_PROXY_ERROR:
+ *param_longp = (long)data->info.pxcode;
+ break;
case CURLINFO_CONDITION_UNMET:
if(data->info.httpcode == 304)
*param_longp = 1L;
diff --git a/lib/gopher.c b/lib/gopher.c
index b4811b28..ce741313 100644
--- a/lib/gopher.c
+++ b/lib/gopher.c
@@ -71,6 +71,7 @@ const struct Curl_handler Curl_handler_gopher = {
ZERO_NULL, /* connection_check */
PORT_GOPHER, /* defport */
CURLPROTO_GOPHER, /* protocol */
+ CURLPROTO_GOPHER, /* family */
PROTOPT_NONE /* flags */
};
@@ -170,9 +171,7 @@ static CURLcode gopher_do(struct connectdata *conn, bool *done)
free(sel_org);
if(!result)
- /* We can use Curl_sendf to send the terminal \r\n relatively safely and
- save allocing another string/doing another _write loop. */
- result = Curl_sendf(sockfd, conn, "\r\n");
+ result = Curl_write(conn, sockfd, "\r\n", 2, &amount);
if(result) {
failf(data, "Failed sending Gopher request");
return result;
diff --git a/lib/hash.c b/lib/hash.c
index 421d68f7..8c1f6cd0 100644
--- a/lib/hash.c
+++ b/lib/hash.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -34,8 +34,8 @@
static void
hash_element_dtor(void *user, void *element)
{
- struct curl_hash *h = (struct curl_hash *) user;
- struct curl_hash_element *e = (struct curl_hash_element *) element;
+ struct Curl_hash *h = (struct Curl_hash *) user;
+ struct Curl_hash_element *e = (struct Curl_hash_element *) element;
if(e->ptr) {
h->dtor(e->ptr);
@@ -54,11 +54,11 @@ hash_element_dtor(void *user, void *element)
* @unittest: 1603
*/
int
-Curl_hash_init(struct curl_hash *h,
+Curl_hash_init(struct Curl_hash *h,
int slots,
hash_function hfunc,
comp_function comparator,
- curl_hash_dtor dtor)
+ Curl_hash_dtor dtor)
{
if(!slots || !hfunc || !comparator ||!dtor) {
return 1; /* failure */
@@ -70,22 +70,22 @@ Curl_hash_init(struct curl_hash *h,
h->size = 0;
h->slots = slots;
- h->table = malloc(slots * sizeof(struct curl_llist));
+ h->table = malloc(slots * sizeof(struct Curl_llist));
if(h->table) {
int i;
for(i = 0; i < slots; ++i)
- Curl_llist_init(&h->table[i], (curl_llist_dtor) hash_element_dtor);
+ Curl_llist_init(&h->table[i], (Curl_llist_dtor) hash_element_dtor);
return 0; /* fine */
}
h->slots = 0;
return 1; /* failure */
}
-static struct curl_hash_element *
+static struct Curl_hash_element *
mk_hash_element(const void *key, size_t key_len, const void *p)
{
/* allocate the struct plus memory after it to store the key */
- struct curl_hash_element *he = malloc(sizeof(struct curl_hash_element) +
+ struct Curl_hash_element *he = malloc(sizeof(struct Curl_hash_element) +
key_len);
if(he) {
/* copy the key */
@@ -106,14 +106,14 @@ mk_hash_element(const void *key, size_t key_len, const void *p)
* @unittest: 1603
*/
void *
-Curl_hash_add(struct curl_hash *h, void *key, size_t key_len, void *p)
+Curl_hash_add(struct Curl_hash *h, void *key, size_t key_len, void *p)
{
- struct curl_hash_element *he;
- struct curl_llist_element *le;
- struct curl_llist *l = FETCH_LIST(h, key, key_len);
+ struct Curl_hash_element *he;
+ struct Curl_llist_element *le;
+ struct Curl_llist *l = FETCH_LIST(h, key, key_len);
for(le = l->head; le; le = le->next) {
- he = (struct curl_hash_element *) le->ptr;
+ he = (struct Curl_hash_element *) le->ptr;
if(h->comp_func(he->key, he->key_len, key, key_len)) {
Curl_llist_remove(l, le, (void *)h);
--h->size;
@@ -136,13 +136,13 @@ Curl_hash_add(struct curl_hash *h, void *key, size_t key_len, void *p)
*
* @unittest: 1603
*/
-int Curl_hash_delete(struct curl_hash *h, void *key, size_t key_len)
+int Curl_hash_delete(struct Curl_hash *h, void *key, size_t key_len)
{
- struct curl_llist_element *le;
- struct curl_llist *l = FETCH_LIST(h, key, key_len);
+ struct Curl_llist_element *le;
+ struct Curl_llist *l = FETCH_LIST(h, key, key_len);
for(le = l->head; le; le = le->next) {
- struct curl_hash_element *he = le->ptr;
+ struct Curl_hash_element *he = le->ptr;
if(h->comp_func(he->key, he->key_len, key, key_len)) {
Curl_llist_remove(l, le, (void *) h);
--h->size;
@@ -157,15 +157,15 @@ int Curl_hash_delete(struct curl_hash *h, void *key, size_t key_len)
* @unittest: 1603
*/
void *
-Curl_hash_pick(struct curl_hash *h, void *key, size_t key_len)
+Curl_hash_pick(struct Curl_hash *h, void *key, size_t key_len)
{
- struct curl_llist_element *le;
- struct curl_llist *l;
+ struct Curl_llist_element *le;
+ struct Curl_llist *l;
if(h) {
l = FETCH_LIST(h, key, key_len);
for(le = l->head; le; le = le->next) {
- struct curl_hash_element *he = le->ptr;
+ struct Curl_hash_element *he = le->ptr;
if(h->comp_func(he->key, he->key_len, key, key_len)) {
return he->ptr;
}
@@ -177,17 +177,17 @@ Curl_hash_pick(struct curl_hash *h, void *key, size_t key_len)
#if defined(DEBUGBUILD) && defined(AGGRESIVE_TEST)
void
-Curl_hash_apply(curl_hash *h, void *user,
+Curl_hash_apply(Curl_hash *h, void *user,
void (*cb)(void *user, void *ptr))
{
- struct curl_llist_element *le;
+ struct Curl_llist_element *le;
int i;
for(i = 0; i < h->slots; ++i) {
for(le = (h->table[i])->head;
le;
le = le->next) {
- curl_hash_element *el = le->ptr;
+ Curl_hash_element *el = le->ptr;
cb(user, el->ptr);
}
}
@@ -202,7 +202,7 @@ Curl_hash_apply(curl_hash *h, void *user,
* @unittest: 1603
*/
void
-Curl_hash_destroy(struct curl_hash *h)
+Curl_hash_destroy(struct Curl_hash *h)
{
int i;
@@ -220,19 +220,19 @@ Curl_hash_destroy(struct curl_hash *h)
* @unittest: 1602
*/
void
-Curl_hash_clean(struct curl_hash *h)
+Curl_hash_clean(struct Curl_hash *h)
{
Curl_hash_clean_with_criterium(h, NULL, NULL);
}
/* Cleans all entries that pass the comp function criteria. */
void
-Curl_hash_clean_with_criterium(struct curl_hash *h, void *user,
+Curl_hash_clean_with_criterium(struct Curl_hash *h, void *user,
int (*comp)(void *, void *))
{
- struct curl_llist_element *le;
- struct curl_llist_element *lnext;
- struct curl_llist *list;
+ struct Curl_llist_element *le;
+ struct Curl_llist_element *lnext;
+ struct Curl_llist *list;
int i;
if(!h)
@@ -242,7 +242,7 @@ Curl_hash_clean_with_criterium(struct curl_hash *h, void *user,
list = &h->table[i];
le = list->head; /* get first list entry */
while(le) {
- struct curl_hash_element *he = le->ptr;
+ struct Curl_hash_element *he = le->ptr;
lnext = le->next;
/* ask the callback function if we shall remove this entry or not */
if(comp == NULL || comp(user, he->ptr)) {
@@ -277,18 +277,18 @@ size_t Curl_str_key_compare(void *k1, size_t key1_len,
return 0;
}
-void Curl_hash_start_iterate(struct curl_hash *hash,
- struct curl_hash_iterator *iter)
+void Curl_hash_start_iterate(struct Curl_hash *hash,
+ struct Curl_hash_iterator *iter)
{
iter->hash = hash;
iter->slot_index = 0;
iter->current_element = NULL;
}
-struct curl_hash_element *
-Curl_hash_next_element(struct curl_hash_iterator *iter)
+struct Curl_hash_element *
+Curl_hash_next_element(struct Curl_hash_iterator *iter)
{
- struct curl_hash *h = iter->hash;
+ struct Curl_hash *h = iter->hash;
/* Get the next element in the current list, if any */
if(iter->current_element)
@@ -307,7 +307,7 @@ Curl_hash_next_element(struct curl_hash_iterator *iter)
}
if(iter->current_element) {
- struct curl_hash_element *he = iter->current_element->ptr;
+ struct Curl_hash_element *he = iter->current_element->ptr;
return he;
}
iter->current_element = NULL;
@@ -315,11 +315,11 @@ Curl_hash_next_element(struct curl_hash_iterator *iter)
}
#if 0 /* useful function for debugging hashes and their contents */
-void Curl_hash_print(struct curl_hash *h,
+void Curl_hash_print(struct Curl_hash *h,
void (*func)(void *))
{
- struct curl_hash_iterator iter;
- struct curl_hash_element *he;
+ struct Curl_hash_iterator iter;
+ struct Curl_hash_element *he;
int last_index = -1;
if(!h)
diff --git a/lib/hash.h b/lib/hash.h
index 558d0f47..eb5104b8 100644
--- a/lib/hash.h
+++ b/lib/hash.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -41,59 +41,59 @@ typedef size_t (*comp_function) (void *key1,
void *key2,
size_t key2_len);
-typedef void (*curl_hash_dtor)(void *);
+typedef void (*Curl_hash_dtor)(void *);
-struct curl_hash {
- struct curl_llist *table;
+struct Curl_hash {
+ struct Curl_llist *table;
/* Hash function to be used for this hash table */
hash_function hash_func;
/* Comparator function to compare keys */
comp_function comp_func;
- curl_hash_dtor dtor;
+ Curl_hash_dtor dtor;
int slots;
size_t size;
};
-struct curl_hash_element {
- struct curl_llist_element list;
+struct Curl_hash_element {
+ struct Curl_llist_element list;
void *ptr;
size_t key_len;
char key[1]; /* allocated memory following the struct */
};
-struct curl_hash_iterator {
- struct curl_hash *hash;
+struct Curl_hash_iterator {
+ struct Curl_hash *hash;
int slot_index;
- struct curl_llist_element *current_element;
+ struct Curl_llist_element *current_element;
};
-int Curl_hash_init(struct curl_hash *h,
+int Curl_hash_init(struct Curl_hash *h,
int slots,
hash_function hfunc,
comp_function comparator,
- curl_hash_dtor dtor);
+ Curl_hash_dtor dtor);
-void *Curl_hash_add(struct curl_hash *h, void *key, size_t key_len, void *p);
-int Curl_hash_delete(struct curl_hash *h, void *key, size_t key_len);
-void *Curl_hash_pick(struct curl_hash *, void *key, size_t key_len);
-void Curl_hash_apply(struct curl_hash *h, void *user,
+void *Curl_hash_add(struct Curl_hash *h, void *key, size_t key_len, void *p);
+int Curl_hash_delete(struct Curl_hash *h, void *key, size_t key_len);
+void *Curl_hash_pick(struct Curl_hash *, void *key, size_t key_len);
+void Curl_hash_apply(struct Curl_hash *h, void *user,
void (*cb)(void *user, void *ptr));
#define Curl_hash_count(h) ((h)->size)
-void Curl_hash_destroy(struct curl_hash *h);
-void Curl_hash_clean(struct curl_hash *h);
-void Curl_hash_clean_with_criterium(struct curl_hash *h, void *user,
+void Curl_hash_destroy(struct Curl_hash *h);
+void Curl_hash_clean(struct Curl_hash *h);
+void Curl_hash_clean_with_criterium(struct Curl_hash *h, void *user,
int (*comp)(void *, void *));
size_t Curl_hash_str(void *key, size_t key_length, size_t slots_num);
size_t Curl_str_key_compare(void *k1, size_t key1_len, void *k2,
size_t key2_len);
-void Curl_hash_start_iterate(struct curl_hash *hash,
- struct curl_hash_iterator *iter);
-struct curl_hash_element *
-Curl_hash_next_element(struct curl_hash_iterator *iter);
+void Curl_hash_start_iterate(struct Curl_hash *hash,
+ struct Curl_hash_iterator *iter);
+struct Curl_hash_element *
+Curl_hash_next_element(struct Curl_hash_iterator *iter);
-void Curl_hash_print(struct curl_hash *h,
+void Curl_hash_print(struct Curl_hash *h,
void (*func)(void *));
diff --git a/lib/hostip.c b/lib/hostip.c
index dd5916e3..57c8bd3d 100644
--- a/lib/hostip.c
+++ b/lib/hostip.c
@@ -206,7 +206,7 @@ hostcache_timestamp_remove(void *datap, void *hc)
* Prune the DNS cache. This assumes that a lock has already been taken.
*/
static void
-hostcache_prune(struct curl_hash *hostcache, long cache_timeout, time_t now)
+hostcache_prune(struct Curl_hash *hostcache, long cache_timeout, time_t now)
{
struct hostcache_prune_data user;
@@ -843,7 +843,7 @@ static void freednsentry(void *freethis)
/*
* Curl_mk_dnscache() inits a new DNS cache and returns success/failure.
*/
-int Curl_mk_dnscache(struct curl_hash *hash)
+int Curl_mk_dnscache(struct Curl_hash *hash)
{
return Curl_hash_init(hash, 7, Curl_hash_str, Curl_str_key_compare,
freednsentry);
@@ -857,7 +857,7 @@ int Curl_mk_dnscache(struct curl_hash *hash)
*/
void Curl_hostcache_clean(struct Curl_easy *data,
- struct curl_hash *hash)
+ struct Curl_hash *hash)
{
if(data && data->share)
Curl_share_lock(data, CURL_LOCK_DATA_DNS, CURL_LOCK_ACCESS_SINGLE);
diff --git a/lib/hostip.h b/lib/hostip.h
index 374b06c8..fb782d56 100644
--- a/lib/hostip.h
+++ b/lib/hostip.h
@@ -59,9 +59,9 @@ struct connectdata;
* Global DNS cache is general badness. Do not use. This will be removed in
* a future version. Use the share interface instead!
*
- * Returns a struct curl_hash pointer on success, NULL on failure.
+ * Returns a struct Curl_hash pointer on success, NULL on failure.
*/
-struct curl_hash *Curl_global_host_cache_init(void);
+struct Curl_hash *Curl_global_host_cache_init(void);
struct Curl_dns_entry {
struct Curl_addrinfo *addr;
@@ -128,7 +128,7 @@ void Curl_resolv_unlock(struct Curl_easy *data,
struct Curl_dns_entry *dns);
/* init a new dns cache and return success */
-int Curl_mk_dnscache(struct curl_hash *hash);
+int Curl_mk_dnscache(struct Curl_hash *hash);
/* prune old entries from the DNS cache */
void Curl_hostcache_prune(struct Curl_easy *data);
@@ -234,7 +234,7 @@ CURLcode Curl_set_dns_local_ip6(struct Curl_easy *data,
/*
* Clean off entries from the cache
*/
-void Curl_hostcache_clean(struct Curl_easy *data, struct curl_hash *hash);
+void Curl_hostcache_clean(struct Curl_easy *data, struct Curl_hash *hash);
/*
* Populate the cache with specified entries from CURLOPT_RESOLVE.
diff --git a/lib/http.c b/lib/http.c
index 8fcdd436..e0be17d9 100644
--- a/lib/http.c
+++ b/lib/http.c
@@ -125,6 +125,7 @@ const struct Curl_handler Curl_handler_http = {
ZERO_NULL, /* connection_check */
PORT_HTTP, /* defport */
CURLPROTO_HTTP, /* protocol */
+ CURLPROTO_HTTP, /* family */
PROTOPT_CREDSPERREQUEST | /* flags */
PROTOPT_USERPWDCTRL
};
@@ -151,6 +152,7 @@ const struct Curl_handler Curl_handler_https = {
ZERO_NULL, /* connection_check */
PORT_HTTPS, /* defport */
CURLPROTO_HTTPS, /* protocol */
+ CURLPROTO_HTTP, /* family */
PROTOPT_SSL | PROTOPT_CREDSPERREQUEST | PROTOPT_ALPN_NPN | /* flags */
PROTOPT_USERPWDCTRL
};
@@ -1353,7 +1355,7 @@ Curl_compareheader(const char *headerline, /* line to check */
/* pass the header */
start = &headerline[hlen];
- /* pass all white spaces */
+ /* pass all whitespace */
while(*start && ISSPACE(*start))
start++;
diff --git a/lib/http2.c b/lib/http2.c
index d316da8b..925d9828 100644
--- a/lib/http2.c
+++ b/lib/http2.c
@@ -300,6 +300,7 @@ static const struct Curl_handler Curl_handler_http2 = {
http2_conncheck, /* connection_check */
PORT_HTTP, /* defport */
CURLPROTO_HTTP, /* protocol */
+ CURLPROTO_HTTP, /* family */
PROTOPT_STREAM /* flags */
};
@@ -321,6 +322,7 @@ static const struct Curl_handler Curl_handler_http2_ssl = {
http2_conncheck, /* connection_check */
PORT_HTTP, /* defport */
CURLPROTO_HTTPS, /* protocol */
+ CURLPROTO_HTTP, /* family */
PROTOPT_SSL | PROTOPT_STREAM /* flags */
};
@@ -1207,13 +1209,6 @@ void Curl_http2_done(struct Curl_easy *data, bool premature)
}
http->stream_id = 0;
}
-
- if(0 == nghttp2_session_check_request_allowed(httpc->h2)) {
- /* No more requests are allowed in the current session, so the connection
- may not be reused. This is set when a GOAWAY frame has been received or
- when the limit of stream identifiers has been reached. */
- connclose(data->conn, "http/2: No new requests allowed");
- }
}
/*
@@ -1288,7 +1283,7 @@ CURLcode Curl_http2_request_upgrade(struct dynbuf *req,
binlen = nghttp2_pack_settings_payload(binsettings, H2_BINSETTINGS_LEN,
httpc->local_settings,
httpc->local_settings_num);
- if(!binlen) {
+ if(binlen <= 0) {
failf(conn->data, "nghttp2 unexpectedly failed on pack_settings_payload");
Curl_dyn_free(req);
return CURLE_FAILED_INIT;
@@ -1371,6 +1366,14 @@ static int h2_process_pending_input(struct connectdata *conn,
return -1;
}
+ if(nghttp2_session_check_request_allowed(httpc->h2) == 0) {
+ /* No more requests are allowed in the current session, so
+ the connection may not be reused. This is set when a
+ GOAWAY frame has been received or when the limit of stream
+ identifiers has been reached. */
+ connclose(conn, "http/2: No new requests allowed");
+ }
+
if(should_close_session(httpc)) {
H2BUGF(infof(data,
"h2_process_pending_input: nothing to do in this session\n"));
@@ -1383,7 +1386,6 @@ static int h2_process_pending_input(struct connectdata *conn,
}
return -1;
}
-
return 0;
}
@@ -1564,8 +1566,6 @@ static int h2_session_send(struct Curl_easy *data,
static ssize_t http2_recv(struct connectdata *conn, int sockindex,
char *mem, size_t len, CURLcode *err)
{
- CURLcode result = CURLE_OK;
- ssize_t rv;
ssize_t nread;
struct http_conn *httpc = &conn->proto.httpc;
struct Curl_easy *data = conn->data;
@@ -1632,8 +1632,7 @@ static ssize_t http2_recv(struct connectdata *conn, int sockindex,
/* We have paused nghttp2, but we have no pause data (see
on_data_chunk_recv). */
httpc->pause_stream_id = 0;
- if(h2_process_pending_input(conn, httpc, &result) != 0) {
- *err = result;
+ if(h2_process_pending_input(conn, httpc, err) != 0) {
return -1;
}
}
@@ -1661,8 +1660,7 @@ static ssize_t http2_recv(struct connectdata *conn, int sockindex,
frames, then we have to call it again with 0-length data.
Without this, on_stream_close callback will not be called,
and stream could be hanged. */
- if(h2_process_pending_input(conn, httpc, &result) != 0) {
- *err = result;
+ if(h2_process_pending_input(conn, httpc, err) != 0) {
return -1;
}
}
@@ -1688,7 +1686,6 @@ static ssize_t http2_recv(struct connectdata *conn, int sockindex,
return -1;
}
else {
- char *inbuf;
/* remember where to store incoming data for this stream and how big the
buffer is */
stream->mem = mem;
@@ -1697,16 +1694,15 @@ static ssize_t http2_recv(struct connectdata *conn, int sockindex,
if(httpc->inbuflen == 0) {
nread = ((Curl_recv *)httpc->recv_underlying)(
- conn, FIRSTSOCKET, httpc->inbuf, H2_BUFSIZE, &result);
+ conn, FIRSTSOCKET, httpc->inbuf, H2_BUFSIZE, err);
if(nread == -1) {
- if(result != CURLE_AGAIN)
+ if(*err != CURLE_AGAIN)
failf(data, "Failed receiving HTTP2 data");
else if(stream->closed)
/* received when the stream was already closed! */
return http2_handle_stream_close(conn, data, stream, err);
- *err = result;
return -1;
}
@@ -1719,47 +1715,18 @@ static ssize_t http2_recv(struct connectdata *conn, int sockindex,
H2BUGF(infof(data, "nread=%zd\n", nread));
httpc->inbuflen = nread;
- inbuf = httpc->inbuf;
+
+ DEBUGASSERT(httpc->nread_inbuf == 0);
}
else {
nread = httpc->inbuflen - httpc->nread_inbuf;
- inbuf = httpc->inbuf + httpc->nread_inbuf;
-
+ (void)nread; /* silence warning, used in debug */
H2BUGF(infof(data, "Use data left in connection buffer, nread=%zd\n",
nread));
}
- rv = nghttp2_session_mem_recv(httpc->h2, (const uint8_t *)inbuf, nread);
- if(nghttp2_is_fatal((int)rv)) {
- failf(data, "nghttp2_session_mem_recv() returned %zd:%s\n",
- rv, nghttp2_strerror((int)rv));
- *err = CURLE_RECV_ERROR;
- return -1;
- }
- H2BUGF(infof(data, "nghttp2_session_mem_recv() returns %zd\n", rv));
- if(nread == rv) {
- H2BUGF(infof(data, "All data in connection buffer processed\n"));
- httpc->inbuflen = 0;
- httpc->nread_inbuf = 0;
- }
- else {
- httpc->nread_inbuf += rv;
- H2BUGF(infof(data, "%zu bytes left in connection buffer\n",
- httpc->inbuflen - httpc->nread_inbuf));
- }
- /* Always send pending frames in nghttp2 session, because
- nghttp2_session_mem_recv() may queue new frame */
- rv = h2_session_send(data, httpc->h2);
- if(rv != 0) {
- *err = CURLE_SEND_ERROR;
- return -1;
- }
-
- if(should_close_session(httpc)) {
- H2BUGF(infof(data, "http2_recv: nothing to do in this session\n"));
- *err = CURLE_HTTP2;
+ if(h2_process_pending_input(conn, httpc, err) != 0)
return -1;
- }
}
if(stream->memlen) {
ssize_t retlen = stream->memlen;
@@ -2112,7 +2079,7 @@ static ssize_t http2_send(struct connectdata *conn, int sockindex,
h2_pri_spec(conn->data, &pri_spec);
H2BUGF(infof(conn->data, "http2_send request allowed %d (easy handle %p)\n",
- nghttp2_session_check_request_allowed(h2), (void *)conn->data));
+ nghttp2_session_check_request_allowed(h2), (void *)conn->data));
switch(conn->data->state.httpreq) {
case HTTPREQ_POST:
@@ -2138,7 +2105,9 @@ static ssize_t http2_send(struct connectdata *conn, int sockindex,
Curl_safefree(nva);
if(stream_id < 0) {
- H2BUGF(infof(conn->data, "http2_send() send error\n"));
+ H2BUGF(infof(conn->data,
+ "http2_send() nghttp2_submit_request error (%s)%d\n",
+ nghttp2_strerror(stream_id), stream_id));
*err = CURLE_SEND_ERROR;
return -1;
}
@@ -2148,10 +2117,13 @@ static ssize_t http2_send(struct connectdata *conn, int sockindex,
stream->stream_id = stream_id;
/* this does not call h2_session_send() since there can not have been any
- * priority upodate since the nghttp2_submit_request() call above */
+ * priority update since the nghttp2_submit_request() call above */
rv = nghttp2_session_send(h2);
-
if(rv != 0) {
+ H2BUGF(infof(conn->data,
+ "http2_send() nghttp2_session_send error (%s)%d\n",
+ nghttp2_strerror(rv), rv));
+
*err = CURLE_SEND_ERROR;
return -1;
}
@@ -2236,7 +2208,6 @@ CURLcode Curl_http2_switched(struct connectdata *conn,
CURLcode result;
struct http_conn *httpc = &conn->proto.httpc;
int rv;
- ssize_t nproc;
struct Curl_easy *data = conn->data;
struct HTTP *stream = conn->data->req.protop;
@@ -2310,41 +2281,13 @@ CURLcode Curl_http2_switched(struct connectdata *conn,
if(nread)
memcpy(httpc->inbuf, mem, nread);
- httpc->inbuflen = nread;
-
- nproc = nghttp2_session_mem_recv(httpc->h2, (const uint8_t *)httpc->inbuf,
- httpc->inbuflen);
-
- if(nghttp2_is_fatal((int)nproc)) {
- failf(data, "nghttp2_session_mem_recv() failed: %s(%d)",
- nghttp2_strerror((int)nproc), (int)nproc);
- return CURLE_HTTP2;
- }
-
- H2BUGF(infof(data, "nghttp2_session_mem_recv() returns %zd\n", nproc));
-
- if((ssize_t)nread == nproc) {
- httpc->inbuflen = 0;
- httpc->nread_inbuf = 0;
- }
- else {
- httpc->nread_inbuf += nproc;
- }
- /* Try to send some frames since we may read SETTINGS already. */
- rv = h2_session_send(data, httpc->h2);
+ httpc->inbuflen = nread;
- if(rv != 0) {
- failf(data, "nghttp2_session_send() failed: %s(%d)",
- nghttp2_strerror(rv), rv);
- return CURLE_HTTP2;
- }
+ DEBUGASSERT(httpc->nread_inbuf == 0);
- if(should_close_session(httpc)) {
- H2BUGF(infof(data,
- "nghttp2_session_send(): nothing to do in this session\n"));
+ if(-1 == h2_process_pending_input(conn, httpc, &result))
return CURLE_HTTP2;
- }
return CURLE_OK;
}
diff --git a/lib/http_proxy.c b/lib/http_proxy.c
index f188cbfc..7c34d206 100644
--- a/lib/http_proxy.c
+++ b/lib/http_proxy.c
@@ -425,7 +425,6 @@ static CURLcode CONNECT(struct connectdata *conn,
}
data->info.header_size += (long)perline;
- data->req.headerbytecount += (long)perline;
/* Newlines are CRLF, so the CR is ignored as the line isn't
really terminated until the LF comes. Treat a following CR
diff --git a/lib/imap.c b/lib/imap.c
index cad0e590..46367be1 100644
--- a/lib/imap.c
+++ b/lib/imap.c
@@ -132,6 +132,7 @@ const struct Curl_handler Curl_handler_imap = {
ZERO_NULL, /* connection_check */
PORT_IMAP, /* defport */
CURLPROTO_IMAP, /* protocol */
+ CURLPROTO_IMAP, /* family */
PROTOPT_CLOSEACTION| /* flags */
PROTOPT_URLOPTIONS
};
@@ -159,6 +160,7 @@ const struct Curl_handler Curl_handler_imaps = {
ZERO_NULL, /* connection_check */
PORT_IMAPS, /* defport */
CURLPROTO_IMAPS, /* protocol */
+ CURLPROTO_IMAP, /* family */
PROTOPT_CLOSEACTION | PROTOPT_SSL | /* flags */
PROTOPT_URLOPTIONS
};
@@ -1176,6 +1178,9 @@ static CURLcode imap_state_fetch_resp(struct connectdata *conn, int imapcode,
else {
/* IMAP download */
data->req.maxdownload = size;
+ /* force a recv/send check of this connection, as the data might've been
+ read off the socket already */
+ data->conn->cselect_bits = CURL_CSELECT_IN;
Curl_setup_transfer(data, FIRSTSOCKET, size, FALSE, -1);
}
}
@@ -1424,7 +1429,9 @@ static CURLcode imap_connect(struct connectdata *conn, bool *done)
imapc->preftype = IMAP_TYPE_ANY;
Curl_sasl_init(&imapc->sasl, &saslimap);
+ Curl_dyn_init(&imapc->dyn, DYN_IMAP_CMD);
/* Initialise the pingpong layer */
+ Curl_pp_setup(pp);
Curl_pp_init(pp);
/* Parse the URL options */
@@ -1626,6 +1633,7 @@ static CURLcode imap_disconnect(struct connectdata *conn, bool dead_connection)
/* Disconnect from the server */
Curl_pp_disconnect(&imapc->pp);
+ Curl_dyn_free(&imapc->dyn);
/* Cleanup the SASL module */
Curl_sasl_cleanup(conn, imapc->sasl.authused);
@@ -1727,30 +1735,25 @@ static CURLcode imap_sendf(struct connectdata *conn, const char *fmt, ...)
{
CURLcode result = CURLE_OK;
struct imap_conn *imapc = &conn->proto.imapc;
- char *taggedfmt;
- va_list ap;
DEBUGASSERT(fmt);
- /* Calculate the next command ID wrapping at 3 digits */
- imapc->cmdid = (imapc->cmdid + 1) % 1000;
-
/* Calculate the tag based on the connection ID and command ID */
msnprintf(imapc->resptag, sizeof(imapc->resptag), "%c%03d",
- 'A' + curlx_sltosi(conn->connection_id % 26), imapc->cmdid);
-
- /* Prefix the format with the tag */
- taggedfmt = aprintf("%s %s", imapc->resptag, fmt);
- if(!taggedfmt)
- return CURLE_OUT_OF_MEMORY;
+ 'A' + curlx_sltosi(conn->connection_id % 26),
+ (++imapc->cmdid)%1000);
- /* Send the data with the tag */
- va_start(ap, fmt);
- result = Curl_pp_vsendf(&imapc->pp, taggedfmt, ap);
- va_end(ap);
-
- free(taggedfmt);
+ /* start with a blank buffer */
+ Curl_dyn_reset(&imapc->dyn);
+ /* append tag + space + fmt */
+ result = Curl_dyn_addf(&imapc->dyn, "%s %s", imapc->resptag, fmt);
+ if(!result) {
+ va_list ap;
+ va_start(ap, fmt);
+ result = Curl_pp_vsendf(&imapc->pp, Curl_dyn_ptr(&imapc->dyn), ap);
+ va_end(ap);
+ }
return result;
}
diff --git a/lib/imap.h b/lib/imap.h
index 4786f562..8f373d28 100644
--- a/lib/imap.h
+++ b/lib/imap.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2009 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2009 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -75,13 +75,14 @@ struct imap_conn {
bool preauth; /* Is this connection PREAUTH? */
struct SASL sasl; /* SASL-related parameters */
unsigned int preftype; /* Preferred authentication type */
- int cmdid; /* Last used command ID */
+ unsigned int cmdid; /* Last used command ID */
char resptag[5]; /* Response tag to wait for */
bool tls_supported; /* StartTLS capability supported by server */
bool login_disabled; /* LOGIN command disabled by server */
bool ir_supported; /* Initial response supported by server */
char *mailbox; /* The last selected mailbox */
char *mailbox_uidvalidity; /* UIDVALIDITY parsed from select response */
+ struct dynbuf dyn; /* for the IMAP commands */
};
extern const struct Curl_handler Curl_handler_imap;
diff --git a/lib/inet_pton.c b/lib/inet_pton.c
index 9c87a056..4923cae2 100644
--- a/lib/inet_pton.c
+++ b/lib/inet_pton.c
@@ -1,6 +1,6 @@
/* This is from the BIND 4.9.4 release, modified to compile by itself */
-/* Copyright (c) 1996 - 2019 by Internet Software Consortium.
+/* Copyright (c) 1996 - 2020 by Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -112,7 +112,7 @@ inet_pton4(const char *src, unsigned char *dst)
if(val > 255)
return (0);
*tp = (unsigned char)val;
- if(! saw_digit) {
+ if(!saw_digit) {
if(++octets > 4)
return (0);
saw_digit = 1;
diff --git a/lib/krb5.c b/lib/krb5.c
index f50287ae..ad6daeaa 100644
--- a/lib/krb5.c
+++ b/lib/krb5.c
@@ -2,7 +2,7 @@
*
* Copyright (c) 1995, 1996, 1997, 1998, 1999 Kungliga Tekniska Högskolan
* (Royal Institute of Technology, Stockholm, Sweden).
- * Copyright (c) 2004 - 2019 Daniel Stenberg
+ * Copyright (c) 2004 - 2020 Daniel Stenberg
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -45,14 +45,74 @@
#include "ftp.h"
#include "curl_gssapi.h"
#include "sendf.h"
-#include "curl_sec.h"
+#include "curl_krb5.h"
#include "warnless.h"
+#include "non-ascii.h"
+#include "strcase.h"
+#include "strdup.h"
/* The last 3 #include files should be in this order */
#include "curl_printf.h"
#include "curl_memory.h"
#include "memdebug.h"
+static CURLcode ftpsend(struct connectdata *conn, const char *cmd)
+{
+ ssize_t bytes_written;
+#define SBUF_SIZE 1024
+ char s[SBUF_SIZE];
+ size_t write_len;
+ char *sptr = s;
+ CURLcode result = CURLE_OK;
+#ifdef HAVE_GSSAPI
+ enum protection_level data_sec = conn->data_prot;
+#endif
+
+ if(!cmd)
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+
+ write_len = strlen(cmd);
+ if(!write_len || write_len > (sizeof(s) -3))
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+
+ memcpy(&s, cmd, write_len);
+ strcpy(&s[write_len], "\r\n"); /* append a trailing CRLF */
+ write_len += 2;
+ bytes_written = 0;
+
+ result = Curl_convert_to_network(conn->data, s, write_len);
+ /* Curl_convert_to_network calls failf if unsuccessful */
+ if(result)
+ return result;
+
+ for(;;) {
+#ifdef HAVE_GSSAPI
+ conn->data_prot = PROT_CMD;
+#endif
+ result = Curl_write(conn, conn->sock[FIRSTSOCKET], sptr, write_len,
+ &bytes_written);
+#ifdef HAVE_GSSAPI
+ DEBUGASSERT(data_sec > PROT_NONE && data_sec < PROT_LAST);
+ conn->data_prot = data_sec;
+#endif
+
+ if(result)
+ break;
+
+ if(conn->data->set.verbose)
+ Curl_debug(conn->data, CURLINFO_HEADER_OUT, sptr, (size_t)bytes_written);
+
+ if(bytes_written != (ssize_t)write_len) {
+ write_len -= bytes_written;
+ sptr += bytes_written;
+ }
+ else
+ break;
+ }
+
+ return result;
+}
+
static int
krb5_init(void *app_data)
{
@@ -183,7 +243,7 @@ krb5_auth(void *app_data, struct connectdata *conn)
for(;;) {
/* this really shouldn't be repeated here, but can't help it */
if(service == srv_host) {
- result = Curl_ftpsend(conn, "AUTH GSSAPI");
+ result = ftpsend(conn, "AUTH GSSAPI");
if(result)
return -2;
@@ -260,7 +320,7 @@ krb5_auth(void *app_data, struct connectdata *conn)
cmd = aprintf("ADAT %s", p);
if(cmd)
- result = Curl_ftpsend(conn, cmd);
+ result = ftpsend(conn, cmd);
else
result = CURLE_OUT_OF_MEMORY;
@@ -326,16 +386,524 @@ static void krb5_end(void *app_data)
}
}
-struct Curl_sec_client_mech Curl_krb5_client_mech = {
- "GSSAPI",
- sizeof(gss_ctx_id_t),
- krb5_init,
- krb5_auth,
- krb5_end,
- krb5_check_prot,
- krb5_overhead,
- krb5_encode,
- krb5_decode
+static struct Curl_sec_client_mech Curl_krb5_client_mech = {
+ "GSSAPI",
+ sizeof(gss_ctx_id_t),
+ krb5_init,
+ krb5_auth,
+ krb5_end,
+ krb5_check_prot,
+ krb5_overhead,
+ krb5_encode,
+ krb5_decode
+};
+
+static const struct {
+ enum protection_level level;
+ const char *name;
+} level_names[] = {
+ { PROT_CLEAR, "clear" },
+ { PROT_SAFE, "safe" },
+ { PROT_CONFIDENTIAL, "confidential" },
+ { PROT_PRIVATE, "private" }
};
+static enum protection_level
+name_to_level(const char *name)
+{
+ int i;
+ for(i = 0; i < (int)sizeof(level_names)/(int)sizeof(level_names[0]); i++)
+ if(checkprefix(name, level_names[i].name))
+ return level_names[i].level;
+ return PROT_NONE;
+}
+
+/* Convert a protocol |level| to its char representation.
+ We take an int to catch programming mistakes. */
+static char level_to_char(int level)
+{
+ switch(level) {
+ case PROT_CLEAR:
+ return 'C';
+ case PROT_SAFE:
+ return 'S';
+ case PROT_CONFIDENTIAL:
+ return 'E';
+ case PROT_PRIVATE:
+ return 'P';
+ case PROT_CMD:
+ /* Fall through */
+ default:
+ /* Those 2 cases should not be reached! */
+ break;
+ }
+ DEBUGASSERT(0);
+ /* Default to the most secure alternative. */
+ return 'P';
+}
+
+/* Send an FTP command defined by |message| and the optional arguments. The
+ function returns the ftp_code. If an error occurs, -1 is returned. */
+static int ftp_send_command(struct connectdata *conn, const char *message, ...)
+{
+ int ftp_code;
+ ssize_t nread = 0;
+ va_list args;
+ char print_buffer[50];
+
+ va_start(args, message);
+ mvsnprintf(print_buffer, sizeof(print_buffer), message, args);
+ va_end(args);
+
+ if(ftpsend(conn, print_buffer)) {
+ ftp_code = -1;
+ }
+ else {
+ if(Curl_GetFTPResponse(&nread, conn, &ftp_code))
+ ftp_code = -1;
+ }
+
+ (void)nread; /* Unused */
+ return ftp_code;
+}
+
+/* Read |len| from the socket |fd| and store it in |to|. Return a CURLcode
+ saying whether an error occurred or CURLE_OK if |len| was read. */
+static CURLcode
+socket_read(curl_socket_t fd, void *to, size_t len)
+{
+ char *to_p = to;
+ CURLcode result;
+ ssize_t nread = 0;
+
+ while(len > 0) {
+ result = Curl_read_plain(fd, to_p, len, &nread);
+ if(!result) {
+ len -= nread;
+ to_p += nread;
+ }
+ else {
+ if(result == CURLE_AGAIN)
+ continue;
+ return result;
+ }
+ }
+ return CURLE_OK;
+}
+
+
+/* Write |len| bytes from the buffer |to| to the socket |fd|. Return a
+ CURLcode saying whether an error occurred or CURLE_OK if |len| was
+ written. */
+static CURLcode
+socket_write(struct connectdata *conn, curl_socket_t fd, const void *to,
+ size_t len)
+{
+ const char *to_p = to;
+ CURLcode result;
+ ssize_t written;
+
+ while(len > 0) {
+ result = Curl_write_plain(conn, fd, to_p, len, &written);
+ if(!result) {
+ len -= written;
+ to_p += written;
+ }
+ else {
+ if(result == CURLE_AGAIN)
+ continue;
+ return result;
+ }
+ }
+ return CURLE_OK;
+}
+
+static CURLcode read_data(struct connectdata *conn,
+ curl_socket_t fd,
+ struct krb5buffer *buf)
+{
+ int len;
+ CURLcode result;
+
+ result = socket_read(fd, &len, sizeof(len));
+ if(result)
+ return result;
+
+ if(len) {
+ /* only realloc if there was a length */
+ len = ntohl(len);
+ buf->data = Curl_saferealloc(buf->data, len);
+ }
+ if(!len || !buf->data)
+ return CURLE_OUT_OF_MEMORY;
+
+ result = socket_read(fd, buf->data, len);
+ if(result)
+ return result;
+ buf->size = conn->mech->decode(conn->app_data, buf->data, len,
+ conn->data_prot, conn);
+ buf->index = 0;
+ return CURLE_OK;
+}
+
+static size_t
+buffer_read(struct krb5buffer *buf, void *data, size_t len)
+{
+ if(buf->size - buf->index < len)
+ len = buf->size - buf->index;
+ memcpy(data, (char *)buf->data + buf->index, len);
+ buf->index += len;
+ return len;
+}
+
+/* Matches Curl_recv signature */
+static ssize_t sec_recv(struct connectdata *conn, int sockindex,
+ char *buffer, size_t len, CURLcode *err)
+{
+ size_t bytes_read;
+ size_t total_read = 0;
+ curl_socket_t fd = conn->sock[sockindex];
+
+ *err = CURLE_OK;
+
+ /* Handle clear text response. */
+ if(conn->sec_complete == 0 || conn->data_prot == PROT_CLEAR)
+ return sread(fd, buffer, len);
+
+ if(conn->in_buffer.eof_flag) {
+ conn->in_buffer.eof_flag = 0;
+ return 0;
+ }
+
+ bytes_read = buffer_read(&conn->in_buffer, buffer, len);
+ len -= bytes_read;
+ total_read += bytes_read;
+ buffer += bytes_read;
+
+ while(len > 0) {
+ if(read_data(conn, fd, &conn->in_buffer))
+ return -1;
+ if(conn->in_buffer.size == 0) {
+ if(bytes_read > 0)
+ conn->in_buffer.eof_flag = 1;
+ return bytes_read;
+ }
+ bytes_read = buffer_read(&conn->in_buffer, buffer, len);
+ len -= bytes_read;
+ total_read += bytes_read;
+ buffer += bytes_read;
+ }
+ return total_read;
+}
+
+/* Send |length| bytes from |from| to the |fd| socket taking care of encoding
+ and negotiating with the server. |from| can be NULL. */
+static void do_sec_send(struct connectdata *conn, curl_socket_t fd,
+ const char *from, int length)
+{
+ int bytes, htonl_bytes; /* 32-bit integers for htonl */
+ char *buffer = NULL;
+ char *cmd_buffer;
+ size_t cmd_size = 0;
+ CURLcode error;
+ enum protection_level prot_level = conn->data_prot;
+ bool iscmd = (prot_level == PROT_CMD)?TRUE:FALSE;
+
+ DEBUGASSERT(prot_level > PROT_NONE && prot_level < PROT_LAST);
+
+ if(iscmd) {
+ if(!strncmp(from, "PASS ", 5) || !strncmp(from, "ACCT ", 5))
+ prot_level = PROT_PRIVATE;
+ else
+ prot_level = conn->command_prot;
+ }
+ bytes = conn->mech->encode(conn->app_data, from, length, prot_level,
+ (void **)&buffer);
+ if(!buffer || bytes <= 0)
+ return; /* error */
+
+ if(iscmd) {
+ error = Curl_base64_encode(conn->data, buffer, curlx_sitouz(bytes),
+ &cmd_buffer, &cmd_size);
+ if(error) {
+ free(buffer);
+ return; /* error */
+ }
+ if(cmd_size > 0) {
+ static const char *enc = "ENC ";
+ static const char *mic = "MIC ";
+ if(prot_level == PROT_PRIVATE)
+ socket_write(conn, fd, enc, 4);
+ else
+ socket_write(conn, fd, mic, 4);
+
+ socket_write(conn, fd, cmd_buffer, cmd_size);
+ socket_write(conn, fd, "\r\n", 2);
+ infof(conn->data, "Send: %s%s\n", prot_level == PROT_PRIVATE?enc:mic,
+ cmd_buffer);
+ free(cmd_buffer);
+ }
+ }
+ else {
+ htonl_bytes = htonl(bytes);
+ socket_write(conn, fd, &htonl_bytes, sizeof(htonl_bytes));
+ socket_write(conn, fd, buffer, curlx_sitouz(bytes));
+ }
+ free(buffer);
+}
+
+static ssize_t sec_write(struct connectdata *conn, curl_socket_t fd,
+ const char *buffer, size_t length)
+{
+ ssize_t tx = 0, len = conn->buffer_size;
+
+ len -= conn->mech->overhead(conn->app_data, conn->data_prot,
+ curlx_sztosi(len));
+ if(len <= 0)
+ len = length;
+ while(length) {
+ if(length < (size_t)len)
+ len = length;
+
+ do_sec_send(conn, fd, buffer, curlx_sztosi(len));
+ length -= len;
+ buffer += len;
+ tx += len;
+ }
+ return tx;
+}
+
+/* Matches Curl_send signature */
+static ssize_t sec_send(struct connectdata *conn, int sockindex,
+ const void *buffer, size_t len, CURLcode *err)
+{
+ curl_socket_t fd = conn->sock[sockindex];
+ *err = CURLE_OK;
+ return sec_write(conn, fd, buffer, len);
+}
+
+int Curl_sec_read_msg(struct connectdata *conn, char *buffer,
+ enum protection_level level)
+{
+ /* decoded_len should be size_t or ssize_t but conn->mech->decode returns an
+ int */
+ int decoded_len;
+ char *buf;
+ int ret_code = 0;
+ size_t decoded_sz = 0;
+ CURLcode error;
+
+ if(!conn->mech)
+ /* not inititalized, return error */
+ return -1;
+
+ DEBUGASSERT(level > PROT_NONE && level < PROT_LAST);
+
+ error = Curl_base64_decode(buffer + 4, (unsigned char **)&buf, &decoded_sz);
+ if(error || decoded_sz == 0)
+ return -1;
+
+ if(decoded_sz > (size_t)INT_MAX) {
+ free(buf);
+ return -1;
+ }
+ decoded_len = curlx_uztosi(decoded_sz);
+
+ decoded_len = conn->mech->decode(conn->app_data, buf, decoded_len,
+ level, conn);
+ if(decoded_len <= 0) {
+ free(buf);
+ return -1;
+ }
+
+ if(conn->data->set.verbose) {
+ buf[decoded_len] = '\n';
+ Curl_debug(conn->data, CURLINFO_HEADER_IN, buf, decoded_len + 1);
+ }
+
+ buf[decoded_len] = '\0';
+ if(decoded_len <= 3)
+ /* suspiciously short */
+ return 0;
+
+ if(buf[3] != '-')
+ /* safe to ignore return code */
+ (void)sscanf(buf, "%d", &ret_code);
+
+ if(buf[decoded_len - 1] == '\n')
+ buf[decoded_len - 1] = '\0';
+ strcpy(buffer, buf);
+ free(buf);
+ return ret_code;
+}
+
+static int sec_set_protection_level(struct connectdata *conn)
+{
+ int code;
+ enum protection_level level = conn->request_data_prot;
+
+ DEBUGASSERT(level > PROT_NONE && level < PROT_LAST);
+
+ if(!conn->sec_complete) {
+ infof(conn->data, "Trying to change the protection level after the"
+ " completion of the data exchange.\n");
+ return -1;
+ }
+
+ /* Bail out if we try to set up the same level */
+ if(conn->data_prot == level)
+ return 0;
+
+ if(level) {
+ char *pbsz;
+ static unsigned int buffer_size = 1 << 20; /* 1048576 */
+
+ code = ftp_send_command(conn, "PBSZ %u", buffer_size);
+ if(code < 0)
+ return -1;
+
+ if(code/100 != 2) {
+ failf(conn->data, "Failed to set the protection's buffer size.");
+ return -1;
+ }
+ conn->buffer_size = buffer_size;
+
+ pbsz = strstr(conn->data->state.buffer, "PBSZ=");
+ if(pbsz) {
+ /* ignore return code, use default value if it fails */
+ (void)sscanf(pbsz, "PBSZ=%u", &buffer_size);
+ if(buffer_size < conn->buffer_size)
+ conn->buffer_size = buffer_size;
+ }
+ }
+
+ /* Now try to negiociate the protection level. */
+ code = ftp_send_command(conn, "PROT %c", level_to_char(level));
+
+ if(code < 0)
+ return -1;
+
+ if(code/100 != 2) {
+ failf(conn->data, "Failed to set the protection level.");
+ return -1;
+ }
+
+ conn->data_prot = level;
+ if(level == PROT_PRIVATE)
+ conn->command_prot = level;
+
+ return 0;
+}
+
+int
+Curl_sec_request_prot(struct connectdata *conn, const char *level)
+{
+ enum protection_level l = name_to_level(level);
+ if(l == PROT_NONE)
+ return -1;
+ DEBUGASSERT(l > PROT_NONE && l < PROT_LAST);
+ conn->request_data_prot = l;
+ return 0;
+}
+
+static CURLcode choose_mech(struct connectdata *conn)
+{
+ int ret;
+ struct Curl_easy *data = conn->data;
+ void *tmp_allocation;
+ const struct Curl_sec_client_mech *mech = &Curl_krb5_client_mech;
+
+ tmp_allocation = realloc(conn->app_data, mech->size);
+ if(tmp_allocation == NULL) {
+ failf(data, "Failed realloc of size %zu", mech->size);
+ mech = NULL;
+ return CURLE_OUT_OF_MEMORY;
+ }
+ conn->app_data = tmp_allocation;
+
+ if(mech->init) {
+ ret = mech->init(conn->app_data);
+ if(ret) {
+ infof(data, "Failed initialization for %s. Skipping it.\n",
+ mech->name);
+ return CURLE_FAILED_INIT;
+ }
+ }
+
+ infof(data, "Trying mechanism %s...\n", mech->name);
+ ret = ftp_send_command(conn, "AUTH %s", mech->name);
+ if(ret < 0)
+ return CURLE_COULDNT_CONNECT;
+
+ if(ret/100 != 3) {
+ switch(ret) {
+ case 504:
+ infof(data, "Mechanism %s is not supported by the server (server "
+ "returned ftp code: 504).\n", mech->name);
+ break;
+ case 534:
+ infof(data, "Mechanism %s was rejected by the server (server returned "
+ "ftp code: 534).\n", mech->name);
+ break;
+ default:
+ if(ret/100 == 5) {
+ infof(data, "server does not support the security extensions\n");
+ return CURLE_USE_SSL_FAILED;
+ }
+ break;
+ }
+ return CURLE_LOGIN_DENIED;
+ }
+
+ /* Authenticate */
+ ret = mech->auth(conn->app_data, conn);
+
+ if(ret != AUTH_CONTINUE) {
+ if(ret != AUTH_OK) {
+ /* Mechanism has dumped the error to stderr, don't error here. */
+ return CURLE_USE_SSL_FAILED;
+ }
+ DEBUGASSERT(ret == AUTH_OK);
+
+ conn->mech = mech;
+ conn->sec_complete = 1;
+ conn->recv[FIRSTSOCKET] = sec_recv;
+ conn->send[FIRSTSOCKET] = sec_send;
+ conn->recv[SECONDARYSOCKET] = sec_recv;
+ conn->send[SECONDARYSOCKET] = sec_send;
+ conn->command_prot = PROT_SAFE;
+ /* Set the requested protection level */
+ /* BLOCKING */
+ (void)sec_set_protection_level(conn);
+ }
+
+ return CURLE_OK;
+}
+
+CURLcode
+Curl_sec_login(struct connectdata *conn)
+{
+ return choose_mech(conn);
+}
+
+
+void
+Curl_sec_end(struct connectdata *conn)
+{
+ if(conn->mech != NULL && conn->mech->end)
+ conn->mech->end(conn->app_data);
+ free(conn->app_data);
+ conn->app_data = NULL;
+ if(conn->in_buffer.data) {
+ free(conn->in_buffer.data);
+ conn->in_buffer.data = NULL;
+ conn->in_buffer.size = 0;
+ conn->in_buffer.index = 0;
+ conn->in_buffer.eof_flag = 0;
+ }
+ conn->sec_complete = 0;
+ conn->data_prot = PROT_CLEAR;
+ conn->mech = NULL;
+}
+
#endif /* HAVE_GSSAPI && !CURL_DISABLE_FTP */
diff --git a/lib/ldap.c b/lib/ldap.c
index 512def65..8d1ee644 100644
--- a/lib/ldap.c
+++ b/lib/ldap.c
@@ -150,6 +150,7 @@ const struct Curl_handler Curl_handler_ldap = {
ZERO_NULL, /* connection_check */
PORT_LDAP, /* defport */
CURLPROTO_LDAP, /* protocol */
+ CURLPROTO_LDAP, /* family */
PROTOPT_NONE /* flags */
};
@@ -176,6 +177,7 @@ const struct Curl_handler Curl_handler_ldaps = {
ZERO_NULL, /* connection_check */
PORT_LDAPS, /* defport */
CURLPROTO_LDAPS, /* protocol */
+ CURLPROTO_LDAP, /* family */
PROTOPT_SSL /* flags */
};
#endif
@@ -257,6 +259,13 @@ static int ldap_win_bind(struct connectdata *conn, LDAP *server,
}
#endif /* #if defined(USE_WIN32_LDAP) */
+#if defined(USE_WIN32_LDAP)
+#define FREE_ON_WINLDAP(x) curlx_unicodefree(x)
+#else
+#define FREE_ON_WINLDAP(x)
+#endif
+
+
static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
{
CURLcode result = CURLE_OK;
@@ -463,9 +472,6 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
}
#ifdef USE_WIN32_LDAP
ldap_set_option(server, LDAP_OPT_PROTOCOL_VERSION, &ldap_proto);
-#endif
-
-#ifdef USE_WIN32_LDAP
rc = ldap_win_bind(conn, server, user, passwd);
#else
rc = ldap_simple_bind_s(server, user, passwd);
@@ -507,7 +513,7 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
#if defined(USE_WIN32_LDAP)
TCHAR *attribute;
#else
- char *attribute; /*! suspicious that this isn't 'const' */
+ char *attribute;
#endif
int i;
@@ -532,30 +538,22 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
result = Curl_client_write(conn, CLIENTWRITE_BODY, (char *)"DN: ", 4);
if(result) {
-#if defined(USE_WIN32_LDAP)
- curlx_unicodefree(name);
-#endif
+ FREE_ON_WINLDAP(name);
ldap_memfree(dn);
-
goto quit;
}
result = Curl_client_write(conn, CLIENTWRITE_BODY, (char *) name,
name_len);
if(result) {
-#if defined(USE_WIN32_LDAP)
- curlx_unicodefree(name);
-#endif
+ FREE_ON_WINLDAP(name);
ldap_memfree(dn);
-
goto quit;
}
result = Curl_client_write(conn, CLIENTWRITE_BODY, (char *)"\n", 1);
if(result) {
-#if defined(USE_WIN32_LDAP)
- curlx_unicodefree(name);
-#endif
+ FREE_ON_WINLDAP(name);
ldap_memfree(dn);
goto quit;
@@ -563,9 +561,7 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
dlsize += name_len + 5;
-#if defined(USE_WIN32_LDAP)
- curlx_unicodefree(name);
-#endif
+ FREE_ON_WINLDAP(name);
ldap_memfree(dn);
}
@@ -596,9 +592,7 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
result = Curl_client_write(conn, CLIENTWRITE_BODY, (char *)"\t", 1);
if(result) {
ldap_value_free_len(vals);
-#if defined(USE_WIN32_LDAP)
- curlx_unicodefree(attr);
-#endif
+ FREE_ON_WINLDAP(attr);
ldap_memfree(attribute);
if(ber)
ber_free(ber, 0);
@@ -610,9 +604,7 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
(char *) attr, attr_len);
if(result) {
ldap_value_free_len(vals);
-#if defined(USE_WIN32_LDAP)
- curlx_unicodefree(attr);
-#endif
+ FREE_ON_WINLDAP(attr);
ldap_memfree(attribute);
if(ber)
ber_free(ber, 0);
@@ -623,9 +615,7 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
result = Curl_client_write(conn, CLIENTWRITE_BODY, (char *)": ", 2);
if(result) {
ldap_value_free_len(vals);
-#if defined(USE_WIN32_LDAP)
- curlx_unicodefree(attr);
-#endif
+ FREE_ON_WINLDAP(attr);
ldap_memfree(attribute);
if(ber)
ber_free(ber, 0);
@@ -645,9 +635,7 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
&val_b64_sz);
if(result) {
ldap_value_free_len(vals);
-#if defined(USE_WIN32_LDAP)
- curlx_unicodefree(attr);
-#endif
+ FREE_ON_WINLDAP(attr);
ldap_memfree(attribute);
if(ber)
ber_free(ber, 0);
@@ -661,9 +649,7 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
free(val_b64);
if(result) {
ldap_value_free_len(vals);
-#if defined(USE_WIN32_LDAP)
- curlx_unicodefree(attr);
-#endif
+ FREE_ON_WINLDAP(attr);
ldap_memfree(attribute);
if(ber)
ber_free(ber, 0);
@@ -679,9 +665,7 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
vals[i]->bv_len);
if(result) {
ldap_value_free_len(vals);
-#if defined(USE_WIN32_LDAP)
- curlx_unicodefree(attr);
-#endif
+ FREE_ON_WINLDAP(attr);
ldap_memfree(attribute);
if(ber)
ber_free(ber, 0);
@@ -695,9 +679,7 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
result = Curl_client_write(conn, CLIENTWRITE_BODY, (char *)"\n", 1);
if(result) {
ldap_value_free_len(vals);
-#if defined(USE_WIN32_LDAP)
- curlx_unicodefree(attr);
-#endif
+ FREE_ON_WINLDAP(attr);
ldap_memfree(attribute);
if(ber)
ber_free(ber, 0);
@@ -713,9 +695,7 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
}
/* Free the attribute as we are done with it */
-#if defined(USE_WIN32_LDAP)
- curlx_unicodefree(attr);
-#endif
+ FREE_ON_WINLDAP(attr);
ldap_memfree(attribute);
result = Curl_client_write(conn, CLIENTWRITE_BODY, (char *)"\n", 1);
@@ -745,9 +725,7 @@ quit:
ldapssl_client_deinit();
#endif /* HAVE_LDAP_SSL && CURL_HAS_NOVELL_LDAPSDK */
-#if defined(USE_WIN32_LDAP)
- curlx_unicodefree(host);
-#endif
+ FREE_ON_WINLDAP(host);
/* no data to transfer */
Curl_setup_transfer(data, -1, -1, FALSE, -1);
diff --git a/lib/libcurl.plist b/lib/libcurl.plist
index 1b3d178c..eab1efe3 100644
--- a/lib/libcurl.plist
+++ b/lib/libcurl.plist
@@ -15,7 +15,7 @@
<string>se.haxx.curl.libcurl</string>
<key>CFBundleVersion</key>
- <string>7.72.0</string>
+ <string>7.73.0</string>
<key>CFBundleName</key>
<string>libcurl</string>
@@ -27,9 +27,9 @@
<string>????</string>
<key>CFBundleShortVersionString</key>
- <string>libcurl 7.72.0</string>
+ <string>libcurl 7.73.0</string>
<key>CFBundleGetInfoString</key>
- <string>libcurl.plist 7.72.0</string>
+ <string>libcurl.plist 7.73.0</string>
</dict>
</plist>
diff --git a/lib/llist.c b/lib/llist.c
index e7c6f51d..0a2baa08 100644
--- a/lib/llist.c
+++ b/lib/llist.c
@@ -34,7 +34,7 @@
* @unittest: 1300
*/
void
-Curl_llist_init(struct curl_llist *l, curl_llist_dtor dtor)
+Curl_llist_init(struct Curl_llist *l, Curl_llist_dtor dtor)
{
l->size = 0;
l->dtor = dtor;
@@ -54,9 +54,9 @@ Curl_llist_init(struct curl_llist *l, curl_llist_dtor dtor)
* @unittest: 1300
*/
void
-Curl_llist_insert_next(struct curl_llist *list, struct curl_llist_element *e,
+Curl_llist_insert_next(struct Curl_llist *list, struct Curl_llist_element *e,
const void *p,
- struct curl_llist_element *ne)
+ struct Curl_llist_element *ne)
{
ne->ptr = (void *) p;
if(list->size == 0) {
@@ -90,7 +90,7 @@ Curl_llist_insert_next(struct curl_llist *list, struct curl_llist_element *e,
* @unittest: 1300
*/
void
-Curl_llist_remove(struct curl_llist *list, struct curl_llist_element *e,
+Curl_llist_remove(struct Curl_llist *list, struct Curl_llist_element *e,
void *user)
{
void *ptr;
@@ -131,7 +131,7 @@ Curl_llist_remove(struct curl_llist *list, struct curl_llist_element *e,
}
void
-Curl_llist_destroy(struct curl_llist *list, void *user)
+Curl_llist_destroy(struct Curl_llist *list, void *user)
{
if(list) {
while(list->size > 0)
@@ -140,7 +140,7 @@ Curl_llist_destroy(struct curl_llist *list, void *user)
}
size_t
-Curl_llist_count(struct curl_llist *list)
+Curl_llist_count(struct Curl_llist *list)
{
return list->size;
}
diff --git a/lib/llist.h b/lib/llist.h
index 0178c425..91cfda1b 100644
--- a/lib/llist.h
+++ b/lib/llist.h
@@ -25,26 +25,26 @@
#include "curl_setup.h"
#include <stddef.h>
-typedef void (*curl_llist_dtor)(void *, void *);
+typedef void (*Curl_llist_dtor)(void *, void *);
-struct curl_llist_element {
+struct Curl_llist_element {
void *ptr;
- struct curl_llist_element *prev;
- struct curl_llist_element *next;
+ struct Curl_llist_element *prev;
+ struct Curl_llist_element *next;
};
-struct curl_llist {
- struct curl_llist_element *head;
- struct curl_llist_element *tail;
- curl_llist_dtor dtor;
+struct Curl_llist {
+ struct Curl_llist_element *head;
+ struct Curl_llist_element *tail;
+ Curl_llist_dtor dtor;
size_t size;
};
-void Curl_llist_init(struct curl_llist *, curl_llist_dtor);
-void Curl_llist_insert_next(struct curl_llist *, struct curl_llist_element *,
- const void *, struct curl_llist_element *node);
-void Curl_llist_remove(struct curl_llist *, struct curl_llist_element *,
+void Curl_llist_init(struct Curl_llist *, Curl_llist_dtor);
+void Curl_llist_insert_next(struct Curl_llist *, struct Curl_llist_element *,
+ const void *, struct Curl_llist_element *node);
+void Curl_llist_remove(struct Curl_llist *, struct Curl_llist_element *,
void *);
-size_t Curl_llist_count(struct curl_llist *);
-void Curl_llist_destroy(struct curl_llist *, void *);
+size_t Curl_llist_count(struct Curl_llist *);
+void Curl_llist_destroy(struct Curl_llist *, void *);
#endif /* HEADER_CURL_LLIST_H */
diff --git a/lib/memdebug.c b/lib/memdebug.c
index da75c9f5..6c560847 100644
--- a/lib/memdebug.c
+++ b/lib/memdebug.c
@@ -35,52 +35,6 @@
#include "curl_memory.h"
#include "memdebug.h"
-/*
- * Until 2011-08-17 libcurl's Memory Tracking feature also performed
- * automatic malloc and free filling operations using 0xA5 and 0x13
- * values. Our own preinitialization of dynamically allocated memory
- * might be useful when not using third party memory debuggers, but
- * on the other hand this would fool memory debuggers into thinking
- * that all dynamically allocated memory is properly initialized.
- *
- * As a default setting, libcurl's Memory Tracking feature no longer
- * performs preinitialization of dynamically allocated memory on its
- * own. If you know what you are doing, and really want to retain old
- * behavior, you can achieve this compiling with preprocessor symbols
- * CURL_MT_MALLOC_FILL and CURL_MT_FREE_FILL defined with appropriate
- * values.
- */
-
-#ifdef CURL_MT_MALLOC_FILL
-# if (CURL_MT_MALLOC_FILL < 0) || (CURL_MT_MALLOC_FILL > 0xff)
-# error "invalid CURL_MT_MALLOC_FILL or out of range"
-# endif
-#endif
-
-#ifdef CURL_MT_FREE_FILL
-# if (CURL_MT_FREE_FILL < 0) || (CURL_MT_FREE_FILL > 0xff)
-# error "invalid CURL_MT_FREE_FILL or out of range"
-# endif
-#endif
-
-#if defined(CURL_MT_MALLOC_FILL) && defined(CURL_MT_FREE_FILL)
-# if (CURL_MT_MALLOC_FILL == CURL_MT_FREE_FILL)
-# error "CURL_MT_MALLOC_FILL same as CURL_MT_FREE_FILL"
-# endif
-#endif
-
-#ifdef CURL_MT_MALLOC_FILL
-# define mt_malloc_fill(buf,len) memset((buf), CURL_MT_MALLOC_FILL, (len))
-#else
-# define mt_malloc_fill(buf,len) Curl_nop_stmt
-#endif
-
-#ifdef CURL_MT_FREE_FILL
-# define mt_free_fill(buf,len) memset((buf), CURL_MT_FREE_FILL, (len))
-#else
-# define mt_free_fill(buf,len) Curl_nop_stmt
-#endif
-
struct memdebug {
size_t size;
union {
@@ -173,8 +127,6 @@ void *curl_dbg_malloc(size_t wantedsize, int line, const char *source)
mem = (Curl_cmalloc)(size);
if(mem) {
- /* fill memory with junk */
- mt_malloc_fill(mem->mem, wantedsize);
mem->size = wantedsize;
}
@@ -321,9 +273,6 @@ void curl_dbg_free(void *ptr, int line, const char *source)
# pragma warning(pop)
#endif
- /* destroy */
- mt_free_fill(mem->mem, mem->size);
-
/* free for real */
(Curl_cfree)(mem);
}
diff --git a/lib/mprintf.c b/lib/mprintf.c
index 80735be5..6aceadc9 100644
--- a/lib/mprintf.c
+++ b/lib/mprintf.c
@@ -99,12 +99,12 @@ static const char lower_digits[] = "0123456789abcdefghijklmnopqrstuvwxyz";
/* Upper-case digits. */
static const char upper_digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
-#define OUTCHAR(x) \
- do{ \
+#define OUTCHAR(x) \
+ do { \
if(stream((unsigned char)(x), (FILE *)data) != -1) \
- done++; \
- else \
- return done; /* return immediately on failure */ \
+ done++; \
+ else \
+ return done; /* return immediately on failure */ \
} while(0)
/* Data type to read from the arglist */
@@ -169,7 +169,7 @@ struct nsprintf {
};
struct asprintf {
- struct dynbuf b;
+ struct dynbuf *b;
bool fail; /* if an alloc has failed and thus the output is not the complete
data */
};
@@ -878,7 +878,7 @@ static int dprintf_formatf(
OUTCHAR(' ');
for(point = strnil; *point != '\0'; ++point)
OUTCHAR(*point);
- if(! (p->flags & FLAGS_LEFT))
+ if(!(p->flags & FLAGS_LEFT))
while(width-- > 0)
OUTCHAR(' ');
}
@@ -1042,50 +1042,61 @@ static int alloc_addbyter(int output, FILE *data)
struct asprintf *infop = (struct asprintf *)data;
unsigned char outc = (unsigned char)output;
- if(Curl_dyn_addn(&infop->b, &outc, 1)) {
+ if(Curl_dyn_addn(infop->b, &outc, 1)) {
infop->fail = 1;
return -1; /* fail */
}
return outc; /* fputc() returns like this on success */
}
-char *curl_maprintf(const char *format, ...)
+extern int Curl_dyn_vprintf(struct dynbuf *dyn,
+ const char *format, va_list ap_save);
+
+/* appends the formatted string, returns 0 on success, 1 on error */
+int Curl_dyn_vprintf(struct dynbuf *dyn, const char *format, va_list ap_save)
{
- va_list ap_save; /* argument pointer */
int retcode;
struct asprintf info;
- Curl_dyn_init(&info.b, DYN_APRINTF);
+ info.b = dyn;
info.fail = 0;
- va_start(ap_save, format);
retcode = dprintf_formatf(&info, alloc_addbyter, format, ap_save);
- va_end(ap_save);
if((-1 == retcode) || info.fail) {
- Curl_dyn_free(&info.b);
- return NULL;
+ Curl_dyn_free(info.b);
+ return 1;
}
- if(Curl_dyn_len(&info.b))
- return Curl_dyn_ptr(&info.b);
- return strdup("");
+ return 0;
}
char *curl_mvaprintf(const char *format, va_list ap_save)
{
int retcode;
struct asprintf info;
- Curl_dyn_init(&info.b, DYN_APRINTF);
+ struct dynbuf dyn;
+ info.b = &dyn;
+ Curl_dyn_init(info.b, DYN_APRINTF);
info.fail = 0;
retcode = dprintf_formatf(&info, alloc_addbyter, format, ap_save);
if((-1 == retcode) || info.fail) {
- Curl_dyn_free(&info.b);
+ Curl_dyn_free(info.b);
return NULL;
}
- if(Curl_dyn_len(&info.b))
- return Curl_dyn_ptr(&info.b);
+ if(Curl_dyn_len(info.b))
+ return Curl_dyn_ptr(info.b);
return strdup("");
}
+char *curl_maprintf(const char *format, ...)
+{
+ va_list ap_save;
+ char *s;
+ va_start(ap_save, format);
+ s = curl_mvaprintf(format, ap_save);
+ va_end(ap_save);
+ return s;
+}
+
static int storebuffer(int output, FILE *data)
{
char **buffer = (char **)data;
diff --git a/lib/mqtt.c b/lib/mqtt.c
index f6f44161..c0e9a2b7 100644
--- a/lib/mqtt.c
+++ b/lib/mqtt.c
@@ -23,7 +23,7 @@
#include "curl_setup.h"
-#ifdef CURL_ENABLE_MQTT
+#ifndef CURL_DISABLE_MQTT
#include "urldata.h"
#include <curl/curl.h>
@@ -86,6 +86,7 @@ const struct Curl_handler Curl_handler_mqtt = {
ZERO_NULL, /* connection_check */
PORT_MQTT, /* defport */
CURLPROTO_MQTT, /* protocol */
+ CURLPROTO_MQTT, /* family */
PROTOPT_NONE /* flags */
};
@@ -142,7 +143,7 @@ static CURLcode mqtt_connect(struct connectdata *conn)
const size_t client_id_offset = 14;
const size_t packetlen = client_id_offset + MQTT_CLIENTID_LEN;
char client_id[MQTT_CLIENTID_LEN + 1] = "curl";
- const size_t curl_len = strlen("curl");
+ const size_t clen = strlen("curl");
char packet[32] = {
MQTT_MSG_CONNECT, /* packet type */
0x00, /* remaining length */
@@ -156,8 +157,8 @@ static CURLcode mqtt_connect(struct connectdata *conn)
packet[1] = (packetlen - 2) & 0x7f;
packet[client_id_offset - 1] = MQTT_CLIENTID_LEN;
- result = Curl_rand_hex(conn->data, (unsigned char *)&client_id[curl_len],
- MQTT_CLIENTID_LEN - curl_len + 1);
+ result = Curl_rand_hex(conn->data, (unsigned char *)&client_id[clen],
+ MQTT_CLIENTID_LEN - clen + 1);
memcpy(&packet[client_id_offset], client_id, MQTT_CLIENTID_LEN);
infof(conn->data, "Using client id '%s'\n", client_id);
if(!result)
@@ -625,4 +626,4 @@ static CURLcode mqtt_doing(struct connectdata *conn, bool *done)
return result;
}
-#endif /* CURL_ENABLE_MQTT */
+#endif /* CURL_DISABLE_MQTT */
diff --git a/lib/mqtt.h b/lib/mqtt.h
index 37463d58..37c04413 100644
--- a/lib/mqtt.h
+++ b/lib/mqtt.h
@@ -22,7 +22,7 @@
*
***************************************************************************/
-#ifdef CURL_ENABLE_MQTT
+#ifndef CURL_DISABLE_MQTT
extern const struct Curl_handler Curl_handler_mqtt;
#endif
diff --git a/lib/multi.c b/lib/multi.c
index 3c7fb85e..4cc7c5ae 100644
--- a/lib/multi.c
+++ b/lib/multi.c
@@ -190,7 +190,7 @@ static void mstate(struct Curl_easy *data, CURLMstate state
*/
struct Curl_sh_entry {
- struct curl_hash transfers; /* hash of transfers using this socket */
+ struct Curl_hash transfers; /* hash of transfers using this socket */
unsigned int action; /* what combined action READ/WRITE this socket waits
for */
void *socketp; /* settable by users with curl_multi_assign() */
@@ -204,7 +204,7 @@ struct Curl_sh_entry {
#define SH_WRITE 2
/* look up a given socket in the socket hash, skip invalid sockets */
-static struct Curl_sh_entry *sh_getentry(struct curl_hash *sh,
+static struct Curl_sh_entry *sh_getentry(struct Curl_hash *sh,
curl_socket_t s)
{
if(s != CURL_SOCKET_BAD) {
@@ -238,7 +238,7 @@ static void trhash_dtor(void *nada)
/* make sure this socket is present in the hash for this handle */
-static struct Curl_sh_entry *sh_addentry(struct curl_hash *sh,
+static struct Curl_sh_entry *sh_addentry(struct Curl_hash *sh,
curl_socket_t s)
{
struct Curl_sh_entry *there = sh_getentry(sh, s);
@@ -273,7 +273,7 @@ static struct Curl_sh_entry *sh_addentry(struct curl_hash *sh,
/* delete the given socket + handle from the hash */
static void sh_delentry(struct Curl_sh_entry *entry,
- struct curl_hash *sh, curl_socket_t s)
+ struct Curl_hash *sh, curl_socket_t s)
{
Curl_hash_destroy(&entry->transfers);
@@ -325,7 +325,7 @@ static size_t hash_fd(void *key, size_t key_length, size_t slots_num)
* per call."
*
*/
-static int sh_init(struct curl_hash *hash, int hashsize)
+static int sh_init(struct Curl_hash *hash, int hashsize)
{
return Curl_hash_init(hash, hashsize, hash_fd, fd_key_compare,
sh_freeentry);
@@ -374,6 +374,11 @@ struct Curl_multi *Curl_multi_handle(int hashsize, /* socket hash */
multi->max_concurrent_streams = 100;
multi->ipv6_works = Curl_ipv6works(NULL);
+#ifdef USE_WINSOCK
+ multi->wsa_event = WSACreateEvent();
+ if(multi->wsa_event == WSA_INVALID_EVENT)
+ goto error;
+#else
#ifdef ENABLE_WAKEUP
if(Curl_socketpair(AF_UNIX, SOCK_STREAM, 0, multi->wakeup_pair) < 0) {
multi->wakeup_pair[0] = CURL_SOCKET_BAD;
@@ -387,6 +392,7 @@ struct Curl_multi *Curl_multi_handle(int hashsize, /* socket hash */
multi->wakeup_pair[1] = CURL_SOCKET_BAD;
}
#endif
+#endif
return multi;
@@ -716,7 +722,7 @@ CURLMcode curl_multi_remove_handle(struct Curl_multi *multi,
struct Curl_easy *easy = data;
bool premature;
bool easy_owns_conn;
- struct curl_llist_element *e;
+ struct Curl_llist_element *e;
/* First, make some basic checks that the CURLM handle is a good handle */
if(!GOOD_MULTI_HANDLE(multi))
@@ -1081,11 +1087,17 @@ static CURLMcode Curl_multi_wait(struct Curl_multi *multi,
unsigned int i;
unsigned int nfds = 0;
unsigned int curlfds;
- bool ufds_malloc = FALSE;
long timeout_internal;
int retcode = 0;
+#ifndef USE_WINSOCK
struct pollfd a_few_on_stack[NUM_POLLS_ON_STACK];
struct pollfd *ufds = &a_few_on_stack[0];
+ bool ufds_malloc = FALSE;
+#else
+ struct pollfd pre_poll;
+ WSANETWORKEVENTS wsa_events;
+ DEBUGASSERT(multi->wsa_event != WSA_INVALID_EVENT);
+#endif
if(!GOOD_MULTI_HANDLE(multi))
return CURLM_BAD_HANDLE;
@@ -1131,11 +1143,16 @@ static CURLMcode Curl_multi_wait(struct Curl_multi *multi,
nfds += extra_nfds; /* add the externally provided ones */
#ifdef ENABLE_WAKEUP
+#ifdef USE_WINSOCK
+ if(use_wakeup) {
+#else
if(use_wakeup && multi->wakeup_pair[0] != CURL_SOCKET_BAD) {
+#endif
++nfds;
}
#endif
+#ifndef USE_WINSOCK
if(nfds > NUM_POLLS_ON_STACK) {
/* 'nfds' is a 32 bit value and 'struct pollfd' is typically 8 bytes
big, so at 2^29 sockets this value might wrap. When a process gets
@@ -1146,7 +1163,9 @@ static CURLMcode Curl_multi_wait(struct Curl_multi *multi,
return CURLM_OUT_OF_MEMORY;
ufds_malloc = TRUE;
}
+
nfds = 0;
+#endif
/* only do the second loop if we found descriptors in the first stage run
above */
@@ -1157,24 +1176,42 @@ static CURLMcode Curl_multi_wait(struct Curl_multi *multi,
while(data) {
bitmap = multi_getsock(data, sockbunch);
- for(i = 0; i< MAX_SOCKSPEREASYHANDLE; i++) {
+ for(i = 0; i < MAX_SOCKSPEREASYHANDLE; i++) {
curl_socket_t s = CURL_SOCKET_BAD;
-
+#ifdef USE_WINSOCK
+ long mask = 0;
+#endif
if(bitmap & GETSOCK_READSOCK(i)) {
+#ifdef USE_WINSOCK
+ if(timeout_ms && SOCKET_READABLE(sockbunch[i], 0) > 0)
+ timeout_ms = 0;
+ mask |= FD_READ|FD_ACCEPT|FD_CLOSE;
+#else
ufds[nfds].fd = sockbunch[i];
ufds[nfds].events = POLLIN;
++nfds;
+#endif
s = sockbunch[i];
}
if(bitmap & GETSOCK_WRITESOCK(i)) {
+#ifdef USE_WINSOCK
+ if(timeout_ms && SOCKET_WRITABLE(sockbunch[i], 0) > 0)
+ timeout_ms = 0;
+ mask |= FD_WRITE|FD_CONNECT|FD_CLOSE;
+#else
ufds[nfds].fd = sockbunch[i];
ufds[nfds].events = POLLOUT;
++nfds;
+#endif
s = sockbunch[i];
}
if(s == CURL_SOCKET_BAD) {
break;
}
+#ifdef USE_WINSOCK
+ if(WSAEventSelect(s, multi->wsa_event, mask) != 0)
+ return CURLM_INTERNAL_ERROR;
+#endif
}
data = data->next; /* check next handle */
@@ -1183,6 +1220,37 @@ static CURLMcode Curl_multi_wait(struct Curl_multi *multi,
/* Add external file descriptions from poll-like struct curl_waitfd */
for(i = 0; i < extra_nfds; i++) {
+#ifdef USE_WINSOCK
+ long mask = 0;
+ extra_fds[i].revents = 0;
+ pre_poll.fd = extra_fds[i].fd;
+ pre_poll.events = 0;
+ pre_poll.revents = 0;
+ if(extra_fds[i].events & CURL_WAIT_POLLIN) {
+ mask |= FD_READ|FD_ACCEPT|FD_CLOSE;
+ pre_poll.events |= POLLIN;
+ }
+ if(extra_fds[i].events & CURL_WAIT_POLLPRI) {
+ mask |= FD_OOB;
+ pre_poll.events |= POLLPRI;
+ }
+ if(extra_fds[i].events & CURL_WAIT_POLLOUT) {
+ mask |= FD_WRITE|FD_CONNECT|FD_CLOSE;
+ pre_poll.events |= POLLOUT;
+ }
+ if(Curl_poll(&pre_poll, 1, 0) > 0) {
+ if(pre_poll.revents & POLLIN)
+ extra_fds[i].revents |= CURL_WAIT_POLLIN;
+ if(pre_poll.revents & POLLPRI)
+ extra_fds[i].revents |= CURL_WAIT_POLLPRI;
+ if(pre_poll.revents & POLLOUT)
+ extra_fds[i].revents |= CURL_WAIT_POLLOUT;
+ if(extra_fds[i].revents)
+ timeout_ms = 0;
+ }
+ if(WSAEventSelect(extra_fds[i].fd, multi->wsa_event, mask) != 0)
+ return CURLM_INTERNAL_ERROR;
+#else
ufds[nfds].fd = extra_fds[i].fd;
ufds[nfds].events = 0;
if(extra_fds[i].events & CURL_WAIT_POLLIN)
@@ -1192,28 +1260,57 @@ static CURLMcode Curl_multi_wait(struct Curl_multi *multi,
if(extra_fds[i].events & CURL_WAIT_POLLOUT)
ufds[nfds].events |= POLLOUT;
++nfds;
+#endif
}
#ifdef ENABLE_WAKEUP
+#ifndef USE_WINSOCK
if(use_wakeup && multi->wakeup_pair[0] != CURL_SOCKET_BAD) {
ufds[nfds].fd = multi->wakeup_pair[0];
ufds[nfds].events = POLLIN;
++nfds;
}
#endif
+#endif
if(nfds) {
- int pollrc;
/* wait... */
- pollrc = Curl_poll(ufds, nfds, timeout_ms);
+#ifdef USE_WINSOCK
+ WSAWaitForMultipleEvents(1, &multi->wsa_event, FALSE, timeout_ms, FALSE);
+#else
+ int pollrc = Curl_poll(ufds, nfds, timeout_ms);
+#endif
+#ifdef USE_WINSOCK
+ /* With Winsock, we have to run this unconditionally to call
+ WSAEventSelect(fd, event, 0) on all the sockets */
+ {
+ retcode = 0;
+#else
if(pollrc > 0) {
retcode = pollrc;
+#endif
/* copy revents results from the poll to the curl_multi_wait poll
struct, the bit values of the actual underlying poll() implementation
may not be the same as the ones in the public libcurl API! */
for(i = 0; i < extra_nfds; i++) {
unsigned short mask = 0;
+#ifdef USE_WINSOCK
+ wsa_events.lNetworkEvents = 0;
+ mask = extra_fds[i].revents;
+ if(WSAEnumNetworkEvents(extra_fds[i].fd, multi->wsa_event,
+ &wsa_events) == 0) {
+ if(wsa_events.lNetworkEvents & (FD_READ|FD_ACCEPT|FD_CLOSE))
+ mask |= CURL_WAIT_POLLIN;
+ if(wsa_events.lNetworkEvents & (FD_WRITE|FD_CONNECT|FD_CLOSE))
+ mask |= CURL_WAIT_POLLOUT;
+ if(wsa_events.lNetworkEvents & FD_OOB)
+ mask |= CURL_WAIT_POLLPRI;
+ if(ret && wsa_events.lNetworkEvents != 0)
+ retcode++;
+ }
+ WSAEventSelect(extra_fds[i].fd, multi->wsa_event, 0);
+#else
unsigned r = ufds[curlfds + i].revents;
if(r & POLLIN)
@@ -1222,10 +1319,46 @@ static CURLMcode Curl_multi_wait(struct Curl_multi *multi,
mask |= CURL_WAIT_POLLOUT;
if(r & POLLPRI)
mask |= CURL_WAIT_POLLPRI;
-
+#endif
extra_fds[i].revents = mask;
}
+#ifdef USE_WINSOCK
+ /* Count up all our own sockets that had activity,
+ and remove them from the event. */
+ if(curlfds) {
+ data = multi->easyp;
+ while(data) {
+ bitmap = multi_getsock(data, sockbunch);
+
+ for(i = 0; i < MAX_SOCKSPEREASYHANDLE; i++) {
+ if(bitmap & (GETSOCK_READSOCK(i) | GETSOCK_WRITESOCK(i))) {
+ wsa_events.lNetworkEvents = 0;
+ if(WSAEnumNetworkEvents(sockbunch[i], multi->wsa_event,
+ &wsa_events) == 0) {
+ if(ret && wsa_events.lNetworkEvents != 0)
+ retcode++;
+ }
+ if(ret && !timeout_ms && wsa_events.lNetworkEvents == 0) {
+ if((bitmap & GETSOCK_READSOCK(i)) &&
+ SOCKET_READABLE(sockbunch[i], 0) > 0)
+ retcode++;
+ else if((bitmap & GETSOCK_WRITESOCK(i)) &&
+ SOCKET_WRITABLE(sockbunch[i], 0) > 0)
+ retcode++;
+ }
+ WSAEventSelect(sockbunch[i], multi->wsa_event, 0);
+ }
+ else
+ break;
+ }
+
+ data = data->next;
+ }
+ }
+
+ WSAResetEvent(multi->wsa_event);
+#else
#ifdef ENABLE_WAKEUP
if(use_wakeup && multi->wakeup_pair[0] != CURL_SOCKET_BAD) {
if(ufds[curlfds + extra_nfds].revents & POLLIN) {
@@ -1238,10 +1371,8 @@ static CURLMcode Curl_multi_wait(struct Curl_multi *multi,
when there is no more data, breaking the loop. */
nread = sread(multi->wakeup_pair[0], buf, sizeof(buf));
if(nread <= 0) {
-#ifndef USE_WINSOCK
if(nread < 0 && EINTR == SOCKERRNO)
continue;
-#endif
break;
}
}
@@ -1250,11 +1381,14 @@ static CURLMcode Curl_multi_wait(struct Curl_multi *multi,
}
}
#endif
+#endif
}
}
+#ifndef USE_WINSOCK
if(ufds_malloc)
free(ufds);
+#endif
if(ret)
*ret = retcode;
if(!extrawait || nfds)
@@ -1309,6 +1443,10 @@ CURLMcode curl_multi_wakeup(struct Curl_multi *multi)
return CURLM_BAD_HANDLE;
#ifdef ENABLE_WAKEUP
+#ifdef USE_WINSOCK
+ if(WSASetEvent(multi->wsa_event))
+ return CURLM_OK;
+#else
/* the wakeup_pair variable is only written during init and cleanup,
making it safe to access from another thread after the init part
and before cleanup */
@@ -1342,6 +1480,7 @@ CURLMcode curl_multi_wakeup(struct Curl_multi *multi)
}
}
#endif
+#endif
return CURLM_WAKEUP_FAILURE;
}
@@ -1562,7 +1701,7 @@ CURLcode Curl_preconnect(struct Curl_easy *data)
static CURLMcode multi_runsingle(struct Curl_multi *multi,
- struct curltime now,
+ struct curltime *nowp,
struct Curl_easy *data)
{
struct Curl_message *msg = NULL;
@@ -1603,7 +1742,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
(data->mstate < CURLM_STATE_COMPLETED)) {
/* we need to wait for the connect state as only then is the start time
stored, but we must not check already completed handles */
- timeout_ms = Curl_timeleft(data, &now,
+ timeout_ms = Curl_timeleft(data, nowp,
(data->mstate <= CURLM_STATE_DO)?
TRUE:FALSE);
@@ -1612,25 +1751,25 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
if(data->mstate == CURLM_STATE_WAITRESOLVE)
failf(data, "Resolving timed out after %" CURL_FORMAT_TIMEDIFF_T
" milliseconds",
- Curl_timediff(now, data->progress.t_startsingle));
+ Curl_timediff(*nowp, data->progress.t_startsingle));
else if(data->mstate == CURLM_STATE_WAITCONNECT)
failf(data, "Connection timed out after %" CURL_FORMAT_TIMEDIFF_T
" milliseconds",
- Curl_timediff(now, data->progress.t_startsingle));
+ Curl_timediff(*nowp, data->progress.t_startsingle));
else {
struct SingleRequest *k = &data->req;
if(k->size != -1) {
failf(data, "Operation timed out after %" CURL_FORMAT_TIMEDIFF_T
" milliseconds with %" CURL_FORMAT_CURL_OFF_T " out of %"
CURL_FORMAT_CURL_OFF_T " bytes received",
- Curl_timediff(now, data->progress.t_startsingle),
+ Curl_timediff(*nowp, data->progress.t_startsingle),
k->bytecount, k->size);
}
else {
failf(data, "Operation timed out after %" CURL_FORMAT_TIMEDIFF_T
" milliseconds with %" CURL_FORMAT_CURL_OFF_T
" bytes received",
- Curl_timediff(now, data->progress.t_startsingle),
+ Curl_timediff(*nowp, data->progress.t_startsingle),
k->bytecount);
}
}
@@ -1655,7 +1794,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
if(!result) {
/* after init, go CONNECT */
multistate(data, CURLM_STATE_CONNECT);
- Curl_pgrsTime(data, TIMER_STARTOP);
+ *nowp = Curl_pgrsTime(data, TIMER_STARTOP);
rc = CURLM_CALL_MULTI_PERFORM;
}
break;
@@ -1672,7 +1811,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
if(result)
break;
- Curl_pgrsTime(data, TIMER_STARTSINGLE);
+ *nowp = Curl_pgrsTime(data, TIMER_STARTSINGLE);
if(data->set.timeout)
Curl_expire(data, data->set.timeout, EXPIRE_TIMEOUT);
@@ -2080,7 +2219,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
if(Curl_pgrsUpdate(data->conn))
result = CURLE_ABORTED_BY_CALLBACK;
else
- result = Curl_speedcheck(data, now);
+ result = Curl_speedcheck(data, *nowp);
if(!result) {
send_timeout_ms = 0;
@@ -2090,7 +2229,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
data->progress.ul_limit_size,
data->set.max_send_speed,
data->progress.ul_limit_start,
- now);
+ *nowp);
recv_timeout_ms = 0;
if(data->set.max_recv_speed > 0)
@@ -2099,11 +2238,11 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
data->progress.dl_limit_size,
data->set.max_recv_speed,
data->progress.dl_limit_start,
- now);
+ *nowp);
if(!send_timeout_ms && !recv_timeout_ms) {
multistate(data, CURLM_STATE_PERFORM);
- Curl_ratelimit(data, now);
+ Curl_ratelimit(data, *nowp);
}
else if(send_timeout_ms >= recv_timeout_ms)
Curl_expire(data, send_timeout_ms, EXPIRE_TOOFAST);
@@ -2125,7 +2264,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
data->progress.ul_limit_size,
data->set.max_send_speed,
data->progress.ul_limit_start,
- now);
+ *nowp);
/* check if over recv speed */
recv_timeout_ms = 0;
@@ -2134,10 +2273,10 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
data->progress.dl_limit_size,
data->set.max_recv_speed,
data->progress.dl_limit_start,
- now);
+ *nowp);
if(send_timeout_ms || recv_timeout_ms) {
- Curl_ratelimit(data, now);
+ Curl_ratelimit(data, *nowp);
multistate(data, CURLM_STATE_TOOFAST);
if(send_timeout_ms >= recv_timeout_ms)
Curl_expire(data, send_timeout_ms, EXPIRE_TOOFAST);
@@ -2417,7 +2556,7 @@ CURLMcode curl_multi_perform(struct Curl_multi *multi, int *running_handles)
SIGPIPE_VARIABLE(pipe_st);
sigpipe_ignore(data, &pipe_st);
- result = multi_runsingle(multi, now, data);
+ result = multi_runsingle(multi, &now, data);
sigpipe_restore(&pipe_st);
if(result)
@@ -2500,10 +2639,14 @@ CURLMcode curl_multi_cleanup(struct Curl_multi *multi)
Curl_hash_destroy(&multi->hostcache);
Curl_psl_destroy(&multi->psl);
+#ifdef USE_WINSOCK
+ WSACloseEvent(multi->wsa_event);
+#else
#ifdef ENABLE_WAKEUP
sclose(multi->wakeup_pair[0]);
sclose(multi->wakeup_pair[1]);
#endif
+#endif
free(multi);
return CURLM_OK;
@@ -2531,7 +2674,7 @@ CURLMsg *curl_multi_info_read(struct Curl_multi *multi, int *msgs_in_queue)
!multi->in_callback &&
Curl_llist_count(&multi->msglist)) {
/* there is one or more messages in the list */
- struct curl_llist_element *e;
+ struct Curl_llist_element *e;
/* extract the head of the list to return */
e = multi->msglist.head;
@@ -2761,15 +2904,15 @@ static CURLMcode add_next_timeout(struct curltime now,
struct Curl_easy *d)
{
struct curltime *tv = &d->state.expiretime;
- struct curl_llist *list = &d->state.timeoutlist;
- struct curl_llist_element *e;
+ struct Curl_llist *list = &d->state.timeoutlist;
+ struct Curl_llist_element *e;
struct time_node *node = NULL;
/* move over the timeout list for this specific handle and remove all
timeouts that are now passed tense and store the next pending
timeout in *tv */
for(e = list->head; e;) {
- struct curl_llist_element *n = e->next;
+ struct Curl_llist_element *n = e->next;
timediff_t diff;
node = (struct time_node *)e->ptr;
diff = Curl_timediff(node->time, now);
@@ -2839,8 +2982,8 @@ static CURLMcode multi_socket(struct Curl_multi *multi,
and just move on. */
;
else {
- struct curl_hash_iterator iter;
- struct curl_hash_element *he;
+ struct Curl_hash_iterator iter;
+ struct Curl_hash_element *he;
/* the socket can be shared by many transfers, iterate */
Curl_hash_start_iterate(&entry->transfers, &iter);
@@ -2887,7 +3030,7 @@ static CURLMcode multi_socket(struct Curl_multi *multi,
SIGPIPE_VARIABLE(pipe_st);
sigpipe_ignore(data, &pipe_st);
- result = multi_runsingle(multi, now, data);
+ result = multi_runsingle(multi, &now, data);
sigpipe_restore(&pipe_st);
if(CURLM_OK >= result) {
@@ -3123,8 +3266,8 @@ void Curl_update_timer(struct Curl_multi *multi)
static void
multi_deltimeout(struct Curl_easy *data, expire_id eid)
{
- struct curl_llist_element *e;
- struct curl_llist *timeoutlist = &data->state.timeoutlist;
+ struct Curl_llist_element *e;
+ struct Curl_llist *timeoutlist = &data->state.timeoutlist;
/* find and remove the specific node from the list */
for(e = timeoutlist->head; e; e = e->next) {
struct time_node *n = (struct time_node *)e->ptr;
@@ -3147,11 +3290,11 @@ multi_addtimeout(struct Curl_easy *data,
struct curltime *stamp,
expire_id eid)
{
- struct curl_llist_element *e;
+ struct Curl_llist_element *e;
struct time_node *node;
- struct curl_llist_element *prev = NULL;
+ struct Curl_llist_element *prev = NULL;
size_t n;
- struct curl_llist *timeoutlist = &data->state.timeoutlist;
+ struct Curl_llist *timeoutlist = &data->state.timeoutlist;
node = &data->state.expires[eid];
@@ -3278,7 +3421,7 @@ void Curl_expire_clear(struct Curl_easy *data)
if(nowp->tv_sec || nowp->tv_usec) {
/* Since this is an cleared time, we must remove the previous entry from
the splay tree */
- struct curl_llist *list = &data->state.timeoutlist;
+ struct Curl_llist *list = &data->state.timeoutlist;
int rc;
rc = Curl_splayremovebyaddr(multi->timetree,
@@ -3349,7 +3492,7 @@ void Curl_multiuse_state(struct connectdata *conn,
static void process_pending_handles(struct Curl_multi *multi)
{
- struct curl_llist_element *e = multi->pending.head;
+ struct Curl_llist_element *e = multi->pending.head;
if(e) {
struct Curl_easy *data = e->ptr;
diff --git a/lib/multihandle.h b/lib/multihandle.h
index 9d73df08..c70a1ce0 100644
--- a/lib/multihandle.h
+++ b/lib/multihandle.h
@@ -27,7 +27,7 @@
#include "socketpair.h"
struct Curl_message {
- struct curl_llist_element list;
+ struct Curl_llist_element list;
/* the 'CURLMsg' is the part that is visible to the external user */
struct CURLMsg extmsg;
};
@@ -67,11 +67,11 @@ typedef enum {
#define CURLPIPE_ANY (CURLPIPE_MULTIPLEX)
-#if defined(USE_SOCKETPAIR) && !defined(USE_BLOCKING_SOCKETS)
+#if defined(USE_SOCKETPAIR) && !defined(USE_BLOCKING_SOCKETS) && \
+ !defined(CURL_DISABLE_SOCKETPAIR)
#define ENABLE_WAKEUP
#endif
-
/* value for MAXIMUM CONCURRENT STREAMS upper limit */
#define INITIAL_MAX_CONCURRENT_STREAMS ((1U << 31) - 1)
@@ -89,9 +89,9 @@ struct Curl_multi {
int num_alive; /* amount of easy handles that are added but have not yet
reached COMPLETE state */
- struct curl_llist msglist; /* a list of messages from completed transfers */
+ struct Curl_llist msglist; /* a list of messages from completed transfers */
- struct curl_llist pending; /* Curl_easys that are in the
+ struct Curl_llist pending; /* Curl_easys that are in the
CURLM_STATE_CONNECT_PEND state */
/* callback function and user data pointer for the *socket() API */
@@ -103,7 +103,7 @@ struct Curl_multi {
void *push_userp;
/* Hostname cache */
- struct curl_hash hostcache;
+ struct Curl_hash hostcache;
#ifdef USE_LIBPSL
/* PSL cache. */
@@ -117,7 +117,7 @@ struct Curl_multi {
/* 'sockhash' is the lookup hash for socket descriptor => easy handles (note
the pluralis form, there can be more than one easy handle waiting on the
same actual socket) */
- struct curl_hash sockhash;
+ struct Curl_hash sockhash;
/* Shared connection cache (bundles)*/
struct conncache conn_cache;
@@ -138,10 +138,14 @@ struct Curl_multi {
previous callback */
unsigned int max_concurrent_streams;
+#ifdef USE_WINSOCK
+ WSAEVENT wsa_event; /* winsock event used for waits */
+#else
#ifdef ENABLE_WAKEUP
curl_socket_t wakeup_pair[2]; /* socketpair() used for wakeup
0 is used for read, 1 is used for write */
#endif
+#endif
/* multiplexing wanted */
bool multiplexing;
bool recheckstate; /* see Curl_multi_connchanged */
diff --git a/lib/openldap.c b/lib/openldap.c
index 782d6a08..2aff4f60 100644
--- a/lib/openldap.c
+++ b/lib/openldap.c
@@ -107,6 +107,7 @@ const struct Curl_handler Curl_handler_ldap = {
ZERO_NULL, /* connection_check */
PORT_LDAP, /* defport */
CURLPROTO_LDAP, /* protocol */
+ CURLPROTO_LDAP, /* family */
PROTOPT_NONE /* flags */
};
@@ -132,7 +133,8 @@ const struct Curl_handler Curl_handler_ldaps = {
ZERO_NULL, /* readwrite */
ZERO_NULL, /* connection_check */
PORT_LDAPS, /* defport */
- CURLPROTO_LDAP, /* protocol */
+ CURLPROTO_LDAPS, /* protocol */
+ CURLPROTO_LDAP, /* family */
PROTOPT_SSL /* flags */
};
#endif
diff --git a/lib/parsedate.c b/lib/parsedate.c
index 4c7a40c4..dd6150b4 100644
--- a/lib/parsedate.c
+++ b/lib/parsedate.c
@@ -275,48 +275,21 @@ enum assume {
DATE_TIME
};
-/* this is a clone of 'struct tm' but with all fields we don't need or use
- cut out */
-struct my_tm {
- int tm_sec;
- int tm_min;
- int tm_hour;
- int tm_mday;
- int tm_mon;
- int tm_year; /* full year */
-};
-
-/* struct tm to time since epoch in GMT time zone.
- * This is similar to the standard mktime function but for GMT only, and
- * doesn't suffer from the various bugs and portability problems that
- * some systems' implementations have.
- *
- * Returns 0 on success, otherwise non-zero.
+/*
+ * time2epoch: time stamp to seconds since epoch in GMT time zone. Similar to
+ * mktime but for GMT only.
*/
-static void my_timegm(struct my_tm *tm, time_t *t)
+static time_t time2epoch(int sec, int min, int hour,
+ int mday, int mon, int year)
{
static const int month_days_cumulative [12] =
{ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };
- int month, year, leap_days;
-
- year = tm->tm_year;
- month = tm->tm_mon;
- if(month < 0) {
- year += (11 - month) / 12;
- month = 11 - (11 - month) % 12;
- }
- else if(month >= 12) {
- year -= month / 12;
- month = month % 12;
- }
-
- leap_days = year - (tm->tm_mon <= 1);
+ int leap_days = year - (mon <= 1);
leap_days = ((leap_days / 4) - (leap_days / 100) + (leap_days / 400)
- (1969 / 4) + (1969 / 100) - (1969 / 400));
-
- *t = ((((time_t) (year - 1970) * 365
- + leap_days + month_days_cumulative[month] + tm->tm_mday - 1) * 24
- + tm->tm_hour) * 60 + tm->tm_min) * 60 + tm->tm_sec;
+ return ((((time_t) (year - 1970) * 365
+ + leap_days + month_days_cumulative[mon] + mday - 1) * 24
+ + hour) * 60 + min) * 60 + sec;
}
/*
@@ -341,7 +314,6 @@ static int parsedate(const char *date, time_t *output)
int secnum = -1;
int yearnum = -1;
int tzoff = -1;
- struct my_tm tm;
enum assume dignext = DATE_MDAY;
const char *indate = date; /* save the original pointer */
int part = 0; /* max 6 parts */
@@ -533,18 +505,11 @@ static int parsedate(const char *date, time_t *output)
(hournum > 23) || (minnum > 59) || (secnum > 60))
return PARSEDATE_FAIL; /* clearly an illegal date */
- tm.tm_sec = secnum;
- tm.tm_min = minnum;
- tm.tm_hour = hournum;
- tm.tm_mday = mdaynum;
- tm.tm_mon = monnum;
- tm.tm_year = yearnum;
-
- /* my_timegm() returns a time_t. time_t is often 32 bits, sometimes even on
+ /* time2epoch() returns a time_t. time_t is often 32 bits, sometimes even on
architectures that feature 64 bit 'long' but ultimately time_t is the
correct data type to use.
*/
- my_timegm(&tm, &t);
+ t = time2epoch(secnum, minnum, hournum, mdaynum, monnum, yearnum);
/* Add the time zone diff between local time zone and GMT. */
if(tzoff == -1)
diff --git a/lib/pingpong.c b/lib/pingpong.c
index 31433152..5a06674a 100644
--- a/lib/pingpong.c
+++ b/lib/pingpong.c
@@ -146,7 +146,11 @@ void Curl_pp_init(struct pingpong *pp)
pp->response = Curl_now(); /* start response time-out now! */
}
-
+/* setup for the coming transfer */
+void Curl_pp_setup(struct pingpong *pp)
+{
+ Curl_dyn_init(&pp->sendbuf, DYN_PINGPPONG_CMD);
+}
/***********************************************************************
*
@@ -162,9 +166,8 @@ CURLcode Curl_pp_vsendf(struct pingpong *pp,
const char *fmt,
va_list args)
{
- ssize_t bytes_written;
+ ssize_t bytes_written = 0;
size_t write_len;
- char *fmt_crlf;
char *s;
CURLcode result;
struct connectdata *conn = pp->conn;
@@ -181,48 +184,42 @@ CURLcode Curl_pp_vsendf(struct pingpong *pp,
if(!conn)
/* can't send without a connection! */
return CURLE_SEND_ERROR;
-
data = conn->data;
- fmt_crlf = aprintf("%s\r\n", fmt); /* append a trailing CRLF */
- if(!fmt_crlf)
- return CURLE_OUT_OF_MEMORY;
-
- s = vaprintf(fmt_crlf, args); /* trailing CRLF appended */
- free(fmt_crlf);
- if(!s)
- return CURLE_OUT_OF_MEMORY;
+ Curl_dyn_reset(&pp->sendbuf);
+ result = Curl_dyn_vaddf(&pp->sendbuf, fmt, args);
+ if(result)
+ return result;
- bytes_written = 0;
- write_len = strlen(s);
+ /* append CRLF */
+ result = Curl_dyn_addn(&pp->sendbuf, "\r\n", 2);
+ if(result)
+ return result;
+ write_len = Curl_dyn_len(&pp->sendbuf);
+ s = Curl_dyn_ptr(&pp->sendbuf);
Curl_pp_init(pp);
result = Curl_convert_to_network(data, s, write_len);
/* Curl_convert_to_network calls failf if unsuccessful */
- if(result) {
- free(s);
+ if(result)
return result;
- }
#ifdef HAVE_GSSAPI
conn->data_prot = PROT_CMD;
#endif
result = Curl_write(conn, conn->sock[FIRSTSOCKET], s, write_len,
- &bytes_written);
+ &bytes_written);
+ if(result)
+ return result;
#ifdef HAVE_GSSAPI
data_sec = conn->data_prot;
DEBUGASSERT(data_sec > PROT_NONE && data_sec < PROT_LAST);
conn->data_prot = data_sec;
#endif
- if(result) {
- free(s);
- return result;
- }
-
- if(conn->data->set.verbose)
- Curl_debug(conn->data, CURLINFO_HEADER_OUT, s, (size_t)bytes_written);
+ if(data->set.verbose)
+ Curl_debug(data, CURLINFO_HEADER_OUT, s, (size_t)bytes_written);
if(bytes_written != (ssize_t)write_len) {
/* the whole chunk was not sent, keep it around and adjust sizes */
@@ -231,7 +228,6 @@ CURLcode Curl_pp_vsendf(struct pingpong *pp,
pp->sendleft = write_len - bytes_written;
}
else {
- free(s);
pp->sendthis = NULL;
pp->sendleft = pp->sendsize = 0;
pp->response = Curl_now();
@@ -493,7 +489,6 @@ CURLcode Curl_pp_flushsend(struct pingpong *pp)
pp->sendleft -= written;
}
else {
- free(pp->sendthis);
pp->sendthis = NULL;
pp->sendleft = pp->sendsize = 0;
pp->response = Curl_now();
@@ -503,15 +498,15 @@ CURLcode Curl_pp_flushsend(struct pingpong *pp)
CURLcode Curl_pp_disconnect(struct pingpong *pp)
{
- free(pp->cache);
- pp->cache = NULL;
+ Curl_dyn_free(&pp->sendbuf);
+ Curl_safefree(pp->cache);
return CURLE_OK;
}
bool Curl_pp_moredata(struct pingpong *pp)
{
return (!pp->sendleft && pp->cache && pp->nread_resp < pp->cache_size) ?
- TRUE : FALSE;
+ TRUE : FALSE;
}
#endif
diff --git a/lib/pingpong.h b/lib/pingpong.h
index e874799d..855815af 100644
--- a/lib/pingpong.h
+++ b/lib/pingpong.h
@@ -64,6 +64,7 @@ struct pingpong {
milliseconds we await for a server response. */
struct connectdata *conn; /* points to the connectdata struct that this
belongs to */
+ struct dynbuf sendbuf;
/* Function pointers the protocols MUST implement and provide for the
pingpong layer to function */
@@ -86,6 +87,9 @@ CURLcode Curl_pp_statemach(struct pingpong *pp, bool block,
/* initialize stuff to prepare for reading a fresh new response */
void Curl_pp_init(struct pingpong *pp);
+/* setup for the transfer */
+void Curl_pp_setup(struct pingpong *pp);
+
/* Returns timeout in ms. 0 or negative number means the timeout has already
triggered */
timediff_t Curl_pp_state_timeout(struct pingpong *pp, bool disconnecting);
diff --git a/lib/pop3.c b/lib/pop3.c
index 9ff5c78f..5a735458 100644
--- a/lib/pop3.c
+++ b/lib/pop3.c
@@ -128,6 +128,7 @@ const struct Curl_handler Curl_handler_pop3 = {
ZERO_NULL, /* connection_check */
PORT_POP3, /* defport */
CURLPROTO_POP3, /* protocol */
+ CURLPROTO_POP3, /* family */
PROTOPT_CLOSEACTION | PROTOPT_NOURLQUERY | /* flags */
PROTOPT_URLOPTIONS
};
@@ -155,6 +156,7 @@ const struct Curl_handler Curl_handler_pop3s = {
ZERO_NULL, /* connection_check */
PORT_POP3S, /* defport */
CURLPROTO_POP3S, /* protocol */
+ CURLPROTO_POP3, /* family */
PROTOPT_CLOSEACTION | PROTOPT_SSL
| PROTOPT_NOURLQUERY | PROTOPT_URLOPTIONS /* flags */
};
@@ -1091,6 +1093,7 @@ static CURLcode pop3_connect(struct connectdata *conn, bool *done)
Curl_sasl_init(&pop3c->sasl, &saslpop3);
/* Initialise the pingpong layer */
+ Curl_pp_setup(pp);
Curl_pp_init(pp);
/* Parse the URL options */
diff --git a/lib/progress.c b/lib/progress.c
index 89513844..eced74c9 100644
--- a/lib/progress.c
+++ b/lib/progress.c
@@ -164,9 +164,13 @@ void Curl_pgrsResetTransferSizes(struct Curl_easy *data)
}
/*
+ *
+ * Curl_pgrsTime(). Store the current time at the given label. This fetches a
+ * fresh "now" and returns it.
+ *
* @unittest: 1399
*/
-void Curl_pgrsTime(struct Curl_easy *data, timerid timer)
+struct curltime Curl_pgrsTime(struct Curl_easy *data, timerid timer)
{
struct curltime now = Curl_now();
timediff_t *delta = NULL;
@@ -209,7 +213,7 @@ void Curl_pgrsTime(struct Curl_easy *data, timerid timer)
* changing the t_starttransfer time.
*/
if(data->progress.is_t_startransfer_set) {
- return;
+ return now;
}
else {
data->progress.is_t_startransfer_set = true;
@@ -228,6 +232,7 @@ void Curl_pgrsTime(struct Curl_easy *data, timerid timer)
us = 1; /* make sure at least one microsecond passed */
*delta += us;
}
+ return now;
}
void Curl_pgrsStartNow(struct Curl_easy *data)
diff --git a/lib/progress.h b/lib/progress.h
index 3515ac6d..c19d966d 100644
--- a/lib/progress.h
+++ b/lib/progress.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -49,7 +49,7 @@ void Curl_pgrsSetUploadCounter(struct Curl_easy *data, curl_off_t size);
void Curl_ratelimit(struct Curl_easy *data, struct curltime now);
int Curl_pgrsUpdate(struct connectdata *);
void Curl_pgrsResetTransferSizes(struct Curl_easy *data);
-void Curl_pgrsTime(struct Curl_easy *data, timerid timer);
+struct curltime Curl_pgrsTime(struct Curl_easy *data, timerid timer);
timediff_t Curl_pgrsLimitWaitTime(curl_off_t cursize,
curl_off_t startsize,
curl_off_t limit,
diff --git a/lib/rtsp.c b/lib/rtsp.c
index dbd7dc6a..46c3c4f8 100644
--- a/lib/rtsp.c
+++ b/lib/rtsp.c
@@ -106,6 +106,7 @@ const struct Curl_handler Curl_handler_rtsp = {
rtsp_conncheck, /* connection_check */
PORT_RTSP, /* defport */
CURLPROTO_RTSP, /* protocol */
+ CURLPROTO_RTSP, /* family */
PROTOPT_NONE /* flags */
};
diff --git a/lib/security.c b/lib/security.c
deleted file mode 100644
index fbfa7074..00000000
--- a/lib/security.c
+++ /dev/null
@@ -1,579 +0,0 @@
-/* This source code was modified by Martin Hedenfalk <mhe@stacken.kth.se> for
- * use in Curl. His latest changes were done 2000-09-18.
- *
- * It has since been patched and modified a lot by Daniel Stenberg
- * <daniel@haxx.se> to make it better applied to curl conditions, and to make
- * it not use globals, pollute name space and more. This source code awaits a
- * rewrite to work around the paragraph 2 in the BSD licenses as explained
- * below.
- *
- * Copyright (c) 1998, 1999, 2017 Kungliga Tekniska Högskolan
- * (Royal Institute of Technology, Stockholm, Sweden).
- *
- * Copyright (C) 2001 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
- *
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * 3. Neither the name of the Institute nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE. */
-
-#include "curl_setup.h"
-
-#ifndef CURL_DISABLE_FTP
-#ifdef HAVE_GSSAPI
-
-#ifdef HAVE_NETDB_H
-#include <netdb.h>
-#endif
-
-#include <limits.h>
-
-#include "urldata.h"
-#include "curl_base64.h"
-#include "curl_memory.h"
-#include "curl_sec.h"
-#include "ftp.h"
-#include "sendf.h"
-#include "strcase.h"
-#include "warnless.h"
-#include "strdup.h"
-/* The last 3 #include files should be in this order */
-#include "curl_printf.h"
-#include "curl_memory.h"
-#include "memdebug.h"
-
-static const struct {
- enum protection_level level;
- const char *name;
-} level_names[] = {
- { PROT_CLEAR, "clear" },
- { PROT_SAFE, "safe" },
- { PROT_CONFIDENTIAL, "confidential" },
- { PROT_PRIVATE, "private" }
-};
-
-static enum protection_level
-name_to_level(const char *name)
-{
- int i;
- for(i = 0; i < (int)sizeof(level_names)/(int)sizeof(level_names[0]); i++)
- if(checkprefix(name, level_names[i].name))
- return level_names[i].level;
- return PROT_NONE;
-}
-
-/* Convert a protocol |level| to its char representation.
- We take an int to catch programming mistakes. */
-static char level_to_char(int level)
-{
- switch(level) {
- case PROT_CLEAR:
- return 'C';
- case PROT_SAFE:
- return 'S';
- case PROT_CONFIDENTIAL:
- return 'E';
- case PROT_PRIVATE:
- return 'P';
- case PROT_CMD:
- /* Fall through */
- default:
- /* Those 2 cases should not be reached! */
- break;
- }
- DEBUGASSERT(0);
- /* Default to the most secure alternative. */
- return 'P';
-}
-
-/* Send an FTP command defined by |message| and the optional arguments. The
- function returns the ftp_code. If an error occurs, -1 is returned. */
-static int ftp_send_command(struct connectdata *conn, const char *message, ...)
-{
- int ftp_code;
- ssize_t nread = 0;
- va_list args;
- char print_buffer[50];
-
- va_start(args, message);
- mvsnprintf(print_buffer, sizeof(print_buffer), message, args);
- va_end(args);
-
- if(Curl_ftpsend(conn, print_buffer)) {
- ftp_code = -1;
- }
- else {
- if(Curl_GetFTPResponse(&nread, conn, &ftp_code))
- ftp_code = -1;
- }
-
- (void)nread; /* Unused */
- return ftp_code;
-}
-
-/* Read |len| from the socket |fd| and store it in |to|. Return a CURLcode
- saying whether an error occurred or CURLE_OK if |len| was read. */
-static CURLcode
-socket_read(curl_socket_t fd, void *to, size_t len)
-{
- char *to_p = to;
- CURLcode result;
- ssize_t nread = 0;
-
- while(len > 0) {
- result = Curl_read_plain(fd, to_p, len, &nread);
- if(!result) {
- len -= nread;
- to_p += nread;
- }
- else {
- if(result == CURLE_AGAIN)
- continue;
- return result;
- }
- }
- return CURLE_OK;
-}
-
-
-/* Write |len| bytes from the buffer |to| to the socket |fd|. Return a
- CURLcode saying whether an error occurred or CURLE_OK if |len| was
- written. */
-static CURLcode
-socket_write(struct connectdata *conn, curl_socket_t fd, const void *to,
- size_t len)
-{
- const char *to_p = to;
- CURLcode result;
- ssize_t written;
-
- while(len > 0) {
- result = Curl_write_plain(conn, fd, to_p, len, &written);
- if(!result) {
- len -= written;
- to_p += written;
- }
- else {
- if(result == CURLE_AGAIN)
- continue;
- return result;
- }
- }
- return CURLE_OK;
-}
-
-static CURLcode read_data(struct connectdata *conn,
- curl_socket_t fd,
- struct krb5buffer *buf)
-{
- int len;
- CURLcode result;
-
- result = socket_read(fd, &len, sizeof(len));
- if(result)
- return result;
-
- if(len) {
- /* only realloc if there was a length */
- len = ntohl(len);
- buf->data = Curl_saferealloc(buf->data, len);
- }
- if(!len || !buf->data)
- return CURLE_OUT_OF_MEMORY;
-
- result = socket_read(fd, buf->data, len);
- if(result)
- return result;
- buf->size = conn->mech->decode(conn->app_data, buf->data, len,
- conn->data_prot, conn);
- buf->index = 0;
- return CURLE_OK;
-}
-
-static size_t
-buffer_read(struct krb5buffer *buf, void *data, size_t len)
-{
- if(buf->size - buf->index < len)
- len = buf->size - buf->index;
- memcpy(data, (char *)buf->data + buf->index, len);
- buf->index += len;
- return len;
-}
-
-/* Matches Curl_recv signature */
-static ssize_t sec_recv(struct connectdata *conn, int sockindex,
- char *buffer, size_t len, CURLcode *err)
-{
- size_t bytes_read;
- size_t total_read = 0;
- curl_socket_t fd = conn->sock[sockindex];
-
- *err = CURLE_OK;
-
- /* Handle clear text response. */
- if(conn->sec_complete == 0 || conn->data_prot == PROT_CLEAR)
- return sread(fd, buffer, len);
-
- if(conn->in_buffer.eof_flag) {
- conn->in_buffer.eof_flag = 0;
- return 0;
- }
-
- bytes_read = buffer_read(&conn->in_buffer, buffer, len);
- len -= bytes_read;
- total_read += bytes_read;
- buffer += bytes_read;
-
- while(len > 0) {
- if(read_data(conn, fd, &conn->in_buffer))
- return -1;
- if(conn->in_buffer.size == 0) {
- if(bytes_read > 0)
- conn->in_buffer.eof_flag = 1;
- return bytes_read;
- }
- bytes_read = buffer_read(&conn->in_buffer, buffer, len);
- len -= bytes_read;
- total_read += bytes_read;
- buffer += bytes_read;
- }
- return total_read;
-}
-
-/* Send |length| bytes from |from| to the |fd| socket taking care of encoding
- and negotiating with the server. |from| can be NULL. */
-static void do_sec_send(struct connectdata *conn, curl_socket_t fd,
- const char *from, int length)
-{
- int bytes, htonl_bytes; /* 32-bit integers for htonl */
- char *buffer = NULL;
- char *cmd_buffer;
- size_t cmd_size = 0;
- CURLcode error;
- enum protection_level prot_level = conn->data_prot;
- bool iscmd = (prot_level == PROT_CMD)?TRUE:FALSE;
-
- DEBUGASSERT(prot_level > PROT_NONE && prot_level < PROT_LAST);
-
- if(iscmd) {
- if(!strncmp(from, "PASS ", 5) || !strncmp(from, "ACCT ", 5))
- prot_level = PROT_PRIVATE;
- else
- prot_level = conn->command_prot;
- }
- bytes = conn->mech->encode(conn->app_data, from, length, prot_level,
- (void **)&buffer);
- if(!buffer || bytes <= 0)
- return; /* error */
-
- if(iscmd) {
- error = Curl_base64_encode(conn->data, buffer, curlx_sitouz(bytes),
- &cmd_buffer, &cmd_size);
- if(error) {
- free(buffer);
- return; /* error */
- }
- if(cmd_size > 0) {
- static const char *enc = "ENC ";
- static const char *mic = "MIC ";
- if(prot_level == PROT_PRIVATE)
- socket_write(conn, fd, enc, 4);
- else
- socket_write(conn, fd, mic, 4);
-
- socket_write(conn, fd, cmd_buffer, cmd_size);
- socket_write(conn, fd, "\r\n", 2);
- infof(conn->data, "Send: %s%s\n", prot_level == PROT_PRIVATE?enc:mic,
- cmd_buffer);
- free(cmd_buffer);
- }
- }
- else {
- htonl_bytes = htonl(bytes);
- socket_write(conn, fd, &htonl_bytes, sizeof(htonl_bytes));
- socket_write(conn, fd, buffer, curlx_sitouz(bytes));
- }
- free(buffer);
-}
-
-static ssize_t sec_write(struct connectdata *conn, curl_socket_t fd,
- const char *buffer, size_t length)
-{
- ssize_t tx = 0, len = conn->buffer_size;
-
- len -= conn->mech->overhead(conn->app_data, conn->data_prot,
- curlx_sztosi(len));
- if(len <= 0)
- len = length;
- while(length) {
- if(length < (size_t)len)
- len = length;
-
- do_sec_send(conn, fd, buffer, curlx_sztosi(len));
- length -= len;
- buffer += len;
- tx += len;
- }
- return tx;
-}
-
-/* Matches Curl_send signature */
-static ssize_t sec_send(struct connectdata *conn, int sockindex,
- const void *buffer, size_t len, CURLcode *err)
-{
- curl_socket_t fd = conn->sock[sockindex];
- *err = CURLE_OK;
- return sec_write(conn, fd, buffer, len);
-}
-
-int Curl_sec_read_msg(struct connectdata *conn, char *buffer,
- enum protection_level level)
-{
- /* decoded_len should be size_t or ssize_t but conn->mech->decode returns an
- int */
- int decoded_len;
- char *buf;
- int ret_code = 0;
- size_t decoded_sz = 0;
- CURLcode error;
-
- if(!conn->mech)
- /* not inititalized, return error */
- return -1;
-
- DEBUGASSERT(level > PROT_NONE && level < PROT_LAST);
-
- error = Curl_base64_decode(buffer + 4, (unsigned char **)&buf, &decoded_sz);
- if(error || decoded_sz == 0)
- return -1;
-
- if(decoded_sz > (size_t)INT_MAX) {
- free(buf);
- return -1;
- }
- decoded_len = curlx_uztosi(decoded_sz);
-
- decoded_len = conn->mech->decode(conn->app_data, buf, decoded_len,
- level, conn);
- if(decoded_len <= 0) {
- free(buf);
- return -1;
- }
-
- if(conn->data->set.verbose) {
- buf[decoded_len] = '\n';
- Curl_debug(conn->data, CURLINFO_HEADER_IN, buf, decoded_len + 1);
- }
-
- buf[decoded_len] = '\0';
- if(decoded_len <= 3)
- /* suspiciously short */
- return 0;
-
- if(buf[3] != '-')
- /* safe to ignore return code */
- (void)sscanf(buf, "%d", &ret_code);
-
- if(buf[decoded_len - 1] == '\n')
- buf[decoded_len - 1] = '\0';
- strcpy(buffer, buf);
- free(buf);
- return ret_code;
-}
-
-static int sec_set_protection_level(struct connectdata *conn)
-{
- int code;
- enum protection_level level = conn->request_data_prot;
-
- DEBUGASSERT(level > PROT_NONE && level < PROT_LAST);
-
- if(!conn->sec_complete) {
- infof(conn->data, "Trying to change the protection level after the"
- " completion of the data exchange.\n");
- return -1;
- }
-
- /* Bail out if we try to set up the same level */
- if(conn->data_prot == level)
- return 0;
-
- if(level) {
- char *pbsz;
- static unsigned int buffer_size = 1 << 20; /* 1048576 */
-
- code = ftp_send_command(conn, "PBSZ %u", buffer_size);
- if(code < 0)
- return -1;
-
- if(code/100 != 2) {
- failf(conn->data, "Failed to set the protection's buffer size.");
- return -1;
- }
- conn->buffer_size = buffer_size;
-
- pbsz = strstr(conn->data->state.buffer, "PBSZ=");
- if(pbsz) {
- /* ignore return code, use default value if it fails */
- (void)sscanf(pbsz, "PBSZ=%u", &buffer_size);
- if(buffer_size < conn->buffer_size)
- conn->buffer_size = buffer_size;
- }
- }
-
- /* Now try to negiociate the protection level. */
- code = ftp_send_command(conn, "PROT %c", level_to_char(level));
-
- if(code < 0)
- return -1;
-
- if(code/100 != 2) {
- failf(conn->data, "Failed to set the protection level.");
- return -1;
- }
-
- conn->data_prot = level;
- if(level == PROT_PRIVATE)
- conn->command_prot = level;
-
- return 0;
-}
-
-int
-Curl_sec_request_prot(struct connectdata *conn, const char *level)
-{
- enum protection_level l = name_to_level(level);
- if(l == PROT_NONE)
- return -1;
- DEBUGASSERT(l > PROT_NONE && l < PROT_LAST);
- conn->request_data_prot = l;
- return 0;
-}
-
-static CURLcode choose_mech(struct connectdata *conn)
-{
- int ret;
- struct Curl_easy *data = conn->data;
- void *tmp_allocation;
- const struct Curl_sec_client_mech *mech = &Curl_krb5_client_mech;
-
- tmp_allocation = realloc(conn->app_data, mech->size);
- if(tmp_allocation == NULL) {
- failf(data, "Failed realloc of size %zu", mech->size);
- mech = NULL;
- return CURLE_OUT_OF_MEMORY;
- }
- conn->app_data = tmp_allocation;
-
- if(mech->init) {
- ret = mech->init(conn->app_data);
- if(ret) {
- infof(data, "Failed initialization for %s. Skipping it.\n",
- mech->name);
- return CURLE_FAILED_INIT;
- }
- }
-
- infof(data, "Trying mechanism %s...\n", mech->name);
- ret = ftp_send_command(conn, "AUTH %s", mech->name);
- if(ret < 0)
- return CURLE_COULDNT_CONNECT;
-
- if(ret/100 != 3) {
- switch(ret) {
- case 504:
- infof(data, "Mechanism %s is not supported by the server (server "
- "returned ftp code: 504).\n", mech->name);
- break;
- case 534:
- infof(data, "Mechanism %s was rejected by the server (server returned "
- "ftp code: 534).\n", mech->name);
- break;
- default:
- if(ret/100 == 5) {
- infof(data, "server does not support the security extensions\n");
- return CURLE_USE_SSL_FAILED;
- }
- break;
- }
- return CURLE_LOGIN_DENIED;
- }
-
- /* Authenticate */
- ret = mech->auth(conn->app_data, conn);
-
- if(ret != AUTH_CONTINUE) {
- if(ret != AUTH_OK) {
- /* Mechanism has dumped the error to stderr, don't error here. */
- return -1;
- }
- DEBUGASSERT(ret == AUTH_OK);
-
- conn->mech = mech;
- conn->sec_complete = 1;
- conn->recv[FIRSTSOCKET] = sec_recv;
- conn->send[FIRSTSOCKET] = sec_send;
- conn->recv[SECONDARYSOCKET] = sec_recv;
- conn->send[SECONDARYSOCKET] = sec_send;
- conn->command_prot = PROT_SAFE;
- /* Set the requested protection level */
- /* BLOCKING */
- (void)sec_set_protection_level(conn);
- }
-
- return CURLE_OK;
-}
-
-CURLcode
-Curl_sec_login(struct connectdata *conn)
-{
- return choose_mech(conn);
-}
-
-
-void
-Curl_sec_end(struct connectdata *conn)
-{
- if(conn->mech != NULL && conn->mech->end)
- conn->mech->end(conn->app_data);
- free(conn->app_data);
- conn->app_data = NULL;
- if(conn->in_buffer.data) {
- free(conn->in_buffer.data);
- conn->in_buffer.data = NULL;
- conn->in_buffer.size = 0;
- conn->in_buffer.index = 0;
- conn->in_buffer.eof_flag = 0;
- }
- conn->sec_complete = 0;
- conn->data_prot = PROT_CLEAR;
- conn->mech = NULL;
-}
-
-#endif /* HAVE_GSSAPI */
-
-#endif /* CURL_DISABLE_FTP */
diff --git a/lib/select.c b/lib/select.c
index abb124ae..917133b7 100644
--- a/lib/select.c
+++ b/lib/select.c
@@ -149,15 +149,14 @@ int Curl_select(curl_socket_t maxfd, /* highest socket number */
{
struct timeval pending_tv;
struct timeval *ptimeout;
- int r;
#ifdef USE_WINSOCK
/* WinSock select() can't handle zero events. See the comment below. */
if((!fds_read || fds_read->fd_count == 0) &&
(!fds_write || fds_write->fd_count == 0) &&
(!fds_err || fds_err->fd_count == 0)) {
- r = Curl_wait_ms(timeout_ms);
- return r;
+ /* no sockets, just wait */
+ return Curl_wait_ms(timeout_ms);
}
#endif
@@ -209,17 +208,16 @@ int Curl_select(curl_socket_t maxfd, /* highest socket number */
descriptor set must contain at least one handle to a socket.
It is unclear why WinSock doesn't just handle this for us instead of
- calling this an error.
+ calling this an error. Luckily, with WinSock, we can _also_ ask how
+ many bits are set on an fd_set. So, let's just check it beforehand.
*/
- r = select((int)maxfd + 1,
- fds_read && fds_read->fd_count ? fds_read : NULL,
- fds_write && fds_write->fd_count ? fds_write : NULL,
- fds_err && fds_err->fd_count ? fds_err : NULL, ptimeout);
+ return select((int)maxfd + 1,
+ fds_read && fds_read->fd_count ? fds_read : NULL,
+ fds_write && fds_write->fd_count ? fds_write : NULL,
+ fds_err && fds_err->fd_count ? fds_err : NULL, ptimeout);
#else
- r = select((int)maxfd + 1, fds_read, fds_write, fds_err, ptimeout);
+ return select((int)maxfd + 1, fds_read, fds_write, fds_err, ptimeout);
#endif
-
- return r;
}
/*
@@ -247,23 +245,14 @@ int Curl_socket_check(curl_socket_t readfd0, /* two sockets to read from */
curl_socket_t writefd, /* socket to write to */
timediff_t timeout_ms) /* milliseconds to wait */
{
-#ifdef HAVE_POLL_FINE
struct pollfd pfd[3];
int num;
-#else
- fd_set fds_read;
- fd_set fds_write;
- fd_set fds_err;
- curl_socket_t maxfd;
-#endif
int r;
- int ret;
if((readfd0 == CURL_SOCKET_BAD) && (readfd1 == CURL_SOCKET_BAD) &&
(writefd == CURL_SOCKET_BAD)) {
/* no sockets, just wait */
- r = Curl_wait_ms(timeout_ms);
- return r;
+ return Curl_wait_ms(timeout_ms);
}
/* Avoid initial timestamp, avoid Curl_now() call, when elapsed
@@ -271,8 +260,6 @@ int Curl_socket_check(curl_socket_t readfd0, /* two sockets to read from */
when function is called with a zero timeout or a negative timeout
value indicating a blocking call should be performed. */
-#ifdef HAVE_POLL_FINE
-
num = 0;
if(readfd0 != CURL_SOCKET_BAD) {
pfd[num].fd = readfd0;
@@ -288,7 +275,7 @@ int Curl_socket_check(curl_socket_t readfd0, /* two sockets to read from */
}
if(writefd != CURL_SOCKET_BAD) {
pfd[num].fd = writefd;
- pfd[num].events = POLLWRNORM|POLLOUT;
+ pfd[num].events = POLLWRNORM|POLLOUT|POLLPRI;
pfd[num].revents = 0;
num++;
}
@@ -297,101 +284,30 @@ int Curl_socket_check(curl_socket_t readfd0, /* two sockets to read from */
if(r <= 0)
return r;
- ret = 0;
+ r = 0;
num = 0;
if(readfd0 != CURL_SOCKET_BAD) {
if(pfd[num].revents & (POLLRDNORM|POLLIN|POLLERR|POLLHUP))
- ret |= CURL_CSELECT_IN;
+ r |= CURL_CSELECT_IN;
if(pfd[num].revents & (POLLRDBAND|POLLPRI|POLLNVAL))
- ret |= CURL_CSELECT_ERR;
+ r |= CURL_CSELECT_ERR;
num++;
}
if(readfd1 != CURL_SOCKET_BAD) {
if(pfd[num].revents & (POLLRDNORM|POLLIN|POLLERR|POLLHUP))
- ret |= CURL_CSELECT_IN2;
+ r |= CURL_CSELECT_IN2;
if(pfd[num].revents & (POLLRDBAND|POLLPRI|POLLNVAL))
- ret |= CURL_CSELECT_ERR;
+ r |= CURL_CSELECT_ERR;
num++;
}
if(writefd != CURL_SOCKET_BAD) {
if(pfd[num].revents & (POLLWRNORM|POLLOUT))
- ret |= CURL_CSELECT_OUT;
- if(pfd[num].revents & (POLLERR|POLLHUP|POLLNVAL))
- ret |= CURL_CSELECT_ERR;
- }
-
- return ret;
-
-#else /* HAVE_POLL_FINE */
-
- FD_ZERO(&fds_err);
- maxfd = (curl_socket_t)-1;
-
- FD_ZERO(&fds_read);
- if(readfd0 != CURL_SOCKET_BAD) {
- VERIFY_SOCK(readfd0);
- FD_SET(readfd0, &fds_read);
- FD_SET(readfd0, &fds_err);
- maxfd = readfd0;
- }
- if(readfd1 != CURL_SOCKET_BAD) {
- VERIFY_SOCK(readfd1);
- FD_SET(readfd1, &fds_read);
- FD_SET(readfd1, &fds_err);
- if(readfd1 > maxfd)
- maxfd = readfd1;
- }
-
- FD_ZERO(&fds_write);
- if(writefd != CURL_SOCKET_BAD) {
- VERIFY_SOCK(writefd);
- FD_SET(writefd, &fds_write);
- FD_SET(writefd, &fds_err);
- if(writefd > maxfd)
- maxfd = writefd;
- }
-
- /* We know that we have at least one bit set in at least two fd_sets in
- this case, but we may have no bits set in either fds_read or fd_write,
- so check for that and handle it. Luckily, with WinSock, we can _also_
- ask how many bits are set on an fd_set.
-
- Note also that WinSock ignores the first argument, so we don't worry
- about the fact that maxfd is computed incorrectly with WinSock (since
- curl_socket_t is unsigned in such cases and thus -1 is the largest
- value).
- */
- r = Curl_select(maxfd, &fds_read, &fds_write, &fds_err, timeout_ms);
-
- if(r < 0)
- return -1;
- if(r == 0)
- return 0;
-
- ret = 0;
- if(readfd0 != CURL_SOCKET_BAD) {
- if(FD_ISSET(readfd0, &fds_read))
- ret |= CURL_CSELECT_IN;
- if(FD_ISSET(readfd0, &fds_err))
- ret |= CURL_CSELECT_ERR;
- }
- if(readfd1 != CURL_SOCKET_BAD) {
- if(FD_ISSET(readfd1, &fds_read))
- ret |= CURL_CSELECT_IN2;
- if(FD_ISSET(readfd1, &fds_err))
- ret |= CURL_CSELECT_ERR;
- }
- if(writefd != CURL_SOCKET_BAD) {
- if(FD_ISSET(writefd, &fds_write))
- ret |= CURL_CSELECT_OUT;
- if(FD_ISSET(writefd, &fds_err))
- ret |= CURL_CSELECT_ERR;
+ r |= CURL_CSELECT_OUT;
+ if(pfd[num].revents & (POLLERR|POLLHUP|POLLPRI|POLLNVAL))
+ r |= CURL_CSELECT_ERR;
}
- return ret;
-
-#endif /* HAVE_POLL_FINE */
-
+ return r;
}
/*
@@ -431,8 +347,7 @@ int Curl_poll(struct pollfd ufds[], unsigned int nfds, timediff_t timeout_ms)
}
if(fds_none) {
/* no sockets, just wait */
- r = Curl_wait_ms(timeout_ms);
- return r;
+ return Curl_wait_ms(timeout_ms);
}
/* Avoid initial timestamp, avoid Curl_now() call, when elapsed
@@ -454,11 +369,8 @@ int Curl_poll(struct pollfd ufds[], unsigned int nfds, timediff_t timeout_ms)
else
pending_ms = 0;
r = poll(ufds, nfds, pending_ms);
-
- if(r < 0)
- return -1;
- if(r == 0)
- return 0;
+ if(r <= 0)
+ return r;
for(i = 0; i < nfds; i++) {
if(ufds[i].fd == CURL_SOCKET_BAD)
@@ -466,7 +378,7 @@ int Curl_poll(struct pollfd ufds[], unsigned int nfds, timediff_t timeout_ms)
if(ufds[i].revents & POLLHUP)
ufds[i].revents |= POLLIN;
if(ufds[i].revents & POLLERR)
- ufds[i].revents |= (POLLIN|POLLOUT);
+ ufds[i].revents |= POLLIN|POLLOUT;
}
#else /* HAVE_POLL_FINE */
@@ -482,7 +394,7 @@ int Curl_poll(struct pollfd ufds[], unsigned int nfds, timediff_t timeout_ms)
continue;
VERIFY_SOCK(ufds[i].fd);
if(ufds[i].events & (POLLIN|POLLOUT|POLLPRI|
- POLLRDNORM|POLLWRNORM|POLLRDBAND)) {
+ POLLRDNORM|POLLWRNORM|POLLRDBAND)) {
if(ufds[i].fd > maxfd)
maxfd = ufds[i].fd;
if(ufds[i].events & (POLLRDNORM|POLLIN))
@@ -494,24 +406,39 @@ int Curl_poll(struct pollfd ufds[], unsigned int nfds, timediff_t timeout_ms)
}
}
+ /*
+ Note also that WinSock ignores the first argument, so we don't worry
+ about the fact that maxfd is computed incorrectly with WinSock (since
+ curl_socket_t is unsigned in such cases and thus -1 is the largest
+ value).
+ */
r = Curl_select(maxfd, &fds_read, &fds_write, &fds_err, timeout_ms);
-
- if(r < 0)
- return -1;
- if(r == 0)
- return 0;
+ if(r <= 0)
+ return r;
r = 0;
for(i = 0; i < nfds; i++) {
ufds[i].revents = 0;
if(ufds[i].fd == CURL_SOCKET_BAD)
continue;
- if(FD_ISSET(ufds[i].fd, &fds_read))
- ufds[i].revents |= POLLIN;
- if(FD_ISSET(ufds[i].fd, &fds_write))
- ufds[i].revents |= POLLOUT;
- if(FD_ISSET(ufds[i].fd, &fds_err))
- ufds[i].revents |= POLLPRI;
+ if(FD_ISSET(ufds[i].fd, &fds_read)) {
+ if(ufds[i].events & POLLRDNORM)
+ ufds[i].revents |= POLLRDNORM;
+ if(ufds[i].events & POLLIN)
+ ufds[i].revents |= POLLIN;
+ }
+ if(FD_ISSET(ufds[i].fd, &fds_write)) {
+ if(ufds[i].events & POLLWRNORM)
+ ufds[i].revents |= POLLWRNORM;
+ if(ufds[i].events & POLLOUT)
+ ufds[i].revents |= POLLOUT;
+ }
+ if(FD_ISSET(ufds[i].fd, &fds_err)) {
+ if(ufds[i].events & POLLRDBAND)
+ ufds[i].revents |= POLLRDBAND;
+ if(ufds[i].events & POLLPRI)
+ ufds[i].revents |= POLLPRI;
+ }
if(ufds[i].revents != 0)
r++;
}
diff --git a/lib/select.h b/lib/select.h
index 95181f46..c9cc5c2e 100644
--- a/lib/select.h
+++ b/lib/select.h
@@ -94,12 +94,23 @@ int tpf_select_libcurl(int maxfds, fd_set* reads, fd_set* writes,
fd_set* excepts, struct timeval *tv);
#endif
-/* Winsock and TPF sockets are not in range [0..FD_SETSIZE-1], which
+/* TPF sockets are not in range [0..FD_SETSIZE-1], which
unfortunately makes it impossible for us to easily check if they're valid
+
+ With Winsock the valid range is [0..INVALID_SOCKET-1] according to
+ https://docs.microsoft.com/en-us/windows/win32/winsock/socket-data-type-2
*/
-#if defined(USE_WINSOCK) || defined(TPF)
+#if defined(TPF)
#define VALID_SOCK(x) 1
#define VERIFY_SOCK(x) Curl_nop_stmt
+#elif defined(USE_WINSOCK)
+#define VALID_SOCK(s) ((s) < INVALID_SOCKET)
+#define VERIFY_SOCK(x) do { \
+ if(!VALID_SOCK(x)) { \
+ SET_SOCKERRNO(WSAEINVAL); \
+ return -1; \
+ } \
+} while(0)
#else
#define VALID_SOCK(s) (((s) >= 0) && ((s) < FD_SETSIZE))
#define VERIFY_SOCK(x) do { \
diff --git a/lib/sendf.c b/lib/sendf.c
index 6943fa84..6cfc89b6 100644
--- a/lib/sendf.c
+++ b/lib/sendf.c
@@ -140,7 +140,7 @@ bool Curl_recv_has_postponed_data(struct connectdata *conn, int sockindex)
psnd->recv_size > psnd->recv_processed;
}
-static void pre_receive_plain(struct connectdata *conn, int num)
+static CURLcode pre_receive_plain(struct connectdata *conn, int num)
{
const curl_socket_t sockfd = conn->sock[num];
struct postponed_data * const psnd = &(conn->postponed[num]);
@@ -161,6 +161,8 @@ static void pre_receive_plain(struct connectdata *conn, int num)
/* Use buffer double default size for intermediate buffer */
psnd->allocated_size = 2 * conn->data->set.buffer_size;
psnd->buffer = malloc(psnd->allocated_size);
+ if(!psnd->buffer)
+ return CURLE_OUT_OF_MEMORY;
psnd->recv_size = 0;
psnd->recv_processed = 0;
#ifdef DEBUGBUILD
@@ -180,6 +182,7 @@ static void pre_receive_plain(struct connectdata *conn, int num)
psnd->allocated_size = 0;
}
}
+ return CURLE_OK;
}
static ssize_t get_pre_recved(struct connectdata *conn, int num, char *buf,
@@ -225,7 +228,7 @@ bool Curl_recv_has_postponed_data(struct connectdata *conn, int sockindex)
(void)sockindex;
return false;
}
-#define pre_receive_plain(c,n) do {} while(0)
+#define pre_receive_plain(c,n) CURLE_OK
#define get_pre_recved(c,n,b,l) 0
#endif /* ! USE_RECV_BEFORE_SEND_WORKAROUND */
@@ -283,52 +286,6 @@ void Curl_failf(struct Curl_easy *data, const char *fmt, ...)
}
}
-/* Curl_sendf() sends formatted data to the server */
-CURLcode Curl_sendf(curl_socket_t sockfd, struct connectdata *conn,
- const char *fmt, ...)
-{
- struct Curl_easy *data = conn->data;
- ssize_t bytes_written;
- size_t write_len;
- CURLcode result = CURLE_OK;
- char *s;
- char *sptr;
- va_list ap;
- va_start(ap, fmt);
- s = vaprintf(fmt, ap); /* returns an allocated string */
- va_end(ap);
- if(!s)
- return CURLE_OUT_OF_MEMORY; /* failure */
-
- bytes_written = 0;
- write_len = strlen(s);
- sptr = s;
-
- for(;;) {
- /* Write the buffer to the socket */
- result = Curl_write(conn, sockfd, sptr, write_len, &bytes_written);
-
- if(result)
- break;
-
- if(data->set.verbose)
- Curl_debug(data, CURLINFO_DATA_OUT, sptr, (size_t)bytes_written);
-
- if((size_t)bytes_written != write_len) {
- /* if not all was written at once, we must advance the pointer, decrease
- the size left and try again! */
- write_len -= bytes_written;
- sptr += bytes_written;
- }
- else
- break;
- }
-
- free(s); /* free the output string */
-
- return result;
-}
-
/*
* Curl_write() is an internal write function that sends data to the
* server. Works with plain sockets, SCP, SSL or kerberos.
@@ -379,7 +336,10 @@ ssize_t Curl_send_plain(struct connectdata *conn, int num,
To avoid lossage of received data, recv() must be
performed before every send() if any incoming data is
available. */
- pre_receive_plain(conn, num);
+ if(pre_receive_plain(conn, num)) {
+ *code = CURLE_OUT_OF_MEMORY;
+ return -1;
+ }
#if defined(MSG_FASTOPEN) && !defined(TCP_FASTOPEN_CONNECT) /* Linux */
if(conn->bits.tcp_fastopen) {
diff --git a/lib/sendf.h b/lib/sendf.h
index c68b017d..2e270c59 100644
--- a/lib/sendf.h
+++ b/lib/sendf.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -24,8 +24,6 @@
#include "curl_setup.h"
-CURLcode Curl_sendf(curl_socket_t sockfd, struct connectdata *,
- const char *fmt, ...);
void Curl_infof(struct Curl_easy *, const char *fmt, ...);
void Curl_failf(struct Curl_easy *, const char *fmt, ...);
diff --git a/lib/setopt.c b/lib/setopt.c
index d6213357..fa539821 100644
--- a/lib/setopt.c
+++ b/lib/setopt.c
@@ -430,104 +430,12 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
primary->version_max = version_max;
}
#else
- result = CURLE_UNKNOWN_OPTION;
+ result = CURLE_NOT_BUILT_IN;
#endif
break;
-#ifndef CURL_DISABLE_HTTP
- case CURLOPT_AUTOREFERER:
- /*
- * Switch on automatic referer that gets set if curl follows locations.
- */
- data->set.http_auto_referer = (0 != va_arg(param, long)) ? TRUE : FALSE;
- break;
-
- case CURLOPT_ACCEPT_ENCODING:
- /*
- * String to use at the value of Accept-Encoding header.
- *
- * If the encoding is set to "" we use an Accept-Encoding header that
- * encompasses all the encodings we support.
- * If the encoding is set to NULL we don't send an Accept-Encoding header
- * and ignore an received Content-Encoding header.
- *
- */
- argptr = va_arg(param, char *);
- if(argptr && !*argptr) {
- argptr = Curl_all_content_encodings();
- if(!argptr)
- result = CURLE_OUT_OF_MEMORY;
- else {
- result = Curl_setstropt(&data->set.str[STRING_ENCODING], argptr);
- free(argptr);
- }
- }
- else
- result = Curl_setstropt(&data->set.str[STRING_ENCODING], argptr);
- break;
-
- case CURLOPT_TRANSFER_ENCODING:
- data->set.http_transfer_encoding = (0 != va_arg(param, long)) ?
- TRUE : FALSE;
- break;
-
- case CURLOPT_FOLLOWLOCATION:
- /*
- * Follow Location: header hints on a HTTP-server.
- */
- data->set.http_follow_location = (0 != va_arg(param, long)) ? TRUE : FALSE;
- break;
-
- case CURLOPT_UNRESTRICTED_AUTH:
- /*
- * Send authentication (user+password) when following locations, even when
- * hostname changed.
- */
- data->set.allow_auth_to_other_hosts =
- (0 != va_arg(param, long)) ? TRUE : FALSE;
- break;
-
- case CURLOPT_MAXREDIRS:
- /*
- * The maximum amount of hops you allow curl to follow Location:
- * headers. This should mostly be used to detect never-ending loops.
- */
- arg = va_arg(param, long);
- if(arg < -1)
- return CURLE_BAD_FUNCTION_ARGUMENT;
- data->set.maxredirs = arg;
- break;
-
- case CURLOPT_POSTREDIR:
- /*
- * Set the behaviour of POST when redirecting
- * CURL_REDIR_GET_ALL - POST is changed to GET after 301 and 302
- * CURL_REDIR_POST_301 - POST is kept as POST after 301
- * CURL_REDIR_POST_302 - POST is kept as POST after 302
- * CURL_REDIR_POST_303 - POST is kept as POST after 303
- * CURL_REDIR_POST_ALL - POST is kept as POST after 301, 302 and 303
- * other - POST is kept as POST after 301 and 302
- */
- arg = va_arg(param, long);
- if(arg < CURL_REDIR_GET_ALL)
- /* no return error on too high numbers since the bitmask could be
- extended in a future */
- return CURLE_BAD_FUNCTION_ARGUMENT;
- data->set.keep_post = arg & CURL_REDIR_POST_ALL;
- break;
-
- case CURLOPT_POST:
- /* Does this option serve a purpose anymore? Yes it does, when
- CURLOPT_POSTFIELDS isn't used and the POST data is read off the
- callback! */
- if(va_arg(param, long)) {
- data->set.method = HTTPREQ_POST;
- data->set.opt_no_body = FALSE; /* this is implied */
- }
- else
- data->set.method = HTTPREQ_GET;
- break;
-
+ /* MQTT "borrows" some of the HTTP options */
+#if !defined(CURL_DISABLE_HTTP) || !defined(CURL_DISABLE_MQTT)
case CURLOPT_COPYPOSTFIELDS:
/*
* A string with POST data. Makes curl HTTP POST. Even if it is NULL.
@@ -622,6 +530,100 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
data->set.postfieldsize = bigsize;
break;
+#endif
+#ifndef CURL_DISABLE_HTTP
+ case CURLOPT_AUTOREFERER:
+ /*
+ * Switch on automatic referer that gets set if curl follows locations.
+ */
+ data->set.http_auto_referer = (0 != va_arg(param, long)) ? TRUE : FALSE;
+ break;
+
+ case CURLOPT_ACCEPT_ENCODING:
+ /*
+ * String to use at the value of Accept-Encoding header.
+ *
+ * If the encoding is set to "" we use an Accept-Encoding header that
+ * encompasses all the encodings we support.
+ * If the encoding is set to NULL we don't send an Accept-Encoding header
+ * and ignore an received Content-Encoding header.
+ *
+ */
+ argptr = va_arg(param, char *);
+ if(argptr && !*argptr) {
+ argptr = Curl_all_content_encodings();
+ if(!argptr)
+ result = CURLE_OUT_OF_MEMORY;
+ else {
+ result = Curl_setstropt(&data->set.str[STRING_ENCODING], argptr);
+ free(argptr);
+ }
+ }
+ else
+ result = Curl_setstropt(&data->set.str[STRING_ENCODING], argptr);
+ break;
+
+ case CURLOPT_TRANSFER_ENCODING:
+ data->set.http_transfer_encoding = (0 != va_arg(param, long)) ?
+ TRUE : FALSE;
+ break;
+
+ case CURLOPT_FOLLOWLOCATION:
+ /*
+ * Follow Location: header hints on a HTTP-server.
+ */
+ data->set.http_follow_location = (0 != va_arg(param, long)) ? TRUE : FALSE;
+ break;
+
+ case CURLOPT_UNRESTRICTED_AUTH:
+ /*
+ * Send authentication (user+password) when following locations, even when
+ * hostname changed.
+ */
+ data->set.allow_auth_to_other_hosts =
+ (0 != va_arg(param, long)) ? TRUE : FALSE;
+ break;
+
+ case CURLOPT_MAXREDIRS:
+ /*
+ * The maximum amount of hops you allow curl to follow Location:
+ * headers. This should mostly be used to detect never-ending loops.
+ */
+ arg = va_arg(param, long);
+ if(arg < -1)
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ data->set.maxredirs = arg;
+ break;
+
+ case CURLOPT_POSTREDIR:
+ /*
+ * Set the behaviour of POST when redirecting
+ * CURL_REDIR_GET_ALL - POST is changed to GET after 301 and 302
+ * CURL_REDIR_POST_301 - POST is kept as POST after 301
+ * CURL_REDIR_POST_302 - POST is kept as POST after 302
+ * CURL_REDIR_POST_303 - POST is kept as POST after 303
+ * CURL_REDIR_POST_ALL - POST is kept as POST after 301, 302 and 303
+ * other - POST is kept as POST after 301 and 302
+ */
+ arg = va_arg(param, long);
+ if(arg < CURL_REDIR_GET_ALL)
+ /* no return error on too high numbers since the bitmask could be
+ extended in a future */
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ data->set.keep_post = arg & CURL_REDIR_POST_ALL;
+ break;
+
+ case CURLOPT_POST:
+ /* Does this option serve a purpose anymore? Yes it does, when
+ CURLOPT_POSTFIELDS isn't used and the POST data is read off the
+ callback! */
+ if(va_arg(param, long)) {
+ data->set.method = HTTPREQ_POST;
+ data->set.opt_no_body = FALSE; /* this is implied */
+ }
+ else
+ data->set.method = HTTPREQ_GET;
+ break;
case CURLOPT_HTTPPOST:
/*
@@ -720,6 +722,9 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
argptr = (char *)va_arg(param, void *);
if(argptr) {
struct curl_slist *cl;
+ /* general protection against mistakes and abuse */
+ if(strlen(argptr) > CURL_MAX_INPUT_LENGTH)
+ return CURLE_BAD_FUNCTION_ARGUMENT;
/* append the cookie file name to the list of file names, and deal with
them later */
cl = curl_slist_append(data->change.cookielist, argptr);
@@ -804,6 +809,9 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
/* if cookie engine was not running, activate it */
data->cookies = Curl_cookie_init(data, NULL, NULL, TRUE);
+ /* general protection against mistakes and abuse */
+ if(strlen(argptr) > CURL_MAX_INPUT_LENGTH)
+ return CURLE_BAD_FUNCTION_ARGUMENT;
argptr = strdup(argptr);
if(!argptr || !data->cookies) {
result = CURLE_OUT_OF_MEMORY;
@@ -1069,7 +1077,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
break;
default:
/* reserve other values for future use */
- result = CURLE_UNKNOWN_OPTION;
+ result = CURLE_BAD_FUNCTION_ARGUMENT;
break;
}
break;
@@ -1222,21 +1230,13 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
* An FTP/SFTP option that modifies an upload to create missing
* directories on the server.
*/
- switch(va_arg(param, long)) {
- case 0:
- data->set.ftp_create_missing_dirs = 0;
- break;
- case 1:
- data->set.ftp_create_missing_dirs = 1;
- break;
- case 2:
- data->set.ftp_create_missing_dirs = 2;
- break;
- default:
- /* reserve other values for future use */
- result = CURLE_UNKNOWN_OPTION;
- break;
- }
+ arg = va_arg(param, long);
+ /* reserve other values for future use */
+ if((arg < CURLFTP_CREATE_DIR_NONE) ||
+ (arg > CURLFTP_CREATE_DIR_RETRY))
+ result = CURLE_BAD_FUNCTION_ARGUMENT;
+ else
+ data->set.ftp_create_missing_dirs = (int)arg;
break;
case CURLOPT_READDATA:
/*
@@ -2075,6 +2075,9 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
* The application kindly asks for a differently sized receive buffer.
* If it seems reasonable, we'll use it.
*/
+ if(data->state.buffer)
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+
arg = va_arg(param, long);
if(arg > READBUFFER_MAX)
@@ -2084,18 +2087,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
else if(arg < READBUFFER_MIN)
arg = READBUFFER_MIN;
- /* Resize if new size */
- if((arg != data->set.buffer_size) && data->state.buffer) {
- char *newbuff = realloc(data->state.buffer, arg + 1);
- if(!newbuff) {
- DEBUGF(fprintf(stderr, "Error: realloc of buffer failed\n"));
- result = CURLE_OUT_OF_MEMORY;
- }
- else
- data->state.buffer = newbuff;
- }
data->set.buffer_size = arg;
-
break;
case CURLOPT_UPLOAD_BUFFERSIZE:
@@ -2243,6 +2235,14 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
break;
#endif
+ case CURLOPT_SSL_EC_CURVES:
+ /*
+ * Set accepted curves in SSL connection setup.
+ * Specify colon-delimited list of curve algorithm names.
+ */
+ result = Curl_setstropt(&data->set.str[STRING_SSL_EC_CURVES],
+ va_arg(param, char *));
+ break;
#endif
case CURLOPT_IPRESOLVE:
arg = va_arg(param, long);
@@ -2513,9 +2513,9 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
* Set the RTSP request method (OPTIONS, SETUP, PLAY, etc...)
* Would this be better if the RTSPREQ_* were just moved into here?
*/
- long curl_rtspreq = va_arg(param, long);
+ long in_rtspreq = va_arg(param, long);
Curl_RtspReq rtspreq = RTSPREQ_NONE;
- switch(curl_rtspreq) {
+ switch(in_rtspreq) {
case CURL_RTSPREQ_OPTIONS:
rtspreq = RTSPREQ_OPTIONS;
break;
diff --git a/lib/setup-win32.h b/lib/setup-win32.h
index 45b58476..d20662aa 100644
--- a/lib/setup-win32.h
+++ b/lib/setup-win32.h
@@ -60,7 +60,6 @@
/*
* Define USE_WINSOCK to 2 if we have and use WINSOCK2 API, else
- * define USE_WINSOCK to 1 if we have and use WINSOCK API, else
* undefine USE_WINSOCK.
*/
@@ -70,7 +69,7 @@
# define USE_WINSOCK 2
#else
# ifdef HAVE_WINSOCK_H
-# define USE_WINSOCK 1
+# error "WinSock version 1 is no longer supported, version 2 is required!"
# endif
#endif
diff --git a/lib/share.c b/lib/share.c
index a2d89604..407ac345 100644
--- a/lib/share.c
+++ b/lib/share.c
@@ -92,7 +92,7 @@ curl_share_setopt(struct Curl_share *share, CURLSHoption option, ...)
if(!share->sslsession) {
share->max_ssl_sessions = 8;
share->sslsession = calloc(share->max_ssl_sessions,
- sizeof(struct curl_ssl_session));
+ sizeof(struct Curl_ssl_session));
share->sessionage = 0;
if(!share->sslsession)
res = CURLSHE_NOMEM;
diff --git a/lib/share.h b/lib/share.h
index a7dea41a..aa964b6c 100644
--- a/lib/share.h
+++ b/lib/share.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -46,7 +46,7 @@ struct Curl_share {
curl_unlock_function unlockfunc;
void *clientdata;
struct conncache conn_cache;
- struct curl_hash hostcache;
+ struct Curl_hash hostcache;
#if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_COOKIES)
struct CookieInfo *cookies;
#endif
@@ -54,7 +54,7 @@ struct Curl_share {
struct PslCache psl;
#endif
- struct curl_ssl_session *sslsession;
+ struct Curl_ssl_session *sslsession;
size_t max_ssl_sessions;
long sessionage;
};
diff --git a/lib/smb.c b/lib/smb.c
index d493adcc..41d97b84 100644
--- a/lib/smb.c
+++ b/lib/smb.c
@@ -23,11 +23,9 @@
#include "curl_setup.h"
-#if !defined(CURL_DISABLE_SMB) && defined(USE_NTLM) && \
+#if !defined(CURL_DISABLE_SMB) && defined(USE_CURL_NTLM_CORE) && \
(CURL_SIZEOF_CURL_OFF_T > 4)
-#if !defined(USE_WINDOWS_SSPI) || defined(USE_WIN32_CRYPTO)
-
#define BUILDING_CURL_SMB_C
#ifdef HAVE_PROCESS_H
@@ -88,6 +86,7 @@ const struct Curl_handler Curl_handler_smb = {
ZERO_NULL, /* connection_check */
PORT_SMB, /* defport */
CURLPROTO_SMB, /* protocol */
+ CURLPROTO_SMB, /* family */
PROTOPT_NONE /* flags */
};
@@ -113,6 +112,7 @@ const struct Curl_handler Curl_handler_smbs = {
ZERO_NULL, /* connection_check */
PORT_SMBS, /* defport */
CURLPROTO_SMBS, /* protocol */
+ CURLPROTO_SMB, /* family */
PROTOPT_SSL /* flags */
};
#endif
@@ -996,6 +996,5 @@ static CURLcode smb_parse_url_path(struct connectdata *conn)
return CURLE_OK;
}
-#endif /* !USE_WINDOWS_SSPI || USE_WIN32_CRYPTO */
-
-#endif /* CURL_DISABLE_SMB && USE_NTLM && CURL_SIZEOF_CURL_OFF_T > 4 */
+#endif /* CURL_DISABLE_SMB && USE_CURL_NTLM_CORE &&
+ CURL_SIZEOF_CURL_OFF_T > 4 */
diff --git a/lib/smb.h b/lib/smb.h
index 136a89ce..ff0a354b 100644
--- a/lib/smb.h
+++ b/lib/smb.h
@@ -243,16 +243,13 @@ struct smb_tree_disconnect {
#endif /* BUILDING_CURL_SMB_C */
-#if !defined(CURL_DISABLE_SMB) && defined(USE_NTLM) && \
+#if !defined(CURL_DISABLE_SMB) && defined(USE_CURL_NTLM_CORE) && \
(CURL_SIZEOF_CURL_OFF_T > 4)
-#if !defined(USE_WINDOWS_SSPI) || defined(USE_WIN32_CRYPTO)
-
extern const struct Curl_handler Curl_handler_smb;
extern const struct Curl_handler Curl_handler_smbs;
-#endif /* !USE_WINDOWS_SSPI || USE_WIN32_CRYPTO */
-
-#endif /* CURL_DISABLE_SMB && USE_NTLM && CURL_SIZEOF_CURL_OFF_T > 4 */
+#endif /* CURL_DISABLE_SMB && USE_CURL_NTLM_CORE &&
+ CURL_SIZEOF_CURL_OFF_T > 4 */
#endif /* HEADER_CURL_SMB_H */
diff --git a/lib/smtp.c b/lib/smtp.c
index aea41bb4..49743c03 100644
--- a/lib/smtp.c
+++ b/lib/smtp.c
@@ -133,6 +133,7 @@ const struct Curl_handler Curl_handler_smtp = {
ZERO_NULL, /* connection_check */
PORT_SMTP, /* defport */
CURLPROTO_SMTP, /* protocol */
+ CURLPROTO_SMTP, /* family */
PROTOPT_CLOSEACTION | PROTOPT_NOURLQUERY | /* flags */
PROTOPT_URLOPTIONS
};
@@ -160,6 +161,7 @@ const struct Curl_handler Curl_handler_smtps = {
ZERO_NULL, /* connection_check */
PORT_SMTPS, /* defport */
CURLPROTO_SMTPS, /* protocol */
+ CURLPROTO_SMTP, /* family */
PROTOPT_CLOSEACTION | PROTOPT_SSL
| PROTOPT_NOURLQUERY | PROTOPT_URLOPTIONS /* flags */
};
@@ -1322,6 +1324,7 @@ static CURLcode smtp_connect(struct connectdata *conn, bool *done)
Curl_sasl_init(&smtpc->sasl, &saslsmtp);
/* Initialise the pingpong layer */
+ Curl_pp_setup(pp);
Curl_pp_init(pp);
/* Parse the URL options */
diff --git a/lib/socketpair.c b/lib/socketpair.c
index 1ec0d75a..9e1f9ef4 100644
--- a/lib/socketpair.c
+++ b/lib/socketpair.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2019 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -23,7 +23,7 @@
#include "curl_setup.h"
#include "socketpair.h"
-#ifndef HAVE_SOCKETPAIR
+#if !defined(HAVE_SOCKETPAIR) && !defined(CURL_DISABLE_SOCKETPAIR)
#ifdef WIN32
/*
* This is a socketpair() implementation for Windows.
diff --git a/lib/socks.c b/lib/socks.c
index 44783d01..a41b67d5 100644
--- a/lib/socks.c
+++ b/lib/socks.c
@@ -184,12 +184,12 @@ int Curl_SOCKS_getsock(struct connectdata *conn, curl_socket_t *sock,
* Set protocol4a=true for "SOCKS 4A (Simple Extension to SOCKS 4 Protocol)"
* Nonsupport "Identification Protocol (RFC1413)"
*/
-CURLcode Curl_SOCKS4(const char *proxy_user,
- const char *hostname,
- int remote_port,
- int sockindex,
- struct connectdata *conn,
- bool *done)
+CURLproxycode Curl_SOCKS4(const char *proxy_user,
+ const char *hostname,
+ int remote_port,
+ int sockindex,
+ struct connectdata *conn,
+ bool *done)
{
const bool protocol4a =
(conn->socks_proxy.proxytype == CURLPROXY_SOCKS4A) ? TRUE : FALSE;
@@ -237,11 +237,11 @@ CURLcode Curl_SOCKS4(const char *proxy_user,
Curl_resolv(conn, hostname, remote_port, FALSE, &dns);
if(rc == CURLRESOLV_ERROR)
- return CURLE_COULDNT_RESOLVE_PROXY;
+ return CURLPX_RESOLVE_HOST;
else if(rc == CURLRESOLV_PENDING) {
sxstate(conn, CONNECT_RESOLVING);
infof(data, "SOCKS4 non-blocking resolve of %s\n", hostname);
- return CURLE_OK;
+ return CURLPX_OK;
}
sxstate(conn, CONNECT_RESOLVED);
goto CONNECT_RESOLVED;
@@ -265,8 +265,11 @@ CURLcode Curl_SOCKS4(const char *proxy_user,
}
else {
result = Curl_resolv_check(data->conn, &dns);
- if(!dns)
- return result;
+ if(!dns) {
+ if(result)
+ return CURLPX_RESOLVE_HOST;
+ return CURLPX_OK;
+ }
}
/* FALLTHROUGH */
CONNECT_RESOLVED:
@@ -303,7 +306,7 @@ CURLcode Curl_SOCKS4(const char *proxy_user,
if(!hp) {
failf(data, "Failed to resolve \"%s\" for SOCKS4 connect.",
hostname);
- return CURLE_COULDNT_RESOLVE_HOST;
+ return CURLPX_RESOLVE_HOST;
}
}
/* FALLTHROUGH */
@@ -316,8 +319,8 @@ CURLcode Curl_SOCKS4(const char *proxy_user,
if(proxy_user) {
size_t plen = strlen(proxy_user);
if(plen >= sizeof(sx->socksreq) - 8) {
- failf(data, "Too long SOCKS proxy name, can't use!\n");
- return CURLE_COULDNT_CONNECT;
+ failf(data, "Too long SOCKS proxy user name, can't use!\n");
+ return CURLPX_LONG_USER;
}
/* copy the proxy name WITH trailing zero */
memcpy(socksreq + 8, proxy_user, plen + 1);
@@ -343,7 +346,7 @@ CURLcode Curl_SOCKS4(const char *proxy_user,
strcpy((char *)socksreq + packetsize, hostname);
else {
failf(data, "SOCKS4: too long host name");
- return CURLE_COULDNT_CONNECT;
+ return CURLPX_LONG_HOSTNAME;
}
packetsize += hostnamelen;
}
@@ -358,13 +361,13 @@ CURLcode Curl_SOCKS4(const char *proxy_user,
sx->outstanding, &written);
if(result && (CURLE_AGAIN != result)) {
failf(data, "Failed to send SOCKS4 connect request.");
- return CURLE_COULDNT_CONNECT;
+ return CURLPX_SEND_CONNECT;
}
if(written != sx->outstanding) {
/* not done, remain in state */
sx->outstanding -= written;
sx->outp += written;
- return CURLE_OK;
+ return CURLPX_OK;
}
/* done sending! */
@@ -380,18 +383,18 @@ CURLcode Curl_SOCKS4(const char *proxy_user,
if(result && (CURLE_AGAIN != result)) {
failf(data, "SOCKS4: Failed receiving connect request ack: %s",
curl_easy_strerror(result));
- return CURLE_COULDNT_CONNECT;
+ return CURLPX_RECV_CONNECT;
}
else if(!result && !actualread) {
/* connection closed */
failf(data, "connection to proxy closed");
- return CURLE_COULDNT_CONNECT;
+ return CURLPX_CLOSED;
}
else if(actualread != sx->outstanding) {
/* remain in reading state */
sx->outstanding -= actualread;
sx->outp += actualread;
- return CURLE_OK;
+ return CURLPX_OK;
}
sxstate(conn, CONNECT_DONE);
break;
@@ -422,7 +425,7 @@ CURLcode Curl_SOCKS4(const char *proxy_user,
if(socksreq[0] != 0) {
failf(data,
"SOCKS4 reply has wrong version, version should be 0.");
- return CURLE_COULDNT_CONNECT;
+ return CURLPX_BAD_VERSION;
}
/* Result */
@@ -438,7 +441,7 @@ CURLcode Curl_SOCKS4(const char *proxy_user,
(unsigned char)socksreq[6], (unsigned char)socksreq[7],
(((unsigned char)socksreq[2] << 8) | (unsigned char)socksreq[3]),
(unsigned char)socksreq[1]);
- return CURLE_COULDNT_CONNECT;
+ return CURLPX_REQUEST_FAILED;
case 92:
failf(data,
"Can't complete SOCKS4 connection to %d.%d.%d.%d:%d. (%d)"
@@ -448,7 +451,7 @@ CURLcode Curl_SOCKS4(const char *proxy_user,
(unsigned char)socksreq[6], (unsigned char)socksreq[7],
(((unsigned char)socksreq[2] << 8) | (unsigned char)socksreq[3]),
(unsigned char)socksreq[1]);
- return CURLE_COULDNT_CONNECT;
+ return CURLPX_IDENTD;
case 93:
failf(data,
"Can't complete SOCKS4 connection to %d.%d.%d.%d:%d. (%d)"
@@ -458,7 +461,7 @@ CURLcode Curl_SOCKS4(const char *proxy_user,
(unsigned char)socksreq[6], (unsigned char)socksreq[7],
(((unsigned char)socksreq[2] << 8) | (unsigned char)socksreq[3]),
(unsigned char)socksreq[1]);
- return CURLE_COULDNT_CONNECT;
+ return CURLPX_IDENTD_DIFFER;
default:
failf(data,
"Can't complete SOCKS4 connection to %d.%d.%d.%d:%d. (%d)"
@@ -467,24 +470,24 @@ CURLcode Curl_SOCKS4(const char *proxy_user,
(unsigned char)socksreq[6], (unsigned char)socksreq[7],
(((unsigned char)socksreq[2] << 8) | (unsigned char)socksreq[3]),
(unsigned char)socksreq[1]);
- return CURLE_COULDNT_CONNECT;
+ return CURLPX_UNKNOWN_FAIL;
}
*done = TRUE;
- return CURLE_OK; /* Proxy was successful! */
+ return CURLPX_OK; /* Proxy was successful! */
}
/*
* This function logs in to a SOCKS5 proxy and sends the specifics to the final
* destination server.
*/
-CURLcode Curl_SOCKS5(const char *proxy_user,
- const char *proxy_password,
- const char *hostname,
- int remote_port,
- int sockindex,
- struct connectdata *conn,
- bool *done)
+CURLproxycode Curl_SOCKS5(const char *proxy_user,
+ const char *proxy_password,
+ const char *hostname,
+ int remote_port,
+ int sockindex,
+ struct connectdata *conn,
+ bool *done)
{
/*
According to the RFC1928, section "6. Replies". This is what a SOCK5
@@ -561,13 +564,13 @@ CURLcode Curl_SOCKS5(const char *proxy_user,
result = Curl_write_plain(conn, sockfd, (char *)socksreq, idx, &written);
if(result && (CURLE_AGAIN != result)) {
failf(data, "Unable to send initial SOCKS5 request.");
- return CURLE_COULDNT_CONNECT;
+ return CURLPX_SEND_CONNECT;
}
if(written != idx) {
sxstate(conn, CONNECT_SOCKS_SEND);
sx->outstanding = idx - written;
sx->outp = &socksreq[written];
- return CURLE_OK;
+ return CURLPX_OK;
}
sxstate(conn, CONNECT_SOCKS_READ);
goto CONNECT_SOCKS_READ_INIT;
@@ -576,13 +579,13 @@ CURLcode Curl_SOCKS5(const char *proxy_user,
sx->outstanding, &written);
if(result && (CURLE_AGAIN != result)) {
failf(data, "Unable to send initial SOCKS5 request.");
- return CURLE_COULDNT_CONNECT;
+ return CURLPX_SEND_CONNECT;
}
if(written != sx->outstanding) {
/* not done, remain in state */
sx->outstanding -= written;
sx->outp += written;
- return CURLE_OK;
+ return CURLPX_OK;
}
/* FALLTHROUGH */
CONNECT_SOCKS_READ_INIT:
@@ -595,22 +598,22 @@ CURLcode Curl_SOCKS5(const char *proxy_user,
sx->outstanding, &actualread);
if(result && (CURLE_AGAIN != result)) {
failf(data, "Unable to receive initial SOCKS5 response.");
- return CURLE_COULDNT_CONNECT;
+ return CURLPX_RECV_CONNECT;
}
else if(!result && !actualread) {
/* connection closed */
failf(data, "Connection to proxy closed");
- return CURLE_COULDNT_CONNECT;
+ return CURLPX_CLOSED;
}
else if(actualread != sx->outstanding) {
/* remain in reading state */
sx->outstanding -= actualread;
sx->outp += actualread;
- return CURLE_OK;
+ return CURLPX_OK;
}
else if(socksreq[0] != 5) {
failf(data, "Received invalid version in initial SOCKS5 response.");
- return CURLE_COULDNT_CONNECT;
+ return CURLPX_BAD_VERSION;
}
else if(socksreq[1] == 0) {
/* DONE! No authentication needed. Send request. */
@@ -628,7 +631,7 @@ CURLcode Curl_SOCKS5(const char *proxy_user,
result = Curl_SOCKS5_gssapi_negotiate(sockindex, conn);
if(result) {
failf(data, "Unable to negotiate SOCKS5 GSS-API context.");
- return CURLE_COULDNT_CONNECT;
+ return CURLPX_GSSAPI;
}
}
#endif
@@ -637,16 +640,16 @@ CURLcode Curl_SOCKS5(const char *proxy_user,
if(!allow_gssapi && (socksreq[1] == 1)) {
failf(data,
"SOCKS5 GSSAPI per-message authentication is not supported.");
- return CURLE_COULDNT_CONNECT;
+ return CURLPX_GSSAPI_PERMSG;
}
else if(socksreq[1] == 255) {
failf(data, "No authentication method was acceptable.");
- return CURLE_COULDNT_CONNECT;
+ return CURLPX_NO_AUTH;
}
}
failf(data,
"Undocumented SOCKS5 mode attempted to be used by server.");
- return CURLE_COULDNT_CONNECT;
+ return CURLPX_UNKNOWN_MODE;
#if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI)
case CONNECT_GSSAPI_INIT:
/* GSSAPI stuff done non-blocking */
@@ -683,7 +686,7 @@ CURLcode Curl_SOCKS5(const char *proxy_user,
/* the length must fit in a single byte */
if(proxy_user_len >= 255) {
failf(data, "Excessive user name length for proxy auth");
- return CURLE_BAD_FUNCTION_ARGUMENT;
+ return CURLPX_LONG_USER;
}
memcpy(socksreq + len, proxy_user, proxy_user_len);
}
@@ -693,7 +696,7 @@ CURLcode Curl_SOCKS5(const char *proxy_user,
/* the length must fit in a single byte */
if(proxy_password_len > 255) {
failf(data, "Excessive password length for proxy auth");
- return CURLE_BAD_FUNCTION_ARGUMENT;
+ return CURLPX_LONG_PASSWD;
}
memcpy(socksreq + len, proxy_password, proxy_password_len);
}
@@ -708,13 +711,13 @@ CURLcode Curl_SOCKS5(const char *proxy_user,
sx->outstanding, &written);
if(result && (CURLE_AGAIN != result)) {
failf(data, "Failed to send SOCKS5 sub-negotiation request.");
- return CURLE_COULDNT_CONNECT;
+ return CURLPX_SEND_AUTH;
}
if(sx->outstanding != written) {
/* remain in state */
sx->outstanding -= written;
sx->outp += written;
- return CURLE_OK;
+ return CURLPX_OK;
}
sx->outp = socksreq;
sx->outstanding = 2;
@@ -725,24 +728,24 @@ CURLcode Curl_SOCKS5(const char *proxy_user,
sx->outstanding, &actualread);
if(result && (CURLE_AGAIN != result)) {
failf(data, "Unable to receive SOCKS5 sub-negotiation response.");
- return CURLE_COULDNT_CONNECT;
+ return CURLPX_RECV_AUTH;
}
else if(!result && !actualread) {
/* connection closed */
failf(data, "connection to proxy closed");
- return CURLE_COULDNT_CONNECT;
+ return CURLPX_CLOSED;
}
else if(actualread != sx->outstanding) {
/* remain in state */
sx->outstanding -= actualread;
sx->outp += actualread;
- return CURLE_OK;
+ return CURLPX_OK;
}
/* ignore the first (VER) byte */
else if(socksreq[1] != 0) { /* status */
failf(data, "User was rejected by the SOCKS5 server (%d %d).",
socksreq[0], socksreq[1]);
- return CURLE_COULDNT_CONNECT;
+ return CURLPX_USER_REJECTED;
}
/* Everything is good so far, user was authenticated! */
@@ -755,11 +758,11 @@ CURLcode Curl_SOCKS5(const char *proxy_user,
FALSE, &dns);
if(rc == CURLRESOLV_ERROR)
- return CURLE_COULDNT_RESOLVE_HOST;
+ return CURLPX_RESOLVE_HOST;
if(rc == CURLRESOLV_PENDING) {
sxstate(conn, CONNECT_RESOLVING);
- return CURLE_OK;
+ return CURLPX_OK;
}
sxstate(conn, CONNECT_RESOLVED);
goto CONNECT_RESOLVED;
@@ -780,8 +783,11 @@ CURLcode Curl_SOCKS5(const char *proxy_user,
if(!dns) {
result = Curl_resolv_check(data->conn, &dns);
- if(!dns)
- return result;
+ if(!dns) {
+ if(result)
+ return CURLPX_RESOLVE_HOST;
+ return CURLPX_OK;
+ }
}
/* FALLTHROUGH */
CONNECT_RESOLVED:
@@ -793,7 +799,7 @@ CURLcode Curl_SOCKS5(const char *proxy_user,
if(!hp) {
failf(data, "Failed to resolve \"%s\" for SOCKS5 connect.",
hostname);
- return CURLE_COULDNT_RESOLVE_HOST;
+ return CURLPX_RESOLVE_HOST;
}
Curl_printable_address(hp, dest, sizeof(dest));
@@ -867,7 +873,7 @@ CURLcode Curl_SOCKS5(const char *proxy_user,
#if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI)
if(conn->socks5_gssapi_enctype) {
failf(data, "SOCKS5 GSS-API protection not yet implemented.");
- return CURLE_COULDNT_CONNECT;
+ return CURLPX_GSSAPI_PROTECTION;
}
#endif
sx->outp = socksreq;
@@ -879,18 +885,18 @@ CURLcode Curl_SOCKS5(const char *proxy_user,
sx->outstanding, &written);
if(result && (CURLE_AGAIN != result)) {
failf(data, "Failed to send SOCKS5 connect request.");
- return CURLE_COULDNT_CONNECT;
+ return CURLPX_SEND_REQUEST;
}
if(sx->outstanding != written) {
/* remain in state */
sx->outstanding -= written;
sx->outp += written;
- return CURLE_OK;
+ return CURLPX_OK;
}
#if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI)
if(conn->socks5_gssapi_enctype) {
failf(data, "SOCKS5 GSS-API protection not yet implemented.");
- return CURLE_COULDNT_CONNECT;
+ return CURLPX_GSSAPI_PROTECTION;
}
#endif
sx->outstanding = 10; /* minimum packet size is 10 */
@@ -902,29 +908,46 @@ CURLcode Curl_SOCKS5(const char *proxy_user,
sx->outstanding, &actualread);
if(result && (CURLE_AGAIN != result)) {
failf(data, "Failed to receive SOCKS5 connect request ack.");
- return CURLE_COULDNT_CONNECT;
+ return CURLPX_RECV_REQACK;
}
else if(!result && !actualread) {
/* connection closed */
failf(data, "connection to proxy closed");
- return CURLE_COULDNT_CONNECT;
+ return CURLPX_CLOSED;
}
else if(actualread != sx->outstanding) {
/* remain in state */
sx->outstanding -= actualread;
sx->outp += actualread;
- return CURLE_OK;
+ return CURLPX_OK;
}
if(socksreq[0] != 5) { /* version */
failf(data,
"SOCKS5 reply has wrong version, version should be 5.");
- return CURLE_COULDNT_CONNECT;
+ return CURLPX_BAD_VERSION;
}
else if(socksreq[1] != 0) { /* Anything besides 0 is an error */
+ CURLproxycode rc = CURLPX_REPLY_UNASSIGNED;
+ int code = socksreq[1];
failf(data, "Can't complete SOCKS5 connection to %s. (%d)",
hostname, (unsigned char)socksreq[1]);
- return CURLE_COULDNT_CONNECT;
+ if(code < 9) {
+ /* RFC 1928 section 6 lists: */
+ static const CURLproxycode lookup[] = {
+ CURLPX_OK,
+ CURLPX_REPLY_GENERAL_SERVER_FAILURE,
+ CURLPX_REPLY_NOT_ALLOWED,
+ CURLPX_REPLY_NETWORK_UNREACHABLE,
+ CURLPX_REPLY_HOST_UNREACHABLE,
+ CURLPX_REPLY_CONNECTION_REFUSED,
+ CURLPX_REPLY_TTL_EXPIRED,
+ CURLPX_REPLY_COMMAND_NOT_SUPPORTED,
+ CURLPX_REPLY_ADDRESS_TYPE_NOT_SUPPORTED,
+ };
+ rc = lookup[code];
+ }
+ return rc;
}
/* Fix: in general, returned BND.ADDR is variable length parameter by RFC
@@ -958,7 +981,7 @@ CURLcode Curl_SOCKS5(const char *proxy_user,
}
else {
failf(data, "SOCKS5 reply has wrong address type.");
- return CURLE_COULDNT_CONNECT;
+ return CURLPX_BAD_ADDRESS_TYPE;
}
/* At this point we already read first 10 bytes */
@@ -984,25 +1007,25 @@ CURLcode Curl_SOCKS5(const char *proxy_user,
sx->outstanding, &actualread);
if(result && (CURLE_AGAIN != result)) {
failf(data, "Failed to receive SOCKS5 connect request ack.");
- return CURLE_COULDNT_CONNECT;
+ return CURLPX_RECV_ADDRESS;
}
else if(!result && !actualread) {
/* connection closed */
failf(data, "connection to proxy closed");
- return CURLE_COULDNT_CONNECT;
+ return CURLPX_CLOSED;
}
else if(actualread != sx->outstanding) {
/* remain in state */
sx->outstanding -= actualread;
sx->outp += actualread;
- return CURLE_OK;
+ return CURLPX_OK;
}
sxstate(conn, CONNECT_DONE);
}
infof(data, "SOCKS5 request granted.\n");
*done = TRUE;
- return CURLE_OK; /* Proxy was successful! */
+ return CURLPX_OK; /* Proxy was successful! */
}
#endif /* CURL_DISABLE_PROXY */
diff --git a/lib/socks.h b/lib/socks.h
index 64a75633..17e6f461 100644
--- a/lib/socks.h
+++ b/lib/socks.h
@@ -48,24 +48,24 @@ int Curl_SOCKS_getsock(struct connectdata *conn,
* This function logs in to a SOCKS4(a) proxy and sends the specifics to the
* final destination server.
*/
-CURLcode Curl_SOCKS4(const char *proxy_name,
- const char *hostname,
- int remote_port,
- int sockindex,
- struct connectdata *conn,
- bool *done);
+CURLproxycode Curl_SOCKS4(const char *proxy_name,
+ const char *hostname,
+ int remote_port,
+ int sockindex,
+ struct connectdata *conn,
+ bool *done);
/*
* This function logs in to a SOCKS5 proxy and sends the specifics to the
* final destination server.
*/
-CURLcode Curl_SOCKS5(const char *proxy_name,
- const char *proxy_password,
- const char *hostname,
- int remote_port,
- int sockindex,
- struct connectdata *conn,
- bool *done);
+CURLproxycode Curl_SOCKS5(const char *proxy_name,
+ const char *proxy_password,
+ const char *hostname,
+ int remote_port,
+ int sockindex,
+ struct connectdata *conn,
+ bool *done);
#if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI)
/*
diff --git a/lib/strerror.c b/lib/strerror.c
index 015e588c..b5808df2 100644
--- a/lib/strerror.c
+++ b/lib/strerror.c
@@ -320,6 +320,9 @@ curl_easy_strerror(CURLcode error)
case CURLE_QUIC_CONNECT_ERROR:
return "QUIC connection error";
+ case CURLE_PROXY:
+ return "proxy handshake error";
+
/* error codes not used by current libcurl */
case CURLE_OBSOLETE20:
case CURLE_OBSOLETE24:
@@ -652,34 +655,27 @@ static const char *
get_winapi_error(int err, char *buf, size_t buflen)
{
char *p;
+ wchar_t wbuf[256];
if(!buflen)
return NULL;
*buf = '\0';
-
-#ifdef _WIN32_WCE
- {
- wchar_t wbuf[256];
- wbuf[0] = L'\0';
-
- if(FormatMessage((FORMAT_MESSAGE_FROM_SYSTEM |
- FORMAT_MESSAGE_IGNORE_INSERTS), NULL, err,
- LANG_NEUTRAL, wbuf, sizeof(wbuf)/sizeof(wchar_t), NULL)) {
- size_t written = wcstombs(buf, wbuf, buflen - 1);
- if(written != (size_t)-1)
- buf[written] = '\0';
- else
- *buf = '\0';
- }
- }
-#else
- if(!FormatMessageA((FORMAT_MESSAGE_FROM_SYSTEM |
- FORMAT_MESSAGE_IGNORE_INSERTS), NULL, err,
- LANG_NEUTRAL, buf, (DWORD)buflen, NULL)) {
- *buf = '\0';
+ *wbuf = L'\0';
+
+ /* We return the local codepage version of the error string because if it is
+ output to the user's terminal it will likely be with functions which
+ expect the local codepage (eg fprintf, failf, infof).
+ FormatMessageW -> wcstombs is used for Windows CE compatibility. */
+ if(FormatMessageW((FORMAT_MESSAGE_FROM_SYSTEM |
+ FORMAT_MESSAGE_IGNORE_INSERTS), NULL, err,
+ LANG_NEUTRAL, wbuf, sizeof(wbuf)/sizeof(wchar_t), NULL)) {
+ size_t written = wcstombs(buf, wbuf, buflen - 1);
+ if(written != (size_t)-1)
+ buf[written] = '\0';
+ else
+ *buf = '\0';
}
-#endif
/* Truncate multiple lines */
p = strchr(buf, '\n');
diff --git a/lib/system_win32.c b/lib/system_win32.c
index 2e59e032..9b0797bf 100644
--- a/lib/system_win32.c
+++ b/lib/system_win32.c
@@ -55,12 +55,7 @@ CURLcode Curl_win32_init(long flags)
WSADATA wsaData;
int res;
-#if defined(ENABLE_IPV6) && (USE_WINSOCK < 2)
-#error IPV6_requires_winsock2
-#endif
-
- wVersionRequested = MAKEWORD(USE_WINSOCK, USE_WINSOCK);
-
+ wVersionRequested = MAKEWORD(2, 2);
res = WSAStartup(wVersionRequested, &wsaData);
if(res != 0)
@@ -83,9 +78,9 @@ CURLcode Curl_win32_init(long flags)
return CURLE_FAILED_INIT;
}
/* The Windows Sockets DLL is acceptable. Proceed. */
- #elif defined(USE_LWIPSOCK)
+#elif defined(USE_LWIPSOCK)
lwip_init();
- #endif
+#endif
} /* CURL_GLOBAL_WIN32 */
#ifdef USE_WINDOWS_SSPI
diff --git a/lib/telnet.c b/lib/telnet.c
index c3b58e54..754febe2 100644
--- a/lib/telnet.c
+++ b/lib/telnet.c
@@ -87,12 +87,6 @@
#define printoption(a,b,c,d) Curl_nop_stmt
#endif
-#ifdef USE_WINSOCK
-typedef WSAEVENT (WINAPI *WSOCK2_EVENT)(void);
-typedef FARPROC WSOCK2_FUNC;
-static CURLcode check_wsock2(struct Curl_easy *data);
-#endif
-
static
CURLcode telrcv(struct connectdata *,
const unsigned char *inbuf, /* Data received from socket */
@@ -194,50 +188,11 @@ const struct Curl_handler Curl_handler_telnet = {
ZERO_NULL, /* connection_check */
PORT_TELNET, /* defport */
CURLPROTO_TELNET, /* protocol */
+ CURLPROTO_TELNET, /* family */
PROTOPT_NONE | PROTOPT_NOURLQUERY /* flags */
};
-#ifdef USE_WINSOCK
-static CURLcode
-check_wsock2(struct Curl_easy *data)
-{
- int err;
- WORD wVersionRequested;
- WSADATA wsaData;
-
- DEBUGASSERT(data);
-
- /* telnet requires at least WinSock 2.0 so ask for it. */
- wVersionRequested = MAKEWORD(2, 0);
-
- err = WSAStartup(wVersionRequested, &wsaData);
-
- /* We must've called this once already, so this call */
- /* should always succeed. But, just in case... */
- if(err != 0) {
- failf(data,"WSAStartup failed (%d)",err);
- return CURLE_FAILED_INIT;
- }
-
- /* We have to have a WSACleanup call for every successful */
- /* WSAStartup call. */
- WSACleanup();
-
- /* Check that our version is supported */
- if(LOBYTE(wsaData.wVersion) != LOBYTE(wVersionRequested) ||
- HIBYTE(wsaData.wVersion) != HIBYTE(wVersionRequested)) {
- /* Our version isn't supported */
- failf(data, "insufficient winsock version to support "
- "telnet");
- return CURLE_FAILED_INIT;
- }
-
- /* Our version is supported */
- return CURLE_OK;
-}
-#endif
-
static
CURLcode init_telnet(struct connectdata *conn)
{
@@ -1301,11 +1256,6 @@ static CURLcode telnet_do(struct connectdata *conn, bool *done)
struct Curl_easy *data = conn->data;
curl_socket_t sockfd = conn->sock[FIRSTSOCKET];
#ifdef USE_WINSOCK
- HMODULE wsock2;
- WSOCK2_FUNC close_event_func;
- WSOCK2_EVENT create_event_func;
- WSOCK2_FUNC event_select_func;
- WSOCK2_FUNC enum_netevents_func;
WSAEVENT event_handle;
WSANETWORKEVENTS events;
HANDLE stdin_handle;
@@ -1340,75 +1290,21 @@ static CURLcode telnet_do(struct connectdata *conn, bool *done)
return result;
#ifdef USE_WINSOCK
- /*
- ** This functionality only works with WinSock >= 2.0. So,
- ** make sure we have it.
- */
- result = check_wsock2(data);
- if(result)
- return result;
-
- /* OK, so we have WinSock 2.0. We need to dynamically */
- /* load ws2_32.dll and get the function pointers we need. */
- wsock2 = Curl_load_library(TEXT("WS2_32.DLL"));
- if(wsock2 == NULL) {
- failf(data, "failed to load WS2_32.DLL (%u)", GetLastError());
- return CURLE_FAILED_INIT;
- }
-
- /* Grab a pointer to WSACreateEvent */
- create_event_func =
- CURLX_FUNCTION_CAST(WSOCK2_EVENT,
- (GetProcAddress(wsock2, "WSACreateEvent")));
- if(create_event_func == NULL) {
- failf(data, "failed to find WSACreateEvent function (%u)", GetLastError());
- FreeLibrary(wsock2);
- return CURLE_FAILED_INIT;
- }
-
- /* And WSACloseEvent */
- close_event_func = GetProcAddress(wsock2, "WSACloseEvent");
- if(close_event_func == NULL) {
- failf(data, "failed to find WSACloseEvent function (%u)", GetLastError());
- FreeLibrary(wsock2);
- return CURLE_FAILED_INIT;
- }
-
- /* And WSAEventSelect */
- event_select_func = GetProcAddress(wsock2, "WSAEventSelect");
- if(event_select_func == NULL) {
- failf(data, "failed to find WSAEventSelect function (%u)", GetLastError());
- FreeLibrary(wsock2);
- return CURLE_FAILED_INIT;
- }
-
- /* And WSAEnumNetworkEvents */
- enum_netevents_func = GetProcAddress(wsock2, "WSAEnumNetworkEvents");
- if(enum_netevents_func == NULL) {
- failf(data, "failed to find WSAEnumNetworkEvents function (%u)",
- GetLastError());
- FreeLibrary(wsock2);
- return CURLE_FAILED_INIT;
- }
-
/* We want to wait for both stdin and the socket. Since
** the select() function in winsock only works on sockets
** we have to use the WaitForMultipleObjects() call.
*/
/* First, create a sockets event object */
- event_handle = (WSAEVENT)create_event_func();
+ event_handle = WSACreateEvent();
if(event_handle == WSA_INVALID_EVENT) {
failf(data, "WSACreateEvent failed (%d)", SOCKERRNO);
- FreeLibrary(wsock2);
return CURLE_FAILED_INIT;
}
/* Tell winsock what events we want to listen to */
- if(event_select_func(sockfd, event_handle, FD_READ|FD_CLOSE) ==
- SOCKET_ERROR) {
- close_event_func(event_handle);
- FreeLibrary(wsock2);
+ if(WSAEventSelect(sockfd, event_handle, FD_READ|FD_CLOSE) == SOCKET_ERROR) {
+ WSACloseEvent(event_handle);
return CURLE_OK;
}
@@ -1439,6 +1335,7 @@ static CURLcode telnet_do(struct connectdata *conn, bool *done)
DWORD waitret = WaitForMultipleObjects(obj_count, objs,
FALSE, wait_timeout);
switch(waitret) {
+
case WAIT_TIMEOUT:
{
for(;;) {
@@ -1508,9 +1405,9 @@ static CURLcode telnet_do(struct connectdata *conn, bool *done)
break;
case WAIT_OBJECT_0:
-
+ {
events.lNetworkEvents = 0;
- if(SOCKET_ERROR == enum_netevents_func(sockfd, event_handle, &events)) {
+ if(WSAEnumNetworkEvents(sockfd, event_handle, &events) == SOCKET_ERROR) {
err = SOCKERRNO;
if(err != EINPROGRESS) {
infof(data, "WSAEnumNetworkEvents failed (%d)", err);
@@ -1554,7 +1451,8 @@ static CURLcode telnet_do(struct connectdata *conn, bool *done)
if(events.lNetworkEvents & FD_CLOSE) {
keepon = FALSE;
}
- break;
+ }
+ break;
}
@@ -1569,19 +1467,9 @@ static CURLcode telnet_do(struct connectdata *conn, bool *done)
}
/* We called WSACreateEvent, so call WSACloseEvent */
- if(!close_event_func(event_handle)) {
+ if(!WSACloseEvent(event_handle)) {
infof(data, "WSACloseEvent failed (%d)", SOCKERRNO);
}
-
- /* "Forget" pointers into the library we're about to free */
- create_event_func = NULL;
- close_event_func = NULL;
- event_select_func = NULL;
- enum_netevents_func = NULL;
-
- /* We called LoadLibrary, so call FreeLibrary */
- if(!FreeLibrary(wsock2))
- infof(data, "FreeLibrary(wsock2) failed (%u)", GetLastError());
#else
pfd[0].fd = sockfd;
pfd[0].events = POLLIN;
diff --git a/lib/tftp.c b/lib/tftp.c
index 378d9560..1d3b8e82 100644
--- a/lib/tftp.c
+++ b/lib/tftp.c
@@ -183,6 +183,7 @@ const struct Curl_handler Curl_handler_tftp = {
ZERO_NULL, /* connection_check */
PORT_TFTP, /* defport */
CURLPROTO_TFTP, /* protocol */
+ CURLPROTO_TFTP, /* family */
PROTOPT_NONE | PROTOPT_NOURLQUERY /* flags */
};
diff --git a/lib/url.c b/lib/url.c
index 150667aa..8af33c04 100644
--- a/lib/url.c
+++ b/lib/url.c
@@ -130,7 +130,6 @@ bool curl_win32_idn_to_ascii(const char *in, char **out);
#include "memdebug.h"
static void conn_free(struct connectdata *conn);
-static unsigned int get_protocol_family(unsigned int protocol);
/* Some parts of the code (e.g. chunked encoding) assume this buffer has at
* more than just a few bytes to play with. Don't let it become too small or
@@ -140,6 +139,24 @@ static unsigned int get_protocol_family(unsigned int protocol);
# error READBUFFER_SIZE is too small
#endif
+/*
+* get_protocol_family()
+*
+* This is used to return the protocol family for a given protocol.
+*
+* Parameters:
+*
+* 'h' [in] - struct Curl_handler pointer.
+*
+* Returns the family as a single bit protocol identifier.
+*/
+static unsigned int get_protocol_family(const struct Curl_handler *h)
+{
+ DEBUGASSERT(h);
+ DEBUGASSERT(h->family);
+ return h->family;
+}
+
/*
* Protocol table. Schemes (roughly) in 2019 popularity order:
@@ -215,9 +232,8 @@ static const struct Curl_handler * const protocols[] = {
#endif
#endif
-#if !defined(CURL_DISABLE_SMB) && defined(USE_NTLM) && \
- (CURL_SIZEOF_CURL_OFF_T > 4) && \
- (!defined(USE_WINDOWS_SSPI) || defined(USE_WIN32_CRYPTO))
+#if !defined(CURL_DISABLE_SMB) && defined(USE_CURL_NTLM_CORE) && \
+ (CURL_SIZEOF_CURL_OFF_T > 4)
&Curl_handler_smb,
#ifdef USE_SSL
&Curl_handler_smbs,
@@ -228,7 +244,7 @@ static const struct Curl_handler * const protocols[] = {
&Curl_handler_rtsp,
#endif
-#ifdef CURL_ENABLE_MQTT
+#ifndef CURL_DISABLE_MQTT
&Curl_handler_mqtt,
#endif
@@ -274,6 +290,7 @@ static const struct Curl_handler Curl_handler_dummy = {
ZERO_NULL, /* connection_check */
0, /* defport */
0, /* protocol */
+ 0, /* family */
PROTOPT_NONE /* flags */
};
@@ -392,11 +409,8 @@ CURLcode Curl_close(struct Curl_easy **datap)
Curl_dyn_free(&data->state.headerb);
Curl_safefree(data->state.ulbuf);
Curl_flush_cookies(data, TRUE);
-#ifdef USE_ALTSVC
Curl_altsvc_save(data, data->asi, data->set.str[STRING_ALTSVC]);
- Curl_altsvc_cleanup(data->asi);
- data->asi = NULL;
-#endif
+ Curl_altsvc_cleanup(&data->asi);
#if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_CRYPTO_AUTH)
Curl_http_auth_cleanup_digest(data);
#endif
@@ -1019,7 +1033,7 @@ static void prune_dead_connections(struct Curl_easy *data)
Curl_conncache_remove_conn(data, prune.extracted, TRUE);
/* disconnect it */
- (void)Curl_disconnect(data, prune.extracted, /* dead_connection */TRUE);
+ (void)Curl_disconnect(data, prune.extracted, TRUE);
}
CONNCACHE_LOCK(data);
data->state.conn_cache->last_cleanup = now;
@@ -1075,7 +1089,7 @@ ConnectionExists(struct Curl_easy *data,
&hostbundle);
if(bundle) {
/* Max pipe length is zero (unlimited) for multiplexed connections */
- struct curl_llist_element *curr;
+ struct Curl_llist_element *curr;
infof(data, "Found bundle for host %s: %p [%s]\n",
hostbundle, (void *)bundle, (bundle->multiuse == BUNDLE_MULTIPLEX ?
@@ -1121,6 +1135,12 @@ ConnectionExists(struct Curl_easy *data,
/* connect-only or to-be-closed connections will not be reused */
continue;
+ if(extract_if_dead(check, data)) {
+ /* disconnect it */
+ (void)Curl_disconnect(data, check, TRUE);
+ continue;
+ }
+
if(bundle->multiuse == BUNDLE_MULTIPLEX)
multiplexed = CONN_INUSE(check);
@@ -1171,7 +1191,7 @@ ConnectionExists(struct Curl_easy *data,
if((needle->handler->flags&PROTOPT_SSL) !=
(check->handler->flags&PROTOPT_SSL))
/* don't do mixed SSL and non-SSL connections */
- if(get_protocol_family(check->handler->protocol) !=
+ if(get_protocol_family(check->handler) !=
needle->handler->protocol || !check->bits.tls_upgraded)
/* except protocols that have been upgraded via TLS */
continue;
@@ -1276,7 +1296,7 @@ ConnectionExists(struct Curl_easy *data,
is allowed to be upgraded via TLS */
if((strcasecompare(needle->handler->scheme, check->handler->scheme) ||
- (get_protocol_family(check->handler->protocol) ==
+ (get_protocol_family(check->handler) ==
needle->handler->protocol && check->bits.tls_upgraded)) &&
(!needle->bits.conn_to_host || strcasecompare(
needle->conn_to_host.name, check->conn_to_host.name)) &&
@@ -2377,8 +2397,10 @@ static CURLcode parse_proxy(struct Curl_easy *data,
static CURLcode parse_proxy_auth(struct Curl_easy *data,
struct connectdata *conn)
{
- char *proxyuser = data->set.str[STRING_PROXYUSERNAME];
- char *proxypasswd = data->set.str[STRING_PROXYPASSWORD];
+ const char *proxyuser = data->set.str[STRING_PROXYUSERNAME] ?
+ data->set.str[STRING_PROXYUSERNAME] : "";
+ const char *proxypasswd = data->set.str[STRING_PROXYPASSWORD] ?
+ data->set.str[STRING_PROXYPASSWORD] : "";
CURLcode result = CURLE_OK;
if(proxyuser)
@@ -2551,6 +2573,9 @@ static CURLcode create_conn_helper_init_proxy(struct connectdata *conn)
conn->bits.socksproxy = FALSE;
conn->bits.proxy_user_passwd = FALSE;
conn->bits.tunnel_proxy = FALSE;
+ /* CURLPROXY_HTTPS does not have its own flag in conn->bits, yet we need
+ to signal that CURLPROXY_HTTPS is not used for this connection */
+ conn->http_proxy.proxytype = CURLPROXY_HTTP;
}
out:
@@ -3611,6 +3636,7 @@ static CURLcode create_conn(struct Curl_easy *data,
data->set.ssl.primary.pinned_key =
data->set.str[STRING_SSL_PINNEDPUBLICKEY_ORIG];
data->set.ssl.primary.cert_blob = data->set.blobs[BLOB_CERT_ORIG];
+ data->set.ssl.primary.curves = data->set.str[STRING_SSL_EC_CURVES];
#ifndef CURL_DISABLE_PROXY
data->set.proxy_ssl.primary.CApath = data->set.str[STRING_SSL_CAPATH_PROXY];
@@ -3627,18 +3653,15 @@ static CURLcode create_conn(struct Curl_easy *data,
data->set.proxy_ssl.primary.cert_blob = data->set.blobs[BLOB_CERT_PROXY];
data->set.proxy_ssl.CRLfile = data->set.str[STRING_SSL_CRLFILE_PROXY];
data->set.proxy_ssl.issuercert = data->set.str[STRING_SSL_ISSUERCERT_PROXY];
- data->set.proxy_ssl.cert = data->set.str[STRING_CERT_PROXY];
data->set.proxy_ssl.cert_type = data->set.str[STRING_CERT_TYPE_PROXY];
data->set.proxy_ssl.key = data->set.str[STRING_KEY_PROXY];
data->set.proxy_ssl.key_type = data->set.str[STRING_KEY_TYPE_PROXY];
data->set.proxy_ssl.key_passwd = data->set.str[STRING_KEY_PASSWD_PROXY];
data->set.proxy_ssl.primary.clientcert = data->set.str[STRING_CERT_PROXY];
- data->set.proxy_ssl.cert_blob = data->set.blobs[BLOB_CERT_PROXY];
data->set.proxy_ssl.key_blob = data->set.blobs[BLOB_KEY_PROXY];
#endif
data->set.ssl.CRLfile = data->set.str[STRING_SSL_CRLFILE_ORIG];
data->set.ssl.issuercert = data->set.str[STRING_SSL_ISSUERCERT_ORIG];
- data->set.ssl.cert = data->set.str[STRING_CERT_ORIG];
data->set.ssl.cert_type = data->set.str[STRING_CERT_TYPE_ORIG];
data->set.ssl.key = data->set.str[STRING_KEY_ORIG];
data->set.ssl.key_type = data->set.str[STRING_KEY_TYPE_ORIG];
@@ -3653,7 +3676,6 @@ static CURLcode create_conn(struct Curl_easy *data,
#endif
#endif
- data->set.ssl.cert_blob = data->set.blobs[BLOB_CERT_ORIG];
data->set.ssl.key_blob = data->set.blobs[BLOB_KEY_ORIG];
data->set.ssl.issuercert_blob = data->set.blobs[BLOB_SSL_ISSUERCERT_ORIG];
@@ -3752,8 +3774,7 @@ static CURLcode create_conn(struct Curl_easy *data,
CONNCACHE_UNLOCK(data);
if(conn_candidate)
- (void)Curl_disconnect(data, conn_candidate,
- /* dead_connection */ FALSE);
+ (void)Curl_disconnect(data, conn_candidate, FALSE);
else {
infof(data, "No more connections allowed to host %s: %zu\n",
bundlehost, max_host_connections);
@@ -3773,8 +3794,7 @@ static CURLcode create_conn(struct Curl_easy *data,
/* The cache is full. Let's see if we can kill a connection. */
conn_candidate = Curl_conncache_extract_oldest(data);
if(conn_candidate)
- (void)Curl_disconnect(data, conn_candidate,
- /* dead_connection */ FALSE);
+ (void)Curl_disconnect(data, conn_candidate, FALSE);
else {
infof(data, "No connections available in cache\n");
connections_available = FALSE;
@@ -4026,113 +4046,3 @@ CURLcode Curl_init_do(struct Curl_easy *data, struct connectdata *conn)
return CURLE_OK;
}
-
-/*
-* get_protocol_family()
-*
-* This is used to return the protocol family for a given protocol.
-*
-* Parameters:
-*
-* protocol [in] - A single bit protocol identifier such as HTTP or HTTPS.
-*
-* Returns the family as a single bit protocol identifier.
-*/
-
-static unsigned int get_protocol_family(unsigned int protocol)
-{
- unsigned int family;
-
- switch(protocol) {
- case CURLPROTO_HTTP:
- case CURLPROTO_HTTPS:
- family = CURLPROTO_HTTP;
- break;
-
- case CURLPROTO_FTP:
- case CURLPROTO_FTPS:
- family = CURLPROTO_FTP;
- break;
-
- case CURLPROTO_SCP:
- family = CURLPROTO_SCP;
- break;
-
- case CURLPROTO_SFTP:
- family = CURLPROTO_SFTP;
- break;
-
- case CURLPROTO_TELNET:
- family = CURLPROTO_TELNET;
- break;
-
- case CURLPROTO_LDAP:
- case CURLPROTO_LDAPS:
- family = CURLPROTO_LDAP;
- break;
-
- case CURLPROTO_DICT:
- family = CURLPROTO_DICT;
- break;
-
- case CURLPROTO_FILE:
- family = CURLPROTO_FILE;
- break;
-
- case CURLPROTO_TFTP:
- family = CURLPROTO_TFTP;
- break;
-
- case CURLPROTO_IMAP:
- case CURLPROTO_IMAPS:
- family = CURLPROTO_IMAP;
- break;
-
- case CURLPROTO_POP3:
- case CURLPROTO_POP3S:
- family = CURLPROTO_POP3;
- break;
-
- case CURLPROTO_SMTP:
- case CURLPROTO_SMTPS:
- family = CURLPROTO_SMTP;
- break;
-
- case CURLPROTO_RTSP:
- family = CURLPROTO_RTSP;
- break;
-
- case CURLPROTO_RTMP:
- case CURLPROTO_RTMPS:
- family = CURLPROTO_RTMP;
- break;
-
- case CURLPROTO_RTMPT:
- case CURLPROTO_RTMPTS:
- family = CURLPROTO_RTMPT;
- break;
-
- case CURLPROTO_RTMPE:
- family = CURLPROTO_RTMPE;
- break;
-
- case CURLPROTO_RTMPTE:
- family = CURLPROTO_RTMPTE;
- break;
-
- case CURLPROTO_GOPHER:
- family = CURLPROTO_GOPHER;
- break;
-
- case CURLPROTO_SMB:
- case CURLPROTO_SMBS:
- family = CURLPROTO_SMB;
- break;
-
- default:
- family = 0;
- break;
- }
-
- return family;
-}
diff --git a/lib/urlapi.c b/lib/urlapi.c
index acbfb828..88b7f042 100644
--- a/lib/urlapi.c
+++ b/lib/urlapi.c
@@ -1255,8 +1255,7 @@ CURLUcode curl_url_set(CURLU *u, CURLUPart what,
return CURLUE_UNKNOWN_PART;
}
if(storep && *storep) {
- free(*storep);
- *storep = NULL;
+ Curl_safefree(*storep);
}
return CURLUE_OK;
}
@@ -1284,8 +1283,7 @@ CURLUcode curl_url_set(CURLU *u, CURLUPart what,
break;
case CURLUPART_HOST:
storep = &u->host;
- free(u->zoneid);
- u->zoneid = NULL;
+ Curl_safefree(u->zoneid);
break;
case CURLUPART_ZONEID:
storep = &u->zoneid;
diff --git a/lib/urldata.h b/lib/urldata.h
index 0ae92692..5ee81770 100644
--- a/lib/urldata.h
+++ b/lib/urldata.h
@@ -76,9 +76,7 @@
/* length of longest IPv6 address string including the trailing null */
#define MAX_IPADR_LEN sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255")
-/* Default FTP/IMAP etc response timeout in milliseconds.
- Symbian OS panics when given a timeout much greater than 1/2 hour.
-*/
+/* Default FTP/IMAP etc response timeout in milliseconds */
#define RESP_TIMEOUT (120*1000)
/* Max string input length is a precaution against abuse and to detect junk
@@ -230,6 +228,7 @@ struct ssl_primary_config {
char *cipher_list13; /* list of TLS 1.3 cipher suites to use */
char *pinned_key;
struct curl_blob *cert_blob;
+ char *curves; /* list of curves to use */
BIT(verifypeer); /* set TRUE if this is desired */
BIT(verifyhost); /* set TRUE if CN/SAN must match hostname */
BIT(verifystatus); /* set TRUE if certificate status must be checked */
@@ -244,8 +243,6 @@ struct ssl_config_data {
struct curl_blob *issuercert_blob;
curl_ssl_ctx_callback fsslctx; /* function to initialize ssl ctx */
void *fsslctxp; /* parameter for call back */
- char *cert; /* client certificate file name */
- struct curl_blob *cert_blob;
char *cert_type; /* format for certificate (default: PEM)*/
char *key; /* private key file name */
struct curl_blob *key_blob;
@@ -271,7 +268,7 @@ struct ssl_general_config {
};
/* information stored about one single SSL session */
-struct curl_ssl_session {
+struct Curl_ssl_session {
char *name; /* host name for which this ID was used */
char *conn_to_host; /* host name for the connection (may be NULL) */
const char *scheme; /* protocol scheme used */
@@ -472,6 +469,7 @@ struct ConnectBits {
EPRT doesn't work we disable it for the forthcoming
requests */
BIT(ftp_use_data_ssl); /* Enabled SSL for the data connection */
+ BIT(ftp_use_control_ssl); /* Enabled SSL for the control connection */
#endif
BIT(netrc); /* name+password provided by netrc */
BIT(bound); /* set true if bind() has already been done on this socket/
@@ -740,6 +738,8 @@ struct Curl_handler {
long defport; /* Default port. */
unsigned int protocol; /* See CURLPROTO_* - this needs to be the single
specific protocol bit */
+ unsigned int family; /* single bit for protocol family; basically the
+ non-TLS name of the protocol this is */
unsigned int flags; /* Extra particular characteristics, see PROTOPT_* */
};
@@ -860,7 +860,7 @@ struct connectdata {
connection is used! */
struct Curl_easy *data;
struct connstate cnnct;
- struct curl_llist_element bundle_node; /* conncache */
+ struct Curl_llist_element bundle_node; /* conncache */
/* chunk is for HTTP chunked encoding, but is in the general connectdata
struct only because we can do just about any protocol through a HTTP proxy
@@ -1024,7 +1024,7 @@ struct connectdata {
struct kerberos5data krb5; /* variables into the structure definition, */
#endif /* however, some of them are ftp specific. */
- struct curl_llist easyq; /* List of easy handles using this connection */
+ struct Curl_llist easyq; /* List of easy handles using this connection */
curl_seek_callback seek_func; /* function that seeks the input */
void *seek_client; /* pointer to pass to the seek() above */
@@ -1134,6 +1134,7 @@ struct PureInfo {
OpenSSL, GnuTLS, Schannel, NSS and GSKit
builds. Asked for with CURLOPT_CERTINFO
/ CURLINFO_CERTINFO */
+ CURLproxycode pxcode;
BIT(timecond); /* set to TRUE if the time condition didn't match, which
thus made the document NOT get fetched */
};
@@ -1274,7 +1275,7 @@ typedef enum {
* One instance for each timeout an easy handle can set.
*/
struct time_node {
- struct curl_llist_element list;
+ struct Curl_llist_element list;
struct curltime time;
expire_id eid;
};
@@ -1314,7 +1315,7 @@ struct UrlState {
strdup() data.
*/
int first_remote_port; /* remote port of the first (not followed) request */
- struct curl_ssl_session *session; /* array of 'max_ssl_sessions' size */
+ struct Curl_ssl_session *session; /* array of 'max_ssl_sessions' size */
long sessionage; /* number of the most recent session */
unsigned int tempcount; /* number of entries in use in tempwrite, 0 - 3 */
struct tempbuf tempwrite[3]; /* BOTH, HEADER, BODY */
@@ -1338,7 +1339,7 @@ struct UrlState {
#endif /* USE_OPENSSL */
struct curltime expiretime; /* set this with Curl_expire() only */
struct Curl_tree timenode; /* for the splay stuff */
- struct curl_llist timeoutlist; /* list of pending timeouts */
+ struct Curl_llist timeoutlist; /* list of pending timeouts */
struct time_node expires[EXPIRE_LAST]; /* nodes for each expire type */
/* a place to store the most recently set FTP entrypath */
@@ -1347,8 +1348,7 @@ struct UrlState {
int httpversion; /* the lowest HTTP version*10 reported by any server
involved in this request */
-#if !defined(WIN32) && !defined(MSDOS) && !defined(__EMX__) && \
- !defined(__SYMBIAN32__)
+#if !defined(WIN32) && !defined(MSDOS) && !defined(__EMX__)
/* do FTP line-end conversions on most platforms */
#define CURL_DO_LINEEND_CONV
/* for FTP downloads: track CRLF sequences that span blocks */
@@ -1564,6 +1564,7 @@ enum dupstring {
STRING_DNS_INTERFACE,
STRING_DNS_LOCAL_IP4,
STRING_DNS_LOCAL_IP6,
+ STRING_SSL_EC_CURVES,
/* -- end of null-terminated strings -- */
@@ -1839,7 +1840,7 @@ struct UserDefined {
};
struct Names {
- struct curl_hash *hostcache;
+ struct Curl_hash *hostcache;
enum {
HCACHE_NONE, /* not pointing to anything */
HCACHE_MULTI, /* points to a shared one in the multi handle */
@@ -1863,8 +1864,8 @@ struct Curl_easy {
struct Curl_easy *prev;
struct connectdata *conn;
- struct curl_llist_element connect_queue;
- struct curl_llist_element conn_queue; /* list per connectdata */
+ struct Curl_llist_element connect_queue;
+ struct Curl_llist_element conn_queue; /* list per connectdata */
CURLMstate mstate; /* the handle's state */
CURLcode result; /* previous result */
diff --git a/lib/version.c b/lib/version.c
index 4f6dda24..bdeba883 100644
--- a/lib/version.c
+++ b/lib/version.c
@@ -31,8 +31,8 @@
#include "curl_printf.h"
#ifdef USE_ARES
-# if defined(CURL_STATICLIB) && !defined(CARES_STATICLIB) && \
- (defined(WIN32) || defined(__SYMBIAN32__))
+# if defined(CURL_STATICLIB) && !defined(CARES_STATICLIB) && \
+ defined(WIN32)
# define CARES_STATICLIB
# endif
# include <ares.h>
@@ -56,10 +56,6 @@
#ifdef HAVE_ZLIB_H
#include <zlib.h>
-#ifdef __SYMBIAN32__
-/* zlib pollutes the namespace with this definition */
-#undef WIN32
-#endif
#endif
#ifdef HAVE_BROTLI
@@ -298,7 +294,7 @@ static const char * const protocols[] = {
"ldaps",
#endif
#endif
-#ifdef CURL_ENABLE_MQTT
+#ifndef CURL_DISABLE_MQTT
"mqtt",
#endif
#ifndef CURL_DISABLE_POP3
@@ -319,9 +315,8 @@ static const char * const protocols[] = {
#ifdef USE_SSH
"sftp",
#endif
-#if !defined(CURL_DISABLE_SMB) && defined(USE_NTLM) && \
- (CURL_SIZEOF_CURL_OFF_T > 4) && \
- (!defined(USE_WINDOWS_SSPI) || defined(USE_WIN32_CRYPTO))
+#if !defined(CURL_DISABLE_SMB) && defined(USE_CURL_NTLM_CORE) && \
+ (CURL_SIZEOF_CURL_OFF_T > 4)
"smb",
# ifdef USE_SSL
"smbs",
@@ -475,11 +470,13 @@ curl_version_info_data *curl_version_info(CURLversion stamp)
#ifdef USE_SSL
Curl_ssl_version(ssl_buffer, sizeof(ssl_buffer));
version_info.ssl_version = ssl_buffer;
+#ifndef CURL_DISABLE_PROXY
if(Curl_ssl->supports & SSLSUPP_HTTPS_PROXY)
version_info.features |= CURL_VERSION_HTTPS_PROXY;
else
version_info.features &= ~CURL_VERSION_HTTPS_PROXY;
#endif
+#endif
#ifdef HAVE_LIBZ
version_info.libz_version = zlibVersion();
diff --git a/lib/vquic/ngtcp2.c b/lib/vquic/ngtcp2.c
index 20ee08dd..c076b7c3 100644
--- a/lib/vquic/ngtcp2.c
+++ b/lib/vquic/ngtcp2.c
@@ -798,7 +798,7 @@ CURLcode Curl_quic_connect(struct connectdata *conn,
infof(data, "Connect socket %d over QUIC to %s:%ld\n",
sockfd, ipbuf, port);
- qs->version = NGTCP2_PROTO_VER;
+ qs->version = NGTCP2_PROTO_VER_MAX;
#ifdef USE_OPENSSL
qs->sslctx = quic_ssl_ctx(data);
if(!qs->sslctx)
@@ -831,13 +831,9 @@ CURLcode Curl_quic_connect(struct connectdata *conn,
ngtcp2_addr_init(&path.local, &qs->local_addr, qs->local_addrlen, NULL);
ngtcp2_addr_init(&path.remote, addr, addrlen, NULL);
-#ifdef NGTCP2_PROTO_VER
-#define QUICVER NGTCP2_PROTO_VER
-#else
-#error "unsupported ngtcp2 version"
-#endif
- rc = ngtcp2_conn_client_new(&qs->qconn, &qs->dcid, &qs->scid, &path, QUICVER,
- &ng_callbacks, &qs->settings, NULL, qs);
+ rc = ngtcp2_conn_client_new(&qs->qconn, &qs->dcid, &qs->scid, &path,
+ NGTCP2_PROTO_VER_MAX, &ng_callbacks,
+ &qs->settings, NULL, qs);
if(rc)
return CURLE_QUIC_CONNECT_ERROR;
@@ -954,6 +950,7 @@ static const struct Curl_handler Curl_handler_http3 = {
ng_conncheck, /* connection_check */
PORT_HTTP, /* defport */
CURLPROTO_HTTPS, /* protocol */
+ CURLPROTO_HTTP, /* family */
PROTOPT_SSL | PROTOPT_STREAM /* flags */
};
@@ -1729,6 +1726,7 @@ static CURLcode ng_process_ingress(struct connectdata *conn, int sockfd,
socklen_t remote_addrlen;
ngtcp2_path path;
ngtcp2_tstamp ts = timestamp();
+ ngtcp2_pkt_info pi = { 0 };
for(;;) {
remote_addrlen = sizeof(remote_addr);
@@ -1750,7 +1748,7 @@ static CURLcode ng_process_ingress(struct connectdata *conn, int sockfd,
ngtcp2_addr_init(&path.remote, (struct sockaddr *)&remote_addr,
remote_addrlen, NULL);
- rv = ngtcp2_conn_read_pkt(qs->qconn, &path, buf, recvd, ts);
+ rv = ngtcp2_conn_read_pkt(qs->qconn, &path, &pi, buf, recvd, ts);
if(rv != 0) {
/* TODO Send CONNECTION_CLOSE if possible */
return CURLE_RECV_ERROR;
@@ -1815,7 +1813,7 @@ static CURLcode ng_flush_egress(struct connectdata *conn, int sockfd,
uint32_t flags = NGTCP2_WRITE_STREAM_FLAG_MORE |
(fin ? NGTCP2_WRITE_STREAM_FLAG_FIN : 0);
outlen =
- ngtcp2_conn_writev_stream(qs->qconn, &ps.path,
+ ngtcp2_conn_writev_stream(qs->qconn, &ps.path, NULL,
out, pktlen, &ndatalen,
flags, stream_id,
(const ngtcp2_vec *)vec, veccnt, ts);
@@ -1860,7 +1858,8 @@ static CURLcode ng_flush_egress(struct connectdata *conn, int sockfd,
}
}
if(outlen < 0) {
- outlen = ngtcp2_conn_write_pkt(qs->qconn, &ps.path, out, pktlen, ts);
+ outlen = ngtcp2_conn_write_pkt(qs->qconn, &ps.path, NULL,
+ out, pktlen, ts);
if(outlen < 0) {
failf(conn->data, "ngtcp2_conn_write_pkt returned error: %s\n",
ngtcp2_strerror((int)outlen));
diff --git a/lib/vquic/quiche.c b/lib/vquic/quiche.c
index fd9cb8bd..f52e9da3 100644
--- a/lib/vquic/quiche.c
+++ b/lib/vquic/quiche.c
@@ -154,6 +154,7 @@ static const struct Curl_handler Curl_handler_http3 = {
quiche_conncheck, /* connection_check */
PORT_HTTP, /* defport */
CURLPROTO_HTTPS, /* protocol */
+ CURLPROTO_HTTP, /* family */
PROTOPT_SSL | PROTOPT_STREAM /* flags */
};
diff --git a/lib/vssh/libssh.c b/lib/vssh/libssh.c
index 8988e239..acdb4e75 100644
--- a/lib/vssh/libssh.c
+++ b/lib/vssh/libssh.c
@@ -158,6 +158,7 @@ const struct Curl_handler Curl_handler_scp = {
ZERO_NULL, /* connection_check */
PORT_SSH, /* defport */
CURLPROTO_SCP, /* protocol */
+ CURLPROTO_SCP, /* family */
PROTOPT_DIRLOCK | PROTOPT_CLOSEACTION | PROTOPT_NOURLQUERY /* flags */
};
@@ -183,6 +184,7 @@ const struct Curl_handler Curl_handler_sftp = {
ZERO_NULL, /* connection_check */
PORT_SSH, /* defport */
CURLPROTO_SFTP, /* protocol */
+ CURLPROTO_SFTP, /* family */
PROTOPT_DIRLOCK | PROTOPT_CLOSEACTION
| PROTOPT_NOURLQUERY /* flags */
};
@@ -2692,7 +2694,9 @@ static void sftp_quote(struct connectdata *conn)
*/
if(strncasecompare(cmd, "chgrp ", 6) ||
strncasecompare(cmd, "chmod ", 6) ||
- strncasecompare(cmd, "chown ", 6)) {
+ strncasecompare(cmd, "chown ", 6) ||
+ strncasecompare(cmd, "atime ", 6) ||
+ strncasecompare(cmd, "mtime ", 6)) {
/* attribute change */
/* sshc->quote_path1 contains the mode to set */
@@ -2702,7 +2706,7 @@ static void sftp_quote(struct connectdata *conn)
if(result == CURLE_OUT_OF_MEMORY)
failf(data, "Out of memory");
else
- failf(data, "Syntax error in chgrp/chmod/chown: "
+ failf(data, "Syntax error in chgrp/chmod/chown/atime/mtime: "
"Bad second parameter");
Curl_safefree(sshc->quote_path1);
state(conn, SSH_SFTP_CLOSE);
@@ -2863,6 +2867,34 @@ static void sftp_quote_stat(struct connectdata *conn)
}
sshc->quote_attrs->flags |= SSH_FILEXFER_ATTR_UIDGID;
}
+ else if(strncasecompare(cmd, "atime", 5)) {
+ time_t date = Curl_getdate_capped(sshc->quote_path1);
+ if(date == -1) {
+ Curl_safefree(sshc->quote_path1);
+ Curl_safefree(sshc->quote_path2);
+ failf(data, "Syntax error: incorrect access date format");
+ state(conn, SSH_SFTP_CLOSE);
+ sshc->nextstate = SSH_NO_STATE;
+ sshc->actualcode = CURLE_QUOTE_ERROR;
+ return;
+ }
+ sshc->quote_attrs->atime = (uint32_t)date;
+ sshc->quote_attrs->flags |= SSH_FILEXFER_ATTR_ACMODTIME;
+ }
+ else if(strncasecompare(cmd, "mtime", 5)) {
+ time_t date = Curl_getdate_capped(sshc->quote_path1);
+ if(date == -1) {
+ Curl_safefree(sshc->quote_path1);
+ Curl_safefree(sshc->quote_path2);
+ failf(data, "Syntax error: incorrect modification date format");
+ state(conn, SSH_SFTP_CLOSE);
+ sshc->nextstate = SSH_NO_STATE;
+ sshc->actualcode = CURLE_QUOTE_ERROR;
+ return;
+ }
+ sshc->quote_attrs->mtime = (uint32_t)date;
+ sshc->quote_attrs->flags |= SSH_FILEXFER_ATTR_ACMODTIME;
+ }
/* Now send the completed structure... */
state(conn, SSH_SFTP_QUOTE_SETSTAT);
diff --git a/lib/vssh/libssh2.c b/lib/vssh/libssh2.c
index 4f56bb44..d983cc9a 100644
--- a/lib/vssh/libssh2.c
+++ b/lib/vssh/libssh2.c
@@ -150,6 +150,7 @@ const struct Curl_handler Curl_handler_scp = {
ZERO_NULL, /* connection_check */
PORT_SSH, /* defport */
CURLPROTO_SCP, /* protocol */
+ CURLPROTO_SCP, /* family */
PROTOPT_DIRLOCK | PROTOPT_CLOSEACTION
| PROTOPT_NOURLQUERY /* flags */
};
@@ -177,6 +178,7 @@ const struct Curl_handler Curl_handler_sftp = {
ZERO_NULL, /* connection_check */
PORT_SSH, /* defport */
CURLPROTO_SFTP, /* protocol */
+ CURLPROTO_SFTP, /* family */
PROTOPT_DIRLOCK | PROTOPT_CLOSEACTION
| PROTOPT_NOURLQUERY /* flags */
};
@@ -442,6 +444,7 @@ static CURLcode ssh_knownhost(struct connectdata *conn)
if(data->set.str[STRING_SSH_KNOWNHOSTS]) {
/* we're asked to verify the host against a file */
struct ssh_conn *sshc = &conn->proto.sshc;
+ struct libssh2_knownhost *host = NULL;
int rc;
int keytype;
size_t keylen;
@@ -456,7 +459,6 @@ static CURLcode ssh_knownhost(struct connectdata *conn)
* What host name does OpenSSH store in its file if an IDN name is
* used?
*/
- struct libssh2_knownhost *host;
enum curl_khmatch keymatch;
curl_sshkeycallback func =
data->set.ssh_keyfunc?data->set.ssh_keyfunc:sshkeycallback;
@@ -568,7 +570,13 @@ static CURLcode ssh_knownhost(struct connectdata *conn)
/* DEFER means bail out but keep the SSH_HOSTKEY state */
result = sshc->actualcode = CURLE_PEER_FAILED_VERIFICATION;
break;
+ case CURLKHSTAT_FINE_REPLACE:
+ /* remove old host+key that doesn't match */
+ if(host)
+ libssh2_knownhost_del(sshc->kh, host);
+ /*FALLTHROUGH*/
case CURLKHSTAT_FINE:
+ /*FALLTHROUGH*/
case CURLKHSTAT_FINE_ADD_TO_FILE:
/* proceed */
if(keycheck != LIBSSH2_KNOWNHOST_CHECK_MATCH) {
@@ -583,7 +591,8 @@ static CURLcode ssh_knownhost(struct connectdata *conn)
if(addrc)
infof(data, "Warning adding the known host %s failed!\n",
conn->host.name);
- else if(rc == CURLKHSTAT_FINE_ADD_TO_FILE) {
+ else if(rc == CURLKHSTAT_FINE_ADD_TO_FILE ||
+ rc == CURLKHSTAT_FINE_REPLACE) {
/* now we write the entire in-memory list of known hosts to the
known_hosts file */
int wrc =
@@ -814,6 +823,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
result = ssh_force_knownhost_key_type(conn);
if(result) {
state(conn, SSH_SESSION_FREE);
+ sshc->actualcode = result;
break;
}
@@ -1390,7 +1400,9 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
*/
if(strncasecompare(cmd, "chgrp ", 6) ||
strncasecompare(cmd, "chmod ", 6) ||
- strncasecompare(cmd, "chown ", 6) ) {
+ strncasecompare(cmd, "chown ", 6) ||
+ strncasecompare(cmd, "atime ", 6) ||
+ strncasecompare(cmd, "mtime ", 6)) {
/* attribute change */
/* sshc->quote_path1 contains the mode to set */
@@ -1587,6 +1599,34 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
break;
}
}
+ else if(strncasecompare(cmd, "atime", 5)) {
+ time_t date = Curl_getdate_capped(sshc->quote_path1);
+ if(date == -1) {
+ Curl_safefree(sshc->quote_path1);
+ Curl_safefree(sshc->quote_path2);
+ failf(data, "Syntax error: incorrect access date format");
+ state(conn, SSH_SFTP_CLOSE);
+ sshc->nextstate = SSH_NO_STATE;
+ sshc->actualcode = CURLE_QUOTE_ERROR;
+ break;
+ }
+ sshc->quote_attrs.atime = (unsigned long)date;
+ sshc->quote_attrs.flags = LIBSSH2_SFTP_ATTR_ACMODTIME;
+ }
+ else if(strncasecompare(cmd, "mtime", 5)) {
+ time_t date = Curl_getdate_capped(sshc->quote_path1);
+ if(date == -1) {
+ Curl_safefree(sshc->quote_path1);
+ Curl_safefree(sshc->quote_path2);
+ failf(data, "Syntax error: incorrect modification date format");
+ state(conn, SSH_SFTP_CLOSE);
+ sshc->nextstate = SSH_NO_STATE;
+ sshc->actualcode = CURLE_QUOTE_ERROR;
+ break;
+ }
+ sshc->quote_attrs.mtime = (unsigned long)date;
+ sshc->quote_attrs.flags = LIBSSH2_SFTP_ATTR_ACMODTIME;
+ }
/* Now send the completed structure... */
state(conn, SSH_SFTP_QUOTE_SETSTAT);
@@ -2999,6 +3039,42 @@ static CURLcode ssh_setup_connection(struct connectdata *conn)
static Curl_recv scp_recv, sftp_recv;
static Curl_send scp_send, sftp_send;
+static ssize_t ssh_tls_recv(libssh2_socket_t sock, void *buffer,
+ size_t length, int flags, void **abstract)
+{
+ struct connectdata *conn = (struct connectdata *)*abstract;
+ ssize_t nread;
+ CURLcode result;
+ (void)flags;
+
+ result = Curl_read(conn, sock, buffer, length, &nread);
+ if(result == CURLE_AGAIN)
+ return -EAGAIN; /* magic return code for libssh2 */
+ else if(result)
+ return -1; /* generic error */
+ if(conn->data->set.verbose)
+ Curl_debug(conn->data, CURLINFO_DATA_IN, (char *)buffer, (size_t)nread);
+ return nread;
+}
+
+static ssize_t ssh_tls_send(libssh2_socket_t sock, const void *buffer,
+ size_t length, int flags, void **abstract)
+{
+ struct connectdata *conn = (struct connectdata *)*abstract;
+ ssize_t nwrite;
+ CURLcode result;
+ (void)flags;
+
+ result = Curl_write(conn, sock, buffer, length, &nwrite);
+ if(result == CURLE_AGAIN)
+ return -EAGAIN; /* magic return code for libssh2 */
+ else if(result)
+ return -1; /* error */
+ if(conn->data->set.verbose)
+ Curl_debug(conn->data, CURLINFO_DATA_OUT, (char *)buffer, (size_t)nwrite);
+ return nwrite;
+}
+
/*
* Curl_ssh_connect() gets called from Curl_protocol_connect() to allow us to
* do protocol-specific actions at connect-time.
@@ -3020,14 +3096,6 @@ static CURLcode ssh_connect(struct connectdata *conn, bool *done)
function to make the re-use checks properly be able to check this bit. */
connkeep(conn, "SSH default");
- if(conn->handler->protocol & CURLPROTO_SCP) {
- conn->recv[FIRSTSOCKET] = scp_recv;
- conn->send[FIRSTSOCKET] = scp_send;
- }
- else {
- conn->recv[FIRSTSOCKET] = sftp_recv;
- conn->send[FIRSTSOCKET] = sftp_send;
- }
ssh = &conn->proto.sshc;
#ifdef CURL_LIBSSH2_DEBUG
@@ -3048,6 +3116,53 @@ static CURLcode ssh_connect(struct connectdata *conn, bool *done)
return CURLE_FAILED_INIT;
}
+ if(conn->http_proxy.proxytype == CURLPROXY_HTTPS) {
+ /*
+ * This crazy union dance is here to avoid assigning a void pointer a
+ * function pointer as it is invalid C. The problem is of course that
+ * libssh2 has such an API...
+ */
+ union receive {
+ void *recvp;
+ ssize_t (*recvptr)(libssh2_socket_t, void *, size_t, int, void **);
+ };
+ union transfer {
+ void *sendp;
+ ssize_t (*sendptr)(libssh2_socket_t, const void *, size_t, int, void **);
+ };
+ union receive sshrecv;
+ union transfer sshsend;
+
+ sshrecv.recvptr = ssh_tls_recv;
+ sshsend.sendptr = ssh_tls_send;
+
+ infof(data, "Uses HTTPS proxy!\n");
+ /*
+ Setup libssh2 callbacks to make it read/write TLS from the socket.
+
+ ssize_t
+ recvcb(libssh2_socket_t sock, void *buffer, size_t length,
+ int flags, void **abstract);
+
+ ssize_t
+ sendcb(libssh2_socket_t sock, const void *buffer, size_t length,
+ int flags, void **abstract);
+
+ */
+ libssh2_session_callback_set(ssh->ssh_session,
+ LIBSSH2_CALLBACK_RECV, sshrecv.recvp);
+ libssh2_session_callback_set(ssh->ssh_session,
+ LIBSSH2_CALLBACK_SEND, sshsend.sendp);
+ }
+ else if(conn->handler->protocol & CURLPROTO_SCP) {
+ conn->recv[FIRSTSOCKET] = scp_recv;
+ conn->send[FIRSTSOCKET] = scp_send;
+ }
+ else {
+ conn->recv[FIRSTSOCKET] = sftp_recv;
+ conn->send[FIRSTSOCKET] = sftp_send;
+ }
+
if(data->set.ssh_compression) {
#if LIBSSH2_VERSION_NUM >= 0x010208
if(libssh2_session_flag(ssh->ssh_session, LIBSSH2_FLAG_COMPRESS, 1) < 0)
diff --git a/lib/vtls/gskit.c b/lib/vtls/gskit.c
index 0538e4a4..dc79f487 100644
--- a/lib/vtls/gskit.c
+++ b/lib/vtls/gskit.c
@@ -705,7 +705,7 @@ static CURLcode gskit_connect_step1(struct connectdata *conn, int sockindex)
int rc;
const char * const keyringfile = SSL_CONN_CONFIG(CAfile);
const char * const keyringpwd = SSL_SET_OPTION(key_passwd);
- const char * const keyringlabel = SSL_SET_OPTION(cert);
+ const char * const keyringlabel = SSL_SET_OPTION(primary.clientcert);
const long int ssl_version = SSL_CONN_CONFIG(version);
const bool verifypeer = SSL_CONN_CONFIG(verifypeer);
const char * const hostname = SSL_IS_PROXY()? conn->http_proxy.host.name:
diff --git a/lib/vtls/gtls.c b/lib/vtls/gtls.c
index 16b0bd6c..ec3f8599 100644
--- a/lib/vtls/gtls.c
+++ b/lib/vtls/gtls.c
@@ -81,7 +81,7 @@ static bool gtls_inited = FALSE;
struct ssl_backend_data {
gnutls_session_t session;
gnutls_certificate_credentials_t cred;
-#ifdef USE_TLS_SRP
+#ifdef HAVE_GNUTLS_SRP
gnutls_srp_client_credentials_t srp_client_cred;
#endif
};
@@ -304,7 +304,7 @@ static gnutls_x509_crt_fmt_t do_file_type(const char *type)
return GNUTLS_X509_FMT_PEM;
if(strcasecompare(type, "DER"))
return GNUTLS_X509_FMT_DER;
- return -1;
+ return GNUTLS_X509_FMT_PEM; /* default to PEM */
}
#define GNUTLS_CIPHERS "NORMAL:-ARCFOUR-128:-CTYPE-ALL:+CTYPE-X509"
@@ -399,15 +399,8 @@ gtls_connect_step1(struct connectdata *conn,
#endif
const char *prioritylist;
const char *err = NULL;
-#ifndef CURL_DISABLE_PROXY
- const char * const hostname = SSL_IS_PROXY() ? conn->http_proxy.host.name :
- conn->host.name;
- long * const certverifyresult = SSL_IS_PROXY() ?
- &data->set.proxy_ssl.certverifyresult : &data->set.ssl.certverifyresult;
-#else
- const char * const hostname = conn->host.name;
- long * const certverifyresult = &data->set.ssl.certverifyresult;
-#endif
+ const char * const hostname = SSL_HOST_NAME();
+ long * const certverifyresult = &SSL_SET_OPTION_LVALUE(certverifyresult);
if(connssl->state == ssl_connection_complete)
/* to make us tolerant against being called more than once for the
@@ -434,7 +427,7 @@ gtls_connect_step1(struct connectdata *conn,
return CURLE_SSL_CONNECT_ERROR;
}
-#ifdef USE_TLS_SRP
+#ifdef HAVE_GNUTLS_SRP
if(SSL_SET_OPTION(authtype) == CURL_TLSAUTH_SRP) {
infof(data, "Using TLS-SRP username: %s\n", SSL_SET_OPTION(username));
@@ -588,7 +581,7 @@ gtls_connect_step1(struct connectdata *conn,
return CURLE_SSL_CONNECT_ERROR;
}
-#ifdef USE_TLS_SRP
+#ifdef HAVE_GNUTLS_SRP
/* Only add SRP to the cipher list if SRP is requested. Otherwise
* GnuTLS will disable TLS 1.3 support. */
if(SSL_SET_OPTION(authtype) == CURL_TLSAUTH_SRP) {
@@ -610,7 +603,7 @@ gtls_connect_step1(struct connectdata *conn,
else {
#endif
rc = gnutls_priority_set_direct(session, prioritylist, &err);
-#ifdef USE_TLS_SRP
+#ifdef HAVE_GNUTLS_SRP
}
#endif
@@ -645,7 +638,7 @@ gtls_connect_step1(struct connectdata *conn,
gnutls_alpn_set_protocols(session, protocols, cur, 0);
}
- if(SSL_SET_OPTION(cert)) {
+ if(SSL_SET_OPTION(primary.clientcert)) {
if(SSL_SET_OPTION(key_passwd)) {
const unsigned int supported_key_encryption_algorithms =
GNUTLS_PKCS_USE_PKCS12_3DES | GNUTLS_PKCS_USE_PKCS12_ARCFOUR |
@@ -654,9 +647,9 @@ gtls_connect_step1(struct connectdata *conn,
GNUTLS_PKCS_USE_PBES2_AES_256;
rc = gnutls_certificate_set_x509_key_file2(
backend->cred,
- SSL_SET_OPTION(cert),
+ SSL_SET_OPTION(primary.clientcert),
SSL_SET_OPTION(key) ?
- SSL_SET_OPTION(key) : SSL_SET_OPTION(cert),
+ SSL_SET_OPTION(key) : SSL_SET_OPTION(primary.clientcert),
do_file_type(SSL_SET_OPTION(cert_type)),
SSL_SET_OPTION(key_passwd),
supported_key_encryption_algorithms);
@@ -670,9 +663,9 @@ gtls_connect_step1(struct connectdata *conn,
else {
if(gnutls_certificate_set_x509_key_file(
backend->cred,
- SSL_SET_OPTION(cert),
+ SSL_SET_OPTION(primary.clientcert),
SSL_SET_OPTION(key) ?
- SSL_SET_OPTION(key) : SSL_SET_OPTION(cert),
+ SSL_SET_OPTION(key) : SSL_SET_OPTION(primary.clientcert),
do_file_type(SSL_SET_OPTION(cert_type)) ) !=
GNUTLS_E_SUCCESS) {
failf(data, "error reading X.509 key or certificate file");
@@ -681,7 +674,7 @@ gtls_connect_step1(struct connectdata *conn,
}
}
-#ifdef USE_TLS_SRP
+#ifdef HAVE_GNUTLS_SRP
/* put the credentials to the current session */
if(SSL_SET_OPTION(authtype) == CURL_TLSAUTH_SRP) {
rc = gnutls_credentials_set(session, GNUTLS_CRD_SRP,
@@ -839,15 +832,8 @@ gtls_connect_step3(struct connectdata *conn,
unsigned int bits;
gnutls_protocol_t version = gnutls_protocol_get_version(session);
#endif
-#ifndef CURL_DISABLE_PROXY
- const char * const hostname = SSL_IS_PROXY() ? conn->http_proxy.host.name :
- conn->host.name;
- long * const certverifyresult = SSL_IS_PROXY() ?
- &data->set.proxy_ssl.certverifyresult : &data->set.ssl.certverifyresult;
-#else
- const char * const hostname = conn->host.name;
- long * const certverifyresult = &data->set.ssl.certverifyresult;
-#endif
+ const char * const hostname = SSL_HOST_NAME();
+ long * const certverifyresult = &SSL_SET_OPTION_LVALUE(certverifyresult);
/* the name of the cipher suite used, e.g. ECDHE_RSA_AES_256_GCM_SHA384. */
ptr = gnutls_cipher_suite_get_name(gnutls_kx_get(session),
@@ -868,7 +854,7 @@ gtls_connect_step3(struct connectdata *conn,
if(SSL_CONN_CONFIG(verifypeer) ||
SSL_CONN_CONFIG(verifyhost) ||
SSL_SET_OPTION(issuercert)) {
-#ifdef USE_TLS_SRP
+#ifdef HAVE_GNUTLS_SRP
if(SSL_SET_OPTION(authtype) == CURL_TLSAUTH_SRP
&& SSL_SET_OPTION(username) != NULL
&& !SSL_CONN_CONFIG(verifypeer)
@@ -881,7 +867,7 @@ gtls_connect_step3(struct connectdata *conn,
failf(data, "failed to get server cert");
*certverifyresult = GNUTLS_E_NO_CERTIFICATE_FOUND;
return CURLE_PEER_FAILED_VERIFICATION;
-#ifdef USE_TLS_SRP
+#ifdef HAVE_GNUTLS_SRP
}
#endif
}
@@ -1128,22 +1114,15 @@ gtls_connect_step3(struct connectdata *conn,
}
#endif
if(!rc) {
-#ifndef CURL_DISABLE_PROXY
- const char * const dispname = SSL_IS_PROXY() ?
- conn->http_proxy.host.dispname : conn->host.dispname;
-#else
- const char * const dispname = conn->host.dispname;
-#endif
-
if(SSL_CONN_CONFIG(verifyhost)) {
failf(data, "SSL: certificate subject name (%s) does not match "
- "target host name '%s'", certname, dispname);
+ "target host name '%s'", certname, SSL_HOST_DISPNAME());
gnutls_x509_crt_deinit(x509_cert);
return CURLE_PEER_FAILED_VERIFICATION;
}
else
infof(data, "\t common name: %s (does not match '%s')\n",
- certname, dispname);
+ certname, SSL_HOST_DISPNAME());
}
else
infof(data, "\t common name: %s (matched)\n", certname);
@@ -1448,7 +1427,7 @@ static void close_one(struct ssl_connect_data *connssl)
gnutls_certificate_free_credentials(backend->cred);
backend->cred = NULL;
}
-#ifdef USE_TLS_SRP
+#ifdef HAVE_GNUTLS_SRP
if(backend->srp_client_cred) {
gnutls_srp_free_client_credentials(backend->srp_client_cred);
backend->srp_client_cred = NULL;
@@ -1530,7 +1509,7 @@ static int Curl_gtls_shutdown(struct connectdata *conn, int sockindex)
}
gnutls_certificate_free_credentials(backend->cred);
-#ifdef USE_TLS_SRP
+#ifdef HAVE_GNUTLS_SRP
if(SSL_SET_OPTION(authtype) == CURL_TLSAUTH_SRP
&& SSL_SET_OPTION(username) != NULL)
gnutls_srp_free_client_credentials(backend->srp_client_cred);
diff --git a/lib/vtls/mbedtls.c b/lib/vtls/mbedtls.c
index 545f824c..4e5f6574 100644
--- a/lib/vtls/mbedtls.c
+++ b/lib/vtls/mbedtls.c
@@ -31,6 +31,9 @@
#ifdef USE_MBEDTLS
+/* Define this to enable lots of debugging for mbedTLS */
+/* #define MBEDTLS_DEBUG */
+
#include <mbedtls/version.h>
#if MBEDTLS_VERSION_NUMBER >= 0x02040000
#include <mbedtls/net_sockets.h>
@@ -46,6 +49,12 @@
#include <mbedtls/ctr_drbg.h>
#include <mbedtls/sha256.h>
+#if MBEDTLS_VERSION_MAJOR >= 2
+# ifdef MBEDTLS_DEBUG
+# include <mbedtls/debug.h>
+# endif
+#endif
+
#include "urldata.h"
#include "sendf.h"
#include "inet_pton.h"
@@ -113,9 +122,6 @@ static int entropy_func_mutex(void *data, unsigned char *output, size_t len)
#endif /* THREADING_SUPPORT */
-/* Define this to enable lots of debugging for mbedTLS */
-#undef MBEDTLS_DEBUG
-
#ifdef MBEDTLS_DEBUG
static void mbed_debug(void *context, int level, const char *f_name,
int line_nb, const char *line)
@@ -244,7 +250,7 @@ mbed_connect_step1(struct connectdata *conn,
const char * const ssl_cafile = SSL_CONN_CONFIG(CAfile);
const bool verifypeer = SSL_CONN_CONFIG(verifypeer);
const char * const ssl_capath = SSL_CONN_CONFIG(CApath);
- char * const ssl_cert = SSL_SET_OPTION(cert);
+ char * const ssl_cert = SSL_SET_OPTION(primary.clientcert);
const char * const ssl_crlfile = SSL_SET_OPTION(CRLfile);
#ifndef CURL_DISABLE_PROXY
const char * const hostname = SSL_IS_PROXY() ? conn->http_proxy.host.name :
diff --git a/lib/vtls/mesalink.c b/lib/vtls/mesalink.c
index 7132bdfd..7346a75f 100644
--- a/lib/vtls/mesalink.c
+++ b/lib/vtls/mesalink.c
@@ -158,8 +158,8 @@ mesalink_connect_step1(struct connectdata *conn, int sockindex)
SSL_CONN_CONFIG(CApath))) {
if(SSL_CONN_CONFIG(verifypeer)) {
failf(data,
- "error setting certificate verify locations:\n"
- " CAfile: %s\n CApath: %s",
+ "error setting certificate verify locations: "
+ " CAfile: %s CApath: %s",
SSL_CONN_CONFIG(CAfile) ?
SSL_CONN_CONFIG(CAfile) : "none",
SSL_CONN_CONFIG(CApath) ?
@@ -173,20 +173,18 @@ mesalink_connect_step1(struct connectdata *conn, int sockindex)
else {
infof(data, "successfully set certificate verify locations:\n");
}
- infof(data,
- " CAfile: %s\n"
- " CApath: %s\n",
- SSL_CONN_CONFIG(CAfile)?
- SSL_CONN_CONFIG(CAfile): "none",
- SSL_CONN_CONFIG(CApath)?
- SSL_CONN_CONFIG(CApath): "none");
+ infof(data, " CAfile: %s\n",
+ SSL_CONN_CONFIG(CAfile) ? SSL_CONN_CONFIG(CAfile): "none");
+ infof(data, " CApath: %s\n",
+ SSL_CONN_CONFIG(CApath) ? SSL_CONN_CONFIG(CApath): "none");
}
- if(SSL_SET_OPTION(cert) && SSL_SET_OPTION(key)) {
+ if(SSL_SET_OPTION(primary.clientcert) && SSL_SET_OPTION(key)) {
int file_type = do_file_type(SSL_SET_OPTION(cert_type));
- if(SSL_CTX_use_certificate_chain_file(BACKEND->ctx, SSL_SET_OPTION(cert),
- file_type) != 1) {
+ if(SSL_CTX_use_certificate_chain_file(BACKEND->ctx,
+ SSL_SET_OPTION(primary.clientcert),
+ file_type) != 1) {
failf(data, "unable to use client certificate (no key or wrong pass"
" phrase?)");
return CURLE_SSL_CONNECT_ERROR;
diff --git a/lib/vtls/nss.c b/lib/vtls/nss.c
index 0f0d1ee6..d0988549 100644
--- a/lib/vtls/nss.c
+++ b/lib/vtls/nss.c
@@ -83,7 +83,7 @@ struct ssl_backend_data {
PRFileDesc *handle;
char *client_nickname;
struct Curl_easy *data;
- struct curl_llist obj_list;
+ struct Curl_llist obj_list;
PK11GenericObject *obj_clicert;
};
@@ -91,14 +91,14 @@ static PRLock *nss_initlock = NULL;
static PRLock *nss_crllock = NULL;
static PRLock *nss_findslot_lock = NULL;
static PRLock *nss_trustload_lock = NULL;
-static struct curl_llist nss_crl_list;
+static struct Curl_llist nss_crl_list;
static NSSInitContext *nss_context = NULL;
static volatile int initialized = 0;
/* type used to wrap pointers as list nodes */
struct ptr_list_wrap {
void *ptr;
- struct curl_llist_element node;
+ struct Curl_llist_element node;
};
struct cipher_s {
@@ -430,7 +430,7 @@ static PK11SlotInfo* nss_find_slot_by_name(const char *slot_name)
}
/* wrap 'ptr' as list node and tail-insert into 'list' */
-static CURLcode insert_wrapped_ptr(struct curl_llist *list, void *ptr)
+static CURLcode insert_wrapped_ptr(struct Curl_llist *list, void *ptr)
{
struct ptr_list_wrap *wrap = malloc(sizeof(*wrap));
if(!wrap)
@@ -1027,12 +1027,7 @@ static SECStatus BadCertHandler(void *arg, PRFileDesc *sock)
CERTCertificate *cert;
/* remember the cert verification result */
-#ifndef CURL_DISABLE_PROXY
- if(SSL_IS_PROXY())
- data->set.proxy_ssl.certverifyresult = err;
- else
-#endif
- data->set.ssl.certverifyresult = err;
+ SSL_SET_OPTION_LVALUE(certverifyresult) = err;
if(err == SSL_ERROR_BAD_CERT_DOMAIN && !SSL_CONN_CONFIG(verifyhost))
/* we are asked not to verify the host name */
@@ -1631,9 +1626,8 @@ static CURLcode nss_load_ca_certificates(struct connectdata *conn,
if(capath && !capath[0])
capath = NULL;
- infof(data, " CAfile: %s\n CApath: %s\n",
- cafile ? cafile : "none",
- capath ? capath : "none");
+ infof(data, " CAfile: %s\n", cafile ? cafile : "none");
+ infof(data, " CApath: %s\n", capath ? capath : "none");
/* load libnssckbi.so if no other trust roots were specified */
use_trust_module = !cafile && !capath;
@@ -1673,7 +1667,8 @@ static CURLcode nss_load_ca_certificates(struct connectdata *conn,
if(!dir)
return CURLE_SSL_CACERT_BADFILE;
- while((entry = PR_ReadDir(dir, PR_SKIP_BOTH | PR_SKIP_HIDDEN))) {
+ while((entry =
+ PR_ReadDir(dir, (PRDirFlags)(PR_SKIP_BOTH | PR_SKIP_HIDDEN)))) {
char *fullpath = aprintf("%s/%s", capath, entry->name);
if(!fullpath) {
PR_CloseDir(dir);
@@ -1838,12 +1833,6 @@ static CURLcode nss_setup_connect(struct connectdata *conn, int sockindex)
CURLcode result;
bool second_layer = FALSE;
SSLVersionRange sslver_supported;
-#ifndef CURL_DISABLE_PROXY
- const char *hostname = SSL_IS_PROXY() ? conn->http_proxy.host.name :
- conn->host.name;
-#else
- const char *hostname = conn->host.name;
-#endif
SSLVersionRange sslver = {
SSL_LIBRARY_VERSION_TLS_1_0, /* min */
@@ -1948,12 +1937,7 @@ static CURLcode nss_setup_connect(struct connectdata *conn, int sockindex)
goto error;
/* not checked yet */
-#ifndef CURL_DISABLE_PROXY
- if(SSL_IS_PROXY())
- data->set.proxy_ssl.certverifyresult = 0;
- else
-#endif
- data->set.ssl.certverifyresult = 0;
+ SSL_SET_OPTION_LVALUE(certverifyresult) = 0;
if(SSL_BadCertHook(model, BadCertHandler, conn) != SECSuccess)
goto error;
@@ -1981,14 +1965,15 @@ static CURLcode nss_setup_connect(struct connectdata *conn, int sockindex)
infof(data, " CRLfile: %s\n", SSL_SET_OPTION(CRLfile));
}
- if(SSL_SET_OPTION(cert)) {
- char *nickname = dup_nickname(data, SSL_SET_OPTION(cert));
+ if(SSL_SET_OPTION(primary.clientcert)) {
+ char *nickname = dup_nickname(data, SSL_SET_OPTION(primary.clientcert));
if(nickname) {
/* we are not going to use libnsspem.so to read the client cert */
backend->obj_clicert = NULL;
}
else {
- CURLcode rv = cert_stuff(conn, sockindex, SSL_SET_OPTION(cert),
+ CURLcode rv = cert_stuff(conn, sockindex,
+ SSL_SET_OPTION(primary.clientcert),
SSL_SET_OPTION(key));
if(rv) {
/* failf() is already done in cert_stuff() */
@@ -2124,11 +2109,11 @@ static CURLcode nss_setup_connect(struct connectdata *conn, int sockindex)
goto error;
/* propagate hostname to the TLS layer */
- if(SSL_SetURL(backend->handle, hostname) != SECSuccess)
+ if(SSL_SetURL(backend->handle, SSL_HOST_NAME()) != SECSuccess)
goto error;
/* prevent NSS from re-using the session for a different hostname */
- if(SSL_SetSockPeerID(backend->handle, hostname) != SECSuccess)
+ if(SSL_SetSockPeerID(backend->handle, SSL_HOST_NAME()) != SECSuccess)
goto error;
return CURLE_OK;
@@ -2147,18 +2132,6 @@ static CURLcode nss_do_connect(struct connectdata *conn, int sockindex)
struct Curl_easy *data = conn->data;
CURLcode result = CURLE_SSL_CONNECT_ERROR;
PRUint32 timeout;
-#ifndef CURL_DISABLE_PROXY
- long * const certverifyresult = SSL_IS_PROXY() ?
- &data->set.proxy_ssl.certverifyresult : &data->set.ssl.certverifyresult;
- const char * const pinnedpubkey = SSL_IS_PROXY() ?
- data->set.str[STRING_SSL_PINNEDPUBLICKEY_PROXY] :
- data->set.str[STRING_SSL_PINNEDPUBLICKEY_ORIG];
-#else
- long * const certverifyresult = &data->set.ssl.certverifyresult;
- const char * const pinnedpubkey =
- data->set.str[STRING_SSL_PINNEDPUBLICKEY_ORIG];
-#endif
-
/* check timeout situation */
const timediff_t time_left = Curl_timeleft(data, NULL, TRUE);
@@ -2174,9 +2147,9 @@ static CURLcode nss_do_connect(struct connectdata *conn, int sockindex)
if(PR_GetError() == PR_WOULD_BLOCK_ERROR)
/* blocking direction is updated by nss_update_connecting_state() */
return CURLE_AGAIN;
- else if(*certverifyresult == SSL_ERROR_BAD_CERT_DOMAIN)
+ else if(SSL_SET_OPTION(certverifyresult) == SSL_ERROR_BAD_CERT_DOMAIN)
result = CURLE_PEER_FAILED_VERIFICATION;
- else if(*certverifyresult != 0)
+ else if(SSL_SET_OPTION(certverifyresult) != 0)
result = CURLE_PEER_FAILED_VERIFICATION;
goto error;
}
@@ -2204,7 +2177,7 @@ static CURLcode nss_do_connect(struct connectdata *conn, int sockindex)
}
}
- result = cmp_peer_pubkey(connssl, pinnedpubkey);
+ result = cmp_peer_pubkey(connssl, SSL_PINNED_PUB_KEY());
if(result)
/* status already printed */
goto error;
diff --git a/lib/vtls/openssl.c b/lib/vtls/openssl.c
index 1685a4aa..28a1ae6d 100644
--- a/lib/vtls/openssl.c
+++ b/lib/vtls/openssl.c
@@ -34,6 +34,13 @@
/* Wincrypt must be included before anything that could include OpenSSL. */
#if defined(USE_WIN32_CRYPTO)
#include <wincrypt.h>
+/* Undefine wincrypt conflicting symbols for BoringSSL. */
+#undef X509_NAME
+#undef X509_EXTENSIONS
+#undef PKCS7_ISSUER_AND_SERIAL
+#undef PKCS7_SIGNER_INFO
+#undef OCSP_REQUEST
+#undef OCSP_RESPONSE
#endif
#include "urldata.h"
@@ -193,6 +200,10 @@
!defined(OPENSSL_IS_BORINGSSL))
#define HAVE_SSL_CTX_SET_CIPHERSUITES
#define HAVE_SSL_CTX_SET_POST_HANDSHAKE_AUTH
+/* SET_EC_CURVES available under the same preconditions: see
+ * https://www.openssl.org/docs/manmaster/man3/SSL_CTX_set1_groups.html
+ */
+#define HAVE_SSL_CTX_SET_EC_CURVES
#endif
#if defined(LIBRESSL_VERSION_NUMBER)
@@ -1571,16 +1582,8 @@ static CURLcode verifyhost(struct connectdata *conn, X509 *server_cert)
CURLcode result = CURLE_OK;
bool dNSName = FALSE; /* if a dNSName field exists in the cert */
bool iPAddress = FALSE; /* if a iPAddress field exists in the cert */
-#ifndef CURL_DISABLE_PROXY
- const char * const hostname = SSL_IS_PROXY() ?
- conn->http_proxy.host.name : conn->host.name;
- const char * const dispname = SSL_IS_PROXY() ?
- conn->http_proxy.host.dispname : conn->host.dispname;
-#else
- /* disabled proxy support */
- const char * const hostname = conn->host.name;
- const char * const dispname = conn->host.dispname;
-#endif
+ const char * const hostname = SSL_HOST_NAME();
+ const char * const dispname = SSL_HOST_DISPNAME();
#ifdef ENABLE_IPV6
if(conn->bits.ipv6_ip &&
@@ -2459,12 +2462,7 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME
bool sni;
-#ifndef CURL_DISABLE_PROXY
- const char * const hostname = SSL_IS_PROXY() ? conn->http_proxy.host.name :
- conn->host.name;
-#else
- const char * const hostname = conn->host.name;
-#endif
+ const char * const hostname = SSL_HOST_NAME();
#ifdef ENABLE_IPV6
struct in6_addr addr;
@@ -2472,18 +2470,12 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
struct in_addr addr;
#endif
#endif
-#ifndef CURL_DISABLE_PROXY
- long * const certverifyresult = SSL_IS_PROXY() ?
- &data->set.proxy_ssl.certverifyresult : &data->set.ssl.certverifyresult;
-#else
- long * const certverifyresult = &data->set.ssl.certverifyresult;
-#endif
const long int ssl_version = SSL_CONN_CONFIG(version);
-#ifdef USE_TLS_SRP
+#ifdef HAVE_OPENSSL_SRP
const enum CURL_TLSAUTH ssl_authtype = SSL_SET_OPTION(authtype);
#endif
- char * const ssl_cert = SSL_SET_OPTION(cert);
- const struct curl_blob *ssl_cert_blob = SSL_SET_OPTION(cert_blob);
+ char * const ssl_cert = SSL_SET_OPTION(primary.clientcert);
+ const struct curl_blob *ssl_cert_blob = SSL_SET_OPTION(primary.cert_blob);
const char * const ssl_cert_type = SSL_SET_OPTION(cert_type);
const char * const ssl_cafile = SSL_CONN_CONFIG(CAfile);
const char * const ssl_capath = SSL_CONN_CONFIG(CApath);
@@ -2500,7 +2492,7 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
if(result)
return result;
- *certverifyresult = !X509_V_OK;
+ SSL_SET_OPTION_LVALUE(certverifyresult) = !X509_V_OK;
/* check to see if we've been told to use an explicit SSL/TLS version */
@@ -2524,7 +2516,7 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
failf(data, OSSL_PACKAGE " was built without SSLv2 support");
return CURLE_NOT_BUILT_IN;
#else
-#ifdef USE_TLS_SRP
+#ifdef HAVE_OPENSSL_SRP
if(ssl_authtype == CURL_TLSAUTH_SRP)
return CURLE_SSL_CONNECT_ERROR;
#endif
@@ -2537,7 +2529,7 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
failf(data, OSSL_PACKAGE " was built without SSLv3 support");
return CURLE_NOT_BUILT_IN;
#else
-#ifdef USE_TLS_SRP
+#ifdef HAVE_OPENSSL_SRP
if(ssl_authtype == CURL_TLSAUTH_SRP)
return CURLE_SSL_CONNECT_ERROR;
#endif
@@ -2793,7 +2785,19 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
SSL_CTX_set_post_handshake_auth(backend->ctx, 1);
#endif
-#ifdef USE_TLS_SRP
+#ifdef HAVE_SSL_CTX_SET_EC_CURVES
+ {
+ char *curves = SSL_CONN_CONFIG(curves);
+ if(curves) {
+ if(!SSL_CTX_set1_curves_list(backend->ctx, curves)) {
+ failf(data, "failed setting curves list: '%s'", curves);
+ return CURLE_SSL_CIPHER;
+ }
+ }
+ }
+#endif
+
+#ifdef HAVE_OPENSSL_SRP
if(ssl_authtype == CURL_TLSAUTH_SRP) {
char * const ssl_username = SSL_SET_OPTION(username);
@@ -2910,7 +2914,7 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
/* "If GetLastError returns CRYPT_E_NOT_FOUND, the certificate is
good for all uses. If it returns zero, the certificate has no
valid uses." */
- if(GetLastError() != CRYPT_E_NOT_FOUND)
+ if((HRESULT)GetLastError() != CRYPT_E_NOT_FOUND)
continue;
}
else {
@@ -2970,7 +2974,7 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
{
if(ssl_cafile) {
if(!SSL_CTX_load_verify_file(backend->ctx, ssl_cafile)) {
- if(verifypeer) {
+ if(verifypeer && !imported_native_ca) {
/* Fail if we insist on successfully verifying the server. */
failf(data, "error setting certificate file: %s", ssl_cafile);
return CURLE_SSL_CACERT_BADFILE;
@@ -2978,11 +2982,11 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
/* Continue with a warning if no certificate verif is required. */
infof(data, "error setting certificate file, continuing anyway\n");
}
- infof(data, " CAfile: %s\n", ssl_cafile);
+ infof(data, " CAfile: %s\n", ssl_cafile);
}
if(ssl_capath) {
if(!SSL_CTX_load_verify_dir(backend->ctx, ssl_capath)) {
- if(verifypeer) {
+ if(verifypeer && !imported_native_ca) {
/* Fail if we insist on successfully verifying the server. */
failf(data, "error setting certificate path: %s", ssl_capath);
return CURLE_SSL_CACERT_BADFILE;
@@ -2990,7 +2994,7 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
/* Continue with a warning if no certificate verif is required. */
infof(data, "error setting certificate path, continuing anyway\n");
}
- infof(data, " CApath: %s\n", ssl_capath);
+ infof(data, " CApath: %s\n", ssl_capath);
}
}
#else
@@ -3000,8 +3004,8 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
if(!SSL_CTX_load_verify_locations(backend->ctx, ssl_cafile, ssl_capath)) {
if(verifypeer && !imported_native_ca) {
/* Fail if we insist on successfully verifying the server. */
- failf(data, "error setting certificate verify locations:\n"
- " CAfile: %s\n CApath: %s",
+ failf(data, "error setting certificate verify locations:"
+ " CAfile: %s CApath: %s",
ssl_cafile ? ssl_cafile : "none",
ssl_capath ? ssl_capath : "none");
return CURLE_SSL_CACERT_BADFILE;
@@ -3015,11 +3019,8 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
/* Everything is fine. */
infof(data, "successfully set certificate verify locations:\n");
}
- infof(data,
- " CAfile: %s\n"
- " CApath: %s\n",
- ssl_cafile ? ssl_cafile : "none",
- ssl_capath ? ssl_capath : "none");
+ infof(data, " CAfile: %s\n", ssl_cafile ? ssl_cafile : "none");
+ infof(data, " CApath: %s\n", ssl_capath ? ssl_capath : "none");
}
#endif
@@ -3201,12 +3202,6 @@ static CURLcode ossl_connect_step2(struct connectdata *conn, int sockindex)
struct Curl_easy *data = conn->data;
int err;
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
-#ifndef CURL_DISABLE_PROXY
- long * const certverifyresult = SSL_IS_PROXY() ?
- &data->set.proxy_ssl.certverifyresult : &data->set.ssl.certverifyresult;
-#else
- long * const certverifyresult = &data->set.ssl.certverifyresult;
-#endif
struct ssl_backend_data *backend = connssl->backend;
DEBUGASSERT(ssl_connect_2 == connssl->connecting_state
|| ssl_connect_2_reading == connssl->connecting_state
@@ -3265,12 +3260,13 @@ static CURLcode ossl_connect_step2(struct connectdata *conn, int sockindex)
reason = ERR_GET_REASON(errdetail);
if((lib == ERR_LIB_SSL) &&
- (reason == SSL_R_CERTIFICATE_VERIFY_FAILED)) {
+ ((reason == SSL_R_CERTIFICATE_VERIFY_FAILED) ||
+ (reason == SSL_R_SSLV3_ALERT_CERTIFICATE_EXPIRED))) {
result = CURLE_PEER_FAILED_VERIFICATION;
lerr = SSL_get_verify_result(backend->handle);
if(lerr != X509_V_OK) {
- *certverifyresult = lerr;
+ SSL_SET_OPTION_LVALUE(certverifyresult) = lerr;
msnprintf(error_buffer, sizeof(error_buffer),
"SSL certificate problem: %s",
X509_verify_cert_error_string(lerr));
@@ -3292,12 +3288,10 @@ static CURLcode ossl_connect_step2(struct connectdata *conn, int sockindex)
* the SO_ERROR is also lost.
*/
if(CURLE_SSL_CONNECT_ERROR == result && errdetail == 0) {
+ const char * const hostname = SSL_HOST_NAME();
#ifndef CURL_DISABLE_PROXY
- const char * const hostname = SSL_IS_PROXY() ?
- conn->http_proxy.host.name : conn->host.name;
const long int port = SSL_IS_PROXY() ? conn->port : conn->remote_port;
#else
- const char * const hostname = conn->host.name;
const long int port = conn->remote_port;
#endif
char extramsg[80]="";
@@ -3752,12 +3746,6 @@ static CURLcode servercert(struct connectdata *conn,
char error_buffer[256]="";
char buffer[2048];
const char *ptr;
-#ifndef CURL_DISABLE_PROXY
- long * const certverifyresult = SSL_IS_PROXY() ?
- &data->set.proxy_ssl.certverifyresult : &data->set.ssl.certverifyresult;
-#else
- long * const certverifyresult = &data->set.ssl.certverifyresult;
-#endif
BIO *mem = BIO_new(BIO_s_mem());
struct ssl_backend_data *backend = connssl->backend;
@@ -3878,9 +3866,9 @@ static CURLcode servercert(struct connectdata *conn,
X509_free(issuer);
}
- lerr = *certverifyresult = SSL_get_verify_result(backend->handle);
-
- if(*certverifyresult != X509_V_OK) {
+ lerr = SSL_get_verify_result(backend->handle);
+ SSL_SET_OPTION_LVALUE(certverifyresult) = lerr;
+ if(lerr != X509_V_OK) {
if(SSL_CONN_CONFIG(verifypeer)) {
/* We probably never reach this, because SSL_connect() will fail
and we return earlier if verifypeer is set? */
diff --git a/lib/vtls/schannel.c b/lib/vtls/schannel.c
index 1c1432d7..c7e4e793 100644
--- a/lib/vtls/schannel.c
+++ b/lib/vtls/schannel.c
@@ -346,6 +346,8 @@ set_ssl_ciphers(SCHANNEL_CRED *schannel_cred, char *ciphers)
}
#ifdef HAS_CLIENT_CERT_PATH
+
+/* Function allocates memory for store_path only if CURLE_OK is returned */
static CURLcode
get_cert_location(TCHAR *path, DWORD *store_name, TCHAR **store_path,
TCHAR **thumbprint)
@@ -388,16 +390,16 @@ get_cert_location(TCHAR *path, DWORD *store_name, TCHAR **store_path,
if(sep == NULL)
return CURLE_SSL_CERTPROBLEM;
+ *thumbprint = sep + 1;
+ if(_tcslen(*thumbprint) != CERT_THUMBPRINT_STR_LEN)
+ return CURLE_SSL_CERTPROBLEM;
+
*sep = TEXT('\0');
*store_path = _tcsdup(store_path_start);
*sep = TEXT('\\');
if(*store_path == NULL)
return CURLE_OUT_OF_MEMORY;
- *thumbprint = sep + 1;
- if(_tcslen(*thumbprint) != CERT_THUMBPRINT_STR_LEN)
- return CURLE_SSL_CERTPROBLEM;
-
return CURLE_OK;
}
#endif
@@ -418,7 +420,7 @@ schannel_connect_step1(struct connectdata *conn, int sockindex)
SCHANNEL_CRED schannel_cred;
PCCERT_CONTEXT client_certs[1] = { NULL };
SECURITY_STATUS sspi_status = SEC_E_OK;
- struct curl_schannel_cred *old_cred = NULL;
+ struct Curl_schannel_cred *old_cred = NULL;
struct in_addr addr;
#ifdef ENABLE_IPV6
struct in6_addr addr6;
@@ -588,7 +590,7 @@ schannel_connect_step1(struct connectdata *conn, int sockindex)
#ifdef HAS_CLIENT_CERT_PATH
/* client certificate */
- if(data->set.ssl.cert || data->set.ssl.cert_blob) {
+ if(data->set.ssl.primary.clientcert || data->set.ssl.primary.cert_blob) {
DWORD cert_store_name = 0;
TCHAR *cert_store_path = NULL;
TCHAR *cert_thumbprint_str = NULL;
@@ -598,27 +600,28 @@ schannel_connect_step1(struct connectdata *conn, int sockindex)
FILE *fInCert = NULL;
void *certdata = NULL;
size_t certsize = 0;
- bool blob = data->set.ssl.cert_blob != NULL;
+ bool blob = data->set.ssl.primary.cert_blob != NULL;
TCHAR *cert_path = NULL;
if(blob) {
- certdata = data->set.ssl.cert_blob->data;
- certsize = data->set.ssl.cert_blob->len;
+ certdata = data->set.ssl.primary.cert_blob->data;
+ certsize = data->set.ssl.primary.cert_blob->len;
}
else {
- cert_path = curlx_convert_UTF8_to_tchar(data->set.ssl.cert);
+ cert_path = curlx_convert_UTF8_to_tchar(
+ data->set.ssl.primary.clientcert);
if(!cert_path)
return CURLE_OUT_OF_MEMORY;
result = get_cert_location(cert_path, &cert_store_name,
&cert_store_path, &cert_thumbprint_str);
- if(result && (data->set.ssl.cert[0]!='\0'))
- fInCert = fopen(data->set.ssl.cert, "rb");
+ if(result && (data->set.ssl.primary.clientcert[0]!='\0'))
+ fInCert = fopen(data->set.ssl.primary.clientcert, "rb");
if(result && !fInCert) {
failf(data, "schannel: Failed to get certificate location"
" or file for %s",
- data->set.ssl.cert);
+ data->set.ssl.primary.clientcert);
curlx_unicodefree(cert_path);
return result;
}
@@ -628,7 +631,7 @@ schannel_connect_step1(struct connectdata *conn, int sockindex)
(!strcasecompare(data->set.ssl.cert_type, "P12"))) {
failf(data, "schannel: certificate format compatibility error "
" for %s",
- blob ? "(memory blob)" : data->set.ssl.cert);
+ blob ? "(memory blob)" : data->set.ssl.primary.clientcert);
curlx_unicodefree(cert_path);
return CURLE_SSL_CERTPROBLEM;
}
@@ -643,7 +646,7 @@ schannel_connect_step1(struct connectdata *conn, int sockindex)
size_t pwd_len = 0;
int str_w_len = 0;
const char *cert_showfilename_error = blob ?
- "(memory blob)" : data->set.ssl.cert;
+ "(memory blob)" : data->set.ssl.primary.clientcert;
curlx_unicodefree(cert_path);
if(fInCert) {
long cert_tell = 0;
@@ -664,7 +667,7 @@ schannel_connect_step1(struct connectdata *conn, int sockindex)
fclose(fInCert);
if(!continue_reading) {
failf(data, "schannel: Failed to read cert file %s",
- data->set.ssl.cert);
+ data->set.ssl.primary.clientcert);
free(certdata);
return CURLE_SSL_CERTPROBLEM;
}
@@ -771,15 +774,15 @@ schannel_connect_step1(struct connectdata *conn, int sockindex)
CertCloseStore(cert_store, 0);
}
#else
- if(data->set.ssl.cert) {
+ if(data->set.ssl.primary.clientcert || data->set.ssl.primary.cert_blob) {
failf(data, "schannel: client cert support not built in");
return CURLE_NOT_BUILT_IN;
}
#endif
/* allocate memory for the re-usable credential handle */
- BACKEND->cred = (struct curl_schannel_cred *)
- calloc(1, sizeof(struct curl_schannel_cred));
+ BACKEND->cred = (struct Curl_schannel_cred *)
+ calloc(1, sizeof(struct Curl_schannel_cred));
if(!BACKEND->cred) {
failf(data, "schannel: unable to allocate memory");
@@ -893,8 +896,8 @@ schannel_connect_step1(struct connectdata *conn, int sockindex)
ISC_REQ_STREAM;
/* allocate memory for the security context handle */
- BACKEND->ctxt = (struct curl_schannel_ctxt *)
- calloc(1, sizeof(struct curl_schannel_ctxt));
+ BACKEND->ctxt = (struct Curl_schannel_ctxt *)
+ calloc(1, sizeof(struct Curl_schannel_ctxt));
if(!BACKEND->ctxt) {
failf(data, "schannel: unable to allocate memory");
return CURLE_OUT_OF_MEMORY;
@@ -1178,6 +1181,10 @@ schannel_connect_step2(struct connectdata *conn, int sockindex)
failf(data, "schannel: SNI or certificate check failed: %s",
Curl_sspi_strerror(sspi_status, buffer, sizeof(buffer)));
return CURLE_PEER_FAILED_VERIFICATION;
+ case SEC_E_UNTRUSTED_ROOT:
+ failf(data, "schannel: %s",
+ Curl_sspi_strerror(sspi_status, buffer, sizeof(buffer)));
+ return CURLE_PEER_FAILED_VERIFICATION;
/*
case SEC_E_INVALID_HANDLE:
case SEC_E_INVALID_TOKEN:
@@ -1401,7 +1408,7 @@ schannel_connect_step3(struct connectdata *conn, int sockindex)
/* save the current session data for possible re-use */
if(SSL_SET_OPTION(primary.sessionid)) {
bool incache;
- struct curl_schannel_cred *old_cred = NULL;
+ struct Curl_schannel_cred *old_cred = NULL;
Curl_ssl_sessionid_lock(conn);
incache = !(Curl_ssl_getsessionid(conn, (void **)&old_cred, NULL,
@@ -1417,7 +1424,7 @@ schannel_connect_step3(struct connectdata *conn, int sockindex)
}
if(!incache) {
result = Curl_ssl_addsessionid(conn, (void *)BACKEND->cred,
- sizeof(struct curl_schannel_cred),
+ sizeof(struct Curl_schannel_cred),
sockindex);
if(result) {
Curl_ssl_sessionid_unlock(conn);
@@ -2099,7 +2106,7 @@ static void Curl_schannel_close(struct connectdata *conn, int sockindex)
static void Curl_schannel_session_free(void *ptr)
{
/* this is expected to be called under sessionid lock */
- struct curl_schannel_cred *cred = ptr;
+ struct Curl_schannel_cred *cred = ptr;
cred->refcount--;
if(cred->refcount == 0) {
diff --git a/lib/vtls/schannel.h b/lib/vtls/schannel.h
index ee8d7d47..f87bae8f 100644
--- a/lib/vtls/schannel.h
+++ b/lib/vtls/schannel.h
@@ -8,7 +8,7 @@
* \___|\___/|_| \_\_____|
*
* Copyright (C) 2012, Marc Hoersken, <info@marc-hoersken.de>, et al.
- * Copyright (C) 2012 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2012 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -70,20 +70,20 @@ CURLcode Curl_verify_certificate(struct connectdata *conn, int sockindex);
#endif
#endif
-struct curl_schannel_cred {
+struct Curl_schannel_cred {
CredHandle cred_handle;
TimeStamp time_stamp;
int refcount;
};
-struct curl_schannel_ctxt {
+struct Curl_schannel_ctxt {
CtxtHandle ctxt_handle;
TimeStamp time_stamp;
};
struct ssl_backend_data {
- struct curl_schannel_cred *cred;
- struct curl_schannel_ctxt *ctxt;
+ struct Curl_schannel_cred *cred;
+ struct Curl_schannel_ctxt *ctxt;
SecPkgContext_StreamSizes stream_sizes;
size_t encdata_length, decdata_length;
size_t encdata_offset, decdata_offset;
diff --git a/lib/vtls/sectransp.c b/lib/vtls/sectransp.c
index 2627aff1..af63df46 100644
--- a/lib/vtls/sectransp.c
+++ b/lib/vtls/sectransp.c
@@ -1397,11 +1397,16 @@ static CURLcode sectransp_connect_step1(struct connectdata *conn,
const char * const ssl_cafile = SSL_CONN_CONFIG(CAfile);
const struct curl_blob *ssl_cablob = NULL;
const bool verifypeer = SSL_CONN_CONFIG(verifypeer);
- char * const ssl_cert = SSL_SET_OPTION(cert);
- const struct curl_blob *ssl_cert_blob = SSL_SET_OPTION(cert_blob);
+ char * const ssl_cert = SSL_SET_OPTION(primary.clientcert);
+ const struct curl_blob *ssl_cert_blob = SSL_SET_OPTION(primary.cert_blob);
+#ifndef CURL_DISABLE_PROXY
const char * const hostname = SSL_IS_PROXY() ? conn->http_proxy.host.name :
conn->host.name;
const long int port = SSL_IS_PROXY() ? conn->port : conn->remote_port;
+#else
+ const char * const hostname = conn->host.name;
+ const long int port = conn->remote_port;
+#endif
#ifdef ENABLE_IPV6
struct in6_addr addr;
#else
@@ -1606,8 +1611,11 @@ static CURLcode sectransp_connect_step1(struct connectdata *conn,
&kCFTypeArrayCallBacks);
#ifdef USE_NGHTTP2
- if(data->set.httpversion >= CURL_HTTP_VERSION_2 &&
- (!SSL_IS_PROXY() || !conn->bits.tunnel_proxy)) {
+ if(data->set.httpversion >= CURL_HTTP_VERSION_2
+#ifndef CURL_DISABLE_PROXY
+ && (!SSL_IS_PROXY() || !conn->bits.tunnel_proxy)
+#endif
+ ) {
CFArrayAppendValue(alpnArr, CFSTR(NGHTTP2_PROTO_VERSION_ID));
infof(data, "ALPN, offering %s\n", NGHTTP2_PROTO_VERSION_ID);
}
@@ -2379,8 +2387,12 @@ sectransp_connect_step2(struct connectdata *conn, int sockindex)
OSStatus err;
SSLCipherSuite cipher;
SSLProtocol protocol = 0;
+#ifndef CURL_DISABLE_PROXY
const char * const hostname = SSL_IS_PROXY() ? conn->http_proxy.host.name :
conn->host.name;
+#else
+ const char * const hostname = conn->host.name;
+#endif
DEBUGASSERT(ssl_connect_2 == connssl->connecting_state
|| ssl_connect_2_reading == connssl->connecting_state
diff --git a/lib/vtls/vtls.c b/lib/vtls/vtls.c
index 281043aa..e65fb4f7 100644
--- a/lib/vtls/vtls.c
+++ b/lib/vtls/vtls.c
@@ -138,6 +138,7 @@ Curl_ssl_config_matches(struct ssl_primary_config *data,
Curl_safe_strcasecompare(data->egdsocket, needle->egdsocket) &&
Curl_safe_strcasecompare(data->cipher_list, needle->cipher_list) &&
Curl_safe_strcasecompare(data->cipher_list13, needle->cipher_list13) &&
+ Curl_safe_strcasecompare(data->curves, needle->curves) &&
Curl_safe_strcasecompare(data->pinned_key, needle->pinned_key))
return TRUE;
@@ -164,6 +165,7 @@ Curl_clone_primary_ssl_config(struct ssl_primary_config *source,
CLONE_STRING(cipher_list);
CLONE_STRING(cipher_list13);
CLONE_STRING(pinned_key);
+ CLONE_STRING(curves);
return TRUE;
}
@@ -179,6 +181,7 @@ void Curl_free_primary_ssl_config(struct ssl_primary_config *sslc)
Curl_safefree(sslc->cipher_list13);
Curl_safefree(sslc->pinned_key);
Curl_safefree(sslc->cert_blob);
+ Curl_safefree(sslc->curves);
}
#ifdef USE_SSL
@@ -362,7 +365,7 @@ bool Curl_ssl_getsessionid(struct connectdata *conn,
size_t *idsize, /* set 0 if unknown */
int sockindex)
{
- struct curl_ssl_session *check;
+ struct Curl_ssl_session *check;
struct Curl_easy *data = conn->data;
size_t i;
long *general_age;
@@ -429,7 +432,7 @@ bool Curl_ssl_getsessionid(struct connectdata *conn,
/*
* Kill a single session ID entry in the cache.
*/
-void Curl_ssl_kill_session(struct curl_ssl_session *session)
+void Curl_ssl_kill_session(struct Curl_ssl_session *session)
{
if(session->sessionid) {
/* defensive check */
@@ -456,7 +459,7 @@ void Curl_ssl_delsessionid(struct connectdata *conn, void *ssl_sessionid)
struct Curl_easy *data = conn->data;
for(i = 0; i < data->set.general_ssl.max_ssl_sessions; i++) {
- struct curl_ssl_session *check = &data->state.session[i];
+ struct Curl_ssl_session *check = &data->state.session[i];
if(check->sessionid == ssl_sessionid) {
Curl_ssl_kill_session(check);
@@ -478,7 +481,7 @@ CURLcode Curl_ssl_addsessionid(struct connectdata *conn,
{
size_t i;
struct Curl_easy *data = conn->data; /* the mother of all structs */
- struct curl_ssl_session *store = &data->state.session[0];
+ struct Curl_ssl_session *store = &data->state.session[0];
long oldest_age = data->state.session[0].age; /* zero if unused */
char *clone_host;
char *clone_conn_to_host;
@@ -664,13 +667,13 @@ struct curl_slist *Curl_ssl_engines_list(struct Curl_easy *data)
*/
CURLcode Curl_ssl_initsessions(struct Curl_easy *data, size_t amount)
{
- struct curl_ssl_session *session;
+ struct Curl_ssl_session *session;
if(data->state.session)
/* this is just a precaution to prevent multiple inits */
return CURLE_OK;
- session = calloc(amount, sizeof(struct curl_ssl_session));
+ session = calloc(amount, sizeof(struct Curl_ssl_session));
if(!session)
return CURLE_OUT_OF_MEMORY;
diff --git a/lib/vtls/vtls.h b/lib/vtls/vtls.h
index bcc84441..b86bdbc1 100644
--- a/lib/vtls/vtls.h
+++ b/lib/vtls/vtls.h
@@ -131,12 +131,26 @@ CURLcode Curl_none_md5sum(unsigned char *input, size_t inputlen,
CURL_SOCKET_BAD ? FIRSTSOCKET : SECONDARYSOCKET].state)
#define SSL_SET_OPTION(var) \
(SSL_IS_PROXY() ? data->set.proxy_ssl.var : data->set.ssl.var)
+#define SSL_SET_OPTION_LVALUE(var) \
+ (*(SSL_IS_PROXY() ? &data->set.proxy_ssl.var : &data->set.ssl.var))
#define SSL_CONN_CONFIG(var) \
(SSL_IS_PROXY() ? conn->proxy_ssl_config.var : conn->ssl_config.var)
+#define SSL_HOST_NAME() \
+ (SSL_IS_PROXY() ? conn->http_proxy.host.name : conn->host.name)
+#define SSL_HOST_DISPNAME() \
+ (SSL_IS_PROXY() ? conn->http_proxy.host.dispname : conn->host.dispname)
+#define SSL_PINNED_PUB_KEY() (SSL_IS_PROXY() \
+ ? data->set.str[STRING_SSL_PINNEDPUBLICKEY_PROXY] \
+ : data->set.str[STRING_SSL_PINNEDPUBLICKEY_ORIG])
#else
#define SSL_IS_PROXY() FALSE
#define SSL_SET_OPTION(var) data->set.ssl.var
+#define SSL_SET_OPTION_LVALUE(var) data->set.ssl.var
#define SSL_CONN_CONFIG(var) conn->ssl_config.var
+#define SSL_HOST_NAME() conn->host.name
+#define SSL_HOST_DISPNAME() conn->host.dispname
+#define SSL_PINNED_PUB_KEY() \
+ data->set.str[STRING_SSL_PINNEDPUBLICKEY_ORIG]
#endif
bool Curl_ssl_config_matches(struct ssl_primary_config *data,
@@ -221,7 +235,7 @@ CURLcode Curl_ssl_addsessionid(struct connectdata *conn,
* take sessionid object ownership from sessionid cache
* (e.g. decrement refcount).
*/
-void Curl_ssl_kill_session(struct curl_ssl_session *session);
+void Curl_ssl_kill_session(struct Curl_ssl_session *session);
/* delete a session from the cache
* Sessionid mutex must be locked (see Curl_ssl_sessionid_lock).
* This will call engine-specific curlssl_session_free function, which must
diff --git a/lib/vtls/wolfssl.c b/lib/vtls/wolfssl.c
index 7b2a124e..a299b99d 100644
--- a/lib/vtls/wolfssl.c
+++ b/lib/vtls/wolfssl.c
@@ -353,8 +353,8 @@ wolfssl_connect_step1(struct connectdata *conn,
SSL_CONN_CONFIG(CApath))) {
if(SSL_CONN_CONFIG(verifypeer)) {
/* Fail if we insist on successfully verifying the server. */
- failf(data, "error setting certificate verify locations:\n"
- " CAfile: %s\n CApath: %s",
+ failf(data, "error setting certificate verify locations:"
+ " CAfile: %s CApath: %s",
SSL_CONN_CONFIG(CAfile)?
SSL_CONN_CONFIG(CAfile): "none",
SSL_CONN_CONFIG(CApath)?
@@ -372,21 +372,19 @@ wolfssl_connect_step1(struct connectdata *conn,
/* Everything is fine. */
infof(data, "successfully set certificate verify locations:\n");
}
- infof(data,
- " CAfile: %s\n"
- " CApath: %s\n",
- SSL_CONN_CONFIG(CAfile) ? SSL_CONN_CONFIG(CAfile):
- "none",
- SSL_CONN_CONFIG(CApath) ? SSL_CONN_CONFIG(CApath):
- "none");
+ infof(data, " CAfile: %s\n",
+ SSL_CONN_CONFIG(CAfile) ? SSL_CONN_CONFIG(CAfile) : "none");
+ infof(data, " CApath: %s\n",
+ SSL_CONN_CONFIG(CApath) ? SSL_CONN_CONFIG(CApath) : "none");
}
/* Load the client certificate, and private key */
- if(SSL_SET_OPTION(cert) && SSL_SET_OPTION(key)) {
+ if(SSL_SET_OPTION(primary.clientcert) && SSL_SET_OPTION(key)) {
int file_type = do_file_type(SSL_SET_OPTION(cert_type));
- if(SSL_CTX_use_certificate_file(backend->ctx, SSL_SET_OPTION(cert),
- file_type) != 1) {
+ if(SSL_CTX_use_certificate_file(backend->ctx,
+ SSL_SET_OPTION(primary.clientcert),
+ file_type) != 1) {
failf(data, "unable to use client certificate (no key or wrong pass"
" phrase?)");
return CURLE_SSL_CONNECT_ERROR;
diff --git a/lib/wildcard.h b/lib/wildcard.h
index 306c8c99..f090826f 100644
--- a/lib/wildcard.h
+++ b/lib/wildcard.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2010 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2010 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -39,18 +39,18 @@ typedef enum {
CURLWC_ERROR, /* error cases */
CURLWC_DONE /* if is wildcard->state == CURLWC_DONE wildcard loop
will end */
-} curl_wildcard_states;
+} wildcard_states;
-typedef void (*curl_wildcard_dtor)(void *ptr);
+typedef void (*wildcard_dtor)(void *ptr);
/* struct keeping information about wildcard download process */
struct WildcardData {
- curl_wildcard_states state;
+ wildcard_states state;
char *path; /* path to the directory, where we trying wildcard-match */
char *pattern; /* wildcard pattern */
- struct curl_llist filelist; /* llist with struct Curl_fileinfo */
+ struct Curl_llist filelist; /* llist with struct Curl_fileinfo */
void *protdata; /* pointer to protocol specific temporary data */
- curl_wildcard_dtor dtor;
+ wildcard_dtor dtor;
void *customptr; /* for CURLOPT_CHUNK_DATA pointer */
};
diff --git a/local-configure.patch b/local-configure.patch
index c18467d8..fc068599 100644
--- a/local-configure.patch
+++ b/local-configure.patch
@@ -2,7 +2,7 @@ Index: curl/lib/curl_config.h
===================================================================
--- curl.orig/lib/curl_config.h
+++ curl/lib/curl_config.h
-@@ -472,7 +472,7 @@
+@@ -478,7 +478,7 @@
#define HAVE_NETDB_H 1
/* Define to 1 if you have the <netinet/in6.h> header file. */
@@ -11,7 +11,7 @@ Index: curl/lib/curl_config.h
/* Define to 1 if you have the <netinet/in.h> header file. */
#define HAVE_NETINET_IN_H 1
-@@ -515,7 +515,7 @@
+@@ -521,7 +521,7 @@
#define HAVE_OPENSSL_RSA_H 1
/* if you have the function SRP_Calc_client_key */
@@ -20,7 +20,7 @@ Index: curl/lib/curl_config.h
/* Define to 1 if you have the <openssl/ssl.h> header file. */
#define HAVE_OPENSSL_SSL_H 1
-@@ -856,9 +856,6 @@
+@@ -862,9 +862,6 @@
/* Define absolute filename for winbind's ntlm_auth helper. */
/* #undef NTLM_WB_FILE */
@@ -30,7 +30,7 @@ Index: curl/lib/curl_config.h
/* Name of package */
#define PACKAGE "curl"
-@@ -914,7 +911,7 @@
+@@ -920,7 +917,7 @@
#define SELECT_TYPE_ARG5 struct timeval *
/* Define to the function return type for select. */
@@ -39,7 +39,7 @@ Index: curl/lib/curl_config.h
/* Define to the type qualifier of arg 2 for send. */
#define SEND_QUAL_ARG2 const
-@@ -940,24 +937,9 @@
+@@ -946,24 +943,9 @@
/* The number of bytes in type int */
#define SIZEOF_INT 4
@@ -64,7 +64,7 @@ Index: curl/lib/curl_config.h
/* Define to 1 if you have the ANSI C header files. */
#define STDC_HEADERS 1
-@@ -1052,7 +1034,7 @@
+@@ -1058,7 +1040,7 @@
/* #undef USE_THREADS_WIN32 */
/* Use TLS-SRP authentication */
@@ -73,7 +73,7 @@ Index: curl/lib/curl_config.h
/* Use Unix domain sockets */
#define USE_UNIX_SOCKETS 1
-@@ -1097,7 +1079,7 @@
+@@ -1103,7 +1085,7 @@
#endif
/* Number of bits in a file offset, on hosts where this is settable. */
diff --git a/m4/curl-compilers.m4 b/m4/curl-compilers.m4
index 107dc6ab..7d59f066 100644
--- a/m4/curl-compilers.m4
+++ b/m4/curl-compilers.m4
@@ -945,6 +945,10 @@ AC_DEFUN([CURL_SET_COMPILER_WARNING_OPTS], [
tmp_CFLAGS="$tmp_CFLAGS -Wno-varargs"
fi
fi
+ dnl clang 7 or later
+ if test "$compiler_num" -ge "700"; then
+ CURL_ADD_COMPILER_WARNINGS([tmp_CFLAGS], [assign-enum])
+ fi
fi
;;
#
@@ -1119,6 +1123,10 @@ AC_DEFUN([CURL_SET_COMPILER_WARNING_OPTS], [
fi
fi
fi
+ dnl Only gcc 10 or later
+ if test "$compiler_num" -ge "1000"; then
+ CURL_ADD_COMPILER_WARNINGS([tmp_CFLAGS], [enum-conversion])
+ fi
;;
#
HP_UX_C)
diff --git a/m4/curl-confopts.m4 b/m4/curl-confopts.m4
index eaae5b9c..5f877133 100644
--- a/m4/curl-confopts.m4
+++ b/m4/curl-confopts.m4
@@ -649,37 +649,37 @@ AC_DEFUN([CURL_CHECK_NTLM_WB], [
fi
])
-dnl CURL_CHECK_OPTION_ESNI
+dnl CURL_CHECK_OPTION_ECH
dnl -----------------------------------------------------
dnl Verify whether configure has been invoked with option
-dnl --enable-esni or --disable-esni, and set
-dnl shell variable want_esni as appropriate.
-
-AC_DEFUN([CURL_CHECK_OPTION_ESNI], [
- AC_MSG_CHECKING([whether to enable ESNI support])
- OPT_ESNI="default"
- AC_ARG_ENABLE(esni,
-AC_HELP_STRING([--enable-esni],[Enable ESNI support])
-AC_HELP_STRING([--disable-esni],[Disable ESNI support]),
- OPT_ESNI=$enableval)
- case "$OPT_ESNI" in
+dnl --enable-ech or --disable-ech, and set
+dnl shell variable want_ech as appropriate.
+
+AC_DEFUN([CURL_CHECK_OPTION_ECH], [
+ AC_MSG_CHECKING([whether to enable ECH support])
+ OPT_ECH="default"
+ AC_ARG_ENABLE(ech,
+AC_HELP_STRING([--enable-ech],[Enable ECH support])
+AC_HELP_STRING([--disable-ech],[Disable ECH support]),
+ OPT_ECH=$enableval)
+ case "$OPT_ECH" in
no)
- dnl --disable-esni option used
- want_esni="no"
- curl_esni_msg="no (--enable-esni)"
+ dnl --disable-ech option used
+ want_ech="no"
+ curl_ech_msg="no (--enable-ech)"
AC_MSG_RESULT([no])
;;
default)
dnl configure option not specified
- want_esni="no"
- curl_esni_msg="no (--enable-esni)"
+ want_ech="no"
+ curl_ech_msg="no (--enable-ech)"
AC_MSG_RESULT([no])
;;
*)
- dnl --enable-esni option used
- want_esni="yes"
- curl_esni_msg="enabled (--disable-esni)"
- experimental="esni"
+ dnl --enable-ech option used
+ want_ech="yes"
+ curl_ech_msg="enabled (--disable-ech)"
+ experimental="ech"
AC_MSG_RESULT([yes])
;;
esac
diff --git a/m4/libtool.m4 b/m4/libtool.m4
index 3a03d845..a6d21ae5 100644
--- a/m4/libtool.m4
+++ b/m4/libtool.m4
@@ -4124,7 +4124,7 @@ static const void *lt_preloaded_setup() {
#endif
_LT_EOF
# Now try linking the two files.
- mv -f conftest.$ac_objext conftstm.$ac_objext
+ mv conftest.$ac_objext conftstm.$ac_objext
lt_globsym_save_LIBS=$LIBS
lt_globsym_save_CFLAGS=$CFLAGS
LIBS=conftstm.$ac_objext
@@ -5683,9 +5683,9 @@ _LT_EOF
hpux9*)
if test yes = "$GCC"; then
- _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv -f $output_objdir/$soname $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
else
- _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv -f $output_objdir/$soname $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
fi
_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
_LT_TAGVAR(hardcode_libdir_separator, $1)=:
@@ -6811,7 +6811,7 @@ if test yes != "$_lt_caught_CXX_error"; then
_LT_TAGVAR(ld_shlibs, $1)=no
;;
aCC*)
- _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv -f $output_objdir/$soname $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
# Commands to make compiler produce verbose output that lists
# what "hidden" libraries, object files and flags are used when
# linking a shared library.
@@ -6824,7 +6824,7 @@ if test yes != "$_lt_caught_CXX_error"; then
;;
*)
if test yes = "$GXX"; then
- _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv -f $output_objdir/$soname $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
else
# FIXME: insert proper C++ library support
_LT_TAGVAR(ld_shlibs, $1)=no
@@ -6960,8 +6960,8 @@ if test yes != "$_lt_caught_CXX_error"; then
# KCC will only create a shared library if the output file
# ends with ".so" (or ".sl" for HP-UX), so rename the library
# to its proper name (with version) after linking.
- _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv -f \$templib $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv -f \$templib $lib'
+ _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib'
# Commands to make compiler produce verbose output that lists
# what "hidden" libraries, object files and flags are used when
# linking a shared library.
@@ -7159,7 +7159,7 @@ if test yes != "$_lt_caught_CXX_error"; then
# KCC will only create a shared library if the output file
# ends with ".so" (or ".sl" for HP-UX), so rename the library
# to its proper name (with version) after linking.
- _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv -f \$templib $lib'
+ _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
_LT_TAGVAR(hardcode_libdir_separator, $1)=:
@@ -8270,7 +8270,7 @@ for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
fi
while true; do
cat conftest.in conftest.in >conftest.tmp
- mv -f conftest.tmp conftest.in
+ mv conftest.tmp conftest.in
cp conftest.in conftest.nl
echo >>conftest.nl
$lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
diff --git a/packages/Makefile.am b/packages/Makefile.am
index d8a92abb..0fc58562 100644
--- a/packages/Makefile.am
+++ b/packages/Makefile.am
@@ -37,16 +37,6 @@ EXTRA_DIST = README \
OS400/makefile.sh \
OS400/os400sys.c \
OS400/os400sys.h \
- Symbian/bwins/libcurlu.def \
- Symbian/eabi/libcurlu.def \
- Symbian/group/bld.inf \
- Symbian/group/curl.iby \
- Symbian/group/curl.mmp \
- Symbian/group/curl.pkg \
- Symbian/group/libcurl.iby \
- Symbian/group/libcurl.mmp \
- Symbian/group/libcurl.pkg \
- Symbian/readme.txt \
TPF/curl.mak \
TPF/maketpf.env_curl \
TPF/maketpf.env_curllib \
diff --git a/packages/Symbian/bwins/libcurlu.def b/packages/Symbian/bwins/libcurlu.def
deleted file mode 100644
index 7f30b7fe..00000000
--- a/packages/Symbian/bwins/libcurlu.def
+++ /dev/null
@@ -1,60 +0,0 @@
-EXPORTS
- curl_easy_cleanup @ 1 NONAME
- curl_easy_duphandle @ 2 NONAME
- curl_easy_escape @ 3 NONAME
- curl_easy_getinfo @ 4 NONAME
- curl_easy_init @ 5 NONAME
- curl_easy_pause @ 6 NONAME
- curl_easy_perform @ 7 NONAME
- curl_easy_reset @ 8 NONAME
- curl_easy_setopt @ 9 NONAME
- curl_easy_strerror @ 10 NONAME
- curl_easy_unescape @ 11 NONAME
- curl_escape @ 12 NONAME
- curl_formadd @ 13 NONAME
- curl_formfree @ 14 NONAME
- curl_formget @ 15 NONAME
- curl_free @ 16 NONAME
- curl_getdate @ 17 NONAME
- curl_getenv @ 18 NONAME
- curl_global_cleanup @ 19 NONAME
- curl_global_init @ 20 NONAME
- curl_global_init_mem @ 21 NONAME
- curl_maprintf @ 22 NONAME
- curl_mfprintf @ 23 NONAME
- curl_mprintf @ 24 NONAME
- curl_msnprintf @ 25 NONAME
- curl_msprintf @ 26 NONAME
- curl_multi_add_handle @ 27 NONAME
- curl_multi_assign @ 28 NONAME
- curl_multi_cleanup @ 29 NONAME
- curl_multi_fdset @ 30 NONAME
- curl_multi_info_read @ 31 NONAME
- curl_multi_init @ 32 NONAME
- curl_multi_perform @ 33 NONAME
- curl_multi_remove_handle @ 34 NONAME
- curl_multi_setopt @ 35 NONAME
- curl_multi_socket @ 36 NONAME
- curl_multi_socket_action @ 37 NONAME
- curl_multi_socket_all @ 38 NONAME
- curl_multi_strerror @ 39 NONAME
- curl_multi_timeout @ 40 NONAME
- curl_mvaprintf @ 41 NONAME
- curl_mvfprintf @ 42 NONAME
- curl_mvprintf @ 43 NONAME
- curl_mvsnprintf @ 44 NONAME
- curl_mvsprintf @ 45 NONAME
- curl_share_cleanup @ 46 NONAME
- curl_share_init @ 47 NONAME
- curl_share_setopt @ 48 NONAME
- curl_share_strerror @ 49 NONAME
- curl_slist_append @ 50 NONAME
- curl_slist_free_all @ 51 NONAME
- curl_strequal @ 52 NONAME
- curl_strnequal @ 53 NONAME
- curl_unescape @ 54 NONAME
- curl_version @ 55 NONAME
- curl_version_info @ 56 NONAME
- curl_easy_recv @ 57 NONAME
- curl_easy_send @ 58 NONAME
- curl_multi_wait @ 59 NONAME
diff --git a/packages/Symbian/eabi/libcurlu.def b/packages/Symbian/eabi/libcurlu.def
deleted file mode 100644
index 7f30b7fe..00000000
--- a/packages/Symbian/eabi/libcurlu.def
+++ /dev/null
@@ -1,60 +0,0 @@
-EXPORTS
- curl_easy_cleanup @ 1 NONAME
- curl_easy_duphandle @ 2 NONAME
- curl_easy_escape @ 3 NONAME
- curl_easy_getinfo @ 4 NONAME
- curl_easy_init @ 5 NONAME
- curl_easy_pause @ 6 NONAME
- curl_easy_perform @ 7 NONAME
- curl_easy_reset @ 8 NONAME
- curl_easy_setopt @ 9 NONAME
- curl_easy_strerror @ 10 NONAME
- curl_easy_unescape @ 11 NONAME
- curl_escape @ 12 NONAME
- curl_formadd @ 13 NONAME
- curl_formfree @ 14 NONAME
- curl_formget @ 15 NONAME
- curl_free @ 16 NONAME
- curl_getdate @ 17 NONAME
- curl_getenv @ 18 NONAME
- curl_global_cleanup @ 19 NONAME
- curl_global_init @ 20 NONAME
- curl_global_init_mem @ 21 NONAME
- curl_maprintf @ 22 NONAME
- curl_mfprintf @ 23 NONAME
- curl_mprintf @ 24 NONAME
- curl_msnprintf @ 25 NONAME
- curl_msprintf @ 26 NONAME
- curl_multi_add_handle @ 27 NONAME
- curl_multi_assign @ 28 NONAME
- curl_multi_cleanup @ 29 NONAME
- curl_multi_fdset @ 30 NONAME
- curl_multi_info_read @ 31 NONAME
- curl_multi_init @ 32 NONAME
- curl_multi_perform @ 33 NONAME
- curl_multi_remove_handle @ 34 NONAME
- curl_multi_setopt @ 35 NONAME
- curl_multi_socket @ 36 NONAME
- curl_multi_socket_action @ 37 NONAME
- curl_multi_socket_all @ 38 NONAME
- curl_multi_strerror @ 39 NONAME
- curl_multi_timeout @ 40 NONAME
- curl_mvaprintf @ 41 NONAME
- curl_mvfprintf @ 42 NONAME
- curl_mvprintf @ 43 NONAME
- curl_mvsnprintf @ 44 NONAME
- curl_mvsprintf @ 45 NONAME
- curl_share_cleanup @ 46 NONAME
- curl_share_init @ 47 NONAME
- curl_share_setopt @ 48 NONAME
- curl_share_strerror @ 49 NONAME
- curl_slist_append @ 50 NONAME
- curl_slist_free_all @ 51 NONAME
- curl_strequal @ 52 NONAME
- curl_strnequal @ 53 NONAME
- curl_unescape @ 54 NONAME
- curl_version @ 55 NONAME
- curl_version_info @ 56 NONAME
- curl_easy_recv @ 57 NONAME
- curl_easy_send @ 58 NONAME
- curl_multi_wait @ 59 NONAME
diff --git a/packages/Symbian/group/bld.inf b/packages/Symbian/group/bld.inf
deleted file mode 100644
index 354a8438..00000000
--- a/packages/Symbian/group/bld.inf
+++ /dev/null
@@ -1,10 +0,0 @@
-//
-// libcurl and curl bld.inf file for Symbian OS
-//
-PRJ_EXPORTS
- libcurl.iby /epoc32/rom/include/libcurl.iby
- curl.iby /epoc32/rom/include/curl.iby
-
-PRJ_MMPFILES
- libcurl.mmp
- curl.mmp
diff --git a/packages/Symbian/group/curl.iby b/packages/Symbian/group/curl.iby
deleted file mode 100644
index 7921aaa0..00000000
--- a/packages/Symbian/group/curl.iby
+++ /dev/null
@@ -1,15 +0,0 @@
-//
-// curl file transfer utility command-line utility
-//
-// Use this file with buildrom to add curl to a device ROM
-//
-
-#ifndef CURL_IBY
-#define CURL_IBY
-
-#include <openenv.iby>
-#include <libcurl.iby>
-
-file=ABI_DIR\BUILD_DIR\curl.exe \sys\bin\curl.exe
-
-#endif // CURL_IBY
diff --git a/packages/Symbian/group/curl.mmp b/packages/Symbian/group/curl.mmp
deleted file mode 100644
index 361e0a62..00000000
--- a/packages/Symbian/group/curl.mmp
+++ /dev/null
@@ -1,64 +0,0 @@
-//
-// curl network retrieval client
-//
-
-TARGET curl.exe
-TARGETTYPE exe
-UID 0x00000000 0xF0206442
-
-SOURCEPATH ../../../src
-SOURCE \
- tool_binmode.c \
- tool_bname.c \
- tool_cb_dbg.c \
- tool_cb_hdr.c \
- tool_cb_prg.c \
- tool_cb_rea.c \
- tool_cb_see.c \
- tool_cb_wrt.c \
- tool_cfgable.c \
- tool_convert.c \
- tool_dirhie.c \
- tool_doswin.c \
- tool_easysrc.c \
- tool_formparse.c \
- tool_getparam.c \
- tool_getpass.c \
- tool_help.c \
- tool_helpers.c \
- tool_homedir.c \
- tool_hugehelp.c \
- tool_libinfo.c \
- tool_main.c \
- tool_metalink.c \
- tool_mfiles.c \
- tool_msgs.c \
- tool_operate.c \
- tool_operhlp.c \
- tool_panykey.c \
- tool_paramhlp.c \
- tool_parsecfg.c \
- tool_setopt.c \
- tool_sleep.c \
- tool_urlglob.c \
- tool_util.c \
- tool_vms.c \
- tool_writeenv.c \
- tool_writeout.c \
- tool_writeout_json.c \
- tool_xattr.c
-
-SOURCEPATH ../../../lib
-SOURCE \
- strcase.c nonblock.c
-
-USERINCLUDE ../../../src ../../../lib ../../../include/curl
-
-SYSTEMINCLUDE ../../../include /epoc32/include /epoc32/include/stdapis
-
-LIBRARY euser.lib libc.lib libcurl.lib
-STATICLIBRARY libcrt0.lib
-
-CAPABILITY NetworkServices
-
-EPOCSTACKSIZE 0x8000
diff --git a/packages/Symbian/group/curl.pkg b/packages/Symbian/group/curl.pkg
deleted file mode 100644
index 17c64f1e..00000000
--- a/packages/Symbian/group/curl.pkg
+++ /dev/null
@@ -1,26 +0,0 @@
-; curl package definition file
-; Use with makesis to create a Symbian .sis package
-
-;Language - standard language definitions
-&EN
-
-;Header - standard sis file header including version number
-;Version scheme: curl's major, curl's minor, curl's subminor*100 + build number
-; e.g. The third Symbian package of curl ver. 7.20.1 would have a SIS package
-; version of 7, 20, 103
-#{"curl"}, (0xF0206442), 7, 20, <please_update_version>, TYPE=SA
-
-; Vendor name
-%{"curl project"}
-:"curl project"
-
-; Embedded component
-@"libcurl.sis",(0xF0206D00)
-
-; A dependency on P.I.P.S. and the stdio server are probably good to have here
-;(0x20009A80), *, *, *, {"Open C Standard Libraries"}
-;(0x20009A81), *, *, *, {"P.I.P.S. for UIQ 3"}
-;(0x20009AA2), *, *, *, {"Symbian OS STDIOSERVER"}
-
-;Files - standard file specifications
-"\epoc32\release\armv5\urel\curl.exe" - "$:\sys\bin\curl.exe"
diff --git a/packages/Symbian/group/libcurl.iby b/packages/Symbian/group/libcurl.iby
deleted file mode 100644
index 373f5b37..00000000
--- a/packages/Symbian/group/libcurl.iby
+++ /dev/null
@@ -1,14 +0,0 @@
-//
-// libcurl file transfer DLL
-//
-// Use this file with buildrom to add libcurl to a device ROM
-//
-
-#ifndef LIBCURL_IBY
-#define LIBCURL_IBY
-
-#include <openenv.iby>
-
-file=ABI_DIR\BUILD_DIR\libcurl.dll \sys\bin\libcurl.dll
-
-#endif // LIBCURL_IBY
diff --git a/packages/Symbian/group/libcurl.mmp b/packages/Symbian/group/libcurl.mmp
deleted file mode 100644
index c10305a8..00000000
--- a/packages/Symbian/group/libcurl.mmp
+++ /dev/null
@@ -1,67 +0,0 @@
-//
-// libcurl.dll curl network retrieval client library
-//
-
-// Build-time options (uncomment these to enable)
-#define ENABLE_ZLIB // Enable gzip/deflate decompression
-//#define ENABLE_SSL // Enable SSL for HTTPS/FTPS (requires S60 Open C SDK)
-
-TARGET libcurl.dll
-TARGETTYPE dll
-UID 0x1000008d 0xF0206D00
-
-MACRO BUILDING_LIBCURL
-
-#ifdef ENABLE_ZLIB
-MACRO HAVE_LIBZ
-#endif
-#ifdef ENABLE_SSL
-MACRO USE_OPENSSL
-#endif
-
-SOURCEPATH ../../../lib
-SOURCE \
- file.c timeval.c base64.c hostip.c progress.c formdata.c \
- cookie.c http.c sendf.c ftp.c url.c dict.c if2ip.c speedcheck.c \
- ldap.c vtls/openssl.c version.c getenv.c escape.c mprintf.c telnet.c \
- netrc.c getinfo.c transfer.c strequal.c easy.c security.c krb4.c \
- curl_fnmatch.c fileinfo.c ftplistparser.c wildcard.c krb5.c \
- memdebug.c http_chunks.c strtok.c connect.c llist.c hash.c multi.c \
- content_encoding.c share.c http_digest.c md4.c md5.c curl_rand.c \
- http_negotiate.c inet_pton.c strtoofft.c strerror.c amigaos.c \
- hostasyn.c hostip4.c hostip6.c hostsyn.c inet_ntop.c parsedate.c \
- select.c vtls/gtls.c vtls/vtls.c tftp.c splay.c strdup.c socks.c \
- ssh.c vtls/nss.c strcase.c curl_addrinfo.c socks_gssapi.c \
- socks_sspi.c curl_sspi.c slist.c nonblock.c curl_memrchr.c imap.c \
- pop3.c smtp.c pingpong.c rtsp.c curl_threads.c warnless.c hmac.c \
- curl_rtmp.c openldap.c curl_gethostname.c gopher.c \
- idn_win32.c vtls/cyassl.c http_proxy.c non-ascii.c \
- asyn-ares.c asyn-thread.c curl_gssapi.c http_ntlm.c curl_ntlm_wb.c \
- curl_ntlm_core.c curl_sasl.c vtls/schannel.c curl_multibyte.c \
- conncache.c curl_sasl_sspi.c smb.c curl_endian.c \
- curl_des.c curl_range.c system_win32.c sha256.c \
- vauth/vauth.c vauth/cleartext.c vauth/cram.c vauth/digest.c \
- vauth/digest_sspi.c vauth/krb5_gssapi.c vauth/krb5_sspi.c \
- vauth/ntlm.c vauth/ntlm_sspi.c vauth/oauth2.c vauth/spnego_gssapi.c \
- vauth/spnego_sspi.c
-
-USERINCLUDE ../../../lib ../../../include/curl
-#ifdef ENABLE_SSL
-SYSTEMINCLUDE /epoc32/include/osextensions/stdapis
-// Older versions of the SDK need this instead:
-//USERINCLUDE /epoc32/include/stdapis/openssl
-#endif
-
-SYSTEMINCLUDE ../../../include /epoc32/include/stdapis /epoc32/include
-
-LIBRARY euser.lib libc.lib
-#ifdef ENABLE_ZLIB
-LIBRARY ezlib.lib
-#endif
-#ifdef ENABLE_SSL
-LIBRARY libssl.lib libcrypto.lib
-#endif
-
-CAPABILITY NetworkServices
-
-EPOCALLOWDLLDATA
diff --git a/packages/Symbian/group/libcurl.pkg b/packages/Symbian/group/libcurl.pkg
deleted file mode 100644
index 6b047975..00000000
--- a/packages/Symbian/group/libcurl.pkg
+++ /dev/null
@@ -1,22 +0,0 @@
-; libcurl package definition file
-; Use with makesis to create a Symbian .sis package
-
-;Language - standard language definitions
-&EN
-
-;Header - standard sis file header including version number
-;Version scheme: curl's major, curl's minor, curl's subminor*100 + build number
-; e.g. The third Symbian package of curl ver. 7.20.1 would have a SIS package
-; version of 7, 20, 103
-#{"libcurl"}, (0xF0206D00), 7, 20, <please_update_version>, TYPE=SA
-
-; Vendor name
-%{"curl project"}
-:"curl project"
-
-; A dependency on P.I.P.S. is probably a good idea to add here
-;(0x20009A80), *, *, *, {"Open C Standard Libraries"}
-;(0x20009A81), *, *, *, {"P.I.P.S. for UIQ 3"}
-
-;Files - standard file specifications
-"\epoc32\release\armv5\urel\libcurl.dll" - "$:\sys\bin\libcurl.dll"
diff --git a/packages/Symbian/readme.txt b/packages/Symbian/readme.txt
deleted file mode 100644
index d6312fbe..00000000
--- a/packages/Symbian/readme.txt
+++ /dev/null
@@ -1,93 +0,0 @@
-Curl on Symbian OS
-==================
-This is a basic port of curl and libcurl to Symbian OS. The port is
-a straightforward one using Symbian's P.I.P.S. POSIX compatibility
-layer, which was first available for OS version 9.1. A more complete
-port would involve writing a Symbian C++ binding, or wrapping libcurl
-as a Symbian application server with a C++ API to handle requests
-from client applications as well as creating a GUI application to allow
-file transfers. The author has no current plans to do so.
-
-This means that integration with standard Symbian OS programs can be
-tricky, since libcurl isn't designed with Symbian's native asynchronous
-message passing idioms in mind. However, it may be possible to use libcurl
-in an active object-based application through libcurl's multi interface.
-The port is most easily used when porting POSIX applications to Symbian
-OS using P.I.P.S. (a.k.a. Open C).
-
-libcurl is built as a standard Symbian ordinal-linked DLL, and curl is
-built as a text mode EXE application. They have not been Symbian
-Signed, which is required in order to install them on most phones.
-
-Following are some things to keep in mind when using this port.
-
-
-curl notes
-----------
-When starting curl in the Windows emulator from the Windows command-line,
-place a double-dash -- before the first curl command-line option.
-e.g. \epoc32\release\winscw\udeb\curl -- -v http://localhost/
-Failure to do so may mean that some of your options won't be correctly
-processed.
-
-Symbian's ESHELL allows for redirecting stdin and stdout to files, but
-stderr goes to the epocwind.out file (on the emulator). The standard
-curl options -o, --stderr and --trace-ascii can be used to
-redirect output to a file (or stdout) instead.
-
-P.I.P.S. doesn't inherit the current working directory at startup from
-the shell, so relative path names are always relative to
-C:\Private\f0206442\.
-
-P.I.P.S. provides no way to disable echoing of characters as they are
-entered, so passwords typed in on the console will be visible. It also
-line buffers keyboard input so interactive telnet sessions are not very
-feasible.
-
-All screen output disappears after curl exits, so after a command completes,
-curl waits by default for Enter to be pressed before exiting. This behaviour
-is suppressed when the -s option is given.
-
-curl's "home directory" in Symbian is C:\Private\f0206442\. The .curlrc file
-is read from this directory on startup.
-
-
-libcurl notes
--------------
-libcurl uses writable static data, so the EPOCALLOWDLLDATA option is
-used in its MMP file, with the corresponding additional memory usage
-and limitations on the Windows emulator.
-
-curl_global_init() *must* be called (either explicitly or implicitly through
-calling certain other libcurl functions) before any libcurl functions
-that could allocate memory (like curl_getenv()).
-
-P.I.P.S. doesn't support signals or the alarm() call, so some timeouts
-(such as the connect timeout) are not honoured. This should not be
-an issue once support for CURLRES_THREADED is added for Symbian.
-
-P.I.P.S. causes a USER:87 panic if certain timeouts much longer than
-half an hour are selected.
-
-LDAP, SCP or SFTP methods are not supported due to lack of support for
-the dependent libraries on Symbian.
-
-gzip and deflate decompression is supported when the appropriate macro
-is uncommented in the libcurl.mmp file.
-
-SSL/TLS encryption is not enabled by default, but it is possible to add
-when the OpenSSL libraries included in the S60 Open C SDK are available.
-The appropriate macro in the libcurl.mmp file must be uncommented to
-enable support.
-
-NTLM authentication may not work on some servers due to the lack of
-MD4 support in the OpenSSL libraries included with Open C.
-
-Debug builds are not supported (i.e. --enable-debug) because they cause
-additional symbol exports in the library which are not frozen in the .def
-files.
-
-
-Dan Fandrich
-dan@coneharvesters.com
-March 2010
diff --git a/projects/Windows/VC10/lib/libcurl.vcxproj b/projects/Windows/VC10/lib/libcurl.vcxproj
index af76328e..e346e4b3 100644
--- a/projects/Windows/VC10/lib/libcurl.vcxproj
+++ b/projects/Windows/VC10/lib/libcurl.vcxproj
@@ -2355,6 +2355,8 @@
<ClCompile Include="..\..\..\..\lib\dotdot.c" />
<ClCompile Include="..\..\..\..\lib\dynbuf.c" />
<ClCompile Include="..\..\..\..\lib\easy.c" />
+ <ClCompile Include="..\..\..\..\lib\easygetopt.c" />
+ <ClCompile Include="..\..\..\..\lib\easyoptions.c" />
<ClCompile Include="..\..\..\..\lib\escape.c" />
<ClCompile Include="..\..\..\..\lib\file.c" />
<ClCompile Include="..\..\..\..\lib\fileinfo.c" />
@@ -2406,7 +2408,6 @@
<ClCompile Include="..\..\..\..\lib\rand.c" />
<ClCompile Include="..\..\..\..\lib\rename.c" />
<ClCompile Include="..\..\..\..\lib\rtsp.c" />
- <ClCompile Include="..\..\..\..\lib\security.c" />
<ClCompile Include="..\..\..\..\lib\select.c" />
<ClCompile Include="..\..\..\..\lib\sendf.c" />
<ClCompile Include="..\..\..\..\lib\setopt.c" />
@@ -2491,6 +2492,7 @@
<ClInclude Include="..\..\..\..\lib\curl_get_line.h" />
<ClInclude Include="..\..\..\..\lib\curl_gssapi.h" />
<ClInclude Include="..\..\..\..\lib\curl_hmac.h" />
+ <ClInclude Include="..\..\..\..\lib\curl_krb5.h" />
<ClInclude Include="..\..\..\..\lib\curl_ldap.h" />
<ClInclude Include="..\..\..\..\lib\curl_md4.h" />
<ClInclude Include="..\..\..\..\lib\curl_md5.h" />
@@ -2504,7 +2506,6 @@
<ClInclude Include="..\..\..\..\lib\curl_range.h" />
<ClInclude Include="..\..\..\..\lib\curl_rtmp.h" />
<ClInclude Include="..\..\..\..\lib\curl_sasl.h" />
- <ClInclude Include="..\..\..\..\lib\curl_sec.h" />
<ClInclude Include="..\..\..\..\lib\curl_setup.h" />
<ClInclude Include="..\..\..\..\lib\curl_setup_once.h" />
<ClInclude Include="..\..\..\..\lib\curl_sha256.h" />
@@ -2516,6 +2517,7 @@
<ClInclude Include="..\..\..\..\lib\dotdot.h" />
<ClInclude Include="..\..\..\..\lib\dynbuf.h" />
<ClInclude Include="..\..\..\..\lib\easyif.h" />
+ <ClInclude Include="..\..\..\..\lib\easyoptions.h" />
<ClInclude Include="..\..\..\..\lib\escape.h" />
<ClInclude Include="..\..\..\..\lib\file.h" />
<ClInclude Include="..\..\..\..\lib\fileinfo.h" />
diff --git a/projects/Windows/VC10/src/curl.vcxproj b/projects/Windows/VC10/src/curl.vcxproj
index 478defcb..ee3bf789 100644
--- a/projects/Windows/VC10/src/curl.vcxproj
+++ b/projects/Windows/VC10/src/curl.vcxproj
@@ -2629,6 +2629,7 @@
<ItemGroup>
<ClCompile Include="..\..\..\..\lib\curl_ctype.c" />
<ClCompile Include="..\..\..\..\lib\curl_multibyte.c" />
+ <ClCompile Include="..\..\..\..\lib\dynbuf.c" />
<ClCompile Include="..\..\..\..\lib\nonblock.c" />
<ClCompile Include="..\..\..\..\lib\strtoofft.c" />
<ClCompile Include="..\..\..\..\lib\version_win32.c" />
@@ -2680,6 +2681,7 @@
<ClInclude Include="..\..\..\..\lib\curl_ctype.h" />
<ClInclude Include="..\..\..\..\lib\curl_multibyte.h" />
<ClInclude Include="..\..\..\..\lib\curl_setup.h" />
+ <ClInclude Include="..\..\..\..\lib\dynbuf.h" />
<ClInclude Include="..\..\..\..\lib\nonblock.h" />
<ClInclude Include="..\..\..\..\lib\strtoofft.h" />
<ClInclude Include="..\..\..\..\lib\version_win32.h" />
diff --git a/projects/Windows/VC11/lib/libcurl.vcxproj b/projects/Windows/VC11/lib/libcurl.vcxproj
index 914cd01d..a937b95c 100644
--- a/projects/Windows/VC11/lib/libcurl.vcxproj
+++ b/projects/Windows/VC11/lib/libcurl.vcxproj
@@ -2411,6 +2411,8 @@
<ClCompile Include="..\..\..\..\lib\dotdot.c" />
<ClCompile Include="..\..\..\..\lib\dynbuf.c" />
<ClCompile Include="..\..\..\..\lib\easy.c" />
+ <ClCompile Include="..\..\..\..\lib\easygetopt.c" />
+ <ClCompile Include="..\..\..\..\lib\easyoptions.c" />
<ClCompile Include="..\..\..\..\lib\escape.c" />
<ClCompile Include="..\..\..\..\lib\file.c" />
<ClCompile Include="..\..\..\..\lib\fileinfo.c" />
@@ -2462,7 +2464,6 @@
<ClCompile Include="..\..\..\..\lib\rand.c" />
<ClCompile Include="..\..\..\..\lib\rename.c" />
<ClCompile Include="..\..\..\..\lib\rtsp.c" />
- <ClCompile Include="..\..\..\..\lib\security.c" />
<ClCompile Include="..\..\..\..\lib\select.c" />
<ClCompile Include="..\..\..\..\lib\sendf.c" />
<ClCompile Include="..\..\..\..\lib\setopt.c" />
@@ -2547,6 +2548,7 @@
<ClInclude Include="..\..\..\..\lib\curl_get_line.h" />
<ClInclude Include="..\..\..\..\lib\curl_gssapi.h" />
<ClInclude Include="..\..\..\..\lib\curl_hmac.h" />
+ <ClInclude Include="..\..\..\..\lib\curl_krb5.h" />
<ClInclude Include="..\..\..\..\lib\curl_ldap.h" />
<ClInclude Include="..\..\..\..\lib\curl_md4.h" />
<ClInclude Include="..\..\..\..\lib\curl_md5.h" />
@@ -2560,7 +2562,6 @@
<ClInclude Include="..\..\..\..\lib\curl_range.h" />
<ClInclude Include="..\..\..\..\lib\curl_rtmp.h" />
<ClInclude Include="..\..\..\..\lib\curl_sasl.h" />
- <ClInclude Include="..\..\..\..\lib\curl_sec.h" />
<ClInclude Include="..\..\..\..\lib\curl_setup.h" />
<ClInclude Include="..\..\..\..\lib\curl_setup_once.h" />
<ClInclude Include="..\..\..\..\lib\curl_sha256.h" />
@@ -2572,6 +2573,7 @@
<ClInclude Include="..\..\..\..\lib\dotdot.h" />
<ClInclude Include="..\..\..\..\lib\dynbuf.h" />
<ClInclude Include="..\..\..\..\lib\easyif.h" />
+ <ClInclude Include="..\..\..\..\lib\easyoptions.h" />
<ClInclude Include="..\..\..\..\lib\escape.h" />
<ClInclude Include="..\..\..\..\lib\file.h" />
<ClInclude Include="..\..\..\..\lib\fileinfo.h" />
diff --git a/projects/Windows/VC11/src/curl.vcxproj b/projects/Windows/VC11/src/curl.vcxproj
index 2dba3cff..00c2b095 100644
--- a/projects/Windows/VC11/src/curl.vcxproj
+++ b/projects/Windows/VC11/src/curl.vcxproj
@@ -2685,6 +2685,7 @@
<ItemGroup>
<ClCompile Include="..\..\..\..\lib\curl_ctype.c" />
<ClCompile Include="..\..\..\..\lib\curl_multibyte.c" />
+ <ClCompile Include="..\..\..\..\lib\dynbuf.c" />
<ClCompile Include="..\..\..\..\lib\nonblock.c" />
<ClCompile Include="..\..\..\..\lib\strtoofft.c" />
<ClCompile Include="..\..\..\..\lib\version_win32.c" />
@@ -2736,6 +2737,7 @@
<ClInclude Include="..\..\..\..\lib\curl_ctype.h" />
<ClInclude Include="..\..\..\..\lib\curl_multibyte.h" />
<ClInclude Include="..\..\..\..\lib\curl_setup.h" />
+ <ClInclude Include="..\..\..\..\lib\dynbuf.h" />
<ClInclude Include="..\..\..\..\lib\nonblock.h" />
<ClInclude Include="..\..\..\..\lib\strtoofft.h" />
<ClInclude Include="..\..\..\..\lib\version_win32.h" />
diff --git a/projects/Windows/VC12/lib/libcurl.vcxproj b/projects/Windows/VC12/lib/libcurl.vcxproj
index 48fcdddd..ed379af0 100644
--- a/projects/Windows/VC12/lib/libcurl.vcxproj
+++ b/projects/Windows/VC12/lib/libcurl.vcxproj
@@ -2411,6 +2411,8 @@
<ClCompile Include="..\..\..\..\lib\dotdot.c" />
<ClCompile Include="..\..\..\..\lib\dynbuf.c" />
<ClCompile Include="..\..\..\..\lib\easy.c" />
+ <ClCompile Include="..\..\..\..\lib\easygetopt.c" />
+ <ClCompile Include="..\..\..\..\lib\easyoptions.c" />
<ClCompile Include="..\..\..\..\lib\escape.c" />
<ClCompile Include="..\..\..\..\lib\file.c" />
<ClCompile Include="..\..\..\..\lib\fileinfo.c" />
@@ -2462,7 +2464,6 @@
<ClCompile Include="..\..\..\..\lib\rand.c" />
<ClCompile Include="..\..\..\..\lib\rename.c" />
<ClCompile Include="..\..\..\..\lib\rtsp.c" />
- <ClCompile Include="..\..\..\..\lib\security.c" />
<ClCompile Include="..\..\..\..\lib\select.c" />
<ClCompile Include="..\..\..\..\lib\sendf.c" />
<ClCompile Include="..\..\..\..\lib\setopt.c" />
@@ -2547,6 +2548,7 @@
<ClInclude Include="..\..\..\..\lib\curl_get_line.h" />
<ClInclude Include="..\..\..\..\lib\curl_gssapi.h" />
<ClInclude Include="..\..\..\..\lib\curl_hmac.h" />
+ <ClInclude Include="..\..\..\..\lib\curl_krb5.h" />
<ClInclude Include="..\..\..\..\lib\curl_ldap.h" />
<ClInclude Include="..\..\..\..\lib\curl_md4.h" />
<ClInclude Include="..\..\..\..\lib\curl_md5.h" />
@@ -2560,7 +2562,6 @@
<ClInclude Include="..\..\..\..\lib\curl_range.h" />
<ClInclude Include="..\..\..\..\lib\curl_rtmp.h" />
<ClInclude Include="..\..\..\..\lib\curl_sasl.h" />
- <ClInclude Include="..\..\..\..\lib\curl_sec.h" />
<ClInclude Include="..\..\..\..\lib\curl_setup.h" />
<ClInclude Include="..\..\..\..\lib\curl_setup_once.h" />
<ClInclude Include="..\..\..\..\lib\curl_sha256.h" />
@@ -2572,6 +2573,7 @@
<ClInclude Include="..\..\..\..\lib\dotdot.h" />
<ClInclude Include="..\..\..\..\lib\dynbuf.h" />
<ClInclude Include="..\..\..\..\lib\easyif.h" />
+ <ClInclude Include="..\..\..\..\lib\easyoptions.h" />
<ClInclude Include="..\..\..\..\lib\escape.h" />
<ClInclude Include="..\..\..\..\lib\file.h" />
<ClInclude Include="..\..\..\..\lib\fileinfo.h" />
diff --git a/projects/Windows/VC12/src/curl.vcxproj b/projects/Windows/VC12/src/curl.vcxproj
index b8300ec4..bb6b5c04 100644
--- a/projects/Windows/VC12/src/curl.vcxproj
+++ b/projects/Windows/VC12/src/curl.vcxproj
@@ -2685,6 +2685,7 @@
<ItemGroup>
<ClCompile Include="..\..\..\..\lib\curl_ctype.c" />
<ClCompile Include="..\..\..\..\lib\curl_multibyte.c" />
+ <ClCompile Include="..\..\..\..\lib\dynbuf.c" />
<ClCompile Include="..\..\..\..\lib\nonblock.c" />
<ClCompile Include="..\..\..\..\lib\strtoofft.c" />
<ClCompile Include="..\..\..\..\lib\version_win32.c" />
@@ -2736,6 +2737,7 @@
<ClInclude Include="..\..\..\..\lib\curl_ctype.h" />
<ClInclude Include="..\..\..\..\lib\curl_multibyte.h" />
<ClInclude Include="..\..\..\..\lib\curl_setup.h" />
+ <ClInclude Include="..\..\..\..\lib\dynbuf.h" />
<ClInclude Include="..\..\..\..\lib\nonblock.h" />
<ClInclude Include="..\..\..\..\lib\strtoofft.h" />
<ClInclude Include="..\..\..\..\lib\version_win32.h" />
diff --git a/projects/Windows/VC14/lib/libcurl.vcxproj b/projects/Windows/VC14/lib/libcurl.vcxproj
index d219924e..3bc61915 100644
--- a/projects/Windows/VC14/lib/libcurl.vcxproj
+++ b/projects/Windows/VC14/lib/libcurl.vcxproj
@@ -2411,6 +2411,8 @@
<ClCompile Include="..\..\..\..\lib\dotdot.c" />
<ClCompile Include="..\..\..\..\lib\dynbuf.c" />
<ClCompile Include="..\..\..\..\lib\easy.c" />
+ <ClCompile Include="..\..\..\..\lib\easygetopt.c" />
+ <ClCompile Include="..\..\..\..\lib\easyoptions.c" />
<ClCompile Include="..\..\..\..\lib\escape.c" />
<ClCompile Include="..\..\..\..\lib\file.c" />
<ClCompile Include="..\..\..\..\lib\fileinfo.c" />
@@ -2462,7 +2464,6 @@
<ClCompile Include="..\..\..\..\lib\rand.c" />
<ClCompile Include="..\..\..\..\lib\rename.c" />
<ClCompile Include="..\..\..\..\lib\rtsp.c" />
- <ClCompile Include="..\..\..\..\lib\security.c" />
<ClCompile Include="..\..\..\..\lib\select.c" />
<ClCompile Include="..\..\..\..\lib\sendf.c" />
<ClCompile Include="..\..\..\..\lib\setopt.c" />
@@ -2547,6 +2548,7 @@
<ClInclude Include="..\..\..\..\lib\curl_get_line.h" />
<ClInclude Include="..\..\..\..\lib\curl_gssapi.h" />
<ClInclude Include="..\..\..\..\lib\curl_hmac.h" />
+ <ClInclude Include="..\..\..\..\lib\curl_krb5.h" />
<ClInclude Include="..\..\..\..\lib\curl_ldap.h" />
<ClInclude Include="..\..\..\..\lib\curl_md4.h" />
<ClInclude Include="..\..\..\..\lib\curl_md5.h" />
@@ -2560,7 +2562,6 @@
<ClInclude Include="..\..\..\..\lib\curl_range.h" />
<ClInclude Include="..\..\..\..\lib\curl_rtmp.h" />
<ClInclude Include="..\..\..\..\lib\curl_sasl.h" />
- <ClInclude Include="..\..\..\..\lib\curl_sec.h" />
<ClInclude Include="..\..\..\..\lib\curl_setup.h" />
<ClInclude Include="..\..\..\..\lib\curl_setup_once.h" />
<ClInclude Include="..\..\..\..\lib\curl_sha256.h" />
@@ -2572,6 +2573,7 @@
<ClInclude Include="..\..\..\..\lib\dotdot.h" />
<ClInclude Include="..\..\..\..\lib\dynbuf.h" />
<ClInclude Include="..\..\..\..\lib\easyif.h" />
+ <ClInclude Include="..\..\..\..\lib\easyoptions.h" />
<ClInclude Include="..\..\..\..\lib\escape.h" />
<ClInclude Include="..\..\..\..\lib\file.h" />
<ClInclude Include="..\..\..\..\lib\fileinfo.h" />
diff --git a/projects/Windows/VC14/src/curl.vcxproj b/projects/Windows/VC14/src/curl.vcxproj
index 0889336c..2f298653 100644
--- a/projects/Windows/VC14/src/curl.vcxproj
+++ b/projects/Windows/VC14/src/curl.vcxproj
@@ -2685,6 +2685,7 @@
<ItemGroup>
<ClCompile Include="..\..\..\..\lib\curl_ctype.c" />
<ClCompile Include="..\..\..\..\lib\curl_multibyte.c" />
+ <ClCompile Include="..\..\..\..\lib\dynbuf.c" />
<ClCompile Include="..\..\..\..\lib\nonblock.c" />
<ClCompile Include="..\..\..\..\lib\strtoofft.c" />
<ClCompile Include="..\..\..\..\lib\version_win32.c" />
@@ -2736,6 +2737,7 @@
<ClInclude Include="..\..\..\..\lib\curl_ctype.h" />
<ClInclude Include="..\..\..\..\lib\curl_multibyte.h" />
<ClInclude Include="..\..\..\..\lib\curl_setup.h" />
+ <ClInclude Include="..\..\..\..\lib\dynbuf.h" />
<ClInclude Include="..\..\..\..\lib\nonblock.h" />
<ClInclude Include="..\..\..\..\lib\strtoofft.h" />
<ClInclude Include="..\..\..\..\lib\version_win32.h" />
diff --git a/projects/Windows/VC15/lib/libcurl.vcxproj b/projects/Windows/VC15/lib/libcurl.vcxproj
index ae95a0ea..98a38f93 100644
--- a/projects/Windows/VC15/lib/libcurl.vcxproj
+++ b/projects/Windows/VC15/lib/libcurl.vcxproj
@@ -2383,6 +2383,8 @@
<ClCompile Include="..\..\..\..\lib\dotdot.c" />
<ClCompile Include="..\..\..\..\lib\dynbuf.c" />
<ClCompile Include="..\..\..\..\lib\easy.c" />
+ <ClCompile Include="..\..\..\..\lib\easygetopt.c" />
+ <ClCompile Include="..\..\..\..\lib\easyoptions.c" />
<ClCompile Include="..\..\..\..\lib\escape.c" />
<ClCompile Include="..\..\..\..\lib\file.c" />
<ClCompile Include="..\..\..\..\lib\fileinfo.c" />
@@ -2434,7 +2436,6 @@
<ClCompile Include="..\..\..\..\lib\rand.c" />
<ClCompile Include="..\..\..\..\lib\rename.c" />
<ClCompile Include="..\..\..\..\lib\rtsp.c" />
- <ClCompile Include="..\..\..\..\lib\security.c" />
<ClCompile Include="..\..\..\..\lib\select.c" />
<ClCompile Include="..\..\..\..\lib\sendf.c" />
<ClCompile Include="..\..\..\..\lib\setopt.c" />
@@ -2519,6 +2520,7 @@
<ClInclude Include="..\..\..\..\lib\curl_get_line.h" />
<ClInclude Include="..\..\..\..\lib\curl_gssapi.h" />
<ClInclude Include="..\..\..\..\lib\curl_hmac.h" />
+ <ClInclude Include="..\..\..\..\lib\curl_krb5.h" />
<ClInclude Include="..\..\..\..\lib\curl_ldap.h" />
<ClInclude Include="..\..\..\..\lib\curl_md4.h" />
<ClInclude Include="..\..\..\..\lib\curl_md5.h" />
@@ -2532,7 +2534,6 @@
<ClInclude Include="..\..\..\..\lib\curl_range.h" />
<ClInclude Include="..\..\..\..\lib\curl_rtmp.h" />
<ClInclude Include="..\..\..\..\lib\curl_sasl.h" />
- <ClInclude Include="..\..\..\..\lib\curl_sec.h" />
<ClInclude Include="..\..\..\..\lib\curl_setup.h" />
<ClInclude Include="..\..\..\..\lib\curl_setup_once.h" />
<ClInclude Include="..\..\..\..\lib\curl_sha256.h" />
@@ -2544,6 +2545,7 @@
<ClInclude Include="..\..\..\..\lib\dotdot.h" />
<ClInclude Include="..\..\..\..\lib\dynbuf.h" />
<ClInclude Include="..\..\..\..\lib\easyif.h" />
+ <ClInclude Include="..\..\..\..\lib\easyoptions.h" />
<ClInclude Include="..\..\..\..\lib\escape.h" />
<ClInclude Include="..\..\..\..\lib\file.h" />
<ClInclude Include="..\..\..\..\lib\fileinfo.h" />
diff --git a/projects/Windows/VC15/src/curl.vcxproj b/projects/Windows/VC15/src/curl.vcxproj
index 011533cb..85d9179b 100644
--- a/projects/Windows/VC15/src/curl.vcxproj
+++ b/projects/Windows/VC15/src/curl.vcxproj
@@ -2657,6 +2657,7 @@
<ItemGroup>
<ClCompile Include="..\..\..\..\lib\curl_ctype.c" />
<ClCompile Include="..\..\..\..\lib\curl_multibyte.c" />
+ <ClCompile Include="..\..\..\..\lib\dynbuf.c" />
<ClCompile Include="..\..\..\..\lib\nonblock.c" />
<ClCompile Include="..\..\..\..\lib\strtoofft.c" />
<ClCompile Include="..\..\..\..\lib\version_win32.c" />
@@ -2708,6 +2709,7 @@
<ClInclude Include="..\..\..\..\lib\curl_ctype.h" />
<ClInclude Include="..\..\..\..\lib\curl_multibyte.h" />
<ClInclude Include="..\..\..\..\lib\curl_setup.h" />
+ <ClInclude Include="..\..\..\..\lib\dynbuf.h" />
<ClInclude Include="..\..\..\..\lib\nonblock.h" />
<ClInclude Include="..\..\..\..\lib\strtoofft.h" />
<ClInclude Include="..\..\..\..\lib\version_win32.h" />
diff --git a/projects/Windows/VC6/lib/libcurl.dsp b/projects/Windows/VC6/lib/libcurl.dsp
index 0ab7fa9d..816afae1 100644
--- a/projects/Windows/VC6/lib/libcurl.dsp
+++ b/projects/Windows/VC6/lib/libcurl.dsp
@@ -858,6 +858,14 @@ SOURCE=..\..\..\..\lib\easy.c
# End Source File
# Begin Source File
+SOURCE=..\..\..\..\lib\easygetopt.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\lib\easyoptions.c
+# End Source File
+# Begin Source File
+
SOURCE=..\..\..\..\lib\escape.c
# End Source File
# Begin Source File
@@ -1062,10 +1070,6 @@ SOURCE=..\..\..\..\lib\rtsp.c
# End Source File
# Begin Source File
-SOURCE=..\..\..\..\lib\security.c
-# End Source File
-# Begin Source File
-
SOURCE=..\..\..\..\lib\select.c
# End Source File
# Begin Source File
@@ -1398,6 +1402,10 @@ SOURCE=..\..\..\..\lib\curl_hmac.h
# End Source File
# Begin Source File
+SOURCE=..\..\..\..\lib\curl_krb5.h
+# End Source File
+# Begin Source File
+
SOURCE=..\..\..\..\lib\curl_ldap.h
# End Source File
# Begin Source File
@@ -1450,10 +1458,6 @@ SOURCE=..\..\..\..\lib\curl_sasl.h
# End Source File
# Begin Source File
-SOURCE=..\..\..\..\lib\curl_sec.h
-# End Source File
-# Begin Source File
-
SOURCE=..\..\..\..\lib\curl_setup.h
# End Source File
# Begin Source File
@@ -1498,6 +1502,10 @@ SOURCE=..\..\..\..\lib\easyif.h
# End Source File
# Begin Source File
+SOURCE=..\..\..\..\lib\easyoptions.h
+# End Source File
+# Begin Source File
+
SOURCE=..\..\..\..\lib\escape.h
# End Source File
# Begin Source File
diff --git a/projects/Windows/VC6/src/curl.dsp b/projects/Windows/VC6/src/curl.dsp
index 9e1a0a5d..b35cd1a6 100644
--- a/projects/Windows/VC6/src/curl.dsp
+++ b/projects/Windows/VC6/src/curl.dsp
@@ -687,6 +687,10 @@ SOURCE=..\..\..\..\lib\curl_multibyte.c
# End Source File
# Begin Source File
+SOURCE=..\..\..\..\lib\dynbuf.c
+# End Source File
+# Begin Source File
+
SOURCE=..\..\..\..\lib\nonblock.c
# End Source File
# Begin Source File
@@ -887,6 +891,10 @@ SOURCE=..\..\..\..\lib\curl_setup.h
# End Source File
# Begin Source File
+SOURCE=..\..\..\..\lib\dynbuf.h
+# End Source File
+# Begin Source File
+
SOURCE=..\..\..\..\lib\nonblock.h
# End Source File
# Begin Source File
diff --git a/projects/Windows/VC7.1/lib/libcurl.vcproj b/projects/Windows/VC7.1/lib/libcurl.vcproj
index 0799d259..67a2f5e9 100644
--- a/projects/Windows/VC7.1/lib/libcurl.vcproj
+++ b/projects/Windows/VC7.1/lib/libcurl.vcproj
@@ -1352,6 +1352,12 @@
RelativePath="..\..\..\..\lib\easy.c">
</File>
<File
+ RelativePath="..\..\..\..\lib\easygetopt.c">
+ </File>
+ <File
+ RelativePath="..\..\..\..\lib\easyoptions.c">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\escape.c">
</File>
<File
@@ -1505,9 +1511,6 @@
RelativePath="..\..\..\..\lib\rtsp.c">
</File>
<File
- RelativePath="..\..\..\..\lib\security.c">
- </File>
- <File
RelativePath="..\..\..\..\lib\select.c">
</File>
<File
@@ -1662,6 +1665,9 @@
RelativePath="..\..\..\..\lib\curl_hmac.h">
</File>
<File
+ RelativePath="..\..\..\..\lib\curl_krb5.h">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\curl_ldap.h">
</File>
<File
@@ -1701,9 +1707,6 @@
RelativePath="..\..\..\..\lib\curl_sasl.h">
</File>
<File
- RelativePath="..\..\..\..\lib\curl_sec.h">
- </File>
- <File
RelativePath="..\..\..\..\lib\curl_setup.h">
</File>
<File
@@ -1737,6 +1740,9 @@
RelativePath="..\..\..\..\lib\easyif.h">
</File>
<File
+ RelativePath="..\..\..\..\lib\easyoptions.h">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\escape.h">
</File>
<File
diff --git a/projects/Windows/VC7.1/src/curl.vcproj b/projects/Windows/VC7.1/src/curl.vcproj
index 847e1f67..08c738af 100644
--- a/projects/Windows/VC7.1/src/curl.vcproj
+++ b/projects/Windows/VC7.1/src/curl.vcproj
@@ -1368,6 +1368,9 @@
RelativePath="..\..\..\..\lib\curl_multibyte.c">
</File>
<File
+ RelativePath="..\..\..\..\lib\dynbuf.c">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\nonblock.c">
</File>
<File
@@ -1519,6 +1522,9 @@
RelativePath="..\..\..\..\lib\curl_setup.h">
</File>
<File
+ RelativePath="..\..\..\..\lib\dynbuf.h">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\nonblock.h">
</File>
<File
diff --git a/projects/Windows/VC7/lib/libcurl.vcproj b/projects/Windows/VC7/lib/libcurl.vcproj
index d3d051c1..d8a45a17 100644
--- a/projects/Windows/VC7/lib/libcurl.vcproj
+++ b/projects/Windows/VC7/lib/libcurl.vcproj
@@ -1206,6 +1206,12 @@
RelativePath="..\..\..\..\lib\easy.c">
</File>
<File
+ RelativePath="..\..\..\..\lib\easygetopt.c">
+ </File>
+ <File
+ RelativePath="..\..\..\..\lib\easyoptions.c">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\escape.c">
</File>
<File
@@ -1359,9 +1365,6 @@
RelativePath="..\..\..\..\lib\rtsp.c">
</File>
<File
- RelativePath="..\..\..\..\lib\security.c">
- </File>
- <File
RelativePath="..\..\..\..\lib\select.c">
</File>
<File
@@ -1516,6 +1519,9 @@
RelativePath="..\..\..\..\lib\curl_hmac.h">
</File>
<File
+ RelativePath="..\..\..\..\lib\curl_krb5.h">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\curl_ldap.h">
</File>
<File
@@ -1555,9 +1561,6 @@
RelativePath="..\..\..\..\lib\curl_sasl.h">
</File>
<File
- RelativePath="..\..\..\..\lib\curl_sec.h">
- </File>
- <File
RelativePath="..\..\..\..\lib\curl_setup.h">
</File>
<File
@@ -1591,6 +1594,9 @@
RelativePath="..\..\..\..\lib\easyif.h">
</File>
<File
+ RelativePath="..\..\..\..\lib\easyoptions.h">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\escape.h">
</File>
<File
diff --git a/projects/Windows/VC7/src/curl.vcproj b/projects/Windows/VC7/src/curl.vcproj
index b7ba3ddf..8e2a1ddf 100644
--- a/projects/Windows/VC7/src/curl.vcproj
+++ b/projects/Windows/VC7/src/curl.vcproj
@@ -1222,6 +1222,9 @@
RelativePath="..\..\..\..\lib\curl_multibyte.c">
</File>
<File
+ RelativePath="..\..\..\..\lib\dynbuf.c">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\nonblock.c">
</File>
<File
@@ -1373,6 +1376,9 @@
RelativePath="..\..\..\..\lib\curl_setup.h">
</File>
<File
+ RelativePath="..\..\..\..\lib\dynbuf.h">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\nonblock.h">
</File>
<File
diff --git a/projects/Windows/VC8/lib/libcurl.vcproj b/projects/Windows/VC8/lib/libcurl.vcproj
index 6ff08a39..2d12151c 100644
--- a/projects/Windows/VC8/lib/libcurl.vcproj
+++ b/projects/Windows/VC8/lib/libcurl.vcproj
@@ -3745,6 +3745,14 @@
>
</File>
<File
+ RelativePath="..\..\..\..\lib\easygetopt.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\lib\easyoptions.c"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\escape.c"
>
</File>
@@ -3949,10 +3957,6 @@
>
</File>
<File
- RelativePath="..\..\..\..\lib\security.c"
- >
- </File>
- <File
RelativePath="..\..\..\..\lib\select.c"
>
</File>
@@ -4157,6 +4161,10 @@
>
</File>
<File
+ RelativePath="..\..\..\..\lib\curl_krb5.h"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\curl_ldap.h"
>
</File>
@@ -4209,10 +4217,6 @@
>
</File>
<File
- RelativePath="..\..\..\..\lib\curl_sec.h"
- >
- </File>
- <File
RelativePath="..\..\..\..\lib\curl_setup.h"
>
</File>
@@ -4257,6 +4261,10 @@
>
</File>
<File
+ RelativePath="..\..\..\..\lib\easyoptions.h"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\escape.h"
>
</File>
diff --git a/projects/Windows/VC8/src/curl.vcproj b/projects/Windows/VC8/src/curl.vcproj
index b70b68c4..61fa593b 100644
--- a/projects/Windows/VC8/src/curl.vcproj
+++ b/projects/Windows/VC8/src/curl.vcproj
@@ -4089,6 +4089,10 @@
>
</File>
<File
+ RelativePath="..\..\..\..\lib\dynbuf.c"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\nonblock.c"
>
</File>
@@ -4289,6 +4293,10 @@
>
</File>
<File
+ RelativePath="..\..\..\..\lib\dynbuf.h"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\nonblock.h"
>
</File>
diff --git a/projects/Windows/VC9/lib/libcurl.vcproj b/projects/Windows/VC9/lib/libcurl.vcproj
index 612ab381..34575137 100644
--- a/projects/Windows/VC9/lib/libcurl.vcproj
+++ b/projects/Windows/VC9/lib/libcurl.vcproj
@@ -3686,6 +3686,14 @@
>
</File>
<File
+ RelativePath="..\..\..\..\lib\easygetopt.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\lib\easyoptions.c"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\escape.c"
>
</File>
@@ -3890,10 +3898,6 @@
>
</File>
<File
- RelativePath="..\..\..\..\lib\security.c"
- >
- </File>
- <File
RelativePath="..\..\..\..\lib\select.c"
>
</File>
@@ -4098,6 +4102,10 @@
>
</File>
<File
+ RelativePath="..\..\..\..\lib\curl_krb5.h"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\curl_ldap.h"
>
</File>
@@ -4150,10 +4158,6 @@
>
</File>
<File
- RelativePath="..\..\..\..\lib\curl_sec.h"
- >
- </File>
- <File
RelativePath="..\..\..\..\lib\curl_setup.h"
>
</File>
@@ -4198,6 +4202,10 @@
>
</File>
<File
+ RelativePath="..\..\..\..\lib\easyoptions.h"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\escape.h"
>
</File>
diff --git a/projects/Windows/VC9/src/curl.vcproj b/projects/Windows/VC9/src/curl.vcproj
index a08283ce..d32db51c 100644
--- a/projects/Windows/VC9/src/curl.vcproj
+++ b/projects/Windows/VC9/src/curl.vcproj
@@ -3946,6 +3946,10 @@
>
</File>
<File
+ RelativePath="..\..\..\..\lib\dynbuf.c"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\nonblock.c"
>
</File>
@@ -4146,6 +4150,10 @@
>
</File>
<File
+ RelativePath="..\..\..\..\lib\dynbuf.h"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\nonblock.h"
>
</File>
diff --git a/projects/build-wolfssl.bat b/projects/build-wolfssl.bat
index 9a7d67b7..8c6c8ed2 100644
--- a/projects/build-wolfssl.bat
+++ b/projects/build-wolfssl.bat
@@ -6,7 +6,7 @@ rem * / __| | | | |_) | |
rem * | (__| |_| | _ <| |___
rem * \___|\___/|_| \_\_____|
rem *
-rem * Copyright (C) 2012 - 2018, Steve Holme, <steve_holme@hotmail.com>.
+rem * Copyright (C) 2012 - 2020, Steve Holme, <steve_holme@hotmail.com>.
rem * Copyright (C) 2015, Jay Satiro, <raysatiro@yahoo.com>.
rem *
rem * This software is licensed as described in the file COPYING, which
@@ -82,6 +82,20 @@ rem ***************************************************************************
) else (
set "VC_PATH=Microsoft Visual Studio\2017\Community\VC"
)
+ ) else if /i "%~1" == "vc14.2" (
+ set VC_VER=14.2
+ set VC_DESC=VC14.2
+ set VC_TOOLSET=v142
+
+ rem Determine the VC14.2 path based on the installed edition in descending
+ rem order (Enterprise, then Professional and finally Community)
+ if exist "%PF%\Microsoft Visual Studio\2019\Enterprise\VC" (
+ set "VC_PATH=Microsoft Visual Studio\2019\Enterprise\VC"
+ ) else if exist "%PF%\Microsoft Visual Studio\2019\Professional\VC" (
+ set "VC_PATH=Microsoft Visual Studio\2019\Professional\VC"
+ ) else (
+ set "VC_PATH=Microsoft Visual Studio\2019\Community\VC"
+ )
) else if /i "%~1" == "x86" (
set BUILD_PLATFORM=x86
) else if /i "%~1" == "x64" (
@@ -133,6 +147,7 @@ rem ***************************************************************************
if "%VC_VER%" == "12.0" set VCVARS_PLATFORM=amd64
if "%VC_VER%" == "14.0" set VCVARS_PLATFORM=amd64
if "%VC_VER%" == "14.1" set VCVARS_PLATFORM=amd64
+ if "%VC_VER%" == "14.2" set VCVARS_PLATFORM=amd64
)
:start
@@ -141,6 +156,8 @@ rem ***************************************************************************
if "%VC_VER%" == "14.1" (
call "%PF%\%VC_PATH%\Auxiliary\Build\vcvarsall" %VCVARS_PLATFORM%
+ ) else if "%VC_VER%" == "14.2" (
+ call "%PF%\%VC_PATH%\Auxiliary\Build\vcvarsall" %VCVARS_PLATFORM%
) else (
call "%PF%\%VC_PATH%\vcvarsall" %VCVARS_PLATFORM%
)
@@ -308,6 +325,7 @@ rem ***************************************************************************
echo vc12 - Use Visual Studio 2013
echo vc14 - Use Visual Studio 2015
echo vc14.1 - Use Visual Studio 2017
+ echo vc14.2 - Use Visual Studio 2019
echo.
echo Platform:
echo.
diff --git a/projects/generate.bat b/projects/generate.bat
index 88979683..bc50245e 100644
--- a/projects/generate.bat
+++ b/projects/generate.bat
@@ -287,6 +287,7 @@ rem
call :element %1 lib "curl_ctype.c" %3
call :element %1 lib "curl_multibyte.c" %3
call :element %1 lib "version_win32.c" %3
+ call :element %1 lib "dynbuf.c" %3
) else if "!var!" == "CURL_SRC_X_H_FILES" (
call :element %1 lib "config-win32.h" %3
call :element %1 lib "curl_setup.h" %3
@@ -296,6 +297,7 @@ rem
call :element %1 lib "curl_ctype.h" %3
call :element %1 lib "curl_multibyte.h" %3
call :element %1 lib "version_win32.h" %3
+ call :element %1 lib "dynbuf.h" %3
) else if "!var!" == "CURL_LIB_C_FILES" (
for /f "delims=" %%c in ('dir /b ..\lib\*.c') do call :element %1 lib "%%c" %3
) else if "!var!" == "CURL_LIB_H_FILES" (
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 26e3cfe1..b994ae96 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -78,6 +78,12 @@ if(CURL_HAS_LTO)
INTERPROCEDURAL_OPTIMIZATION_RELWITHDEBINFO TRUE)
endif()
+if(ENABLE_UNICODE AND MINGW)
+ target_link_libraries(${EXE_NAME} -municode)
+ # GCC doesn't know about wmain
+ set_source_files_properties(tool_main.c PROPERTIES COMPILE_FLAGS "-Wno-missing-prototypes -Wno-missing-declarations")
+endif()
+
source_group("curlX source files" FILES ${CURLX_CFILES})
source_group("curl source files" FILES ${CURL_CFILES})
source_group("curl header files" FILES ${CURL_HFILES})
diff --git a/src/Makefile.Watcom b/src/Makefile.Watcom
deleted file mode 100644
index d61da8f6..00000000
--- a/src/Makefile.Watcom
+++ /dev/null
@@ -1,234 +0,0 @@
-#***************************************************************************
-# _ _ ____ _
-# Project ___| | | | _ \| |
-# / __| | | | |_) | |
-# | (__| |_| | _ <| |___
-# \___|\___/|_| \_\_____|
-#
-# Copyright (C) 2005 - 2008, Gisle Vanem <gvanem@yahoo.no>.
-# Copyright (C) 2005 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
-#
-# This software is licensed as described in the file COPYING, which
-# you should have received as part of this distribution. The terms
-# are also available at https://curl.haxx.se/docs/copyright.html.
-#
-# You may opt to use, copy, modify, merge, publish, distribute and/or sell
-# copies of the Software, and permit persons to whom the Software is
-# furnished to do so, under the terms of the COPYING file.
-#
-# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
-# KIND, either express or implied.
-#
-#***************************************************************************
-
-#
-# Watcom / OpenWatcom / Win32 makefile for curl.
-#
-
-.ERASE
-
-!if $(__VERSION__) < 1280
-!message !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!message ! This Open Watcom version is too old and is no longer supported !
-!message ! Please download latest version from www.openwatcom.org !
-!message !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!error Unsupported version of Open Watcom
-!endif
-
-!ifndef %watcom
-!error WATCOM environment variable not set!
-!endif
-
-# In order to process Makefile.inc wmake must be called with -u switch!
-!ifndef %MAKEFLAGS
-!error You MUST call wmake with the -u switch!
-!endif
-
-!ifdef %libname
-LIBNAME = $(%libname)
-!else
-LIBNAME = libcurl
-!endif
-
-TARGETS = curl.exe
-
-CC = wcc386
-LD = wlink
-AR = wlib
-RC = wrc
-
-!ifdef __LOADDLL__
-! loaddll wcc386 wccd386
-! loaddll wpp386 wppd386
-! loaddll wlib wlibd
-! loaddll wlink wlinkd
-!endif
-
-!ifdef __UNIX__
-CP = cp
-MD = mkdir -p
-!else
-CP = copy 2>NUL
-MD = mkdir
-!endif
-!if $(__VERSION__) > 1290
-RD = rm -rf
-!else ifdef __UNIX__
-RD = rm -rf
-!else
-RD = rmdir /q /s 2>NUL
-!endif
-
-SYS_INCL = -I"$(%watcom)/h/nt" -I"$(%watcom)/h"
-
-CFLAGS = -3r -mf -hc -zff -zgf -zq -zm -s -fr=con -w2 -fpi -oilrtfm &
- -wcd=201 -bt=nt -bc -d+ -dWIN32 -dHAVE_STRTOLL &
- -I"../include" -I"../lib" $(SYS_INCL)
-
-!ifdef %debug
-DEBUG = -dDEBUG=1 -dDEBUGBUILD
-CFLAGS += -d3 $(DEBUG)
-!else
-CFLAGS += -d0
-!endif
-
-!ifdef %use_ipv6
-CFLAGS += -d_WIN32_WINNT=0x0501 -dENABLE_IPV6
-!endif
-
-!ifdef %use_ssl
-CFLAGS += -wcd=138 -dUSE_OPENSSL -dUSE_OPENSSL -I"$(OPENSSL_ROOT)/inc32"
-!endif
-
-!ifdef %curl_static
-CFLAGS += -DCURL_STATICLIB
-!else
-CFLAGS += -br
-!endif
-
-#
-# Change to suite.
-#
-!ifdef %zlib_root
-ZLIB_ROOT = $(%zlib_root)
-!else
-ZLIB_ROOT = ../../zlib-1.2.8
-!endif
-
-!ifdef %libssh2_root
-LIBSSH2_ROOT = $(%libssh2_root)
-!else
-LIBSSH2_ROOT = ../../libssh2-1.5.0
-!endif
-
-!ifdef %librtmp_root
-LIBRTMP_ROOT = $(%librtmp_root)
-!else
-LIBRTMP_ROOT = ../../rtmpdump-2.3
-!endif
-
-!ifdef %openssl_root
-OPENSSL_ROOT = $(%openssl_root)
-!else
-OPENSSL_ROOT = ../../openssl-1.0.2a
-!endif
-
-!ifdef %ares_root
-ARES_ROOT = $(%ares_root)
-!else
-ARES_ROOT = ../ares
-!endif
-
-OBJ_DIR = WC_Win32.obj
-LINK_ARG = $(OBJ_DIR)/wlink.arg
-
-!include Makefile.inc
-
-OBJS1 = $(OBJ_DIR)/$(CURL_CFILES)
-!ifndef %curl_static
-OBJS1 += $(CURLX_CFILES:../lib/=)
-!endif
-OBJS2 = $(OBJS1: = $(OBJ_DIR)/)
-OBJS = $(OBJS2:.c=.obj)
-
-RESOURCE = $(OBJ_DIR)/curl.res
-
-DIRS = $(OBJ_DIR)
-
-all: tool_hugehelp.c $(DIRS) $(TARGETS) .SYMBOLIC
- @echo Welcome to curl
-
-clean: .SYMBOLIC
- -rm -f $(OBJS)
- -rm -f $(RESOURCE) $(LINK_ARG)
-
-vclean distclean: clean .SYMBOLIC
- -$(RD) $(OBJ_DIR)
- -rm -f curl.exe curl.sym tool_hugehelp.c
-
-tool_hugehelp.c: tool_hugehelp.c.cvs
- $(CP) $[@ $^@
-
-tool_hugehelp.c.cvs: .EXISTSONLY
- $(CP) tool_hugehelp.c $^@
-
-$(DIRS):
- -$(MD) $^@
-
-curl.exe: $(OBJS) $(RESOURCE)
- %create $(LINK_ARG)
- @%append $(LINK_ARG) system nt
-!ifdef %debug
- @%append $(LINK_ARG) debug all
- @%append $(LINK_ARG) option symfile
-!endif
- @%append $(LINK_ARG) option quiet, caseexact, eliminate
- @%append $(LINK_ARG) option map=$(OBJ_DIR)/$^&.map
- @%append $(LINK_ARG) option res=$(RESOURCE)
- @%append $(LINK_ARG) file { $(OBJS) }
-!ifndef %curl_static
- @%append $(LINK_ARG) library ../lib/$(LIBNAME)_imp.lib
-!else
- @%append $(LINK_ARG) library ../lib/$(LIBNAME).lib
- @%append $(LINK_ARG) library wldap32.lib
-! ifdef %use_zlib
- @%append $(LINK_ARG) library '$(ZLIB_ROOT)/zlib.lib'
-! endif
-! ifdef %use_rtmp
- @%append $(LINK_ARG) library '$(LIBRTMP_ROOT)/librtmp/librtmp.lib'
- @%append $(LINK_ARG) library winmm.lib
-! endif
-! ifdef %use_ssh2
- @%append $(LINK_ARG) library '$(LIBSSH2_ROOT)/win32/libssh2.lib'
-! endif
-! ifdef %use_ssl
- @%append $(LINK_ARG) library '$(OPENSSL_ROOT)/out32/libeay32.lib'
- @%append $(LINK_ARG) library '$(OPENSSL_ROOT)/out32/ssleay32.lib'
-! endif
-! ifdef %use_ares
- @%append $(LINK_ARG) library '$(ARES_ROOT)/cares.lib'
-! endif
-! ifdef %use_winidn
-! if $(__VERSION__) > 1290
- @%append $(LINK_ARG) library normaliz.lib
-! else
- @%append $(LINK_ARG) import '_IdnToAscii@20' 'NORMALIZ.DLL'.'IdnToAscii'
- @%append $(LINK_ARG) import '_IdnToUnicode@20' 'NORMALIZ.DLL'.'IdnToUnicode'
-! endif
-! endif
-!endif
-!ifeq USE_WATT32 1
- @%append $(LINK_ARG) library '$(%watt_root)/lib/wattcpw_imp.lib'
-!else
- @%append $(LINK_ARG) library ws2_32.lib
-!endif
- $(LD) name $^@ @$(LINK_ARG)
-
-$(RESOURCE): curl.rc
- $(RC) $(DEBUG) -q -r -zm -bt=nt -I"../include" $(SYS_INCL) $[@ -fo=$^@
-
-# suffix search path - vpath-like hack
-.c: ../lib
-
-.c{$(OBJ_DIR)}.obj:
- $(CC) $(CFLAGS) $[@ -fo=$^@
diff --git a/src/Makefile.am b/src/Makefile.am
index 90f15624..029a4928 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -87,7 +87,7 @@ NROFF=env LC_ALL=C @NROFF@ @MANOPT@ # figured out by the configure script
EXTRA_DIST = mkhelp.pl makefile.dj \
Makefile.m32 macos/curl.mcp.xml.sit.hqx macos/MACINSTALL.TXT \
macos/src/curl_GUSIConfig.cpp macos/src/macos_main.cpp makefile.amiga \
- curl.rc Makefile.netware Makefile.inc Makefile.Watcom CMakeLists.txt
+ curl.rc Makefile.netware Makefile.inc CMakeLists.txt
# Use absolute directory to disable VPATH
MANPAGE=$(abs_top_builddir)/docs/curl.1
diff --git a/src/Makefile.inc b/src/Makefile.inc
index c0b9ad86..6f236fec 100644
--- a/src/Makefile.inc
+++ b/src/Makefile.inc
@@ -36,7 +36,8 @@ CURLX_CFILES = \
../lib/warnless.c \
../lib/curl_ctype.c \
../lib/curl_multibyte.c \
- ../lib/version_win32.c
+ ../lib/version_win32.c \
+ ../lib/dynbuf.c
CURLX_HFILES = \
../lib/curl_setup.h \
@@ -45,7 +46,8 @@ CURLX_HFILES = \
../lib/warnless.h \
../lib/curl_ctype.h \
../lib/curl_multibyte.h \
- ../lib/version_win32.h
+ ../lib/version_win32.h \
+ ../lib/dynbuf.h
CURL_CFILES = \
slist_wc.c \
diff --git a/src/Makefile.m32 b/src/Makefile.m32
index afb4fd54..b3fcae5c 100644
--- a/src/Makefile.m32
+++ b/src/Makefile.m32
@@ -312,7 +312,12 @@ endif
ifdef ZSTD
INCLUDES += -I"$(ZSTD_PATH)/include"
CFLAGS += -DHAVE_ZSTD
- curl_LDADD += -L"$(ZSTD_PATH)/lib" -lzstd
+ curl_LDADD += -L"$(ZSTD_PATH)/lib"
+ ifdef ZSTD_LIBS
+ curl_LDADD += $(ZSTD_LIBS)
+ else
+ curl_LDADD += -lzstd
+ endif
endif
ifdef BROTLI
INCLUDES += -I"$(BROTLI_PATH)/include"
@@ -375,10 +380,8 @@ include Makefile.inc
curl_PROGRAMS = curl.exe
curl_OBJECTS := $(patsubst %.c,%.o,$(strip $(CURL_CFILES)))
curlx_OBJECTS := $(patsubst %.c,%.o,$(notdir $(strip $(CURLX_CFILES))))
-ifdef DYN
curl_OBJECTS += $(curlx_OBJECTS)
vpath %.c $(PROOT)/lib
-endif
RESOURCE = curl.res
diff --git a/src/tool_cb_hdr.c b/src/tool_cb_hdr.c
index 5741f0ab..6c6c095c 100644
--- a/src/tool_cb_hdr.c
+++ b/src/tool_cb_hdr.c
@@ -98,53 +98,27 @@ size_t tool_header_cb(char *ptr, size_t size, size_t nmemb, void *userdata)
/*
* Write etag to file when --etag-save option is given.
- * etag string that we want is enveloped in double quotes
*/
if(per->config->etag_save_file && etag_save->stream) {
/* match only header that start with etag (case insensitive) */
if(curl_strnequal(str, "etag:", 5)) {
- char *etag_h = NULL;
- char *first = NULL;
- char *last = NULL;
- size_t etag_length = 0;
-
- etag_h = ptr;
- /* point to first occurrence of double quote */
- first = memchr(etag_h, '\"', cb);
-
- /*
- * if server side messed with the etag header and doesn't include
- * double quotes around the etag, kindly exit with a warning
- */
-
- if(!first) {
- warnf(per->config->global,
- "Received header etag is missing double quote/s\n");
- return failure;
- }
- else {
- /* discard first double quote */
- first++;
- }
-
- /* point to last occurrence of double quote */
- last = memchr(first, '\"', cb);
-
- if(!last) {
- warnf(per->config->global,
- "Received header etag is missing double quote/s\n");
- return failure;
+ const char *etag_h = &str[5];
+ const char *eot = end - 1;
+ if(*eot == '\n') {
+ while(ISSPACE(*etag_h) && (etag_h < eot))
+ etag_h++;
+ while(ISSPACE(*eot))
+ eot--;
+
+ if(eot >= etag_h) {
+ size_t etag_length = eot - etag_h + 1;
+ fwrite(etag_h, size, etag_length, etag_save->stream);
+ /* terminate with newline */
+ fputc('\n', etag_save->stream);
+ (void)fflush(etag_save->stream);
+ }
}
-
- /* get length of desired etag */
- etag_length = (size_t)last - (size_t)first;
-
- fwrite(first, size, etag_length, etag_save->stream);
- /* terminate with new line */
- fputc('\n', etag_save->stream);
}
-
- (void)fflush(etag_save->stream);
}
/*
@@ -205,7 +179,17 @@ size_t tool_header_cb(char *ptr, size_t size, size_t nmemb, void *userdata)
if(!outs->stream && !tool_create_output_file(outs, per->config))
return failure;
}
-
+ if(hdrcbdata->config->writeout) {
+ char *value = memchr(ptr, ':', cb);
+ if(value) {
+ if(per->was_last_header_empty)
+ per->num_headers = 0;
+ per->was_last_header_empty = FALSE;
+ per->num_headers++;
+ }
+ else if(ptr[0] == '\r' || ptr[0] == '\n')
+ per->was_last_header_empty = TRUE;
+ }
if(hdrcbdata->config->show_headers &&
(protocol &
(CURLPROTO_HTTP|CURLPROTO_HTTPS|CURLPROTO_RTSP|CURLPROTO_FILE))) {
diff --git a/src/tool_cb_wrt.c b/src/tool_cb_wrt.c
index 64b62fef..6fc51f9a 100644
--- a/src/tool_cb_wrt.c
+++ b/src/tool_cb_wrt.c
@@ -39,6 +39,15 @@
#include "memdebug.h" /* keep this as LAST include */
+#ifndef O_BINARY
+#define O_BINARY 0
+#endif
+#ifdef WIN32
+#define OPENMODE S_IREAD | S_IWRITE
+#else
+#define OPENMODE S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH
+#endif
+
/* create a local file for writing, return TRUE on success */
bool tool_create_output_file(struct OutStruct *outs,
struct OperationConfig *config)
@@ -55,21 +64,24 @@ bool tool_create_output_file(struct OutStruct *outs,
if(outs->is_cd_filename) {
/* don't overwrite existing files */
-#ifndef O_BINARY
-#define O_BINARY 0
-#endif
- int fd = open(outs->filename, O_CREAT | O_WRONLY | O_EXCL | O_BINARY,
-#ifdef WIN32
- S_IREAD | S_IWRITE
-#else
- S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH
-#endif
- );
+ int fd;
+ char *name = outs->filename;
+ char *aname = NULL;
+ if(config->output_dir) {
+ aname = aprintf("%s/%s", config->output_dir, name);
+ if(!aname) {
+ errorf(global, "out of memory\n");
+ return FALSE;
+ }
+ name = aname;
+ }
+ fd = open(name, O_CREAT | O_WRONLY | O_EXCL | O_BINARY, OPENMODE);
if(fd != -1) {
file = fdopen(fd, "wb");
if(!file)
close(fd);
}
+ free(aname);
}
else
/* open file for writing */
diff --git a/src/tool_cfgable.c b/src/tool_cfgable.c
index 63bdeaa4..e99602c4 100644
--- a/src/tool_cfgable.c
+++ b/src/tool_cfgable.c
@@ -89,6 +89,7 @@ static void free_config_fields(struct OperationConfig *config)
Curl_safefree(config->mail_auth);
Curl_safefree(config->netrc_file);
+ Curl_safefree(config->output_dir);
urlnode = config->url_list;
while(urlnode) {
diff --git a/src/tool_cfgable.h b/src/tool_cfgable.h
index 4a90d0b7..489f9ca0 100644
--- a/src/tool_cfgable.h
+++ b/src/tool_cfgable.h
@@ -80,6 +80,7 @@ struct OperationConfig {
double connecttimeout;
long maxredirs;
curl_off_t max_filesize;
+ char *output_dir;
char *headerfile;
char *ftpport;
char *iface;
@@ -161,6 +162,7 @@ struct OperationConfig {
char *etag_compare_file;
bool crlf;
char *customrequest;
+ char *ssl_ec_curves;
char *krblevel;
char *request_target;
long httpversion;
@@ -310,6 +312,7 @@ struct GlobalConfig {
bool parallel;
long parallel_max;
bool parallel_connect;
+ char *help_category; /* The help category, if set */
struct OperationConfig *first;
struct OperationConfig *current;
struct OperationConfig *last; /* Always last in the struct */
diff --git a/src/tool_easysrc.c b/src/tool_easysrc.c
index bb1a135d..7343f7d1 100644
--- a/src/tool_easysrc.c
+++ b/src/tool_easysrc.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -113,7 +113,7 @@ CURLcode easysrc_addf(struct slist_wc **plist, const char *fmt, ...)
va_start(ap, fmt);
bufp = curlx_mvaprintf(fmt, ap);
va_end(ap);
- if(! bufp) {
+ if(!bufp) {
ret = CURLE_OUT_OF_MEMORY;
}
else {
diff --git a/src/tool_getparam.c b/src/tool_getparam.c
index 0648c29b..910a5a2f 100644
--- a/src/tool_getparam.c
+++ b/src/tool_getparam.c
@@ -272,6 +272,7 @@ static const struct LongShort aliases[]= {
{"EB", "socks5-gssapi", ARG_BOOL},
{"EC", "etag-save", ARG_FILENAME},
{"ED", "etag-compare", ARG_FILENAME},
+ {"EE", "curves", ARG_STRING},
{"f", "fail", ARG_BOOL},
{"fa", "fail-early", ARG_BOOL},
{"fb", "styled-output", ARG_BOOL},
@@ -303,6 +304,7 @@ static const struct LongShort aliases[]= {
{"o", "output", ARG_FILENAME},
{"O", "remote-name", ARG_NONE},
{"Oa", "remote-name-all", ARG_BOOL},
+ {"Ob", "output-dir", ARG_STRING},
{"p", "proxytunnel", ARG_BOOL},
{"P", "ftp-port", ARG_STRING},
{"q", "disable", ARG_BOOL},
@@ -1267,11 +1269,11 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
break;
case '4':
/* IPv4 */
- config->ip_version = 4;
+ config->ip_version = CURL_IPRESOLVE_V4;
break;
case '6':
/* IPv6 */
- config->ip_version = 6;
+ config->ip_version = CURL_IPRESOLVE_V6;
break;
case 'a':
/* This makes the FTP sessions use APPE instead of STOR */
@@ -1725,6 +1727,10 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
GetStr(&config->etag_compare_file, nextarg);
break;
+ case 'E':
+ GetStr(&config->ssl_ec_curves, nextarg);
+ break;
+
default: /* unknown flag */
return PARAM_OPTION_UNKNOWN;
}
@@ -1771,6 +1777,11 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
case 'h': /* h for help */
if(toggle) {
+ if(nextarg) {
+ global->help_category = strdup(nextarg);
+ if(!global->help_category)
+ return PARAM_NO_MEM;
+ }
return PARAM_HELP_REQUESTED;
}
/* we now actually support --no-help too! */
@@ -1911,6 +1922,10 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
config->default_node_flags = toggle?GETOUT_USEREMOTE:0;
break;
}
+ else if(subletter == 'b') { /* --output-dir */
+ GetStr(&config->output_dir, nextarg);
+ break;
+ }
/* FALLTHROUGH */
case 'o': /* --output */
/* output file */
diff --git a/src/tool_getpass.c b/src/tool_getpass.c
index d3bd4e68..35e7c73b 100644
--- a/src/tool_getpass.c
+++ b/src/tool_getpass.c
@@ -100,11 +100,7 @@ char *getpass_r(const char *prompt, char *buffer, size_t buflen)
#define DONE
#endif /* __VMS */
-#ifdef __SYMBIAN32__
-# define getch() getchar()
-#endif
-
-#if defined(WIN32) || defined(__SYMBIAN32__)
+#if defined(WIN32)
char *getpass_r(const char *prompt, char *buffer, size_t buflen)
{
@@ -123,10 +119,8 @@ char *getpass_r(const char *prompt, char *buffer, size_t buflen)
previous one as well */
i = i - (i >= 1 ? 2 : 1);
}
-#ifndef __SYMBIAN32__
/* since echo is disabled, print a newline */
fputs("\n", stderr);
-#endif
/* if user didn't hit ENTER, terminate buffer */
if(i == buflen)
buffer[buflen-1] = '\0';
@@ -134,7 +128,7 @@ char *getpass_r(const char *prompt, char *buffer, size_t buflen)
return buffer; /* we always return success */
}
#define DONE
-#endif /* WIN32 || __SYMBIAN32__ */
+#endif /* WIN32 */
#ifdef NETWARE
/* NetWare implementation */
diff --git a/src/tool_help.c b/src/tool_help.c
index 0fc818d3..c7af101e 100644
--- a/src/tool_help.c
+++ b/src/tool_help.c
@@ -36,6 +36,76 @@
#endif
/*
+ * The bitmask output is generated with the following command
+ ------------------------------------------------------------
+ cd $srcroot/docs/cmdline-opts
+ ./gen.pl listcats *.d
+ */
+
+#define CURLHELP_HIDDEN 1u << 0u
+#define CURLHELP_AUTH 1u << 1u
+#define CURLHELP_CONNECTION 1u << 2u
+#define CURLHELP_CURL 1u << 3u
+#define CURLHELP_DNS 1u << 4u
+#define CURLHELP_FILE 1u << 5u
+#define CURLHELP_FTP 1u << 6u
+#define CURLHELP_HTTP 1u << 7u
+#define CURLHELP_IMAP 1u << 8u
+#define CURLHELP_IMPORTANT 1u << 9u
+#define CURLHELP_MISC 1u << 10u
+#define CURLHELP_OUTPUT 1u << 11u
+#define CURLHELP_POP3 1u << 12u
+#define CURLHELP_POST 1u << 13u
+#define CURLHELP_PROXY 1u << 14u
+#define CURLHELP_SCP 1u << 15u
+#define CURLHELP_SFTP 1u << 16u
+#define CURLHELP_SMTP 1u << 17u
+#define CURLHELP_SSH 1u << 18u
+#define CURLHELP_TELNET 1u << 19u
+#define CURLHELP_TFTP 1u << 20u
+#define CURLHELP_TLS 1u << 21u
+#define CURLHELP_UPLOAD 1u << 22u
+#define CURLHELP_VERBOSE 1u << 23u
+
+typedef unsigned int curlhelp_t;
+
+struct category_descriptors {
+ const char *opt;
+ const char *desc;
+ curlhelp_t category;
+};
+
+static const struct category_descriptors categories[] = {
+ {"auth", "Different types of authentication methods", CURLHELP_AUTH},
+ {"connection", "Low level networking operations",
+ CURLHELP_CONNECTION},
+ {"curl", "The command line tool itself", CURLHELP_CURL},
+ {"dns", "General DNS options", CURLHELP_DNS},
+ {"file", "FILE protocol options", CURLHELP_FILE},
+ {"ftp", "FTP protocol options", CURLHELP_FTP},
+ {"http", "HTTP and HTTPS protocol options", CURLHELP_HTTP},
+ {"imap", "IMAP protocol options", CURLHELP_IMAP},
+ /* important is left out because it is the default help page */
+ {"misc", "Options that don't fit into any other category", CURLHELP_MISC},
+ {"output", "The output of curl", CURLHELP_OUTPUT},
+ {"pop3", "POP3 protocol options", CURLHELP_POP3},
+ {"post", "HTTP Post specific options", CURLHELP_POST},
+ {"proxy", "All options related to proxies", CURLHELP_PROXY},
+ {"scp", "SCP protocol options", CURLHELP_SCP},
+ {"sftp", "SFTP protocol options", CURLHELP_SFTP},
+ {"smtp", "SMTP protocol options", CURLHELP_SMTP},
+ {"ssh", "SSH protocol options", CURLHELP_SSH},
+ {"telnet", "TELNET protocol options", CURLHELP_TELNET},
+ {"tftp", "TFTP protocol options", CURLHELP_TFTP},
+ {"tls", "All TLS/SSL related options", CURLHELP_TLS},
+ {"upload", "All options for uploads",
+ CURLHELP_UPLOAD},
+ {"verbose", "Options related to any kind of command line output of curl",
+ CURLHELP_VERBOSE},
+ {NULL, NULL, CURLHELP_HIDDEN}
+};
+
+/*
* The help output is generated with the following command
---------------------------------------------------------
@@ -46,485 +116,720 @@
struct helptxt {
const char *opt;
const char *desc;
+ curlhelp_t categories;
};
static const struct helptxt helptext[] = {
{" --abstract-unix-socket <path>",
- "Connect via abstract Unix domain socket"},
+ "Connect via abstract Unix domain socket",
+ CURLHELP_CONNECTION},
{" --alt-svc <file name>",
- "Enable alt-svc with this cache file"},
+ "Enable alt-svc with this cache file",
+ CURLHELP_HTTP},
{" --anyauth",
- "Pick any authentication method"},
+ "Pick any authentication method",
+ CURLHELP_HTTP | CURLHELP_PROXY | CURLHELP_AUTH},
{"-a, --append",
- "Append to target file when uploading"},
+ "Append to target file when uploading",
+ CURLHELP_FTP | CURLHELP_SFTP},
{" --basic",
- "Use HTTP Basic Authentication"},
+ "Use HTTP Basic Authentication",
+ CURLHELP_AUTH},
{" --cacert <file>",
- "CA certificate to verify peer against"},
+ "CA certificate to verify peer against",
+ CURLHELP_TLS},
{" --capath <dir>",
- "CA directory to verify peer against"},
+ "CA directory to verify peer against",
+ CURLHELP_TLS},
{"-E, --cert <certificate[:password]>",
- "Client certificate file and password"},
+ "Client certificate file and password",
+ CURLHELP_TLS},
{" --cert-status",
- "Verify the status of the server certificate"},
+ "Verify the status of the server certificate",
+ CURLHELP_TLS},
{" --cert-type <type>",
- "Certificate type (DER/PEM/ENG)"},
+ "Certificate type (DER/PEM/ENG)",
+ CURLHELP_TLS},
{" --ciphers <list of ciphers>",
- "SSL ciphers to use"},
+ "SSL ciphers to use",
+ CURLHELP_TLS},
{" --compressed",
- "Request compressed response"},
+ "Request compressed response",
+ CURLHELP_HTTP},
{" --compressed-ssh",
- "Enable SSH compression"},
+ "Enable SSH compression",
+ CURLHELP_SCP | CURLHELP_SSH},
{"-K, --config <file>",
- "Read config from a file"},
+ "Read config from a file",
+ CURLHELP_CURL},
{" --connect-timeout <seconds>",
- "Maximum time allowed for connection"},
+ "Maximum time allowed for connection",
+ CURLHELP_CONNECTION},
{" --connect-to <HOST1:PORT1:HOST2:PORT2>",
- "Connect to host"},
+ "Connect to host",
+ CURLHELP_CONNECTION},
{"-C, --continue-at <offset>",
- "Resumed transfer offset"},
+ "Resumed transfer offset",
+ CURLHELP_CONNECTION},
{"-b, --cookie <data|filename>",
- "Send cookies from string/file"},
+ "Send cookies from string/file",
+ CURLHELP_HTTP},
{"-c, --cookie-jar <filename>",
- "Write cookies to <filename> after operation"},
+ "Write cookies to <filename> after operation",
+ CURLHELP_HTTP},
{" --create-dirs",
- "Create necessary local directory hierarchy"},
+ "Create necessary local directory hierarchy",
+ CURLHELP_CURL},
{" --crlf",
- "Convert LF to CRLF in upload"},
+ "Convert LF to CRLF in upload",
+ CURLHELP_FTP | CURLHELP_SMTP},
{" --crlfile <file>",
- "Get a CRL list in PEM format from the given file"},
+ "Get a CRL list in PEM format from the given file",
+ CURLHELP_TLS},
+ {" --curves <algorithm list>",
+ "(EC) TLS key exchange algorithm(s) to request",
+ CURLHELP_TLS},
{"-d, --data <data>",
- "HTTP POST data"},
+ "HTTP POST data",
+ CURLHELP_IMPORTANT | CURLHELP_HTTP | CURLHELP_POST | CURLHELP_UPLOAD},
{" --data-ascii <data>",
- "HTTP POST ASCII data"},
+ "HTTP POST ASCII data",
+ CURLHELP_HTTP | CURLHELP_POST | CURLHELP_UPLOAD},
{" --data-binary <data>",
- "HTTP POST binary data"},
+ "HTTP POST binary data",
+ CURLHELP_HTTP | CURLHELP_POST | CURLHELP_UPLOAD},
{" --data-raw <data>",
- "HTTP POST data, '@' allowed"},
+ "HTTP POST data, '@' allowed",
+ CURLHELP_HTTP | CURLHELP_POST | CURLHELP_UPLOAD},
{" --data-urlencode <data>",
- "HTTP POST data url encoded"},
+ "HTTP POST data url encoded",
+ CURLHELP_HTTP | CURLHELP_POST | CURLHELP_UPLOAD},
{" --delegation <LEVEL>",
- "GSS-API delegation permission"},
+ "GSS-API delegation permission",
+ CURLHELP_AUTH},
{" --digest",
- "Use HTTP Digest Authentication"},
+ "Use HTTP Digest Authentication",
+ CURLHELP_PROXY | CURLHELP_AUTH | CURLHELP_HTTP},
{"-q, --disable",
- "Disable .curlrc"},
+ "Disable .curlrc",
+ CURLHELP_CURL},
{" --disable-eprt",
- "Inhibit using EPRT or LPRT"},
+ "Inhibit using EPRT or LPRT",
+ CURLHELP_FTP},
{" --disable-epsv",
- "Inhibit using EPSV"},
+ "Inhibit using EPSV",
+ CURLHELP_FTP},
{" --disallow-username-in-url",
- "Disallow username in url"},
+ "Disallow username in url",
+ CURLHELP_CURL | CURLHELP_HTTP},
{" --dns-interface <interface>",
- "Interface to use for DNS requests"},
+ "Interface to use for DNS requests",
+ CURLHELP_DNS},
{" --dns-ipv4-addr <address>",
- "IPv4 address to use for DNS requests"},
+ "IPv4 address to use for DNS requests",
+ CURLHELP_DNS},
{" --dns-ipv6-addr <address>",
- "IPv6 address to use for DNS requests"},
+ "IPv6 address to use for DNS requests",
+ CURLHELP_DNS},
{" --dns-servers <addresses>",
- "DNS server addrs to use"},
+ "DNS server addrs to use",
+ CURLHELP_DNS},
{" --doh-url <URL>",
- "Resolve host names over DOH"},
+ "Resolve host names over DOH",
+ CURLHELP_DNS},
{"-D, --dump-header <filename>",
- "Write the received headers to <filename>"},
+ "Write the received headers to <filename>",
+ CURLHELP_HTTP | CURLHELP_FTP},
{" --egd-file <file>",
- "EGD socket path for random data"},
+ "EGD socket path for random data",
+ CURLHELP_TLS},
{" --engine <name>",
- "Crypto engine to use"},
+ "Crypto engine to use",
+ CURLHELP_TLS},
{" --etag-compare <file>",
- "Pass an ETag from a file as a custom header"},
+ "Pass an ETag from a file as a custom header",
+ CURLHELP_HTTP},
{" --etag-save <file>",
- "Parse ETag from a request and save it to a file"},
+ "Parse ETag from a request and save it to a file",
+ CURLHELP_HTTP},
{" --expect100-timeout <seconds>",
- "How long to wait for 100-continue"},
+ "How long to wait for 100-continue",
+ CURLHELP_HTTP},
{"-f, --fail",
- "Fail silently (no output at all) on HTTP errors"},
+ "Fail silently (no output at all) on HTTP errors",
+ CURLHELP_IMPORTANT | CURLHELP_HTTP},
{" --fail-early",
- "Fail on first transfer error, do not continue"},
+ "Fail on first transfer error, do not continue",
+ CURLHELP_CURL},
{" --false-start",
- "Enable TLS False Start"},
+ "Enable TLS False Start",
+ CURLHELP_TLS},
{"-F, --form <name=content>",
- "Specify multipart MIME data"},
+ "Specify multipart MIME data",
+ CURLHELP_HTTP | CURLHELP_UPLOAD},
{" --form-string <name=string>",
- "Specify multipart MIME data"},
+ "Specify multipart MIME data",
+ CURLHELP_HTTP | CURLHELP_UPLOAD},
{" --ftp-account <data>",
- "Account data string"},
+ "Account data string",
+ CURLHELP_FTP | CURLHELP_AUTH},
{" --ftp-alternative-to-user <command>",
- "String to replace USER [name]"},
+ "String to replace USER [name]",
+ CURLHELP_FTP},
{" --ftp-create-dirs",
- "Create the remote dirs if not present"},
+ "Create the remote dirs if not present",
+ CURLHELP_FTP | CURLHELP_SFTP | CURLHELP_CURL},
{" --ftp-method <method>",
- "Control CWD usage"},
+ "Control CWD usage",
+ CURLHELP_FTP},
{" --ftp-pasv",
- "Use PASV/EPSV instead of PORT"},
+ "Use PASV/EPSV instead of PORT",
+ CURLHELP_FTP},
{"-P, --ftp-port <address>",
- "Use PORT instead of PASV"},
+ "Use PORT instead of PASV",
+ CURLHELP_FTP},
{" --ftp-pret",
- "Send PRET before PASV"},
+ "Send PRET before PASV",
+ CURLHELP_FTP},
{" --ftp-skip-pasv-ip",
- "Skip the IP address for PASV"},
+ "Skip the IP address for PASV",
+ CURLHELP_FTP},
{" --ftp-ssl-ccc",
- "Send CCC after authenticating"},
+ "Send CCC after authenticating",
+ CURLHELP_FTP | CURLHELP_TLS},
{" --ftp-ssl-ccc-mode <active/passive>",
- "Set CCC mode"},
+ "Set CCC mode",
+ CURLHELP_FTP | CURLHELP_TLS},
{" --ftp-ssl-control",
- "Require SSL/TLS for FTP login, clear for transfer"},
+ "Require SSL/TLS for FTP login, clear for transfer",
+ CURLHELP_FTP | CURLHELP_TLS},
{"-G, --get",
- "Put the post data in the URL and use GET"},
+ "Put the post data in the URL and use GET",
+ CURLHELP_HTTP | CURLHELP_UPLOAD},
{"-g, --globoff",
- "Disable URL sequences and ranges using {} and []"},
+ "Disable URL sequences and ranges using {} and []",
+ CURLHELP_CURL},
{" --happy-eyeballs-timeout-ms <milliseconds>",
- "Time for IPv6 before trying IPv4"},
+ "Time for IPv6 before trying IPv4",
+ CURLHELP_CONNECTION},
{" --haproxy-protocol",
- "Send HAProxy PROXY protocol v1 header"},
+ "Send HAProxy PROXY protocol v1 header",
+ CURLHELP_HTTP | CURLHELP_PROXY},
{"-I, --head",
- "Show document info only"},
+ "Show document info only",
+ CURLHELP_HTTP | CURLHELP_FTP | CURLHELP_FILE},
{"-H, --header <header/@file>",
- "Pass custom header(s) to server"},
- {"-h, --help",
- "This help text"},
+ "Pass custom header(s) to server",
+ CURLHELP_HTTP},
+ {"-h, --help <category>",
+ "Get help for commands",
+ CURLHELP_IMPORTANT | CURLHELP_CURL},
{" --hostpubmd5 <md5>",
- "Acceptable MD5 hash of the host public key"},
+ "Acceptable MD5 hash of the host public key",
+ CURLHELP_SFTP | CURLHELP_SCP},
{" --http0.9",
- "Allow HTTP 0.9 responses"},
+ "Allow HTTP 0.9 responses",
+ CURLHELP_HTTP},
{"-0, --http1.0",
- "Use HTTP 1.0"},
+ "Use HTTP 1.0",
+ CURLHELP_HTTP},
{" --http1.1",
- "Use HTTP 1.1"},
+ "Use HTTP 1.1",
+ CURLHELP_HTTP},
{" --http2",
- "Use HTTP 2"},
+ "Use HTTP 2",
+ CURLHELP_HTTP},
{" --http2-prior-knowledge",
- "Use HTTP 2 without HTTP/1.1 Upgrade"},
+ "Use HTTP 2 without HTTP/1.1 Upgrade",
+ CURLHELP_HTTP},
{" --http3",
- "Use HTTP v3"},
+ "Use HTTP v3",
+ CURLHELP_HTTP},
{" --ignore-content-length",
- "Ignore the size of the remote resource"},
+ "Ignore the size of the remote resource",
+ CURLHELP_HTTP | CURLHELP_FTP},
{"-i, --include",
- "Include protocol response headers in the output"},
+ "Include protocol response headers in the output",
+ CURLHELP_IMPORTANT | CURLHELP_VERBOSE},
{"-k, --insecure",
- "Allow insecure server connections when using SSL"},
+ "Allow insecure server connections when using SSL",
+ CURLHELP_TLS},
{" --interface <name>",
- "Use network INTERFACE (or address)"},
+ "Use network INTERFACE (or address)",
+ CURLHELP_CONNECTION},
{"-4, --ipv4",
- "Resolve names to IPv4 addresses"},
+ "Resolve names to IPv4 addresses",
+ CURLHELP_CONNECTION | CURLHELP_DNS},
{"-6, --ipv6",
- "Resolve names to IPv6 addresses"},
+ "Resolve names to IPv6 addresses",
+ CURLHELP_CONNECTION | CURLHELP_DNS},
{"-j, --junk-session-cookies",
- "Ignore session cookies read from file"},
+ "Ignore session cookies read from file",
+ CURLHELP_HTTP},
{" --keepalive-time <seconds>",
- "Interval time for keepalive probes"},
+ "Interval time for keepalive probes",
+ CURLHELP_CONNECTION},
{" --key <key>",
- "Private key file name"},
+ "Private key file name",
+ CURLHELP_TLS | CURLHELP_SSH},
{" --key-type <type>",
- "Private key file type (DER/PEM/ENG)"},
+ "Private key file type (DER/PEM/ENG)",
+ CURLHELP_TLS},
{" --krb <level>",
- "Enable Kerberos with security <level>"},
+ "Enable Kerberos with security <level>",
+ CURLHELP_FTP},
{" --libcurl <file>",
- "Dump libcurl equivalent code of this command line"},
+ "Dump libcurl equivalent code of this command line",
+ CURLHELP_CURL},
{" --limit-rate <speed>",
- "Limit transfer speed to RATE"},
+ "Limit transfer speed to RATE",
+ CURLHELP_CONNECTION},
{"-l, --list-only",
- "List only mode"},
+ "List only mode",
+ CURLHELP_FTP | CURLHELP_POP3},
{" --local-port <num/range>",
- "Force use of RANGE for local port numbers"},
+ "Force use of RANGE for local port numbers",
+ CURLHELP_CONNECTION},
{"-L, --location",
- "Follow redirects"},
+ "Follow redirects",
+ CURLHELP_HTTP},
{" --location-trusted",
- "Like --location, and send auth to other hosts"},
+ "Like --location, and send auth to other hosts",
+ CURLHELP_HTTP | CURLHELP_AUTH},
{" --login-options <options>",
- "Server login options"},
+ "Server login options",
+ CURLHELP_IMAP | CURLHELP_POP3 | CURLHELP_SMTP | CURLHELP_AUTH},
{" --mail-auth <address>",
- "Originator address of the original email"},
+ "Originator address of the original email",
+ CURLHELP_SMTP},
{" --mail-from <address>",
- "Mail from this address"},
+ "Mail from this address",
+ CURLHELP_SMTP},
{" --mail-rcpt <address>",
- "Mail to this address"},
+ "Mail to this address",
+ CURLHELP_SMTP},
{" --mail-rcpt-allowfails",
- "Allow RCPT TO command to fail for some recipients"},
+ "Allow RCPT TO command to fail for some recipients",
+ CURLHELP_SMTP},
{"-M, --manual",
- "Display the full manual"},
+ "Display the full manual",
+ CURLHELP_CURL},
{" --max-filesize <bytes>",
- "Maximum file size to download"},
+ "Maximum file size to download",
+ CURLHELP_CONNECTION},
{" --max-redirs <num>",
- "Maximum number of redirects allowed"},
+ "Maximum number of redirects allowed",
+ CURLHELP_HTTP},
{"-m, --max-time <seconds>",
- "Maximum time allowed for the transfer"},
+ "Maximum time allowed for the transfer",
+ CURLHELP_CONNECTION},
{" --metalink",
- "Process given URLs as metalink XML file"},
+ "Process given URLs as metalink XML file",
+ CURLHELP_MISC},
{" --negotiate",
- "Use HTTP Negotiate (SPNEGO) authentication"},
+ "Use HTTP Negotiate (SPNEGO) authentication",
+ CURLHELP_AUTH | CURLHELP_HTTP},
{"-n, --netrc",
- "Must read .netrc for user name and password"},
+ "Must read .netrc for user name and password",
+ CURLHELP_CURL},
{" --netrc-file <filename>",
- "Specify FILE for netrc"},
+ "Specify FILE for netrc",
+ CURLHELP_CURL},
{" --netrc-optional",
- "Use either .netrc or URL"},
+ "Use either .netrc or URL",
+ CURLHELP_CURL},
{"-:, --next",
- "Make next URL use its separate set of options"},
+ "Make next URL use its separate set of options",
+ CURLHELP_CURL},
{" --no-alpn",
- "Disable the ALPN TLS extension"},
+ "Disable the ALPN TLS extension",
+ CURLHELP_TLS | CURLHELP_HTTP},
{"-N, --no-buffer",
- "Disable buffering of the output stream"},
+ "Disable buffering of the output stream",
+ CURLHELP_CURL},
{" --no-keepalive",
- "Disable TCP keepalive on the connection"},
+ "Disable TCP keepalive on the connection",
+ CURLHELP_CONNECTION},
{" --no-npn",
- "Disable the NPN TLS extension"},
+ "Disable the NPN TLS extension",
+ CURLHELP_TLS | CURLHELP_HTTP},
{" --no-progress-meter",
- "Do not show the progress meter"},
+ "Do not show the progress meter",
+ CURLHELP_VERBOSE},
{" --no-sessionid",
- "Disable SSL session-ID reusing"},
+ "Disable SSL session-ID reusing",
+ CURLHELP_TLS},
{" --noproxy <no-proxy-list>",
- "List of hosts which do not use proxy"},
+ "List of hosts which do not use proxy",
+ CURLHELP_PROXY},
{" --ntlm",
- "Use HTTP NTLM authentication"},
+ "Use HTTP NTLM authentication",
+ CURLHELP_AUTH | CURLHELP_HTTP},
{" --ntlm-wb",
- "Use HTTP NTLM authentication with winbind"},
+ "Use HTTP NTLM authentication with winbind",
+ CURLHELP_AUTH | CURLHELP_HTTP},
{" --oauth2-bearer <token>",
- "OAuth 2 Bearer Token"},
+ "OAuth 2 Bearer Token",
+ CURLHELP_AUTH},
{"-o, --output <file>",
- "Write to file instead of stdout"},
+ "Write to file instead of stdout",
+ CURLHELP_IMPORTANT | CURLHELP_CURL},
+ {" --output-dir <dir>",
+ "Directory to save files in",
+ CURLHELP_CURL},
{"-Z, --parallel",
- "Perform transfers in parallel"},
+ "Perform transfers in parallel",
+ CURLHELP_CONNECTION | CURLHELP_CURL},
{" --parallel-immediate",
- "Do not wait for multiplexing (with --parallel)"},
+ "Do not wait for multiplexing (with --parallel)",
+ CURLHELP_CONNECTION | CURLHELP_CURL},
{" --parallel-max",
- "Maximum concurrency for parallel transfers"},
+ "Maximum concurrency for parallel transfers",
+ CURLHELP_CONNECTION | CURLHELP_CURL},
{" --pass <phrase>",
- "Pass phrase for the private key"},
+ "Pass phrase for the private key",
+ CURLHELP_SSH | CURLHELP_TLS | CURLHELP_AUTH},
{" --path-as-is",
- "Do not squash .. sequences in URL path"},
+ "Do not squash .. sequences in URL path",
+ CURLHELP_CURL},
{" --pinnedpubkey <hashes>",
- "FILE/HASHES Public key to verify peer against"},
+ "FILE/HASHES Public key to verify peer against",
+ CURLHELP_TLS},
{" --post301",
- "Do not switch to GET after following a 301"},
+ "Do not switch to GET after following a 301",
+ CURLHELP_HTTP | CURLHELP_POST},
{" --post302",
- "Do not switch to GET after following a 302"},
+ "Do not switch to GET after following a 302",
+ CURLHELP_HTTP | CURLHELP_POST},
{" --post303",
- "Do not switch to GET after following a 303"},
+ "Do not switch to GET after following a 303",
+ CURLHELP_HTTP | CURLHELP_POST},
{" --preproxy [protocol://]host[:port]",
- "Use this proxy first"},
+ "Use this proxy first",
+ CURLHELP_PROXY},
{"-#, --progress-bar",
- "Display transfer progress as a bar"},
+ "Display transfer progress as a bar",
+ CURLHELP_VERBOSE},
{" --proto <protocols>",
- "Enable/disable PROTOCOLS"},
+ "Enable/disable PROTOCOLS",
+ CURLHELP_CONNECTION | CURLHELP_CURL},
{" --proto-default <protocol>",
- "Use PROTOCOL for any URL missing a scheme"},
+ "Use PROTOCOL for any URL missing a scheme",
+ CURLHELP_CONNECTION | CURLHELP_CURL},
{" --proto-redir <protocols>",
- "Enable/disable PROTOCOLS on redirect"},
+ "Enable/disable PROTOCOLS on redirect",
+ CURLHELP_CONNECTION | CURLHELP_CURL},
{"-x, --proxy [protocol://]host[:port]",
- "Use this proxy"},
+ "Use this proxy",
+ CURLHELP_PROXY},
{" --proxy-anyauth",
- "Pick any proxy authentication method"},
+ "Pick any proxy authentication method",
+ CURLHELP_PROXY | CURLHELP_AUTH},
{" --proxy-basic",
- "Use Basic authentication on the proxy"},
+ "Use Basic authentication on the proxy",
+ CURLHELP_PROXY | CURLHELP_AUTH},
{" --proxy-cacert <file>",
- "CA certificate to verify peer against for proxy"},
+ "CA certificate to verify peer against for proxy",
+ CURLHELP_PROXY | CURLHELP_TLS},
{" --proxy-capath <dir>",
- "CA directory to verify peer against for proxy"},
+ "CA directory to verify peer against for proxy",
+ CURLHELP_PROXY | CURLHELP_TLS},
{" --proxy-cert <cert[:passwd]>",
- "Set client certificate for proxy"},
+ "Set client certificate for proxy",
+ CURLHELP_PROXY | CURLHELP_TLS},
{" --proxy-cert-type <type>",
- "Client certificate type for HTTPS proxy"},
+ "Client certificate type for HTTPS proxy",
+ CURLHELP_PROXY | CURLHELP_TLS},
{" --proxy-ciphers <list>",
- "SSL ciphers to use for proxy"},
+ "SSL ciphers to use for proxy",
+ CURLHELP_PROXY | CURLHELP_TLS},
{" --proxy-crlfile <file>",
- "Set a CRL list for proxy"},
+ "Set a CRL list for proxy",
+ CURLHELP_PROXY | CURLHELP_TLS},
{" --proxy-digest",
- "Use Digest authentication on the proxy"},
+ "Use Digest authentication on the proxy",
+ CURLHELP_PROXY | CURLHELP_TLS},
{" --proxy-header <header/@file>",
- "Pass custom header(s) to proxy"},
+ "Pass custom header(s) to proxy",
+ CURLHELP_PROXY},
{" --proxy-insecure",
- "Do HTTPS proxy connections without verifying the proxy"},
+ "Do HTTPS proxy connections without verifying the proxy",
+ CURLHELP_PROXY | CURLHELP_TLS},
{" --proxy-key <key>",
- "Private key for HTTPS proxy"},
+ "Private key for HTTPS proxy",
+ CURLHELP_PROXY | CURLHELP_TLS},
{" --proxy-key-type <type>",
- "Private key file type for proxy"},
+ "Private key file type for proxy",
+ CURLHELP_PROXY | CURLHELP_TLS},
{" --proxy-negotiate",
- "Use HTTP Negotiate (SPNEGO) authentication on the proxy"},
+ "Use HTTP Negotiate (SPNEGO) authentication on the proxy",
+ CURLHELP_PROXY | CURLHELP_AUTH},
{" --proxy-ntlm",
- "Use NTLM authentication on the proxy"},
+ "Use NTLM authentication on the proxy",
+ CURLHELP_PROXY | CURLHELP_AUTH},
{" --proxy-pass <phrase>",
- "Pass phrase for the private key for HTTPS proxy"},
+ "Pass phrase for the private key for HTTPS proxy",
+ CURLHELP_PROXY | CURLHELP_TLS | CURLHELP_AUTH},
{" --proxy-pinnedpubkey <hashes>",
- "FILE/HASHES public key to verify proxy with"},
+ "FILE/HASHES public key to verify proxy with",
+ CURLHELP_PROXY | CURLHELP_TLS},
{" --proxy-service-name <name>",
- "SPNEGO proxy service name"},
+ "SPNEGO proxy service name",
+ CURLHELP_PROXY | CURLHELP_TLS},
{" --proxy-ssl-allow-beast",
- "Allow security flaw for interop for HTTPS proxy"},
+ "Allow security flaw for interop for HTTPS proxy",
+ CURLHELP_PROXY | CURLHELP_TLS},
{" --proxy-tls13-ciphers <ciphersuite list>",
- "TLS 1.3 proxy cipher suites"},
+ "TLS 1.3 proxy cipher suites",
+ CURLHELP_PROXY | CURLHELP_TLS},
{" --proxy-tlsauthtype <type>",
- "TLS authentication type for HTTPS proxy"},
+ "TLS authentication type for HTTPS proxy",
+ CURLHELP_PROXY | CURLHELP_TLS | CURLHELP_AUTH},
{" --proxy-tlspassword <string>",
- "TLS password for HTTPS proxy"},
+ "TLS password for HTTPS proxy",
+ CURLHELP_PROXY | CURLHELP_TLS | CURLHELP_AUTH},
{" --proxy-tlsuser <name>",
- "TLS username for HTTPS proxy"},
+ "TLS username for HTTPS proxy",
+ CURLHELP_PROXY | CURLHELP_TLS | CURLHELP_AUTH},
{" --proxy-tlsv1",
- "Use TLSv1 for HTTPS proxy"},
+ "Use TLSv1 for HTTPS proxy",
+ CURLHELP_PROXY | CURLHELP_TLS | CURLHELP_AUTH},
{"-U, --proxy-user <user:password>",
- "Proxy user and password"},
+ "Proxy user and password",
+ CURLHELP_PROXY | CURLHELP_AUTH},
{" --proxy1.0 <host[:port]>",
- "Use HTTP/1.0 proxy on given port"},
+ "Use HTTP/1.0 proxy on given port",
+ CURLHELP_PROXY},
{"-p, --proxytunnel",
- "Operate through an HTTP proxy tunnel (using CONNECT)"},
+ "Operate through an HTTP proxy tunnel (using CONNECT)",
+ CURLHELP_PROXY},
{" --pubkey <key>",
- "SSH Public key file name"},
+ "SSH Public key file name",
+ CURLHELP_SFTP | CURLHELP_SCP | CURLHELP_AUTH},
{"-Q, --quote",
- "Send command(s) to server before transfer"},
+ "Send command(s) to server before transfer",
+ CURLHELP_FTP | CURLHELP_SFTP},
{" --random-file <file>",
- "File for reading random data from"},
+ "File for reading random data from",
+ CURLHELP_MISC},
{"-r, --range <range>",
- "Retrieve only the bytes within RANGE"},
+ "Retrieve only the bytes within RANGE",
+ CURLHELP_HTTP | CURLHELP_FTP | CURLHELP_SFTP | CURLHELP_FILE},
{" --raw",
- "Do HTTP \"raw\"; no transfer decoding"},
+ "Do HTTP \"raw\"; no transfer decoding",
+ CURLHELP_HTTP},
{"-e, --referer <URL>",
- "Referrer URL"},
+ "Referrer URL",
+ CURLHELP_HTTP},
{"-J, --remote-header-name",
- "Use the header-provided filename"},
+ "Use the header-provided filename",
+ CURLHELP_OUTPUT},
{"-O, --remote-name",
- "Write output to a file named as the remote file"},
+ "Write output to a file named as the remote file",
+ CURLHELP_IMPORTANT | CURLHELP_OUTPUT},
{" --remote-name-all",
- "Use the remote file name for all URLs"},
+ "Use the remote file name for all URLs",
+ CURLHELP_OUTPUT},
{"-R, --remote-time",
- "Set the remote file's time on the local output"},
+ "Set the remote file's time on the local output",
+ CURLHELP_OUTPUT},
{"-X, --request <command>",
- "Specify request command to use"},
+ "Specify request command to use",
+ CURLHELP_CONNECTION},
{" --request-target",
- "Specify the target for this request"},
+ "Specify the target for this request",
+ CURLHELP_HTTP},
{" --resolve <host:port:addr[,addr]...>",
- "Resolve the host+port to this address"},
+ "Resolve the host+port to this address",
+ CURLHELP_CONNECTION},
{" --retry <num>",
- "Retry request if transient problems occur"},
+ "Retry request if transient problems occur",
+ CURLHELP_CURL},
{" --retry-all-errors",
- "Retry all errors (use with --retry)"},
+ "Retry all errors (use with --retry)",
+ CURLHELP_CURL},
{" --retry-connrefused",
- "Retry on connection refused (use with --retry)"},
+ "Retry on connection refused (use with --retry)",
+ CURLHELP_CURL},
{" --retry-delay <seconds>",
- "Wait time between retries"},
+ "Wait time between retries",
+ CURLHELP_CURL},
{" --retry-max-time <seconds>",
- "Retry only within this period"},
+ "Retry only within this period",
+ CURLHELP_CURL},
{" --sasl-authzid <identity>",
- "Identity for SASL PLAIN authentication"},
+ "Identity for SASL PLAIN authentication",
+ CURLHELP_AUTH},
{" --sasl-ir",
- "Enable initial response in SASL authentication"},
+ "Enable initial response in SASL authentication",
+ CURLHELP_AUTH},
{" --service-name <name>",
- "SPNEGO service name"},
+ "SPNEGO service name",
+ CURLHELP_MISC},
{"-S, --show-error",
- "Show error even when -s is used"},
+ "Show error even when -s is used",
+ CURLHELP_CURL},
{"-s, --silent",
- "Silent mode"},
+ "Silent mode",
+ CURLHELP_IMPORTANT | CURLHELP_VERBOSE},
{" --socks4 <host[:port]>",
- "SOCKS4 proxy on given host + port"},
+ "SOCKS4 proxy on given host + port",
+ CURLHELP_PROXY},
{" --socks4a <host[:port]>",
- "SOCKS4a proxy on given host + port"},
+ "SOCKS4a proxy on given host + port",
+ CURLHELP_PROXY},
{" --socks5 <host[:port]>",
- "SOCKS5 proxy on given host + port"},
+ "SOCKS5 proxy on given host + port",
+ CURLHELP_PROXY},
{" --socks5-basic",
- "Enable username/password auth for SOCKS5 proxies"},
+ "Enable username/password auth for SOCKS5 proxies",
+ CURLHELP_PROXY | CURLHELP_AUTH},
{" --socks5-gssapi",
- "Enable GSS-API auth for SOCKS5 proxies"},
+ "Enable GSS-API auth for SOCKS5 proxies",
+ CURLHELP_PROXY | CURLHELP_AUTH},
{" --socks5-gssapi-nec",
- "Compatibility with NEC SOCKS5 server"},
+ "Compatibility with NEC SOCKS5 server",
+ CURLHELP_PROXY | CURLHELP_AUTH},
{" --socks5-gssapi-service <name>",
- "SOCKS5 proxy service name for GSS-API"},
+ "SOCKS5 proxy service name for GSS-API",
+ CURLHELP_PROXY | CURLHELP_AUTH},
{" --socks5-hostname <host[:port]>",
- "SOCKS5 proxy, pass host name to proxy"},
+ "SOCKS5 proxy, pass host name to proxy",
+ CURLHELP_PROXY},
{"-Y, --speed-limit <speed>",
- "Stop transfers slower than this"},
+ "Stop transfers slower than this",
+ CURLHELP_CONNECTION},
{"-y, --speed-time <seconds>",
- "Trigger 'speed-limit' abort after this time"},
+ "Trigger 'speed-limit' abort after this time",
+ CURLHELP_CONNECTION},
{" --ssl",
- "Try SSL/TLS"},
+ "Try SSL/TLS",
+ CURLHELP_TLS},
{" --ssl-allow-beast",
- "Allow security flaw to improve interop"},
+ "Allow security flaw to improve interop",
+ CURLHELP_TLS},
{" --ssl-no-revoke",
- "Disable cert revocation checks (Schannel)"},
+ "Disable cert revocation checks (Schannel)",
+ CURLHELP_TLS},
{" --ssl-reqd",
- "Require SSL/TLS"},
+ "Require SSL/TLS",
+ CURLHELP_TLS},
{" --ssl-revoke-best-effort",
- "Ignore missing/offline cert CRL dist points"},
+ "Ignore missing/offline cert CRL dist points",
+ CURLHELP_TLS},
{"-2, --sslv2",
- "Use SSLv2"},
+ "Use SSLv2",
+ CURLHELP_TLS},
{"-3, --sslv3",
- "Use SSLv3"},
+ "Use SSLv3",
+ CURLHELP_TLS},
{" --stderr",
- "Where to redirect stderr"},
+ "Where to redirect stderr",
+ CURLHELP_VERBOSE},
{" --styled-output",
- "Enable styled output for HTTP headers"},
+ "Enable styled output for HTTP headers",
+ CURLHELP_VERBOSE},
{" --suppress-connect-headers",
- "Suppress proxy CONNECT response headers"},
+ "Suppress proxy CONNECT response headers",
+ CURLHELP_PROXY},
{" --tcp-fastopen",
- "Use TCP Fast Open"},
+ "Use TCP Fast Open",
+ CURLHELP_CONNECTION},
{" --tcp-nodelay",
- "Use the TCP_NODELAY option"},
+ "Use the TCP_NODELAY option",
+ CURLHELP_CONNECTION},
{"-t, --telnet-option <opt=val>",
- "Set telnet option"},
+ "Set telnet option",
+ CURLHELP_TELNET},
{" --tftp-blksize <value>",
- "Set TFTP BLKSIZE option"},
+ "Set TFTP BLKSIZE option",
+ CURLHELP_TFTP},
{" --tftp-no-options",
- "Do not send any TFTP options"},
+ "Do not send any TFTP options",
+ CURLHELP_TFTP},
{"-z, --time-cond <time>",
- "Transfer based on a time condition"},
+ "Transfer based on a time condition",
+ CURLHELP_HTTP | CURLHELP_FTP},
{" --tls-max <VERSION>",
- "Set maximum allowed TLS version"},
+ "Set maximum allowed TLS version",
+ CURLHELP_TLS},
{" --tls13-ciphers <ciphersuite list>",
- "TLS 1.3 cipher suites to use"},
+ "TLS 1.3 cipher suites to use",
+ CURLHELP_TLS},
{" --tlsauthtype <type>",
- "TLS authentication type"},
+ "TLS authentication type",
+ CURLHELP_TLS | CURLHELP_AUTH},
{" --tlspassword",
- "TLS password"},
+ "TLS password",
+ CURLHELP_TLS | CURLHELP_AUTH},
{" --tlsuser <name>",
- "TLS user name"},
+ "TLS user name",
+ CURLHELP_TLS | CURLHELP_AUTH},
{"-1, --tlsv1",
- "Use TLSv1.0 or greater"},
+ "Use TLSv1.0 or greater",
+ CURLHELP_TLS},
{" --tlsv1.0",
- "Use TLSv1.0 or greater"},
+ "Use TLSv1.0 or greater",
+ CURLHELP_TLS},
{" --tlsv1.1",
- "Use TLSv1.1 or greater"},
+ "Use TLSv1.1 or greater",
+ CURLHELP_TLS},
{" --tlsv1.2",
- "Use TLSv1.2 or greater"},
+ "Use TLSv1.2 or greater",
+ CURLHELP_TLS},
{" --tlsv1.3",
- "Use TLSv1.3 or greater"},
+ "Use TLSv1.3 or greater",
+ CURLHELP_TLS},
{" --tr-encoding",
- "Request compressed transfer encoding"},
+ "Request compressed transfer encoding",
+ CURLHELP_HTTP},
{" --trace <file>",
- "Write a debug trace to FILE"},
+ "Write a debug trace to FILE",
+ CURLHELP_VERBOSE},
{" --trace-ascii <file>",
- "Like --trace, but without hex output"},
+ "Like --trace, but without hex output",
+ CURLHELP_VERBOSE},
{" --trace-time",
- "Add time stamps to trace/verbose output"},
+ "Add time stamps to trace/verbose output",
+ CURLHELP_VERBOSE},
{" --unix-socket <path>",
- "Connect through this Unix domain socket"},
+ "Connect through this Unix domain socket",
+ CURLHELP_CONNECTION},
{"-T, --upload-file <file>",
- "Transfer local FILE to destination"},
+ "Transfer local FILE to destination",
+ CURLHELP_IMPORTANT | CURLHELP_UPLOAD},
{" --url <url>",
- "URL to work with"},
+ "URL to work with",
+ CURLHELP_CURL},
{"-B, --use-ascii",
- "Use ASCII/text transfer"},
+ "Use ASCII/text transfer",
+ CURLHELP_MISC},
{"-u, --user <user:password>",
- "Server user and password"},
+ "Server user and password",
+ CURLHELP_IMPORTANT | CURLHELP_AUTH},
{"-A, --user-agent <name>",
- "Send User-Agent <name> to server"},
+ "Send User-Agent <name> to server",
+ CURLHELP_IMPORTANT | CURLHELP_HTTP},
{"-v, --verbose",
- "Make the operation more talkative"},
+ "Make the operation more talkative",
+ CURLHELP_IMPORTANT | CURLHELP_VERBOSE},
{"-V, --version",
- "Show version number and quit"},
+ "Show version number and quit",
+ CURLHELP_IMPORTANT | CURLHELP_CURL},
{"-w, --write-out <format>",
- "Use output FORMAT after completion"},
+ "Use output FORMAT after completion",
+ CURLHELP_VERBOSE},
{" --xattr",
- "Store metadata in extended file attributes"},
- { NULL, NULL }
+ "Store metadata in extended file attributes",
+ CURLHELP_MISC},
+ { NULL, NULL, CURLHELP_HIDDEN }
};
#ifdef NETWARE
# define PRINT_LINES_PAUSE 23
#endif
-#ifdef __SYMBIAN32__
-# define PRINT_LINES_PAUSE 16
-#endif
-
struct feat {
const char *name;
int bitmask;
@@ -559,17 +864,62 @@ static const struct feat feats[] = {
{"alt-svc", CURL_VERSION_ALTSVC},
};
-void tool_help(void)
+static void print_category(curlhelp_t category)
+{
+ unsigned int i;
+ for(i = 0; helptext[i].opt; ++i)
+ if(helptext[i].categories & category) {
+ printf(" %-19s %s\n", helptext[i].opt, helptext[i].desc);
+ }
+}
+
+/* Prints category if found. If not, it returns 1 */
+static int get_category_content(const char *category)
+{
+ unsigned int i;
+ for(i = 0; categories[i].opt; ++i)
+ if(curl_strequal(categories[i].opt, category)) {
+ printf("%s: %s\n", categories[i].opt, categories[i].desc);
+ print_category(categories[i].category);
+ return 0;
+ }
+ return 1;
+}
+
+/* Prints all categories and their description */
+static void get_categories(void)
+{
+ unsigned int i;
+ for(i = 0; categories[i].opt; ++i)
+ printf(" %-11s %s\n", categories[i].opt, categories[i].desc);
+}
+
+
+void tool_help(char *category)
{
- int i;
puts("Usage: curl [options...] <url>");
- for(i = 0; helptext[i].opt; i++) {
- printf(" %-19s %s\n", helptext[i].opt, helptext[i].desc);
-#ifdef PRINT_LINES_PAUSE
- if(i && ((i % PRINT_LINES_PAUSE) == 0))
- tool_pressanykey();
-#endif
+ /* If no category was provided */
+ if(!category) {
+ const char *category_note = "\nThis is not the full help, this "
+ "menu is stripped into categories.\nUse \"--help category\" to get "
+ "an overview of all categories.\nFor all options use the manual"
+ " or \"--help all\".";
+ print_category(CURLHELP_IMPORTANT);
+ puts(category_note);
+ }
+ /* Lets print everything if "all" was provided */
+ else if(curl_strequal(category, "all"))
+ /* Print everything except hidden */
+ print_category(~(CURLHELP_HIDDEN));
+ /* Lets handle the string "category" differently to not print an errormsg */
+ else if(curl_strequal(category, "category"))
+ get_categories();
+ /* Otherwise print category and handle the case if the cat was not found */
+ else if(get_category_content(category)) {
+ puts("Invalid category provided, here is a list of all categories:\n");
+ get_categories();
}
+ free(category);
}
static int
diff --git a/src/tool_help.h b/src/tool_help.h
index bfb5dcdf..1da23cc5 100644
--- a/src/tool_help.h
+++ b/src/tool_help.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -23,7 +23,7 @@
***************************************************************************/
#include "tool_setup.h"
-void tool_help(void);
+void tool_help(char *category);
void tool_list_engines(void);
void tool_version_info(void);
diff --git a/src/tool_homedir.c b/src/tool_homedir.c
index 719ff6a5..3529672d 100644
--- a/src/tool_homedir.c
+++ b/src/tool_homedir.c
@@ -25,6 +25,13 @@
# include <pwd.h>
#endif
+#ifdef HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+
#include <curl/mprintf.h>
#include "tool_homedir.h"
@@ -45,7 +52,27 @@ static char *GetEnv(const char *variable)
}
/* return the home directory of the current user as an allocated string */
-char *homedir(void)
+
+/*
+ * The original logic found a home dir to use (by checking a range of
+ * environment variables and last using getpwuid) and returned that for the
+ * parent to use.
+ *
+ * With the XDG_CONFIG_HOME support (added much later than the other), this
+ * variable is treated differently in order to not ruin existing installations
+ * even if this environment variable is set. If this variable is set, and a
+ * file name is set to check, then only if that file name exists in that
+ * directory will it be returned as a "home directory".
+ *
+ * 1. use CURL_HOME if set
+ * 2. use XDG_CONFIG_HOME if set and fname is present
+ * 3. use HOME if set
+ * 4. Non-windows: use getpwuid
+ * 5. Windows: use APPDATA if set
+ * 6. Windows: use "USERPROFILE\Application Data" is set
+ */
+
+char *homedir(const char *fname)
{
char *home;
@@ -53,6 +80,22 @@ char *homedir(void)
if(home)
return home;
+ if(fname) {
+ home = GetEnv("XDG_CONFIG_HOME");
+ if(home) {
+ char *c = curl_maprintf("%s" DIR_CHAR "%s", home, fname);
+ if(c) {
+ int fd = open(c, O_RDONLY);
+ curl_free(c);
+ if(fd >= 0) {
+ close(fd);
+ return home;
+ }
+ }
+ free(home);
+ }
+ }
+
home = GetEnv("HOME");
if(home)
return home;
diff --git a/src/tool_homedir.h b/src/tool_homedir.h
index 1f9d54a6..66defc20 100644
--- a/src/tool_homedir.h
+++ b/src/tool_homedir.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -23,6 +23,6 @@
***************************************************************************/
#include "tool_setup.h"
-char *homedir(void);
+char *homedir(const char *fname);
#endif /* HEADER_CURL_TOOL_HOMEDIR_H */
diff --git a/src/tool_hugehelp.c b/src/tool_hugehelp.c
index 06ea2654..a0859d69 100644
--- a/src/tool_hugehelp.c
+++ b/src/tool_hugehelp.c
@@ -279,7 +279,7 @@ void hugehelp(void)
"\n"
" Used together with -u, --user.\n"
"\n"
-" See also --proxy-anyauth and --basic and --digest.\n"
+" See also --proxy-anyauth, --basic and --digest.\n"
"\n"
" -a, --append\n"
, stdout);
@@ -388,7 +388,7 @@ void hugehelp(void)
"\n"
" If this option is used several times, the last one will be used.\n"
"\n"
-" See also -E, --cert and --key and --key-type.\n"
+" See also -E, --cert, --key and --key-type.\n"
"\n"
" -E, --cert <certificate[:password]>\n"
" (TLS) Tells curl to use the specified client certificate file\n"
@@ -456,7 +456,7 @@ void hugehelp(void)
"\n"
, stdout);
fputs(
-" See also --cert-type and --key and --key-type.\n"
+" See also --cert-type, --key and --key-type.\n"
"\n"
" --ciphers <list of ciphers>\n"
" (TLS) Specifies which ciphers to use in the connection. The list\n"
@@ -529,23 +529,29 @@ void hugehelp(void)
" for a default config file and uses it if found. The default con-\n"
" fig file is checked for in the following places in this order:\n"
"\n"
-" 1) curl tries to find the \"home dir\": It first checks for the\n"
-" CURL_HOME and then the HOME environment variables. Failing that,\n"
-" it uses getpwuid() on Unix-like systems (which returns the home\n"
+" 1) Use the CURL_HOME environment variable if set\n"
+"\n"
+" 2) Use the XDG_CONFIG_HOME environment variable if set (Added in\n"
+" 7.73.0)\n"
+"\n"
+" 3) Use the HOME environment variable if set\n"
+"\n"
, stdout);
fputs(
-" dir given the current user in your system). On Windows, it then\n"
-" checks for the APPDATA variable, or as a last resort the '%USER-\n"
-" PROFILE%\\Application Data'.\n"
+" 4) Non-windows: use getpwuid to find the home directory\n"
+"\n"
+" 5) Windows: use APPDATA if set\n"
+"\n"
+" 6) Windows: use \"USERPROFILE0lication Data\" if set\n"
"\n"
-" 2) On windows, if there is no .curlrc file in the home dir, it\n"
+" 7) On windows, if there is no .curlrc file in the home dir, it\n"
" checks for one in the same dir the curl executable is placed. On\n"
" Unix-like systems, it will simply try to load .curlrc from the\n"
" determined home dir.\n"
"\n"
+" # --- Example file ---\n"
, stdout);
fputs(
-" # --- Example file ---\n"
" # this is a comment\n"
" url = \"example.com\"\n"
" output = \"curlhere.html\"\n"
@@ -558,10 +564,10 @@ void hugehelp(void)
" # --- End of example file ---\n"
"\n"
" This option can be used multiple times to load multiple config\n"
-, stdout);
- fputs(
" files.\n"
"\n"
+, stdout);
+ fputs(
" --connect-timeout <seconds>\n"
" Maximum time in seconds that you allow curl's connection to\n"
" take. This only limits the connection phase, so if curl con-\n"
@@ -720,276 +726,294 @@ void hugehelp(void)
"\n"
" Added in 7.19.7.\n"
"\n"
-" --data-ascii <data>\n"
, stdout);
fputs(
+" --curves <algorithm list>\n"
+" (TLS) Tells curl to request specific curves to use during SSL\n"
+" session establishment according to RFC 8422, 5.1. Multiple al-\n"
+" gorithms can be provided by separating them with \":\" (e.g.\n"
+" \"X25519:P-521\"). The parameter is available identically in the\n"
+" \"openssl s_client/s_server\" utilities.\n"
+"\n"
+" --curves allows a OpenSSL powered curl to make SSL-connections\n"
+, stdout);
+ fputs(
+" with exactly the (EC) curve requested by the client, avoiding\n"
+" intransparent client/server negotiations.\n"
+"\n"
+" If this option is set, the default curves list built into\n"
+" openssl will be ignored.\n"
+"\n"
+" Added in 7.73.0.\n"
+"\n"
+" --data-ascii <data>\n"
" (HTTP) This is just an alias for -d, --data.\n"
"\n"
" --data-binary <data>\n"
-" (HTTP) This posts data exactly as specified with no extra pro-\n"
+" (HTTP) This posts data exactly as specified with no extra pro-\n"
+, stdout);
+ fputs(
" cessing whatsoever.\n"
"\n"
-" If you start the data with the letter @, the rest should be a\n"
-" filename. Data is posted in a similar manner as -d, --data\n"
-" does, except that newlines and carriage returns are preserved\n"
+" If you start the data with the letter @, the rest should be a\n"
+" filename. Data is posted in a similar manner as -d, --data\n"
+" does, except that newlines and carriage returns are preserved\n"
" and conversions are never done.\n"
"\n"
+" Like -d, --data the default content-type sent to the server is\n"
+" application/x-www-form-urlencoded. If you want the data to be\n"
, stdout);
fputs(
-" Like -d, --data the default content-type sent to the server is\n"
-" application/x-www-form-urlencoded. If you want the data to be\n"
" treated as arbitrary binary data by the server then set the con-\n"
-" tent-type to octet-stream: -H \"Content-Type: application/octet-\n"
+" tent-type to octet-stream: -H \"Content-Type: application/octet-\n"
" stream\".\n"
"\n"
-" If this option is used several times, the ones following the\n"
+" If this option is used several times, the ones following the\n"
" first will append data as described in -d, --data.\n"
"\n"
-, stdout);
- fputs(
" --data-raw <data>\n"
-" (HTTP) This posts data similarly to -d, --data but without the\n"
+" (HTTP) This posts data similarly to -d, --data but without the\n"
" special interpretation of the @ character.\n"
"\n"
+, stdout);
+ fputs(
" See also -d, --data. Added in 7.43.0.\n"
"\n"
" --data-urlencode <data>\n"
-" (HTTP) This posts data, similar to the other -d, --data options\n"
+" (HTTP) This posts data, similar to the other -d, --data options\n"
" with the exception that this performs URL-encoding.\n"
"\n"
-" To be CGI-compliant, the <data> part should begin with a name\n"
-, stdout);
- fputs(
-" followed by a separator and a content specification. The <data>\n"
+" To be CGI-compliant, the <data> part should begin with a name\n"
+" followed by a separator and a content specification. The <data>\n"
" part can be passed to curl using one of the following syntaxes:\n"
"\n"
" content\n"
-" This will make curl URL-encode the content and pass that\n"
-" on. Just be careful so that the content doesn't contain\n"
-" any = or @ symbols, as that will then make the syntax\n"
-" match one of the other cases below!\n"
-"\n"
-" =content\n"
, stdout);
fputs(
" This will make curl URL-encode the content and pass that\n"
+" on. Just be careful so that the content doesn't contain\n"
+" any = or @ symbols, as that will then make the syntax\n"
+" match one of the other cases below!\n"
+"\n"
+" =content\n"
+" This will make curl URL-encode the content and pass that\n"
" on. The preceding = symbol is not included in the data.\n"
"\n"
+, stdout);
+ fputs(
" name=content\n"
-" This will make curl URL-encode the content part and pass\n"
-" that on. Note that the name part is expected to be URL-\n"
+" This will make curl URL-encode the content part and pass\n"
+" that on. Note that the name part is expected to be URL-\n"
" encoded already.\n"
"\n"
" @filename\n"
-" This will make curl load data from the given file (in-\n"
-, stdout);
- fputs(
-" cluding any newlines), URL-encode that data and pass it\n"
+" This will make curl load data from the given file (in-\n"
+" cluding any newlines), URL-encode that data and pass it\n"
" on in the POST.\n"
"\n"
" name@filename\n"
-" This will make curl load data from the given file (in-\n"
-" cluding any newlines), URL-encode that data and pass it\n"
-" on in the POST. The name part gets an equal sign ap-\n"
-" pended, resulting in name=urlencoded-file-content. Note\n"
, stdout);
fputs(
+" This will make curl load data from the given file (in-\n"
+" cluding any newlines), URL-encode that data and pass it\n"
+" on in the POST. The name part gets an equal sign ap-\n"
+" pended, resulting in name=urlencoded-file-content. Note\n"
" that the name is expected to be URL-encoded already.\n"
" See also -d, --data and --data-raw. Added in 7.18.0.\n"
"\n"
" -d, --data <data>\n"
-" (HTTP MQTT) Sends the specified data in a POST request to the\n"
-" HTTP server, in the same way that a browser does when a user has\n"
-" filled in an HTML form and presses the submit button. This will\n"
-" cause curl to pass the data to the server using the content-type\n"
, stdout);
fputs(
+" (HTTP MQTT) Sends the specified data in a POST request to the\n"
+" HTTP server, in the same way that a browser does when a user has\n"
+" filled in an HTML form and presses the submit button. This will\n"
+" cause curl to pass the data to the server using the content-type\n"
" application/x-www-form-urlencoded. Compare to -F, --form.\n"
"\n"
" --data-raw is almost the same but does not have a special inter-\n"
-" pretation of the @ character. To post data purely binary, you\n"
-" should instead use the --data-binary option. To URL-encode the\n"
+, stdout);
+ fputs(
+" pretation of the @ character. To post data purely binary, you\n"
+" should instead use the --data-binary option. To URL-encode the\n"
" value of a form field you may use --data-urlencode.\n"
"\n"
-" If any of these options is used more than once on the same com-\n"
+" If any of these options is used more than once on the same com-\n"
+" mand line, the data pieces specified will be merged together\n"
+" with a separating &-symbol. Thus, using '-d name=daniel -d\n"
, stdout);
fputs(
-" mand line, the data pieces specified will be merged together\n"
-" with a separating &-symbol. Thus, using '-d name=daniel -d\n"
" skill=lousy' would generate a post chunk that looks like\n"
" 'name=daniel&skill=lousy'.\n"
"\n"
-" If you start the data with the letter @, the rest should be a\n"
-" file name to read the data from, or - if you want curl to read\n"
+" If you start the data with the letter @, the rest should be a\n"
+" file name to read the data from, or - if you want curl to read\n"
+" the data from stdin. Posting data from a file named 'foobar'\n"
+" would thus be done with -d, --data @foobar. When -d, --data is\n"
, stdout);
fputs(
-" the data from stdin. Posting data from a file named 'foobar'\n"
-" would thus be done with -d, --data @foobar. When -d, --data is\n"
-" told to read from a file like that, carriage returns and new-\n"
+" told to read from a file like that, carriage returns and new-\n"
" lines will be stripped out. If you don't want the @ character to\n"
" have a special interpretation use --data-raw instead.\n"
"\n"
-" See also --data-binary and --data-urlencode and --data-raw. This\n"
-, stdout);
- fputs(
-" option overrides -F, --form and -I, --head and -T, --upload-\n"
+" See also --data-binary, --data-urlencode and --data-raw. This\n"
+" option overrides -F, --form and -I, --head and -T, --upload-\n"
" file.\n"
"\n"
" --delegation <LEVEL>\n"
-" (GSS/kerberos) Set LEVEL to tell the server what it is allowed\n"
+, stdout);
+ fputs(
+" (GSS/kerberos) Set LEVEL to tell the server what it is allowed\n"
" to delegate when it comes to user credentials.\n"
"\n"
" none Don't allow any delegation.\n"
"\n"
-" policy Delegates if and only if the OK-AS-DELEGATE flag is set\n"
-" in the Kerberos service ticket, which is a matter of\n"
-, stdout);
- fputs(
+" policy Delegates if and only if the OK-AS-DELEGATE flag is set\n"
+" in the Kerberos service ticket, which is a matter of\n"
" realm policy.\n"
"\n"
" always Unconditionally allow the server to delegate.\n"
"\n"
" --digest\n"
-" (HTTP) Enables HTTP Digest authentication. This is an authenti-\n"
-" cation scheme that prevents the password from being sent over\n"
-" the wire in clear text. Use this in combination with the normal\n"
-" -u, --user option to set user name and password.\n"
-"\n"
-" If this option is used several times, only the first one is\n"
, stdout);
fputs(
+" (HTTP) Enables HTTP Digest authentication. This is an authenti-\n"
+" cation scheme that prevents the password from being sent over\n"
+" the wire in clear text. Use this in combination with the normal\n"
+" -u, --user option to set user name and password.\n"
+"\n"
+" If this option is used several times, only the first one is\n"
" used.\n"
"\n"
-" See also -u, --user and --proxy-digest and --anyauth. This op-\n"
-" tion overrides --basic and --ntlm and --negotiate.\n"
+" See also -u, --user, --proxy-digest and --anyauth. This option\n"
+, stdout);
+ fputs(
+" overrides --basic and --ntlm and --negotiate.\n"
"\n"
" --disable-eprt\n"
" (FTP) Tell curl to disable the use of the EPRT and LPRT commands\n"
" when doing active FTP transfers. Curl will normally always first\n"
-" attempt to use EPRT, then LPRT before using PORT, but with this\n"
+" attempt to use EPRT, then LPRT before using PORT, but with this\n"
+" option, it will use PORT right away. EPRT and LPRT are exten-\n"
+" sions to the original FTP protocol, and may not work on all\n"
, stdout);
fputs(
-" option, it will use PORT right away. EPRT and LPRT are exten-\n"
-" sions to the original FTP protocol, and may not work on all\n"
" servers, but they enable more functionality in a better way than\n"
" the traditional PORT command.\n"
"\n"
" --eprt can be used to explicitly enable EPRT again and --no-eprt\n"
" is an alias for --disable-eprt.\n"
"\n"
-" If the server is accessed using IPv6, this option will have no\n"
-, stdout);
- fputs(
+" If the server is accessed using IPv6, this option will have no\n"
" effect as EPRT is necessary then.\n"
"\n"
-" Disabling EPRT only changes the active behavior. If you want to\n"
-" switch to passive mode you need to not use -P, --ftp-port or\n"
+" Disabling EPRT only changes the active behavior. If you want to\n"
+, stdout);
+ fputs(
+" switch to passive mode you need to not use -P, --ftp-port or\n"
" force it with --ftp-pasv.\n"
"\n"
" --disable-epsv\n"
-" (FTP) (FTP) Tell curl to disable the use of the EPSV command\n"
-" when doing passive FTP transfers. Curl will normally always\n"
-, stdout);
- fputs(
-" first attempt to use EPSV before PASV, but with this option, it\n"
+" (FTP) (FTP) Tell curl to disable the use of the EPSV command\n"
+" when doing passive FTP transfers. Curl will normally always\n"
+" first attempt to use EPSV before PASV, but with this option, it\n"
" will not try using EPSV.\n"
"\n"
" --epsv can be used to explicitly enable EPSV again and --no-epsv\n"
+, stdout);
+ fputs(
" is an alias for --disable-epsv.\n"
"\n"
-" If the server is an IPv6 host, this option will have no effect\n"
+" If the server is an IPv6 host, this option will have no effect\n"
" as EPSV is necessary then.\n"
"\n"
" Disabling EPSV only changes the passive behavior. If you want to\n"
-, stdout);
- fputs(
" switch to active mode you need to use -P, --ftp-port.\n"
"\n"
" -q, --disable\n"
-" If used as the first parameter on the command line, the curlrc\n"
-" config file will not be read and used. See the -K, --config for\n"
+" If used as the first parameter on the command line, the curlrc\n"
+" config file will not be read and used. See the -K, --config for\n"
+, stdout);
+ fputs(
" details on the default config file search path.\n"
"\n"
" --disallow-username-in-url\n"
-" (HTTP) This tells curl to exit if passed a url containing a\n"
+" (HTTP) This tells curl to exit if passed a url containing a\n"
" username.\n"
"\n"
" See also --proto. Added in 7.61.0.\n"
"\n"
+" --dns-interface <interface>\n"
+" (DNS) Tell curl to send outgoing DNS requests through <inter-\n"
+" face>. This option is a counterpart to --interface (which does\n"
, stdout);
fputs(
-" --dns-interface <interface>\n"
-" (DNS) Tell curl to send outgoing DNS requests through <inter-\n"
-" face>. This option is a counterpart to --interface (which does\n"
-" not affect DNS). The supplied string must be an interface name\n"
+" not affect DNS). The supplied string must be an interface name\n"
" (not an address).\n"
"\n"
-" See also --dns-ipv4-addr and --dns-ipv6-addr. --dns-interface\n"
-" requires that the underlying libcurl was built to support c-\n"
+" See also --dns-ipv4-addr and --dns-ipv6-addr. --dns-interface\n"
+" requires that the underlying libcurl was built to support c-\n"
" ares. Added in 7.33.0.\n"
-, stdout);
- fputs(
"\n"
" --dns-ipv4-addr <address>\n"
" (DNS) Tell curl to bind to <ip-address> when making IPv4 DNS re-\n"
-" quests, so that the DNS requests originate from this address.\n"
+" quests, so that the DNS requests originate from this address.\n"
+, stdout);
+ fputs(
" The argument should be a single IPv4 address.\n"
"\n"
-" See also --dns-interface and --dns-ipv6-addr. --dns-ipv4-addr\n"
-" requires that the underlying libcurl was built to support c-\n"
+" See also --dns-interface and --dns-ipv6-addr. --dns-ipv4-addr\n"
+" requires that the underlying libcurl was built to support c-\n"
" ares. Added in 7.33.0.\n"
"\n"
" --dns-ipv6-addr <address>\n"
+" (DNS) Tell curl to bind to <ip-address> when making IPv6 DNS re-\n"
+" quests, so that the DNS requests originate from this address.\n"
, stdout);
fputs(
-" (DNS) Tell curl to bind to <ip-address> when making IPv6 DNS re-\n"
-" quests, so that the DNS requests originate from this address.\n"
" The argument should be a single IPv6 address.\n"
"\n"
-" See also --dns-interface and --dns-ipv4-addr. --dns-ipv6-addr\n"
-" requires that the underlying libcurl was built to support c-\n"
+" See also --dns-interface and --dns-ipv4-addr. --dns-ipv6-addr\n"
+" requires that the underlying libcurl was built to support c-\n"
" ares. Added in 7.33.0.\n"
"\n"
" --dns-servers <addresses>\n"
+" Set the list of DNS servers to be used instead of the system de-\n"
+" fault. The list of IP addresses should be separated with com-\n"
, stdout);
fputs(
-" Set the list of DNS servers to be used instead of the system de-\n"
-" fault. The list of IP addresses should be separated with com-\n"
" mas. Port numbers may also optionally be given as :<port-number>\n"
" after each IP address.\n"
"\n"
-" --dns-servers requires that the underlying libcurl was built to\n"
+" --dns-servers requires that the underlying libcurl was built to\n"
" support c-ares. Added in 7.33.0.\n"
"\n"
" --doh-url <URL>\n"
-, stdout);
- fputs(
-" (all) Specifies which DNS-over-HTTPS (DOH) server to use to re-\n"
-" solve hostnames, instead of using the default name resolver\n"
+" (all) Specifies which DNS-over-HTTPS (DOH) server to use to re-\n"
+" solve hostnames, instead of using the default name resolver\n"
" mechanism. The URL must be HTTPS.\n"
"\n"
+, stdout);
+ fputs(
" If this option is used several times, the last one will be used.\n"
"\n"
" Added in 7.62.0.\n"
"\n"
" -D, --dump-header <filename>\n"
-" (HTTP FTP) Write the received protocol headers to the specified\n"
+" (HTTP FTP) Write the received protocol headers to the specified\n"
" file.\n"
"\n"
+" This option is handy to use when you want to store the headers\n"
+" that an HTTP site sends to you. Cookies from the headers could\n"
+" then be read in a second curl invocation by using the -b,\n"
, stdout);
fputs(
-" This option is handy to use when you want to store the headers\n"
-" that an HTTP site sends to you. Cookies from the headers could\n"
-" then be read in a second curl invocation by using the -b,\n"
-" --cookie option! The -c, --cookie-jar option is a better way to\n"
+" --cookie option! The -c, --cookie-jar option is a better way to\n"
" store cookies.\n"
"\n"
-" If no headers are received, the use of this option will create\n"
+" If no headers are received, the use of this option will create\n"
" an empty file.\n"
"\n"
-, stdout);
- fputs(
-" When used in FTP, the FTP server response lines are considered\n"
+" When used in FTP, the FTP server response lines are considered\n"
" being \"headers\" and thus are saved there.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
@@ -997,24 +1021,24 @@ void hugehelp(void)
" See also -o, --output.\n"
"\n"
" --egd-file <file>\n"
-" (TLS) Specify the path name to the Entropy Gathering Daemon\n"
-" socket. The socket is used to seed the random engine for SSL\n"
-" connections.\n"
-"\n"
, stdout);
fputs(
+" (TLS) Specify the path name to the Entropy Gathering Daemon\n"
+" socket. The socket is used to seed the random engine for SSL\n"
+" connections.\n"
+"\n"
" See also --random-file.\n"
"\n"
" --engine <name>\n"
-" (TLS) Select the OpenSSL crypto engine to use for cipher opera-\n"
+" (TLS) Select the OpenSSL crypto engine to use for cipher opera-\n"
" tions. Use --engine list to print a list of build-time supported\n"
-" engines. Note that not all (or none) of the engines may be\n"
+" engines. Note that not all (or none) of the engines may be\n"
+, stdout);
+ fputs(
" available at run-time.\n"
"\n"
" --etag-compare <file>\n"
" (HTTP) This option makes a conditional HTTP request for the spe-\n"
-, stdout);
- fputs(
" cific ETag read from the given file by sending a custom If-None-\n"
" Match header using the extracted ETag.\n"
"\n"
@@ -1022,173 +1046,175 @@ void hugehelp(void)
" a single line with a desired ETag. An empty file is parsed as an\n"
" empty ETag.\n"
"\n"
-" Use the option --etag-save to first save the ETag from a re-\n"
-" sponse, and then use this option to compare using the saved ETag\n"
, stdout);
fputs(
+" Use the option --etag-save to first save the ETag from a re-\n"
+" sponse, and then use this option to compare using the saved ETag\n"
" in a subsequent request.\n"
"\n"
-" OMPARISON: There are 2 types of comparison or ETags, Weak and\n"
+" OMPARISON: There are 2 types of comparison or ETags, Weak and\n"
" Strong. This option expects, and uses a strong comparison.\n"
"\n"
" Added in 7.68.0.\n"
"\n"
" --etag-save <file>\n"
-" (HTTP) This option saves an HTTP ETag to the specified file.\n"
-" Etag is usually part of headers returned by a request. When\n"
-" server sends an ETag, it must be enveloped by a double quote.\n"
+" (HTTP) This option saves an HTTP ETag to the specified file.\n"
, stdout);
fputs(
-" This option extracts the ETag without the double quotes and\n"
+" Etag is usually part of headers returned by a request. When\n"
+" server sends an ETag, it must be enveloped by a double quote.\n"
+" This option extracts the ETag without the double quotes and\n"
" saves it into the <file>.\n"
"\n"
-" A server can send a week ETag which is prefixed by \"W/\". This\n"
-" identifier is not considered, and only relevant ETag between\n"
+" A server can send a week ETag which is prefixed by \"W/\". This\n"
+" identifier is not considered, and only relevant ETag between\n"
" quotation marks is parsed.\n"
"\n"
+, stdout);
+ fputs(
" It an ETag wasn't send by the server or it cannot be parsed, and\n"
" empty file is created.\n"
"\n"
" Added in 7.68.0.\n"
"\n"
-, stdout);
- fputs(
" --expect100-timeout <seconds>\n"
" (HTTP) Maximum time in seconds that you allow curl to wait for a\n"
-" 100-continue response when curl emits an Expects: 100-continue\n"
-" header in its request. By default curl will wait one second.\n"
-" This option accepts decimal values! When curl stops waiting, it\n"
+" 100-continue response when curl emits an Expects: 100-continue\n"
+" header in its request. By default curl will wait one second.\n"
+, stdout);
+ fputs(
+" This option accepts decimal values! When curl stops waiting, it\n"
" will continue as if the response has been received.\n"
"\n"
" See also --connect-timeout. Added in 7.47.0.\n"
"\n"
" --fail-early\n"
-, stdout);
- fputs(
" Fail and exit on the first detected transfer error.\n"
"\n"
-" When curl is used to do multiple transfers on the command line,\n"
+" When curl is used to do multiple transfers on the command line,\n"
" it will attempt to operate on each given URL, one by one. By de-\n"
-" fault, it will ignore errors if there are more URLs given and\n"
-" the last URL's success will determine the error code curl re-\n"
+, stdout);
+ fputs(
+" fault, it will ignore errors if there are more URLs given and\n"
+" the last URL's success will determine the error code curl re-\n"
" turns. So early failures will be \"hidden\" by subsequent success-\n"
" ful transfers.\n"
"\n"
+" Using this option, curl will instead return an error on the\n"
+" first transfer that fails, independent of the amount of URLs\n"
, stdout);
fputs(
-" Using this option, curl will instead return an error on the\n"
-" first transfer that fails, independent of the amount of URLs\n"
-" that are given on the command line. This way, no transfer fail-\n"
+" that are given on the command line. This way, no transfer fail-\n"
" ures go undetected by scripts and similar.\n"
"\n"
" This option is global and does not need to be specified for each\n"
" use of -:, --next.\n"
"\n"
" This option does not imply -f, --fail, which causes transfers to\n"
+" fail due to the server's HTTP status code. You can combine the\n"
+" two options, however note -f, --fail is not global and is there-\n"
, stdout);
fputs(
-" fail due to the server's HTTP status code. You can combine the\n"
-" two options, however note -f, --fail is not global and is there-\n"
" fore contained by -:, --next.\n"
"\n"
" Added in 7.52.0.\n"
"\n"
" -f, --fail\n"
-" (HTTP) Fail silently (no output at all) on server errors. This\n"
-" is mostly done to better enable scripts etc to better deal with\n"
-" failed attempts. In normal cases when an HTTP server fails to\n"
+" (HTTP) Fail silently (no output at all) on server errors. This\n"
+" is mostly done to better enable scripts etc to better deal with\n"
+" failed attempts. In normal cases when an HTTP server fails to\n"
+" deliver a document, it returns an HTML document stating so\n"
+" (which often also describes why and more). This flag will pre-\n"
, stdout);
fputs(
-" deliver a document, it returns an HTML document stating so\n"
-" (which often also describes why and more). This flag will pre-\n"
" vent curl from outputting that and return error 22.\n"
"\n"
-" This method is not fail-safe and there are occasions where non-\n"
+" This method is not fail-safe and there are occasions where non-\n"
" successful response codes will slip through, especially when au-\n"
" thentication is involved (response codes 401 and 407).\n"
"\n"
" --false-start\n"
+" (TLS) Tells curl to use false start during the TLS handshake.\n"
+" False start is a mode where a TLS client will start sending ap-\n"
, stdout);
fputs(
-" (TLS) Tells curl to use false start during the TLS handshake.\n"
-" False start is a mode where a TLS client will start sending ap-\n"
-" plication data before verifying the server's Finished message,\n"
+" plication data before verifying the server's Finished message,\n"
" thus saving a round trip when performing a full handshake.\n"
"\n"
-" This is currently only implemented in the NSS and Secure Trans-\n"
+" This is currently only implemented in the NSS and Secure Trans-\n"
" port (on iOS 7.0 or later, or OS X 10.9 or later) backends.\n"
"\n"
" Added in 7.42.0.\n"
"\n"
+" --form-string <name=string>\n"
+" (HTTP SMTP IMAP) Similar to -F, --form except that the value\n"
, stdout);
fputs(
-" --form-string <name=string>\n"
-" (HTTP SMTP IMAP) Similar to -F, --form except that the value\n"
-" string for the named parameter is used literally. Leading '@'\n"
+" string for the named parameter is used literally. Leading '@'\n"
" and '<' characters, and the ';type=' string in the value have no\n"
" special meaning. Use this in preference to -F, --form if there's\n"
-" any possibility that the string value may accidentally trigger\n"
+" any possibility that the string value may accidentally trigger\n"
" the '@' or '<' features of -F, --form.\n"
"\n"
-, stdout);
- fputs(
" See also -F, --form.\n"
"\n"
" -F, --form <name=content>\n"
-" (HTTP SMTP IMAP) For HTTP protocol family, this lets curl emu-\n"
-" late a filled-in form in which a user has pressed the submit\n"
-" button. This causes curl to POST data using the Content-Type\n"
+, stdout);
+ fputs(
+" (HTTP SMTP IMAP) For HTTP protocol family, this lets curl emu-\n"
+" late a filled-in form in which a user has pressed the submit\n"
+" button. This causes curl to POST data using the Content-Type\n"
" multipart/form-data according to RFC 2388.\n"
"\n"
-" For SMTP and IMAP protocols, this is the mean to compose a mul-\n"
+" For SMTP and IMAP protocols, this is the mean to compose a mul-\n"
" tipart mail message to transmit.\n"
"\n"
, stdout);
fputs(
-" This enables uploading of binary files etc. To force the 'con-\n"
+" This enables uploading of binary files etc. To force the 'con-\n"
" tent' part to be a file, prefix the file name with an @ sign. To\n"
" just get the content part from a file, prefix the file name with\n"
-" the symbol <. The difference between @ and < is then that @\n"
-" makes a file get attached in the post as a file upload, while\n"
+" the symbol <. The difference between @ and < is then that @\n"
+" makes a file get attached in the post as a file upload, while\n"
" the < makes a text field and just get the contents for that text\n"
, stdout);
fputs(
" field from a file.\n"
"\n"
-" Tell curl to read content from stdin instead of a file by using\n"
+" Tell curl to read content from stdin instead of a file by using\n"
" - as filename. This goes for both @ and < constructs. When stdin\n"
" is used, the contents is buffered in memory first by curl to de-\n"
" termine its size and allow a possible resend. Defining a part's\n"
" data from a named non-regular file (such as a named pipe or sim-\n"
, stdout);
fputs(
-" ilar) is unfortunately not subject to buffering and will be ef-\n"
-" fectively read at transmission time; since the full size is un-\n"
+" ilar) is unfortunately not subject to buffering and will be ef-\n"
+" fectively read at transmission time; since the full size is un-\n"
" known before the transfer starts, such data is sent as chunks by\n"
" HTTP and rejected by IMAP.\n"
"\n"
" Example: send an image to an HTTP server, where 'profile' is the\n"
-" name of the form-field to which the file portrait.jpg will be\n"
+" name of the form-field to which the file portrait.jpg will be\n"
" the input:\n"
"\n"
, stdout);
fputs(
" curl -F profile=@portrait.jpg https://example.com/upload.cgi\n"
"\n"
-" Example: send your name and shoe size in two text fields to the\n"
+" Example: send your name and shoe size in two text fields to the\n"
" server:\n"
"\n"
" curl -F name=John -F shoesize=11 https://example.com/\n"
"\n"
-" Example: send your essay in a text field to the server. Send it\n"
-" as a plain text field, but get the contents for it from a local\n"
+" Example: send your essay in a text field to the server. Send it\n"
+" as a plain text field, but get the contents for it from a local\n"
" file:\n"
"\n"
" curl -F \"story=<hugefile.txt\" https://example.com/\n"
"\n"
, stdout);
fputs(
-" You can also tell curl what Content-Type to use by using\n"
+" You can also tell curl what Content-Type to use by using\n"
" 'type=', in a manner similar to:\n"
"\n"
" curl -F \"web=@index.html;type=text/html\" example.com\n"
@@ -1197,36 +1223,36 @@ void hugehelp(void)
"\n"
" curl -F \"name=daniel;type=text/foo\" example.com\n"
"\n"
-" You can also explicitly change the name field of a file upload\n"
+" You can also explicitly change the name field of a file upload\n"
" part by setting filename=, like this:\n"
"\n"
" curl -F \"file=@localfile;filename=nameinpost\" example.com\n"
"\n"
, stdout);
fputs(
-" If filename/path contains ',' or ';', it must be quoted by dou-\n"
+" If filename/path contains ',' or ';', it must be quoted by dou-\n"
" ble-quotes like:\n"
"\n"
-" curl -F \"file=@\\\"localfile\\\";filename=\\\"nameinpost\\\"\" exam-\n"
+" curl -F \"file=@\\\"localfile\\\";filename=\\\"nameinpost\\\"\" exam-\n"
" ple.com\n"
"\n"
" or\n"
"\n"
" curl -F 'file=@\"localfile\";filename=\"nameinpost\"' example.com\n"
"\n"
-" Note that if a filename/path is quoted by double-quotes, any\n"
+" Note that if a filename/path is quoted by double-quotes, any\n"
" double-quote or backslash within the filename must be escaped by\n"
" backslash.\n"
"\n"
, stdout);
fputs(
-" Quoting must also be applied to non-file data if it contains\n"
+" Quoting must also be applied to non-file data if it contains\n"
" semicolons, leading/trailing spaces or leading double quotes:\n"
"\n"
-" curl -F 'colors=\"red; green; blue\";type=text/x-myapp' exam-\n"
+" curl -F 'colors=\"red; green; blue\";type=text/x-myapp' exam-\n"
" ple.com\n"
"\n"
-" You can add custom headers to the field by setting headers=,\n"
+" You can add custom headers to the field by setting headers=,\n"
" like\n"
"\n"
" curl -F \"submit=OK;headers=\\\"X-submit-type: OK\\\"\" example.com\n"
@@ -1237,14 +1263,14 @@ void hugehelp(void)
fputs(
" curl -F \"submit=OK;headers=@headerfile\" example.com\n"
"\n"
-" The headers= keyword may appear more that once and above notes\n"
-" about quoting apply. When headers are read from a file, Empty\n"
+" The headers= keyword may appear more that once and above notes\n"
+" about quoting apply. When headers are read from a file, Empty\n"
" lines and lines starting with '#' are comments and ignored; each\n"
" header can be folded by splitting between two words and starting\n"
-" the continuation line with a space; embedded carriage-returns\n"
+" the continuation line with a space; embedded carriage-returns\n"
, stdout);
fputs(
-" and trailing spaces are stripped. Here is an example of a\n"
+" and trailing spaces are stripped. Here is an example of a\n"
" header file contents:\n"
"\n"
" # This file contain two headers.\n"
@@ -1254,17 +1280,17 @@ void hugehelp(void)
" X-header-2: this is\n"
" another header\n"
"\n"
-" To support sending multipart mail messages, the syntax is ex-\n"
+" To support sending multipart mail messages, the syntax is ex-\n"
" tended as follows:\n"
, stdout);
fputs(
-" - name can be omitted: the equal sign is the first character of\n"
+" - name can be omitted: the equal sign is the first character of\n"
" the argument,\n"
-" - if data starts with '(', this signals to start a new multi-\n"
+" - if data starts with '(', this signals to start a new multi-\n"
" part: it can be followed by a content type specification.\n"
" - a multipart can be terminated with a '=)' argument.\n"
"\n"
-" Example: the following command sends an SMTP mime e-mail con-\n"
+" Example: the following command sends an SMTP mime e-mail con-\n"
" sisting in an inline part in two alternative formats: plain text\n"
, stdout);
fputs(
@@ -1275,16 +1301,16 @@ void hugehelp(void)
" -F '= <body>HTML message</body>;type=text/html' \\\n"
" -F '=)' -F '=@textfile.txt' ... smtp://example.com\n"
"\n"
-" Data can be encoded for transfer using encoder=. Available en-\n"
+" Data can be encoded for transfer using encoder=. Available en-\n"
" codings are binary and 8bit that do nothing else than adding the\n"
, stdout);
fputs(
-" corresponding Content-Transfer-Encoding header, 7bit that only\n"
+" corresponding Content-Transfer-Encoding header, 7bit that only\n"
" rejects 8-bit characters with a transfer error, quoted-printable\n"
-" and base64 that encodes data according to the corresponding\n"
+" and base64 that encodes data according to the corresponding\n"
" schemes, limiting lines length to 76 characters.\n"
"\n"
-" Example: send multipart mail with a quoted-printable text mes-\n"
+" Example: send multipart mail with a quoted-printable text mes-\n"
" sage and a base64 attached file:\n"
"\n"
" curl -F '=text message;encoder=quoted-printable' \\\n"
@@ -1296,12 +1322,12 @@ void hugehelp(void)
"\n"
" This option can be used multiple times.\n"
"\n"
-" This option overrides -d, --data and -I, --head and -T, --up-\n"
+" This option overrides -d, --data and -I, --head and -T, --up-\n"
" load-file.\n"
"\n"
" --ftp-account <data>\n"
" (FTP) When an FTP server asks for \"account data\" after user name\n"
-" and password has been provided, this data is sent off using the\n"
+" and password has been provided, this data is sent off using the\n"
, stdout);
fputs(
" ACCT command.\n"
@@ -1311,18 +1337,18 @@ void hugehelp(void)
" Added in 7.13.0.\n"
"\n"
" --ftp-alternative-to-user <command>\n"
-" (FTP) If authenticating with the USER and PASS commands fails,\n"
-" send this command. When connecting to Tumbleweed's Secure\n"
-" Transport server over FTPS using a client certificate, using\n"
-" \"SITE AUTH\" will tell the server to retrieve the username from\n"
+" (FTP) If authenticating with the USER and PASS commands fails,\n"
+" send this command. When connecting to Tumbleweed's Secure\n"
+" Transport server over FTPS using a client certificate, using\n"
+" \"SITE AUTH\" will tell the server to retrieve the username from\n"
, stdout);
fputs(
" the certificate.\n"
" Added in 7.15.5.\n"
"\n"
" --ftp-create-dirs\n"
-" (FTP SFTP) When an FTP or SFTP URL/operation uses a path that\n"
-" doesn't currently exist on the server, the standard behavior of\n"
+" (FTP SFTP) When an FTP or SFTP URL/operation uses a path that\n"
+" doesn't currently exist on the server, the standard behavior of\n"
" curl is to fail. Using this option, curl will instead attempt to\n"
" create missing directories.\n"
"\n"
@@ -1331,41 +1357,41 @@ void hugehelp(void)
" --ftp-method <method>\n"
, stdout);
fputs(
-" (FTP) Control what method curl should use to reach a file on an\n"
-" FTP(S) server. The method argument should be one of the follow-\n"
+" (FTP) Control what method curl should use to reach a file on an\n"
+" FTP(S) server. The method argument should be one of the follow-\n"
" ing alternatives:\n"
"\n"
" multicwd\n"
-" curl does a single CWD operation for each path part in\n"
-" the given URL. For deep hierarchies this means very many\n"
-" commands. This is how RFC 1738 says it should be done.\n"
+" curl does a single CWD operation for each path part in\n"
+" the given URL. For deep hierarchies this means very many\n"
+" commands. This is how RFC 1738 says it should be done.\n"
, stdout);
fputs(
" This is the default but the slowest behavior.\n"
"\n"
-" nocwd curl does no CWD at all. curl will do SIZE, RETR, STOR\n"
+" nocwd curl does no CWD at all. curl will do SIZE, RETR, STOR\n"
" etc and give a full path to the server for all these com-\n"
" mands. This is the fastest behavior.\n"
"\n"
" singlecwd\n"
" curl does one CWD with the full target directory and then\n"
-" operates on the file \"normally\" (like in the multicwd\n"
+" operates on the file \"normally\" (like in the multicwd\n"
, stdout);
fputs(
-" case). This is somewhat more standards compliant than\n"
+" case). This is somewhat more standards compliant than\n"
" 'nocwd' but without the full penalty of 'multicwd'.\n"
"\n"
" Added in 7.15.1.\n"
"\n"
" --ftp-pasv\n"
-" (FTP) Use passive mode for the data connection. Passive is the\n"
-" internal default behavior, but using this option can be used to\n"
+" (FTP) Use passive mode for the data connection. Passive is the\n"
+" internal default behavior, but using this option can be used to\n"
" override a previous -P, --ftp-port option.\n"
"\n"
-" If this option is used several times, only the first one is\n"
+" If this option is used several times, only the first one is\n"
, stdout);
fputs(
-" used. Undoing an enforced passive really isn't doable but you\n"
+" used. Undoing an enforced passive really isn't doable but you\n"
" must then instead enforce the correct -P, --ftp-port again.\n"
"\n"
" Passive mode means that curl will try the EPSV command first and\n"
@@ -1373,17 +1399,17 @@ void hugehelp(void)
" See also --disable-epsv. Added in 7.11.0.\n"
"\n"
" -P, --ftp-port <address>\n"
-" (FTP) Reverses the default initiator/listener roles when con-\n"
+" (FTP) Reverses the default initiator/listener roles when con-\n"
, stdout);
fputs(
-" necting with FTP. This option makes curl use active mode. curl\n"
-" then tells the server to connect back to the client's specified\n"
+" necting with FTP. This option makes curl use active mode. curl\n"
+" then tells the server to connect back to the client's specified\n"
" address and port, while passive mode asks the server to setup an\n"
-" IP address and port for it to connect to. <address> should be\n"
+" IP address and port for it to connect to. <address> should be\n"
" one of:\n"
"\n"
" interface\n"
-" e.g. \"eth0\" to specify which interface's IP address you\n"
+" e.g. \"eth0\" to specify which interface's IP address you\n"
" want to use (Unix only)\n"
"\n"
, stdout);
@@ -1394,20 +1420,20 @@ void hugehelp(void)
" host name\n"
" e.g. \"my.host.domain\" to specify the machine\n"
"\n"
-" - make curl pick the same IP address that is already used\n"
+" - make curl pick the same IP address that is already used\n"
" for the control connection\n"
"\n"
-" If this option is used several times, the last one will be used. Dis-\n"
-" able the use of PORT with --ftp-pasv. Disable the attempt to use the\n"
+" If this option is used several times, the last one will be used. Dis-\n"
+" able the use of PORT with --ftp-pasv. Disable the attempt to use the\n"
, stdout);
fputs(
-" EPRT command instead of PORT by using --disable-eprt. EPRT is really\n"
+" EPRT command instead of PORT by using --disable-eprt. EPRT is really\n"
" PORT++.\n"
"\n"
-" Since 7.19.5, you can append \":[start]-[end]\" to the right of the ad-\n"
-" dress, to tell curl what TCP port range to use. That means you specify\n"
+" Since 7.19.5, you can append \":[start]-[end]\" to the right of the ad-\n"
+" dress, to tell curl what TCP port range to use. That means you specify\n"
" a port range, from a lower to a higher number. A single number works as\n"
-" well, but do note that it increases the risk of failure since the port\n"
+" well, but do note that it increases the risk of failure since the port\n"
" may not be available.\n"
"\n"
" See also --ftp-pasv and --disable-eprt.\n"
@@ -1415,28 +1441,28 @@ void hugehelp(void)
, stdout);
fputs(
" --ftp-pret\n"
-" (FTP) Tell curl to send a PRET command before PASV (and EPSV).\n"
-" Certain FTP servers, mainly drftpd, require this non-standard\n"
-" command for directory listings as well as up and downloads in\n"
+" (FTP) Tell curl to send a PRET command before PASV (and EPSV).\n"
+" Certain FTP servers, mainly drftpd, require this non-standard\n"
+" command for directory listings as well as up and downloads in\n"
" PASV mode.\n"
"\n"
" Added in 7.20.0.\n"
"\n"
" --ftp-skip-pasv-ip\n"
" (FTP) Tell curl to not use the IP address the server suggests in\n"
-" its response to curl's PASV command when curl connects the data\n"
+" its response to curl's PASV command when curl connects the data\n"
, stdout);
fputs(
-" connection. Instead curl will re-use the same IP address it al-\n"
+" connection. Instead curl will re-use the same IP address it al-\n"
" ready uses for the control connection.\n"
"\n"
-" This option has no effect if PORT, EPRT or EPSV is used instead\n"
+" This option has no effect if PORT, EPRT or EPSV is used instead\n"
" of PASV.\n"
"\n"
" See also --ftp-pasv. Added in 7.14.2.\n"
"\n"
" --ftp-ssl-ccc-mode <active/passive>\n"
-" (FTP) Sets the CCC mode. The passive mode will not initiate the\n"
+" (FTP) Sets the CCC mode. The passive mode will not initiate the\n"
" shutdown, but instead wait for the server to do it, and will not\n"
, stdout);
fputs(
@@ -1446,9 +1472,9 @@ void hugehelp(void)
" See also --ftp-ssl-ccc. Added in 7.16.2.\n"
"\n"
" --ftp-ssl-ccc\n"
-" (FTP) Use CCC (Clear Command Channel) Shuts down the SSL/TLS\n"
+" (FTP) Use CCC (Clear Command Channel) Shuts down the SSL/TLS\n"
" layer after authenticating. The rest of the control channel com-\n"
-" munication will be unencrypted. This allows NAT routers to fol-\n"
+" munication will be unencrypted. This allows NAT routers to fol-\n"
, stdout);
fputs(
" low the FTP transaction. The default mode is passive.\n"
@@ -1456,9 +1482,9 @@ void hugehelp(void)
" See also --ssl and --ftp-ssl-ccc-mode. Added in 7.16.1.\n"
"\n"
" --ftp-ssl-control\n"
-" (FTP) Require SSL/TLS for the FTP login, clear for transfer.\n"
-" Allows secure authentication, but non-encrypted data transfers\n"
-" for efficiency. Fails the transfer if the server doesn't sup-\n"
+" (FTP) Require SSL/TLS for the FTP login, clear for transfer.\n"
+" Allows secure authentication, but non-encrypted data transfers\n"
+" for efficiency. Fails the transfer if the server doesn't sup-\n"
" port SSL/TLS.\n"
"\n"
" Added in 7.16.0.\n"
@@ -1466,44 +1492,44 @@ void hugehelp(void)
" -G, --get\n"
, stdout);
fputs(
-" When used, this option will make all data specified with -d,\n"
-" --data, --data-binary or --data-urlencode to be used in an HTTP\n"
-" GET request instead of the POST request that otherwise would be\n"
+" When used, this option will make all data specified with -d,\n"
+" --data, --data-binary or --data-urlencode to be used in an HTTP\n"
+" GET request instead of the POST request that otherwise would be\n"
" used. The data will be appended to the URL with a '?' separator.\n"
-" If used in combination with -I, --head, the POST data will in-\n"
+" If used in combination with -I, --head, the POST data will in-\n"
" stead be appended to the URL with a HEAD request.\n"
"\n"
, stdout);
fputs(
-" If this option is used several times, only the first one is\n"
-" used. This is because undoing a GET doesn't make sense, but you\n"
+" If this option is used several times, only the first one is\n"
+" used. This is because undoing a GET doesn't make sense, but you\n"
" should then instead enforce the alternative method you prefer.\n"
"\n"
" -g, --globoff\n"
" This option switches off the \"URL globbing parser\". When you set\n"
-" this option, you can specify URLs that contain the letters {}[]\n"
-" without having them being interpreted by curl itself. Note that\n"
+" this option, you can specify URLs that contain the letters {}[]\n"
+" without having them being interpreted by curl itself. Note that\n"
, stdout);
fputs(
-" these letters are not normal legal URL contents but they should\n"
+" these letters are not normal legal URL contents but they should\n"
" be encoded according to the URI standard.\n"
"\n"
" --happy-eyeballs-timeout-ms <milliseconds>\n"
-" Happy eyeballs is an algorithm that attempts to connect to both\n"
-" IPv4 and IPv6 addresses for dual-stack hosts, preferring IPv6\n"
+" Happy eyeballs is an algorithm that attempts to connect to both\n"
+" IPv4 and IPv6 addresses for dual-stack hosts, preferring IPv6\n"
" first for the number of milliseconds. If the IPv6 address cannot\n"
, stdout);
fputs(
-" be connected to within that time then a connection attempt is\n"
+" be connected to within that time then a connection attempt is\n"
" made to the IPv4 address in parallel. The first connection to be\n"
" established is the one that is used.\n"
"\n"
-" The range of suggested useful values is limited. Happy Eyeballs\n"
-" RFC 6555 says \"It is RECOMMENDED that connection attempts be\n"
-" paced 150-250 ms apart to balance human factors against network\n"
+" The range of suggested useful values is limited. Happy Eyeballs\n"
+" RFC 6555 says \"It is RECOMMENDED that connection attempts be\n"
+" paced 150-250 ms apart to balance human factors against network\n"
, stdout);
fputs(
-" load.\" libcurl currently defaults to 200 ms. Firefox and Chrome\n"
+" load.\" libcurl currently defaults to 200 ms. Firefox and Chrome\n"
" currently default to 300 ms.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
@@ -1511,51 +1537,51 @@ void hugehelp(void)
" Added in 7.59.0.\n"
"\n"
" --haproxy-protocol\n"
-" (HTTP) Send a HAProxy PROXY protocol v1 header at the beginning\n"
-" of the connection. This is used by some load balancers and re-\n"
+" (HTTP) Send a HAProxy PROXY protocol v1 header at the beginning\n"
+" of the connection. This is used by some load balancers and re-\n"
" verse proxies to indicate the client's true IP address and port.\n"
, stdout);
fputs(
-" This option is primarily useful when sending test requests to a\n"
+" This option is primarily useful when sending test requests to a\n"
" service that expects this header.\n"
"\n"
" Added in 7.60.0.\n"
"\n"
" -I, --head\n"
" (HTTP FTP FILE) Fetch the headers only! HTTP-servers feature the\n"
-" command HEAD which this uses to get nothing but the header of a\n"
-" document. When used on an FTP or FILE file, curl displays the\n"
+" command HEAD which this uses to get nothing but the header of a\n"
+" document. When used on an FTP or FILE file, curl displays the\n"
" file size and last modification time only.\n"
"\n"
, stdout);
fputs(
" -H, --header <header/@file>\n"
-" (HTTP) Extra header to include in the request when sending HTTP\n"
-" to a server. You may specify any number of extra headers. Note\n"
+" (HTTP) Extra header to include in the request when sending HTTP\n"
+" to a server. You may specify any number of extra headers. Note\n"
" that if you should add a custom header that has the same name as\n"
-" one of the internal ones curl would use, your externally set\n"
+" one of the internal ones curl would use, your externally set\n"
" header will be used instead of the internal one. This allows you\n"
, stdout);
fputs(
-" to make even trickier stuff than curl would normally do. You\n"
-" should not replace internally set headers without knowing per-\n"
+" to make even trickier stuff than curl would normally do. You\n"
+" should not replace internally set headers without knowing per-\n"
" fectly well what you're doing. Remove an internal header by giv-\n"
-" ing a replacement without content on the right side of the\n"
+" ing a replacement without content on the right side of the\n"
" colon, as in: -H \"Host:\". If you send the custom header with no-\n"
-" value then its header must be terminated with a semicolon, such\n"
+" value then its header must be terminated with a semicolon, such\n"
, stdout);
fputs(
" as -H \"X-Custom-Header;\" to send \"X-Custom-Header:\".\n"
"\n"
-" curl will make sure that each header you add/replace is sent\n"
+" curl will make sure that each header you add/replace is sent\n"
" with the proper end-of-line marker, you should thus not add that\n"
" as a part of the header content: do not add newlines or carriage\n"
" returns, they will only mess things up for you.\n"
"\n"
-" Starting in 7.55.0, this option can take an argument in @file-\n"
+" Starting in 7.55.0, this option can take an argument in @file-\n"
, stdout);
fputs(
-" name style, which then adds a header for each line in the input\n"
+" name style, which then adds a header for each line in the input\n"
" file. Using @- will make curl read the header file from stdin.\n"
"\n"
" See also the -A, --user-agent and -e, --referer options.\n"
@@ -1569,417 +1595,424 @@ void hugehelp(void)
"\n"
, stdout);
fputs(
-" WARNING: headers set with this option will be set in all re-\n"
-" quests - even after redirects are followed, like when told with\n"
-" -L, --location. This can lead to the header being sent to other\n"
-" hosts than the original host, so sensitive headers should be\n"
+" WARNING: headers set with this option will be set in all re-\n"
+" quests - even after redirects are followed, like when told with\n"
+" -L, --location. This can lead to the header being sent to other\n"
+" hosts than the original host, so sensitive headers should be\n"
" used with caution combined with following redirects.\n"
"\n"
-" This option can be used multiple times to add/replace/remove\n"
+" This option can be used multiple times to add/replace/remove\n"
" multiple headers.\n"
"\n"
, stdout);
fputs(
-" -h, --help\n"
-" Usage help. This lists all current command line options with a\n"
-" short description.\n"
+" -h, --help <category>\n"
+" Usage help. This lists all commands of the <category>. If no\n"
+" arg was provided, curl will display the most important command\n"
+" line arguments and the list of categories. If the argument\n"
+" \"all\" was provided, curl will display all options available. If\n"
+" the argument \"category\" was provided, curl will display all cat-\n"
+" egories and their meanings.\n"
+"\n"
" --hostpubmd5 <md5>\n"
-" (SFTP SCP) Pass a string containing 32 hexadecimal digits. The\n"
-" string should be the 128 bit MD5 checksum of the remote host's\n"
+, stdout);
+ fputs(
+" (SFTP SCP) Pass a string containing 32 hexadecimal digits. The\n"
+" string should be the 128 bit MD5 checksum of the remote host's\n"
" public key, curl will refuse the connection with the host unless\n"
" the md5sums match.\n"
"\n"
" Added in 7.17.1.\n"
"\n"
" --http0.9\n"
-, stdout);
- fputs(
" (HTTP) Tells curl to be fine with HTTP version 0.9 response.\n"
"\n"
-" HTTP/0.9 is a completely headerless response and therefore you\n"
-" can also connect with this to non-HTTP servers and still get a\n"
+" HTTP/0.9 is a completely headerless response and therefore you\n"
+, stdout);
+ fputs(
+" can also connect with this to non-HTTP servers and still get a\n"
" response since curl will simply transparently downgrade - if al-\n"
" lowed.\n"
"\n"
" Since curl 7.66.0, HTTP/0.9 is disabled by default.\n"
"\n"
" -0, --http1.0\n"
-, stdout);
- fputs(
-" (HTTP) Tells curl to use HTTP version 1.0 instead of using its\n"
+" (HTTP) Tells curl to use HTTP version 1.0 instead of using its\n"
" internally preferred HTTP version.\n"
"\n"
" This option overrides --http1.1 and --http2.\n"
"\n"
" --http1.1\n"
+, stdout);
+ fputs(
" (HTTP) Tells curl to use HTTP version 1.1.\n"
"\n"
-" This option overrides -0, --http1.0 and --http2. Added in\n"
+" This option overrides -0, --http1.0 and --http2. Added in\n"
" 7.33.0.\n"
"\n"
" --http2-prior-knowledge\n"
-" (HTTP) Tells curl to issue its non-TLS HTTP requests using\n"
+" (HTTP) Tells curl to issue its non-TLS HTTP requests using\n"
+" HTTP/2 without HTTP/1.1 Upgrade. It requires prior knowledge\n"
+" that the server supports HTTP/2 straight away. HTTPS requests\n"
, stdout);
fputs(
-" HTTP/2 without HTTP/1.1 Upgrade. It requires prior knowledge\n"
-" that the server supports HTTP/2 straight away. HTTPS requests\n"
-" will still do HTTP/2 the standard way with negotiated protocol\n"
+" will still do HTTP/2 the standard way with negotiated protocol\n"
" version in the TLS handshake.\n"
"\n"
" --http2-prior-knowledge requires that the underlying libcurl was\n"
" built to support HTTP/2. This option overrides --http1.1 and -0,\n"
" --http1.0 and --http2. Added in 7.49.0.\n"
"\n"
-, stdout);
- fputs(
" --http2\n"
" (HTTP) Tells curl to use HTTP version 2.\n"
"\n"
" See also --http1.1 and --http3. --http2 requires that the under-\n"
+, stdout);
+ fputs(
" lying libcurl was built to support HTTP/2. This option overrides\n"
-" --http1.1 and -0, --http1.0 and --http2-prior-knowledge. Added\n"
+" --http1.1 and -0, --http1.0 and --http2-prior-knowledge. Added\n"
" in 7.33.0.\n"
"\n"
" --http3\n"
-" (HTTP) WARNING: this option is experimental. Do not use in pro-\n"
+" (HTTP) WARNING: this option is experimental. Do not use in pro-\n"
" duction.\n"
"\n"
+" Tells curl to use HTTP version 3 directly to the host and port\n"
+" number used in the URL. A normal HTTP/3 transaction will be done\n"
, stdout);
fputs(
-" Tells curl to use HTTP version 3 directly to the host and port\n"
-" number used in the URL. A normal HTTP/3 transaction will be done\n"
-" to a host and then get redirected via Alt-SVc, but this option\n"
-" allows a user to circumvent that when you know that the target\n"
+" to a host and then get redirected via Alt-SVc, but this option\n"
+" allows a user to circumvent that when you know that the target\n"
" speaks HTTP/3 on the given host and port.\n"
"\n"
-" This option will make curl fail if a QUIC connection cannot be\n"
-, stdout);
- fputs(
-" established, it cannot fall back to a lower HTTP version on its\n"
+" This option will make curl fail if a QUIC connection cannot be\n"
+" established, it cannot fall back to a lower HTTP version on its\n"
" own.\n"
"\n"
" See also --http1.1 and --http2. --http3 requires that the under-\n"
+, stdout);
+ fputs(
" lying libcurl was built to support HTTP/3. This option overrides\n"
" --http1.1 and -0, --http1.0 and --http2 and --http2-prior-knowl-\n"
" edge. Added in 7.66.0.\n"
"\n"
" --ignore-content-length\n"
-" (FTP HTTP) For HTTP, Ignore the Content-Length header. This is\n"
-, stdout);
- fputs(
-" particularly useful for servers running Apache 1.x, which will\n"
-" report incorrect Content-Length for files larger than 2 giga-\n"
+" (FTP HTTP) For HTTP, Ignore the Content-Length header. This is\n"
+" particularly useful for servers running Apache 1.x, which will\n"
+" report incorrect Content-Length for files larger than 2 giga-\n"
" bytes.\n"
"\n"
-" For FTP (since 7.46.0), skip the RETR command to figure out the\n"
+, stdout);
+ fputs(
+" For FTP (since 7.46.0), skip the RETR command to figure out the\n"
" size before downloading a file.\n"
"\n"
" -i, --include\n"
-" Include the HTTP response headers in the output. The HTTP re-\n"
-" sponse headers can include things like server name, cookies,\n"
-, stdout);
- fputs(
+" Include the HTTP response headers in the output. The HTTP re-\n"
+" sponse headers can include things like server name, cookies,\n"
" date of the document, HTTP version and more...\n"
"\n"
" To view the request headers, consider the -v, --verbose option.\n"
"\n"
" See also -v, --verbose.\n"
"\n"
+, stdout);
+ fputs(
" -k, --insecure\n"
" (TLS) By default, every SSL connection curl makes is verified to\n"
-" be secure. This option allows curl to proceed and operate even\n"
+" be secure. This option allows curl to proceed and operate even\n"
" for server connections otherwise considered insecure.\n"
"\n"
-, stdout);
- fputs(
-" The server connection is verified by making sure the server's\n"
-" certificate contains the right name and verifies successfully\n"
+" The server connection is verified by making sure the server's\n"
+" certificate contains the right name and verifies successfully\n"
" using the cert store.\n"
"\n"
+, stdout);
+ fputs(
" See this online resource for further details:\n"
" https://curl.haxx.se/docs/sslcerts.html\n"
" See also --proxy-insecure and --cacert.\n"
"\n"
" --interface <name>\n"
"\n"
-" Perform an operation using a specified interface. You can enter\n"
-, stdout);
- fputs(
-" interface name, IP address or host name. An example could look\n"
+" Perform an operation using a specified interface. You can enter\n"
+" interface name, IP address or host name. An example could look\n"
" like:\n"
"\n"
" curl --interface eth0:1 https://www.example.com/\n"
"\n"
-" If this option is used several times, the last one will be used.\n"
-" On Linux it can be used to specify a VRF, but the binary needs\n"
-" to either have CAP_NET_RAW or to be run as root. More informa-\n"
-" tion about Linux VRF: https://www.kernel.org/doc/Documenta-\n"
, stdout);
fputs(
+" If this option is used several times, the last one will be used.\n"
+" On Linux it can be used to specify a VRF, but the binary needs\n"
+" to either have CAP_NET_RAW or to be run as root. More informa-\n"
+" tion about Linux VRF: https://www.kernel.org/doc/Documenta-\n"
" tion/networking/vrf.txt\n"
"\n"
" See also --dns-interface.\n"
"\n"
" -4, --ipv4\n"
-" This option tells curl to resolve names to IPv4 addresses only,\n"
+" This option tells curl to resolve names to IPv4 addresses only,\n"
+, stdout);
+ fputs(
" and not for example try IPv6.\n"
"\n"
-" See also --http1.1 and --http2. This option overrides -6,\n"
+" See also --http1.1 and --http2. This option overrides -6,\n"
" --ipv6.\n"
"\n"
" -6, --ipv6\n"
-" This option tells curl to resolve names to IPv6 addresses only,\n"
+" This option tells curl to resolve names to IPv6 addresses only,\n"
" and not for example try IPv4.\n"
"\n"
-, stdout);
- fputs(
-" See also --http1.1 and --http2. This option overrides -4,\n"
+" See also --http1.1 and --http2. This option overrides -4,\n"
" --ipv4.\n"
"\n"
" -j, --junk-session-cookies\n"
+, stdout);
+ fputs(
" (HTTP) When curl is told to read cookies from a given file, this\n"
" option will make it discard all \"session cookies\". This will ba-\n"
-" sically have the same effect as if a new session is started.\n"
-" Typical browsers always discard session cookies when they're\n"
+" sically have the same effect as if a new session is started.\n"
+" Typical browsers always discard session cookies when they're\n"
" closed down.\n"
"\n"
-, stdout);
- fputs(
" See also -b, --cookie and -c, --cookie-jar.\n"
"\n"
" --keepalive-time <seconds>\n"
-" This option sets the time a connection needs to remain idle be-\n"
-" fore sending keepalive probes and the time between individual\n"
-" keepalive probes. It is currently effective on operating systems\n"
-" offering the TCP_KEEPIDLE and TCP_KEEPINTVL socket options\n"
-" (meaning Linux, recent AIX, HP-UX and more). This option has no\n"
, stdout);
fputs(
+" This option sets the time a connection needs to remain idle be-\n"
+" fore sending keepalive probes and the time between individual\n"
+" keepalive probes. It is currently effective on operating systems\n"
+" offering the TCP_KEEPIDLE and TCP_KEEPINTVL socket options\n"
+" (meaning Linux, recent AIX, HP-UX and more). This option has no\n"
" effect if --no-keepalive is used.\n"
"\n"
+, stdout);
+ fputs(
" If this option is used several times, the last one will be used.\n"
" If unspecified, the option defaults to 60 seconds.\n"
"\n"
" Added in 7.18.0.\n"
"\n"
" --key-type <type>\n"
-" (TLS) Private key file type. Specify which type your --key pro-\n"
-" vided private key is. DER, PEM, and ENG are supported. If not\n"
+" (TLS) Private key file type. Specify which type your --key pro-\n"
+" vided private key is. DER, PEM, and ENG are supported. If not\n"
" specified, PEM is assumed.\n"
"\n"
-, stdout);
- fputs(
" If this option is used several times, the last one will be used.\n"
"\n"
+, stdout);
+ fputs(
" --key <key>\n"
" (TLS SSH) Private key file name. Allows you to provide your pri-\n"
-" vate key in this separate file. For SSH, if not specified, curl\n"
-" tries the following candidates in order: '~/.ssh/id_rsa',\n"
+" vate key in this separate file. For SSH, if not specified, curl\n"
+" tries the following candidates in order: '~/.ssh/id_rsa',\n"
" '~/.ssh/id_dsa', './id_rsa', './id_dsa'.\n"
"\n"
-" If curl is built against OpenSSL library, and the engine pkcs11\n"
+" If curl is built against OpenSSL library, and the engine pkcs11\n"
+" is available, then a PKCS#11 URI (RFC 7512) can be used to spec-\n"
, stdout);
fputs(
-" is available, then a PKCS#11 URI (RFC 7512) can be used to spec-\n"
-" ify a private key located in a PKCS#11 device. A string begin-\n"
-" ning with \"pkcs11:\" will be interpreted as a PKCS#11 URI. If a\n"
+" ify a private key located in a PKCS#11 device. A string begin-\n"
+" ning with \"pkcs11:\" will be interpreted as a PKCS#11 URI. If a\n"
" PKCS#11 URI is provided, then the --engine option will be set as\n"
-" \"pkcs11\" if none was provided and the --key-type option will be\n"
+" \"pkcs11\" if none was provided and the --key-type option will be\n"
" set as \"ENG\" if none was provided.\n"
"\n"
-, stdout);
- fputs(
" If this option is used several times, the last one will be used.\n"
"\n"
" --krb <level>\n"
-" (FTP) Enable Kerberos authentication and use. The level must be\n"
+, stdout);
+ fputs(
+" (FTP) Enable Kerberos authentication and use. The level must be\n"
" entered and should be one of 'clear', 'safe', 'confidential', or\n"
-" 'private'. Should you use a level that is not one of these,\n"
+" 'private'. Should you use a level that is not one of these,\n"
" 'private' will instead be used.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
-, stdout);
- fputs(
-" --krb requires that the underlying libcurl was built to support\n"
+" --krb requires that the underlying libcurl was built to support\n"
" Kerberos.\n"
"\n"
" --libcurl <file>\n"
-" Append this option to any ordinary curl command line, and you\n"
-" will get a libcurl-using C source code written to the file that\n"
+, stdout);
+ fputs(
+" Append this option to any ordinary curl command line, and you\n"
+" will get a libcurl-using C source code written to the file that\n"
" does the equivalent of what your command-line operation does!\n"
"\n"
-" If this option is used several times, the last given file name\n"
+" If this option is used several times, the last given file name\n"
" will be used.\n"
"\n"
-, stdout);
- fputs(
" Added in 7.16.1.\n"
"\n"
" --limit-rate <speed>\n"
-" Specify the maximum transfer rate you want curl to use - for\n"
+" Specify the maximum transfer rate you want curl to use - for\n"
+, stdout);
+ fputs(
" both downloads and uploads. This feature is useful if you have a\n"
" limited pipe and you'd like your transfer not to use your entire\n"
" bandwidth. To make it slower than it otherwise would be.\n"
"\n"
-" The given speed is measured in bytes/second, unless a suffix is\n"
+" The given speed is measured in bytes/second, unless a suffix is\n"
+" appended. Appending 'k' or 'K' will count the number as kilo-\n"
+" bytes, 'm' or 'M' makes it megabytes, while 'g' or 'G' makes it\n"
, stdout);
fputs(
-" appended. Appending 'k' or 'K' will count the number as kilo-\n"
-" bytes, 'm' or 'M' makes it megabytes, while 'g' or 'G' makes it\n"
" gigabytes. Examples: 200K, 3m and 1G.\n"
"\n"
-" If you also use the -Y, --speed-limit option, that option will\n"
+" If you also use the -Y, --speed-limit option, that option will\n"
" take precedence and might cripple the rate-limiting slightly, to\n"
" help keeping the speed-limit logic working.\n"
"\n"
-, stdout);
- fputs(
" If this option is used several times, the last one will be used.\n"
"\n"
" -l, --list-only\n"
-" (FTP POP3) (FTP) When listing an FTP directory, this switch\n"
-" forces a name-only view. This is especially useful if the user\n"
-" wants to machine-parse the contents of an FTP directory since\n"
-" the normal directory view doesn't use a standard look or format.\n"
-" When used like this, the option causes a NLST command to be sent\n"
+" (FTP POP3) (FTP) When listing an FTP directory, this switch\n"
, stdout);
fputs(
+" forces a name-only view. This is especially useful if the user\n"
+" wants to machine-parse the contents of an FTP directory since\n"
+" the normal directory view doesn't use a standard look or format.\n"
+" When used like this, the option causes a NLST command to be sent\n"
" to the server instead of LIST.\n"
"\n"
-" Note: Some FTP servers list only files in their response to\n"
-" NLST; they do not include sub-directories and symbolic links.\n"
-"\n"
-" (POP3) When retrieving a specific email from POP3, this switch\n"
-" forces a LIST command to be performed instead of RETR. This is\n"
-" particularly useful if the user wants to see if a specific mes-\n"
+" Note: Some FTP servers list only files in their response to\n"
, stdout);
fputs(
+" NLST; they do not include sub-directories and symbolic links.\n"
+"\n"
+" (POP3) When retrieving a specific email from POP3, this switch\n"
+" forces a LIST command to be performed instead of RETR. This is\n"
+" particularly useful if the user wants to see if a specific mes-\n"
" sage id exists on the server and what size it is.\n"
"\n"
-" Note: When combined with -X, --request, this option can be used\n"
+" Note: When combined with -X, --request, this option can be used\n"
+, stdout);
+ fputs(
" to send an UIDL command instead, so the user may use the email's\n"
-" unique identifier rather than it's message id to make the re-\n"
+" unique identifier rather than it's message id to make the re-\n"
" quest.\n"
"\n"
" Added in 4.0.\n"
"\n"
" --local-port <num/range>\n"
-" Set a preferred single number or range (FROM-TO) of local port\n"
+" Set a preferred single number or range (FROM-TO) of local port\n"
+" numbers to use for the connection(s). Note that port numbers by\n"
+" nature are a scarce resource that will be busy at times so set-\n"
, stdout);
fputs(
-" numbers to use for the connection(s). Note that port numbers by\n"
-" nature are a scarce resource that will be busy at times so set-\n"
-" ting this range to something too narrow might cause unnecessary\n"
+" ting this range to something too narrow might cause unnecessary\n"
" connection setup failures.\n"
"\n"
" Added in 7.15.2.\n"
"\n"
" --location-trusted\n"
-" (HTTP) Like -L, --location, but will allow sending the name +\n"
+" (HTTP) Like -L, --location, but will allow sending the name +\n"
" password to all hosts that the site may redirect to. This may or\n"
+" may not introduce a security breach if the site redirects you to\n"
+" a site to which you'll send your authentication info (which is\n"
, stdout);
fputs(
-" may not introduce a security breach if the site redirects you to\n"
-" a site to which you'll send your authentication info (which is\n"
" plaintext in the case of HTTP Basic authentication).\n"
"\n"
" See also -u, --user.\n"
"\n"
" -L, --location\n"
-" (HTTP) If the server reports that the requested page has moved\n"
+" (HTTP) If the server reports that the requested page has moved\n"
" to a different location (indicated with a Location: header and a\n"
+" 3XX response code), this option will make curl redo the request\n"
+" on the new place. If used together with -i, --include or -I,\n"
, stdout);
fputs(
-" 3XX response code), this option will make curl redo the request\n"
-" on the new place. If used together with -i, --include or -I,\n"
" --head, headers from all requested pages will be shown. When au-\n"
-" thentication is used, curl only sends its credentials to the\n"
-" initial host. If a redirect takes curl to a different host, it\n"
-" won't be able to intercept the user+password. See also --loca-\n"
-, stdout);
- fputs(
-" tion-trusted on how to change this. You can limit the amount of\n"
+" thentication is used, curl only sends its credentials to the\n"
+" initial host. If a redirect takes curl to a different host, it\n"
+" won't be able to intercept the user+password. See also --loca-\n"
+" tion-trusted on how to change this. You can limit the amount of\n"
" redirects to follow by using the --max-redirs option.\n"
"\n"
-" When curl follows a redirect and if the request is a POST, it\n"
-" will do the following request with a GET if the HTTP response\n"
-" was 301, 302, or 303. If the response code was any other 3xx\n"
+, stdout);
+ fputs(
+" When curl follows a redirect and if the request is a POST, it\n"
+" will do the following request with a GET if the HTTP response\n"
+" was 301, 302, or 303. If the response code was any other 3xx\n"
" code, curl will re-send the following request using the same un-\n"
" modified method.\n"
"\n"
+" You can tell curl to not change POST requests to GET after a 30x\n"
, stdout);
fputs(
-" You can tell curl to not change POST requests to GET after a 30x\n"
-" response by using the dedicated options for that: --post301,\n"
+" response by using the dedicated options for that: --post301,\n"
" --post302 and --post303.\n"
"\n"
-" The method set with -X, --request overrides the method curl\n"
+" The method set with -X, --request overrides the method curl\n"
" would otherwise select to use.\n"
"\n"
" --login-options <options>\n"
-" (IMAP POP3 SMTP) Specify the login options to use during server\n"
+" (IMAP POP3 SMTP) Specify the login options to use during server\n"
" authentication.\n"
"\n"
+" You can use the login options to specify protocol specific op-\n"
, stdout);
fputs(
-" You can use the login options to specify protocol specific op-\n"
-" tions that may be used during authentication. At present only\n"
-" IMAP, POP3 and SMTP support login options. For more information\n"
-" about the login options please see RFC 2384, RFC 5092 and IETF\n"
+" tions that may be used during authentication. At present only\n"
+" IMAP, POP3 and SMTP support login options. For more information\n"
+" about the login options please see RFC 2384, RFC 5092 and IETF\n"
" draft draft-earhart-url-smtp-00.txt\n"
"\n"
" If this option is used several times, the last one will be used.\n"
"\n"
" Added in 7.34.0.\n"
"\n"
+" --mail-auth <address>\n"
, stdout);
fputs(
-" --mail-auth <address>\n"
-" (SMTP) Specify a single address. This will be used to specify\n"
-" the authentication address (identity) of a submitted message\n"
+" (SMTP) Specify a single address. This will be used to specify\n"
+" the authentication address (identity) of a submitted message\n"
" that is being relayed to another server.\n"
"\n"
" See also --mail-rcpt and --mail-from. Added in 7.25.0.\n"
"\n"
" --mail-from <address>\n"
-" (SMTP) Specify a single address that the given mail should get\n"
+" (SMTP) Specify a single address that the given mail should get\n"
" sent from.\n"
"\n"
-, stdout);
- fputs(
" See also --mail-rcpt and --mail-auth. Added in 7.20.0.\n"
"\n"
+, stdout);
+ fputs(
" --mail-rcpt-allowfails\n"
" (SMTP) When sending data to multiple recipients, by default curl\n"
-" will abort SMTP conversation if at least one of the recipients\n"
+" will abort SMTP conversation if at least one of the recipients\n"
" causes RCPT TO command to return an error.\n"
"\n"
-" The default behavior can be changed by passing --mail-rcpt-al-\n"
-" lowfails command-line option which will make curl ignore errors\n"
-, stdout);
- fputs(
+" The default behavior can be changed by passing --mail-rcpt-al-\n"
+" lowfails command-line option which will make curl ignore errors\n"
" and proceed with the remaining valid recipients.\n"
"\n"
-" In case when all recipients cause RCPT TO command to fail, curl\n"
-" will abort SMTP conversation and return the error received from\n"
+, stdout);
+ fputs(
+" In case when all recipients cause RCPT TO command to fail, curl\n"
+" will abort SMTP conversation and return the error received from\n"
" to the last RCPT TO command. Added in 7.69.0.\n"
"\n"
" --mail-rcpt <address>\n"
" (SMTP) Specify a single address, user name or mailing list name.\n"
" Repeat this option several times to send to multiple recipients.\n"
+" When performing a mail transfer, the recipient should specify a\n"
, stdout);
fputs(
-" When performing a mail transfer, the recipient should specify a\n"
" valid email address to send the mail to.\n"
"\n"
-" When performing an address verification (VRFY command), the re-\n"
-" cipient should be specified as the user name or user name and\n"
+" When performing an address verification (VRFY command), the re-\n"
+" cipient should be specified as the user name or user name and\n"
" domain (as per Section 3.5 of RFC5321). (Added in 7.34.0)\n"
"\n"
" When performing a mailing list expand (EXPN command), the recip-\n"
+" ient should be specified using the mailing list name, such as\n"
, stdout);
fputs(
-" ient should be specified using the mailing list name, such as\n"
" \"Friends\" or \"London-Office\". (Added in 7.34.0)\n"
"\n"
" Added in 7.20.0.\n"
@@ -1988,29 +2021,29 @@ void hugehelp(void)
" Manual. Display the huge help text.\n"
"\n"
" --max-filesize <bytes>\n"
-" Specify the maximum size (in bytes) of a file to download. If\n"
-" the file requested is larger than this value, the transfer will\n"
+" Specify the maximum size (in bytes) of a file to download. If\n"
+" the file requested is larger than this value, the transfer will\n"
" not start and curl will return with exit code 63.\n"
"\n"
, stdout);
fputs(
-" A size modifier may be used. For example, Appending 'k' or 'K'\n"
-" will count the number as kilobytes, 'm' or 'M' makes it\n"
-" megabytes, while 'g' or 'G' makes it gigabytes. Examples: 200K,\n"
+" A size modifier may be used. For example, Appending 'k' or 'K'\n"
+" will count the number as kilobytes, 'm' or 'M' makes it\n"
+" megabytes, while 'g' or 'G' makes it gigabytes. Examples: 200K,\n"
" 3m and 1G. (Added in 7.58.0)\n"
"\n"
-" NOTE: The file size is not always known prior to download, and\n"
+" NOTE: The file size is not always known prior to download, and\n"
" for such files this option has no effect even if the file trans-\n"
, stdout);
fputs(
-" fer ends up being larger than this given limit. This concerns\n"
+" fer ends up being larger than this given limit. This concerns\n"
" both FTP and HTTP transfers.\n"
"\n"
" See also --limit-rate.\n"
"\n"
" --max-redirs <num>\n"
-" (HTTP) Set maximum number of redirection-followings allowed.\n"
-" When -L, --location is used, is used to prevent curl from fol-\n"
+" (HTTP) Set maximum number of redirection-followings allowed.\n"
+" When -L, --location is used, is used to prevent curl from fol-\n"
" lowing redirections too much. By default, the limit is set to 50\n"
" redirections. Set this option to -1 to make it unlimited.\n"
"\n"
@@ -2019,9 +2052,9 @@ void hugehelp(void)
" If this option is used several times, the last one will be used.\n"
"\n"
" -m, --max-time <seconds>\n"
-" Maximum time in seconds that you allow the whole operation to\n"
-" take. This is useful for preventing your batch jobs from hang-\n"
-" ing for hours due to slow networks or links going down. Since\n"
+" Maximum time in seconds that you allow the whole operation to\n"
+" take. This is useful for preventing your batch jobs from hang-\n"
+" ing for hours due to slow networks or links going down. Since\n"
" 7.32.0, this option accepts decimal values, but the actual time-\n"
, stdout);
fputs(
@@ -2033,14 +2066,14 @@ void hugehelp(void)
" See also --connect-timeout.\n"
"\n"
" --metalink\n"
-" This option can tell curl to parse and process a given URI as\n"
-" Metalink file (both version 3 and 4 (RFC 5854) are supported)\n"
-" and make use of the mirrors listed within for failover if there\n"
+" This option can tell curl to parse and process a given URI as\n"
+" Metalink file (both version 3 and 4 (RFC 5854) are supported)\n"
+" and make use of the mirrors listed within for failover if there\n"
, stdout);
fputs(
-" are errors (such as the file or server not being available). It\n"
-" will also verify the hash of the file after the download com-\n"
-" pletes. The Metalink file itself is downloaded and processed in\n"
+" are errors (such as the file or server not being available). It\n"
+" will also verify the hash of the file after the download com-\n"
+" pletes. The Metalink file itself is downloaded and processed in\n"
" memory and not stored in the local file system.\n"
"\n"
" Example to use a remote Metalink file:\n"
@@ -2054,45 +2087,45 @@ void hugehelp(void)
"\n"
" curl --metalink file://example.metalink\n"
"\n"
-" Please note that if FILE protocol is disabled, there is no way\n"
-" to use a local Metalink file at the time of this writing. Also\n"
-" note that if --metalink and -i, --include are used together,\n"
-" --include will be ignored. This is because including headers in\n"
+" Please note that if FILE protocol is disabled, there is no way\n"
+" to use a local Metalink file at the time of this writing. Also\n"
+" note that if --metalink and -i, --include are used together,\n"
+" --include will be ignored. This is because including headers in\n"
, stdout);
fputs(
-" the response will break Metalink parser and if the headers are\n"
+" the response will break Metalink parser and if the headers are\n"
" included in the file described in Metalink file, hash check will\n"
" fail.\n"
"\n"
-" --metalink requires that the underlying libcurl was built to\n"
+" --metalink requires that the underlying libcurl was built to\n"
" support metalink. Added in 7.27.0.\n"
"\n"
" --negotiate\n"
" (HTTP) Enables Negotiate (SPNEGO) authentication.\n"
"\n"
-" This option requires a library built with GSS-API or SSPI sup-\n"
+" This option requires a library built with GSS-API or SSPI sup-\n"
, stdout);
fputs(
-" port. Use -V, --version to see if your curl supports GSS-\n"
+" port. Use -V, --version to see if your curl supports GSS-\n"
" API/SSPI or SPNEGO.\n"
"\n"
-" When using this option, you must also provide a fake -u, --user\n"
-" option to activate the authentication code properly. Sending a\n"
-" '-u :' is enough as the user name and password from the -u,\n"
+" When using this option, you must also provide a fake -u, --user\n"
+" option to activate the authentication code properly. Sending a\n"
+" '-u :' is enough as the user name and password from the -u,\n"
" --user option aren't actually used.\n"
"\n"
-" If this option is used several times, only the first one is\n"
+" If this option is used several times, only the first one is\n"
, stdout);
fputs(
" used.\n"
"\n"
-" See also --basic and --ntlm and --anyauth and --proxy-negotiate.\n"
+" See also --basic, --ntlm, --anyauth and --proxy-negotiate.\n"
"\n"
" --netrc-file <filename>\n"
-" This option is similar to -n, --netrc, except that you provide\n"
-" the path (absolute or relative) to the netrc file that curl\n"
+" This option is similar to -n, --netrc, except that you provide\n"
+" the path (absolute or relative) to the netrc file that curl\n"
" should use. You can only specify one netrc file per invocation.\n"
-" If several --netrc-file options are provided, the last one will\n"
+" If several --netrc-file options are provided, the last one will\n"
" be used.\n"
"\n"
, stdout);
@@ -2102,47 +2135,47 @@ void hugehelp(void)
" This option overrides -n, --netrc. Added in 7.21.5.\n"
"\n"
" --netrc-optional\n"
-" Very similar to -n, --netrc, but this option makes the .netrc\n"
+" Very similar to -n, --netrc, but this option makes the .netrc\n"
" usage optional and not mandatory as the -n, --netrc option does.\n"
"\n"
" See also --netrc-file. This option overrides -n, --netrc.\n"
"\n"
" -n, --netrc\n"
-" Makes curl scan the .netrc (_netrc on Windows) file in the\n"
+" Makes curl scan the .netrc (_netrc on Windows) file in the\n"
, stdout);
fputs(
" user's home directory for login name and password. This is typi-\n"
-" cally used for FTP on Unix. If used with HTTP, curl will enable\n"
+" cally used for FTP on Unix. If used with HTTP, curl will enable\n"
" user authentication. See netrc(5) ftp(1) for details on the file\n"
-" format. Curl will not complain if that file doesn't have the\n"
+" format. Curl will not complain if that file doesn't have the\n"
" right permissions (it should not be either world- or group-read-\n"
-" able). The environment variable \"HOME\" is used to find the home\n"
+" able). The environment variable \"HOME\" is used to find the home\n"
" directory.\n"
"\n"
, stdout);
fputs(
-" A quick and very simple example of how to setup a .netrc to al-\n"
-" low curl to FTP to the machine host.domain.com with user name\n"
+" A quick and very simple example of how to setup a .netrc to al-\n"
+" low curl to FTP to the machine host.domain.com with user name\n"
" 'myself' and password 'secret' should look similar to:\n"
"\n"
" machine host.domain.com login myself password secret\n"
"\n"
" -:, --next\n"
" Tells curl to use a separate operation for the following URL and\n"
-" associated options. This allows you to send several URL re-\n"
+" associated options. This allows you to send several URL re-\n"
, stdout);
fputs(
-" quests, each with their own specific options, for example, such\n"
+" quests, each with their own specific options, for example, such\n"
" as different user names or custom requests for each.\n"
"\n"
-" -:, --next will reset all local options and only global ones\n"
-" will have their values survive over to the operation following\n"
-" the -:, --next instruction. Global options include -v, --ver-\n"
+" -:, --next will reset all local options and only global ones\n"
+" will have their values survive over to the operation following\n"
+" the -:, --next instruction. Global options include -v, --ver-\n"
" bose, --trace, --trace-ascii and --fail-early.\n"
"\n"
, stdout);
fputs(
-" For example, you can do both a GET and a POST in a single com-\n"
+" For example, you can do both a GET and a POST in a single com-\n"
" mand line:\n"
"\n"
" curl www1.example.com --next -d postthis www2.example.com\n"
@@ -2150,54 +2183,54 @@ void hugehelp(void)
" Added in 7.36.0.\n"
"\n"
" --no-alpn\n"
-" (HTTPS) Disable the ALPN TLS extension. ALPN is enabled by de-\n"
-" fault if libcurl was built with an SSL library that supports\n"
-" ALPN. ALPN is used by a libcurl that supports HTTP/2 to negoti-\n"
+" (HTTPS) Disable the ALPN TLS extension. ALPN is enabled by de-\n"
+" fault if libcurl was built with an SSL library that supports\n"
+" ALPN. ALPN is used by a libcurl that supports HTTP/2 to negoti-\n"
, stdout);
fputs(
" ate HTTP/2 support with the server during https sessions.\n"
"\n"
-" See also --no-npn and --http2. --no-alpn requires that the un-\n"
+" See also --no-npn and --http2. --no-alpn requires that the un-\n"
" derlying libcurl was built to support TLS. Added in 7.36.0.\n"
"\n"
" -N, --no-buffer\n"
" Disables the buffering of the output stream. In normal work sit-\n"
-" uations, curl will use a standard buffered output stream that\n"
+" uations, curl will use a standard buffered output stream that\n"
" will have the effect that it will output the data in chunks, not\n"
, stdout);
fputs(
-" necessarily exactly when the data arrives. Using this option\n"
+" necessarily exactly when the data arrives. Using this option\n"
" will disable that buffering.\n"
"\n"
-" Note that this is the negated option name documented. You can\n"
+" Note that this is the negated option name documented. You can\n"
" thus use --buffer to enforce the buffering.\n"
"\n"
" --no-keepalive\n"
-" Disables the use of keepalive messages on the TCP connection.\n"
+" Disables the use of keepalive messages on the TCP connection.\n"
" curl otherwise enables them by default.\n"
"\n"
-" Note that this is the negated option name documented. You can\n"
+" Note that this is the negated option name documented. You can\n"
, stdout);
fputs(
" thus use --keepalive to enforce keepalive.\n"
"\n"
" --no-npn\n"
" (HTTPS) Disable the NPN TLS extension. NPN is enabled by default\n"
-" if libcurl was built with an SSL library that supports NPN. NPN\n"
-" is used by a libcurl that supports HTTP/2 to negotiate HTTP/2\n"
+" if libcurl was built with an SSL library that supports NPN. NPN\n"
+" is used by a libcurl that supports HTTP/2 to negotiate HTTP/2\n"
" support with the server during https sessions.\n"
"\n"
-" See also --no-alpn and --http2. --no-npn requires that the un-\n"
+" See also --no-alpn and --http2. --no-npn requires that the un-\n"
, stdout);
fputs(
" derlying libcurl was built to support TLS. Added in 7.36.0.\n"
"\n"
" --no-progress-meter\n"
" Option to switch off the progress meter output without muting or\n"
-" otherwise affecting warning and informational messages like -s,\n"
+" otherwise affecting warning and informational messages like -s,\n"
" --silent does.\n"
"\n"
-" Note that this is the negated option name documented. You can\n"
+" Note that this is the negated option name documented. You can\n"
" thus use --progress-meter to enable the progress meter again.\n"
"\n"
, stdout);
@@ -2205,32 +2238,32 @@ void hugehelp(void)
" See also -v, --verbose and -s, --silent. Added in 7.67.0.\n"
"\n"
" --no-sessionid\n"
-" (TLS) Disable curl's use of SSL session-ID caching. By default\n"
-" all transfers are done using the cache. Note that while nothing\n"
-" should ever get hurt by attempting to reuse SSL session-IDs,\n"
+" (TLS) Disable curl's use of SSL session-ID caching. By default\n"
+" all transfers are done using the cache. Note that while nothing\n"
+" should ever get hurt by attempting to reuse SSL session-IDs,\n"
" there seem to be broken SSL implementations in the wild that may\n"
" require you to disable this in order for you to succeed.\n"
"\n"
, stdout);
fputs(
-" Note that this is the negated option name documented. You can\n"
+" Note that this is the negated option name documented. You can\n"
" thus use --sessionid to enforce session-ID caching.\n"
"\n"
" Added in 7.16.0.\n"
"\n"
" --noproxy <no-proxy-list>\n"
-" Comma-separated list of hosts which do not use a proxy, if one\n"
-" is specified. The only wildcard is a single * character, which\n"
+" Comma-separated list of hosts which do not use a proxy, if one\n"
+" is specified. The only wildcard is a single * character, which\n"
" matches all hosts, and effectively disables the proxy. Each name\n"
, stdout);
fputs(
-" in this list is matched as either a domain which contains the\n"
-" hostname, or the hostname itself. For example, local.com would\n"
-" match local.com, local.com:80, and www.local.com, but not\n"
+" in this list is matched as either a domain which contains the\n"
+" hostname, or the hostname itself. For example, local.com would\n"
+" match local.com, local.com:80, and www.local.com, but not\n"
" www.notlocal.com.\n"
"\n"
-" Since 7.53.0, This option overrides the environment variables\n"
-" that disable the proxy. If there's an environment variable dis-\n"
+" Since 7.53.0, This option overrides the environment variables\n"
+" that disable the proxy. If there's an environment variable dis-\n"
, stdout);
fputs(
" abling a proxy, you can set noproxy list to \"\" to override it.\n"
@@ -2239,52 +2272,73 @@ void hugehelp(void)
"\n"
" --ntlm-wb\n"
" (HTTP) Enables NTLM much in the style --ntlm does, but hand over\n"
-" the authentication to the separate binary ntlmauth application\n"
+" the authentication to the separate binary ntlmauth application\n"
" that is executed when needed.\n"
"\n"
" See also --ntlm and --proxy-ntlm.\n"
"\n"
-" --ntlm (HTTP) Enables NTLM authentication. The NTLM authentication\n"
+" --ntlm (HTTP) Enables NTLM authentication. The NTLM authentication\n"
, stdout);
fputs(
" method was designed by Microsoft and is used by IIS web servers.\n"
-" It is a proprietary protocol, reverse-engineered by clever peo-\n"
+" It is a proprietary protocol, reverse-engineered by clever peo-\n"
" ple and implemented in curl based on their efforts. This kind of\n"
-" behavior should not be endorsed, you should encourage everyone\n"
-" who uses NTLM to switch to a public and documented authentica-\n"
+" behavior should not be endorsed, you should encourage everyone\n"
+" who uses NTLM to switch to a public and documented authentica-\n"
" tion method instead, such as Digest.\n"
"\n"
, stdout);
fputs(
-" If you want to enable NTLM for your proxy authentication, then\n"
+" If you want to enable NTLM for your proxy authentication, then\n"
" use --proxy-ntlm.\n"
"\n"
-" If this option is used several times, only the first one is\n"
+" If this option is used several times, only the first one is\n"
" used.\n"
"\n"
-" See also --proxy-ntlm. --ntlm requires that the underlying\n"
-" libcurl was built to support TLS. This option overrides --basic\n"
+" See also --proxy-ntlm. --ntlm requires that the underlying\n"
+" libcurl was built to support TLS. This option overrides --basic\n"
" and --negotiate and --digest and --anyauth.\n"
"\n"
" --oauth2-bearer <token>\n"
, stdout);
fputs(
-" (IMAP POP3 SMTP HTTP) Specify the Bearer Token for OAUTH 2.0\n"
-" server authentication. The Bearer Token is used in conjunction\n"
-" with the user name which can be specified as part of the --url\n"
+" (IMAP POP3 SMTP HTTP) Specify the Bearer Token for OAUTH 2.0\n"
+" server authentication. The Bearer Token is used in conjunction\n"
+" with the user name which can be specified as part of the --url\n"
" or -u, --user options.\n"
"\n"
-" The Bearer Token and user name are formatted according to RFC\n"
+" The Bearer Token and user name are formatted according to RFC\n"
" 6750.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
"\n"
-" -o, --output <file>\n"
+" --output-dir <dir>\n"
+"\n"
, stdout);
fputs(
+" This option specifies the directory in which files should be\n"
+" stored, when -O, --remote-name or -o, --output are used.\n"
+"\n"
+" The given output directory is used for all URLs and output op-\n"
+" tions on the command line, up until the first -:, --next.\n"
+"\n"
+" If the specified target directory doesn't exist, the operation\n"
+" will fail unless --create-dirs is also used.\n"
+"\n"
+, stdout);
+ fputs(
+" If this option is used multiple times, the last specified direc-\n"
+" tory will be used.\n"
+"\n"
+" See also -O, --remote-name and -J, --remote-header-name. Added\n"
+" in 7.73.0.\n"
+"\n"
+" -o, --output <file>\n"
" Write output to <file> instead of stdout. If you are using {} or\n"
" [] to fetch multiple documents, you should quote the URL and you\n"
" can use '#' followed by a number in the <file> specifier. That\n"
+, stdout);
+ fputs(
" variable will be replaced with the current string for the URL\n"
" being fetched. Like in:\n"
"\n"
@@ -2292,36 +2346,36 @@ void hugehelp(void)
"\n"
" or use several variables like:\n"
"\n"
-, stdout);
- fputs(
" curl \"http://{site,host}.host[1-5].com\" -o \"#1_#2\"\n"
"\n"
" You may use this option as many times as the number of URLs you\n"
" have. For example, if you specify two URLs on the same command\n"
+, stdout);
+ fputs(
" line, you can use it like this:\n"
"\n"
" curl -o aa example.com -o bb example.net\n"
"\n"
" and the order of the -o options and the URLs doesn't matter,\n"
" just that the first -o is for the first URL and so on, so the\n"
-, stdout);
- fputs(
" above command line can also be written as\n"
"\n"
" curl example.com example.net -o aa -o bb\n"
"\n"
" See also the --create-dirs option to create the local directo-\n"
+, stdout);
+ fputs(
" ries dynamically. Specifying the output as '-' (a single dash)\n"
" will force the output to be done to stdout.\n"
"\n"
-" See also -O, --remote-name and --remote-name-all and -J, --re-\n"
-" mote-header-name.\n"
+" See also -O, --remote-name, --remote-name-all and -J, --remote-\n"
+" header-name.\n"
"\n"
" --parallel-immediate\n"
-, stdout);
- fputs(
" When doing parallel transfers, this option will instruct curl\n"
" that it should rather prefer opening up more connections in par-\n"
+, stdout);
+ fputs(
" allel at once rather than waiting to see if new transfers can be\n"
" added as multiplexed streams on another connection.\n"
"\n"
@@ -2329,13 +2383,13 @@ void hugehelp(void)
"\n"
" --parallel-max\n"
" When asked to do parallel transfers, using -Z, --parallel, this\n"
-, stdout);
- fputs(
" option controls the maximum amount of transfers to do simultane-\n"
" ously.\n"
"\n"
" The default is 50.\n"
"\n"
+, stdout);
+ fputs(
" See also -Z, --parallel. Added in 7.66.0.\n"
"\n"
" -Z, --parallel\n"
@@ -2347,12 +2401,12 @@ void hugehelp(void)
" --pass <phrase>\n"
" (SSH TLS) Passphrase for the private key\n"
"\n"
-, stdout);
- fputs(
" If this option is used several times, the last one will be used.\n"
"\n"
" --path-as-is\n"
" Tell curl to not handle sequences of /../ or /./ in the given\n"
+, stdout);
+ fputs(
" URL path. Normally curl will squash or merge them according to\n"
" standards but with this option set you tell it not to do that.\n"
"\n"
@@ -2360,94 +2414,92 @@ void hugehelp(void)
"\n"
" --pinnedpubkey <hashes>\n"
" (TLS) Tells curl to use the specified public key file (or\n"
-, stdout);
- fputs(
" hashes) to verify the peer. This can be a path to a file which\n"
" contains a single public key in PEM or DER format, or any number\n"
+, stdout);
+ fputs(
" of base64 encoded sha256 hashes preceded by 'sha256//' and sepa-\n"
" rated by ';'\n"
"\n"
" When negotiating a TLS or SSL connection, the server sends a\n"
" certificate indicating its identity. A public key is extracted\n"
-, stdout);
- fputs(
" from this certificate and if it does not exactly match the pub-\n"
" lic key provided to this option, curl will abort the connection\n"
" before sending or receiving any data.\n"
"\n"
+, stdout);
+ fputs(
" PEM/DER support:\n"
" 7.39.0: OpenSSL, GnuTLS and GSKit\n"
" 7.43.0: NSS and wolfSSL\n"
" 7.47.0: mbedtls sha256 support:\n"
" 7.44.0: OpenSSL, GnuTLS, NSS and wolfSSL\n"
-, stdout);
- fputs(
" 7.47.0: mbedtls Other SSL backends not supported.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
"\n"
" --post301\n"
" (HTTP) Tells curl to respect RFC 7231/6.4.2 and not convert POST\n"
+, stdout);
+ fputs(
" requests into GET requests when following a 301 redirection. The\n"
" non-RFC behaviour is ubiquitous in web browsers, so curl does\n"
" the conversion by default to maintain consistency. However, a\n"
-, stdout);
- fputs(
" server may require a POST to remain a POST after such a redi-\n"
" rection. This option is meaningful only when using -L, --loca-\n"
" tion.\n"
"\n"
-" See also --post302 and --post303 and -L, --location. Added in\n"
+" See also --post302, --post303 and -L, --location. Added in\n"
+, stdout);
+ fputs(
" 7.17.1.\n"
"\n"
" --post302\n"
" (HTTP) Tells curl to respect RFC 7231/6.4.3 and not convert POST\n"
" requests into GET requests when following a 302 redirection. The\n"
-, stdout);
- fputs(
" non-RFC behaviour is ubiquitous in web browsers, so curl does\n"
" the conversion by default to maintain consistency. However, a\n"
" server may require a POST to remain a POST after such a redi-\n"
+, stdout);
+ fputs(
" rection. This option is meaningful only when using -L, --loca-\n"
" tion.\n"
"\n"
-" See also --post301 and --post303 and -L, --location. Added in\n"
+" See also --post301, --post303 and -L, --location. Added in\n"
" 7.19.1.\n"
"\n"
" --post303\n"
-, stdout);
- fputs(
" (HTTP) Tells curl to violate RFC 7231/6.4.4 and not convert POST\n"
" requests into GET requests when following 303 redirections. A\n"
" server may require a POST to remain a POST after a 303 redirect-\n"
+, stdout);
+ fputs(
" ion. This option is meaningful only when using -L, --location.\n"
"\n"
-" See also --post302 and --post301 and -L, --location. Added in\n"
+" See also --post302, --post301 and -L, --location. Added in\n"
" 7.26.0.\n"
"\n"
" --preproxy [protocol://]host[:port]\n"
-, stdout);
- fputs(
" Use the specified SOCKS proxy before connecting to an HTTP or\n"
" HTTPS -x, --proxy. In such a case curl first connects to the\n"
" SOCKS proxy and then connects (through SOCKS) to the HTTP or\n"
+, stdout);
+ fputs(
" HTTPS proxy. Hence pre proxy.\n"
"\n"
" The pre proxy string should be specified with a protocol:// pre-\n"
" fix to specify alternative proxy protocols. Use socks4://,\n"
-, stdout);
- fputs(
" socks4a://, socks5:// or socks5h:// to request the specific\n"
" SOCKS version to be used. No protocol specified will make curl\n"
" default to SOCKS4.\n"
"\n"
" If the port number is not specified in the proxy string, it is\n"
+, stdout);
+ fputs(
" assumed to be 1080.\n"
"\n"
" User and password that might be provided in the proxy string are\n"
" URL decoded by curl. This allows you to pass in special charac-\n"
-, stdout);
- fputs(
" ters such as @ by using %40 or pass in a colon with %3a.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
@@ -2456,23 +2508,23 @@ void hugehelp(void)
"\n"
" -#, --progress-bar\n"
" Make curl display transfer progress as a simple progress bar in-\n"
+, stdout);
+ fputs(
" stead of the standard, more informational, meter.\n"
"\n"
" This progress bar draws a single line of '#' characters across\n"
-, stdout);
- fputs(
" the screen and shows a percentage if the transfer size is known.\n"
" For transfers without a known size, there will be space ship\n"
" (-=o=-) that moves back and forth but only while data is being\n"
" transferred, with a set of flying hash sign symbols on top.\n"
"\n"
" --proto-default <protocol>\n"
+, stdout);
+ fputs(
" Tells curl to use protocol for any URL missing a scheme name.\n"
"\n"
" Example:\n"
"\n"
-, stdout);
- fputs(
" curl --proto-default https ftp.mozilla.org\n"
"\n"
" An unknown or unsupported protocol causes error CURLE_UNSUP-\n"
@@ -2483,11 +2535,11 @@ void hugehelp(void)
" Without this option curl would make a guess based on the host,\n"
" see --url for details.\n"
"\n"
+, stdout);
+ fputs(
" Added in 7.45.0.\n"
"\n"
" --proto-redir <protocols>\n"
-, stdout);
- fputs(
" Tells curl to limit what protocols it may use on redirect. Pro-\n"
" tocols denied by --proto are not overridden by this option. See\n"
" --proto for how protocols are represented.\n"
@@ -2556,8 +2608,8 @@ void hugehelp(void)
" nicating with the given HTTP proxy. This might cause an extra\n"
" request/response round-trip.\n"
"\n"
-" See also -x, --proxy and --proxy-basic and --proxy-digest. Added\n"
-" in 7.13.2.\n"
+" See also -x, --proxy, --proxy-basic and --proxy-digest. Added in\n"
+" 7.13.2.\n"
"\n"
" --proxy-basic\n"
, stdout);
@@ -2567,20 +2619,20 @@ void hugehelp(void)
" remote host. Basic is the default authentication method curl\n"
" uses with proxies.\n"
"\n"
-" See also -x, --proxy and --proxy-anyauth and --proxy-digest.\n"
+" See also -x, --proxy, --proxy-anyauth and --proxy-digest.\n"
"\n"
" --proxy-cacert <file>\n"
" Same as --cacert but used in HTTPS proxy context.\n"
"\n"
, stdout);
fputs(
-" See also --proxy-capath and --cacert and --capath and -x,\n"
-" --proxy. Added in 7.52.0.\n"
+" See also --proxy-capath, --cacert, --capath and -x, --proxy.\n"
+" Added in 7.52.0.\n"
"\n"
" --proxy-capath <dir>\n"
" Same as --capath but used in HTTPS proxy context.\n"
"\n"
-" See also --proxy-cacert and -x, --proxy and --capath. Added in\n"
+" See also --proxy-cacert, -x, --proxy and --capath. Added in\n"
" 7.52.0.\n"
"\n"
" --proxy-cert-type <type>\n"
@@ -2612,7 +2664,7 @@ void hugehelp(void)
" with the given proxy. Use --digest for enabling HTTP Digest with\n"
" a remote host.\n"
"\n"
-" See also -x, --proxy and --proxy-anyauth and --proxy-basic.\n"
+" See also -x, --proxy, --proxy-anyauth and --proxy-basic.\n"
"\n"
" --proxy-header <header/@file>\n"
" (HTTP) Extra header to include in the request when sending HTTP\n"
@@ -2891,40 +2943,54 @@ void hugehelp(void)
" acters. Following is the list of all supported SFTP quote com-\n"
" mands:\n"
"\n"
+" atime date file\n"
+" The atime command sets the last access time of the file\n"
+" named by the file operand. The <date expression> can be\n"
+" all sorts of date strings, see the curl_getdate(3) man\n"
+" page for date expression details. (Added in 7.73.0)\n"
+"\n"
" chgrp group file\n"
-" The chgrp command sets the group ID of the file named by\n"
-" the file operand to the group ID specified by the group\n"
+, stdout);
+ fputs(
+" The chgrp command sets the group ID of the file named by\n"
+" the file operand to the group ID specified by the group\n"
" operand. The group operand is a decimal integer group ID.\n"
"\n"
" chmod mode file\n"
-" The chmod command modifies the file mode bits of the\n"
-, stdout);
- fputs(
+" The chmod command modifies the file mode bits of the\n"
" specified file. The mode operand is an octal integer mode\n"
" number.\n"
"\n"
" chown user file\n"
+, stdout);
+ fputs(
" The chown command sets the owner of the file named by the\n"
-" file operand to the user ID specified by the user oper-\n"
+" file operand to the user ID specified by the user oper-\n"
" and. The user operand is a decimal integer user ID.\n"
"\n"
" ln source_file target_file\n"
" The ln and symlink commands create a symbolic link at the\n"
-, stdout);
- fputs(
-" target_file location pointing to the source_file loca-\n"
+" target_file location pointing to the source_file loca-\n"
" tion.\n"
"\n"
" mkdir directory_name\n"
-" The mkdir command creates the directory named by the di-\n"
+, stdout);
+ fputs(
+" The mkdir command creates the directory named by the di-\n"
" rectory_name operand.\n"
"\n"
+" mtime date file\n"
+" The mtime command sets the last modification time of the\n"
+" file named by the file operand. The <date expression> can\n"
+" be all sorts of date strings, see the curl_getdate(3) man\n"
+" page for date expression details. (Added in 7.73.0)\n"
+"\n"
+, stdout);
+ fputs(
" pwd The pwd command returns the absolute pathname of the cur-\n"
" rent working directory.\n"
"\n"
" rename source target\n"
-, stdout);
- fputs(
" The rename command renames the file or directory named by\n"
" the source operand to the destination path named by the\n"
" target operand.\n"
@@ -2933,10 +2999,10 @@ void hugehelp(void)
" The rm command removes the file specified by the file op-\n"
" erand.\n"
"\n"
-" rmdir directory\n"
-" The rmdir command removes the directory entry specified\n"
, stdout);
fputs(
+" rmdir directory\n"
+" The rmdir command removes the directory entry specified\n"
" by the directory operand, provided it is empty.\n"
"\n"
" symlink source_file target_file\n"
@@ -2945,11 +3011,11 @@ void hugehelp(void)
" --random-file <file>\n"
" Specify the path name to file containing what will be considered\n"
" as random data. The data may be used to seed the random engine\n"
+, stdout);
+ fputs(
" for SSL connections. See also the --egd-file option.\n"
"\n"
" -r, --range <range>\n"
-, stdout);
- fputs(
" (HTTP FTP SFTP FILE) Retrieve a byte range (i.e. a partial docu-\n"
" ment) from an HTTP/1.1, FTP or SFTP server or a local FILE.\n"
" Ranges can be specified in a number of ways.\n"
@@ -2960,10 +3026,10 @@ void hugehelp(void)
"\n"
" -500 specifies the last 500 bytes\n"
"\n"
-" 9500- specifies the bytes from offset 9500 and forward\n"
-"\n"
, stdout);
fputs(
+" 9500- specifies the bytes from offset 9500 and forward\n"
+"\n"
" 0-0,-1 specifies the first and last byte only(*)(HTTP)\n"
"\n"
" 100-199,500-599\n"
@@ -2973,9 +3039,9 @@ void hugehelp(void)
" tipart response!\n"
"\n"
" Only digit characters (0-9) are valid in the 'start' and 'stop'\n"
-" fields of the 'start-stop' range syntax. If a non-digit charac-\n"
, stdout);
fputs(
+" fields of the 'start-stop' range syntax. If a non-digit charac-\n"
" ter is given in the range, the server's response will be unspec-\n"
" ified, depending on the server's configuration.\n"
"\n"
@@ -2983,9 +3049,9 @@ void hugehelp(void)
" this feature enabled, so that when you attempt to get a range,\n"
" you'll instead get the whole document.\n"
"\n"
-" FTP and SFTP range downloads only support the simple 'start-\n"
, stdout);
fputs(
+" FTP and SFTP range downloads only support the simple 'start-\n"
" stop' syntax (optionally with one of the numbers omitted). FTP\n"
" use depends on the extended FTP command SIZE.\n"
"\n"
@@ -2995,20 +3061,20 @@ void hugehelp(void)
" tent or transfer encodings and instead makes them passed on un-\n"
" altered, raw.\n"
"\n"
+, stdout);
+ fputs(
" Added in 7.16.2.\n"
"\n"
" -e, --referer <URL>\n"
-, stdout);
- fputs(
" (HTTP) Sends the \"Referrer Page\" information to the HTTP server.\n"
" This can also be set with the -H, --header flag of course. When\n"
" used with -L, --location you can append \";auto\" to the -e,\n"
" --referer URL to make curl automatically set the previous URL\n"
" when it follows a Location: header. The \";auto\" string can be\n"
-" used alone, even if you don't set an initial -e, --referer.\n"
-"\n"
, stdout);
fputs(
+" used alone, even if you don't set an initial -e, --referer.\n"
+"\n"
" If this option is used several times, the last one will be used.\n"
"\n"
" See also -A, --user-agent and -H, --header.\n"
@@ -3018,9 +3084,9 @@ void hugehelp(void)
" server-specified Content-Disposition filename instead of ex-\n"
" tracting a filename from the URL.\n"
"\n"
-" If the server specifies a file name and a file with that name\n"
, stdout);
fputs(
+" If the server specifies a file name and a file with that name\n"
" already exists in the current working directory it will not be\n"
" overwritten and an error will occur. If the server doesn't spec-\n"
" ify a file name then this option has no effect.\n"
@@ -3029,9 +3095,9 @@ void hugehelp(void)
" file name, so this option may provide you with rather unexpected\n"
" file names.\n"
"\n"
-" WARNING: Exercise judicious use of this option, especially on\n"
, stdout);
fputs(
+" WARNING: Exercise judicious use of this option, especially on\n"
" Windows. A rogue server could send you the name of a DLL or\n"
" other file that could possibly be loaded automatically by Win-\n"
" dows or some third party software.\n"
@@ -3039,9 +3105,9 @@ void hugehelp(void)
" --remote-name-all\n"
" This option changes the default action for all given URLs to be\n"
" dealt with as if -O, --remote-name were used for each one. So if\n"
-" you want to disable that for a specific URL after --remote-name-\n"
, stdout);
fputs(
+" you want to disable that for a specific URL after --remote-name-\n"
" all has been used, you must use \"-o -\" or --no-remote-name.\n"
"\n"
" Added in 7.19.0.\n"
@@ -3052,18 +3118,18 @@ void hugehelp(void)
" off.)\n"
"\n"
" The file will be saved in the current working directory. If you\n"
-" want the file saved in a different directory, make sure you\n"
, stdout);
fputs(
+" want the file saved in a different directory, make sure you\n"
" change the current working directory before invoking curl with\n"
" this option.\n"
"\n"
" The remote file name to use for saving is extracted from the\n"
" given URL, nothing else, and if it already exists it will be\n"
" overwritten. If you want the server to be able to choose the\n"
-" file name refer to -J, --remote-header-name which can be used in\n"
, stdout);
fputs(
+" file name refer to -J, --remote-header-name which can be used in\n"
" addition to this option. If the server chooses a file name and\n"
" that name already exists it will not be overwritten.\n"
"\n"
@@ -3072,11 +3138,11 @@ void hugehelp(void)
" file name.\n"
"\n"
" You may use this option as many times as the number of URLs you\n"
+, stdout);
+ fputs(
" have.\n"
"\n"
" -R, --remote-time\n"
-, stdout);
- fputs(
" When used, this will make curl attempt to figure out the time-\n"
" stamp of the remote file, and if that is available make the lo-\n"
" cal file get that same timestamp.\n"
@@ -3084,9 +3150,9 @@ void hugehelp(void)
" --request-target\n"
" (HTTP) Tells curl to use an alternative \"target\" (path) instead\n"
" of using the path as provided in the URL. Particularly useful\n"
-" when wanting to issue HTTP requests without leading slash or\n"
, stdout);
fputs(
+" when wanting to issue HTTP requests without leading slash or\n"
" other data that doesn't follow the regular URL pattern, like\n"
" \"OPTIONS *\".\n"
"\n"
@@ -3096,9 +3162,9 @@ void hugehelp(void)
" (HTTP) Specifies a custom request method to use when communicat-\n"
" ing with the HTTP server. The specified request method will be\n"
" used instead of the method otherwise used (which defaults to\n"
-" GET). Read the HTTP 1.1 specification for details and explana-\n"
, stdout);
fputs(
+" GET). Read the HTTP 1.1 specification for details and explana-\n"
" tions. Common additional HTTP requests include PUT and DELETE,\n"
" but related technologies like WebDAV offers PROPFIND, COPY, MOVE\n"
" and more.\n"
@@ -3107,18 +3173,18 @@ void hugehelp(void)
" POST and PUT requests are rather invoked by using dedicated com-\n"
" mand line options.\n"
"\n"
-" This option only changes the actual word used in the HTTP re-\n"
, stdout);
fputs(
+" This option only changes the actual word used in the HTTP re-\n"
" quest, it does not alter the way curl behaves. So for example if\n"
" you want to make a proper HEAD request, using -X HEAD will not\n"
" suffice. You need to use the -I, --head option.\n"
"\n"
" The method string you set with -X, --request will be used for\n"
" all requests, which if you for example use -L, --location may\n"
-" cause unintended side-effects when curl doesn't change request\n"
, stdout);
fputs(
+" cause unintended side-effects when curl doesn't change request\n"
" method according to the HTTP 30x response codes - and similar.\n"
"\n"
" (FTP) Specifies a custom FTP command to use instead of LIST when\n"
@@ -3128,10 +3194,10 @@ void hugehelp(void)
" RETR. (Added in 7.26.0)\n"
"\n"
" (IMAP) Specifies a custom IMAP command to use instead of LIST.\n"
-" (Added in 7.30.0)\n"
-"\n"
, stdout);
fputs(
+" (Added in 7.30.0)\n"
+"\n"
" (SMTP) Specifies a custom SMTP command to use instead of HELP or\n"
" VRFY. (Added in 7.34.0)\n"
"\n"
@@ -3140,29 +3206,29 @@ void hugehelp(void)
" --resolve <host:port:addr[,addr]...>\n"
" Provide a custom address for a specific host and port pair. Us-\n"
" ing this, you can make the curl requests(s) use a specified ad-\n"
-" dress and prevent the otherwise normally resolved address to be\n"
, stdout);
fputs(
+" dress and prevent the otherwise normally resolved address to be\n"
" used. Consider it a sort of /etc/hosts alternative provided on\n"
" the command line. The port number should be the number used for\n"
" the specific protocol the host will be used for. It means you\n"
" need several entries if you want to provide address for the same\n"
" host but different ports.\n"
"\n"
-" By specifying '*' as host you can tell curl to resolve any host\n"
, stdout);
fputs(
+" By specifying '*' as host you can tell curl to resolve any host\n"
" and specific port pair to the specified address. Wildcard is re-\n"
" solved last so any --resolve with a specific host and port will\n"
" be used first.\n"
"\n"
" The provided address set by this option will be used even if -4,\n"
" --ipv4 or -6, --ipv6 is set to make curl use another IP version.\n"
+, stdout);
+ fputs(
" Support for providing the IP address within [brackets] was added\n"
" in 7.57.0.\n"
"\n"
-, stdout);
- fputs(
" Support for providing multiple IP addresses per entry was added\n"
" in 7.59.0.\n"
"\n"
@@ -3174,28 +3240,28 @@ void hugehelp(void)
" Added in 7.21.3.\n"
"\n"
" --retry-all-errors\n"
+, stdout);
+ fputs(
" Retry on any error. This option is used together with --retry.\n"
"\n"
" This option is the \"sledgehammer\" of retrying. Do not use this\n"
-, stdout);
- fputs(
" option by default (eg in curlrc), there may be unintended conse-\n"
" quences such as sending or receiving duplicate data. Do not use\n"
" with redirected input or output. You'd be much better off han-\n"
" dling your unique problems in shell script. Please read the ex-\n"
" ample below.\n"
-"\n"
-" Warning: For server compatibility curl attempts to retry failed\n"
, stdout);
fputs(
+"\n"
+" Warning: For server compatibility curl attempts to retry failed\n"
" flaky transfers as close as possible to how they were started,\n"
" but this is not possible with redirected input or output. For\n"
" example, before retrying it removes output data from a failed\n"
" partial transfer that was written to an output file. However\n"
" this is not true of data redirected to a | pipe or > file, which\n"
-" are not reset. We strongly suggest don't parse or record output\n"
, stdout);
fputs(
+" are not reset. We strongly suggest don't parse or record output\n"
" via redirect in combination with this option, since you may re-\n"
" ceive duplicate data.\n"
"\n"
@@ -3208,9 +3274,9 @@ void hugehelp(void)
"\n"
" Added in 7.52.0.\n"
"\n"
-" --retry-delay <seconds>\n"
, stdout);
fputs(
+" --retry-delay <seconds>\n"
" Make curl sleep this amount of time before each retry when a\n"
" transfer has failed with a transient error (it changes the de-\n"
" fault backoff time algorithm between retries). This option is\n"
@@ -3219,10 +3285,10 @@ void hugehelp(void)
"\n"
" If this option is used several times, the last one will be used.\n"
"\n"
-" Added in 7.12.3.\n"
-"\n"
, stdout);
fputs(
+" Added in 7.12.3.\n"
+"\n"
" --retry-max-time <seconds>\n"
" The retry timer is reset before the first transfer attempt. Re-\n"
" tries will be done as usual (see --retry) as long as the timer\n"
@@ -3298,6 +3364,9 @@ void hugehelp(void)
" -S, --show-error\n"
" When used with -s, --silent, it makes curl show an error message\n"
" if it fails.\n"
+"\n"
+" See also --no-progress-meter.\n"
+"\n"
" -s, --silent\n"
" Silent or quiet mode. Don't show progress meter or error mes-\n"
" sages. Makes Curl mute. It will still output the data you ask\n"
@@ -3309,7 +3378,7 @@ void hugehelp(void)
" Use -S, --show-error in addition to this option to disable\n"
" progress meter but still show error messages.\n"
"\n"
-" See also -v, --verbose and --stderr.\n"
+" See also -v, --verbose, --stderr and --no-progress-meter.\n"
"\n"
" --socks4 <host[:port]>\n"
" Use the specified SOCKS4 proxy. If the port number is not speci-\n"
@@ -3572,30 +3641,29 @@ void hugehelp(void)
" fect on debug options such as -v, --verbose or --trace, or any\n"
" statistics.\n"
"\n"
-" See also -D, --dump-header and -i, --include and -p, --proxytun-\n"
-" nel.\n"
+" See also -D, --dump-header, -i, --include and -p, --proxytunnel.\n"
"\n"
" --tcp-fastopen\n"
-, stdout);
- fputs(
" Enable use of TCP Fast Open (RFC7413).\n"
"\n"
+, stdout);
+ fputs(
" Added in 7.49.0.\n"
"\n"
" --tcp-nodelay\n"
-" Turn on the TCP_NODELAY option. See the curl_easy_setopt(3) man\n"
+" Turn on the TCP_NODELAY option. See the curl_easy_setopt(3) man\n"
" page for details about this option.\n"
"\n"
-" Since 7.50.2, curl sets this option by default and you need to\n"
+" Since 7.50.2, curl sets this option by default and you need to\n"
" explicitly switch it off if you don't want it on.\n"
"\n"
" Added in 7.11.2.\n"
"\n"
" -t, --telnet-option <opt=val>\n"
-, stdout);
- fputs(
" Pass options to the telnet protocol. Supported options are:\n"
"\n"
+, stdout);
+ fputs(
" TTYPE=<term> Sets the terminal type.\n"
"\n"
" XDISPLOC=<X display> Sets the X display location.\n"
@@ -3605,10 +3673,10 @@ void hugehelp(void)
" --tftp-blksize <value>\n"
" (TFTP) Set TFTP BLKSIZE option (must be >512). This is the block\n"
" size that curl will try to use when transferring data to or from\n"
-, stdout);
- fputs(
" a TFTP server. By default 512 bytes will be used.\n"
"\n"
+, stdout);
+ fputs(
" If this option is used several times, the last one will be used.\n"
"\n"
" Added in 7.20.0.\n"
@@ -3616,39 +3684,39 @@ void hugehelp(void)
" --tftp-no-options\n"
" (TFTP) Tells curl not to send TFTP options requests.\n"
"\n"
-" This option improves interop with some legacy servers that do\n"
-" not acknowledge or properly implement TFTP options. When this\n"
+" This option improves interop with some legacy servers that do\n"
+" not acknowledge or properly implement TFTP options. When this\n"
" option is used --tftp-blksize is ignored.\n"
"\n"
-, stdout);
- fputs(
" Added in 7.48.0.\n"
"\n"
" -z, --time-cond <time>\n"
-" (HTTP FTP) Request a file that has been modified later than the\n"
-" given time and date, or one that has been modified before that\n"
-" time. The <date expression> can be all sorts of date strings or\n"
-" if it doesn't match any internal ones, it is taken as a filename\n"
-" and tries to get the modification date (mtime) from <file> in-\n"
, stdout);
fputs(
+" (HTTP FTP) Request a file that has been modified later than the\n"
+" given time and date, or one that has been modified before that\n"
+" time. The <date expression> can be all sorts of date strings or\n"
+" if it doesn't match any internal ones, it is taken as a filename\n"
+" and tries to get the modification date (mtime) from <file> in-\n"
" stead. See the curl_getdate(3) man pages for date expression de-\n"
" tails.\n"
"\n"
+, stdout);
+ fputs(
" Start the date expression with a dash (-) to make it request for\n"
-" a document that is older than the given date/time, default is a\n"
+" a document that is older than the given date/time, default is a\n"
" document that is newer than the specified date/time.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
"\n"
" --tls-max <VERSION>\n"
+" (SSL) VERSION defines maximum supported TLS version. The minimum\n"
+" acceptable version is set by tlsv1.0, tlsv1.1, tlsv1.2 or\n"
, stdout);
fputs(
-" (SSL) VERSION defines maximum supported TLS version. The minimum\n"
-" acceptable version is set by tlsv1.0, tlsv1.1, tlsv1.2 or\n"
" tlsv1.3.\n"
"\n"
-" If the connection is done without TLS, this option has no ef-\n"
+" If the connection is done without TLS, this option has no ef-\n"
" fect. This includes QUIC-using (HTTP/3) transfers.\n"
"\n"
" default\n"
@@ -3656,83 +3724,83 @@ void hugehelp(void)
"\n"
" 1.0 Use up to TLSv1.0.\n"
" 1.1 Use up to TLSv1.1.\n"
-, stdout);
- fputs(
" 1.2 Use up to TLSv1.2.\n"
" 1.3 Use up to TLSv1.3.\n"
"\n"
-" See also --tlsv1.0 and --tlsv1.1 and --tlsv1.2 and --tlsv1.3. --tls-max\n"
-" requires that the underlying libcurl was built to support TLS. Added in\n"
+" See also --tlsv1.0, --tlsv1.1, --tlsv1.2 and --tlsv1.3. --tls-max re-\n"
+, stdout);
+ fputs(
+" quires that the underlying libcurl was built to support TLS. Added in\n"
" 7.54.0.\n"
"\n"
" --tls13-ciphers <ciphersuite list>\n"
-" (TLS) Specifies which cipher suites to use in the connection if\n"
-" it negotiates TLS 1.3. The list of ciphers suites must specify\n"
-, stdout);
- fputs(
-" valid ciphers. Read up on TLS 1.3 cipher suite details on this\n"
+" (TLS) Specifies which cipher suites to use in the connection if\n"
+" it negotiates TLS 1.3. The list of ciphers suites must specify\n"
+" valid ciphers. Read up on TLS 1.3 cipher suite details on this\n"
" URL:\n"
"\n"
" https://curl.haxx.se/docs/ssl-ciphers.html\n"
"\n"
-" This option is currently used only when curl is built to use\n"
+, stdout);
+ fputs(
+" This option is currently used only when curl is built to use\n"
" OpenSSL 1.1.1 or later. If you are using a different SSL backend\n"
" you can try setting TLS 1.3 cipher suites by using the --ciphers\n"
" option.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
"\n"
+" --tlsauthtype <type>\n"
+" Set TLS authentication type. Currently, the only supported op-\n"
, stdout);
fputs(
-" --tlsauthtype <type>\n"
-" Set TLS authentication type. Currently, the only supported op-\n"
" tion is \"SRP\", for TLS-SRP (RFC 5054). If --tlsuser and\n"
-" --tlspassword are specified but --tlsauthtype is not, then this\n"
-" option defaults to \"SRP\". This option works only if the under-\n"
-" lying libcurl is built with TLS-SRP support, which requires\n"
+" --tlspassword are specified but --tlsauthtype is not, then this\n"
+" option defaults to \"SRP\". This option works only if the under-\n"
+" lying libcurl is built with TLS-SRP support, which requires\n"
" OpenSSL or GnuTLS with TLS-SRP support.\n"
"\n"
-, stdout);
- fputs(
" Added in 7.21.4.\n"
"\n"
" --tlspassword\n"
-" Set password for use with the TLS authentication method speci-\n"
+, stdout);
+ fputs(
+" Set password for use with the TLS authentication method speci-\n"
" fied with --tlsauthtype. Requires that --tlsuser also be set.\n"
"\n"
" This doesn't work with TLS 1.3.\n"
"\n"
" Added in 7.21.4.\n"
" --tlsuser <name>\n"
-" Set username for use with the TLS authentication method speci-\n"
-" fied with --tlsauthtype. Requires that --tlspassword also is\n"
+" Set username for use with the TLS authentication method speci-\n"
+" fied with --tlsauthtype. Requires that --tlspassword also is\n"
" set.\n"
"\n"
-, stdout);
- fputs(
" This doesn't work with TLS 1.3.\n"
"\n"
+, stdout);
+ fputs(
" Added in 7.21.4.\n"
"\n"
" --tlsv1.0\n"
-" (TLS) Forces curl to use TLS version 1.0 or later when connect-\n"
+" (TLS) Forces curl to use TLS version 1.0 or later when connect-\n"
" ing to a remote TLS server.\n"
"\n"
-" In old versions of curl this option was documented to allow\n"
-" _only_ TLS 1.0, but behavior was inconsistent depending on the\n"
+" In old versions of curl this option was documented to allow\n"
+" _only_ TLS 1.0, but behavior was inconsistent depending on the\n"
" TLS library. Use --tls-max if you want to set a maximum TLS ver-\n"
" sion.\n"
"\n"
-, stdout);
- fputs(
" Added in 7.34.0.\n"
"\n"
" --tlsv1.1\n"
-" (TLS) Forces curl to use TLS version 1.1 or later when connect-\n"
+, stdout);
+ fputs(
+" (TLS) Forces curl to use TLS version 1.1 or later when connect-\n"
" ing to a remote TLS server.\n"
"\n"
-" In old versions of curl this option was documented to allow\n"
-" _only_ TLS 1.1, but behavior was inconsistent depending on the\n"
+" In old versions of curl this option was documented to allow\n"
+" _only_ TLS 1.1, but behavior was inconsistent depending on the\n"
" TLS library. Use --tls-max if you want to set a maximum TLS ver-\n"
" sion.\n"
"\n"
@@ -3741,11 +3809,11 @@ void hugehelp(void)
" --tlsv1.2\n"
, stdout);
fputs(
-" (TLS) Forces curl to use TLS version 1.2 or later when connect-\n"
+" (TLS) Forces curl to use TLS version 1.2 or later when connect-\n"
" ing to a remote TLS server.\n"
"\n"
-" In old versions of curl this option was documented to allow\n"
-" _only_ TLS 1.2, but behavior was inconsistent depending on the\n"
+" In old versions of curl this option was documented to allow\n"
+" _only_ TLS 1.2, but behavior was inconsistent depending on the\n"
" TLS library. Use --tls-max if you want to set a maximum TLS ver-\n"
" sion.\n"
"\n"
@@ -3754,10 +3822,10 @@ void hugehelp(void)
" --tlsv1.3\n"
, stdout);
fputs(
-" (TLS) Forces curl to use TLS version 1.3 or later when connect-\n"
+" (TLS) Forces curl to use TLS version 1.3 or later when connect-\n"
" ing to a remote TLS server.\n"
"\n"
-" If the connection is done without TLS, this option has no ef-\n"
+" If the connection is done without TLS, this option has no ef-\n"
" fect. This includes QUIC-using (HTTP/3) transfers.\n"
"\n"
" Note that TLS 1.3 is not supported by all TLS backends.\n"
@@ -3765,19 +3833,19 @@ void hugehelp(void)
" Added in 7.52.0.\n"
"\n"
" -1, --tlsv1\n"
-" (SSL) Tells curl to use at least TLS version 1.x when negotiat-\n"
+" (SSL) Tells curl to use at least TLS version 1.x when negotiat-\n"
, stdout);
fputs(
-" ing with a remote TLS server. That means TLS version 1.0 or\n"
+" ing with a remote TLS server. That means TLS version 1.0 or\n"
" higher\n"
"\n"
-" See also --http1.1 and --http2. -1, --tlsv1 requires that the\n"
-" underlying libcurl was built to support TLS. This option over-\n"
+" See also --http1.1 and --http2. -1, --tlsv1 requires that the\n"
+" underlying libcurl was built to support TLS. This option over-\n"
" rides --tlsv1.1 and --tlsv1.2 and --tlsv1.3.\n"
"\n"
" --tr-encoding\n"
" (HTTP) Request a compressed Transfer-Encoding response using one\n"
-" of the algorithms curl supports, and uncompress the data while\n"
+" of the algorithms curl supports, and uncompress the data while\n"
, stdout);
fputs(
" receiving it.\n"
@@ -3786,11 +3854,11 @@ void hugehelp(void)
"\n"
" --trace-ascii <file>\n"
" Enables a full trace dump of all incoming and outgoing data, in-\n"
-" cluding descriptive information, to the given output file. Use\n"
+" cluding descriptive information, to the given output file. Use\n"
" \"-\" as filename to have the output sent to stdout.\n"
"\n"
" This is very similar to --trace, but leaves out the hex part and\n"
-" only shows the ASCII part of the dump. It makes smaller output\n"
+" only shows the ASCII part of the dump. It makes smaller output\n"
, stdout);
fputs(
" that might be easier to read for untrained humans.\n"
@@ -3800,7 +3868,7 @@ void hugehelp(void)
" This option overrides --trace and -v, --verbose.\n"
"\n"
" --trace-time\n"
-" Prepends a time stamp to each trace or verbose line that curl\n"
+" Prepends a time stamp to each trace or verbose line that curl\n"
" displays.\n"
"\n"
" Added in 7.14.0.\n"
@@ -3809,8 +3877,8 @@ void hugehelp(void)
" Enables a full trace dump of all incoming and outgoing data, in-\n"
, stdout);
fputs(
-" cluding descriptive information, to the given output file. Use\n"
-" \"-\" as filename to have the output sent to stdout. Use \"%\" as\n"
+" cluding descriptive information, to the given output file. Use\n"
+" \"-\" as filename to have the output sent to stdout. Use \"%\" as\n"
" filename to have the output sent to stderr.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
@@ -3826,10 +3894,10 @@ void hugehelp(void)
" Added in 7.40.0.\n"
"\n"
" -T, --upload-file <file>\n"
-" This transfers the specified local file to the remote URL. If\n"
+" This transfers the specified local file to the remote URL. If\n"
" there is no file part in the specified URL, curl will append the\n"
" local file name. NOTE that you must use a trailing / on the last\n"
-" directory to really prove to Curl that there is no file name or\n"
+" directory to really prove to Curl that there is no file name or\n"
" curl will think that your last directory name is the remote file\n"
, stdout);
fputs(
@@ -3837,19 +3905,19 @@ void hugehelp(void)
" fail. If this is used on an HTTP(S) server, the PUT command will\n"
" be used.\n"
"\n"
-" Use the file name \"-\" (a single dash) to use stdin instead of a\n"
-" given file. Alternately, the file name \".\" (a single period)\n"
-" may be specified instead of \"-\" to use stdin in non-blocking\n"
-" mode to allow reading server output while stdin is being up-\n"
+" Use the file name \"-\" (a single dash) to use stdin instead of a\n"
+" given file. Alternately, the file name \".\" (a single period)\n"
+" may be specified instead of \"-\" to use stdin in non-blocking\n"
+" mode to allow reading server output while stdin is being up-\n"
, stdout);
fputs(
" loaded.\n"
"\n"
-" You can specify one -T, --upload-file for each URL on the com-\n"
-" mand line. Each -T, --upload-file + URL pair specifies what to\n"
-" upload and to where. curl also supports \"globbing\" of the -T,\n"
-" --upload-file argument, meaning that you can upload multiple\n"
-" files to a single URL by using the same URL globbing style sup-\n"
+" You can specify one -T, --upload-file for each URL on the com-\n"
+" mand line. Each -T, --upload-file + URL pair specifies what to\n"
+" upload and to where. curl also supports \"globbing\" of the -T,\n"
+" --upload-file argument, meaning that you can upload multiple\n"
+" files to a single URL by using the same URL globbing style sup-\n"
" ported in the URL, like this:\n"
"\n"
, stdout);
@@ -3860,50 +3928,50 @@ void hugehelp(void)
"\n"
" curl -T \"img[1-1000].png\" ftp://ftp.example.com/upload/\n"
"\n"
-" When uploading to an SMTP server: the uploaded data is assumed\n"
+" When uploading to an SMTP server: the uploaded data is assumed\n"
" to be RFC 5322 formatted. It has to feature the necessary set of\n"
-" headers and mail body formatted correctly by the user as curl\n"
+" headers and mail body formatted correctly by the user as curl\n"
" will not transcode nor encode it further in any way.\n"
"\n"
" --url <url>\n"
, stdout);
fputs(
-" Specify a URL to fetch. This option is mostly handy when you\n"
+" Specify a URL to fetch. This option is mostly handy when you\n"
" want to specify URL(s) in a config file.\n"
"\n"
-" If the given URL is missing a scheme name (such as \"http://\" or\n"
-" \"ftp://\" etc) then curl will make a guess based on the host. If\n"
-" the outermost sub-domain name matches DICT, FTP, IMAP, LDAP,\n"
-" POP3 or SMTP then that protocol will be used, otherwise HTTP\n"
+" If the given URL is missing a scheme name (such as \"http://\" or\n"
+" \"ftp://\" etc) then curl will make a guess based on the host. If\n"
+" the outermost sub-domain name matches DICT, FTP, IMAP, LDAP,\n"
+" POP3 or SMTP then that protocol will be used, otherwise HTTP\n"
, stdout);
fputs(
" will be used. Since 7.45.0 guessing can be disabled by setting a\n"
" default protocol, see --proto-default for details.\n"
"\n"
-" This option may be used any number of times. To control where\n"
-" this URL is written, use the -o, --output or the -O, --remote-\n"
+" This option may be used any number of times. To control where\n"
+" this URL is written, use the -o, --output or the -O, --remote-\n"
" name options.\n"
"\n"
-" Warning: On Windows, particular file:// accesses can be con-\n"
+" Warning: On Windows, particular file:// accesses can be con-\n"
" verted to network accesses by the operating system. Beware!\n"
"\n"
, stdout);
fputs(
" -B, --use-ascii\n"
-" (FTP LDAP) Enable ASCII transfer. For FTP, this can also be en-\n"
-" forced by using a URL that ends with \";type=A\". This option\n"
+" (FTP LDAP) Enable ASCII transfer. For FTP, this can also be en-\n"
+" forced by using a URL that ends with \";type=A\". This option\n"
" causes data sent to stdout to be in text mode for win32 systems.\n"
"\n"
" -A, --user-agent <name>\n"
" (HTTP) Specify the User-Agent string to send to the HTTP server.\n"
-" To encode blanks in the string, surround the string with single\n"
+" To encode blanks in the string, surround the string with single\n"
, stdout);
fputs(
-" quote marks. This header can also be set with the -H, --header\n"
+" quote marks. This header can also be set with the -H, --header\n"
" or the --proxy-header options.\n"
"\n"
-" If you give an empty argument to -A, --user-agent (\"\"), it will\n"
-" remove the header completely from the request. If you prefer a\n"
+" If you give an empty argument to -A, --user-agent (\"\"), it will\n"
+" remove the header completely from the request. If you prefer a\n"
" blank header, you can set it to a single space (\" \").\n"
"\n"
" If this option is used several times, the last one will be used.\n"
@@ -3914,41 +3982,41 @@ void hugehelp(void)
" Specify the user name and password to use for server authentica-\n"
" tion. Overrides -n, --netrc and --netrc-optional.\n"
"\n"
-" If you simply specify the user name, curl will prompt for a\n"
+" If you simply specify the user name, curl will prompt for a\n"
" password.\n"
"\n"
-" The user name and passwords are split up on the first colon,\n"
-" which makes it impossible to use a colon in the user name with\n"
+" The user name and passwords are split up on the first colon,\n"
+" which makes it impossible to use a colon in the user name with\n"
" this option. The password can, still.\n"
"\n"
, stdout);
fputs(
" On systems where it works, curl will hide the given option argu-\n"
-" ment from process listings. This is not enough to protect cre-\n"
-" dentials from possibly getting seen by other users on the same\n"
-" system as they will still be visible for a brief moment before\n"
+" ment from process listings. This is not enough to protect cre-\n"
+" dentials from possibly getting seen by other users on the same\n"
+" system as they will still be visible for a brief moment before\n"
" cleared. Such sensitive data should be retrieved from a file in-\n"
" stead or similar and never used in clear text in a command line.\n"
, stdout);
fputs(
-" When using Kerberos V5 with a Windows based server you should\n"
-" include the Windows domain name in the user name, in order for\n"
-" the server to successfully obtain a Kerberos Ticket. If you\n"
+" When using Kerberos V5 with a Windows based server you should\n"
+" include the Windows domain name in the user name, in order for\n"
+" the server to successfully obtain a Kerberos Ticket. If you\n"
" don't then the initial authentication handshake may fail.\n"
"\n"
-" When using NTLM, the user name can be specified simply as the\n"
-" user name, without the domain, if there is a single domain and\n"
+" When using NTLM, the user name can be specified simply as the\n"
+" user name, without the domain, if there is a single domain and\n"
, stdout);
fputs(
" forest in your setup for example.\n"
"\n"
-" To specify the domain name use either Down-Level Logon Name or\n"
+" To specify the domain name use either Down-Level Logon Name or\n"
" UPN (User Principal Name) formats. For example, EXAMPLE\\user and\n"
" user@example.com respectively.\n"
"\n"
-" If you use a Windows SSPI-enabled curl binary and perform Ker-\n"
-" beros V5, Negotiate, NTLM or Digest authentication then you can\n"
-" tell curl to select the user name and password from your envi-\n"
+" If you use a Windows SSPI-enabled curl binary and perform Ker-\n"
+" beros V5, Negotiate, NTLM or Digest authentication then you can\n"
+" tell curl to select the user name and password from your envi-\n"
, stdout);
fputs(
" ronment by specifying a single colon with this option: \"-u :\".\n"
@@ -3956,10 +4024,10 @@ void hugehelp(void)
" If this option is used several times, the last one will be used.\n"
"\n"
" -v, --verbose\n"
-" Makes curl verbose during the operation. Useful for debugging\n"
-" and seeing what's going on \"under the hood\". A line starting\n"
-" with '>' means \"header data\" sent by curl, '<' means \"header\n"
-" data\" received by curl that is hidden in normal cases, and a\n"
+" Makes curl verbose during the operation. Useful for debugging\n"
+" and seeing what's going on \"under the hood\". A line starting\n"
+" with '>' means \"header data\" sent by curl, '<' means \"header\n"
+" data\" received by curl that is hidden in normal cases, and a\n"
, stdout);
fputs(
" line starting with '*' means additional info provided by curl.\n"
@@ -3967,22 +4035,22 @@ void hugehelp(void)
" If you only want HTTP headers in the output, -i, --include might\n"
" be the option you're looking for.\n"
"\n"
-" If you think this option still doesn't give you enough details,\n"
+" If you think this option still doesn't give you enough details,\n"
" consider using --trace or --trace-ascii instead.\n"
"\n"
" Use -s, --silent to make curl really quiet.\n"
"\n"
-" See also -i, --include. This option overrides --trace and\n"
+" See also -i, --include. This option overrides --trace and\n"
, stdout);
fputs(
" --trace-ascii.\n"
"\n"
" -V, --version\n"
" Displays information about curl and the libcurl version it uses.\n"
-" The first line includes the full version of curl, libcurl and\n"
+" The first line includes the full version of curl, libcurl and\n"
" other 3rd party libraries linked with the executable.\n"
"\n"
-" The second line (starts with \"Protocols:\") shows all protocols\n"
+" The second line (starts with \"Protocols:\") shows all protocols\n"
" that libcurl reports to support.\n"
"\n"
" The third line (starts with \"Features:\") shows specific features\n"
@@ -3994,8 +4062,8 @@ void hugehelp(void)
" Support for the Alt-Svc: header is provided.\n"
"\n"
" AsynchDNS\n"
-" This curl uses asynchronous name resolves. Asynchronous\n"
-" name resolves can be done using either the c-ares or the\n"
+" This curl uses asynchronous name resolves. Asynchronous\n"
+" name resolves can be done using either the c-ares or the\n"
" threaded resolver backends.\n"
"\n"
" brotli Support for automatic brotli compression over HTTP(S).\n"
@@ -4006,8 +4074,8 @@ void hugehelp(void)
" curl was built with support for character set conversions\n"
" (like EBCDIC)\n"
"\n"
-" Debug This curl uses a libcurl built with Debug. This enables\n"
-" more error-tracking and memory debugging etc. For curl-\n"
+" Debug This curl uses a libcurl built with Debug. This enables\n"
+" more error-tracking and memory debugging etc. For curl-\n"
" developers only!\n"
"\n"
" GSS-API\n"
@@ -4031,7 +4099,7 @@ void hugehelp(void)
" This curl supports transfers of large files, files larger\n"
" than 2GB.\n"
"\n"
-" libz Automatic decompression of compressed files over HTTP is\n"
+" libz Automatic decompression of compressed files over HTTP is\n"
, stdout);
fputs(
" supported.\n"
@@ -4045,21 +4113,21 @@ void hugehelp(void)
" NTLM NTLM authentication is supported.\n"
" NTLM NTLM authentication is supported.\n"
"\n"
-" PSL PSL is short for Public Suffix List and means that this\n"
-" curl has been built with knowledge about \"public suf-\n"
+" PSL PSL is short for Public Suffix List and means that this\n"
+" curl has been built with knowledge about \"public suf-\n"
" fixes\".\n"
"\n"
, stdout);
fputs(
" SPNEGO SPNEGO authentication is supported.\n"
"\n"
-" SSL SSL versions of various protocols are supported, such as\n"
+" SSL SSL versions of various protocols are supported, such as\n"
" HTTPS, FTPS, POP3S and so on.\n"
"\n"
" SSPI SSPI is supported.\n"
"\n"
" TLS-SRP\n"
-" SRP (Secure Remote Password) authentication is supported\n"
+" SRP (Secure Remote Password) authentication is supported\n"
" for TLS.\n"
"\n"
" UnixSockets\n"
@@ -4069,42 +4137,42 @@ void hugehelp(void)
, stdout);
fputs(
" Make curl display information on stdout after a completed trans-\n"
-" fer. The format is a string that may contain plain text mixed\n"
-" with any number of variables. The format can be specified as a\n"
-" literal \"string\", or you can have curl read the format from a\n"
-" file with \"@filename\" and to tell curl to read the format from\n"
+" fer. The format is a string that may contain plain text mixed\n"
+" with any number of variables. The format can be specified as a\n"
+" literal \"string\", or you can have curl read the format from a\n"
+" file with \"@filename\" and to tell curl to read the format from\n"
" stdin you write \"@-\".\n"
"\n"
, stdout);
fputs(
-" The variables present in the output format will be substituted\n"
-" by the value or text that curl thinks fit, as described below.\n"
-" All variables are specified as %{variable_name} and to output a\n"
-" normal % you just write them as %%. You can output a newline by\n"
+" The variables present in the output format will be substituted\n"
+" by the value or text that curl thinks fit, as described below.\n"
+" All variables are specified as %{variable_name} and to output a\n"
+" normal % you just write them as %%. You can output a newline by\n"
" using \\n, a carriage return with \\r and a tab space with \\t.\n"
"\n"
-" The output will be written to standard output, but this can be\n"
+" The output will be written to standard output, but this can be\n"
, stdout);
fputs(
" switched to standard error by using %{stderr}.\n"
"\n"
" NOTE: The %-symbol is a special symbol in the win32-environment,\n"
-" where all occurrences of % must be doubled when using this op-\n"
+" where all occurrences of % must be doubled when using this op-\n"
" tion.\n"
"\n"
" The variables available are:\n"
"\n"
-" content_type The Content-Type of the requested document, if\n"
+" content_type The Content-Type of the requested document, if\n"
" there was any.\n"
"\n"
" filename_effective\n"
, stdout);
fputs(
-" The ultimate filename that curl writes out to.\n"
-" This is only meaningful if curl is told to write\n"
-" to a file with the -O, --remote-name or -o,\n"
-" --output option. It's most useful in combination\n"
-" with the -J, --remote-header-name option. (Added\n"
+" The ultimate filename that curl writes out to.\n"
+" This is only meaningful if curl is told to write\n"
+" to a file with the -O, --remote-name or -o,\n"
+" --output option. It's most useful in combination\n"
+" with the -J, --remote-header-name option. (Added\n"
" in 7.26.0)\n"
"\n"
, stdout);
@@ -4113,14 +4181,14 @@ void hugehelp(void)
" to the remote FTP server. (Added in 7.15.4)\n"
"\n"
" http_code The numerical response code that was found in the\n"
-" last retrieved HTTP(S) or FTP(s) transfer. In\n"
-" 7.18.2 the alias response_code was added to show\n"
+" last retrieved HTTP(S) or FTP(s) transfer. In\n"
+" 7.18.2 the alias response_code was added to show\n"
" the same info.\n"
"\n"
, stdout);
fputs(
" http_connect The numerical code that was found in the last re-\n"
-" sponse (from a proxy) to a curl CONNECT request.\n"
+" sponse (from a proxy) to a curl CONNECT request.\n"
" (Added in 7.12.4)\n"
"\n"
" http_version The http version that was effectively used.\n"
@@ -4128,54 +4196,59 @@ void hugehelp(void)
"\n"
" json A JSON object with all available keys.\n"
"\n"
-" local_ip The IP address of the local end of the most re-\n"
+" local_ip The IP address of the local end of the most re-\n"
, stdout);
fputs(
-" cently done connection - can be either IPv4 or\n"
+" cently done connection - can be either IPv4 or\n"
" IPv6 (Added in 7.29.0)\n"
"\n"
-" local_port The local port number of the most recently done\n"
+" local_port The local port number of the most recently done\n"
" connection (Added in 7.29.0)\n"
"\n"
-" method The http method used in the most recent HTTP re-\n"
+" method The http method used in the most recent HTTP re-\n"
" quest (Added in 7.72.0)\n"
"\n"
-" num_connects Number of new connects made in the recent trans-\n"
+" num_connects Number of new connects made in the recent trans-\n"
, stdout);
fputs(
" fer. (Added in 7.12.3)\n"
"\n"
+" num_headers The number of response headers in the most recent\n"
+" request (restarted at each\n"
+" redirect). Note that the status line IS NOT a\n"
+" header. (Added in 7.73.0)\n"
+"\n"
" num_redirects Number of redirects that were followed in the re-\n"
" quest. (Added in 7.12.3)\n"
"\n"
" proxy_ssl_verify_result\n"
+, stdout);
+ fputs(
" The result of the HTTPS proxy's SSL peer certifi-\n"
" cate verification that was requested. 0 means the\n"
" verification was successful. (Added in 7.52.0)\n"
"\n"
+" redirect_url When an HTTP request was made without -L, --loca-\n"
+" tion to follow redirects (or when --max-redir is\n"
+" met), this variable will show the actual URL a\n"
, stdout);
fputs(
-" redirect_url When an HTTP request was made without -L, --loca-\n"
-" tion to follow redirects (or when --max-redir is\n"
-" met), this variable will show the actual URL a\n"
" redirect would have gone to. (Added in 7.18.2)\n"
"\n"
-" remote_ip The remote IP address of the most recently done\n"
+" remote_ip The remote IP address of the most recently done\n"
" connection - can be either IPv4 or IPv6 (Added in\n"
-, stdout);
- fputs(
" 7.29.0)\n"
"\n"
-" remote_port The remote port number of the most recently done\n"
+" remote_port The remote port number of the most recently done\n"
" connection (Added in 7.29.0)\n"
"\n"
" response_code The numerical response code that was found in the\n"
-" last transfer (formerly known as \"http_code\").\n"
-" (Added in 7.18.2)\n"
-"\n"
-" scheme The URL scheme (sometimes called protocol) that\n"
, stdout);
fputs(
+" last transfer (formerly known as \"http_code\").\n"
+" (Added in 7.18.2)\n"
+"\n"
+" scheme The URL scheme (sometimes called protocol) that\n"
" was effectively used (Added in 7.52.0)\n"
"\n"
" size_download The total amount of bytes that were downloaded.\n"
@@ -4183,102 +4256,102 @@ void hugehelp(void)
" size_header The total amount of bytes of the downloaded head-\n"
" ers.\n"
"\n"
-" size_request The total amount of bytes that were sent in the\n"
+, stdout);
+ fputs(
+" size_request The total amount of bytes that were sent in the\n"
" HTTP request.\n"
"\n"
" size_upload The total amount of bytes that were uploaded.\n"
"\n"
-, stdout);
- fputs(
" speed_download The average download speed that curl measured for\n"
" the complete download. Bytes per second.\n"
"\n"
-" speed_upload The average upload speed that curl measured for\n"
+" speed_upload The average upload speed that curl measured for\n"
" the complete upload. Bytes per second.\n"
"\n"
-" ssl_verify_result\n"
-" The result of the SSL peer certificate verifica-\n"
-" tion that was requested. 0 means the verification\n"
, stdout);
fputs(
+" ssl_verify_result\n"
+" The result of the SSL peer certificate verifica-\n"
+" tion that was requested. 0 means the verification\n"
" was successful. (Added in 7.19.0)\n"
"\n"
-" stderr From this point on, the -w, --write-out output\n"
-" will be written to standard error. (Added in\n"
+" stderr From this point on, the -w, --write-out output\n"
+" will be written to standard error. (Added in\n"
" 7.63.0)\n"
"\n"
-" stdout From this point on, the -w, --write-out output\n"
-" will be written to standard output. This is the\n"
-" default, but can be used to switch back after\n"
, stdout);
fputs(
+" stdout From this point on, the -w, --write-out output\n"
+" will be written to standard output. This is the\n"
+" default, but can be used to switch back after\n"
" switching to stderr. (Added in 7.63.0)\n"
"\n"
" time_appconnect\n"
-" The time, in seconds, it took from the start un-\n"
-" til the SSL/SSH/etc connect/handshake to the re-\n"
+" The time, in seconds, it took from the start un-\n"
+" til the SSL/SSH/etc connect/handshake to the re-\n"
+, stdout);
+ fputs(
" mote host was completed. (Added in 7.19.0)\n"
"\n"
-" time_connect The time, in seconds, it took from the start un-\n"
+" time_connect The time, in seconds, it took from the start un-\n"
" til the TCP connect to the remote host (or proxy)\n"
-, stdout);
- fputs(
" was completed.\n"
"\n"
" time_namelookup\n"
-" The time, in seconds, it took from the start un-\n"
+" The time, in seconds, it took from the start un-\n"
" til the name resolving was completed.\n"
"\n"
" time_pretransfer\n"
-" The time, in seconds, it took from the start un-\n"
-" til the file transfer was just about to begin.\n"
-" This includes all pre-transfer commands and nego-\n"
, stdout);
fputs(
+" The time, in seconds, it took from the start un-\n"
+" til the file transfer was just about to begin.\n"
+" This includes all pre-transfer commands and nego-\n"
" tiations that are specific to the particular pro-\n"
" tocol(s) involved.\n"
"\n"
" time_redirect The time, in seconds, it took for all redirection\n"
-" steps including name lookup, connect, pretransfer\n"
-" and transfer before the final transaction was\n"
-" started. time_redirect shows the complete execu-\n"
, stdout);
fputs(
-" tion time for multiple redirections. (Added in\n"
+" steps including name lookup, connect, pretransfer\n"
+" and transfer before the final transaction was\n"
+" started. time_redirect shows the complete execu-\n"
+" tion time for multiple redirections. (Added in\n"
" 7.12.3)\n"
"\n"
" time_starttransfer\n"
-" The time, in seconds, it took from the start un-\n"
-" til the first byte was just about to be trans-\n"
-" ferred. This includes time_pretransfer and also\n"
-" the time the server needed to calculate the re-\n"
+" The time, in seconds, it took from the start un-\n"
, stdout);
fputs(
+" til the first byte was just about to be trans-\n"
+" ferred. This includes time_pretransfer and also\n"
+" the time the server needed to calculate the re-\n"
" sult.\n"
"\n"
-" time_total The total time, in seconds, that the full opera-\n"
+" time_total The total time, in seconds, that the full opera-\n"
" tion lasted.\n"
"\n"
" url_effective The URL that was fetched last. This is most mean-\n"
-" ingful if you've told curl to follow location:\n"
+, stdout);
+ fputs(
+" ingful if you've told curl to follow location:\n"
" headers.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
"\n"
" --xattr\n"
+" When saving output to a file, this option tells curl to store\n"
+" certain file metadata in extended file attributes. Currently,\n"
+" the URL is stored in the xdg.origin.url attribute and, for HTTP,\n"
, stdout);
fputs(
-" When saving output to a file, this option tells curl to store\n"
-" certain file metadata in extended file attributes. Currently,\n"
-" the URL is stored in the xdg.origin.url attribute and, for HTTP,\n"
-" the content type is stored in the mime_type attribute. If the\n"
-" file system does not support extended attributes, a warning is\n"
+" the content type is stored in the mime_type attribute. If the\n"
+" file system does not support extended attributes, a warning is\n"
" issued.\n"
"\n"
"FILES\n"
" ~/.curlrc\n"
-, stdout);
- fputs(
" Default config file, see -K, --config for details.\n"
"\n"
"ENVIRONMENT\n"
@@ -4286,84 +4359,90 @@ void hugehelp(void)
" The lower case version has precedence. http_proxy is an exception as it\n"
" is only available in lower case.\n"
"\n"
-" Using an environment variable to set the proxy has the same effect as\n"
+, stdout);
+ fputs(
+" Using an environment variable to set the proxy has the same effect as\n"
" using the -x, --proxy option.\n"
"\n"
" http_proxy [protocol://]<host>[:port]\n"
" Sets the proxy server to use for HTTP.\n"
-, stdout);
- fputs(
" HTTPS_PROXY [protocol://]<host>[:port]\n"
" Sets the proxy server to use for HTTPS.\n"
"\n"
" [url-protocol]_PROXY [protocol://]<host>[:port]\n"
-" Sets the proxy server to use for [url-protocol], where the pro-\n"
-" tocol is a protocol that curl supports and as specified in a\n"
+" Sets the proxy server to use for [url-protocol], where the pro-\n"
+, stdout);
+ fputs(
+" tocol is a protocol that curl supports and as specified in a\n"
" URL. FTP, FTPS, POP3, IMAP, SMTP, LDAP etc.\n"
"\n"
" ALL_PROXY [protocol://]<host>[:port]\n"
-" Sets the proxy server to use if no protocol-specific proxy is\n"
-, stdout);
- fputs(
+" Sets the proxy server to use if no protocol-specific proxy is\n"
" set.\n"
"\n"
" NO_PROXY <comma-separated list of hosts/domains>\n"
-" list of host names that shouldn't go through any proxy. If set\n"
+" list of host names that shouldn't go through any proxy. If set\n"
" to an asterisk '*' only, it matches all hosts. Each name in this\n"
+, stdout);
+ fputs(
" list is matched as either a domain name which contains the host-\n"
" name, or the hostname itself.\n"
"\n"
-" This environment variable disables use of the proxy even when\n"
+" This environment variable disables use of the proxy even when\n"
+" specified with the -x, --proxy option. That is NO_PROXY=di-\n"
+" rect.example.com curl -x http://proxy.example.com http://di-\n"
+" rect.example.com accesses the target URL directly, and\n"
, stdout);
fputs(
-" specified with the -x, --proxy option. That is NO_PROXY=di-\n"
-" rect.example.com curl -x http://proxy.example.com http://di-\n"
-" rect.example.com accesses the target URL directly, and\n"
-" NO_PROXY=direct.example.com curl -x http://proxy.example.com\n"
+" NO_PROXY=direct.example.com curl -x http://proxy.example.com\n"
" http://somewhere.example.com accesses the target URL through the\n"
" proxy.\n"
"\n"
-" The list of host names can also be include numerical IP ad-\n"
+" The list of host names can also be include numerical IP ad-\n"
+" dresses, and IPv6 versions should then be given without enclos-\n"
+" ing brackets.\n"
+"\n"
+" IPv6 numerical addresses are compared as strings, so they will\n"
, stdout);
fputs(
-" dresses, and IPv6 versions should then be given without enclos-\n"
-" ing brackets.\n"
+" only match if the representations are the same: \"::1\" is the\n"
+" same as \"::0:1\" but they don't match.\n"
"\n"
" CURL_SSL_BACKEND <TLS backend>\n"
-" If curl was built with support for \"MultiSSL\", meaning that it\n"
-" has built-in support for more than one TLS backend, this envi-\n"
-" ronment variable can be set to the case insensitive name of the\n"
-" particular backend to use when curl is invokved. Setting a name\n"
+" If curl was built with support for \"MultiSSL\", meaning that it\n"
+" has built-in support for more than one TLS backend, this envi-\n"
+" ronment variable can be set to the case insensitive name of the\n"
+" particular backend to use when curl is invoked. Setting a name\n"
, stdout);
fputs(
-" that isn't a built-in alternative, will make curl stay with the\n"
+" that isn't a built-in alternative, will make curl stay with the\n"
" default.\n"
"\n"
" QLOGDIR <directory name>\n"
-" If curl was built with HTTP/3 support, setting this environment\n"
-" variable to a local directory will make curl produce qlogs in\n"
-" that directory, using file names named after the destination\n"
-" connection id (in hex). Do note that these files can become\n"
+" If curl was built with HTTP/3 support, setting this environment\n"
+" variable to a local directory will make curl produce qlogs in\n"
+" that directory, using file names named after the destination\n"
+" connection id (in hex). Do note that these files can become\n"
, stdout);
fputs(
" rather large. Works with both QUIC backends.\n"
"\n"
" SSLKEYLOGFILE <file name>\n"
-" If you set this environment variable to a file name, curl will\n"
+" If you set this environment variable to a file name, curl will\n"
" store TLS secrets from its connections in that file when invoked\n"
" to enable you to analyze the TLS traffic in real time using net-\n"
" work analyzing tools such as Wireshark. This works with the fol-\n"
-" lowing TLS backends: OpenSSL, libressl, BoringSSL, GnuTLS, NSS\n"
+" lowing TLS backends: OpenSSL, libressl, BoringSSL, GnuTLS, NSS\n"
, stdout);
fputs(
" and wolfSSL.\n"
"\n"
"PROXY PROTOCOL PREFIXES\n"
-" Since curl version 7.21.7, the proxy string may be specified with a\n"
+" Since curl version 7.21.7, the proxy string may be specified with a\n"
" protocol:// prefix to specify alternative proxy protocols.\n"
"\n"
-" If no protocol is specified in the proxy string or if the string\n"
-" doesn't match a supported one, the proxy will be treated as an HTTP\n"
+" If no protocol is specified in the proxy string or if the string\n"
+" doesn't match a supported one, the proxy will be treated as an HTTP\n"
" proxy.\n"
"\n"
" The supported proxy protocol prefixes are as follows:\n"
@@ -4371,7 +4450,7 @@ void hugehelp(void)
" http://\n"
, stdout);
fputs(
-" Makes it use it as an HTTP proxy. The default if no scheme pre-\n"
+" Makes it use it as an HTTP proxy. The default if no scheme pre-\n"
" fix is used.\n"
"\n"
" https://\n"
@@ -4392,7 +4471,7 @@ void hugehelp(void)
"EXIT CODES\n"
, stdout);
fputs(
-" There are a bunch of different error codes and their corresponding er-\n"
+" There are a bunch of different error codes and their corresponding er-\n"
" ror messages that may appear during bad conditions. At the time of this\n"
" writing, the exit codes are:\n"
"\n"
@@ -4403,14 +4482,14 @@ void hugehelp(void)
"\n"
" 3 URL malformed. The syntax was not correct.\n"
"\n"
-" 4 A feature or option that was needed to perform the desired re-\n"
+" 4 A feature or option that was needed to perform the desired re-\n"
, stdout);
fputs(
-" quest was not enabled or was explicitly disabled at build-time.\n"
+" quest was not enabled or was explicitly disabled at build-time.\n"
" To make curl able to do this, you probably need another build of\n"
" libcurl!\n"
"\n"
-" 5 Couldn't resolve proxy. The given proxy host could not be re-\n"
+" 5 Couldn't resolve proxy. The given proxy host could not be re-\n"
" solved.\n"
"\n"
" 6 Couldn't resolve host. The given remote host was not resolved.\n"
@@ -4421,59 +4500,59 @@ void hugehelp(void)
"\n"
, stdout);
fputs(
-" 9 FTP access denied. The server denied login or denied access to\n"
-" the particular resource or directory you wanted to reach. Most\n"
-" often you tried to change to a directory that doesn't exist on\n"
+" 9 FTP access denied. The server denied login or denied access to\n"
+" the particular resource or directory you wanted to reach. Most\n"
+" often you tried to change to a directory that doesn't exist on\n"
" the server.\n"
"\n"
-" 10 FTP accept failed. While waiting for the server to connect back\n"
-" when an active FTP session is used, an error code was sent over\n"
+" 10 FTP accept failed. While waiting for the server to connect back\n"
+" when an active FTP session is used, an error code was sent over\n"
" the control connection or similar.\n"
"\n"
, stdout);
fputs(
-" 11 FTP weird PASS reply. Curl couldn't parse the reply sent to the\n"
+" 11 FTP weird PASS reply. Curl couldn't parse the reply sent to the\n"
" PASS request.\n"
"\n"
-" 12 During an active FTP session while waiting for the server to\n"
+" 12 During an active FTP session while waiting for the server to\n"
" connect back to curl, the timeout expired.\n"
"\n"
-" 13 FTP weird PASV reply, Curl couldn't parse the reply sent to the\n"
+" 13 FTP weird PASV reply, Curl couldn't parse the reply sent to the\n"
" PASV request.\n"
"\n"
-" 14 FTP weird 227 format. Curl couldn't parse the 227-line the\n"
+" 14 FTP weird 227 format. Curl couldn't parse the 227-line the\n"
" server sent.\n"
"\n"
, stdout);
fputs(
-" 15 FTP can't get host. Couldn't resolve the host IP we got in the\n"
+" 15 FTP can't get host. Couldn't resolve the host IP we got in the\n"
" 227-line.\n"
"\n"
" 16 HTTP/2 error. A problem was detected in the HTTP2 framing layer.\n"
" This is somewhat generic and can be one out of several problems,\n"
" see the error message for details.\n"
"\n"
-" 17 FTP couldn't set binary. Couldn't change transfer method to bi-\n"
+" 17 FTP couldn't set binary. Couldn't change transfer method to bi-\n"
" nary.\n"
"\n"
" 18 Partial file. Only a part of the file was transferred.\n"
"\n"
, stdout);
fputs(
-" 19 FTP couldn't download/access the given file, the RETR (or simi-\n"
+" 19 FTP couldn't download/access the given file, the RETR (or simi-\n"
" lar) command failed.\n"
"\n"
" 21 FTP quote error. A quote command returned error from the server.\n"
-" 22 HTTP page not retrieved. The requested url was not found or re-\n"
-" turned another error with the HTTP error code being 400 or\n"
+" 22 HTTP page not retrieved. The requested url was not found or re-\n"
+" turned another error with the HTTP error code being 400 or\n"
" above. This return code only appears if -f, --fail is used.\n"
"\n"
, stdout);
fputs(
-" 23 Write error. Curl couldn't write data to a local filesystem or\n"
+" 23 Write error. Curl couldn't write data to a local filesystem or\n"
" similar.\n"
"\n"
-" 25 FTP couldn't STOR file. The server denied the STOR operation,\n"
+" 25 FTP couldn't STOR file. The server denied the STOR operation,\n"
" used for FTP uploading.\n"
"\n"
" 26 Read error. Various reading problems.\n"
@@ -4485,11 +4564,11 @@ void hugehelp(void)
"\n"
, stdout);
fputs(
-" 30 FTP PORT failed. The PORT command failed. Not all FTP servers\n"
-" support the PORT command, try doing a transfer using PASV in-\n"
+" 30 FTP PORT failed. The PORT command failed. Not all FTP servers\n"
+" support the PORT command, try doing a transfer using PASV in-\n"
" stead!\n"
"\n"
-" 31 FTP couldn't use REST. The REST command failed. This command is\n"
+" 31 FTP couldn't use REST. The REST command failed. This command is\n"
" used for resumed FTP transfers.\n"
"\n"
" 33 HTTP range error. The range \"command\" didn't work.\n"
@@ -4500,7 +4579,7 @@ void hugehelp(void)
fputs(
" 35 SSL connect error. The SSL handshaking failed.\n"
"\n"
-" 36 Bad download resume. Couldn't continue an earlier aborted down-\n"
+" 36 Bad download resume. Couldn't continue an earlier aborted down-\n"
" load.\n"
"\n"
" 37 FILE couldn't read file. Failed to open the file. Permissions?\n"
@@ -4518,14 +4597,14 @@ void hugehelp(void)
"\n"
" 43 Internal error. A function was called with a bad parameter.\n"
"\n"
-" 45 Interface error. A specified outgoing interface could not be\n"
+" 45 Interface error. A specified outgoing interface could not be\n"
" used.\n"
"\n"
" 47 Too many redirects. When following redirects, curl hit the maxi-\n"
" mum amount.\n"
"\n"
-" 48 Unknown option specified to libcurl. This indicates that you\n"
-" passed a weird option to curl that was passed on to libcurl and\n"
+" 48 Unknown option specified to libcurl. This indicates that you\n"
+" passed a weird option to curl that was passed on to libcurl and\n"
, stdout);
fputs(
" rejected. Read up in the manual!\n"
@@ -4534,7 +4613,7 @@ void hugehelp(void)
"\n"
" 51 The peer's SSL certificate or SSH MD5 fingerprint was not OK.\n"
"\n"
-" 52 The server didn't reply anything, which here is considered an\n"
+" 52 The server didn't reply anything, which here is considered an\n"
" error.\n"
"\n"
" 53 SSL crypto engine not found.\n"
@@ -4551,7 +4630,7 @@ void hugehelp(void)
"\n"
" 59 Couldn't use specified SSL cipher.\n"
"\n"
-" 60 Peer certificate cannot be authenticated with known CA certifi-\n"
+" 60 Peer certificate cannot be authenticated with known CA certifi-\n"
" cates.\n"
"\n"
" 61 Unrecognized transfer encoding.\n"
@@ -4568,7 +4647,7 @@ void hugehelp(void)
"\n"
, stdout);
fputs(
-" 67 The user name, password, or similar was not accepted and curl\n"
+" 67 The user name, password, or similar was not accepted and curl\n"
" failed to log in.\n"
"\n"
" 68 File not found on TFTP server.\n"
@@ -4599,7 +4678,7 @@ void hugehelp(void)
"\n"
" 80 Failed to shut down the SSL connection.\n"
"\n"
-" 82 Could not load CRL file, missing or wrong format (added in\n"
+" 82 Could not load CRL file, missing or wrong format (added in\n"
" 7.19.0).\n"
"\n"
" 83 Issuer check failed (added in 7.19.0).\n"
@@ -4630,11 +4709,11 @@ void hugehelp(void)
"\n"
" 94 An authentication function returned an error.\n"
"\n"
-" 95 A problem was detected in the HTTP/3 layer. This is somewhat\n"
-" generic and can be one out of several problems, see the error\n"
+" 95 A problem was detected in the HTTP/3 layer. This is somewhat\n"
+" generic and can be one out of several problems, see the error\n"
" message for details.\n"
"\n"
-" 96 QUIC connection error. This error may be caused by an SSL li-\n"
+" 96 QUIC connection error. This error may be caused by an SSL li-\n"
" brary error. QUIC is the protocol used for HTTP/3 transfers.\n"
"\n"
, stdout);
@@ -4643,7 +4722,7 @@ void hugehelp(void)
" ing ones are meant to never change.\n"
"\n"
"AUTHORS / CONTRIBUTORS\n"
-" Daniel Stenberg is the main author, but the whole list of contributors\n"
+" Daniel Stenberg is the main author, but the whole list of contributors\n"
" is found in the separate THANKS file.\n"
"\n"
"WWW\n"
@@ -4669,4220 +4748,4285 @@ void hugehelp(void) {}
#include "memdebug.h" /* keep this as LAST include */
static const unsigned char hugehelpgz[] = {
/* This mumbo-jumbo is the huge help text compressed with gzip.
- Thanks to this operation, the size of this data shrank from 179797
- to 50520 bytes. You can disable the use of compressed help
+ Thanks to this operation, the size of this data shrank from 182728
+ to 51301 bytes. You can disable the use of compressed help
texts by NOT passing -c to the mkhelp.pl tool. */
0x1f, 0x8b, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0xed, 0xbd,
- 0x7b, 0x7b, 0xdb, 0x46, 0x96, 0x26, 0xfe, 0x7f, 0x3e, 0x05, 0x9a, 0xfd,
- 0xf4, 0x4a, 0x9a, 0x26, 0x29, 0x4b, 0xf2, 0x25, 0x56, 0x3b, 0x99, 0x38,
- 0xb2, 0x9c, 0x68, 0x22, 0x5b, 0x1a, 0x53, 0x4e, 0xd2, 0xdb, 0xc9, 0xe3,
- 0x07, 0x24, 0x41, 0x09, 0x6d, 0x92, 0x60, 0x03, 0xa0, 0x2e, 0x3d, 0xd3,
- 0xfb, 0xd9, 0x7f, 0xf5, 0x9e, 0x4b, 0x55, 0x01, 0x55, 0xa0, 0x94, 0x4c,
- 0xdc, 0x3b, 0xbb, 0xfb, 0xeb, 0xd9, 0x75, 0x6c, 0x09, 0x28, 0x54, 0x9d,
- 0x3a, 0x75, 0xea, 0x5c, 0xdf, 0x93, 0x24, 0xf7, 0xfd, 0xef, 0x03, 0xfd,
- 0xff, 0x0f, 0xe6, 0x7f, 0xe6, 0xbf, 0x9f, 0x25, 0xc9, 0x79, 0x59, 0xfc,
- 0x35, 0x9b, 0xd4, 0xf1, 0x67, 0x3f, 0x7c, 0xf8, 0xcf, 0x84, 0xff, 0xcf,
- 0xbc, 0xf3, 0x93, 0xf9, 0xef, 0x67, 0x1b, 0xc7, 0xde, 0x4d, 0xdc, 0x0b,
- 0xff, 0xf9, 0x61, 0x27, 0xb9, 0xef, 0x85, 0xff, 0x4c, 0xb6, 0xe9, 0x85,
- 0x0f, 0xf2, 0x85, 0x17, 0xf8, 0xfb, 0x87, 0x0f, 0x9b, 0x3f, 0xf2, 0x13,
- 0x66, 0x85, 0x3f, 0x76, 0xf1, 0xde, 0x4f, 0x1f, 0xf0, 0x57, 0xf3, 0x93,
- 0xcf, 0x3e, 0x7b, 0xfb, 0xf2, 0xcd, 0xb1, 0xbe, 0x3a, 0x59, 0x97, 0xf3,
- 0x64, 0x90, 0xd4, 0x65, 0xba, 0xac, 0x66, 0x59, 0x99, 0xa4, 0xc9, 0xfb,
- 0x77, 0xa7, 0x9f, 0x7d, 0x36, 0xfa, 0xf3, 0xdb, 0xb3, 0xf3, 0xd1, 0xc9,
- 0xa8, 0xf1, 0xd8, 0x5f, 0x8a, 0x55, 0x9d, 0x17, 0xcb, 0xca, 0x4c, 0xdf,
- 0x3c, 0x54, 0xfd, 0xfc, 0xd9, 0x67, 0xaf, 0x8e, 0x47, 0x47, 0xef, 0x4e,
- 0xce, 0x2f, 0x4e, 0xce, 0xde, 0x36, 0x9e, 0x4c, 0xf2, 0x2a, 0x31, 0x43,
- 0xd5, 0x45, 0x31, 0x37, 0x7f, 0xb8, 0xd1, 0xa7, 0x69, 0x9d, 0x26, 0xb3,
- 0xb2, 0x58, 0x24, 0x45, 0x89, 0x5f, 0xa4, 0x49, 0x95, 0x95, 0xd7, 0x59,
- 0xd9, 0x4f, 0xd6, 0x55, 0xbe, 0xbc, 0x4c, 0x8a, 0x65, 0x96, 0x14, 0xb3,
- 0xa4, 0xbe, 0xca, 0x74, 0xb8, 0x6a, 0xbd, 0x5a, 0x15, 0x65, 0x9d, 0x4d,
- 0x93, 0x55, 0x59, 0xd4, 0xc5, 0xa4, 0x98, 0x57, 0xc9, 0xf6, 0xab, 0x93,
- 0xa3, 0x8b, 0x7e, 0xf2, 0xfa, 0xe4, 0xf4, 0xd8, 0xfc, 0x79, 0x71, 0x4e,
- 0x7f, 0x8c, 0xfa, 0xc9, 0x37, 0x67, 0xe7, 0xdf, 0x1e, 0xbf, 0xeb, 0x27,
- 0xdf, 0x5e, 0xe0, 0x67, 0xf8, 0xd3, 0xfc, 0x30, 0x39, 0x79, 0xf3, 0xf2,
- 0xbc, 0xaf, 0xc3, 0xe1, 0x1f, 0xf8, 0xe1, 0xe9, 0x2b, 0xf3, 0x43, 0xfe,
- 0x0f, 0xfe, 0xf9, 0xe6, 0xdf, 0x2f, 0xcc, 0x80, 0xe7, 0x67, 0xe7, 0x07,
- 0xfc, 0xa7, 0xf9, 0xd9, 0xbb, 0x8b, 0x37, 0xe7, 0xfc, 0x27, 0xfd, 0x63,
- 0x64, 0xfe, 0x31, 0x3a, 0xc2, 0x1f, 0xf8, 0xa0, 0x0e, 0x37, 0x7a, 0xf3,
- 0x75, 0x1f, 0x7f, 0x8c, 0xf0, 0x27, 0x3e, 0x8a, 0x3f, 0xcd, 0x3f, 0x2e,
- 0x8e, 0x4f, 0xdf, 0x1e, 0x5f, 0x24, 0xe9, 0x72, 0x9a, 0x5c, 0x98, 0xe7,
- 0x77, 0x86, 0xc9, 0xc5, 0x55, 0x96, 0x4c, 0x8a, 0xc5, 0x02, 0x3f, 0x22,
- 0xea, 0x4c, 0xb3, 0x2a, 0xbf, 0x5c, 0x9a, 0x75, 0x19, 0x3a, 0xe8, 0x70,
- 0x37, 0x45, 0xf9, 0x31, 0xb9, 0xc9, 0xeb, 0xab, 0x62, 0x5d, 0x1b, 0x8a,
- 0x18, 0x82, 0xe5, 0xcb, 0x3a, 0x2b, 0xd3, 0x09, 0xc8, 0x3e, 0xfc, 0xac,
- 0x41, 0xe2, 0x62, 0x66, 0x08, 0x5a, 0x19, 0x0a, 0x8e, 0xd7, 0xd5, 0xbc,
- 0x48, 0xa7, 0xa0, 0x9b, 0x79, 0x65, 0xb6, 0x36, 0x14, 0x2f, 0xf3, 0xc9,
- 0xc7, 0x2a, 0x99, 0xe7, 0x1f, 0x33, 0x50, 0xed, 0xf6, 0x4e, 0xa9, 0xd8,
- 0xe7, 0x41, 0xd3, 0xb5, 0x21, 0xf0, 0x72, 0xa0, 0xc3, 0xd5, 0xf9, 0x24,
- 0xc5, 0x07, 0x88, 0x8c, 0xc9, 0x7a, 0x85, 0xd1, 0x98, 0x7c, 0xc9, 0xaa,
- 0xa8, 0xcc, 0x4b, 0xa3, 0xd1, 0xa9, 0x99, 0xfb, 0x72, 0x99, 0xd1, 0x3c,
- 0xaa, 0xbe, 0xf9, 0x47, 0xf1, 0x31, 0xcf, 0xcc, 0x5f, 0x66, 0xf9, 0x3c,
- 0x4b, 0x78, 0x7b, 0xed, 0x70, 0xd8, 0xe7, 0xa4, 0xcc, 0xaa, 0xf5, 0x22,
- 0x03, 0x65, 0xb3, 0x3a, 0x9d, 0xe7, 0xcb, 0x8f, 0xe6, 0xaf, 0x58, 0xfa,
- 0xa2, 0x28, 0xb3, 0x61, 0xf2, 0xb2, 0x4a, 0xee, 0x8a, 0xb5, 0x59, 0xe9,
- 0x7c, 0x6e, 0x18, 0x20, 0x4b, 0xc6, 0xd9, 0xbc, 0xb8, 0xe9, 0x63, 0xdb,
- 0x93, 0xe5, 0x7a, 0x31, 0x36, 0x03, 0x14, 0x33, 0x37, 0x5c, 0x5a, 0xaf,
- 0xcd, 0x70, 0xfc, 0xf4, 0x22, 0x35, 0x6b, 0x32, 0xef, 0x96, 0xc9, 0x55,
- 0x66, 0xd6, 0x5c, 0xad, 0xf2, 0xe5, 0xef, 0x9a, 0x74, 0x31, 0xb4, 0x5d,
- 0x15, 0x37, 0x59, 0x69, 0x28, 0x3b, 0xbe, 0x4b, 0x0c, 0x11, 0xc6, 0xcc,
- 0x91, 0x33, 0xc3, 0x71, 0x49, 0x6a, 0x86, 0xb0, 0xdc, 0x38, 0x28, 0xb3,
- 0x79, 0x0a, 0xce, 0xb2, 0xdf, 0x18, 0x9a, 0x1d, 0xcd, 0x2c, 0xeb, 0xc9,
- 0xab, 0xdb, 0x07, 0x3b, 0xf4, 0xf2, 0xd4, 0xac, 0x24, 0x9f, 0x57, 0x66,
- 0x1b, 0x70, 0x42, 0xe4, 0x19, 0x6c, 0x2b, 0x0e, 0x83, 0x61, 0xd4, 0xbb,
- 0x65, 0x9d, 0xde, 0xd2, 0xe7, 0x85, 0x51, 0x07, 0xd3, 0x6c, 0x95, 0x2d,
- 0xa7, 0xd9, 0xb2, 0x1e, 0x26, 0x7f, 0x2e, 0xd6, 0x5b, 0xe6, 0xdb, 0xb3,
- 0xdc, 0xd0, 0x20, 0x95, 0xa1, 0xcc, 0x97, 0x0d, 0x13, 0x4c, 0xca, 0x7c,
- 0xe5, 0x6d, 0x45, 0xb1, 0x34, 0x7b, 0x9e, 0xbc, 0x7b, 0x7d, 0x94, 0x1c,
- 0x3c, 0xff, 0xfc, 0xa9, 0xdb, 0x73, 0x33, 0x40, 0x32, 0x49, 0x97, 0x66,
- 0xc5, 0xd9, 0x24, 0x9f, 0xdd, 0x25, 0x8b, 0xf5, 0xbc, 0xce, 0x57, 0x86,
- 0xfa, 0x38, 0x89, 0x38, 0x4d, 0xab, 0xb4, 0xac, 0x2b, 0x30, 0x01, 0xfd,
- 0x80, 0xd6, 0x7e, 0x53, 0xe6, 0x35, 0x4e, 0x15, 0xfd, 0xce, 0xcc, 0x30,
- 0xab, 0x2b, 0xcb, 0x69, 0x86, 0xc9, 0xcc, 0x77, 0xc6, 0x86, 0xb7, 0x0c,
- 0x69, 0xb1, 0x33, 0x7f, 0x5b, 0x17, 0xf4, 0x30, 0x36, 0x01, 0x0b, 0x4a,
- 0x2b, 0x33, 0x91, 0xc3, 0xcf, 0x9c, 0x88, 0xe9, 0x5d, 0xd5, 0xf5, 0xea,
- 0x70, 0x77, 0xb7, 0xca, 0xeb, 0x6c, 0xf8, 0x1f, 0xe6, 0xa4, 0xf6, 0xeb,
- 0x9b, 0xa2, 0x5f, 0x5f, 0x95, 0x59, 0xf6, 0x8f, 0xa1, 0x61, 0xed, 0x9e,
- 0x7d, 0xd6, 0xcc, 0xe6, 0x4e, 0xa6, 0x7b, 0x99, 0xd5, 0xe6, 0xbb, 0x7f,
- 0x5b, 0x67, 0x4b, 0x7c, 0xc7, 0xcc, 0x2e, 0x9d, 0xaf, 0xae, 0x52, 0xb3,
- 0xc9, 0x99, 0xe1, 0x51, 0x1c, 0x7e, 0xc3, 0x46, 0x98, 0x2b, 0x1f, 0xff,
- 0xbf, 0xfc, 0x1c, 0xf9, 0xec, 0x8c, 0xbe, 0x6a, 0xfe, 0x1c, 0x66, 0xb7,
- 0xe9, 0xc2, 0x2c, 0x19, 0x1f, 0xdb, 0x05, 0xe7, 0xfd, 0x65, 0x6f, 0xb0,
- 0xf7, 0xe8, 0xd1, 0xcf, 0xc3, 0xfa, 0xb6, 0xee, 0x3d, 0xf0, 0x8d, 0x47,
- 0x8f, 0xbc, 0x77, 0xf0, 0xf0, 0x36, 0x28, 0x91, 0xcc, 0x0d, 0x33, 0x61,
- 0x02, 0x7f, 0xcf, 0xca, 0xa2, 0xda, 0x79, 0xe0, 0x58, 0xe9, 0xe0, 0xef,
- 0xad, 0x6f, 0xbf, 0xcd, 0x2a, 0xe2, 0x27, 0xb7, 0xe2, 0x24, 0x2d, 0x0d,
- 0x4f, 0x17, 0xb5, 0x93, 0x63, 0x7d, 0x73, 0x60, 0x6b, 0x4b, 0x1f, 0x73,
- 0x1e, 0xcd, 0xd3, 0x46, 0x02, 0xa6, 0x73, 0x08, 0xbf, 0x2a, 0x59, 0x66,
- 0xb7, 0xb5, 0xe5, 0x86, 0x22, 0xc9, 0xd2, 0xc9, 0x55, 0x52, 0x98, 0x3d,
- 0x29, 0x63, 0x5b, 0xe1, 0x4f, 0x29, 0x2d, 0x27, 0x57, 0xf9, 0xb5, 0xa1,
- 0xc9, 0xf3, 0xe7, 0x4f, 0x07, 0xe6, 0x8f, 0xe7, 0x3f, 0xef, 0x5e, 0x17,
- 0x73, 0x43, 0xa2, 0xc7, 0x3f, 0xef, 0x62, 0xff, 0xff, 0x23, 0xed, 0x8f,
- 0xfb, 0x93, 0x7f, 0x0c, 0xaf, 0xea, 0xc5, 0xbc, 0xd7, 0xc9, 0x56, 0xe9,
- 0xd2, 0xfc, 0xff, 0x45, 0xb1, 0x5e, 0xd6, 0x96, 0x95, 0x0c, 0x47, 0xd6,
- 0x9e, 0xf0, 0x32, 0x87, 0xd9, 0x9c, 0x60, 0x30, 0x3e, 0x38, 0x0c, 0x67,
- 0xd2, 0x1c, 0x5f, 0x77, 0x58, 0xeb, 0xc9, 0x15, 0x28, 0x60, 0x78, 0x2b,
- 0x15, 0x32, 0xd4, 0x79, 0x8a, 0x73, 0x6b, 0xc4, 0x07, 0xc4, 0x19, 0x8d,
- 0xc5, 0x5f, 0xcb, 0xcd, 0x83, 0x45, 0x39, 0xcd, 0xca, 0x61, 0x7b, 0x1a,
- 0xf6, 0x40, 0x7b, 0xdf, 0x4c, 0xf4, 0xf2, 0xc1, 0x0f, 0x68, 0x62, 0x8b,
- 0xfc, 0xd6, 0x8c, 0x80, 0x7f, 0xe2, 0x6b, 0x66, 0xe2, 0x3c, 0x5a, 0x82,
- 0x19, 0xd3, 0x67, 0xf4, 0x7d, 0x77, 0xa0, 0xcd, 0xd4, 0x1b, 0x4b, 0xa7,
- 0x8f, 0xba, 0xc5, 0x27, 0x66, 0xfb, 0x56, 0xe6, 0xad, 0x35, 0xa4, 0x2e,
- 0x1d, 0x7a, 0x0c, 0x63, 0xc4, 0xc5, 0xa5, 0xd9, 0x19, 0xb3, 0x1b, 0xe0,
- 0x66, 0x6c, 0xd6, 0x5d, 0xf2, 0xd6, 0x30, 0x0d, 0x8b, 0x2a, 0x8f, 0xe9,
- 0xe7, 0x59, 0x5d, 0xdf, 0xbf, 0x51, 0x8e, 0x73, 0x0f, 0xf7, 0x22, 0xcc,
- 0xdb, 0xf5, 0x86, 0xe1, 0xb6, 0xc3, 0xfd, 0xd6, 0xe3, 0x3f, 0x18, 0x31,
- 0xee, 0x8e, 0x8e, 0x99, 0xc1, 0x7f, 0xfc, 0xc3, 0xe3, 0xbd, 0x1b, 0xfc,
- 0x36, 0x5f, 0x5e, 0x17, 0x1f, 0x0d, 0x99, 0xe8, 0xd2, 0x4d, 0x9b, 0x14,
- 0x85, 0xa4, 0x5a, 0xac, 0x6a, 0x7b, 0x9b, 0x81, 0x29, 0xcd, 0x8f, 0xc6,
- 0xe9, 0x78, 0x7e, 0x97, 0x5c, 0xa5, 0xd7, 0x19, 0xd6, 0xbc, 0x32, 0xdc,
- 0x0a, 0x2a, 0x98, 0x8b, 0x65, 0x4e, 0x82, 0x41, 0x44, 0xc7, 0xb4, 0x58,
- 0x8f, 0x8d, 0xf8, 0x81, 0xd8, 0x60, 0xe2, 0xa4, 0xd7, 0x45, 0x3e, 0x6d,
- 0x5c, 0xdd, 0x57, 0x19, 0x44, 0x1e, 0x3e, 0x4c, 0xd7, 0x98, 0x11, 0xb9,
- 0x98, 0x29, 0x1d, 0xb8, 0xbc, 0xc6, 0x95, 0x68, 0x84, 0x65, 0x3a, 0xaf,
- 0x8a, 0x24, 0xb9, 0x2c, 0x70, 0x56, 0x48, 0x44, 0x13, 0xb3, 0x9b, 0x8d,
- 0xb9, 0x4a, 0x71, 0xef, 0x99, 0x2b, 0xce, 0x9e, 0x86, 0x32, 0x23, 0x69,
- 0x4d, 0xbb, 0x95, 0xce, 0xfb, 0x7c, 0xbf, 0xe1, 0x1d, 0xa1, 0x55, 0xb2,
- 0xf5, 0x3f, 0xb6, 0xfa, 0xc9, 0xd6, 0xbf, 0x6e, 0x11, 0x4f, 0x6c, 0xfd,
- 0xcb, 0x96, 0xdb, 0x6b, 0xa3, 0xbb, 0x5d, 0xe7, 0xd3, 0x8c, 0xd9, 0xe2,
- 0xe4, 0xfc, 0xfa, 0x69, 0xf2, 0x77, 0xa8, 0x1a, 0x46, 0x1a, 0x67, 0xb7,
- 0xca, 0x94, 0xba, 0x36, 0xf3, 0x76, 0x62, 0xc4, 0x72, 0xba, 0x82, 0xce,
- 0x91, 0x95, 0x13, 0xc3, 0xc1, 0xe9, 0xa5, 0xe1, 0x59, 0x73, 0x5b, 0xeb,
- 0x70, 0x18, 0x1f, 0xaf, 0xf0, 0xb2, 0x8c, 0x08, 0x4d, 0x96, 0xe9, 0xc2,
- 0x9c, 0x8a, 0x53, 0xcc, 0x28, 0x5f, 0x46, 0xb6, 0xf3, 0x2f, 0xb3, 0xec,
- 0xf3, 0x47, 0x87, 0x87, 0x07, 0x7f, 0xd8, 0x7f, 0x92, 0xd5, 0x57, 0x8f,
- 0x7e, 0xde, 0x75, 0x9b, 0x78, 0x32, 0x23, 0xc2, 0x2b, 0x13, 0xea, 0x34,
- 0xa0, 0x02, 0xe8, 0x4d, 0x62, 0x06, 0x30, 0x7f, 0xcf, 0x66, 0xf9, 0x6d,
- 0x5f, 0x15, 0x2c, 0x3e, 0x79, 0xa9, 0x61, 0x38, 0xb3, 0x83, 0xbe, 0x0e,
- 0x71, 0xb9, 0xce, 0x2a, 0x43, 0xcb, 0x9b, 0xab, 0xb4, 0x4e, 0xec, 0x00,
- 0xbc, 0xb7, 0x8b, 0xfc, 0xf2, 0xaa, 0x4e, 0x6e, 0x52, 0x5c, 0x48, 0x27,
- 0x35, 0x0f, 0x01, 0x4d, 0xc0, 0x5c, 0x43, 0xb3, 0xd4, 0xdc, 0x27, 0xd8,
- 0x45, 0xba, 0xf6, 0x8d, 0x84, 0x72, 0x54, 0xbf, 0x93, 0x2d, 0x71, 0xfa,
- 0xd7, 0x38, 0xad, 0x70, 0x74, 0x97, 0x46, 0x44, 0xd4, 0x46, 0x8f, 0x58,
- 0xe3, 0x5f, 0x57, 0x46, 0x53, 0x20, 0x2a, 0xc8, 0x44, 0xe9, 0x32, 0x7d,
- 0x8d, 0x0d, 0xc5, 0xee, 0xd8, 0x0b, 0xce, 0x6c, 0x53, 0x5f, 0x36, 0xda,
- 0xbe, 0x51, 0x99, 0x63, 0x67, 0x04, 0x94, 0xe5, 0x0d, 0xc8, 0xdc, 0x61,
- 0x8f, 0xd7, 0x49, 0x73, 0x4c, 0x2b, 0x28, 0x13, 0xac, 0x32, 0x98, 0xc9,
- 0x7b, 0x8b, 0x35, 0x44, 0x4b, 0x3f, 0x42, 0x6d, 0x69, 0x29, 0x47, 0xf4,
- 0xda, 0xb4, 0x30, 0x6c, 0x66, 0x66, 0x6b, 0x84, 0x32, 0x56, 0x06, 0x51,
- 0x4b, 0x54, 0x21, 0x36, 0x37, 0x63, 0xe2, 0x87, 0x79, 0x8d, 0x1b, 0x87,
- 0x94, 0x5e, 0x33, 0x5f, 0x43, 0x14, 0xd2, 0xcd, 0x8c, 0xc0, 0xf6, 0xd6,
- 0x4f, 0x57, 0xa8, 0x79, 0x36, 0xb9, 0x36, 0x9a, 0x8c, 0xd1, 0x60, 0x33,
- 0xfb, 0x16, 0xdd, 0xf9, 0x13, 0xe8, 0x4f, 0x73, 0x73, 0x62, 0x26, 0x45,
- 0x59, 0xc2, 0x40, 0xc0, 0x0e, 0x8e, 0x59, 0x94, 0x2e, 0x32, 0xa3, 0x6a,
- 0xf8, 0xe4, 0xcc, 0x71, 0xbd, 0x19, 0x29, 0x63, 0x74, 0x17, 0x92, 0x23,
- 0x46, 0xc7, 0x20, 0xd9, 0x4f, 0x0b, 0xa7, 0xd9, 0x61, 0xec, 0xc9, 0x24,
- 0x5b, 0xd5, 0x55, 0x6c, 0x4d, 0xba, 0xe1, 0x66, 0x3a, 0x65, 0x06, 0xca,
- 0xfb, 0x8a, 0x19, 0xd1, 0xd5, 0x2a, 0x06, 0xa4, 0x9b, 0xa9, 0xae, 0x63,
- 0x74, 0xb5, 0xca, 0x52, 0xad, 0x26, 0xde, 0x30, 0xc2, 0x8c, 0x68, 0xbe,
- 0xc0, 0x44, 0xf1, 0x70, 0xc5, 0x67, 0x95, 0x04, 0x34, 0x36, 0x92, 0x55,
- 0x73, 0xfe, 0x2e, 0xae, 0x30, 0x43, 0x4f, 0x3b, 0xb8, 0xf9, 0xaa, 0xdd,
- 0x53, 0x7c, 0x1e, 0x36, 0x81, 0xb9, 0xd7, 0xa7, 0xd5, 0x95, 0x51, 0xd0,
- 0x2a, 0x39, 0xdb, 0xf9, 0xc2, 0xf0, 0xcc, 0x35, 0xf6, 0x77, 0x95, 0x65,
- 0xd3, 0x61, 0x72, 0x36, 0x83, 0x6c, 0x2d, 0xcd, 0xa4, 0x6b, 0xfa, 0x35,
- 0xee, 0x16, 0x43, 0xb7, 0x29, 0x69, 0xfd, 0xf6, 0x70, 0xf1, 0x54, 0xbc,
- 0x3b, 0x82, 0xe4, 0x79, 0x6a, 0x7e, 0x62, 0x66, 0x3b, 0x6f, 0x5e, 0x44,
- 0x74, 0x12, 0x8d, 0x0c, 0xc7, 0xf4, 0xc6, 0x59, 0x42, 0x9c, 0x38, 0xce,
- 0xea, 0x9b, 0x2c, 0xb3, 0xc3, 0x55, 0x99, 0xb9, 0xfd, 0xb0, 0x69, 0xac,
- 0x1d, 0x92, 0x38, 0x04, 0x69, 0xcf, 0xdf, 0x9d, 0x5d, 0x9c, 0x1d, 0x9d,
- 0x9d, 0x36, 0x4d, 0x1c, 0xb9, 0xa6, 0xab, 0x84, 0x54, 0x94, 0x62, 0xed,
- 0xb4, 0x39, 0x43, 0x41, 0x68, 0x59, 0xe6, 0x54, 0x1a, 0x79, 0x41, 0x1a,
- 0x9f, 0x39, 0xfb, 0x8b, 0xea, 0xd0, 0x7c, 0xc1, 0x5c, 0x79, 0x0b, 0xe2,
- 0x77, 0x73, 0xa5, 0xd8, 0xfb, 0x00, 0x77, 0x6e, 0x3e, 0x59, 0xcf, 0xd3,
- 0xd2, 0xec, 0x7f, 0x3e, 0x37, 0xaa, 0x6f, 0x7a, 0xe7, 0x6b, 0x02, 0xa0,
- 0xf3, 0x02, 0x0a, 0xa9, 0xdb, 0x66, 0x98, 0x35, 0xe6, 0x3f, 0xa7, 0x46,
- 0x4f, 0x23, 0x26, 0x9d, 0x1b, 0x35, 0x7b, 0xbd, 0x82, 0x55, 0x30, 0xad,
- 0xac, 0x81, 0x44, 0xcb, 0x9e, 0xe6, 0xb4, 0xe3, 0x29, 0xd4, 0x27, 0xf7,
- 0x3e, 0x0c, 0x22, 0xf3, 0x9f, 0x77, 0xe0, 0x2e, 0x4c, 0x96, 0x14, 0x40,
- 0x23, 0xf4, 0xe6, 0x85, 0x61, 0x50, 0x21, 0xec, 0x50, 0x05, 0xc8, 0x14,
- 0x22, 0xd7, 0x9f, 0x0f, 0xb8, 0xae, 0xc2, 0x47, 0x5a, 0x56, 0x25, 0x5e,
- 0x83, 0x00, 0xc2, 0x9a, 0xcb, 0x6c, 0x61, 0xc4, 0xfd, 0xfc, 0x8e, 0x95,
- 0x18, 0xba, 0x60, 0xca, 0xf5, 0x72, 0xc9, 0x33, 0x4b, 0xde, 0xe4, 0x13,
- 0xa3, 0x3e, 0xcd, 0xea, 0xe4, 0x07, 0x23, 0x58, 0x8b, 0x1b, 0x99, 0x73,
- 0x6b, 0x38, 0x52, 0xf2, 0x8d, 0xbd, 0x61, 0x6e, 0x97, 0xf7, 0x6f, 0x8f,
- 0x92, 0x74, 0x65, 0x08, 0x0c, 0x25, 0x87, 0xd8, 0x0c, 0x06, 0x90, 0xb7,
- 0x9e, 0x8b, 0xf3, 0xed, 0xd1, 0x8e, 0xcc, 0xd7, 0xee, 0x0c, 0x5f, 0xed,
- 0xaf, 0xc1, 0xdd, 0x17, 0x6a, 0x57, 0x9e, 0xab, 0x9c, 0x63, 0x01, 0x6e,
- 0x56, 0x4c, 0xfa, 0x8b, 0x61, 0x84, 0xf4, 0x63, 0xd5, 0x9a, 0x00, 0xf1,
- 0x0e, 0x6e, 0x71, 0x43, 0x8b, 0x1f, 0xf0, 0x78, 0x51, 0x7a, 0x36, 0x17,
- 0x96, 0x72, 0x71, 0x3a, 0x72, 0x93, 0x60, 0xa3, 0xd2, 0x10, 0xd5, 0x58,
- 0x55, 0xe6, 0x2d, 0xa1, 0xa2, 0xfd, 0x35, 0xe4, 0xa5, 0x99, 0x64, 0xeb,
- 0x1b, 0x4d, 0x5e, 0x22, 0x99, 0x4a, 0x33, 0xb3, 0x5c, 0xe5, 0x2b, 0x33,
- 0xd7, 0x66, 0x1b, 0xc9, 0x00, 0xab, 0x48, 0x2c, 0x83, 0x9f, 0x5b, 0xc3,
- 0xb1, 0x98, 0xa3, 0x61, 0x30, 0x6f, 0x18, 0x09, 0x8f, 0x86, 0xcf, 0xfb,
- 0xc9, 0xde, 0xf0, 0x11, 0xfe, 0xd8, 0xeb, 0x27, 0xfb, 0x34, 0xd2, 0x41,
- 0xc2, 0x26, 0x87, 0xec, 0x07, 0xf3, 0x5d, 0xe1, 0xcc, 0x0b, 0xcf, 0xca,
- 0xa8, 0xec, 0x25, 0xa6, 0x62, 0x2b, 0xa6, 0x6c, 0xb9, 0x75, 0xc2, 0x70,
- 0x0e, 0xd7, 0xf9, 0xbe, 0x52, 0x93, 0x61, 0x61, 0x0c, 0x1a, 0xc3, 0x1e,
- 0xac, 0x46, 0xeb, 0x99, 0xe9, 0x33, 0x21, 0xa0, 0x64, 0xf5, 0x0c, 0x43,
- 0x2c, 0x61, 0x59, 0xf6, 0x92, 0x0c, 0xcf, 0xf2, 0x75, 0xdf, 0x1a, 0xce,
- 0x30, 0xfd, 0x83, 0xf6, 0x04, 0x66, 0x7b, 0x07, 0xd1, 0xf1, 0x2d, 0x23,
- 0xa8, 0xa6, 0x39, 0xd6, 0x54, 0x40, 0xc2, 0xd2, 0x21, 0x62, 0xd9, 0x68,
- 0xc6, 0xef, 0xf3, 0x46, 0x78, 0xe3, 0x37, 0x46, 0x86, 0x23, 0x20, 0xd8,
- 0x3f, 0xfa, 0xa1, 0x12, 0xfe, 0x60, 0x98, 0xbc, 0x92, 0xa5, 0x10, 0x99,
- 0x21, 0x22, 0xe9, 0x01, 0xa3, 0x77, 0x19, 0x65, 0x26, 0xe9, 0x55, 0xeb,
- 0x71, 0x9b, 0xe0, 0x30, 0xf2, 0xc6, 0x59, 0x8f, 0x3d, 0x1e, 0x75, 0xb1,
- 0x32, 0xa6, 0xcf, 0xcd, 0x15, 0x18, 0x98, 0x8d, 0x6d, 0x33, 0xce, 0x2e,
- 0x2c, 0x6d, 0x8c, 0xa7, 0xa3, 0xac, 0x8c, 0x76, 0x95, 0x57, 0x57, 0x3d,
- 0xec, 0x63, 0xda, 0xde, 0x3f, 0x8c, 0x30, 0xd4, 0xc9, 0xea, 0xf9, 0x85,
- 0x3c, 0xcd, 0x6e, 0x8d, 0xc6, 0x92, 0x2f, 0xa0, 0xb2, 0xcc, 0xd9, 0xfb,
- 0x70, 0x3a, 0x92, 0xeb, 0x9a, 0x1e, 0xce, 0x2b, 0xff, 0x6e, 0x0b, 0x5c,
- 0x2c, 0xdb, 0x77, 0x59, 0xbd, 0xe3, 0x69, 0x4d, 0x67, 0xe7, 0x07, 0x21,
- 0x99, 0xfd, 0xd5, 0x8b, 0x56, 0xb9, 0x2a, 0x56, 0x07, 0x7a, 0x5d, 0xf0,
- 0x95, 0xa7, 0x97, 0x0b, 0xe4, 0x36, 0xb6, 0xdb, 0xcc, 0x96, 0xf6, 0x35,
- 0x09, 0xf6, 0x7c, 0xc3, 0x36, 0xc3, 0xf9, 0x12, 0x7e, 0x9f, 0x4c, 0x6e,
- 0x23, 0xe3, 0xcc, 0x4d, 0x64, 0x2e, 0xa9, 0xe4, 0x8d, 0x11, 0x5a, 0xe9,
- 0x25, 0x7d, 0xcb, 0x4a, 0x01, 0xba, 0xc4, 0x57, 0x86, 0x10, 0xe6, 0x64,
- 0xcd, 0xef, 0xf8, 0x5a, 0x30, 0xb4, 0xe7, 0x19, 0xb6, 0x57, 0x0f, 0xbd,
- 0x72, 0x41, 0x17, 0x61, 0x36, 0xcd, 0x53, 0xbe, 0x51, 0x1c, 0x27, 0xf1,
- 0x5a, 0xa1, 0xaf, 0x7a, 0xd3, 0x1a, 0x9d, 0x07, 0x3c, 0x42, 0x3f, 0x34,
- 0xe7, 0xd1, 0xbe, 0xe2, 0x9d, 0x9d, 0xd1, 0xd1, 0x79, 0x28, 0x14, 0x46,
- 0xa3, 0x6f, 0x2d, 0x4f, 0xed, 0x1b, 0x0e, 0x59, 0xb9, 0xbb, 0xda, 0x7b,
- 0x13, 0x1e, 0x99, 0xe0, 0x4d, 0xfc, 0x70, 0x7b, 0x5a, 0xa6, 0x46, 0xd2,
- 0x3e, 0xd9, 0x91, 0xeb, 0x13, 0xa4, 0x6f, 0x0c, 0xe9, 0x0d, 0xf2, 0xe6,
- 0x6b, 0x2b, 0x46, 0xdd, 0x20, 0x6f, 0xbe, 0xb6, 0xcf, 0xee, 0xd1, 0xe1,
- 0x60, 0x5e, 0xa4, 0xf5, 0xeb, 0x1a, 0xfc, 0x31, 0x62, 0x62, 0xee, 0xbd,
- 0xb2, 0x2f, 0xf4, 0x01, 0xa3, 0x0a, 0xd6, 0x6c, 0x08, 0x2c, 0xe9, 0x71,
- 0x65, 0x08, 0xe1, 0x08, 0xf3, 0x4f, 0x16, 0x4c, 0xf8, 0x3d, 0xcb, 0x80,
- 0x61, 0x6b, 0xb8, 0x1f, 0x36, 0x9d, 0x4c, 0x71, 0xa9, 0x5d, 0x18, 0x9b,
- 0x82, 0x3e, 0x88, 0xd5, 0x98, 0x8f, 0x91, 0xc5, 0x89, 0x53, 0x95, 0xcd,
- 0x97, 0x19, 0xeb, 0x5e, 0xa4, 0x4d, 0x42, 0xbe, 0x39, 0xef, 0xd9, 0x35,
- 0xb4, 0x99, 0x0a, 0x8b, 0x6d, 0x73, 0x9f, 0xd1, 0x6c, 0x49, 0x9f, 0xc3,
- 0xec, 0x2a, 0xab, 0x81, 0x41, 0x90, 0x55, 0xac, 0x78, 0x54, 0xb5, 0x99,
- 0x35, 0xdf, 0x1a, 0x89, 0x99, 0x94, 0x51, 0x00, 0xac, 0x76, 0xed, 0xd9,
- 0x3a, 0x56, 0xd9, 0xa0, 0x25, 0xf3, 0x60, 0x3e, 0xcf, 0x5c, 0x78, 0x1b,
- 0x29, 0x22, 0x8a, 0x7e, 0x64, 0xb9, 0x85, 0x3e, 0xc0, 0x5b, 0x20, 0xda,
- 0xc9, 0x37, 0xef, 0x8e, 0x47, 0xa3, 0xe4, 0xcd, 0xf1, 0xc5, 0xf1, 0xbb,
- 0xa6, 0x6f, 0x75, 0x59, 0x94, 0x0b, 0x52, 0x38, 0x8d, 0x94, 0xab, 0x56,
- 0xf3, 0xf4, 0x0e, 0xaa, 0xa8, 0x11, 0xb9, 0x97, 0x25, 0x34, 0xff, 0x45,
- 0x06, 0xdb, 0x75, 0xba, 0x26, 0x5b, 0xab, 0x30, 0xe2, 0x20, 0x15, 0xa7,
- 0x9d, 0xb9, 0x93, 0xc9, 0xd1, 0xe7, 0x6e, 0x64, 0xc8, 0x6d, 0x67, 0xec,
- 0x2b, 0xfb, 0xc1, 0x73, 0x06, 0x3f, 0x6d, 0xdf, 0x79, 0xca, 0x12, 0xd6,
- 0xe0, 0x2a, 0x21, 0x83, 0x51, 0xa8, 0xcd, 0xd1, 0x22, 0x4f, 0x07, 0xce,
- 0xa0, 0x35, 0xaf, 0xb3, 0x59, 0x6d, 0x5e, 0x32, 0x1b, 0xc2, 0xfe, 0x81,
- 0x60, 0x4e, 0x3a, 0x5b, 0xeb, 0xe3, 0x33, 0x6a, 0x72, 0x9d, 0xb9, 0x9b,
- 0x88, 0x3f, 0x62, 0x8d, 0x2c, 0x6c, 0xcc, 0x52, 0x1e, 0x59, 0x11, 0x55,
- 0x0d, 0x97, 0x4d, 0xd9, 0x95, 0x5a, 0xad, 0x67, 0x64, 0x64, 0x24, 0xdb,
- 0x1f, 0xfb, 0xc9, 0x9b, 0x7e, 0xf2, 0x4d, 0x3f, 0x81, 0x03, 0x77, 0x87,
- 0xde, 0x4a, 0xf6, 0x1e, 0xed, 0x3f, 0x4e, 0x58, 0xee, 0x59, 0x1e, 0x7b,
- 0xed, 0x19, 0x8a, 0x7b, 0x1f, 0x21, 0x21, 0xe8, 0x29, 0x1a, 0x7e, 0x98,
- 0xec, 0xbd, 0xe1, 0x9f, 0x3c, 0xfe, 0xfc, 0xc9, 0xb3, 0xa7, 0xf2, 0xc3,
- 0xa6, 0xfa, 0xed, 0xa6, 0xcf, 0xda, 0x2b, 0xfb, 0xb2, 0xe1, 0xdc, 0x36,
- 0xd3, 0x81, 0x2a, 0x98, 0x2f, 0x8d, 0xcc, 0x35, 0x7a, 0xbf, 0x18, 0x53,
- 0x50, 0xb8, 0x93, 0x9c, 0x6d, 0x3b, 0xd6, 0x3a, 0x1b, 0xc3, 0x99, 0x17,
- 0xa7, 0x74, 0x54, 0xec, 0x16, 0xb1, 0x27, 0xa3, 0xc6, 0x3c, 0xd2, 0x31,
- 0xd8, 0xdf, 0x3c, 0xc2, 0x0a, 0x9c, 0xff, 0x25, 0xfb, 0x29, 0x6b, 0xb5,
- 0x9b, 0x57, 0xcc, 0xd4, 0x8c, 0xcd, 0x0e, 0x33, 0x3c, 0xa4, 0xba, 0x31,
- 0x54, 0xc8, 0x7e, 0xbb, 0xc9, 0x2b, 0x62, 0xf4, 0x9b, 0x62, 0x0d, 0x65,
- 0x14, 0x0f, 0x18, 0xdd, 0x12, 0x2f, 0x30, 0x57, 0xeb, 0x70, 0x8b, 0xfc,
- 0x56, 0xae, 0xf0, 0xc6, 0x28, 0x66, 0x6e, 0xe6, 0x9f, 0x2b, 0xc3, 0x49,
- 0x3c, 0x9f, 0x61, 0xdb, 0x7e, 0x25, 0xcb, 0x2c, 0xe0, 0x43, 0x08, 0x16,
- 0xd2, 0x5b, 0xce, 0xcf, 0x46, 0x17, 0x38, 0xdb, 0xe7, 0xef, 0x2f, 0xcc,
- 0x40, 0x7f, 0x33, 0x46, 0x6a, 0x6d, 0x78, 0x12, 0x2f, 0x2e, 0x33, 0x92,
- 0xce, 0x3a, 0x9c, 0x61, 0x3f, 0xba, 0xbb, 0x45, 0xcf, 0xb3, 0x1f, 0xe5,
- 0x59, 0xf2, 0x15, 0x0a, 0x1d, 0x4c, 0x43, 0x06, 0xec, 0x65, 0xb0, 0x6f,
- 0x6d, 0x7f, 0xb9, 0xd3, 0x4f, 0x06, 0x85, 0xa5, 0xce, 0x60, 0x20, 0x2f,
- 0x9a, 0x6f, 0x57, 0xf9, 0x22, 0x37, 0xfa, 0xb8, 0x37, 0xf5, 0x5a, 0x6e,
- 0x44, 0x67, 0xf4, 0x4c, 0x0c, 0xd3, 0xd0, 0xac, 0x9d, 0x2f, 0x1c, 0x24,
- 0x24, 0x93, 0xc9, 0x6d, 0x95, 0x55, 0x9e, 0xe1, 0x81, 0xb6, 0xa4, 0xc3,
- 0xa6, 0xc1, 0x98, 0x6a, 0x10, 0xaa, 0xcd, 0x22, 0x0d, 0xc2, 0x11, 0x01,
- 0xc8, 0x62, 0xc6, 0x21, 0x4b, 0x13, 0x47, 0xbe, 0xa4, 0x37, 0x4e, 0xcb,
- 0x5e, 0x62, 0xad, 0x45, 0x09, 0x8b, 0x98, 0xb1, 0x2f, 0xc9, 0xa6, 0x20,
- 0xf2, 0x9a, 0x95, 0xfe, 0xde, 0x5b, 0xa9, 0xbe, 0x3c, 0x30, 0xaf, 0x62,
- 0x61, 0xe4, 0x27, 0x9f, 0x19, 0xb5, 0x15, 0xa7, 0x46, 0x5d, 0x6c, 0xe4,
- 0x70, 0x11, 0x86, 0x69, 0xf2, 0x0b, 0x8f, 0xe9, 0xf9, 0xde, 0xcc, 0x51,
- 0x81, 0xb2, 0xcf, 0x1a, 0x13, 0x1e, 0x1d, 0x98, 0x2d, 0x1b, 0x0c, 0x2a,
- 0x43, 0x7d, 0x88, 0x8c, 0x95, 0x44, 0x25, 0xce, 0x28, 0xfe, 0x63, 0xed,
- 0xa8, 0x33, 0x51, 0x6d, 0x59, 0x0e, 0xf3, 0x05, 0x9f, 0x70, 0x64, 0xa7,
- 0x34, 0x1a, 0xb9, 0xf9, 0x78, 0x6a, 0xf6, 0xcc, 0x9c, 0xb9, 0x37, 0xa0,
- 0x95, 0x2c, 0x4b, 0xf5, 0x61, 0xb0, 0x86, 0xd9, 0xc8, 0xc4, 0xa9, 0xc0,
- 0xe9, 0x74, 0x9a, 0x93, 0xad, 0x33, 0x87, 0xfd, 0xbd, 0xce, 0xc8, 0x43,
- 0x2a, 0x44, 0x5d, 0x78, 0x02, 0x16, 0x1b, 0x78, 0x05, 0x3d, 0xa8, 0xc7,
- 0x76, 0xe2, 0x00, 0x9f, 0xe9, 0x61, 0x2b, 0x17, 0xad, 0x8f, 0x98, 0x35,
- 0x4c, 0xc5, 0x07, 0x21, 0x02, 0xa1, 0x9f, 0x90, 0x75, 0xe6, 0x39, 0x32,
- 0x49, 0x65, 0x68, 0x6b, 0x8a, 0xc6, 0xe0, 0x5f, 0xc1, 0xd9, 0x23, 0x16,
- 0x26, 0x99, 0xea, 0x74, 0x66, 0x2b, 0x9e, 0x5a, 0xdf, 0x10, 0x17, 0x4f,
- 0x5e, 0x5e, 0xe9, 0xa3, 0x9e, 0xd9, 0x9f, 0x9a, 0xb5, 0x41, 0xc5, 0x46,
- 0x44, 0x60, 0xaa, 0x56, 0x69, 0x51, 0xb2, 0x38, 0x9b, 0x17, 0x86, 0x93,
- 0x7b, 0xec, 0x52, 0xf3, 0x26, 0x8e, 0x99, 0x82, 0xe2, 0x1c, 0x36, 0x73,
- 0xaa, 0x93, 0x9d, 0xb6, 0x90, 0xab, 0xba, 0x77, 0x6a, 0xde, 0x4d, 0x4e,
- 0x44, 0xd2, 0xab, 0x5f, 0xe9, 0x4e, 0xfc, 0x6d, 0x34, 0x89, 0xad, 0x9a,
- 0xcf, 0x23, 0xf9, 0x81, 0x5b, 0x94, 0xaf, 0x88, 0x7f, 0xc4, 0xcc, 0xb6,
- 0x2b, 0x5b, 0x90, 0xda, 0x44, 0x7c, 0xa2, 0x3b, 0xe3, 0x9c, 0xd6, 0x11,
- 0x27, 0xdd, 0x5d, 0xe0, 0x76, 0x85, 0x11, 0xec, 0x5f, 0x49, 0x3a, 0xa7,
- 0xc1, 0x99, 0x59, 0xfb, 0x29, 0xad, 0x63, 0x70, 0x9d, 0xe0, 0xfc, 0x2d,
- 0xcd, 0x0a, 0x53, 0xfc, 0xe2, 0xf4, 0xda, 0x3b, 0x46, 0x88, 0x32, 0x2c,
- 0xe1, 0x45, 0xe9, 0x53, 0x7c, 0x67, 0x5c, 0x14, 0xf3, 0x2c, 0x75, 0x4b,
- 0xc3, 0x8d, 0x90, 0x2d, 0xc1, 0xee, 0xb2, 0xa3, 0x46, 0x24, 0xac, 0xac,
- 0xc0, 0x35, 0x1a, 0x6f, 0x92, 0x5e, 0xa6, 0xb9, 0xe5, 0x37, 0x39, 0x1a,
- 0xf6, 0xd9, 0x65, 0x21, 0x8f, 0x63, 0xa7, 0xa0, 0x1d, 0x88, 0xd8, 0x5a,
- 0x57, 0x7c, 0x7c, 0xcc, 0xba, 0x8c, 0xd8, 0x21, 0xd9, 0x21, 0xc3, 0x92,
- 0x53, 0x4b, 0x87, 0x1b, 0x93, 0x1b, 0x0f, 0x1e, 0x31, 0x12, 0xbe, 0xe4,
- 0xdf, 0x32, 0x43, 0xf6, 0x86, 0xc9, 0xb7, 0xc5, 0x4d, 0x46, 0xa1, 0x4f,
- 0xf2, 0x3f, 0xe6, 0x88, 0xd7, 0x55, 0xe6, 0x09, 0x63, 0x4a, 0x19, 0x53,
- 0xc0, 0x50, 0x93, 0x7c, 0x23, 0xf4, 0x33, 0xcf, 0x85, 0x6d, 0x58, 0xfc,
- 0x86, 0x8f, 0xa2, 0x2e, 0xc2, 0xee, 0xe4, 0x8c, 0x4f, 0x44, 0xb2, 0x4d,
- 0xbe, 0x97, 0x09, 0x88, 0xb5, 0xaa, 0xdd, 0x2a, 0x2c, 0x3d, 0x8c, 0xa4,
- 0xae, 0xbc, 0xc3, 0x25, 0xde, 0xfa, 0xe4, 0xd9, 0x70, 0xef, 0xf9, 0xf0,
- 0xd1, 0x10, 0x5a, 0x74, 0x76, 0x9d, 0x1b, 0x1b, 0x15, 0x0a, 0x06, 0xa6,
- 0x62, 0x5f, 0x44, 0x50, 0xcd, 0x6c, 0xef, 0xe5, 0xe5, 0x9c, 0xbc, 0x7f,
- 0xbb, 0xc5, 0x6c, 0x06, 0x0d, 0xa9, 0xcc, 0x9c, 0x77, 0x8f, 0x3d, 0xb4,
- 0x20, 0x8d, 0x1c, 0x39, 0x96, 0xa9, 0xa1, 0x65, 0x39, 0x74, 0x41, 0x96,
- 0xc1, 0x20, 0x1d, 0x1b, 0x25, 0xdc, 0x50, 0x71, 0xb0, 0x5e, 0xe6, 0xb7,
- 0x83, 0xaa, 0x98, 0x7c, 0x34, 0x9b, 0xf2, 0x62, 0x95, 0xd6, 0x57, 0x5f,
- 0xb6, 0xf4, 0xab, 0x6d, 0xdc, 0x25, 0x3b, 0xc9, 0x11, 0xfb, 0xbc, 0xcc,
- 0x17, 0x4a, 0x3e, 0x6d, 0x66, 0x2f, 0x65, 0x8c, 0xe4, 0xbd, 0x19, 0xc3,
- 0x70, 0xb2, 0xd1, 0x2f, 0xc1, 0x62, 0x34, 0x56, 0xdf, 0x8a, 0xd1, 0xd6,
- 0x70, 0x66, 0x92, 0x72, 0x8b, 0xf0, 0x65, 0x63, 0x34, 0x48, 0xf2, 0x40,
- 0x24, 0xc9, 0xdb, 0xa2, 0xce, 0x0e, 0xf1, 0x6f, 0x23, 0xc4, 0x6a, 0xa2,
- 0xba, 0x5c, 0xae, 0x29, 0x44, 0xc2, 0x8c, 0xbf, 0x38, 0x08, 0x4d, 0x09,
- 0xe2, 0x05, 0x5e, 0x80, 0xf8, 0x41, 0x85, 0x91, 0xb6, 0xbe, 0xda, 0xea,
- 0xc3, 0xe7, 0x49, 0x7b, 0x2e, 0x9f, 0xe3, 0x25, 0x42, 0xd3, 0xb9, 0x5c,
- 0xc3, 0x66, 0x6b, 0x0f, 0x77, 0x45, 0x57, 0x35, 0xae, 0x19, 0x76, 0xc6,
- 0x13, 0x93, 0x88, 0x89, 0x6d, 0xfd, 0xe3, 0xc3, 0xcf, 0x5a, 0xaf, 0xbd,
- 0xa4, 0x3d, 0x35, 0xab, 0x7f, 0x36, 0x7c, 0x72, 0x60, 0x76, 0xd4, 0x27,
- 0xf4, 0xbc, 0x1e, 0x54, 0xd7, 0x93, 0xe4, 0x05, 0xf9, 0x06, 0xc1, 0xa6,
- 0x51, 0x02, 0x1b, 0x63, 0xe1, 0x87, 0x97, 0xef, 0xde, 0x9e, 0xbc, 0xfd,
- 0xe6, 0x90, 0x3f, 0x2a, 0xac, 0xd6, 0x32, 0x30, 0x61, 0x08, 0xd3, 0xec,
- 0xb0, 0xdf, 0xe6, 0x7b, 0xe6, 0x22, 0x69, 0x53, 0x64, 0xba, 0x6e, 0x85,
- 0xae, 0xad, 0xb4, 0x76, 0xa3, 0xf2, 0xd9, 0x64, 0xf2, 0xea, 0x04, 0x8d,
- 0x70, 0xe4, 0xe8, 0x37, 0x29, 0x4b, 0x43, 0x5c, 0x95, 0x14, 0x83, 0xd0,
- 0x69, 0xb7, 0x86, 0x5b, 0x15, 0xb9, 0xb3, 0x3d, 0xb2, 0xdb, 0x9c, 0x4d,
- 0x69, 0x1d, 0x6c, 0x62, 0xc4, 0x51, 0x26, 0x3a, 0x03, 0xc9, 0x39, 0x72,
- 0x35, 0x89, 0x1c, 0x1b, 0x26, 0x2f, 0x67, 0x81, 0x7f, 0x84, 0xf2, 0x20,
- 0xf4, 0x02, 0x9c, 0x5a, 0x35, 0x98, 0x23, 0xd4, 0x3c, 0x9c, 0x8e, 0x51,
- 0x99, 0x9d, 0x99, 0xb2, 0x7b, 0x98, 0xf6, 0x14, 0x9f, 0x69, 0x0d, 0x47,
- 0x5e, 0x71, 0x92, 0x31, 0xd0, 0x07, 0x73, 0xec, 0x26, 0xbc, 0xd2, 0x46,
- 0x4a, 0x2f, 0x8a, 0x29, 0xb9, 0x38, 0x03, 0xfa, 0x8c, 0x6c, 0x44, 0xaa,
- 0xd7, 0x73, 0xab, 0x4e, 0xb6, 0x11, 0x9f, 0x34, 0x2c, 0xb0, 0xbc, 0xac,
- 0xaf, 0x76, 0x5c, 0xcc, 0x45, 0x7d, 0x08, 0x66, 0x2e, 0xb4, 0xee, 0x65,
- 0x9b, 0xcf, 0x29, 0x6a, 0x4e, 0x6a, 0xe7, 0x5f, 0xd7, 0x55, 0x4d, 0x8e,
- 0x5a, 0xb9, 0xfc, 0x79, 0x31, 0x66, 0x66, 0x8b, 0x6c, 0x51, 0x94, 0x77,
- 0xc1, 0x44, 0x88, 0xf0, 0x0d, 0x0e, 0xa0, 0x9b, 0x51, 0x43, 0x96, 0x50,
- 0xff, 0xab, 0x7e, 0x23, 0x24, 0x41, 0x1a, 0x93, 0xb5, 0x07, 0xdb, 0xbe,
- 0x44, 0xf2, 0x17, 0x70, 0xd8, 0x41, 0x1c, 0xbd, 0x63, 0x89, 0x2f, 0xcd,
- 0x53, 0x88, 0x9a, 0x65, 0xd6, 0xd8, 0x1d, 0xba, 0x39, 0x78, 0x59, 0x9b,
- 0xf8, 0xfc, 0xe9, 0xe3, 0xe1, 0x5e, 0x83, 0xcf, 0x97, 0x77, 0xc8, 0x71,
- 0x88, 0x0b, 0x0f, 0x58, 0x90, 0x95, 0xb3, 0x1f, 0xf3, 0xcb, 0x75, 0x99,
- 0xb1, 0xea, 0x46, 0x69, 0x11, 0x9a, 0x0d, 0x01, 0x6d, 0xe8, 0xaa, 0xa0,
- 0x24, 0x02, 0x73, 0x8b, 0x66, 0xf3, 0x59, 0x3f, 0xe2, 0x47, 0xd4, 0x4b,
- 0x80, 0xe4, 0xa4, 0xb1, 0x4f, 0x68, 0xa8, 0x65, 0x26, 0x9a, 0x1a, 0x7c,
- 0xa5, 0x09, 0xc2, 0xe5, 0xc9, 0x64, 0x9e, 0xe6, 0x8b, 0x8a, 0xd9, 0x44,
- 0x4c, 0xf0, 0x61, 0xec, 0x48, 0x98, 0xff, 0x47, 0xe6, 0xfc, 0x18, 0x1e,
- 0xf9, 0xb2, 0xc2, 0x95, 0x4c, 0x3b, 0xaa, 0x2a, 0x33, 0x7b, 0x27, 0xae,
- 0xb2, 0xc9, 0x47, 0xf5, 0xbb, 0xa9, 0xae, 0xd9, 0xe6, 0x61, 0xa4, 0x47,
- 0x90, 0xdb, 0xbf, 0xbe, 0x82, 0x13, 0xbb, 0x30, 0xc6, 0x2f, 0xa2, 0x7a,
- 0xc6, 0x08, 0x5c, 0x4f, 0x9c, 0x15, 0x7e, 0x6b, 0x58, 0xdb, 0x8a, 0x3d,
- 0xa3, 0x6c, 0x1b, 0x5b, 0x70, 0x3a, 0xa8, 0xcb, 0x7c, 0x15, 0x9d, 0x1d,
- 0xb9, 0x55, 0x68, 0x5b, 0x1a, 0x6a, 0x29, 0x12, 0x0b, 0xac, 0xb3, 0x47,
- 0xdc, 0xf6, 0x93, 0x16, 0x35, 0xdb, 0x0c, 0x49, 0xb4, 0xed, 0xc3, 0x0b,
- 0x66, 0x54, 0x05, 0x0d, 0x86, 0x1b, 0x83, 0x88, 0x95, 0xc5, 0x81, 0xd1,
- 0x60, 0xab, 0x7c, 0xd2, 0xc7, 0xdf, 0xa6, 0xf9, 0x65, 0x86, 0x24, 0x14,
- 0x5c, 0x62, 0xf5, 0x7c, 0xc1, 0x79, 0x24, 0xad, 0xe1, 0xcc, 0xaf, 0xb2,
- 0xcb, 0xa2, 0x86, 0x1a, 0x12, 0xb0, 0x09, 0xbb, 0x28, 0x2d, 0x4f, 0xa8,
- 0xc2, 0xef, 0x2b, 0x63, 0x62, 0xa5, 0x99, 0xcf, 0x8b, 0x01, 0xce, 0x7c,
- 0x4a, 0x96, 0x7f, 0x7b, 0xd7, 0xcd, 0x68, 0x13, 0xb2, 0xa3, 0xa0, 0x30,
- 0xaa, 0xb6, 0xaa, 0x7a, 0x3e, 0xe4, 0x01, 0x54, 0xe3, 0xfa, 0x26, 0x9f,
- 0x64, 0x6a, 0xd6, 0xda, 0x60, 0xf4, 0x3c, 0x0f, 0x65, 0xfc, 0x02, 0xe7,
- 0x11, 0xef, 0xb1, 0x3a, 0x8e, 0xa8, 0xce, 0x4d, 0x0e, 0x75, 0x5d, 0x24,
- 0x1e, 0x29, 0x63, 0x72, 0x11, 0xa4, 0x65, 0x4e, 0x21, 0x2c, 0xc4, 0x7c,
- 0xd5, 0xf1, 0x12, 0x3b, 0x5f, 0x3c, 0x6f, 0x7a, 0x5d, 0x0c, 0x18, 0x67,
- 0xb8, 0xd0, 0xe1, 0x9a, 0x91, 0xef, 0x25, 0xa0, 0x13, 0x99, 0x61, 0x97,
- 0x19, 0x05, 0xfb, 0x58, 0x6d, 0x58, 0x43, 0xf9, 0x44, 0xca, 0x50, 0x28,
- 0xa0, 0xb2, 0x8c, 0x2d, 0x09, 0xb2, 0x3a, 0x6e, 0xef, 0x2c, 0x79, 0x49,
- 0x5b, 0xe3, 0xed, 0x93, 0xbf, 0xf3, 0x06, 0x7a, 0xc7, 0x33, 0xc5, 0xa8,
- 0xe9, 0x0a, 0x8e, 0xea, 0xf6, 0x09, 0x85, 0xd1, 0x05, 0xf7, 0xd6, 0x8e,
- 0x86, 0xb6, 0x33, 0x09, 0xee, 0xdb, 0xb4, 0x24, 0x92, 0x46, 0x90, 0x67,
- 0x72, 0x84, 0x79, 0x1c, 0xb1, 0x07, 0xda, 0x72, 0xdc, 0x5c, 0xac, 0xe6,
- 0x22, 0x96, 0x2c, 0xa5, 0x06, 0xcb, 0xc2, 0x5f, 0x66, 0xd3, 0x63, 0x10,
- 0x8c, 0x26, 0x6b, 0xcc, 0x3b, 0xb6, 0x11, 0x39, 0x0e, 0xa3, 0x0f, 0x0a,
- 0x32, 0x5d, 0x30, 0x7d, 0x56, 0xe7, 0x58, 0x54, 0x4d, 0x38, 0x34, 0x2d,
- 0x7a, 0x03, 0x5f, 0x32, 0x34, 0xd1, 0xd9, 0x3c, 0xbd, 0xe4, 0x63, 0x93,
- 0x5f, 0xb6, 0x4f, 0xe8, 0xb2, 0x90, 0x1c, 0xa5, 0xaa, 0x30, 0xa2, 0x9d,
- 0x9c, 0x7a, 0xec, 0x3e, 0xaa, 0x92, 0x6d, 0xc3, 0x64, 0xf3, 0x35, 0xdd,
- 0xf3, 0x67, 0x66, 0x79, 0xa3, 0xd1, 0xb7, 0x3b, 0xbe, 0x78, 0x23, 0xea,
- 0xc6, 0x85, 0x5b, 0x4b, 0xba, 0x41, 0x3e, 0x91, 0xf9, 0xfd, 0x35, 0x6f,
- 0x48, 0x53, 0xc2, 0x59, 0xbb, 0xae, 0x0c, 0xc4, 0x07, 0xd1, 0x00, 0x11,
- 0xda, 0xa1, 0x15, 0x4c, 0x78, 0x50, 0x03, 0xc5, 0xcc, 0xda, 0xad, 0x7b,
- 0x61, 0x4d, 0x4e, 0x29, 0xba, 0x8b, 0xdb, 0xc3, 0x19, 0x41, 0x6f, 0x44,
- 0xd1, 0x7a, 0x89, 0xff, 0x5a, 0xed, 0x39, 0x27, 0x63, 0x01, 0x3b, 0x51,
- 0x22, 0x36, 0x0f, 0xdf, 0x81, 0xd5, 0x3c, 0x8d, 0x48, 0xd1, 0xb1, 0x41,
- 0xcd, 0xc0, 0xcd, 0x06, 0xff, 0x9e, 0x51, 0xd5, 0x91, 0x03, 0x87, 0x03,
- 0x17, 0x17, 0xdd, 0xdb, 0xd5, 0xda, 0x48, 0x17, 0x58, 0x0c, 0x4e, 0x78,
- 0x80, 0x1f, 0xdb, 0xb3, 0x63, 0x01, 0x63, 0x6e, 0x1a, 0x4f, 0x8e, 0xec,
- 0xfc, 0xd6, 0x07, 0x84, 0x36, 0xcd, 0xdf, 0x45, 0x73, 0xf5, 0x66, 0xc6,
- 0x12, 0x23, 0x5d, 0x2c, 0x50, 0xc3, 0x2e, 0x4e, 0x47, 0x3b, 0x91, 0xbd,
- 0x6c, 0x26, 0xcf, 0xe0, 0x7d, 0xc8, 0xda, 0xb4, 0xd6, 0x68, 0x6f, 0x01,
- 0x73, 0xc0, 0x4b, 0xa0, 0xf1, 0xac, 0xaa, 0x55, 0x96, 0x89, 0xb1, 0x49,
- 0x8f, 0x42, 0x7c, 0xe1, 0x92, 0x26, 0x35, 0xd9, 0x86, 0x75, 0x93, 0xa3,
- 0x97, 0x89, 0x3f, 0x6c, 0xc5, 0x9e, 0xbc, 0x76, 0xa0, 0xc5, 0x3d, 0xb0,
- 0x5d, 0xed, 0x88, 0x10, 0x1b, 0x93, 0x1a, 0x71, 0x7e, 0xfc, 0x86, 0x2c,
- 0xd7, 0xd4, 0x30, 0xce, 0x5b, 0xf5, 0x53, 0x6a, 0x5e, 0x1e, 0xe2, 0x51,
- 0x7e, 0xf4, 0xde, 0xd9, 0xda, 0x94, 0x13, 0xc7, 0xac, 0x45, 0xb3, 0xe3,
- 0xd4, 0x9b, 0x9c, 0xa2, 0xd6, 0x6d, 0x46, 0xab, 0xef, 0x56, 0x12, 0x70,
- 0x17, 0xbf, 0x7e, 0xfb, 0x5e, 0x9e, 0x43, 0x7f, 0x63, 0x83, 0xd6, 0x1b,
- 0x33, 0xd8, 0x21, 0x56, 0x5a, 0x70, 0x0f, 0x5c, 0x2e, 0xf3, 0xbf, 0x8b,
- 0x02, 0x9a, 0x2d, 0xaf, 0xf3, 0xb2, 0x58, 0x42, 0xc1, 0xe5, 0xb8, 0xdc,
- 0x58, 0x74, 0xaf, 0x69, 0xb2, 0x75, 0xf4, 0xfe, 0xdd, 0xe9, 0x87, 0xa3,
- 0x97, 0x1f, 0xbe, 0x7e, 0xff, 0xf6, 0xd5, 0xe9, 0xf1, 0x56, 0x6b, 0x38,
- 0x56, 0xed, 0xcc, 0xfc, 0x2a, 0x18, 0x1c, 0xa2, 0x1c, 0xf0, 0xa0, 0x97,
- 0xf9, 0xb5, 0x11, 0x66, 0x64, 0x3a, 0x50, 0xda, 0x00, 0xfd, 0x8d, 0x74,
- 0x81, 0xd4, 0x51, 0xbc, 0x35, 0xdc, 0x78, 0x0d, 0x1d, 0x6d, 0xd8, 0xd0,
- 0x94, 0xf5, 0xa8, 0x88, 0xb9, 0xae, 0xf3, 0x8b, 0x68, 0xd7, 0x19, 0xb4,
- 0x31, 0x8e, 0xc1, 0x5a, 0x03, 0x91, 0xe4, 0x9e, 0x97, 0x49, 0xb0, 0xae,
- 0x8d, 0x91, 0xa4, 0xb9, 0x0b, 0x88, 0x92, 0x11, 0xd5, 0x53, 0x33, 0xa1,
- 0xc8, 0x76, 0x57, 0x4e, 0x0b, 0x35, 0x94, 0xc0, 0x28, 0x86, 0x7f, 0x07,
- 0x32, 0xc9, 0x49, 0x59, 0x1b, 0xe3, 0x26, 0xcb, 0xe9, 0x60, 0x68, 0x8a,
- 0x17, 0xf4, 0x55, 0xf2, 0xc9, 0x05, 0xda, 0x35, 0xa2, 0x72, 0x29, 0xf3,
- 0xf5, 0x30, 0xbb, 0xcd, 0xe8, 0xe4, 0xc9, 0x5b, 0x47, 0xeb, 0x92, 0xce,
- 0xf3, 0x0f, 0x46, 0x1d, 0x81, 0xf4, 0x7b, 0xa5, 0x61, 0x3c, 0x7d, 0xc8,
- 0x5c, 0x33, 0xed, 0x2b, 0xaf, 0x98, 0x23, 0xe9, 0x2b, 0x25, 0x17, 0x0a,
- 0x79, 0xbc, 0xce, 0x5f, 0x5e, 0x7c, 0x1b, 0x53, 0x64, 0x9b, 0x6c, 0x48,
- 0x0a, 0x79, 0xa5, 0x6e, 0xc6, 0xb7, 0xa3, 0x51, 0x42, 0x79, 0xae, 0xc8,
- 0xc8, 0x28, 0x53, 0x7c, 0xd0, 0xfb, 0x85, 0xe1, 0xea, 0xd6, 0x70, 0xe7,
- 0xdf, 0x1d, 0x8d, 0x7e, 0xbf, 0xb7, 0x07, 0x0d, 0x7e, 0x6d, 0xe8, 0xb2,
- 0x6d, 0xde, 0x5a, 0x56, 0xe6, 0x64, 0x2e, 0x86, 0x55, 0xb1, 0x43, 0xb7,
- 0x76, 0x25, 0x0a, 0x41, 0x7a, 0x6d, 0x6e, 0x5b, 0x62, 0x23, 0x65, 0xea,
- 0x8e, 0x88, 0x2c, 0xf9, 0x7b, 0xa1, 0x86, 0x19, 0x79, 0x61, 0xee, 0xeb,
- 0x79, 0xa8, 0x8c, 0x6f, 0xe7, 0x67, 0x23, 0xce, 0xa2, 0x4d, 0x27, 0xe6,
- 0x6f, 0x70, 0x10, 0xec, 0x74, 0x2f, 0x6c, 0xc4, 0xea, 0x28, 0x07, 0xc9,
- 0x29, 0xfb, 0x37, 0x94, 0x0a, 0x4b, 0x75, 0x66, 0xab, 0xeb, 0x02, 0xfc,
- 0x6b, 0xc3, 0x81, 0x98, 0xf0, 0x38, 0x9d, 0x7c, 0xbc, 0x49, 0xcb, 0x29,
- 0x99, 0x43, 0x86, 0x5d, 0xc6, 0xf9, 0x3c, 0xaf, 0xd9, 0x25, 0xd8, 0x36,
- 0xa6, 0x69, 0xfb, 0x41, 0x43, 0x63, 0x9f, 0x18, 0x4b, 0xbf, 0xe2, 0x24,
- 0x81, 0xbc, 0xf6, 0x0d, 0x59, 0xd2, 0x90, 0xea, 0xa1, 0xbd, 0x6d, 0xbd,
- 0x0f, 0x07, 0xd7, 0x23, 0xa7, 0xac, 0xf6, 0x65, 0xa2, 0x8e, 0x73, 0x55,
- 0x10, 0xfa, 0x72, 0xca, 0xb2, 0xdd, 0x9d, 0xb9, 0xe4, 0x17, 0x11, 0x15,
- 0x91, 0x12, 0x9f, 0xbf, 0xcb, 0xee, 0x8c, 0xdd, 0x9c, 0x2f, 0x9d, 0xa0,
- 0xb4, 0xa2, 0x51, 0x75, 0xd1, 0x5c, 0x9d, 0xe8, 0x99, 0x84, 0x42, 0xe4,
- 0x32, 0x09, 0x3d, 0x07, 0x3c, 0x80, 0xea, 0xe1, 0x18, 0x63, 0xab, 0x6a,
- 0x88, 0x64, 0xfa, 0x54, 0xb8, 0x89, 0x23, 0xf3, 0xf3, 0xe5, 0x32, 0x9b,
- 0xcb, 0xfe, 0x5d, 0x34, 0xa5, 0x5b, 0x93, 0xfa, 0xf6, 0x59, 0x33, 0x67,
- 0x49, 0xaa, 0x68, 0x0d, 0xf7, 0x8c, 0x12, 0x0f, 0xd3, 0x5a, 0xaf, 0x24,
- 0xcd, 0x77, 0x36, 0x46, 0xd1, 0x23, 0xfb, 0xab, 0x61, 0xfb, 0x2b, 0xee,
- 0x33, 0xc1, 0x69, 0xda, 0xb8, 0xe5, 0xe1, 0x26, 0xff, 0xc9, 0xea, 0x55,
- 0x24, 0xfd, 0x5a, 0xc3, 0xf9, 0x5a, 0xb6, 0x5c, 0x61, 0xb2, 0x8c, 0x2d,
- 0xa3, 0xa6, 0x16, 0x25, 0xf9, 0x89, 0xca, 0xc2, 0x6c, 0x75, 0x63, 0x33,
- 0xb7, 0x89, 0x35, 0xa6, 0x81, 0x56, 0x22, 0xd2, 0xdc, 0x23, 0xcc, 0xce,
- 0xaf, 0xb4, 0x58, 0x3b, 0x2d, 0xce, 0xe6, 0x0d, 0x4d, 0x92, 0xfa, 0x85,
- 0x11, 0x63, 0xf1, 0x0b, 0x5a, 0x6e, 0xe8, 0x07, 0x5e, 0xd1, 0x2e, 0x27,
- 0x21, 0xb8, 0xb3, 0x5a, 0xcc, 0x38, 0x4c, 0xde, 0xe8, 0x8d, 0x8c, 0x19,
- 0x58, 0xc7, 0x2b, 0x44, 0x03, 0xf2, 0x18, 0xa7, 0x9c, 0xdf, 0x2d, 0x4e,
- 0xe4, 0x68, 0x8e, 0xcd, 0x42, 0x7c, 0x8d, 0x87, 0xbd, 0x64, 0x3b, 0x1b,
- 0x5e, 0x9a, 0x7b, 0xbc, 0x87, 0xa1, 0xf6, 0x0e, 0xf1, 0xe7, 0x3e, 0xfd,
- 0x79, 0xd0, 0xd3, 0xba, 0x04, 0x9f, 0xf6, 0xb8, 0xcc, 0xdb, 0x77, 0x51,
- 0xeb, 0x6a, 0xe7, 0xeb, 0x2d, 0xef, 0x12, 0x3c, 0xac, 0xb2, 0x9e, 0x32,
- 0x91, 0x93, 0x50, 0xdd, 0x52, 0x2a, 0x2c, 0xd8, 0x17, 0x71, 0x9d, 0xb1,
- 0x33, 0xc4, 0xac, 0x0d, 0x09, 0x48, 0xe4, 0x3f, 0xd4, 0x53, 0x35, 0xf9,
- 0x50, 0x66, 0x57, 0x69, 0x75, 0x95, 0xac, 0x6b, 0x66, 0x42, 0xc3, 0xb7,
- 0xed, 0xe1, 0x56, 0xf3, 0x5c, 0x9d, 0x6c, 0xf2, 0xe5, 0xa1, 0x18, 0x7d,
- 0x6e, 0x0b, 0xd9, 0xe1, 0x6c, 0x6e, 0xba, 0xe2, 0x26, 0xd1, 0xa7, 0x06,
- 0x52, 0x26, 0x10, 0x55, 0x0b, 0x70, 0x39, 0x93, 0xd7, 0x04, 0xbc, 0x3e,
- 0xf0, 0x73, 0xec, 0x16, 0xd0, 0x29, 0x51, 0xc6, 0x90, 0x64, 0x33, 0x43,
- 0x33, 0xd8, 0x74, 0x73, 0xec, 0x5c, 0xba, 0x8c, 0xa6, 0x3b, 0x59, 0x3d,
- 0x2f, 0x9f, 0x89, 0xdf, 0x56, 0xfe, 0x4d, 0xf7, 0xa9, 0x68, 0x60, 0x15,
- 0x27, 0xe1, 0x19, 0x55, 0xa0, 0xa1, 0x7b, 0xdd, 0xcf, 0xda, 0x24, 0x1f,
- 0x7d, 0xc5, 0x5c, 0xd6, 0xcb, 0x91, 0x12, 0xe5, 0xeb, 0xfc, 0x92, 0x6c,
- 0x8d, 0x98, 0x03, 0xc3, 0x6a, 0x2d, 0xbf, 0xfe, 0x90, 0x98, 0x19, 0x0f,
- 0xe0, 0x25, 0x5d, 0x57, 0x9b, 0xce, 0x88, 0x1e, 0x11, 0x8f, 0xd3, 0xf9,
- 0x25, 0xeb, 0x29, 0xe6, 0xd0, 0xb9, 0x47, 0x80, 0x36, 0x17, 0xde, 0x79,
- 0x8c, 0x71, 0xe4, 0x9d, 0xab, 0x11, 0x8f, 0xf3, 0x4e, 0x5c, 0x24, 0xdb,
- 0xe9, 0xc7, 0x74, 0x98, 0x9c, 0x1d, 0x8d, 0xce, 0xf1, 0x85, 0x15, 0xb2,
- 0x05, 0x76, 0x90, 0x4a, 0xd0, 0x1a, 0x2e, 0xbb, 0xad, 0xb3, 0x65, 0x15,
- 0x73, 0x4e, 0xf2, 0xdd, 0xd4, 0x74, 0x7b, 0x4a, 0xfc, 0xc0, 0x46, 0xaa,
- 0xfd, 0x38, 0x3f, 0x25, 0x1a, 0x50, 0x6e, 0x28, 0x1f, 0xb5, 0xe0, 0x43,
- 0x2b, 0x73, 0xf0, 0xa7, 0x3b, 0xd6, 0x55, 0xd3, 0x57, 0x5e, 0xb0, 0x71,
- 0xc2, 0x6a, 0x7d, 0x09, 0x1b, 0xa4, 0x52, 0xcb, 0xd1, 0xa7, 0x46, 0xa8,
- 0x2a, 0xc8, 0xb2, 0xc9, 0x8d, 0xc8, 0x47, 0xc7, 0x8c, 0x44, 0x59, 0xde,
- 0xa4, 0x25, 0x2d, 0x0b, 0x37, 0xb0, 0x19, 0x0d, 0xde, 0xb6, 0x1c, 0x81,
- 0xb5, 0x49, 0x66, 0xd4, 0xd0, 0x69, 0x44, 0x09, 0xe0, 0x3d, 0x51, 0xdb,
- 0x69, 0x26, 0x45, 0x2e, 0x71, 0xef, 0xd4, 0x84, 0x15, 0x34, 0x0d, 0x4f,
- 0xe4, 0x70, 0x91, 0x42, 0x59, 0x66, 0x3b, 0x9d, 0x0e, 0xbc, 0x3d, 0xfe,
- 0xc9, 0x37, 0xcb, 0x35, 0xf2, 0x8f, 0x22, 0xb7, 0x31, 0xb4, 0x2a, 0x5c,
- 0x33, 0xa0, 0xdf, 0x26, 0xc7, 0xde, 0xe3, 0xbd, 0xa6, 0x03, 0x9b, 0x98,
- 0xcd, 0x18, 0x00, 0x59, 0xf2, 0x02, 0x7f, 0x3e, 0x40, 0x2a, 0x73, 0xaa,
- 0x06, 0xbd, 0x22, 0xc1, 0x4e, 0x16, 0xa0, 0xec, 0x8d, 0x69, 0xc8, 0xe7,
- 0xe0, 0xf6, 0x22, 0x76, 0x1b, 0x42, 0xf0, 0xf5, 0x93, 0x57, 0x28, 0x2c,
- 0x3b, 0x7e, 0xfb, 0x0d, 0xb1, 0xc0, 0xf9, 0xde, 0x3e, 0x85, 0x95, 0xac,
- 0xf1, 0x30, 0xa5, 0x2f, 0x54, 0xec, 0x46, 0xa0, 0xa4, 0xca, 0x55, 0xa8,
- 0xf8, 0xd2, 0x8d, 0xd0, 0x27, 0x39, 0x8a, 0x78, 0x20, 0x25, 0x35, 0x4f,
- 0x3f, 0xdd, 0xfd, 0x15, 0x18, 0xa2, 0xc7, 0x7d, 0xa1, 0xa0, 0x38, 0x66,
- 0x3e, 0x66, 0x77, 0xee, 0x6f, 0x44, 0x55, 0x8f, 0xd4, 0xee, 0xe1, 0x17,
- 0x1e, 0x8d, 0xfe, 0x72, 0x88, 0xc4, 0x69, 0x24, 0xa4, 0xfe, 0xfc, 0x10,
- 0xda, 0xc7, 0xaf, 0xc4, 0x90, 0xf2, 0x11, 0x67, 0x0b, 0xb9, 0xb9, 0x34,
- 0x8b, 0x8c, 0x23, 0xfe, 0x2c, 0xe3, 0xa5, 0xac, 0x0f, 0x15, 0x7f, 0xe0,
- 0xf6, 0x74, 0x69, 0x55, 0x92, 0x01, 0x27, 0xba, 0x51, 0xf2, 0x61, 0x9b,
- 0xf6, 0x93, 0x62, 0x2e, 0x49, 0x29, 0x8d, 0x0f, 0xfb, 0x96, 0x2b, 0x69,
- 0xf4, 0xfb, 0x72, 0xc5, 0xe1, 0x88, 0xb2, 0xb4, 0x61, 0x35, 0xba, 0x7d,
- 0x1c, 0xac, 0x4e, 0x4d, 0x39, 0x0d, 0xf6, 0x66, 0x74, 0xaf, 0x51, 0x6c,
- 0x9b, 0x66, 0xc6, 0x8a, 0xd2, 0x30, 0x51, 0x97, 0x5e, 0x87, 0xfa, 0x8f,
- 0x0c, 0x5d, 0x25, 0x2e, 0xd4, 0x61, 0x78, 0x9a, 0x2c, 0xd1, 0x1a, 0xde,
- 0x26, 0x23, 0xe6, 0xca, 0x5c, 0x14, 0x44, 0x2e, 0xce, 0x09, 0xe3, 0x17,
- 0x9c, 0x6a, 0xd0, 0x76, 0x47, 0xa9, 0xb2, 0xcd, 0xbc, 0x47, 0x25, 0x9a,
- 0x49, 0xcf, 0xa3, 0x47, 0x2f, 0x1a, 0xbf, 0xa8, 0x39, 0xec, 0x29, 0xe7,
- 0x27, 0xbf, 0x06, 0xe1, 0x94, 0x77, 0xe8, 0x92, 0x0e, 0x37, 0x14, 0xd1,
- 0x47, 0xf3, 0xdf, 0x25, 0xbc, 0x62, 0xbf, 0x8b, 0x30, 0x64, 0x94, 0x17,
- 0x91, 0xa1, 0x27, 0x71, 0x0f, 0x52, 0x60, 0x50, 0x9d, 0x21, 0x05, 0x74,
- 0xf3, 0xbb, 0x87, 0x1b, 0x74, 0x98, 0x12, 0xe4, 0x0b, 0x94, 0x54, 0x31,
- 0xe6, 0x62, 0xb6, 0x4e, 0x9b, 0x41, 0xa0, 0x20, 0xd4, 0x48, 0x25, 0xe1,
- 0x9b, 0x0a, 0xbe, 0xd7, 0x7c, 0xf2, 0x91, 0xc2, 0x2e, 0x72, 0x43, 0xf9,
- 0x0b, 0xd4, 0x7a, 0x02, 0xae, 0x85, 0x09, 0xb7, 0x00, 0x13, 0x80, 0x57,
- 0x18, 0x2c, 0x89, 0xcb, 0x39, 0x5f, 0xb2, 0xaf, 0xaf, 0xd3, 0xc7, 0x60,
- 0x66, 0xfb, 0xe1, 0xd5, 0xc9, 0xbb, 0x64, 0x1b, 0x69, 0x09, 0xe3, 0xb6,
- 0x91, 0xab, 0xd7, 0x7b, 0xb2, 0x9b, 0xd5, 0x93, 0xdd, 0xd5, 0xc7, 0x7c,
- 0xd7, 0x58, 0x9b, 0xd3, 0xf1, 0x8e, 0xe7, 0xb7, 0xa4, 0x4f, 0x82, 0x13,
- 0x23, 0xa6, 0x69, 0xe0, 0x7a, 0x74, 0xa6, 0x2a, 0x24, 0x91, 0xb5, 0x50,
- 0x89, 0x4a, 0xc4, 0xcd, 0x14, 0x9a, 0x91, 0x9c, 0x08, 0x8e, 0xe9, 0x90,
- 0x7b, 0x53, 0x52, 0x56, 0xda, 0x67, 0x95, 0x8b, 0x32, 0xc4, 0x91, 0xc3,
- 0x0e, 0x1c, 0xad, 0x24, 0x90, 0x0b, 0xc3, 0x29, 0xbf, 0x7d, 0xd4, 0x80,
- 0x80, 0x2a, 0x2b, 0x5c, 0x49, 0x53, 0xb8, 0x01, 0x23, 0x19, 0xa1, 0x49,
- 0x6f, 0xb8, 0xdb, 0xb3, 0x35, 0x2f, 0x86, 0xc4, 0x5c, 0xda, 0x65, 0x43,
- 0x5e, 0x86, 0xc1, 0x66, 0xeb, 0xca, 0x3a, 0x31, 0xc1, 0xc8, 0xba, 0x5d,
- 0xc3, 0xe8, 0x75, 0xee, 0x6d, 0xa7, 0x55, 0xba, 0x8c, 0x72, 0x4c, 0x07,
- 0xcb, 0x37, 0xd7, 0x65, 0x56, 0xb4, 0x59, 0xbd, 0x9f, 0x7a, 0x5e, 0xd5,
- 0x44, 0xe3, 0x34, 0xd4, 0x7e, 0x1c, 0x41, 0xae, 0x00, 0x73, 0x1d, 0xdb,
- 0x03, 0x3c, 0xcd, 0xe6, 0xf9, 0x22, 0x27, 0xd3, 0xcb, 0xed, 0x10, 0x66,
- 0x30, 0x88, 0x05, 0x07, 0xbd, 0x29, 0xfd, 0x14, 0x4e, 0x49, 0x8b, 0x91,
- 0x52, 0xfc, 0x9a, 0xa6, 0xe4, 0x4d, 0x22, 0x62, 0x35, 0x37, 0xa7, 0x64,
- 0xab, 0x99, 0x36, 0x84, 0x8c, 0x4f, 0xee, 0x51, 0xe5, 0x9d, 0x53, 0x44,
- 0xcf, 0x3c, 0x0b, 0x35, 0x23, 0xb1, 0x3e, 0x4e, 0xaa, 0xbd, 0xbd, 0xf6,
- 0x45, 0xe7, 0xf1, 0x54, 0x9f, 0x99, 0x2a, 0xb5, 0x6c, 0xf9, 0xfe, 0xdd,
- 0x49, 0xb2, 0x8d, 0xfa, 0xd6, 0x67, 0x4f, 0xf6, 0xf6, 0x77, 0xfc, 0x94,
- 0x12, 0x15, 0x00, 0xe1, 0xbd, 0x89, 0x40, 0xa8, 0x7f, 0xfa, 0x50, 0xd0,
- 0x20, 0x2a, 0x87, 0x1b, 0x78, 0x9a, 0x5d, 0xe7, 0x13, 0x14, 0x17, 0x53,
- 0x20, 0x9e, 0xf4, 0xff, 0x71, 0x66, 0x66, 0x19, 0x50, 0x9c, 0x7e, 0xc5,
- 0x6c, 0xd3, 0xe3, 0xf9, 0x1b, 0x23, 0xc9, 0xea, 0xca, 0x48, 0x19, 0x35,
- 0x4c, 0x50, 0x0b, 0xf5, 0xfc, 0x79, 0x93, 0xdb, 0x22, 0xed, 0xf0, 0x04,
- 0x61, 0x5d, 0x5c, 0xfc, 0x4b, 0x0a, 0x86, 0xac, 0x9b, 0x55, 0x7e, 0xa1,
- 0x96, 0x88, 0x5f, 0x1b, 0x3a, 0x46, 0xea, 0x49, 0x7b, 0x03, 0x65, 0x46,
- 0x3d, 0xdc, 0x24, 0x4b, 0xba, 0xdc, 0x53, 0x37, 0xa8, 0x25, 0xbf, 0xaf,
- 0x09, 0x35, 0x47, 0x0d, 0x3d, 0xe5, 0xc4, 0x37, 0x46, 0x73, 0x89, 0x0f,
- 0xf9, 0x4f, 0x71, 0x32, 0xb5, 0xa5, 0xa7, 0xec, 0x0f, 0xf6, 0x5e, 0xbc,
- 0x86, 0xe3, 0x4c, 0x0a, 0x43, 0x58, 0xdc, 0xda, 0xed, 0x0e, 0xee, 0x71,
- 0xf3, 0xfa, 0xae, 0x7f, 0x09, 0x35, 0xfd, 0x3e, 0x48, 0x63, 0x86, 0xa3,
- 0xe7, 0xa3, 0x38, 0x7a, 0xe8, 0x7a, 0xb6, 0x79, 0x1b, 0x11, 0x5f, 0xb1,
- 0xee, 0xdf, 0xbe, 0xd9, 0xa3, 0x49, 0x41, 0x96, 0xb5, 0x3f, 0x51, 0x22,
- 0x84, 0xf7, 0xb9, 0x61, 0x23, 0xdb, 0xb1, 0xc3, 0x93, 0xfd, 0x50, 0x01,
- 0x68, 0x25, 0x20, 0x4e, 0x72, 0xcc, 0xa3, 0xf6, 0xcb, 0x64, 0x60, 0xea,
- 0x49, 0xc0, 0x4e, 0x9f, 0x93, 0xec, 0xe7, 0x51, 0x70, 0x65, 0x57, 0x56,
- 0x17, 0x72, 0x9a, 0x1a, 0x8a, 0xd8, 0x88, 0x72, 0xa1, 0x45, 0x53, 0x72,
- 0x36, 0x35, 0xa7, 0x63, 0x36, 0xb7, 0x96, 0x2a, 0xfc, 0x93, 0xed, 0x53,
- 0xc9, 0x0c, 0x4f, 0xce, 0x5f, 0xff, 0x68, 0xab, 0xea, 0x92, 0xa8, 0x01,
- 0x4f, 0x8e, 0xa8, 0x3f, 0xd9, 0x30, 0xb0, 0x31, 0x2a, 0x90, 0xa2, 0x96,
- 0x4b, 0xb2, 0x27, 0xfb, 0x89, 0x28, 0x1c, 0xbe, 0xe3, 0xd2, 0x18, 0x41,
- 0xea, 0xde, 0x0b, 0xfa, 0x5d, 0x3b, 0xd6, 0x54, 0xb0, 0x25, 0xf3, 0xe5,
- 0x4f, 0xfc, 0x6b, 0xce, 0x73, 0xf9, 0xe9, 0x45, 0x7d, 0xb5, 0x5e, 0x8c,
- 0xcd, 0x5e, 0x2e, 0xeb, 0x2f, 0x7b, 0x1c, 0x69, 0x9d, 0x31, 0x35, 0xc1,
- 0x05, 0xdd, 0x66, 0x27, 0xe2, 0x23, 0x2c, 0xbe, 0x95, 0xc9, 0x9a, 0x64,
- 0xe3, 0xf9, 0xf5, 0x83, 0x84, 0xc2, 0x1e, 0xfb, 0xb2, 0x03, 0x55, 0xef,
- 0xbd, 0xe1, 0xcf, 0x9f, 0xde, 0xfc, 0xf9, 0xa7, 0xe7, 0x07, 0x8f, 0xd3,
- 0x67, 0xe9, 0xe4, 0xe9, 0xec, 0xf3, 0xf4, 0xc9, 0xf4, 0xc9, 0xb3, 0xe7,
- 0xfb, 0x9f, 0x3f, 0x49, 0x9f, 0x3d, 0x9e, 0xa5, 0x4f, 0xf7, 0xb2, 0xbd,
- 0xe7, 0xb3, 0xfd, 0x83, 0xe9, 0x74, 0x96, 0x7d, 0x3e, 0x7d, 0x96, 0xf6,
- 0x86, 0x64, 0x7e, 0xe9, 0xdc, 0x43, 0x51, 0x6b, 0x23, 0x6f, 0x66, 0x1d,
- 0xa3, 0x6f, 0x5f, 0x0e, 0xf6, 0x92, 0xab, 0xec, 0x56, 0x8f, 0x58, 0x33,
- 0xc0, 0x0e, 0xac, 0x05, 0xe4, 0xd4, 0x74, 0x2e, 0x56, 0x31, 0x0e, 0x92,
- 0xd7, 0x05, 0x7c, 0x25, 0x94, 0x5f, 0x4b, 0x34, 0x54, 0xa2, 0x72, 0x3a,
- 0x9d, 0x73, 0x1f, 0x1e, 0x26, 0xea, 0xb3, 0xc7, 0xba, 0xda, 0x87, 0xff,
- 0x14, 0x85, 0x67, 0x6f, 0xd2, 0x89, 0xd1, 0x91, 0x40, 0x12, 0x79, 0x72,
- 0x64, 0x6c, 0x5b, 0x23, 0xa9, 0xfb, 0x89, 0xfc, 0xc5, 0x98, 0x33, 0xde,
- 0x18, 0xdf, 0x94, 0xc5, 0x7a, 0x75, 0x5e, 0xcc, 0xf3, 0xc9, 0xdd, 0xa6,
- 0xe1, 0xfc, 0xc7, 0x1a, 0xbf, 0x38, 0x66, 0x01, 0x9e, 0x57, 0xd9, 0x3f,
- 0xd1, 0xb4, 0xf2, 0xc4, 0xf1, 0x03, 0x6c, 0xab, 0xc1, 0x24, 0x5f, 0x5d,
- 0x21, 0xce, 0xfb, 0x82, 0xd2, 0xfb, 0x8c, 0xbc, 0x93, 0x1f, 0xc4, 0x6d,
- 0xaa, 0x91, 0x1c, 0xc8, 0x4a, 0x76, 0x53, 0xdf, 0x16, 0x8d, 0x2b, 0xd7,
- 0xfa, 0x7c, 0xf5, 0x51, 0x49, 0x4a, 0x69, 0x1e, 0xf8, 0xf1, 0x28, 0x00,
- 0x24, 0x2f, 0x4b, 0xe6, 0x81, 0xcd, 0xc1, 0x64, 0xff, 0x85, 0xfc, 0x76,
- 0xc8, 0x35, 0x84, 0xeb, 0x15, 0xec, 0x0b, 0x42, 0xff, 0xa0, 0x9f, 0xb7,
- 0x0f, 0x1a, 0x26, 0x2f, 0x1c, 0xc3, 0x86, 0x88, 0xa1, 0xe8, 0xfb, 0x77,
- 0xa7, 0x87, 0x6d, 0x3a, 0x25, 0x28, 0x82, 0xae, 0x0e, 0x77, 0x77, 0x29,
- 0xe4, 0x73, 0x95, 0xde, 0xde, 0x0e, 0xab, 0x6c, 0x77, 0x5a, 0x4c, 0xaa,
- 0xdd, 0xaa, 0x9a, 0x2b, 0x35, 0x08, 0x99, 0xe0, 0x53, 0x7a, 0x73, 0x8b,
- 0x05, 0x89, 0xad, 0x6c, 0x3a, 0xa8, 0xaa, 0x20, 0x37, 0x08, 0x35, 0x3a,
- 0x9c, 0x79, 0x70, 0x2c, 0xf9, 0x68, 0x74, 0xd1, 0x0d, 0xf2, 0x25, 0x95,
- 0xd5, 0xe8, 0xcb, 0x44, 0x5e, 0xeb, 0x0d, 0xb1, 0x79, 0x39, 0xfd, 0x88,
- 0x1a, 0x96, 0x8a, 0xc0, 0xfe, 0x93, 0xef, 0xd0, 0x81, 0x4a, 0x5d, 0x94,
- 0xb6, 0x16, 0x94, 0x4a, 0x94, 0x37, 0x66, 0xf0, 0x3d, 0x6d, 0x39, 0x40,
- 0xec, 0x22, 0xe2, 0xf1, 0x7f, 0x75, 0x82, 0xa5, 0x89, 0x7b, 0xd2, 0xb9,
- 0x83, 0xda, 0x20, 0x3b, 0x86, 0x7b, 0x2f, 0x8b, 0xd2, 0x5c, 0x1e, 0x8b,
- 0x6a, 0x53, 0x01, 0x23, 0xab, 0x7d, 0xcd, 0x80, 0xe1, 0x34, 0xd3, 0x0f,
- 0x28, 0xf7, 0xd5, 0x04, 0x74, 0xf2, 0x2d, 0xe7, 0x1d, 0xb5, 0xef, 0x59,
- 0x41, 0xc1, 0xe8, 0x4c, 0x78, 0xb3, 0x3e, 0xb7, 0xf6, 0x4e, 0x77, 0x79,
- 0xdc, 0xd6, 0x4b, 0x17, 0x29, 0x09, 0xa5, 0xac, 0xb9, 0xca, 0xcd, 0x4a,
- 0xfb, 0x5e, 0xd0, 0xa8, 0xcc, 0xb8, 0xc8, 0xd5, 0x68, 0x1c, 0x65, 0x59,
- 0x78, 0x2a, 0xf0, 0xe0, 0x3b, 0x32, 0x45, 0xcd, 0x5d, 0x9a, 0x5f, 0x6a,
- 0x30, 0xbe, 0x33, 0x1b, 0xaf, 0x46, 0x86, 0xb3, 0x86, 0xda, 0x51, 0x24,
- 0x24, 0x8e, 0x0e, 0xcd, 0xe0, 0xac, 0x38, 0x05, 0xc7, 0xba, 0x1a, 0x9a,
- 0xf8, 0x13, 0x1e, 0x0c, 0x45, 0xf3, 0x15, 0xa4, 0x5d, 0x25, 0x7a, 0x90,
- 0xdd, 0x37, 0x1a, 0x99, 0x70, 0x00, 0x46, 0xa1, 0x4d, 0x6b, 0xdb, 0x86,
- 0x94, 0x96, 0x6b, 0x35, 0xc4, 0x18, 0x5a, 0x47, 0x7b, 0x3d, 0x67, 0xab,
- 0x46, 0x05, 0x68, 0x4e, 0xe0, 0x31, 0x29, 0x65, 0xff, 0xc7, 0xd4, 0x80,
- 0xc2, 0x8b, 0xe8, 0xd2, 0x80, 0xe1, 0x0d, 0x59, 0xdb, 0x04, 0x4b, 0x2d,
- 0xb7, 0x26, 0xed, 0xc1, 0xc8, 0x2b, 0x73, 0x45, 0x22, 0x31, 0x1d, 0x98,
- 0x41, 0xf3, 0xc2, 0xe9, 0x63, 0x52, 0xe6, 0x08, 0x50, 0x85, 0x61, 0x20,
- 0xe5, 0xa9, 0x70, 0x89, 0xb8, 0x80, 0xe1, 0x01, 0x26, 0x36, 0x9b, 0x9b,
- 0x58, 0x6f, 0xac, 0x11, 0x75, 0xba, 0x9b, 0x05, 0xe8, 0x83, 0xb6, 0x2f,
- 0xea, 0x48, 0x92, 0xe4, 0x7d, 0xc6, 0x6b, 0xc8, 0x09, 0x8d, 0x44, 0xb0,
- 0x2b, 0xb8, 0x10, 0x41, 0xfd, 0xe0, 0x55, 0x21, 0xf9, 0x9d, 0x98, 0x28,
- 0xe6, 0xc9, 0x73, 0x6c, 0x73, 0x96, 0xc5, 0xa5, 0x68, 0x98, 0x2e, 0x69,
- 0xe5, 0x52, 0xfa, 0x2b, 0x9b, 0xbd, 0xe5, 0x39, 0xea, 0x95, 0x9a, 0x31,
- 0x5b, 0x37, 0x2c, 0x8e, 0xa0, 0x99, 0x94, 0x99, 0x7e, 0x62, 0x59, 0xb4,
- 0x67, 0x25, 0xf3, 0x88, 0x65, 0xae, 0x6a, 0x09, 0x80, 0x37, 0x01, 0x2d,
- 0x05, 0xb0, 0xdb, 0x1c, 0xbf, 0x1a, 0x33, 0xf7, 0x80, 0xb3, 0x48, 0xdd,
- 0x1e, 0x92, 0x6f, 0x42, 0x8a, 0xeb, 0x78, 0xde, 0x87, 0x5c, 0x66, 0xfe,
- 0xc5, 0x4e, 0xcc, 0xab, 0xec, 0x0d, 0xe6, 0xd2, 0xdc, 0xcc, 0x59, 0x9d,
- 0xcc, 0x0b, 0x4a, 0x21, 0x14, 0xdf, 0x09, 0x03, 0x88, 0x70, 0xd9, 0xaf,
- 0x85, 0x15, 0x69, 0x0d, 0xc7, 0xcf, 0xf0, 0xf6, 0xcc, 0xac, 0x66, 0x22,
- 0x66, 0xad, 0x03, 0x3c, 0x21, 0xd5, 0xc4, 0x5a, 0x9e, 0x66, 0x72, 0x3f,
- 0xfd, 0x64, 0xb4, 0x0e, 0x63, 0x51, 0xb7, 0x86, 0xfb, 0xa9, 0xee, 0x27,
- 0x3f, 0x19, 0x5e, 0xfc, 0x89, 0xeb, 0x9a, 0x7e, 0xba, 0x86, 0xd1, 0x08,
- 0x77, 0x74, 0x35, 0x47, 0xac, 0x89, 0xd5, 0xf2, 0xa6, 0x13, 0x8f, 0xa1,
- 0x5d, 0x08, 0xbe, 0x21, 0x9e, 0xc8, 0xe5, 0xe5, 0x28, 0x23, 0x6f, 0xd3,
- 0x6c, 0xd7, 0x7a, 0xb1, 0x14, 0x53, 0x86, 0x99, 0x93, 0x8e, 0x3d, 0x5d,
- 0x1a, 0x5b, 0xbf, 0xdf, 0xf2, 0x18, 0x29, 0x4a, 0xbb, 0x12, 0x42, 0x9c,
- 0x2e, 0x6c, 0xba, 0xdb, 0x72, 0xef, 0x5e, 0x53, 0x1c, 0x14, 0xb2, 0x4e,
- 0x39, 0xbc, 0x6a, 0xe4, 0xee, 0x19, 0xdc, 0xf1, 0x54, 0x2e, 0xd6, 0xbe,
- 0xf4, 0x9d, 0xe1, 0x89, 0x22, 0xba, 0xd5, 0xd5, 0x5d, 0x05, 0x11, 0x2e,
- 0xd3, 0xb1, 0xba, 0x03, 0x66, 0x18, 0x4d, 0x93, 0x19, 0x39, 0x97, 0x1c,
- 0x3d, 0x40, 0x26, 0x9a, 0x91, 0x7e, 0x0d, 0xb9, 0x69, 0xe6, 0xb2, 0x35,
- 0xd8, 0xf2, 0xa2, 0x66, 0x9a, 0x5c, 0x13, 0xa4, 0xdc, 0xdb, 0x34, 0x6e,
- 0x97, 0xaa, 0x18, 0x7c, 0x92, 0xbc, 0x96, 0x82, 0x52, 0x81, 0x21, 0xbd,
- 0xf4, 0x48, 0x07, 0xd5, 0x83, 0x4a, 0xcf, 0x70, 0xfa, 0xfd, 0x88, 0x7b,
- 0x4a, 0x0a, 0xcc, 0xec, 0xbb, 0x79, 0xed, 0x05, 0x92, 0x06, 0x03, 0x02,
- 0x53, 0x5b, 0x31, 0x00, 0x1a, 0xd7, 0x37, 0x92, 0xa1, 0x42, 0x01, 0x56,
- 0xc4, 0x37, 0x02, 0x79, 0xab, 0x69, 0x83, 0xb5, 0xc5, 0xfe, 0xc2, 0x19,
- 0x07, 0xf8, 0xd6, 0xcd, 0x52, 0xe0, 0x91, 0x46, 0x05, 0x79, 0x71, 0x26,
- 0x94, 0xf7, 0x40, 0xb9, 0x35, 0x52, 0x7b, 0x16, 0xda, 0x8c, 0xb8, 0xf5,
- 0x02, 0x8d, 0x09, 0x73, 0xfa, 0x82, 0xc1, 0x63, 0xe2, 0x7a, 0x53, 0xaf,
- 0xfd, 0xc6, 0x0f, 0x36, 0x47, 0x82, 0x20, 0x46, 0x24, 0x1c, 0x64, 0xe6,
- 0xb0, 0x2d, 0x59, 0x77, 0x83, 0xbf, 0x51, 0x25, 0x91, 0x14, 0x7e, 0x69,
- 0x26, 0xef, 0x4e, 0xc2, 0xe9, 0xc4, 0x55, 0x24, 0x0f, 0xc0, 0xe5, 0x64,
- 0x79, 0x04, 0x76, 0x99, 0x4d, 0x39, 0x79, 0xbb, 0xe9, 0xee, 0x62, 0x8d,
- 0xd3, 0x7b, 0x3a, 0x08, 0xdc, 0xeb, 0xdb, 0x08, 0x21, 0xe1, 0x7b, 0xe2,
- 0xbe, 0xd6, 0xab, 0xc3, 0x9e, 0xe9, 0xd5, 0x9c, 0x00, 0xc9, 0xb4, 0x24,
- 0x86, 0x14, 0xa8, 0x80, 0x3a, 0x7b, 0x52, 0xcc, 0x5c, 0x13, 0x7a, 0x18,
- 0x25, 0x71, 0x8b, 0x96, 0xd0, 0xbb, 0x2a, 0x38, 0xed, 0xa8, 0x77, 0x88,
- 0xe2, 0x3e, 0x3e, 0x8b, 0xb2, 0x42, 0xb1, 0xd0, 0x42, 0x5f, 0x2d, 0xe5,
- 0x75, 0x7d, 0x7b, 0xf6, 0xe6, 0xd8, 0x65, 0xec, 0x62, 0x2c, 0xfa, 0x49,
- 0xcc, 0x57, 0x0b, 0xf3, 0xc8, 0xc8, 0x18, 0xe6, 0xa0, 0x34, 0xd0, 0xfd,
- 0x88, 0xbd, 0x32, 0x2a, 0x81, 0x5f, 0xdd, 0xac, 0xf3, 0xe9, 0xf6, 0x0e,
- 0xf8, 0x03, 0x65, 0x29, 0x03, 0x2a, 0x86, 0x62, 0x2b, 0xb2, 0x4a, 0xb6,
- 0x59, 0x9b, 0x2f, 0xb3, 0x7a, 0x5d, 0x2e, 0x59, 0x8b, 0x4a, 0x30, 0xfd,
- 0xb6, 0x49, 0x66, 0xae, 0x67, 0xb9, 0xef, 0x7c, 0x77, 0x82, 0xa0, 0x03,
- 0x72, 0xc6, 0x13, 0x0f, 0xb9, 0x03, 0x29, 0xa0, 0xf9, 0x15, 0xb4, 0xf7,
- 0x58, 0x4b, 0x70, 0x7f, 0x11, 0x2d, 0x14, 0xdb, 0xea, 0xe5, 0xf9, 0xf9,
- 0xab, 0x97, 0x17, 0x2f, 0xed, 0xda, 0xe8, 0x82, 0x26, 0xc9, 0x42, 0xfa,
- 0xb4, 0x11, 0x43, 0x02, 0x55, 0x92, 0x6c, 0xfd, 0xe1, 0xfd, 0xe8, 0xf8,
- 0x5d, 0x7b, 0x63, 0xcf, 0xdf, 0x9d, 0x01, 0x75, 0xe4, 0x0f, 0x3f, 0xbd,
- 0x5c, 0xad, 0xe6, 0x1a, 0x42, 0x7c, 0x95, 0xd6, 0xe9, 0x56, 0x70, 0xaa,
- 0xf7, 0x0d, 0xaf, 0x99, 0xf9, 0x69, 0x62, 0x9a, 0x46, 0x41, 0xcb, 0x8c,
- 0x5d, 0xa9, 0xc9, 0x10, 0x7b, 0x5a, 0x4e, 0x84, 0x4f, 0x78, 0xb5, 0xba,
- 0x9d, 0xfd, 0xd0, 0x4b, 0xec, 0x2d, 0xa4, 0x70, 0x92, 0x4c, 0xd3, 0xce,
- 0x94, 0x56, 0x73, 0x63, 0x91, 0x67, 0x93, 0x75, 0xad, 0x4c, 0x4f, 0xfc,
- 0x05, 0x28, 0x9a, 0x36, 0x5d, 0xdc, 0xfe, 0xe8, 0x06, 0xf5, 0x13, 0x1b,
- 0x74, 0x61, 0x39, 0x40, 0x58, 0x48, 0x86, 0xdb, 0x28, 0xa5, 0xda, 0xce,
- 0x56, 0xfc, 0x3c, 0xa1, 0x21, 0x4d, 0x41, 0x18, 0x42, 0x46, 0xe2, 0x29,
- 0x05, 0x04, 0xf9, 0xbd, 0x39, 0x8f, 0x83, 0xe4, 0x58, 0xea, 0xe2, 0x68,
- 0xd9, 0xe6, 0x07, 0xc1, 0x43, 0xb5, 0x35, 0x36, 0x44, 0xd8, 0xc7, 0x65,
- 0x85, 0x07, 0x18, 0xd6, 0x6b, 0x5f, 0x01, 0x5c, 0x01, 0x6b, 0x1e, 0xc2,
- 0xa4, 0x41, 0x72, 0x41, 0x81, 0x0b, 0x53, 0xa4, 0x06, 0xe9, 0x25, 0xb8,
- 0xeb, 0x0b, 0xc0, 0x58, 0x20, 0x69, 0x1c, 0xff, 0xda, 0xdd, 0x1b, 0x3e,
- 0xea, 0x85, 0x93, 0xc7, 0x61, 0x91, 0xea, 0x7b, 0x89, 0xc1, 0x41, 0x16,
- 0xd6, 0x45, 0x71, 0xef, 0xfc, 0x58, 0x84, 0x19, 0xfd, 0x74, 0x65, 0xc6,
- 0x8f, 0x4e, 0x65, 0x70, 0x16, 0xe4, 0x8c, 0x20, 0xd3, 0xb7, 0x54, 0xa1,
- 0x68, 0x64, 0xe2, 0xb2, 0xa0, 0xda, 0x7d, 0xc3, 0x6a, 0xf3, 0x79, 0x03,
- 0x9b, 0xaf, 0x17, 0x27, 0xf3, 0x92, 0x10, 0x32, 0xb3, 0x36, 0xb5, 0x37,
- 0x14, 0x26, 0xf9, 0xfa, 0x9d, 0xcd, 0x90, 0x25, 0x8b, 0xd3, 0x72, 0x81,
- 0x97, 0x39, 0xcb, 0x32, 0x32, 0x82, 0x9d, 0x53, 0x35, 0xed, 0x37, 0xb2,
- 0xd2, 0x07, 0x18, 0x06, 0x5a, 0xe9, 0x0b, 0x2e, 0x6a, 0x0f, 0x2c, 0xff,
- 0x37, 0xe9, 0x6d, 0xbe, 0x58, 0x2f, 0xb8, 0xc0, 0x9e, 0x15, 0x5d, 0x79,
- 0x52, 0x2f, 0x46, 0xf8, 0x74, 0x38, 0xa1, 0x05, 0x9b, 0xba, 0x55, 0x79,
- 0x0e, 0x80, 0xc8, 0x25, 0x63, 0x2e, 0x65, 0xb5, 0x5b, 0xa5, 0xae, 0x70,
- 0x91, 0xd7, 0x55, 0xcb, 0x71, 0x60, 0x94, 0x83, 0x14, 0xe9, 0x09, 0x40,
- 0x64, 0xcb, 0x35, 0x59, 0x34, 0x26, 0xce, 0x19, 0xf1, 0xc9, 0x8b, 0x7e,
- 0x69, 0x8a, 0x6b, 0x56, 0xe6, 0xc5, 0xd4, 0x1e, 0x1b, 0xe8, 0x90, 0xf9,
- 0x72, 0x6d, 0x08, 0xcd, 0xae, 0xe7, 0x5a, 0x7f, 0x13, 0xf8, 0x13, 0x29,
- 0x03, 0x7f, 0x44, 0xa5, 0x15, 0x9a, 0xae, 0xfa, 0x6c, 0x78, 0xb0, 0x0f,
- 0x78, 0x1b, 0xdf, 0xfc, 0x17, 0x60, 0x2c, 0x18, 0x9f, 0xf9, 0xc2, 0x96,
- 0xa5, 0x0e, 0xff, 0x69, 0x6e, 0x1e, 0x14, 0xe4, 0x0e, 0x16, 0xe9, 0x2d,
- 0x6d, 0x5f, 0x74, 0x5b, 0x8b, 0xe4, 0xc5, 0xb7, 0x67, 0xa3, 0x8b, 0xbd,
- 0xc3, 0xf3, 0xb3, 0x77, 0xe6, 0x4f, 0xfc, 0x7d, 0x9f, 0xfe, 0xbe, 0x1f,
- 0x58, 0x95, 0x04, 0x8e, 0x96, 0x26, 0xb6, 0xb4, 0xc7, 0xd5, 0x90, 0x89,
- 0x75, 0xe3, 0x0d, 0x04, 0x65, 0x1a, 0x52, 0x50, 0x37, 0x2b, 0xe2, 0xca,
- 0xf6, 0x3e, 0xa5, 0x29, 0x79, 0xc3, 0x24, 0xcc, 0x2e, 0xcc, 0x6b, 0x55,
- 0xa5, 0xa4, 0x60, 0x5e, 0x8b, 0xf1, 0xdb, 0x16, 0x3b, 0x97, 0x3b, 0x4b,
- 0x31, 0x8f, 0xa2, 0xf4, 0x52, 0x26, 0x59, 0xf3, 0x57, 0x93, 0xb9, 0xd1,
- 0xed, 0x33, 0xa4, 0x9d, 0x4c, 0x33, 0x0e, 0xc8, 0xe0, 0x27, 0x31, 0xc3,
- 0x44, 0x6a, 0x85, 0x4a, 0x86, 0x5e, 0x6a, 0xcd, 0x8c, 0xb8, 0x52, 0xa3,
- 0x40, 0x66, 0x3e, 0x29, 0xc1, 0xdf, 0x48, 0x0d, 0x4c, 0x50, 0x4f, 0x40,
- 0x79, 0xb2, 0xbe, 0xc7, 0xeb, 0xa4, 0xe6, 0x9a, 0xfc, 0xb7, 0x67, 0x17,
- 0x49, 0x3a, 0x9b, 0x71, 0x71, 0x68, 0xc6, 0x20, 0x73, 0xd0, 0x58, 0x77,
- 0x19, 0x22, 0x87, 0x8f, 0x4e, 0x24, 0xd1, 0x43, 0xf4, 0x91, 0x8b, 0xd3,
- 0xd1, 0x2e, 0xfc, 0x5d, 0x9c, 0x32, 0x37, 0x7a, 0x7b, 0xd2, 0x6f, 0x38,
- 0xb7, 0xfd, 0x44, 0x99, 0x1d, 0xdc, 0x94, 0x72, 0x8d, 0xb6, 0x69, 0xe7,
- 0xdd, 0x85, 0x16, 0x3e, 0x6c, 0x98, 0xf4, 0x68, 0x43, 0x7b, 0xac, 0x63,
- 0xf6, 0x68, 0x5f, 0x7b, 0x89, 0x0b, 0xb2, 0xd2, 0x7c, 0x01, 0xee, 0x76,
- 0x17, 0x96, 0x95, 0x92, 0x33, 0x03, 0x38, 0x2a, 0x50, 0x3a, 0x7a, 0x30,
- 0x4b, 0xb0, 0x30, 0x5a, 0x54, 0x4f, 0x06, 0xde, 0xe7, 0x81, 0x69, 0x5c,
- 0xf3, 0x77, 0x0c, 0x4b, 0x4c, 0x3b, 0xce, 0x62, 0xf6, 0x05, 0x7d, 0xc7,
- 0x0d, 0x6d, 0xc7, 0x36, 0x13, 0x83, 0x4f, 0x51, 0x3d, 0xde, 0xc2, 0x1c,
- 0x46, 0xba, 0xc0, 0xd2, 0xcb, 0x2f, 0x91, 0x55, 0xd0, 0x2e, 0x34, 0x73,
- 0x13, 0x09, 0xfc, 0x58, 0xd0, 0xc7, 0xaa, 0xba, 0xe7, 0xf9, 0x12, 0xea,
- 0x20, 0x9d, 0x9f, 0x92, 0x4c, 0x4b, 0xb5, 0x67, 0x74, 0x42, 0xc0, 0xce,
- 0xa8, 0x23, 0x7a, 0x3c, 0x89, 0xde, 0x45, 0x8a, 0x5b, 0xc7, 0xc6, 0x8b,
- 0xb4, 0x4a, 0x48, 0x0f, 0x12, 0x61, 0xf9, 0x09, 0x90, 0x96, 0x18, 0x9d,
- 0x14, 0x64, 0x6a, 0x0f, 0xc7, 0x20, 0xb4, 0x29, 0xfc, 0x5c, 0x13, 0xca,
- 0xcc, 0xef, 0xed, 0xed, 0x3f, 0x1b, 0x3e, 0x32, 0xff, 0x67, 0xf6, 0x45,
- 0xf4, 0x23, 0x42, 0xbd, 0x74, 0xd8, 0x86, 0xf6, 0xc9, 0xec, 0xb6, 0xcd,
- 0x92, 0x7c, 0x01, 0x15, 0xe5, 0x65, 0x6f, 0xf8, 0xe0, 0x4b, 0x05, 0x1b,
- 0x69, 0x2f, 0x94, 0x74, 0x2a, 0x3f, 0xd1, 0x33, 0x5e, 0xae, 0xe7, 0x91,
- 0x24, 0x40, 0xcf, 0xe9, 0x0c, 0xed, 0x6c, 0x7e, 0x2d, 0x2e, 0xe7, 0x6f,
- 0x21, 0x9b, 0xb8, 0xea, 0x6f, 0xd8, 0x48, 0xa1, 0x7a, 0xde, 0xf0, 0x20,
- 0x1e, 0x89, 0xd5, 0x46, 0x82, 0x79, 0x60, 0x4e, 0xc3, 0x8b, 0x62, 0x36,
- 0xab, 0xb2, 0xba, 0x7d, 0x01, 0x1d, 0xc9, 0x23, 0xbb, 0xef, 0x08, 0xc9,
- 0xd9, 0xab, 0xce, 0x69, 0x02, 0x0b, 0x26, 0x69, 0xdd, 0x94, 0x5a, 0x3c,
- 0xdc, 0x30, 0x56, 0x92, 0xd0, 0x78, 0x82, 0x63, 0x17, 0xcc, 0x8c, 0x54,
- 0x42, 0x1f, 0xc0, 0xc2, 0xf8, 0xb5, 0xba, 0xed, 0x23, 0xf1, 0x31, 0x5f,
- 0xad, 0x60, 0xe0, 0x10, 0x56, 0xab, 0x45, 0xa2, 0xc2, 0x68, 0x14, 0xf3,
- 0x65, 0x44, 0x3a, 0x49, 0x2c, 0x34, 0x1a, 0xf2, 0x24, 0xd3, 0x2a, 0xb0,
- 0x71, 0x36, 0x0b, 0x43, 0x46, 0x1c, 0xce, 0xf7, 0x01, 0x70, 0x04, 0xb4,
- 0x63, 0x0a, 0xa8, 0x9b, 0x65, 0xca, 0x32, 0x06, 0x17, 0x8b, 0xc3, 0x85,
- 0x90, 0x52, 0xc1, 0x7e, 0xe4, 0xfc, 0xbb, 0x52, 0x2e, 0xeb, 0x87, 0x1b,
- 0x9d, 0xfc, 0xcf, 0x63, 0x87, 0xa4, 0x68, 0xa1, 0x0a, 0xb9, 0x36, 0x26,
- 0x56, 0x6a, 0x94, 0xf4, 0x06, 0x47, 0xc9, 0x80, 0x02, 0x55, 0x5e, 0x56,
- 0x4a, 0xd1, 0xf2, 0xc2, 0x92, 0xe1, 0x03, 0x3d, 0x82, 0x81, 0x8c, 0x76,
- 0x81, 0x0e, 0x10, 0x5e, 0x0d, 0x0c, 0xc6, 0x2d, 0xc4, 0xd6, 0x55, 0xd2,
- 0x11, 0xa9, 0xa5, 0xca, 0xce, 0xaf, 0x53, 0x61, 0x6d, 0x71, 0x37, 0x5f,
- 0x42, 0x67, 0x24, 0x05, 0x26, 0x28, 0xe0, 0xd0, 0xaa, 0x59, 0x46, 0x45,
- 0x59, 0xd7, 0xff, 0xc4, 0x48, 0x0b, 0x30, 0x4f, 0x06, 0x84, 0xc8, 0xeb,
- 0x31, 0xf5, 0x84, 0x99, 0x1a, 0xa0, 0xe4, 0x83, 0xbf, 0x1a, 0x23, 0xfb,
- 0x85, 0x3a, 0x2a, 0x3a, 0xf0, 0x03, 0xac, 0x4f, 0xa3, 0x90, 0x90, 0x0a,
- 0xf1, 0x86, 0x8d, 0xeb, 0x2a, 0xad, 0x19, 0x7d, 0x87, 0x30, 0xc3, 0x05,
- 0xf1, 0xbc, 0x7d, 0xe6, 0x67, 0xb5, 0xe0, 0xb6, 0xb8, 0x62, 0x71, 0x57,
- 0x6c, 0x39, 0x44, 0x58, 0x6b, 0xce, 0xa3, 0x54, 0x34, 0x8c, 0x8c, 0x22,
- 0x98, 0xb8, 0xc1, 0x9d, 0x9b, 0x2f, 0x07, 0x5c, 0x86, 0x2d, 0x0f, 0x52,
- 0xec, 0x0d, 0xd8, 0xb3, 0xc2, 0x8d, 0xbc, 0x3f, 0x6c, 0x85, 0xd7, 0x92,
- 0x86, 0x31, 0xe5, 0x72, 0x46, 0x7c, 0x33, 0x0a, 0xf3, 0x27, 0xf9, 0x27,
- 0xc6, 0xbe, 0xb2, 0x5f, 0x27, 0x3f, 0xd9, 0x47, 0xa3, 0x3f, 0x2f, 0xfb,
- 0xf8, 0x39, 0x15, 0xaf, 0x2a, 0xf5, 0x31, 0xd9, 0x3a, 0xe3, 0x10, 0x52,
- 0x44, 0x97, 0x6d, 0x3f, 0xe7, 0x39, 0x52, 0xde, 0x66, 0xb5, 0xa4, 0x99,
- 0xf0, 0xdc, 0xf9, 0xb8, 0x69, 0x2d, 0x98, 0x99, 0x44, 0x88, 0xf5, 0x47,
- 0xd9, 0x09, 0x8d, 0xba, 0x7e, 0x89, 0xf8, 0x32, 0xd0, 0x27, 0x5c, 0xa1,
- 0x7d, 0x73, 0x0e, 0x7a, 0xea, 0x97, 0xe5, 0xe9, 0xc7, 0x25, 0x82, 0x4e,
- 0x08, 0x7e, 0x9e, 0x7a, 0x1a, 0xe3, 0x49, 0x81, 0xc5, 0x08, 0xa0, 0x28,
- 0xa4, 0x1c, 0x0a, 0x28, 0x61, 0x94, 0xd9, 0xc5, 0xfe, 0x64, 0x5a, 0x83,
- 0x4d, 0x73, 0x89, 0xd4, 0x20, 0x7a, 0x35, 0xa8, 0x48, 0xb8, 0x29, 0xa7,
- 0xb6, 0x20, 0x5c, 0x26, 0x6a, 0xa4, 0xb0, 0xd8, 0x45, 0x37, 0x29, 0xb1,
- 0x9a, 0xfd, 0x44, 0x2c, 0x71, 0xc7, 0x4b, 0x95, 0x1c, 0x8c, 0x1d, 0x3b,
- 0x3b, 0x94, 0x9d, 0xa8, 0xbf, 0x56, 0x1e, 0x02, 0xcf, 0x9b, 0x8b, 0x65,
- 0xab, 0xf6, 0x8a, 0x51, 0x09, 0xb8, 0xc6, 0x12, 0x85, 0x49, 0x78, 0x73,
- 0x55, 0xcc, 0xd9, 0x2c, 0x6e, 0x5b, 0x88, 0xb6, 0x40, 0xd8, 0xa8, 0x56,
- 0x18, 0x07, 0x59, 0xc0, 0xe4, 0x6d, 0x06, 0xc7, 0xb5, 0x62, 0x27, 0x46,
- 0xc1, 0xcb, 0x52, 0xd4, 0x27, 0x69, 0x6d, 0xf5, 0x75, 0x3f, 0x48, 0x7a,
- 0x37, 0xe7, 0x7c, 0x5c, 0x54, 0xc2, 0x2f, 0x28, 0xc2, 0x35, 0x2c, 0x96,
- 0x96, 0x24, 0x96, 0x05, 0x47, 0x4b, 0x91, 0xd0, 0xad, 0x4e, 0xa6, 0x05,
- 0x41, 0xcb, 0xc0, 0xe3, 0x76, 0x9d, 0xa3, 0x78, 0xdd, 0xb0, 0x89, 0x51,
- 0x00, 0xe0, 0xa6, 0x25, 0xde, 0xa1, 0x41, 0x19, 0x27, 0xeb, 0x2a, 0xf7,
- 0x2a, 0xdc, 0xcd, 0x29, 0xbc, 0xc2, 0x9d, 0x9e, 0xd7, 0xeb, 0xb4, 0xde,
- 0x98, 0xde, 0xed, 0x17, 0x3d, 0x6d, 0x14, 0x4f, 0x4e, 0x7d, 0xe9, 0x42,
- 0x77, 0xe8, 0x88, 0x39, 0xfa, 0x1b, 0xf9, 0x02, 0xe7, 0xec, 0x3f, 0xef,
- 0x11, 0x4c, 0xe7, 0xa9, 0xc4, 0xd3, 0x7c, 0xe4, 0x28, 0x2a, 0xe0, 0x95,
- 0xfb, 0x44, 0xeb, 0xe4, 0x78, 0x4c, 0xbd, 0xee, 0x4f, 0x62, 0x69, 0x01,
- 0x14, 0x1f, 0x33, 0xf3, 0x99, 0xdf, 0xb9, 0x11, 0xbd, 0x0a, 0x5b, 0x4d,
- 0x08, 0xf7, 0x40, 0x7f, 0xed, 0x27, 0xda, 0x39, 0x4e, 0xbd, 0x91, 0x51,
- 0xc1, 0xf9, 0x9b, 0x87, 0xbd, 0x44, 0x21, 0xe0, 0xf9, 0x52, 0xa7, 0x71,
- 0xb5, 0xc4, 0x8b, 0xb4, 0x2d, 0x3f, 0x65, 0x82, 0xcf, 0x7f, 0x7b, 0x38,
- 0x34, 0x20, 0xd9, 0xfb, 0xe2, 0xfb, 0x97, 0xa7, 0xef, 0x8f, 0xf7, 0xfe,
- 0x94, 0xe0, 0x5f, 0xfb, 0xfc, 0xaf, 0xfd, 0x5e, 0x74, 0xbb, 0x8c, 0x94,
- 0xda, 0xfa, 0x62, 0x2b, 0xa9, 0xee, 0x16, 0xe3, 0x62, 0x6e, 0xb7, 0x4b,
- 0x68, 0xa1, 0x81, 0xb4, 0xbe, 0x5c, 0xe3, 0x5a, 0x8f, 0x24, 0x7e, 0xf2,
- 0xb6, 0xc8, 0xae, 0x24, 0x43, 0x47, 0xc5, 0x0d, 0x45, 0xf1, 0xfc, 0xca,
- 0xe3, 0x9a, 0xea, 0xb2, 0x55, 0x8a, 0x51, 0x34, 0xcf, 0x53, 0xe0, 0x82,
- 0x62, 0xd3, 0xca, 0x1d, 0xec, 0xca, 0x3f, 0x93, 0x22, 0x3a, 0xf8, 0x7e,
- 0x71, 0xbd, 0x2b, 0x7c, 0x81, 0x91, 0x47, 0xe2, 0x96, 0x0b, 0x46, 0x53,
- 0x94, 0xfe, 0x1a, 0xfc, 0x36, 0x74, 0x79, 0x43, 0x58, 0xc0, 0x76, 0xdc,
- 0x09, 0x58, 0xc1, 0x56, 0x99, 0x59, 0xd9, 0x4b, 0x6b, 0xa6, 0x77, 0xdb,
- 0xc3, 0x8d, 0x45, 0x77, 0xd1, 0x38, 0x13, 0xed, 0xc9, 0xe0, 0x94, 0xca,
- 0xa0, 0x35, 0xa3, 0xc3, 0x1d, 0x03, 0xf4, 0xb8, 0x28, 0x1a, 0x8d, 0x25,
- 0xda, 0x32, 0x4a, 0x01, 0x2a, 0x1b, 0x21, 0x41, 0x76, 0x36, 0x87, 0x18,
- 0x2d, 0x0c, 0x17, 0x63, 0x68, 0x33, 0xbf, 0x23, 0x14, 0xd0, 0x20, 0x97,
- 0x6b, 0x69, 0x74, 0xc9, 0x6d, 0x23, 0xde, 0x77, 0xfc, 0x38, 0xad, 0xee,
- 0x1e, 0x6d, 0x8b, 0x17, 0x59, 0xae, 0x36, 0x05, 0x0c, 0x6c, 0x55, 0xb3,
- 0x64, 0x61, 0x17, 0xde, 0x54, 0x6c, 0xa0, 0xd6, 0xbf, 0x7b, 0x85, 0x5d,
- 0x91, 0xef, 0x39, 0xf7, 0xb0, 0x9f, 0x3c, 0x4c, 0x5f, 0x05, 0xd0, 0x48,
- 0xb6, 0x1d, 0xef, 0x9b, 0xaf, 0xdf, 0xcd, 0xb3, 0x1d, 0xb5, 0x0d, 0xec,
- 0x95, 0xb7, 0xfb, 0xa6, 0xf8, 0xbb, 0x99, 0x7b, 0xaa, 0xf7, 0x46, 0xec,
- 0xe2, 0x94, 0x8b, 0x30, 0x5a, 0xaa, 0xcb, 0x57, 0xa5, 0x93, 0x32, 0x5c,
- 0x5b, 0xee, 0x0b, 0x8f, 0x86, 0x81, 0x4c, 0x2d, 0x32, 0x8c, 0x72, 0x86,
- 0xf4, 0xee, 0x80, 0x7f, 0x1a, 0x77, 0xa4, 0x7f, 0x2b, 0x2a, 0x41, 0x0c,
- 0x37, 0x17, 0x92, 0xd4, 0x63, 0xd9, 0x8c, 0xae, 0x9e, 0x88, 0x22, 0x1b,
- 0x28, 0x56, 0x1d, 0xb7, 0xd1, 0xf1, 0x6d, 0x56, 0x4e, 0x00, 0x4e, 0x61,
- 0x6e, 0xa1, 0xb5, 0xc8, 0x54, 0x05, 0xb7, 0xa3, 0xa0, 0x9c, 0x05, 0x59,
- 0xf2, 0x7c, 0x39, 0x4b, 0xe7, 0x55, 0xeb, 0xe4, 0x33, 0x4a, 0x97, 0x98,
- 0x18, 0xee, 0x18, 0x5a, 0x9c, 0x41, 0xbd, 0x25, 0x9b, 0x32, 0x44, 0x0b,
- 0xd3, 0x28, 0xa6, 0x10, 0x26, 0xf9, 0x31, 0x85, 0x75, 0x95, 0xd0, 0x27,
- 0xed, 0x9e, 0x0a, 0xcb, 0x30, 0xec, 0xa9, 0x4b, 0xba, 0x07, 0xcf, 0x32,
- 0x8a, 0x54, 0x77, 0x46, 0xa3, 0xdd, 0x1b, 0x02, 0xfd, 0xa0, 0x90, 0xc9,
- 0xf2, 0x4e, 0xb1, 0xa7, 0xb6, 0xe9, 0xea, 0x64, 0x0d, 0x51, 0xd1, 0x09,
- 0x29, 0x44, 0x19, 0xd6, 0x2f, 0xcf, 0x8b, 0x1b, 0x8a, 0xc4, 0x34, 0xc1,
- 0xcc, 0x35, 0x57, 0x82, 0xd3, 0xf0, 0x58, 0x38, 0x0f, 0xa0, 0x31, 0xf1,
- 0x77, 0xf5, 0xc0, 0x45, 0x39, 0x40, 0xa5, 0x4f, 0xab, 0x74, 0x29, 0x75,
- 0x69, 0x14, 0x35, 0x3b, 0x94, 0x59, 0xc7, 0x90, 0xc2, 0x84, 0x2a, 0x44,
- 0x56, 0x62, 0x29, 0x89, 0x15, 0x8f, 0x8b, 0xfa, 0xca, 0x4b, 0x5d, 0x05,
- 0x00, 0x20, 0x9c, 0x3d, 0xb3, 0x75, 0x4d, 0x96, 0x80, 0x9a, 0x83, 0xb5,
- 0x24, 0x27, 0x8b, 0xc7, 0x28, 0x48, 0x7d, 0xf8, 0x48, 0x40, 0x71, 0x45,
- 0xed, 0xa0, 0xf8, 0x91, 0x71, 0xbb, 0xe4, 0xf4, 0xf2, 0x0b, 0xb2, 0x82,
- 0x35, 0xa9, 0x04, 0xb9, 0x4d, 0x55, 0x05, 0xdc, 0x39, 0xca, 0x62, 0x35,
- 0x84, 0x0d, 0x50, 0x2a, 0x08, 0xbd, 0x00, 0x29, 0x3a, 0x6e, 0x3f, 0xb7,
- 0x19, 0x32, 0xc7, 0x19, 0x8f, 0x8c, 0xa5, 0x01, 0xdb, 0x7d, 0x2c, 0x7b,
- 0x53, 0xed, 0x48, 0xa2, 0x68, 0xc4, 0x33, 0x62, 0xd5, 0xd8, 0x8e, 0x03,
- 0xfb, 0x5f, 0xb6, 0x6c, 0x02, 0x4b, 0xcf, 0xb0, 0x39, 0xb5, 0x02, 0xa0,
- 0x66, 0x0a, 0x36, 0x97, 0x9e, 0xc8, 0x1d, 0x0a, 0xae, 0xd4, 0x05, 0xe1,
- 0x62, 0xc1, 0xde, 0xf5, 0x6a, 0xca, 0xb8, 0xac, 0x56, 0xd7, 0x27, 0x7d,
- 0xc9, 0x03, 0xcd, 0xac, 0x0a, 0x39, 0x8c, 0xf4, 0x81, 0x86, 0x90, 0x89,
- 0xe0, 0xea, 0xb4, 0xcf, 0xbf, 0x1f, 0x65, 0x69, 0xa8, 0xd2, 0xa2, 0x5a,
- 0xfb, 0xb2, 0xc1, 0xbc, 0x48, 0x37, 0xf0, 0xc0, 0xf0, 0x7e, 0x15, 0x8b,
- 0x56, 0xea, 0x25, 0x6e, 0x24, 0xfc, 0x5f, 0xd7, 0xcb, 0x49, 0x13, 0x92,
- 0x64, 0x50, 0xf4, 0x3d, 0xec, 0x4e, 0x09, 0xcf, 0xda, 0x6b, 0xa2, 0xcd,
- 0xf4, 0xf4, 0x21, 0x0b, 0xe2, 0x86, 0x32, 0xd2, 0x94, 0xa0, 0xbf, 0xe1,
- 0xdd, 0x71, 0x65, 0xb7, 0x57, 0xb9, 0xd9, 0xa3, 0x72, 0x72, 0x45, 0xf0,
- 0x03, 0xf0, 0x26, 0x65, 0x53, 0xbe, 0xdb, 0x03, 0x6d, 0x98, 0x5d, 0x35,
- 0x34, 0xaa, 0xe8, 0x63, 0x39, 0xa4, 0x11, 0x20, 0x46, 0x8a, 0xa5, 0x4a,
- 0xe8, 0x60, 0x9a, 0x3a, 0xcf, 0x30, 0x19, 0xec, 0x8a, 0xc4, 0x5f, 0x36,
- 0xaf, 0x32, 0xaf, 0x1e, 0xc0, 0xbe, 0xe7, 0xae, 0x4c, 0x32, 0xc5, 0x97,
- 0xe4, 0x9b, 0x25, 0x51, 0x16, 0x3b, 0xe1, 0x34, 0x15, 0x00, 0x10, 0xf1,
- 0x6c, 0x60, 0x59, 0x82, 0x4f, 0xee, 0x14, 0x97, 0x46, 0x5e, 0x6f, 0x63,
- 0xd3, 0xb4, 0x19, 0xf9, 0x48, 0xcc, 0x04, 0x1a, 0x0e, 0x42, 0x7a, 0x61,
- 0xee, 0x3b, 0x5e, 0xd8, 0x02, 0xae, 0xdc, 0x47, 0xcf, 0x9e, 0x3c, 0xc2,
- 0x11, 0x07, 0x26, 0x1f, 0x5f, 0x7c, 0x3c, 0x4f, 0x89, 0x8e, 0x05, 0x0e,
- 0x9e, 0x42, 0x77, 0x41, 0x00, 0x74, 0x94, 0xec, 0xb9, 0x76, 0xa2, 0x61,
- 0xb6, 0x83, 0x6f, 0x04, 0xf5, 0xdb, 0xd4, 0xb6, 0x0d, 0x01, 0x35, 0x43,
- 0x86, 0x59, 0x1d, 0xe4, 0x04, 0x7b, 0xac, 0xd3, 0xe4, 0xa8, 0xf9, 0x8c,
- 0x51, 0x82, 0x08, 0x62, 0x7a, 0x87, 0xfc, 0x54, 0xd7, 0x28, 0x23, 0x4a,
- 0x4e, 0x5f, 0xb3, 0x07, 0xfd, 0xe8, 0x1d, 0xfe, 0x06, 0xb9, 0xc0, 0x1e,
- 0x9a, 0x21, 0x1d, 0x32, 0xb4, 0x45, 0x23, 0x09, 0xfd, 0xe6, 0xfb, 0x76,
- 0x21, 0xe8, 0xf6, 0xd9, 0x68, 0xf7, 0xe0, 0xf9, 0xa3, 0x9d, 0x48, 0xd6,
- 0x34, 0x50, 0xac, 0x53, 0xcf, 0x95, 0xf6, 0x68, 0xf8, 0x68, 0xa7, 0x35,
- 0x1b, 0x90, 0x64, 0x03, 0x84, 0x8b, 0x36, 0x9e, 0x91, 0x73, 0xcb, 0x34,
- 0xf0, 0xea, 0xc5, 0x24, 0x73, 0xdb, 0x2f, 0x67, 0x7d, 0x97, 0x5d, 0x1b,
- 0xbe, 0x8d, 0x22, 0x44, 0x9c, 0xe6, 0x54, 0xdf, 0x94, 0x32, 0xfa, 0x94,
- 0x5e, 0x54, 0xa8, 0x18, 0x6f, 0xe6, 0x24, 0xd3, 0x23, 0x29, 0xa1, 0x35,
- 0x12, 0x0b, 0x84, 0x11, 0x9c, 0xca, 0x4c, 0xaa, 0xa4, 0xd4, 0x40, 0xca,
- 0x14, 0xf8, 0xe4, 0x0e, 0x1c, 0xcf, 0x21, 0xb9, 0xf7, 0x7c, 0xf8, 0xcc,
- 0xdf, 0x53, 0x18, 0x10, 0x83, 0xb4, 0x9a, 0xe4, 0x39, 0xdb, 0x48, 0x1d,
- 0xa6, 0x91, 0xe6, 0x5c, 0x12, 0x82, 0x1d, 0xe1, 0xd8, 0xe6, 0x29, 0x87,
- 0x7f, 0x1d, 0x46, 0x6a, 0x30, 0x2c, 0x14, 0x60, 0xc3, 0x63, 0xf7, 0x8e,
- 0x0b, 0xf4, 0xfd, 0x8a, 0x4d, 0x19, 0xab, 0xb2, 0x56, 0x6d, 0x8d, 0x0c,
- 0x3e, 0x14, 0x41, 0x4c, 0x8b, 0x40, 0x1d, 0x4a, 0xf3, 0x0c, 0xba, 0xd7,
- 0xaa, 0x02, 0x74, 0x8a, 0x9a, 0x32, 0xa4, 0x13, 0x09, 0x32, 0xae, 0x35,
- 0xcb, 0xac, 0x38, 0x91, 0x34, 0xa3, 0xaf, 0xfa, 0x5a, 0x1f, 0x5c, 0x7b,
- 0xaa, 0x6a, 0x1a, 0xd1, 0x2b, 0xb9, 0xef, 0x10, 0x45, 0xdc, 0x13, 0x59,
- 0x87, 0xd6, 0xc5, 0xd8, 0x94, 0x13, 0x6d, 0xbe, 0xc5, 0x40, 0x48, 0xd3,
- 0xbe, 0x52, 0x27, 0x02, 0x6f, 0x05, 0xf8, 0xee, 0x5b, 0xc2, 0x0d, 0x15,
- 0xb3, 0x7c, 0x99, 0xdd, 0x40, 0xbe, 0x57, 0xa2, 0x9b, 0x94, 0x65, 0x0e,
- 0x7f, 0x94, 0xe6, 0x2c, 0xa4, 0x94, 0x79, 0x98, 0xd1, 0x5d, 0x3f, 0x8d,
- 0x54, 0x97, 0x4f, 0xe8, 0x70, 0x56, 0x36, 0x6f, 0x7c, 0x49, 0xe0, 0x97,
- 0x40, 0xb8, 0x0b, 0x68, 0x43, 0xad, 0x93, 0x3c, 0xb4, 0xdb, 0xba, 0x99,
- 0x50, 0x02, 0x13, 0x80, 0xf3, 0xab, 0x19, 0x60, 0x4d, 0xc0, 0xb0, 0x15,
- 0x62, 0x3e, 0x10, 0xe1, 0x5e, 0x08, 0x66, 0xf7, 0x76, 0x70, 0x73, 0x73,
- 0x33, 0xc0, 0x81, 0x43, 0xae, 0x8f, 0xd4, 0x79, 0x0c, 0xbd, 0xed, 0xe0,
- 0x3b, 0xf7, 0xca, 0xc7, 0x71, 0x0b, 0x34, 0x52, 0x97, 0x73, 0x55, 0x8e,
- 0xf3, 0x9a, 0x8a, 0x0a, 0x85, 0xb9, 0xe8, 0x25, 0x29, 0xed, 0x93, 0xf9,
- 0x90, 0xc2, 0xa4, 0xce, 0xad, 0xc8, 0xe9, 0x73, 0xab, 0x21, 0x04, 0xac,
- 0x49, 0x9d, 0xa1, 0x84, 0x1e, 0x7d, 0x08, 0x0e, 0x93, 0xc1, 0xb7, 0x49,
- 0xef, 0x48, 0x16, 0x7c, 0x61, 0x1e, 0x39, 0x6c, 0xac, 0x85, 0x9f, 0x8d,
- 0xb6, 0x30, 0xe8, 0xfd, 0xca, 0x43, 0xac, 0x6e, 0x17, 0xee, 0xc0, 0xa5,
- 0x89, 0x38, 0x91, 0x8b, 0x87, 0xb3, 0x69, 0xd8, 0x5b, 0xc6, 0xa8, 0x6b,
- 0xb4, 0xf4, 0xb4, 0x92, 0x36, 0x86, 0x63, 0xe6, 0xbc, 0x0d, 0xc7, 0xb1,
- 0x4c, 0x6f, 0x36, 0x9e, 0x45, 0x81, 0x19, 0xf4, 0x4e, 0xa3, 0xf0, 0xf0,
- 0x9c, 0x1c, 0x68, 0x1e, 0x7b, 0x50, 0xfb, 0x19, 0x97, 0xd9, 0x19, 0xf6,
- 0x4b, 0x41, 0x8b, 0x30, 0x57, 0xcc, 0xc5, 0x96, 0xae, 0xe8, 0xb9, 0x5f,
- 0x6d, 0xa8, 0x84, 0x73, 0x8e, 0x66, 0xb7, 0x8a, 0x46, 0x34, 0xa5, 0x85,
- 0xa8, 0x4a, 0xcb, 0xb2, 0x5c, 0xf5, 0x4b, 0x04, 0x4d, 0xdf, 0x4b, 0x09,
- 0xe3, 0x5c, 0x4d, 0xf2, 0x15, 0x7a, 0x6b, 0x54, 0xe0, 0xdd, 0x58, 0xca,
- 0x28, 0x23, 0x0f, 0xe3, 0xa4, 0x2a, 0x44, 0x9a, 0xb8, 0xc1, 0xb2, 0x12,
- 0x8c, 0x4e, 0x79, 0xf8, 0x5c, 0xd2, 0x14, 0x83, 0xce, 0xbc, 0xe0, 0xa4,
- 0xba, 0xe4, 0xe8, 0x9b, 0x13, 0xca, 0x28, 0x37, 0xa2, 0x74, 0x29, 0x40,
- 0x3b, 0xb2, 0x04, 0x6e, 0x19, 0x69, 0x65, 0x8f, 0x31, 0x26, 0x6c, 0x91,
- 0x51, 0x68, 0x24, 0xa8, 0x09, 0xa3, 0x96, 0x8a, 0xe4, 0xc1, 0x8a, 0xc9,
- 0x21, 0xa7, 0xd7, 0x46, 0x8c, 0x53, 0x57, 0xa3, 0x10, 0xa7, 0x17, 0x7d,
- 0x5a, 0xe2, 0x64, 0x28, 0xa8, 0xe4, 0x70, 0x0c, 0xe9, 0x7e, 0x41, 0x02,
- 0xbb, 0x63, 0x58, 0xee, 0xbf, 0x99, 0x85, 0xb9, 0x74, 0xf2, 0xfd, 0x78,
- 0xaf, 0x5c, 0x66, 0xb8, 0x96, 0x7b, 0xc6, 0xd2, 0x2e, 0xf3, 0x3d, 0x10,
- 0x5c, 0x0b, 0xc6, 0x0e, 0xba, 0xb4, 0x63, 0x38, 0x2c, 0xec, 0xdf, 0x24,
- 0x81, 0xda, 0x48, 0x4b, 0x52, 0x3b, 0xb4, 0x5c, 0xd3, 0x1f, 0xca, 0x62,
- 0x09, 0x6a, 0x9e, 0x6d, 0x7c, 0x38, 0x6a, 0x6a, 0xf8, 0x05, 0x27, 0xd9,
- 0x7e, 0x95, 0x88, 0xff, 0x0b, 0xe9, 0xf8, 0x7e, 0x70, 0x8c, 0x84, 0x0d,
- 0x4d, 0x9e, 0x0b, 0xe1, 0x40, 0x86, 0xf8, 0x70, 0x1c, 0x37, 0xf5, 0xa8,
- 0xc7, 0x2c, 0x07, 0xc8, 0xfb, 0x8a, 0x7b, 0xb0, 0xfe, 0xae, 0x4d, 0xbc,
- 0x2f, 0xee, 0xa7, 0xde, 0x2f, 0x24, 0xde, 0x3d, 0xd4, 0xe3, 0xbe, 0x11,
- 0x9a, 0x80, 0xfb, 0x85, 0xe7, 0xf3, 0xa3, 0xfc, 0x11, 0xb6, 0xe5, 0xac,
- 0xef, 0xaf, 0x29, 0x65, 0x3c, 0x9b, 0xf5, 0x8b, 0xdf, 0x6c, 0xd7, 0x89,
- 0x1b, 0x75, 0xf6, 0xf1, 0xe1, 0x38, 0x0c, 0xb6, 0x6c, 0x96, 0xdb, 0x8b,
- 0x46, 0x4f, 0xaf, 0x0b, 0x70, 0xf2, 0xa4, 0x66, 0x56, 0xa6, 0xb3, 0x87,
- 0xcf, 0xc5, 0x87, 0xd3, 0x4a, 0x44, 0xd1, 0xeb, 0x83, 0xf5, 0x7d, 0xa5,
- 0x17, 0xff, 0xbd, 0x8b, 0xf3, 0x93, 0x71, 0x29, 0x5f, 0xc9, 0xf5, 0x5f,
- 0x6e, 0xc5, 0x93, 0xb6, 0x43, 0x5f, 0xa4, 0x1e, 0x1f, 0x01, 0xa2, 0x04,
- 0x2f, 0xaa, 0x36, 0xb0, 0xd3, 0x6f, 0x52, 0x0b, 0x50, 0x7b, 0x74, 0x15,
- 0x20, 0xb3, 0x81, 0x77, 0x39, 0xef, 0xdc, 0x63, 0xdd, 0x3b, 0x74, 0x84,
- 0x88, 0xee, 0xdd, 0xff, 0xe9, 0xeb, 0x73, 0x65, 0x09, 0xb4, 0x44, 0x71,
- 0xf2, 0x39, 0x6e, 0xb8, 0xcc, 0xb8, 0x3b, 0x0d, 0x65, 0xf2, 0x53, 0x09,
- 0x84, 0xb9, 0x4f, 0x3b, 0x66, 0x47, 0xf8, 0x07, 0xd3, 0x3e, 0x85, 0x70,
- 0xe7, 0x14, 0xe8, 0xce, 0x05, 0x60, 0xfe, 0x0b, 0xa7, 0xcb, 0x0c, 0xb0,
- 0xc4, 0x81, 0x2d, 0xc1, 0x21, 0x36, 0xdc, 0xc0, 0xa9, 0x96, 0x37, 0x5b,
- 0x6c, 0x39, 0xce, 0xbc, 0x55, 0x7b, 0xec, 0xd7, 0x7d, 0x35, 0x2a, 0xc2,
- 0xab, 0xdc, 0xed, 0x8d, 0x9b, 0x72, 0xef, 0xf3, 0xc6, 0x4d, 0xe9, 0xde,
- 0xe9, 0xbe, 0x23, 0xb9, 0xa3, 0xd5, 0x0e, 0x3e, 0x25, 0x89, 0x6e, 0x7e,
- 0x19, 0x0a, 0xbd, 0xcc, 0x15, 0xdf, 0xe8, 0x25, 0xa2, 0xd9, 0x1e, 0x51,
- 0xe4, 0x57, 0x2f, 0x64, 0xd2, 0x6f, 0x38, 0x2d, 0x28, 0x14, 0x47, 0xd6,
- 0x51, 0x32, 0x2e, 0x8b, 0x9b, 0x8a, 0xd4, 0x51, 0xb5, 0x50, 0x53, 0xce,
- 0xaa, 0xbd, 0x0a, 0x8a, 0xb2, 0x0d, 0x7d, 0xe7, 0xda, 0xd5, 0x76, 0x69,
- 0x06, 0x7f, 0x73, 0xca, 0x7d, 0x25, 0xb8, 0x3a, 0x18, 0x45, 0x56, 0xec,
- 0x25, 0xa8, 0xd6, 0xe3, 0x85, 0xb1, 0xcc, 0x8d, 0x72, 0x52, 0xb3, 0x2c,
- 0x13, 0xf1, 0x18, 0x14, 0x31, 0x53, 0x98, 0x50, 0xa2, 0xcc, 0xab, 0x58,
- 0xcc, 0x47, 0x14, 0x49, 0x0f, 0x09, 0xcb, 0xd3, 0x81, 0x7f, 0x85, 0xae,
- 0x7b, 0xc4, 0x59, 0x36, 0xa4, 0x45, 0xbd, 0xc6, 0x56, 0xe0, 0x91, 0xe0,
- 0xf4, 0x79, 0x6a, 0x1a, 0xb5, 0x66, 0x25, 0x58, 0x6b, 0x4b, 0x3b, 0xe8,
- 0x5c, 0xb6, 0xf1, 0x09, 0xe1, 0x76, 0xa5, 0x4d, 0x4d, 0x2b, 0x28, 0xec,
- 0xdd, 0xa4, 0x79, 0x41, 0x09, 0x81, 0x36, 0x24, 0x01, 0xa4, 0xd5, 0xba,
- 0x84, 0x67, 0x50, 0x94, 0xea, 0x7e, 0x0c, 0x66, 0x42, 0x63, 0x4c, 0x1a,
- 0x22, 0xb0, 0xf1, 0xd2, 0x86, 0xad, 0xa7, 0xcd, 0x1a, 0x30, 0x7e, 0x53,
- 0xa4, 0xb7, 0xa3, 0x8a, 0x84, 0x91, 0x45, 0x15, 0x1a, 0xb4, 0x99, 0x86,
- 0xc9, 0xcc, 0xe8, 0xd4, 0x27, 0x35, 0x25, 0x4f, 0x7b, 0xa0, 0xde, 0xc5,
- 0x14, 0x6c, 0xd7, 0xc3, 0xa4, 0x72, 0x9d, 0x2b, 0x54, 0xd3, 0x26, 0x98,
- 0x30, 0x82, 0x06, 0xa3, 0xd6, 0x15, 0x8d, 0x42, 0xaa, 0x48, 0xb8, 0x86,
- 0x9b, 0xc3, 0xcf, 0xb9, 0x58, 0xb6, 0x76, 0xc1, 0xb5, 0x55, 0x0e, 0x97,
- 0x56, 0xc3, 0x1c, 0x65, 0x53, 0x7b, 0x91, 0x95, 0x97, 0x1e, 0x28, 0x6d,
- 0x4c, 0x51, 0x4c, 0x3d, 0x94, 0xb8, 0x24, 0xf9, 0x1f, 0x03, 0xbe, 0x4f,
- 0x49, 0x28, 0xad, 0xd9, 0xf3, 0x4f, 0xbf, 0xd8, 0x42, 0x4b, 0x14, 0x12,
- 0x2b, 0xd3, 0x74, 0x99, 0xa3, 0x50, 0x7c, 0x30, 0x0d, 0x73, 0x6e, 0xe6,
- 0xf3, 0x2f, 0xe6, 0xc5, 0xba, 0xba, 0xdb, 0x4a, 0xa4, 0x8d, 0x90, 0x74,
- 0xde, 0xa0, 0x4a, 0x79, 0xd6, 0xdb, 0x91, 0x98, 0xbd, 0x5e, 0x7e, 0x54,
- 0xfb, 0x11, 0xb5, 0x0f, 0x15, 0xfb, 0x7d, 0x5b, 0xc3, 0x6d, 0x79, 0x5f,
- 0xfb, 0x1f, 0xfe, 0xd8, 0x31, 0x2a, 0x53, 0xb2, 0x00, 0x19, 0xcd, 0x0f,
- 0xb2, 0x99, 0x1b, 0xe1, 0xc8, 0x98, 0xd9, 0xac, 0xb8, 0x1b, 0x1a, 0x1c,
- 0xb2, 0xa3, 0xe2, 0xee, 0x60, 0x28, 0x60, 0x45, 0x05, 0x6f, 0x64, 0x84,
- 0x74, 0x14, 0xb4, 0xb8, 0x6b, 0x87, 0xe3, 0x53, 0xc9, 0xb9, 0x74, 0xf3,
- 0x73, 0xbf, 0x70, 0x51, 0x08, 0xc6, 0x50, 0x4d, 0xb6, 0x66, 0x45, 0x31,
- 0x4e, 0xcb, 0xad, 0x20, 0xb3, 0x91, 0x26, 0x4e, 0xa8, 0xed, 0x98, 0xfe,
- 0x94, 0x5d, 0x2b, 0xf0, 0xd5, 0x3a, 0x11, 0xfa, 0x15, 0xbf, 0x3b, 0x64,
- 0x3f, 0xaa, 0xf7, 0x8b, 0x48, 0x5a, 0xc1, 0x7c, 0x6a, 0x57, 0xe9, 0x7b,
- 0x90, 0x29, 0xd5, 0x9d, 0xca, 0x17, 0x9c, 0x59, 0x6f, 0xed, 0x7a, 0x29,
- 0x83, 0xc9, 0x6e, 0x06, 0x91, 0xd2, 0x45, 0x17, 0x5d, 0x42, 0xb2, 0x1e,
- 0xd2, 0xb0, 0x28, 0x05, 0x48, 0xb7, 0x89, 0x83, 0x28, 0xd6, 0xa4, 0xf6,
- 0x8e, 0x7c, 0x98, 0x98, 0x14, 0x13, 0x22, 0x4e, 0x68, 0x78, 0x47, 0x90,
- 0x24, 0x92, 0x24, 0xb5, 0x6e, 0x48, 0x88, 0xf3, 0xe5, 0x80, 0x77, 0x35,
- 0x39, 0xfb, 0xac, 0x7d, 0x5f, 0x75, 0x3b, 0x7f, 0x3d, 0xb0, 0x5d, 0x92,
- 0x98, 0x22, 0x32, 0x99, 0x34, 0x83, 0x13, 0x4d, 0xb6, 0xe3, 0x7f, 0x5e,
- 0x10, 0x0c, 0x34, 0xb9, 0x1b, 0x07, 0x11, 0x6e, 0x6b, 0x18, 0x8c, 0xd9,
- 0x3c, 0xbb, 0xe4, 0xf5, 0xbd, 0x38, 0x3d, 0xfe, 0xfe, 0xf8, 0x34, 0xb8,
- 0x09, 0xbf, 0x19, 0x8d, 0x76, 0x3f, 0x66, 0xe5, 0x98, 0x5a, 0xd1, 0x23,
- 0xb2, 0x91, 0xd0, 0x73, 0x36, 0x13, 0xcc, 0xbb, 0x1e, 0xb4, 0x5d, 0x1d,
- 0xc5, 0xfb, 0x53, 0x36, 0xc2, 0xc2, 0xbc, 0x12, 0xf9, 0xa4, 0x40, 0xc7,
- 0x53, 0x59, 0x92, 0xa4, 0x1c, 0xd2, 0x75, 0x37, 0x29, 0xb3, 0x29, 0x77,
- 0x69, 0x0f, 0x93, 0x0d, 0x09, 0x2e, 0x04, 0x2d, 0x1f, 0xb1, 0xa7, 0x9c,
- 0x6d, 0x4e, 0x21, 0x2e, 0xbb, 0x88, 0xe0, 0x8d, 0x15, 0x95, 0xe4, 0x27,
- 0xaf, 0xe4, 0x9b, 0x15, 0x47, 0x02, 0x41, 0x25, 0x06, 0x8c, 0xe3, 0x8b,
- 0xe0, 0xec, 0xbb, 0xc1, 0xcb, 0xd1, 0xe0, 0xd5, 0xf1, 0xe9, 0xf1, 0x37,
- 0x2f, 0x2f, 0x8e, 0x19, 0x26, 0x9d, 0xe1, 0x0c, 0xe3, 0x7a, 0x8b, 0x5c,
- 0xe1, 0xdf, 0x09, 0x59, 0x68, 0xfd, 0x80, 0xd8, 0xaf, 0x73, 0xe9, 0xef,
- 0xc2, 0x81, 0x72, 0xa6, 0x03, 0x19, 0x3a, 0x92, 0x70, 0x1c, 0x1f, 0xce,
- 0x9c, 0x86, 0xf9, 0x42, 0xa6, 0x1a, 0xac, 0x20, 0x9d, 0xdf, 0xa0, 0xcb,
- 0xdb, 0xfb, 0x25, 0xd2, 0xed, 0x73, 0x5b, 0x75, 0xca, 0xab, 0xf7, 0x9d,
- 0x3c, 0x8e, 0xb2, 0x8d, 0x0d, 0x26, 0xb8, 0xfb, 0x0e, 0xff, 0x86, 0xd6,
- 0x96, 0x93, 0x7e, 0xf2, 0x8a, 0x9e, 0x6c, 0x61, 0x97, 0x3b, 0xbc, 0x75,
- 0xf8, 0x38, 0xe5, 0x57, 0x11, 0x14, 0x14, 0x30, 0x10, 0x37, 0x1e, 0x66,
- 0x49, 0x8b, 0x0c, 0x06, 0x6e, 0xc0, 0x78, 0x95, 0x39, 0x18, 0x22, 0x16,
- 0x3d, 0xe3, 0x8c, 0x64, 0x3c, 0x79, 0xce, 0x88, 0xaf, 0x63, 0x19, 0xc1,
- 0x37, 0x39, 0xf7, 0xdb, 0xa3, 0xe4, 0x1e, 0x2a, 0x42, 0x1e, 0x52, 0x1e,
- 0xa2, 0xe6, 0x17, 0x18, 0xa6, 0xb1, 0xe9, 0x04, 0x56, 0xf6, 0x72, 0x2b,
- 0xc2, 0xb6, 0x16, 0x61, 0x51, 0xd1, 0x2d, 0x84, 0x7b, 0x41, 0xde, 0x30,
- 0xfa, 0x11, 0x77, 0x43, 0x11, 0x7b, 0x0a, 0x93, 0xfc, 0xb5, 0x6e, 0x2b,
- 0xe2, 0x27, 0x6d, 0xba, 0x42, 0x75, 0x5e, 0xc4, 0xac, 0xd1, 0xe4, 0xee,
- 0xa8, 0xd0, 0x90, 0xde, 0xf3, 0xde, 0x74, 0x59, 0x3c, 0x30, 0x5e, 0xfb,
- 0x54, 0x76, 0x87, 0x7e, 0x24, 0xdd, 0x0d, 0x6c, 0x26, 0x48, 0xd4, 0x3b,
- 0xef, 0x24, 0x46, 0xb3, 0x01, 0x02, 0x90, 0xe7, 0xf5, 0xaf, 0x61, 0x9b,
- 0x0a, 0x5b, 0x93, 0x37, 0xc8, 0x56, 0x01, 0x0a, 0xf8, 0xf6, 0x6b, 0xed,
- 0x58, 0xe2, 0xba, 0x06, 0x7a, 0xad, 0xdb, 0xbc, 0x46, 0x4b, 0xc7, 0xe7,
- 0xef, 0x2e, 0xe8, 0x23, 0xa7, 0xf8, 0x8b, 0xc4, 0xe6, 0xaa, 0x18, 0xa8,
- 0x9e, 0xb4, 0x14, 0xe1, 0xae, 0x98, 0x08, 0xa5, 0xb8, 0xbe, 0xa3, 0x92,
- 0xb0, 0xc8, 0x69, 0xaa, 0x02, 0xde, 0x2e, 0xc7, 0x81, 0x48, 0x1c, 0xd4,
- 0x08, 0xd8, 0x66, 0xe4, 0x98, 0x09, 0xa6, 0x20, 0xb0, 0x47, 0x34, 0x09,
- 0x4e, 0xb5, 0xd5, 0x98, 0xc7, 0x19, 0x7e, 0xa9, 0x6e, 0x3b, 0x4e, 0x05,
- 0x88, 0x4a, 0xde, 0xbe, 0xc2, 0xe1, 0xc0, 0xbe, 0xc3, 0xb0, 0x78, 0x33,
- 0x29, 0xa9, 0x75, 0x7d, 0x6a, 0xa6, 0x32, 0x6c, 0x2d, 0x95, 0xda, 0x7b,
- 0x01, 0xcb, 0x33, 0x0c, 0x71, 0x50, 0x63, 0x33, 0x71, 0xae, 0x49, 0xf2,
- 0x3a, 0x2d, 0xd8, 0xb5, 0x27, 0xa6, 0x7b, 0x8e, 0x32, 0xf0, 0xa9, 0xe6,
- 0x93, 0xbb, 0xa0, 0x14, 0xcb, 0x46, 0x4b, 0x32, 0x8b, 0xa4, 0x44, 0x85,
- 0x0b, 0x7d, 0x6d, 0x58, 0x73, 0x27, 0x91, 0x75, 0x56, 0xf2, 0x66, 0x12,
- 0xc0, 0x4c, 0x09, 0xa5, 0x96, 0xac, 0x94, 0x31, 0xeb, 0x25, 0x62, 0x71,
- 0x2c, 0x23, 0x67, 0xce, 0x10, 0xde, 0x76, 0x58, 0xa3, 0x55, 0xca, 0xb6,
- 0x45, 0xf4, 0x72, 0xf0, 0x46, 0x1b, 0x2b, 0xcb, 0xd8, 0x6e, 0x46, 0x80,
- 0xe5, 0x08, 0x56, 0xc8, 0x54, 0x98, 0x32, 0xd4, 0x69, 0x48, 0xf8, 0xad,
- 0x88, 0x71, 0x95, 0x08, 0x17, 0x17, 0x40, 0x69, 0xb0, 0x60, 0x47, 0xc2,
- 0x9c, 0xf3, 0xb6, 0xe3, 0xf5, 0x49, 0x03, 0xaa, 0xf7, 0xe4, 0xfc, 0xfa,
- 0x69, 0xb3, 0x52, 0x87, 0xb6, 0x8f, 0xae, 0xf7, 0x65, 0xfb, 0xd2, 0xcf,
- 0xb8, 0x3c, 0xc3, 0x7c, 0x9b, 0xa6, 0x0b, 0xcf, 0x8e, 0x8d, 0xd8, 0x82,
- 0x79, 0x82, 0xef, 0xbf, 0xa2, 0xc9, 0xe1, 0x3b, 0xf4, 0x02, 0x9d, 0x7b,
- 0xe0, 0x19, 0x5d, 0x6a, 0xd3, 0x28, 0x66, 0xe5, 0x71, 0x66, 0xbe, 0x97,
- 0xa3, 0xa3, 0x9e, 0x8f, 0xd1, 0x14, 0x2a, 0x1d, 0x95, 0x61, 0xc0, 0x89,
- 0xe0, 0xef, 0x43, 0x06, 0xe1, 0x5d, 0x0e, 0x79, 0xfa, 0xed, 0x28, 0x6d,
- 0x63, 0xab, 0xc1, 0x79, 0x5f, 0x42, 0x94, 0x94, 0x04, 0x19, 0xf4, 0x2f,
- 0x36, 0x04, 0xe4, 0x86, 0x30, 0xd2, 0x69, 0x8d, 0x9e, 0x4c, 0xab, 0xeb,
- 0xf8, 0x09, 0xaf, 0xae, 0xa3, 0x27, 0xfc, 0x01, 0xe7, 0xdc, 0x16, 0x83,
- 0x1b, 0x2a, 0x8c, 0xbe, 0xef, 0xc2, 0x96, 0xa0, 0x13, 0x2e, 0x47, 0xdc,
- 0xad, 0x8e, 0x02, 0xa6, 0xde, 0x31, 0xef, 0x3e, 0xe7, 0x51, 0x97, 0x7f,
- 0x70, 0xce, 0xcd, 0xf7, 0xe5, 0x70, 0x9f, 0xbf, 0x1c, 0x7d, 0xef, 0x1d,
- 0x6b, 0x8f, 0x05, 0xfa, 0x49, 0x0c, 0xd9, 0x4f, 0x12, 0xe0, 0x11, 0xf8,
- 0x65, 0xd6, 0xc1, 0x60, 0x51, 0x7e, 0xaf, 0xae, 0x1f, 0xc2, 0xef, 0x66,
- 0x26, 0x01, 0xbf, 0x07, 0x34, 0xde, 0xc4, 0xef, 0xfe, 0x46, 0x35, 0x73,
- 0x6b, 0x3d, 0x6e, 0x5f, 0x12, 0x87, 0x53, 0x1d, 0x48, 0x17, 0x9b, 0x73,
- 0x74, 0x90, 0x58, 0x3b, 0xcc, 0x38, 0xa4, 0x79, 0xfe, 0x32, 0x46, 0x37,
- 0x2f, 0x04, 0x8c, 0xae, 0xfb, 0x19, 0xe7, 0xf4, 0x2e, 0x46, 0xd7, 0xcc,
- 0xe3, 0x8c, 0x99, 0xdc, 0xe7, 0xf1, 0x90, 0xbf, 0x3d, 0xae, 0xf5, 0xeb,
- 0xc5, 0x43, 0x0a, 0x69, 0x26, 0x9a, 0x83, 0x3c, 0x70, 0x70, 0x0f, 0x11,
- 0x0c, 0x12, 0x35, 0x68, 0xb9, 0x6a, 0x36, 0xf4, 0xd0, 0x5b, 0xf4, 0x8e,
- 0x46, 0x91, 0x44, 0xa9, 0x1a, 0x36, 0x77, 0x6a, 0xc3, 0xa5, 0x4d, 0x06,
- 0xbf, 0x0f, 0x3d, 0x10, 0x76, 0x91, 0x6f, 0x40, 0x12, 0x65, 0xd1, 0x22,
- 0xf6, 0x2a, 0x43, 0x1e, 0x08, 0x61, 0x9b, 0xb5, 0xcf, 0x29, 0xd4, 0x3c,
- 0xd2, 0x06, 0xa0, 0xa8, 0x0c, 0xf2, 0xe5, 0x20, 0xcc, 0x96, 0xf6, 0x03,
- 0x3a, 0x75, 0x03, 0xdd, 0x1a, 0x95, 0x8c, 0xa4, 0xf0, 0x4a, 0xdc, 0x02,
- 0xca, 0xa8, 0x16, 0x51, 0xc2, 0xcd, 0xcf, 0x5d, 0xb2, 0x22, 0x75, 0xb7,
- 0x51, 0xd8, 0xb6, 0x66, 0x0f, 0x99, 0xba, 0x68, 0xf8, 0xd7, 0x9e, 0xb6,
- 0xa0, 0x91, 0xa7, 0xcb, 0x6a, 0x40, 0x06, 0xd4, 0x0c, 0x50, 0x1d, 0x2f,
- 0xec, 0x5f, 0x03, 0xfb, 0xe2, 0xd5, 0x5b, 0xc5, 0xe9, 0xf5, 0x60, 0x7a,
- 0xab, 0x8c, 0x0b, 0x49, 0x2e, 0x49, 0x72, 0x98, 0x47, 0x6c, 0x5d, 0xa0,
- 0x6d, 0xb2, 0xf8, 0x22, 0xea, 0xe3, 0xa1, 0x4f, 0x04, 0xd5, 0x7c, 0x29,
- 0x17, 0xe6, 0x18, 0x6b, 0x8e, 0x6c, 0x76, 0xac, 0xc0, 0xcd, 0x4d, 0x2b,
- 0xdf, 0xc9, 0x99, 0x14, 0xeb, 0xfa, 0x20, 0x05, 0x7c, 0x98, 0xc6, 0x8e,
- 0xb6, 0x7b, 0x5e, 0x31, 0xcc, 0xbb, 0xc0, 0x9a, 0x29, 0x48, 0x8d, 0xf6,
- 0xf8, 0xa6, 0x71, 0x23, 0x2e, 0xe3, 0x6d, 0x01, 0x62, 0x92, 0xac, 0xb2,
- 0x9d, 0x8d, 0xc6, 0x23, 0x08, 0xb8, 0xba, 0x7e, 0x3c, 0xc0, 0xc3, 0x62,
- 0x02, 0xdb, 0x9f, 0x3e, 0xa5, 0x9f, 0x0e, 0x03, 0x42, 0x07, 0x95, 0x36,
- 0xd2, 0x8f, 0x55, 0xd1, 0x2b, 0xc0, 0xf3, 0xeb, 0xe5, 0x14, 0xed, 0x3c,
- 0x68, 0xef, 0xb5, 0x3d, 0x03, 0x20, 0x18, 0xb5, 0x1d, 0x8e, 0xe2, 0x2c,
- 0x25, 0x01, 0x9c, 0x8b, 0xd1, 0x6d, 0xaa, 0xc6, 0xa6, 0x1f, 0x1c, 0x44,
- 0x36, 0xdd, 0xce, 0xf9, 0x85, 0x2c, 0x33, 0xbe, 0xe5, 0x8d, 0xdb, 0x65,
- 0x9c, 0x73, 0xd3, 0xac, 0x17, 0xf9, 0x6a, 0xa0, 0x6f, 0xf1, 0xe5, 0xb1,
- 0x48, 0x3f, 0xca, 0x95, 0xfe, 0x58, 0xf8, 0x60, 0x10, 0xa0, 0xb1, 0x70,
- 0xf3, 0x66, 0xaa, 0x13, 0x76, 0xeb, 0x6c, 0x30, 0x8d, 0xe8, 0x5b, 0xb5,
- 0x05, 0x42, 0x04, 0x53, 0xf0, 0x77, 0x62, 0xa5, 0x61, 0x9a, 0xc3, 0xed,
- 0x67, 0x3b, 0x68, 0x19, 0x08, 0xcd, 0xc4, 0xbe, 0x7b, 0xcf, 0xfe, 0x39,
- 0x26, 0xdb, 0xbc, 0x7f, 0x4a, 0xb3, 0xff, 0x1e, 0xfb, 0xf7, 0xf4, 0x93,
- 0xec, 0xdf, 0xd3, 0xff, 0x36, 0xfb, 0xf7, 0xf4, 0xbf, 0xbc, 0x7f, 0x8f,
- 0x83, 0xfd, 0x7b, 0xfa, 0xdf, 0x65, 0xff, 0xb4, 0x69, 0x9b, 0xee, 0x5e,
- 0x16, 0xec, 0xdf, 0x48, 0x32, 0x41, 0x14, 0xed, 0x0f, 0x94, 0xd6, 0xb7,
- 0x38, 0xee, 0x22, 0xa9, 0x90, 0xec, 0xd7, 0xd6, 0xba, 0x45, 0x46, 0x9b,
- 0xec, 0xe8, 0x82, 0x62, 0xeb, 0x2f, 0x74, 0xd0, 0x93, 0xf3, 0xc4, 0x4e,
- 0xc0, 0xdb, 0x06, 0x87, 0xc7, 0x45, 0x0a, 0x5a, 0xd4, 0xeb, 0x5c, 0xc1,
- 0x61, 0x69, 0xd6, 0xcf, 0x05, 0x98, 0x95, 0xab, 0x1d, 0x8e, 0x81, 0x6e,
- 0x19, 0xc2, 0x1d, 0xbe, 0x00, 0xb9, 0x06, 0xfc, 0xf8, 0x97, 0xd1, 0x9a,
- 0x38, 0x6a, 0x01, 0xed, 0xa6, 0x14, 0x8b, 0x34, 0x78, 0xa4, 0x73, 0xfb,
- 0x66, 0x03, 0x54, 0xde, 0xa6, 0xc5, 0xf6, 0xac, 0xad, 0xea, 0xd8, 0x1d,
- 0xbc, 0x7f, 0xcb, 0x8a, 0x2b, 0x82, 0xfc, 0x79, 0xf1, 0xfe, 0x5d, 0xe8,
- 0x7b, 0x33, 0x4b, 0x0d, 0xf1, 0x16, 0xcd, 0x76, 0x0d, 0x60, 0xdb, 0x0f,
- 0x08, 0x7a, 0xde, 0x9c, 0xc6, 0xb3, 0x6f, 0x77, 0x3c, 0x27, 0x10, 0x85,
- 0x21, 0x8a, 0x24, 0x72, 0xd0, 0xb8, 0x3a, 0xd7, 0xd6, 0xa0, 0x57, 0xfd,
- 0x56, 0x13, 0x42, 0xaf, 0xf5, 0xb0, 0x2a, 0x29, 0xe4, 0x1d, 0x91, 0xba,
- 0xde, 0x32, 0x68, 0x9a, 0x09, 0x65, 0x30, 0xaf, 0x16, 0x7c, 0x27, 0x02,
- 0x6d, 0x43, 0xef, 0x41, 0x9a, 0xd9, 0x3f, 0x33, 0x89, 0xef, 0xe9, 0x7e,
- 0x83, 0xaa, 0xaf, 0x48, 0x57, 0x5c, 0x2f, 0x56, 0x52, 0x81, 0x7c, 0x4f,
- 0x05, 0x66, 0xc2, 0x2d, 0x1e, 0xa9, 0xbc, 0x92, 0x9d, 0xf6, 0x52, 0x8b,
- 0xa4, 0x96, 0xb9, 0xad, 0xbe, 0xb0, 0x89, 0x5e, 0x1d, 0xf8, 0x69, 0x51,
- 0xc8, 0xaa, 0x8b, 0x76, 0x75, 0x17, 0x57, 0xce, 0x28, 0x66, 0x3b, 0xa4,
- 0xa4, 0xa7, 0x35, 0x4b, 0x31, 0x04, 0xc1, 0xcd, 0x44, 0xc1, 0x0b, 0x39,
- 0x5e, 0xb8, 0x94, 0xa0, 0x22, 0xe6, 0xcc, 0x28, 0x84, 0xe6, 0x55, 0x33,
- 0xcc, 0x50, 0x8a, 0xb1, 0x2a, 0x17, 0x77, 0xb6, 0xb3, 0x67, 0x00, 0xa8,
- 0x68, 0xdb, 0xad, 0x71, 0xc6, 0xf0, 0x58, 0x1c, 0x2d, 0x4e, 0x15, 0xde,
- 0x43, 0x55, 0x32, 0x14, 0xd5, 0x88, 0x97, 0xaf, 0xd1, 0xf7, 0x64, 0x30,
- 0x0e, 0x6b, 0xed, 0x1a, 0x95, 0x82, 0xbf, 0x23, 0xde, 0xe8, 0x28, 0xdc,
- 0x60, 0xd5, 0xcc, 0x73, 0x4c, 0x44, 0x4e, 0x92, 0x5f, 0x19, 0xd2, 0x55,
- 0x8c, 0x65, 0x17, 0x28, 0x4d, 0x30, 0xb8, 0xb3, 0x48, 0xd3, 0x25, 0xd5,
- 0x32, 0x92, 0x38, 0xa1, 0x37, 0xc8, 0x11, 0x14, 0x20, 0x82, 0xe8, 0x36,
- 0x36, 0x92, 0xc4, 0x39, 0x5f, 0xf8, 0x2a, 0xf3, 0x8b, 0xab, 0x2d, 0xae,
- 0x25, 0x87, 0x25, 0xb8, 0xd4, 0xc4, 0x50, 0x51, 0x92, 0x5b, 0x83, 0x2e,
- 0x46, 0x04, 0x9e, 0x20, 0x53, 0xef, 0x09, 0xd8, 0xd3, 0x9a, 0x17, 0xc1,
- 0x6d, 0x9c, 0x09, 0x8e, 0xe8, 0x9f, 0x58, 0xcc, 0xec, 0x25, 0x8f, 0xfb,
- 0x22, 0x2a, 0xbb, 0xe4, 0x90, 0xfe, 0xa6, 0xc4, 0x62, 0x5b, 0xc3, 0xac,
- 0x58, 0x7b, 0x70, 0xaa, 0xd9, 0xa0, 0x16, 0x79, 0x04, 0x97, 0x75, 0x59,
- 0xac, 0xee, 0x92, 0x6f, 0x52, 0x2c, 0x8b, 0xd4, 0xfa, 0x34, 0x5b, 0x04,
- 0x15, 0x6c, 0xdc, 0xad, 0x5c, 0xd4, 0x6c, 0xee, 0x5c, 0xae, 0x2b, 0x24,
- 0xbb, 0x80, 0xc9, 0x62, 0x98, 0xd5, 0xd0, 0x0b, 0xce, 0x64, 0x2d, 0x89,
- 0x25, 0x30, 0xad, 0xd1, 0xe8, 0x34, 0xb4, 0xe5, 0xb4, 0x55, 0xd2, 0x46,
- 0xe8, 0x02, 0x1a, 0x6d, 0xd0, 0x8e, 0x8e, 0xc8, 0xe0, 0x2f, 0xa2, 0x92,
- 0x43, 0xd6, 0x9d, 0xcd, 0x15, 0xdd, 0x43, 0xd1, 0xe9, 0x27, 0xe5, 0xdd,
- 0x0a, 0xc6, 0x17, 0xbf, 0x2c, 0xc7, 0x1c, 0xf3, 0x63, 0x64, 0xd9, 0x8d,
- 0xd5, 0xd1, 0xef, 0x2b, 0x0f, 0xa0, 0x9d, 0xee, 0x52, 0x84, 0xe4, 0x81,
- 0xb4, 0x0c, 0x0c, 0x2c, 0xb9, 0x5b, 0x71, 0xeb, 0x4c, 0x09, 0xf4, 0xa5,
- 0xb3, 0x71, 0x9a, 0xb4, 0x43, 0x1b, 0x36, 0xd1, 0xeb, 0xd8, 0x9c, 0x81,
- 0xa5, 0x45, 0x7d, 0x1d, 0x10, 0x4e, 0xd9, 0xd1, 0xfb, 0x5d, 0xde, 0x90,
- 0xea, 0xbe, 0xf6, 0xc9, 0xb0, 0x3d, 0x19, 0x52, 0x00, 0x41, 0x2c, 0x03,
- 0xc4, 0x19, 0x63, 0xe3, 0x5e, 0x0e, 0x04, 0x3b, 0xa3, 0x83, 0x4f, 0x3c,
- 0x2b, 0x55, 0x58, 0x97, 0x6b, 0x96, 0x29, 0x25, 0xcf, 0x3a, 0x1e, 0x49,
- 0xaa, 0x69, 0x32, 0x85, 0xc2, 0x82, 0x19, 0x71, 0x1b, 0xc4, 0x1c, 0x08,
- 0xed, 0xe5, 0xf8, 0x22, 0xbd, 0xf4, 0x82, 0x89, 0xad, 0x2c, 0x1b, 0x34,
- 0xb3, 0x35, 0xa2, 0x91, 0x5b, 0xb6, 0x4c, 0xcc, 0xdd, 0x64, 0x1e, 0x39,
- 0x99, 0x0d, 0xde, 0x9a, 0x65, 0x0f, 0x02, 0x80, 0x23, 0xf8, 0x26, 0xe4,
- 0xb6, 0x70, 0xf2, 0x8d, 0xf2, 0xab, 0x29, 0x21, 0x05, 0x5f, 0x1a, 0xc6,
- 0x30, 0x73, 0x26, 0x45, 0x29, 0xc0, 0x35, 0x48, 0x89, 0x31, 0x27, 0x8f,
- 0x92, 0x80, 0x2a, 0x8b, 0x47, 0xd0, 0xac, 0xd6, 0x75, 0x40, 0x96, 0x91,
- 0xc2, 0x62, 0xab, 0xa3, 0x0a, 0xc0, 0x22, 0xc5, 0xcb, 0xa7, 0x59, 0x85,
- 0x7e, 0x4d, 0x3c, 0x81, 0xe4, 0xa5, 0x2f, 0xa2, 0x28, 0xc5, 0x1a, 0xad,
- 0xe9, 0xa5, 0xb3, 0x42, 0x9b, 0x07, 0xe8, 0xc1, 0xe8, 0xc4, 0xdf, 0x4b,
- 0xae, 0x82, 0x6c, 0x84, 0xec, 0x1f, 0xa4, 0x0e, 0xc3, 0x29, 0xc0, 0x81,
- 0xc2, 0xff, 0x22, 0x0f, 0x1f, 0xa8, 0xec, 0xe2, 0xc6, 0x11, 0xcd, 0x42,
- 0x1a, 0x49, 0x59, 0xc0, 0xba, 0xb5, 0x46, 0x6a, 0x5c, 0xc4, 0x45, 0x99,
- 0xc3, 0x11, 0x97, 0x85, 0x1c, 0x06, 0x0f, 0x11, 0x5c, 0x53, 0x24, 0xaf,
- 0x30, 0x94, 0xa6, 0xc5, 0x04, 0x0a, 0x81, 0x63, 0xdf, 0x9c, 0xbf, 0x7c,
- 0x77, 0x32, 0x3a, 0x7b, 0x7b, 0x08, 0x71, 0x51, 0x66, 0x24, 0x3a, 0xf7,
- 0xb9, 0xf7, 0x11, 0xc1, 0x58, 0xd3, 0x27, 0xf3, 0x8a, 0x91, 0x4a, 0xe9,
- 0x4b, 0x50, 0x7a, 0x7e, 0xc8, 0xd2, 0x8f, 0xb1, 0x2e, 0x50, 0x23, 0x23,
- 0xa0, 0xd0, 0x60, 0xa9, 0xc1, 0xa3, 0x9c, 0x91, 0x54, 0x79, 0x2d, 0x54,
- 0x09, 0x15, 0xa6, 0xa0, 0xb2, 0x58, 0x1d, 0x7e, 0xa3, 0x6a, 0xd2, 0x4c,
- 0x3c, 0xf2, 0x28, 0xbd, 0xe9, 0x98, 0xb4, 0x94, 0x06, 0x3c, 0x4f, 0x71,
- 0x70, 0x3e, 0x1f, 0xb4, 0x21, 0x9a, 0x9a, 0xd3, 0xe0, 0xaf, 0xb6, 0x35,
- 0x74, 0x5c, 0x73, 0x28, 0xd3, 0xb6, 0x43, 0x86, 0x03, 0xc4, 0x90, 0xc6,
- 0xaa, 0x04, 0x1c, 0x63, 0xd7, 0x16, 0x7e, 0x0e, 0xff, 0x69, 0xc8, 0x17,
- 0x5e, 0x34, 0xea, 0x90, 0x88, 0xc6, 0x41, 0x4d, 0xdb, 0x31, 0x17, 0xaa,
- 0x75, 0x56, 0xe5, 0x2f, 0x5b, 0x5e, 0x67, 0xf3, 0x62, 0xa5, 0xf9, 0xb7,
- 0x02, 0x6e, 0x4b, 0x98, 0xa9, 0xc3, 0x0d, 0x48, 0x34, 0x72, 0xd4, 0xd8,
- 0x85, 0xc7, 0x1c, 0xa7, 0x19, 0xd5, 0x92, 0x7c, 0xc2, 0x03, 0x09, 0xfa,
- 0x6a, 0x6c, 0x03, 0x99, 0x4a, 0x70, 0x79, 0x2d, 0x85, 0x38, 0x4c, 0xe2,
- 0x08, 0x12, 0x90, 0x5d, 0x09, 0x81, 0xf2, 0x90, 0xbb, 0x29, 0x4d, 0x6e,
- 0xb2, 0xec, 0x23, 0x7f, 0xda, 0x36, 0xdf, 0xe4, 0x76, 0x07, 0xd2, 0x7f,
- 0xe5, 0x87, 0xdd, 0x5e, 0x34, 0x46, 0x9f, 0x53, 0xc0, 0xda, 0xec, 0x41,
- 0xa9, 0x89, 0xa1, 0xee, 0xd6, 0x97, 0xa0, 0x0e, 0x47, 0x07, 0x4b, 0x73,
- 0x59, 0x5c, 0x53, 0x18, 0x80, 0x17, 0x28, 0xd8, 0xb8, 0x11, 0x78, 0x59,
- 0x69, 0x1c, 0x9d, 0x96, 0x1f, 0x2b, 0x77, 0xca, 0x43, 0x55, 0x80, 0x14,
- 0x41, 0x9e, 0x71, 0xca, 0x2d, 0x9a, 0xb0, 0x92, 0x66, 0xf6, 0x3f, 0x0a,
- 0xb7, 0x6a, 0xaf, 0x90, 0x93, 0xc7, 0xea, 0x47, 0xe8, 0xd7, 0x94, 0x2c,
- 0x5d, 0x95, 0x5a, 0x9b, 0x78, 0x9b, 0x0e, 0xcb, 0xde, 0xa3, 0x47, 0xf7,
- 0x02, 0xca, 0x09, 0x9b, 0x2b, 0xae, 0x1c, 0xdd, 0x65, 0xf9, 0xd2, 0x82,
- 0xca, 0xd5, 0x5a, 0x8d, 0xe9, 0x20, 0xe5, 0x08, 0x01, 0x25, 0xcd, 0xa5,
- 0xb0, 0xb5, 0x0d, 0xc1, 0x69, 0x3e, 0x69, 0xe1, 0xdd, 0x9c, 0x22, 0xc6,
- 0xca, 0x35, 0xe3, 0x2e, 0x12, 0xc0, 0x1c, 0xa8, 0xc5, 0x07, 0xfa, 0xb0,
- 0xf1, 0x4e, 0x3b, 0x11, 0x84, 0xef, 0x81, 0x9c, 0x71, 0x54, 0xed, 0x89,
- 0xf8, 0xfa, 0xce, 0x79, 0x6f, 0xb9, 0x99, 0x1b, 0x45, 0x05, 0x69, 0x56,
- 0x1c, 0xed, 0xe5, 0xf9, 0x0f, 0x37, 0x19, 0x00, 0x71, 0xd0, 0xb8, 0xdf,
- 0x79, 0x88, 0xa9, 0xe6, 0x9e, 0x5a, 0x55, 0x34, 0x2a, 0x61, 0x4f, 0xc5,
- 0xc3, 0x16, 0x76, 0xb5, 0x16, 0x88, 0xdb, 0x2d, 0x1b, 0x9d, 0xf8, 0xa8,
- 0x11, 0x9f, 0xea, 0xc2, 0x1b, 0x5b, 0x05, 0x34, 0x21, 0x00, 0x9b, 0xe5,
- 0x05, 0xcf, 0x9a, 0xfb, 0x0b, 0x18, 0x8e, 0x01, 0x81, 0x6d, 0xb4, 0x2f,
- 0x42, 0xe0, 0x73, 0x80, 0xd1, 0xc9, 0xe3, 0x5c, 0x2c, 0x3d, 0x3f, 0x3c,
- 0xa0, 0x27, 0x39, 0xa5, 0x53, 0x6b, 0x72, 0x5b, 0x88, 0xe7, 0x31, 0xc4,
- 0x58, 0xd5, 0xf7, 0x7c, 0x00, 0x80, 0xa0, 0xdc, 0x5f, 0x1d, 0xfa, 0xec,
- 0xd1, 0x0f, 0x31, 0x94, 0xb8, 0x34, 0xc4, 0x05, 0x8b, 0x18, 0x55, 0x84,
- 0xf2, 0xde, 0xc8, 0x1f, 0xc0, 0x9a, 0x82, 0xb1, 0x5b, 0xfb, 0xb4, 0x79,
- 0x63, 0x34, 0x11, 0xcc, 0x64, 0x97, 0xa3, 0x4e, 0x0e, 0xd7, 0xf6, 0x8c,
- 0x5b, 0x58, 0xf2, 0x4a, 0x2a, 0x87, 0x1c, 0x4a, 0x75, 0x8b, 0xf8, 0x05,
- 0x46, 0xad, 0x2c, 0xc2, 0x54, 0x78, 0xd2, 0x48, 0xa0, 0x91, 0x7a, 0x8e,
- 0x27, 0xb7, 0x08, 0x1e, 0x83, 0x62, 0x98, 0x3c, 0xbc, 0x85, 0xeb, 0x64,
- 0x25, 0x84, 0x51, 0x4e, 0x10, 0x2d, 0x11, 0xb8, 0x86, 0x40, 0x79, 0x44,
- 0x9a, 0x14, 0x60, 0x7e, 0x13, 0xda, 0x1c, 0x82, 0x4b, 0x59, 0x97, 0x5e,
- 0x6a, 0x54, 0xef, 0x2a, 0x37, 0xbb, 0xba, 0xec, 0x91, 0x4a, 0xe4, 0x2e,
- 0x56, 0xf9, 0x68, 0xb0, 0xd8, 0xf5, 0xdc, 0x0b, 0xcf, 0x85, 0xba, 0x83,
- 0x2b, 0x9e, 0x77, 0xc1, 0x35, 0xff, 0x40, 0x38, 0xd0, 0x04, 0x4c, 0xcc,
- 0x01, 0xb5, 0x44, 0xbb, 0xc3, 0x31, 0x97, 0xb8, 0x82, 0x6d, 0x9c, 0x7c,
- 0x6a, 0xfa, 0xd8, 0xf7, 0x3b, 0xae, 0xb9, 0x70, 0x63, 0xba, 0x80, 0x2b,
- 0x9f, 0x3d, 0x16, 0xa0, 0x72, 0xcc, 0x3a, 0xa6, 0x8d, 0x10, 0xf8, 0xa8,
- 0x08, 0x00, 0xbd, 0x64, 0xc2, 0xa6, 0x77, 0x54, 0x9d, 0x6a, 0x3f, 0x4d,
- 0xdc, 0x1d, 0xa0, 0x85, 0x02, 0x3a, 0xb7, 0x20, 0xff, 0x8f, 0xf0, 0x31,
- 0x48, 0x38, 0x29, 0xf3, 0x55, 0xcd, 0x55, 0x68, 0x52, 0x36, 0xb3, 0x11,
- 0x65, 0xcd, 0xfc, 0xed, 0x72, 0x5e, 0x8c, 0xd3, 0xb9, 0xd4, 0xf5, 0x4b,
- 0xd2, 0xaa, 0xc6, 0xbd, 0x1a, 0xf0, 0xf6, 0x10, 0x6f, 0x60, 0xcf, 0x48,
- 0x2f, 0x1f, 0xb3, 0xe4, 0xc1, 0x61, 0x9f, 0xf2, 0x36, 0x6e, 0xeb, 0x8d,
- 0x1f, 0xb4, 0x9f, 0x60, 0xa4, 0xd8, 0xc1, 0xac, 0x2f, 0xa7, 0x57, 0x31,
- 0x3c, 0x28, 0xe7, 0xb7, 0xf2, 0xce, 0x54, 0x60, 0x79, 0x13, 0xe4, 0xce,
- 0x74, 0x9d, 0x35, 0x53, 0x80, 0xb7, 0x24, 0x59, 0x48, 0x9a, 0xa5, 0x52,
- 0x1a, 0xaa, 0x6d, 0x82, 0x23, 0x49, 0x39, 0x51, 0xec, 0x06, 0x80, 0xc9,
- 0x4b, 0x3e, 0x6a, 0x3f, 0xb9, 0x2a, 0x6e, 0xa8, 0xf4, 0x6e, 0x09, 0xdb,
- 0xc4, 0x4d, 0x4e, 0x6f, 0x4f, 0x8f, 0x56, 0xdc, 0xe7, 0x2f, 0xe4, 0xf8,
- 0x19, 0xbb, 0x05, 0x48, 0x97, 0xe6, 0x3d, 0xd9, 0x40, 0x19, 0xbf, 0x81,
- 0x45, 0xd3, 0x51, 0x64, 0x3f, 0x1d, 0xbf, 0x9e, 0x48, 0xac, 0x55, 0x70,
- 0x1d, 0x21, 0xca, 0xbb, 0x6d, 0x98, 0x45, 0x4a, 0xa4, 0xb9, 0x91, 0x29,
- 0x21, 0x29, 0xab, 0x22, 0xc1, 0xb2, 0x40, 0xb4, 0xc7, 0x08, 0xfe, 0x0d,
- 0x92, 0x97, 0xd1, 0xa8, 0xa2, 0x58, 0x4a, 0x1d, 0x2c, 0x79, 0x3d, 0x24,
- 0x72, 0xac, 0x0c, 0x95, 0xd5, 0x13, 0xef, 0x97, 0xd3, 0x2c, 0x9d, 0xc7,
- 0x1a, 0x31, 0x61, 0xc2, 0xd0, 0xf9, 0x59, 0xb4, 0x01, 0xdf, 0x7f, 0x29,
- 0x81, 0x73, 0x29, 0x9e, 0xe1, 0xf4, 0x71, 0x51, 0x16, 0xed, 0x0c, 0xe9,
- 0x54, 0x45, 0x7c, 0x2c, 0x68, 0x0e, 0x77, 0x2d, 0xc0, 0x61, 0xd3, 0x62,
- 0x22, 0xe8, 0x35, 0x94, 0xf6, 0xe2, 0x65, 0x60, 0x26, 0x9c, 0x68, 0xae,
- 0x0f, 0x10, 0x07, 0x50, 0xa1, 0x53, 0x7b, 0x38, 0x09, 0xa7, 0x31, 0x7e,
- 0x00, 0x5d, 0x32, 0x5a, 0x8f, 0x87, 0x89, 0x71, 0x26, 0x24, 0x84, 0xe4,
- 0x8e, 0x9c, 0x43, 0xca, 0xb6, 0x13, 0xc9, 0xb1, 0x0a, 0x77, 0xfa, 0x3a,
- 0xd3, 0x84, 0x57, 0x32, 0x40, 0x78, 0x03, 0x6a, 0x8b, 0xa9, 0x80, 0xd1,
- 0x44, 0xce, 0xb0, 0x90, 0xd9, 0xdf, 0xef, 0x70, 0xc0, 0x71, 0xe3, 0x74,
- 0xe5, 0x31, 0x3a, 0xec, 0x55, 0x3a, 0xcb, 0xd4, 0x68, 0x11, 0xf1, 0x5d,
- 0x4c, 0x0c, 0x09, 0x29, 0x55, 0x87, 0x20, 0xec, 0x60, 0x23, 0x07, 0xd6,
- 0x0e, 0x4b, 0x4d, 0x48, 0x49, 0x7b, 0xe5, 0xe2, 0x20, 0x88, 0xb8, 0xad,
- 0xe6, 0xf9, 0x4a, 0xa3, 0x94, 0xfd, 0x24, 0x93, 0x6c, 0x52, 0xc0, 0xe1,
- 0xd3, 0xae, 0xac, 0x07, 0x11, 0x07, 0x9c, 0xa6, 0xdb, 0x29, 0x5a, 0xfa,
- 0x1c, 0x96, 0xd1, 0x76, 0x6b, 0xf4, 0xc7, 0x8f, 0xf6, 0x68, 0xb2, 0x8f,
- 0x1f, 0x3d, 0xdb, 0x69, 0xde, 0xca, 0xf3, 0x2a, 0x1b, 0x50, 0x3e, 0xf2,
- 0xc3, 0x9b, 0xa0, 0xd2, 0x4b, 0x92, 0xc4, 0x3c, 0x5d, 0x97, 0x6a, 0x93,
- 0xa1, 0x41, 0x2e, 0xdc, 0x93, 0xd5, 0x15, 0x20, 0x7a, 0x83, 0x5b, 0xde,
- 0xbd, 0x43, 0xae, 0x3b, 0x8a, 0xe0, 0x33, 0x9d, 0x52, 0x7a, 0x55, 0x7a,
- 0x6f, 0x32, 0x1d, 0xe8, 0x39, 0x35, 0xc0, 0x23, 0x35, 0x25, 0x0e, 0x95,
- 0x54, 0x12, 0xcb, 0x25, 0x89, 0xa3, 0xd9, 0xc9, 0xde, 0xca, 0x9d, 0xd7,
- 0xf9, 0x32, 0xaf, 0xae, 0x90, 0xc6, 0x8e, 0xa4, 0x85, 0xcb, 0x2c, 0x04,
- 0x42, 0x31, 0x02, 0xc9, 0x98, 0x00, 0x6c, 0xee, 0x97, 0xd4, 0xc4, 0x04,
- 0x19, 0xc1, 0x4c, 0x77, 0xa9, 0x44, 0x94, 0xf6, 0xad, 0x04, 0xa3, 0xe9,
- 0x96, 0xf9, 0xab, 0xbb, 0x0b, 0xa3, 0xc9, 0x25, 0xe1, 0x29, 0xfa, 0x7d,
- 0xe7, 0x62, 0x0d, 0xc5, 0x92, 0x6d, 0x6c, 0xee, 0xd9, 0xc8, 0x88, 0xa0,
- 0x47, 0xd0, 0xc8, 0xe7, 0x29, 0x5a, 0x2d, 0xe0, 0x6f, 0xe6, 0x67, 0x3f,
- 0x1a, 0x5d, 0x74, 0xf8, 0xdc, 0xfe, 0x78, 0xe7, 0x61, 0xbd, 0x88, 0xf7,
- 0x5b, 0xba, 0x19, 0x8a, 0x2c, 0x24, 0x1e, 0x4d, 0x0e, 0xab, 0x2f, 0xf8,
- 0x1f, 0x1d, 0xa5, 0x2d, 0x04, 0x26, 0x90, 0x9c, 0xbc, 0x79, 0x09, 0x63,
- 0x73, 0xa4, 0xa5, 0xd9, 0x8d, 0x7a, 0x0c, 0xad, 0xbd, 0xb6, 0x41, 0x10,
- 0x52, 0x55, 0xa3, 0x68, 0xb0, 0xd6, 0x53, 0xc3, 0xd9, 0xe4, 0x2e, 0xf7,
- 0x42, 0x75, 0x39, 0x73, 0xf1, 0xd6, 0x70, 0x4f, 0x02, 0xa6, 0x2d, 0x39,
- 0xcd, 0xa4, 0x17, 0xdb, 0xd6, 0x57, 0x5b, 0x91, 0x32, 0xed, 0xad, 0x17,
- 0x5b, 0x5e, 0x5f, 0x13, 0xd7, 0xe4, 0x71, 0xeb, 0x4f, 0xb0, 0xec, 0x01,
- 0xbc, 0xc5, 0xdf, 0x94, 0x3d, 0xe0, 0xc2, 0x89, 0x78, 0x72, 0x97, 0xa6,
- 0x72, 0x0b, 0x9e, 0x6c, 0x33, 0x85, 0x74, 0xc5, 0x28, 0xde, 0x28, 0x85,
- 0x68, 0xae, 0x5b, 0xf5, 0xb9, 0xad, 0xa0, 0x8c, 0x1b, 0x05, 0x90, 0x0c,
- 0xed, 0xc6, 0xfd, 0xdf, 0xbd, 0x0e, 0xd9, 0x3c, 0x27, 0x9e, 0x0c, 0x45,
- 0xac, 0x26, 0x13, 0xb2, 0x0b, 0xe9, 0xe8, 0x9b, 0x5f, 0x5e, 0x5e, 0x46,
- 0x13, 0x5d, 0x0d, 0x09, 0xb0, 0xf1, 0x58, 0xf3, 0xcc, 0xd8, 0x5b, 0xa4,
- 0x6f, 0xe0, 0x9e, 0xef, 0xae, 0x8a, 0x71, 0xba, 0x7b, 0xe4, 0x19, 0x6f,
- 0x15, 0x2f, 0xfc, 0xc2, 0xc3, 0x38, 0x17, 0x10, 0x13, 0x30, 0x0f, 0xc0,
- 0x95, 0x45, 0x3f, 0xb3, 0x31, 0x8f, 0x59, 0x6a, 0x98, 0xe2, 0x4e, 0x12,
- 0x8c, 0xe6, 0x28, 0x12, 0x13, 0x09, 0x92, 0x2d, 0x02, 0x19, 0x36, 0xd7,
- 0x9a, 0x0b, 0x2e, 0x4d, 0x42, 0x9b, 0x2a, 0xae, 0x62, 0x01, 0x9d, 0xf9,
- 0x3e, 0x70, 0xd5, 0x4c, 0x89, 0x36, 0x82, 0x72, 0x35, 0x4a, 0x6d, 0xdf,
- 0xb8, 0x5f, 0xb1, 0x24, 0xaa, 0x8a, 0xda, 0x80, 0x54, 0x6d, 0x25, 0x02,
- 0xc3, 0x8b, 0x58, 0x25, 0x7e, 0x91, 0x7a, 0x3b, 0x52, 0x45, 0x26, 0x84,
- 0x91, 0x46, 0xbb, 0x74, 0x48, 0xb8, 0x54, 0x6c, 0x02, 0xcc, 0x33, 0x12,
- 0x32, 0x45, 0x82, 0xfe, 0x9f, 0xfb, 0x07, 0x9f, 0x7f, 0x1e, 0x75, 0xf0,
- 0x31, 0x95, 0xc0, 0x84, 0xa0, 0x94, 0x43, 0x50, 0xee, 0x5b, 0x28, 0x7c,
- 0x7c, 0x1f, 0x1c, 0xa6, 0x6e, 0xae, 0x82, 0xfa, 0x2e, 0x9a, 0xaf, 0x86,
- 0x4e, 0x5e, 0xf2, 0xbf, 0x2c, 0xa0, 0x56, 0x88, 0x14, 0x23, 0xf5, 0x0a,
- 0x52, 0x63, 0x91, 0x77, 0xa8, 0x74, 0x99, 0x24, 0x69, 0x73, 0x42, 0xbf,
- 0x20, 0xc9, 0x4a, 0x55, 0x01, 0x37, 0xc6, 0x35, 0x5a, 0x03, 0xd5, 0x2f,
- 0x71, 0xee, 0x1f, 0x93, 0x63, 0xab, 0xa3, 0xce, 0x7f, 0x2b, 0xd1, 0x1c,
- 0x98, 0x71, 0x66, 0x51, 0x78, 0xd8, 0xcb, 0xd1, 0xc2, 0x4b, 0x63, 0xff,
- 0xe3, 0x32, 0xf9, 0x8a, 0xdb, 0x22, 0x99, 0x0f, 0xb4, 0x86, 0x23, 0xe8,
- 0x8b, 0xcb, 0xac, 0x0e, 0xeb, 0x53, 0xbd, 0xca, 0x8e, 0x0d, 0x83, 0xc7,
- 0x6c, 0x22, 0xa9, 0xaf, 0x4d, 0x5e, 0x68, 0x9d, 0xe2, 0x34, 0x9f, 0xe9,
- 0x21, 0xb5, 0xad, 0x84, 0xbe, 0xa2, 0xdd, 0x78, 0x21, 0xa4, 0x97, 0x7a,
- 0xf3, 0xaf, 0xa2, 0x80, 0x98, 0x52, 0x5e, 0x42, 0xe8, 0x8c, 0x75, 0x6d,
- 0xd4, 0x6a, 0x27, 0xbb, 0xa9, 0x3c, 0x88, 0xf0, 0xf7, 0x14, 0x8f, 0x8b,
- 0x08, 0xcc, 0xd9, 0xfb, 0xf3, 0x18, 0x18, 0xd3, 0x0b, 0x3b, 0xa8, 0x34,
- 0xc5, 0x42, 0x85, 0x16, 0xa6, 0x12, 0xa3, 0x84, 0x36, 0xb5, 0x80, 0x7c,
- 0x30, 0x4f, 0x07, 0x56, 0x0f, 0xde, 0xf5, 0xe8, 0x14, 0xee, 0xbd, 0x9f,
- 0x5f, 0x21, 0xc8, 0x4b, 0x4c, 0x62, 0x57, 0xd9, 0xe3, 0xc7, 0xe8, 0x53,
- 0xeb, 0xf3, 0xe6, 0x63, 0xd1, 0x8e, 0xcb, 0x61, 0xa9, 0x0e, 0xa2, 0x83,
- 0x38, 0xeb, 0x12, 0x56, 0x02, 0x66, 0x49, 0xe0, 0x4b, 0x4a, 0x55, 0xf8,
- 0xae, 0xea, 0x72, 0x3d, 0x81, 0x62, 0x49, 0x46, 0x39, 0x7d, 0x2a, 0xd4,
- 0x68, 0xd7, 0x95, 0x06, 0xd9, 0xec, 0x8a, 0xa9, 0x1f, 0x2b, 0xed, 0x17,
- 0x51, 0x59, 0xd0, 0x63, 0xd9, 0xc2, 0x13, 0x70, 0x61, 0xae, 0x53, 0x18,
- 0x44, 0x5b, 0x84, 0x67, 0xe4, 0x6e, 0xa9, 0xf2, 0xbf, 0xb3, 0x52, 0x26,
- 0x05, 0x1e, 0x8a, 0xa5, 0x49, 0x0e, 0x8e, 0x0c, 0xdd, 0x5d, 0x92, 0x57,
- 0xe8, 0x60, 0xcd, 0x57, 0x39, 0xf8, 0x2d, 0x90, 0xd3, 0xae, 0xce, 0x29,
- 0x95, 0x1b, 0x09, 0x6a, 0x5c, 0x99, 0x5d, 0xae, 0x71, 0xcb, 0x71, 0x05,
- 0xae, 0x62, 0x67, 0xeb, 0x13, 0xab, 0x7c, 0x45, 0x5d, 0xaf, 0x8c, 0x3d,
- 0x17, 0x74, 0xfc, 0x35, 0x6f, 0xed, 0xf0, 0x9a, 0x97, 0x86, 0x5c, 0xf5,
- 0x1a, 0x99, 0x28, 0x82, 0x1b, 0x66, 0xe4, 0xd7, 0x5f, 0x29, 0x00, 0x54,
- 0xc8, 0xd2, 0xb9, 0x78, 0xd7, 0x15, 0xc5, 0x65, 0xb3, 0xc0, 0x76, 0xc9,
- 0x28, 0xff, 0x91, 0x40, 0x2f, 0x91, 0x50, 0x58, 0xab, 0x00, 0x90, 0x1e,
- 0xa6, 0xf9, 0x22, 0xfb, 0x13, 0x22, 0x01, 0x93, 0xcc, 0x61, 0x7e, 0x13,
- 0x51, 0xa8, 0x4b, 0x4e, 0x70, 0xaa, 0x09, 0x3a, 0x57, 0x75, 0x27, 0xc9,
- 0xe3, 0x66, 0x83, 0x96, 0x9b, 0x63, 0xf5, 0x19, 0x26, 0x5c, 0x0a, 0xb2,
- 0xb8, 0xec, 0x22, 0xad, 0xb8, 0x2e, 0xae, 0x0a, 0x7b, 0x7b, 0xd3, 0x25,
- 0xc0, 0x5a, 0xf5, 0x5f, 0xad, 0xc1, 0x0b, 0xc9, 0x17, 0x81, 0xd9, 0x23,
- 0x90, 0xf1, 0x43, 0x71, 0x9f, 0xa2, 0x53, 0xaa, 0x08, 0x34, 0x1b, 0x9d,
- 0x96, 0x92, 0x57, 0x56, 0x11, 0xb7, 0x8c, 0xe8, 0x04, 0xed, 0xb7, 0xe4,
- 0xe0, 0x46, 0x5b, 0x4f, 0x5b, 0x3b, 0x9f, 0x44, 0x35, 0x1f, 0x13, 0x8b,
- 0x8b, 0x6c, 0x65, 0x08, 0x54, 0xaa, 0x32, 0x35, 0x12, 0xf3, 0xaf, 0xab,
- 0xcb, 0x0e, 0x04, 0x5e, 0x6e, 0xb0, 0x66, 0x6c, 0x85, 0xb0, 0xff, 0x23,
- 0xf1, 0xe1, 0xe0, 0x75, 0x22, 0xf3, 0xf9, 0xe2, 0xab, 0xc6, 0x70, 0xda,
- 0xe5, 0xc8, 0x6f, 0xe2, 0x21, 0xd8, 0x4d, 0x93, 0xcb, 0x7c, 0x33, 0x11,
- 0xa8, 0xfd, 0x8d, 0x2d, 0x29, 0xa9, 0xae, 0x8a, 0x4c, 0x76, 0x6e, 0x49,
- 0x06, 0xb0, 0x13, 0x1b, 0x95, 0xb6, 0x57, 0x88, 0x3a, 0xd8, 0xbb, 0xa7,
- 0x4c, 0x77, 0xfa, 0xbf, 0x15, 0x57, 0x4b, 0xfc, 0x03, 0xe3, 0x63, 0xf8,
- 0x2f, 0xf6, 0xf6, 0xa2, 0xb3, 0xee, 0x9c, 0xab, 0x37, 0x59, 0xdc, 0x42,
- 0x52, 0x21, 0xe0, 0x09, 0xb5, 0x86, 0xcd, 0x3f, 0xa4, 0x02, 0xe8, 0xd0,
- 0x0f, 0x49, 0x87, 0x87, 0x00, 0x2b, 0xbd, 0x57, 0x39, 0xfb, 0x3a, 0x2a,
- 0x0b, 0x73, 0x7b, 0x31, 0x30, 0x14, 0x5a, 0x24, 0x77, 0xa2, 0x7b, 0xe1,
- 0x3d, 0x64, 0x02, 0xdc, 0x7d, 0xf1, 0xe2, 0x6a, 0x7d, 0x99, 0x91, 0xbc,
- 0xac, 0x6f, 0xeb, 0xde, 0x83, 0x56, 0x0d, 0xef, 0x04, 0xbb, 0x27, 0xb8,
- 0xc0, 0xa6, 0xf6, 0x52, 0x4d, 0xa9, 0x62, 0xad, 0xa1, 0x3a, 0x70, 0x22,
- 0x3e, 0x2c, 0x24, 0x4d, 0x74, 0x68, 0x17, 0x8a, 0xb2, 0x12, 0xda, 0x67,
- 0x9a, 0x09, 0x96, 0x91, 0xc3, 0x4e, 0xd9, 0xb0, 0x82, 0x9b, 0x6c, 0xfc,
- 0xc5, 0x57, 0xf0, 0x69, 0xdd, 0x52, 0x93, 0x19, 0xd6, 0x66, 0x41, 0xb9,
- 0x5d, 0xea, 0x39, 0x93, 0x78, 0x8b, 0x68, 0x0f, 0x52, 0x94, 0xdd, 0xc3,
- 0x7a, 0x85, 0xab, 0xde, 0x90, 0xb3, 0xa2, 0xd8, 0x38, 0xa2, 0xfa, 0x6c,
- 0x88, 0x26, 0x5e, 0x2a, 0x3b, 0x27, 0x78, 0xbb, 0xa2, 0x7c, 0xe6, 0x07,
- 0xba, 0x5f, 0x1a, 0xd7, 0x64, 0x0c, 0x24, 0x85, 0xe2, 0xad, 0x6c, 0x9b,
- 0xeb, 0x4d, 0xf3, 0x45, 0x5f, 0x4b, 0x3b, 0x23, 0x6d, 0xc5, 0xdc, 0x1a,
- 0xf8, 0x18, 0x12, 0x57, 0xe0, 0xaf, 0x7f, 0xb2, 0xaf, 0xe3, 0x0f, 0x73,
- 0x8a, 0xa9, 0x6d, 0xc3, 0x86, 0xd5, 0x20, 0x11, 0x44, 0xdf, 0xd9, 0xa5,
- 0xe4, 0x03, 0x1b, 0x67, 0xdd, 0xea, 0xb3, 0x82, 0xfd, 0xa7, 0xad, 0x46,
- 0x94, 0x8a, 0xa2, 0x48, 0x24, 0xdb, 0xa6, 0x45, 0xa0, 0xce, 0x22, 0x17,
- 0x5f, 0xc2, 0x4c, 0x98, 0x7d, 0xc7, 0xc4, 0x31, 0x73, 0x9d, 0xfa, 0x4f,
- 0x3d, 0x3b, 0xf9, 0x9f, 0x7a, 0x6e, 0xfa, 0x3f, 0xf5, 0xdc, 0x02, 0x7e,
- 0xea, 0xf5, 0x12, 0xee, 0xc8, 0x1c, 0x1a, 0xc2, 0xbf, 0x74, 0xd3, 0xb7,
- 0xf8, 0xab, 0xee, 0xa3, 0xde, 0x37, 0xbd, 0x4f, 0xf6, 0xb6, 0x36, 0x11,
- 0xcd, 0xcf, 0x0c, 0xa0, 0xaa, 0xc8, 0x36, 0x0d, 0x8d, 0x98, 0x6e, 0x90,
- 0xc9, 0x91, 0x05, 0x46, 0xd9, 0x5d, 0x00, 0xd8, 0xe5, 0x1e, 0x00, 0xc5,
- 0x5d, 0x07, 0x43, 0xaf, 0x31, 0x8f, 0x85, 0x3a, 0xb6, 0xd1, 0x42, 0x82,
- 0xb7, 0x9c, 0x86, 0xf7, 0x90, 0x7d, 0x3d, 0xb8, 0x77, 0xfe, 0xdd, 0x7c,
- 0x81, 0xf4, 0x7e, 0x6e, 0xe3, 0xc8, 0xa7, 0x9a, 0x4a, 0xab, 0x25, 0x2b,
- 0x9b, 0xca, 0x65, 0x96, 0x9c, 0xb3, 0xc2, 0xd7, 0xde, 0x8c, 0xeb, 0x4c,
- 0x99, 0x25, 0x02, 0x91, 0xbb, 0xc8, 0xa9, 0x9d, 0xa5, 0x59, 0xd5, 0x9c,
- 0x2d, 0xd3, 0x5d, 0xdc, 0x06, 0x54, 0xf9, 0x40, 0x9d, 0x26, 0x2b, 0x32,
- 0xcd, 0xc5, 0x68, 0xf5, 0xe3, 0x99, 0x1b, 0x58, 0x1a, 0x0a, 0xf8, 0xbc,
- 0x28, 0xab, 0x2f, 0x7a, 0x25, 0x9a, 0x89, 0x27, 0x97, 0xa5, 0xd1, 0x5c,
- 0xff, 0x04, 0xd6, 0x5a, 0x9b, 0xcd, 0x72, 0xe7, 0xf4, 0x76, 0xb0, 0xb8,
- 0x33, 0xf3, 0xde, 0xfa, 0x45, 0x9c, 0xe1, 0x89, 0xb4, 0x29, 0xe5, 0x68,
- 0x51, 0x6a, 0x43, 0x3b, 0x4b, 0x8d, 0x8f, 0xae, 0x77, 0x28, 0xe5, 0xf7,
- 0x5f, 0xc4, 0x60, 0x50, 0x83, 0x85, 0x78, 0x92, 0x97, 0x4c, 0xb4, 0x2f,
- 0xce, 0xbe, 0xfb, 0x93, 0x0e, 0xf0, 0x53, 0xef, 0xc7, 0x01, 0xff, 0x94,
- 0x00, 0x20, 0x0e, 0x93, 0xb3, 0xef, 0xc0, 0xdd, 0xbf, 0x4c, 0x80, 0x6d,
- 0xfa, 0xc0, 0x57, 0xfc, 0x17, 0xe2, 0xec, 0x4d, 0xc3, 0x5e, 0xb8, 0x2c,
- 0xb9, 0x2f, 0x92, 0x8f, 0xd9, 0x1d, 0x55, 0x99, 0x92, 0xf5, 0xbd, 0x5a,
- 0xa1, 0x6e, 0x54, 0x11, 0x0f, 0x6a, 0x46, 0x3c, 0xa0, 0x68, 0x51, 0x3a,
- 0x2e, 0xb8, 0x40, 0xa6, 0x0e, 0x1b, 0x28, 0x10, 0x80, 0x3b, 0xed, 0xad,
- 0xf8, 0xac, 0x56, 0xe4, 0xb0, 0x20, 0x35, 0xb8, 0x99, 0x64, 0xd6, 0xac,
- 0x5f, 0xef, 0x27, 0xc7, 0x91, 0x4e, 0x39, 0x0e, 0xaa, 0x8e, 0xff, 0x46,
- 0xfa, 0x18, 0x81, 0xf2, 0xc1, 0xb4, 0x42, 0xdb, 0xcd, 0xb4, 0xcc, 0xb4,
- 0x8d, 0x9a, 0x34, 0x7e, 0xa5, 0xc0, 0x92, 0x61, 0x98, 0x48, 0x08, 0x40,
- 0xa2, 0x92, 0x52, 0x86, 0x34, 0x2b, 0xe6, 0x53, 0x89, 0x46, 0x18, 0xae,
- 0xe7, 0x0d, 0xb6, 0xbd, 0x56, 0x8d, 0xae, 0x01, 0x52, 0x48, 0x84, 0x42,
- 0x3e, 0x1b, 0x51, 0x90, 0x24, 0x8a, 0xc8, 0x5e, 0x38, 0x3f, 0xeb, 0x84,
- 0x19, 0xff, 0x4f, 0x30, 0xf6, 0xc7, 0x19, 0x39, 0x9d, 0x6c, 0x5d, 0xfe,
- 0x40, 0x9c, 0xc2, 0x11, 0xcf, 0x4d, 0x62, 0xcf, 0x8d, 0x1e, 0x1c, 0xe9,
- 0xcf, 0x2e, 0x95, 0xf9, 0xc8, 0x12, 0xfe, 0x16, 0xaa, 0xa0, 0x94, 0x31,
- 0x69, 0xfb, 0x33, 0x5c, 0x2f, 0xf1, 0xc5, 0xda, 0x9c, 0x19, 0x50, 0x28,
- 0x3c, 0x6d, 0xc9, 0xef, 0xc5, 0x87, 0xec, 0xa5, 0xd6, 0xd0, 0xea, 0x65,
- 0xb3, 0x86, 0xc1, 0x0b, 0x3f, 0x4a, 0x4a, 0xe8, 0x60, 0xef, 0xd0, 0x6b,
- 0x65, 0xc7, 0x3f, 0x8b, 0x0f, 0xef, 0xa3, 0x7a, 0x69, 0x60, 0xb8, 0x12,
- 0xf2, 0x6f, 0x18, 0x7f, 0xdf, 0x8e, 0xff, 0x59, 0x04, 0x48, 0x8b, 0xa1,
- 0xae, 0xe2, 0x9f, 0xbd, 0x70, 0x29, 0xe0, 0xea, 0x3d, 0xb5, 0x1e, 0x8c,
- 0x86, 0xef, 0x40, 0xd2, 0xfc, 0x04, 0x64, 0x8b, 0xc3, 0x0c, 0x61, 0x27,
- 0x20, 0x86, 0x33, 0x26, 0xf3, 0x8f, 0xd6, 0x61, 0xc8, 0xd8, 0x36, 0x0d,
- 0xf9, 0xaa, 0x17, 0xc6, 0x2a, 0x16, 0x00, 0xe9, 0x9e, 0x1e, 0xba, 0xc6,
- 0xc8, 0x0c, 0x0a, 0x94, 0xfb, 0xd5, 0x55, 0x0e, 0x45, 0x21, 0x28, 0x6a,
- 0x6f, 0x80, 0xe0, 0x07, 0x9f, 0x32, 0xa2, 0x98, 0x91, 0xf4, 0xbc, 0xc6,
- 0xbd, 0x5b, 0xdb, 0x5b, 0xe2, 0x4c, 0xc1, 0x87, 0xd0, 0x4e, 0x98, 0xd2,
- 0x60, 0x09, 0x94, 0x32, 0x25, 0xe0, 0x07, 0xf1, 0xe1, 0x0c, 0x22, 0x5a,
- 0xc7, 0xa1, 0x64, 0x37, 0xc8, 0x99, 0xf0, 0x90, 0xdf, 0xd4, 0x5e, 0x66,
- 0x9c, 0xc6, 0x06, 0xdc, 0x5b, 0x68, 0x1c, 0x7b, 0x24, 0x96, 0xc1, 0xd8,
- 0x26, 0x75, 0xb9, 0xea, 0x69, 0xb2, 0xf5, 0xc5, 0xce, 0x96, 0x5d, 0x5a,
- 0xb7, 0x39, 0xa4, 0xf6, 0x8b, 0xc5, 0x2e, 0xd4, 0xe0, 0xa3, 0xed, 0x16,
- 0x4e, 0x1e, 0xa5, 0x05, 0x72, 0x1e, 0xb2, 0x01, 0x6d, 0x68, 0x14, 0x12,
- 0xb5, 0x52, 0x80, 0x25, 0x2a, 0x2b, 0xa2, 0xd3, 0xc9, 0xf0, 0x5d, 0xcc,
- 0xe2, 0xe9, 0xbc, 0x46, 0xa1, 0x16, 0x95, 0xd2, 0x31, 0x7c, 0x6b, 0x75,
- 0xe8, 0xa9, 0xe3, 0x91, 0xe3, 0x89, 0x00, 0x0e, 0xf5, 0xd9, 0x11, 0x57,
- 0x48, 0xe5, 0xb7, 0x10, 0xef, 0xbe, 0xca, 0xb6, 0xbe, 0xd8, 0xe6, 0x0b,
- 0xcb, 0xf9, 0xd1, 0xbc, 0x6f, 0x6f, 0x25, 0x3f, 0xc5, 0x51, 0x0d, 0x12,
- 0x7e, 0xd7, 0x33, 0x10, 0x84, 0x6d, 0xef, 0x7b, 0x23, 0x79, 0x31, 0x2e,
- 0xa6, 0x77, 0x5f, 0x52, 0xb8, 0x49, 0x5e, 0x79, 0xb1, 0x4b, 0x3f, 0x6a,
- 0xa9, 0xcc, 0x5d, 0x03, 0xd1, 0x28, 0x66, 0xab, 0xe8, 0xbf, 0x5f, 0xe1,
- 0x71, 0xb5, 0x18, 0xb6, 0x92, 0xe1, 0xd0, 0x08, 0xa1, 0x6a, 0x41, 0x3d,
- 0x1b, 0x37, 0x5c, 0x2c, 0x84, 0x60, 0x6a, 0x3b, 0x76, 0x29, 0x06, 0x15,
- 0x79, 0x74, 0xd4, 0xba, 0x66, 0xe7, 0x23, 0xff, 0xaa, 0xfc, 0x62, 0x98,
- 0xbc, 0xb4, 0x39, 0x92, 0x5d, 0x0d, 0xe0, 0xf9, 0xee, 0xf0, 0x00, 0x41,
- 0x3e, 0x1f, 0xe7, 0xe2, 0x5e, 0x9f, 0x16, 0x16, 0x97, 0x19, 0xb0, 0xcc,
- 0x8c, 0xd2, 0x63, 0x2e, 0x77, 0x89, 0x82, 0x04, 0xc3, 0x95, 0x1c, 0x1b,
- 0x62, 0x37, 0xba, 0xb5, 0x5f, 0x64, 0x6a, 0x83, 0x63, 0x41, 0x5a, 0x54,
- 0x31, 0xda, 0x4f, 0x9e, 0xd9, 0x2f, 0x45, 0xf2, 0x0e, 0xd9, 0xd2, 0xaf,
- 0x92, 0xcf, 0x07, 0x78, 0xca, 0x6b, 0x29, 0x2e, 0x7c, 0xdf, 0xcc, 0xdc,
- 0xe8, 0x8b, 0x52, 0x38, 0xa0, 0xb4, 0xd4, 0x48, 0x39, 0x26, 0xdd, 0x04,
- 0xe3, 0xb4, 0xca, 0x9e, 0x3e, 0x56, 0xf5, 0x92, 0xa9, 0x54, 0xa9, 0xdf,
- 0xb6, 0xe1, 0x7c, 0xe5, 0x7b, 0xc8, 0x5b, 0x50, 0xfb, 0x20, 0x10, 0xac,
- 0x04, 0x94, 0x33, 0x34, 0x89, 0xe4, 0x0a, 0x0c, 0xdc, 0xa6, 0x46, 0x91,
- 0xbc, 0xac, 0xa9, 0x9e, 0xf4, 0xd9, 0x53, 0x6f, 0xd2, 0xf7, 0xb8, 0x29,
- 0x5a, 0x92, 0x54, 0x56, 0xd8, 0x5e, 0x51, 0xc2, 0x0c, 0x0b, 0xf6, 0x0b,
- 0xce, 0x25, 0x7c, 0x1c, 0x0c, 0x25, 0x29, 0x6b, 0xb4, 0x8e, 0xc5, 0xfb,
- 0x8e, 0x91, 0x7f, 0x08, 0xfe, 0xa4, 0x8c, 0xd3, 0xfe, 0xf4, 0x46, 0xa6,
- 0xf6, 0x4c, 0x24, 0x7d, 0x9f, 0x27, 0xc1, 0x8c, 0x7d, 0x3f, 0x5f, 0x23,
- 0x78, 0x30, 0x5b, 0x97, 0x74, 0xfb, 0xc8, 0x63, 0xac, 0x24, 0x68, 0x95,
- 0xaa, 0xe8, 0xe9, 0x6f, 0x5e, 0xbe, 0x7d, 0xff, 0xf2, 0x74, 0xf8, 0xeb,
- 0xfa, 0x91, 0xde, 0x53, 0x01, 0xe1, 0x43, 0xd9, 0xb4, 0xb0, 0xdb, 0xe2,
- 0x40, 0x36, 0x41, 0xb4, 0x01, 0xc0, 0x36, 0xed, 0x5c, 0x6d, 0x94, 0x0c,
- 0x83, 0xaf, 0x90, 0x1c, 0x12, 0xc7, 0x74, 0xe3, 0x2a, 0x0f, 0x09, 0x8d,
- 0x7b, 0x79, 0xfb, 0x69, 0x25, 0x8d, 0x7b, 0x7b, 0xfa, 0x3e, 0x5e, 0xef,
- 0x49, 0xe9, 0x90, 0x45, 0x09, 0x89, 0x71, 0xb9, 0x45, 0x36, 0xb1, 0x29,
- 0x57, 0x2b, 0x46, 0xd8, 0x9e, 0xca, 0x85, 0xd6, 0xf0, 0xba, 0x15, 0xb3,
- 0x99, 0x4b, 0x7f, 0x6d, 0x47, 0xf6, 0x8e, 0x8e, 0xba, 0x01, 0x17, 0x3e,
- 0x25, 0xfc, 0x75, 0xab, 0x1e, 0x89, 0xc8, 0xe8, 0xa4, 0xfb, 0xa0, 0x2e,
- 0x18, 0x8b, 0xe4, 0x85, 0xcc, 0x2d, 0x4e, 0x55, 0x20, 0x8f, 0x79, 0xb8,
- 0x31, 0xaa, 0xe2, 0x62, 0x46, 0x68, 0xd3, 0x4c, 0xc4, 0x3a, 0x7f, 0x39,
- 0x1a, 0xd9, 0xbb, 0xb0, 0x92, 0x74, 0x84, 0x7e, 0x60, 0x8c, 0x91, 0x1a,
- 0x49, 0xfc, 0xa2, 0xd4, 0xd0, 0xe4, 0x30, 0x9b, 0xcc, 0x4f, 0x31, 0x1f,
- 0x63, 0xf3, 0x5d, 0xac, 0x17, 0xe6, 0xc0, 0x18, 0x8d, 0x77, 0xba, 0x55,
- 0x49, 0x08, 0xb6, 0xcd, 0x78, 0x90, 0x5c, 0xa2, 0x49, 0x71, 0x32, 0x24,
- 0xfe, 0x78, 0x8d, 0xba, 0x29, 0x89, 0x1d, 0x41, 0xca, 0x73, 0xd0, 0xda,
- 0xc7, 0x2c, 0xef, 0xc7, 0x9d, 0xe8, 0xbd, 0xd1, 0xc9, 0xc5, 0xb1, 0x21,
- 0xdf, 0xfb, 0x8b, 0x6f, 0x7b, 0x92, 0xb2, 0xd0, 0xc6, 0x40, 0x22, 0x67,
- 0x3d, 0x3a, 0x81, 0x5f, 0x5b, 0xac, 0x84, 0x92, 0x1d, 0x29, 0xc6, 0x5a,
- 0x88, 0x69, 0xe0, 0xee, 0xa3, 0xc3, 0x0d, 0xbb, 0xf4, 0x64, 0xf8, 0xa4,
- 0xbd, 0x4b, 0xdd, 0xed, 0x0c, 0x08, 0x91, 0x7e, 0x14, 0xb0, 0xbb, 0xe0,
- 0xdc, 0x23, 0x6b, 0x6a, 0xd7, 0x75, 0xd8, 0xa2, 0xe0, 0x1a, 0xc1, 0xa5,
- 0xa5, 0x0c, 0x84, 0x12, 0xc0, 0xa1, 0x3a, 0x70, 0x58, 0x1b, 0x0f, 0x27,
- 0x6c, 0x7f, 0x0b, 0x20, 0x27, 0x5e, 0x5e, 0x0e, 0x83, 0x9a, 0x1d, 0x4b,
- 0xcb, 0xa9, 0x05, 0x05, 0x08, 0xf5, 0x43, 0xcd, 0xf1, 0x43, 0xa2, 0xb9,
- 0x61, 0x01, 0x6d, 0xdb, 0xd5, 0xc0, 0x6a, 0x08, 0x1b, 0xf0, 0xb8, 0x3c,
- 0xbe, 0x78, 0xb3, 0x05, 0xf2, 0x9e, 0x53, 0x3b, 0x2f, 0x8b, 0xf3, 0xbf,
- 0x31, 0xeb, 0x31, 0x0e, 0xe8, 0x0f, 0xba, 0x4a, 0x9e, 0xc8, 0x0b, 0xfe,
- 0x6f, 0x9c, 0xdf, 0xe9, 0xca, 0x2d, 0x8b, 0x39, 0x3b, 0x10, 0xe5, 0x0d,
- 0x4e, 0xde, 0xe4, 0x52, 0x47, 0xa9, 0xc2, 0x2b, 0x29, 0xd1, 0x50, 0x42,
- 0x33, 0xd4, 0x65, 0x26, 0xec, 0xcd, 0xb8, 0x3d, 0xda, 0xb1, 0x8e, 0xd6,
- 0x0b, 0x8a, 0x24, 0xd2, 0x68, 0x91, 0x1a, 0x56, 0x0f, 0x2a, 0x57, 0xd4,
- 0xcb, 0x20, 0x52, 0x81, 0xe0, 0x83, 0x3b, 0xbd, 0xa1, 0xc5, 0x44, 0x82,
- 0x7a, 0x72, 0x33, 0xed, 0x00, 0x1f, 0x25, 0xb7, 0x16, 0x25, 0x8f, 0x31,
- 0x62, 0x3b, 0x55, 0x23, 0x1c, 0xfd, 0xf0, 0xca, 0xeb, 0xc8, 0xa6, 0xf9,
- 0x69, 0xcc, 0x2f, 0xa2, 0x90, 0x76, 0xc1, 0x7b, 0x66, 0x2e, 0xc9, 0x72,
- 0x48, 0xc1, 0xd4, 0x69, 0x96, 0xad, 0x6c, 0xe3, 0x8b, 0x9c, 0x2a, 0x2c,
- 0xf3, 0x8a, 0x82, 0xa7, 0xd2, 0x76, 0x84, 0x7a, 0x8e, 0x76, 0xcc, 0x4e,
- 0x44, 0x87, 0x66, 0xe8, 0x93, 0xbd, 0x83, 0x16, 0x93, 0x08, 0xdf, 0xee,
- 0x3d, 0x3b, 0xf8, 0xdc, 0xdc, 0xcd, 0x77, 0x94, 0xff, 0xed, 0x48, 0xc6,
- 0xe0, 0xee, 0xdd, 0xc0, 0xad, 0x62, 0xd4, 0x68, 0x5a, 0xaf, 0x80, 0xe9,
- 0x24, 0x15, 0xcc, 0x08, 0x72, 0x50, 0x09, 0xb4, 0x45, 0x88, 0x44, 0x66,
- 0x88, 0x28, 0x04, 0x93, 0x64, 0x3b, 0xa2, 0x13, 0x27, 0x86, 0x0d, 0x3d,
- 0x06, 0x36, 0x9a, 0x1d, 0xb5, 0xdb, 0x34, 0x22, 0xe5, 0xdd, 0xf1, 0xc5,
- 0x3b, 0xf3, 0x9f, 0xd1, 0xc5, 0xd9, 0xbb, 0x0e, 0xa8, 0xdd, 0x9a, 0x41,
- 0x9a, 0x40, 0x34, 0x4d, 0x53, 0x21, 0x32, 0x37, 0x61, 0x38, 0x29, 0x03,
- 0x9a, 0xc5, 0x0e, 0x25, 0x07, 0x2d, 0x06, 0x5d, 0x00, 0xcb, 0x44, 0x2d,
- 0x7f, 0xa1, 0x33, 0x73, 0x3f, 0x6c, 0x5c, 0x18, 0xef, 0xf9, 0x66, 0x0e,
- 0xa1, 0x05, 0x83, 0x19, 0xb1, 0x62, 0x2b, 0xe8, 0x69, 0xb6, 0xc6, 0x68,
- 0x83, 0xef, 0xdf, 0x35, 0x39, 0xd1, 0x92, 0x90, 0x0e, 0x78, 0x5a, 0x4e,
- 0xc9, 0xad, 0x18, 0xe5, 0xa8, 0x76, 0xdd, 0xa7, 0x7a, 0x0a, 0x04, 0xd3,
- 0x4b, 0xb6, 0xc9, 0x81, 0x2c, 0x7a, 0xc9, 0x3d, 0xfc, 0x6b, 0x74, 0xa1,
- 0x1d, 0xb7, 0xe0, 0xaa, 0x58, 0x64, 0xec, 0xe1, 0xe7, 0xa4, 0x5c, 0x15,
- 0x4e, 0x95, 0x34, 0xc8, 0xcc, 0x19, 0x91, 0x27, 0x44, 0x43, 0xb2, 0x98,
- 0x90, 0xd8, 0xe5, 0xad, 0x36, 0xba, 0xbb, 0xec, 0x4b, 0x66, 0x2c, 0xd5,
- 0x9a, 0xd0, 0x36, 0xb7, 0x74, 0x56, 0x1e, 0x58, 0x64, 0x53, 0x78, 0xef,
- 0xb5, 0x85, 0x0c, 0x20, 0x79, 0xe2, 0x92, 0x05, 0x19, 0x2a, 0x16, 0x5a,
- 0x85, 0x12, 0xac, 0x34, 0xb7, 0x86, 0x74, 0x09, 0xbf, 0xcb, 0xf4, 0xb9,
- 0x3c, 0x15, 0x0d, 0xa7, 0x51, 0xed, 0x3a, 0x2a, 0xaa, 0x2c, 0x6f, 0xcb,
- 0x96, 0x73, 0x84, 0x66, 0xdd, 0x16, 0xba, 0x0d, 0x7d, 0x2e, 0x14, 0xb3,
- 0xaa, 0xb4, 0xf9, 0x9d, 0x77, 0xdb, 0x58, 0x44, 0xab, 0x87, 0x37, 0x38,
- 0x94, 0xcf, 0xb4, 0x34, 0x18, 0x4a, 0xb3, 0x72, 0x4e, 0x86, 0x82, 0x3a,
- 0xf9, 0xc4, 0xf0, 0xd3, 0x92, 0xf7, 0x4b, 0xc1, 0x0d, 0x5b, 0x1a, 0xdb,
- 0x82, 0xf2, 0x1e, 0xa6, 0x96, 0x68, 0x80, 0xd3, 0x43, 0xba, 0x16, 0x5f,
- 0x5a, 0xd3, 0x82, 0x15, 0x7a, 0x6a, 0xee, 0x18, 0xa2, 0xb8, 0x92, 0x0f,
- 0x99, 0xb2, 0x08, 0xf4, 0xa6, 0x91, 0xf1, 0x9c, 0x5d, 0x32, 0xa9, 0xdb,
- 0x2b, 0x25, 0x8c, 0x9f, 0x60, 0xa1, 0xe7, 0xfe, 0xa6, 0xb1, 0x48, 0x23,
- 0xeb, 0xc7, 0xc9, 0x82, 0x9a, 0xa1, 0x76, 0x18, 0x4f, 0x47, 0xbd, 0x02,
- 0x02, 0x6a, 0xb4, 0x8c, 0x16, 0xe6, 0x32, 0xa0, 0xd1, 0x7a, 0x39, 0x47,
- 0x6e, 0x78, 0x13, 0x28, 0x48, 0xd5, 0xc0, 0xe1, 0x06, 0x0c, 0x03, 0x1f,
- 0x57, 0xa8, 0xc1, 0x92, 0x4d, 0xb4, 0x96, 0xe6, 0xea, 0x3a, 0x71, 0x1f,
- 0x88, 0x41, 0xdf, 0x61, 0xcb, 0x14, 0x61, 0x58, 0x79, 0x2b, 0x5f, 0xe6,
- 0xc0, 0x91, 0x2b, 0xca, 0x5d, 0xd4, 0x28, 0x66, 0xd4, 0xde, 0xc3, 0x5c,
- 0x8f, 0x38, 0xd8, 0x37, 0xaa, 0xba, 0x05, 0xfd, 0xf6, 0x54, 0x95, 0x63,
- 0x04, 0x36, 0x33, 0xf8, 0x30, 0x52, 0x1d, 0x28, 0x38, 0xfb, 0x99, 0x0f,
- 0x1a, 0x34, 0x8c, 0xf5, 0x0c, 0xe5, 0x4c, 0x10, 0xca, 0x74, 0x6c, 0xaa,
- 0x63, 0xda, 0xbf, 0x5a, 0x5b, 0x4f, 0xd1, 0xbe, 0x92, 0xca, 0x47, 0x79,
- 0xf7, 0x1d, 0x95, 0xdc, 0xda, 0xf8, 0x8b, 0xa0, 0x01, 0x0d, 0x55, 0xfa,
- 0x9c, 0x15, 0xd2, 0x3c, 0x99, 0x64, 0x39, 0x34, 0xbf, 0x56, 0x65, 0xf5,
- 0x7a, 0x15, 0xde, 0xf3, 0x0e, 0x7b, 0xc0, 0x8e, 0xa8, 0x31, 0x51, 0x6f,
- 0x8a, 0xc0, 0xd4, 0x71, 0xe4, 0xf7, 0x71, 0x63, 0xdb, 0xa7, 0x91, 0x34,
- 0x81, 0xe0, 0x76, 0xef, 0xc2, 0x81, 0xd1, 0xeb, 0x05, 0x5d, 0xe4, 0x93,
- 0x9e, 0xd1, 0x2f, 0x1e, 0xf5, 0x18, 0x66, 0x47, 0x8a, 0x76, 0xa5, 0xdc,
- 0x49, 0xdf, 0x36, 0x74, 0xf1, 0xe6, 0x1b, 0x9e, 0x19, 0xad, 0x43, 0x91,
- 0x82, 0x75, 0xec, 0xce, 0xf6, 0x7b, 0xf4, 0x65, 0xc2, 0xf9, 0xdd, 0xf9,
- 0xac, 0x73, 0xe9, 0x1b, 0x66, 0xd5, 0xdb, 0x7b, 0xbe, 0x3f, 0xdc, 0x7b,
- 0xfa, 0xf9, 0x70, 0x8f, 0xda, 0x9d, 0x7b, 0x73, 0xe3, 0x32, 0x4c, 0x74,
- 0xe4, 0xf6, 0x06, 0x8a, 0x34, 0x7d, 0x4f, 0xba, 0x21, 0xda, 0xf9, 0x0b,
- 0x8b, 0xbb, 0x21, 0x9e, 0x1b, 0x72, 0xd3, 0xb5, 0xe0, 0x1b, 0x0b, 0xa3,
- 0xd3, 0xe4, 0xcb, 0x20, 0x0e, 0x32, 0x70, 0xd9, 0x44, 0xcc, 0x8b, 0xab,
- 0x1c, 0x6c, 0xa4, 0xb8, 0xc9, 0x1e, 0x9d, 0xe8, 0xac, 0x33, 0xf2, 0x29,
- 0x37, 0xc0, 0xa2, 0xd3, 0x19, 0x9f, 0x91, 0x8a, 0xf4, 0x89, 0xa8, 0x91,
- 0x4e, 0xaa, 0xdb, 0xef, 0x07, 0x62, 0xf3, 0x17, 0x5b, 0x7d, 0x00, 0xf0,
- 0xb2, 0x87, 0xae, 0x0d, 0xd2, 0x48, 0x00, 0x7f, 0x6d, 0x8c, 0x38, 0x81,
- 0xfc, 0xe2, 0x07, 0x55, 0xe3, 0xb6, 0x01, 0x71, 0xff, 0x92, 0x21, 0xe8,
- 0x3b, 0x57, 0x81, 0xe3, 0xe3, 0x48, 0xd0, 0xc8, 0x16, 0x25, 0xa0, 0x05,
- 0xe6, 0x67, 0x41, 0xf6, 0x58, 0x48, 0xeb, 0x70, 0x78, 0xe7, 0x8f, 0x7f,
- 0x74, 0x12, 0x69, 0x44, 0xd9, 0x2f, 0xd4, 0x9c, 0xe9, 0x49, 0x9f, 0x0a,
- 0xc1, 0x28, 0x56, 0xcd, 0x6d, 0x5e, 0x7a, 0x87, 0x7f, 0x21, 0xe7, 0xf0,
- 0xcf, 0x83, 0xbf, 0x98, 0x7f, 0xfe, 0xdc, 0xd3, 0x43, 0xcd, 0xa0, 0x8c,
- 0xae, 0x50, 0xc4, 0x81, 0xdf, 0xd2, 0x06, 0xf5, 0x93, 0x66, 0xf7, 0x72,
- 0xd2, 0x0c, 0x2e, 0x8e, 0xce, 0xf9, 0x30, 0x96, 0x1c, 0xf6, 0x26, 0x6e,
- 0x86, 0x1c, 0x22, 0xb5, 0x1e, 0x22, 0x9c, 0xb0, 0x9e, 0x99, 0x4f, 0x2c,
- 0x2d, 0xbd, 0x57, 0xfa, 0x1a, 0x06, 0x82, 0xc6, 0x58, 0x72, 0x6b, 0xbb,
- 0x2b, 0x33, 0x11, 0x38, 0x0d, 0x08, 0x90, 0xc4, 0xc8, 0x5d, 0x55, 0xa4,
- 0xa5, 0xa3, 0x3c, 0x60, 0x1d, 0x8d, 0x18, 0xb0, 0xc7, 0xe1, 0xc6, 0x4c,
- 0xa9, 0x9f, 0x08, 0x9e, 0x39, 0xd7, 0x44, 0xd4, 0x82, 0xa4, 0x6b, 0xc8,
- 0x60, 0x08, 0xa5, 0xd2, 0xb6, 0xcc, 0xab, 0x8f, 0x58, 0x9f, 0x94, 0xf7,
- 0x78, 0x39, 0x42, 0x98, 0xcf, 0x67, 0x56, 0xeb, 0xbb, 0x53, 0xc0, 0x32,
- 0x5b, 0xb6, 0xed, 0x51, 0xd6, 0xdd, 0x0e, 0xba, 0xed, 0x0a, 0x43, 0x1c,
- 0x05, 0x5d, 0x94, 0xc7, 0xca, 0xec, 0x01, 0x58, 0xa0, 0x52, 0x46, 0x79,
- 0x6e, 0xf4, 0x5c, 0xcb, 0x1a, 0x1e, 0x30, 0x1f, 0x00, 0x4d, 0xc0, 0x2c,
- 0xb8, 0xfd, 0x76, 0xda, 0xb7, 0x16, 0x5a, 0x8e, 0x51, 0xfb, 0xc4, 0xd7,
- 0xae, 0x64, 0x01, 0x5b, 0x86, 0xb3, 0x8a, 0xb2, 0x89, 0xd2, 0x4c, 0x83,
- 0x1a, 0x0f, 0x10, 0x32, 0x0b, 0x9f, 0x0c, 0x04, 0x79, 0x55, 0xa7, 0xfb,
- 0x2c, 0x6a, 0x2b, 0xd0, 0x41, 0x73, 0xca, 0xe8, 0x9c, 0x7d, 0xea, 0x20,
- 0x3e, 0x51, 0x1d, 0xff, 0x35, 0xd2, 0x9a, 0x7d, 0x39, 0xd3, 0xe2, 0x66,
- 0x09, 0xcf, 0x12, 0x0c, 0x8b, 0xb6, 0xf8, 0xa6, 0xe9, 0x2f, 0x62, 0x98,
- 0xeb, 0xde, 0xa5, 0xba, 0xff, 0x28, 0x74, 0xa5, 0x54, 0x1f, 0x73, 0x26,
- 0xf2, 0x20, 0x5f, 0xdd, 0x4f, 0x40, 0x05, 0x79, 0xc4, 0x96, 0x36, 0x24,
- 0x8b, 0xbd, 0x61, 0xaa, 0xf5, 0xe5, 0x25, 0x21, 0x22, 0x85, 0x19, 0x79,
- 0x54, 0xa9, 0x28, 0x05, 0x03, 0xd2, 0xa0, 0xc6, 0x08, 0x72, 0x9a, 0xb9,
- 0x52, 0xc3, 0x95, 0x43, 0x8a, 0xc0, 0xa9, 0x1c, 0xae, 0x7b, 0x27, 0x70,
- 0x02, 0x5a, 0x53, 0xc9, 0xf1, 0x76, 0x9a, 0x4c, 0x99, 0x0d, 0x74, 0xa2,
- 0x6d, 0x39, 0x98, 0xc3, 0x04, 0x1a, 0x04, 0x2e, 0x66, 0x48, 0x44, 0xf2,
- 0x35, 0x74, 0xcb, 0xbe, 0x8d, 0xee, 0x46, 0x78, 0xd8, 0x8c, 0x91, 0x25,
- 0x70, 0x9d, 0xf9, 0x4c, 0x20, 0x5c, 0x19, 0x83, 0xb3, 0xb4, 0x98, 0x86,
- 0xac, 0x57, 0x8a, 0x3c, 0x6a, 0xdf, 0x9a, 0x33, 0x22, 0xc7, 0x26, 0xbf,
- 0x80, 0x13, 0x85, 0xbe, 0xb6, 0xf4, 0x78, 0xb8, 0x1f, 0x6c, 0x6c, 0x35,
- 0x1f, 0x4c, 0x26, 0x93, 0x01, 0xe9, 0x01, 0x2f, 0x58, 0x39, 0xd9, 0x15,
- 0xe5, 0xa0, 0xc3, 0x67, 0x30, 0xca, 0x84, 0xde, 0x47, 0x47, 0x47, 0xa2,
- 0xc7, 0x5c, 0x5c, 0xb5, 0x34, 0x0a, 0x0b, 0x37, 0x28, 0x1a, 0x55, 0xac,
- 0x53, 0x40, 0x75, 0xb5, 0xae, 0xc1, 0xac, 0xac, 0xc8, 0xab, 0xe8, 0xb5,
- 0xb5, 0xb1, 0x2d, 0x4c, 0xe8, 0xc2, 0x6c, 0x48, 0xdf, 0x65, 0x24, 0x9a,
- 0xb1, 0x83, 0xad, 0x59, 0x71, 0x3f, 0x2b, 0x7a, 0x51, 0xc6, 0x6e, 0xb7,
- 0xe1, 0xe6, 0xa9, 0xfa, 0xc0, 0x8d, 0x3a, 0xc1, 0x2a, 0xe2, 0xd4, 0xb2,
- 0xa3, 0xd0, 0x67, 0xd3, 0x5c, 0x12, 0xc0, 0x52, 0xf9, 0x56, 0x7b, 0xec,
- 0x7b, 0xf6, 0x43, 0x48, 0xdd, 0xdc, 0x92, 0xa7, 0x9d, 0x5b, 0x12, 0x25,
- 0x3e, 0xac, 0x2a, 0x90, 0x7d, 0xfb, 0x88, 0xf0, 0xa4, 0x8f, 0xe4, 0x40,
- 0x1c, 0x5d, 0x21, 0x7f, 0x6b, 0x8e, 0xcd, 0x31, 0x53, 0xae, 0x58, 0x08,
- 0x68, 0x53, 0xde, 0xd1, 0xe9, 0xee, 0xc5, 0xe9, 0x28, 0xc8, 0x74, 0xbf,
- 0x83, 0xcb, 0x98, 0x5c, 0xc3, 0x4d, 0x97, 0x27, 0x93, 0x88, 0x00, 0xff,
- 0xc5, 0x49, 0x63, 0x39, 0x9c, 0xbf, 0x12, 0x45, 0xbb, 0x5a, 0x2f, 0xb5,
- 0x08, 0xc6, 0xde, 0xdd, 0xcb, 0x6c, 0x49, 0x10, 0x22, 0xda, 0x0e, 0x94,
- 0x13, 0x61, 0xab, 0xe4, 0xed, 0xcb, 0x0b, 0x94, 0xb5, 0xd4, 0x92, 0xe2,
- 0x01, 0x17, 0x50, 0xe8, 0x19, 0xbf, 0xb1, 0xa8, 0x34, 0x14, 0xb5, 0x49,
- 0x27, 0xae, 0xbd, 0x95, 0x2a, 0xeb, 0xbc, 0x7d, 0x95, 0x32, 0xde, 0x26,
- 0xf2, 0x1b, 0x92, 0xca, 0xed, 0xd0, 0xe6, 0xf9, 0xf6, 0x6e, 0xec, 0x45,
- 0x77, 0x83, 0x09, 0x10, 0x3f, 0x0e, 0xef, 0x44, 0x94, 0x2b, 0xa1, 0x05,
- 0xc3, 0x45, 0xa7, 0x3f, 0x2f, 0x2e, 0x73, 0x78, 0x02, 0x69, 0xbf, 0xfc,
- 0xc0, 0x5b, 0xe0, 0x26, 0x65, 0xea, 0x54, 0x5c, 0x82, 0xd3, 0x84, 0x2f,
- 0xe7, 0x23, 0x82, 0x7b, 0xc2, 0xd2, 0x54, 0x63, 0x50, 0xb6, 0xf4, 0x31,
- 0xac, 0x2c, 0x24, 0xe4, 0xd4, 0x7c, 0x62, 0x4c, 0x84, 0x09, 0xb2, 0x3f,
- 0xa8, 0x0c, 0xb0, 0x6a, 0xa6, 0xd6, 0xe6, 0x0d, 0x50, 0x56, 0xf5, 0x90,
- 0x56, 0x61, 0xac, 0x82, 0x34, 0x05, 0x59, 0xe1, 0x46, 0x3f, 0xfc, 0xd3,
- 0xc6, 0xe5, 0xf1, 0x0d, 0x2c, 0xb2, 0xcb, 0xe0, 0xd2, 0xb5, 0x18, 0x44,
- 0x11, 0xdc, 0x57, 0x52, 0x51, 0x09, 0xdc, 0x85, 0x17, 0xe8, 0x4a, 0x4a,
- 0xc5, 0xc2, 0x1a, 0x4c, 0xfb, 0xd1, 0x06, 0x2b, 0xfd, 0x76, 0x7f, 0x4a,
- 0xc6, 0xa4, 0x6d, 0xb6, 0x2a, 0x68, 0x00, 0xc3, 0x69, 0x82, 0x6f, 0x6b,
- 0xb8, 0x6f, 0x8e, 0x5d, 0x1f, 0x9c, 0x16, 0x7a, 0x5c, 0xb3, 0x47, 0x0e,
- 0xc5, 0x21, 0x11, 0x83, 0xba, 0x41, 0x97, 0xee, 0x9b, 0x0e, 0x23, 0x87,
- 0x95, 0xd8, 0x0b, 0xd7, 0x61, 0x83, 0xcf, 0x07, 0x6b, 0x81, 0x99, 0x4d,
- 0x52, 0x05, 0xf0, 0x98, 0x06, 0xe8, 0xff, 0x75, 0xcb, 0xf5, 0x7b, 0x1b,
- 0x46, 0xfc, 0x10, 0x7a, 0x3b, 0x84, 0xf0, 0xf1, 0x2e, 0xf4, 0xd4, 0x77,
- 0x13, 0x76, 0xdf, 0x0d, 0xfb, 0x35, 0xf1, 0xf2, 0x36, 0xcf, 0xe7, 0xdb,
- 0xe3, 0x97, 0xaf, 0x3a, 0xd1, 0x4b, 0x3e, 0x05, 0xae, 0xbc, 0xf3, 0x6a,
- 0x8e, 0x33, 0x6e, 0xeb, 0xb3, 0x56, 0x47, 0x09, 0xed, 0x8e, 0x32, 0x2a,
- 0x63, 0xd4, 0x64, 0x04, 0xda, 0x82, 0x13, 0xd2, 0xd9, 0xdd, 0xa6, 0xd3,
- 0x33, 0xe2, 0x67, 0x1f, 0x88, 0xc7, 0x1a, 0x9a, 0x32, 0xd7, 0x54, 0x79,
- 0x8c, 0x7c, 0x49, 0x8c, 0x3c, 0x2f, 0xc6, 0xc5, 0x6c, 0xb6, 0xe1, 0x76,
- 0x67, 0x70, 0x60, 0xaa, 0x7d, 0x62, 0x86, 0xe9, 0x81, 0x8c, 0x78, 0x6f,
- 0x8c, 0xd9, 0x13, 0x66, 0x45, 0xd9, 0x93, 0x82, 0x04, 0x52, 0xc9, 0x83,
- 0xb3, 0xd1, 0x2c, 0x48, 0x57, 0x9b, 0x41, 0x4d, 0x3c, 0x2a, 0xc8, 0x67,
- 0x77, 0x8c, 0xa6, 0x09, 0xd9, 0x66, 0x2d, 0x55, 0xf2, 0x1f, 0xff, 0xf8,
- 0xcb, 0xcf, 0x91, 0x76, 0x35, 0x70, 0xf8, 0x5d, 0x71, 0x45, 0xa1, 0x79,
- 0x7a, 0x21, 0x98, 0x5d, 0xb6, 0x2f, 0x08, 0x27, 0x9a, 0x70, 0x3c, 0xa3,
- 0xae, 0xb2, 0xf9, 0x6c, 0xe8, 0xe5, 0x54, 0x86, 0xd7, 0x22, 0x4c, 0x28,
- 0xfd, 0x20, 0xb5, 0x1f, 0x45, 0x09, 0x38, 0x97, 0xed, 0xa2, 0x6f, 0x03,
- 0xb5, 0x7c, 0x73, 0x19, 0xd3, 0x16, 0xd7, 0x9d, 0x77, 0x22, 0x40, 0x0f,
- 0x73, 0x7d, 0xd9, 0xda, 0xc1, 0xf4, 0xf7, 0xef, 0x4e, 0xac, 0xab, 0xd3,
- 0x97, 0xca, 0x57, 0x86, 0x53, 0xef, 0x06, 0xd9, 0x5d, 0x36, 0x36, 0x52,
- 0xa2, 0x52, 0xc0, 0x87, 0xc1, 0xa2, 0x4a, 0x5e, 0x2c, 0x0c, 0x8f, 0xe7,
- 0x1d, 0x50, 0x1d, 0xdf, 0xe2, 0xb5, 0x44, 0x5f, 0xb3, 0xe8, 0xd5, 0x97,
- 0x45, 0x69, 0x28, 0xb4, 0x90, 0x2a, 0x5c, 0x29, 0x45, 0x6e, 0x3a, 0x33,
- 0x12, 0x2a, 0x2c, 0x09, 0xdc, 0x01, 0xd7, 0x8f, 0x45, 0xe3, 0x26, 0x28,
- 0x4e, 0x0f, 0x26, 0x92, 0x94, 0xf5, 0xb5, 0x51, 0x1e, 0xcd, 0xec, 0x8d,
- 0x91, 0x0d, 0x6b, 0xbd, 0xea, 0x0b, 0x4b, 0x95, 0x8a, 0x22, 0x1a, 0x85,
- 0x0f, 0xb0, 0xe5, 0x87, 0x6c, 0x61, 0x19, 0xa1, 0xe3, 0xaf, 0x48, 0x7b,
- 0xd3, 0x37, 0xb0, 0x3f, 0x05, 0x11, 0x25, 0xa4, 0xab, 0x2e, 0x80, 0xdd,
- 0xa0, 0x89, 0xcb, 0x5e, 0x45, 0xa1, 0x46, 0xae, 0xfd, 0xe7, 0x7d, 0x4f,
- 0xac, 0x35, 0x95, 0x83, 0x43, 0x49, 0x4d, 0xac, 0x65, 0x5b, 0x7c, 0xe0,
- 0x58, 0x2a, 0x3f, 0x4c, 0x51, 0x0f, 0x99, 0xcd, 0x59, 0xc4, 0x49, 0x5a,
- 0x95, 0x1b, 0x33, 0xd6, 0xf7, 0xd5, 0x88, 0x11, 0x20, 0x72, 0x53, 0x15,
- 0xac, 0x38, 0xf4, 0xa9, 0x9c, 0x5c, 0x3c, 0x0f, 0xd1, 0x58, 0xef, 0x85,
- 0xa0, 0xa5, 0x5d, 0x92, 0xd9, 0x2f, 0xf6, 0x03, 0x41, 0xe5, 0x53, 0x3b,
- 0x48, 0x86, 0x1f, 0xc1, 0xdb, 0x94, 0x5e, 0x01, 0x19, 0xc2, 0x1b, 0x7e,
- 0x2c, 0x1b, 0xde, 0x1a, 0x0e, 0xb1, 0x96, 0xa7, 0x4f, 0x9e, 0x3c, 0xe1,
- 0x58, 0x4b, 0xef, 0x84, 0x3e, 0xfc, 0xee, 0xf8, 0xe8, 0xec, 0xcd, 0x9b,
- 0xe3, 0xb7, 0xaf, 0x8e, 0x5f, 0x69, 0xc6, 0x87, 0xb7, 0x12, 0xc7, 0x1d,
- 0xe1, 0x8a, 0x90, 0x25, 0x68, 0xe8, 0xbc, 0xf7, 0xe4, 0xd1, 0x60, 0xff,
- 0xc9, 0xa3, 0xc4, 0xf0, 0x62, 0x6a, 0xeb, 0xd3, 0xd2, 0x79, 0x0a, 0xfb,
- 0xf6, 0x6a, 0x6d, 0x54, 0x35, 0x00, 0x3b, 0xd7, 0xc0, 0xda, 0x20, 0xd7,
- 0x2b, 0xbc, 0x3d, 0x59, 0x0d, 0x3b, 0x3a, 0x92, 0x19, 0x30, 0xec, 0x59,
- 0x88, 0x4e, 0x17, 0xb0, 0x14, 0xdd, 0x87, 0x18, 0x74, 0xff, 0x11, 0x3e,
- 0x34, 0x4c, 0x5e, 0x1b, 0xed, 0x63, 0x56, 0xdc, 0x32, 0x2f, 0x1e, 0x5d,
- 0x19, 0xa5, 0x34, 0x0b, 0x43, 0x95, 0xcd, 0xf7, 0xf1, 0xfa, 0x01, 0xbf,
- 0xfe, 0x4f, 0x8c, 0xd1, 0x3f, 0x79, 0xde, 0x34, 0x2c, 0xcd, 0x41, 0xa6,
- 0x9e, 0x20, 0x5a, 0x8a, 0xd8, 0x01, 0x21, 0x35, 0x62, 0x73, 0xfc, 0xdb,
- 0x97, 0xe7, 0x78, 0xda, 0x98, 0xe5, 0x67, 0x3f, 0xfe, 0xd9, 0x95, 0x77,
- 0x5e, 0xef, 0x69, 0x36, 0xa3, 0x54, 0xb0, 0x52, 0x5b, 0xd5, 0x65, 0x18,
- 0xf4, 0x76, 0xca, 0xac, 0x35, 0x08, 0xf5, 0x92, 0xa1, 0x15, 0x22, 0x03,
- 0xd5, 0x90, 0x8e, 0x3b, 0x1e, 0xca, 0xa6, 0x95, 0xda, 0xb4, 0x29, 0x56,
- 0xcf, 0x6f, 0x44, 0x39, 0xa6, 0x71, 0x9b, 0x73, 0xd7, 0x9f, 0x7c, 0x39,
- 0xe5, 0x4e, 0xe3, 0x0d, 0xc7, 0x6c, 0x5d, 0xae, 0xb3, 0x98, 0xd7, 0x74,
- 0x23, 0xb6, 0x0e, 0x01, 0x36, 0xe5, 0x8b, 0xb4, 0xcc, 0xe7, 0x77, 0xca,
- 0xe0, 0x37, 0xdc, 0xfc, 0x98, 0x53, 0xa5, 0x28, 0xf6, 0xe5, 0xa0, 0xc4,
- 0x8b, 0x20, 0xed, 0xd4, 0x76, 0xf2, 0x01, 0x13, 0x0b, 0xf6, 0x17, 0xef,
- 0x2b, 0x13, 0x6b, 0x23, 0x1a, 0x52, 0xd3, 0xfe, 0xb7, 0x0a, 0x45, 0x17,
- 0xe4, 0x68, 0xf2, 0xfa, 0xe4, 0xf4, 0x78, 0x27, 0x79, 0x9d, 0xd5, 0x52,
- 0xda, 0xa4, 0x19, 0xc6, 0xb8, 0xf2, 0x7f, 0x47, 0x0a, 0x96, 0x85, 0xa4,
- 0x95, 0xda, 0xe0, 0x68, 0x2e, 0x98, 0xf8, 0xe0, 0x48, 0xd9, 0xd0, 0x3a,
- 0x29, 0xde, 0x1c, 0x5a, 0x22, 0xe2, 0x71, 0x9a, 0x5b, 0xa6, 0xf1, 0x4d,
- 0xd9, 0xf9, 0x48, 0xde, 0xad, 0xe2, 0x3b, 0x0c, 0x3d, 0xbc, 0xcb, 0xc2,
- 0x4f, 0x21, 0xc0, 0xa4, 0x25, 0xe7, 0x59, 0xe3, 0xc5, 0x79, 0xb5, 0x9a,
- 0x43, 0x1a, 0x44, 0xd1, 0x5d, 0xe6, 0x99, 0xab, 0xe8, 0x23, 0xce, 0x37,
- 0xd6, 0x83, 0x4d, 0xc4, 0x64, 0x81, 0x8a, 0xf5, 0x7a, 0x84, 0xfb, 0x56,
- 0x09, 0x87, 0xb4, 0x13, 0xfe, 0xef, 0xee, 0x57, 0x9b, 0xb0, 0xd2, 0x8e,
- 0xa9, 0x0b, 0xba, 0xbc, 0x41, 0x1c, 0x45, 0x6d, 0x59, 0x35, 0x66, 0xa8,
- 0x6a, 0x67, 0x83, 0x13, 0x22, 0xea, 0x2b, 0xf9, 0xee, 0xd4, 0xdc, 0xfd,
- 0xb3, 0x34, 0xde, 0x53, 0xfd, 0x81, 0xfa, 0x71, 0xda, 0xdb, 0x45, 0xfa,
- 0xae, 0x6b, 0x96, 0x71, 0xb4, 0xc7, 0x25, 0x4b, 0x65, 0x69, 0x16, 0xc7,
- 0xda, 0x14, 0xb2, 0xf5, 0x2d, 0x12, 0xa1, 0xce, 0x17, 0x8f, 0x5d, 0x49,
- 0xeb, 0x02, 0xf2, 0xa5, 0x70, 0xfd, 0x58, 0x15, 0x75, 0xf9, 0x4b, 0x59,
- 0x9b, 0x84, 0xf6, 0xa8, 0x4b, 0x36, 0x3b, 0x65, 0x58, 0x87, 0x5e, 0x43,
- 0xa1, 0xe3, 0xc2, 0x2e, 0xea, 0x42, 0x53, 0x32, 0x5a, 0x72, 0x44, 0x5b,
- 0x92, 0xaf, 0xfb, 0x22, 0xa8, 0xad, 0xb3, 0xfb, 0x9f, 0x69, 0x5a, 0xa2,
- 0xa1, 0xba, 0x68, 0x68, 0x47, 0x3a, 0x25, 0xba, 0x3e, 0xa1, 0xda, 0x7d,
- 0xf2, 0x31, 0xa7, 0x02, 0xc4, 0x35, 0xa9, 0x73, 0xe9, 0x52, 0xeb, 0xad,
- 0x78, 0x9a, 0xb6, 0xcb, 0x87, 0x61, 0xb7, 0x21, 0x95, 0x33, 0x74, 0xf4,
- 0x56, 0x24, 0xc0, 0x4a, 0x38, 0x0d, 0x80, 0xc1, 0xad, 0xf3, 0x99, 0x53,
- 0x45, 0x83, 0x3d, 0x2d, 0xaa, 0xa8, 0xa1, 0x0e, 0x92, 0x74, 0xc5, 0x48,
- 0x57, 0x00, 0x73, 0x8c, 0x01, 0xc0, 0x01, 0x5f, 0xdb, 0x8d, 0x40, 0x8b,
- 0x6d, 0x95, 0x19, 0x37, 0x26, 0x19, 0x1a, 0x4b, 0x74, 0x81, 0x92, 0x00,
- 0x45, 0xef, 0xc7, 0x92, 0x85, 0x3c, 0x46, 0xb6, 0x5d, 0xe6, 0xd7, 0xb1,
- 0x2c, 0x0b, 0x86, 0xca, 0xa3, 0x89, 0x51, 0x96, 0x86, 0x03, 0xab, 0xb3,
- 0x4d, 0x95, 0x35, 0xa4, 0xcd, 0x7e, 0x69, 0xe0, 0xc1, 0x09, 0x65, 0x83,
- 0x13, 0x3c, 0x87, 0xc6, 0x0a, 0x20, 0xaf, 0x25, 0x37, 0x5c, 0xff, 0xd6,
- 0x68, 0x3e, 0x87, 0x3d, 0xdb, 0x4f, 0x83, 0xfc, 0xaa, 0x24, 0x1d, 0x1b,
- 0x9c, 0x43, 0x46, 0xc6, 0xb2, 0x18, 0x44, 0x1b, 0x49, 0x8a, 0xe6, 0x5e,
- 0xab, 0xe0, 0xb2, 0x05, 0x37, 0x61, 0x5a, 0xb3, 0x2d, 0x80, 0xe1, 0x4a,
- 0xd1, 0xb0, 0xca, 0x0f, 0x53, 0xfa, 0x71, 0x70, 0x44, 0x1f, 0x1f, 0x7c,
- 0x4b, 0xc3, 0xfd, 0xa9, 0x67, 0x1d, 0xbe, 0xed, 0x5f, 0x1d, 0x86, 0x9d,
- 0xdf, 0x9d, 0xdf, 0xb0, 0x05, 0x8e, 0x49, 0x89, 0x24, 0x32, 0x41, 0x5a,
- 0x2a, 0x8e, 0xc8, 0xae, 0x6e, 0x38, 0x45, 0x53, 0xaa, 0xb0, 0x6d, 0xb2,
- 0x4d, 0x39, 0x30, 0xb7, 0xc8, 0x8a, 0x40, 0x74, 0xa6, 0x83, 0x62, 0x36,
- 0xa0, 0x0c, 0x69, 0x40, 0xe6, 0x21, 0x19, 0xc9, 0x3b, 0x75, 0x04, 0x0c,
- 0x42, 0x9d, 0x17, 0xa6, 0xd3, 0x98, 0x6a, 0xce, 0x75, 0x8c, 0x02, 0x8c,
- 0xe8, 0x49, 0x47, 0xd9, 0xc8, 0x43, 0xf1, 0xca, 0xd3, 0xeb, 0xda, 0x92,
- 0x17, 0x92, 0x50, 0x0b, 0x22, 0x02, 0x7f, 0x1a, 0x95, 0x47, 0xf4, 0x59,
- 0x7b, 0xa7, 0x55, 0x93, 0x0d, 0xb7, 0x60, 0x57, 0x2e, 0xf9, 0x9f, 0xd7,
- 0x2b, 0x52, 0x59, 0x81, 0xd7, 0x1c, 0x78, 0x5f, 0xb4, 0x48, 0x84, 0x90,
- 0x98, 0xcd, 0xe5, 0xff, 0x64, 0xf8, 0xa8, 0x1f, 0x04, 0xea, 0x6b, 0x32,
- 0xf6, 0x97, 0x2e, 0x4b, 0xc8, 0x3c, 0x4c, 0x32, 0x72, 0x10, 0xab, 0xaa,
- 0xad, 0xea, 0x3b, 0xc8, 0x6b, 0x5b, 0x44, 0x4b, 0xa9, 0xc5, 0xae, 0xee,
- 0xc1, 0xe5, 0xf4, 0x10, 0x09, 0x45, 0x6c, 0x72, 0xf5, 0x6c, 0x0c, 0xe0,
- 0x5a, 0x32, 0xb6, 0xbe, 0x1a, 0xb4, 0x7b, 0x56, 0xdb, 0xe6, 0x95, 0x7e,
- 0xf5, 0x86, 0xd7, 0x88, 0xb2, 0xd3, 0xd3, 0x44, 0x58, 0xd2, 0x2f, 0xb5,
- 0xf1, 0xd9, 0xc0, 0x10, 0x55, 0x7a, 0x74, 0x0f, 0x32, 0xfc, 0x90, 0x81,
- 0x3a, 0x14, 0x36, 0xba, 0xea, 0xa6, 0x19, 0x43, 0xac, 0x3f, 0x03, 0xc5,
- 0x6c, 0x63, 0x19, 0xed, 0xa0, 0xe6, 0xee, 0x07, 0x62, 0x5b, 0xef, 0x2c,
- 0xb5, 0x69, 0x06, 0xa9, 0x02, 0x49, 0xb0, 0xd4, 0x9c, 0xef, 0x94, 0xf4,
- 0x95, 0xbb, 0xce, 0xd4, 0xe2, 0x8e, 0x9c, 0x5f, 0x3a, 0x36, 0xaf, 0xa1,
- 0xd8, 0x0f, 0xde, 0x9a, 0x6d, 0x38, 0x4c, 0xfe, 0xad, 0xc8, 0xb8, 0x66,
- 0xf5, 0x9e, 0x92, 0xd5, 0x1f, 0x5e, 0xbe, 0x7b, 0x7b, 0xf2, 0xf6, 0x9b,
- 0x43, 0x2b, 0xe3, 0x20, 0xef, 0xda, 0x1d, 0x8d, 0xac, 0xec, 0xa6, 0xdf,
- 0x32, 0x6e, 0x37, 0xbc, 0x3f, 0x5d, 0x1d, 0x16, 0x10, 0xcb, 0x24, 0xf1,
- 0xcc, 0xce, 0xcb, 0x32, 0xe3, 0xb8, 0x08, 0xdb, 0xa2, 0x5a, 0x39, 0x21,
- 0xe5, 0x9a, 0x74, 0x55, 0x52, 0xb3, 0xce, 0x08, 0x50, 0xc3, 0xe0, 0x14,
- 0x7b, 0x32, 0x2f, 0x1a, 0x1d, 0x02, 0xc1, 0x94, 0x73, 0xda, 0xfe, 0xc2,
- 0xe7, 0x00, 0xb6, 0x98, 0x29, 0xfb, 0x15, 0xb6, 0x54, 0x11, 0xe9, 0x0b,
- 0x4b, 0x66, 0x1e, 0xa7, 0xe1, 0x88, 0x9f, 0xc3, 0x76, 0x47, 0x93, 0x16,
- 0x47, 0x15, 0x6d, 0x59, 0x95, 0x93, 0xb3, 0xc1, 0x92, 0x44, 0x73, 0xbc,
- 0x22, 0x7e, 0x10, 0x69, 0x2e, 0x90, 0xae, 0xf9, 0xbc, 0x30, 0x2a, 0x99,
- 0xfc, 0xd4, 0xd5, 0x65, 0x58, 0x0a, 0x3c, 0x38, 0xcd, 0xd9, 0xe5, 0x39,
- 0xb3, 0x3e, 0xcf, 0x06, 0xa2, 0x27, 0xb2, 0xcc, 0x7f, 0x71, 0x95, 0x44,
- 0xf1, 0x47, 0xe6, 0x99, 0xab, 0x4a, 0xb2, 0xba, 0xce, 0x15, 0xeb, 0x3a,
- 0xf3, 0x55, 0x00, 0xb2, 0x47, 0x1d, 0x50, 0xf1, 0x1b, 0x75, 0xea, 0x20,
- 0x78, 0x45, 0x37, 0xb0, 0x9a, 0x25, 0x0d, 0x50, 0x3b, 0xdb, 0xec, 0x97,
- 0x85, 0x7a, 0x78, 0x9f, 0x02, 0xe7, 0x29, 0x63, 0x9c, 0x31, 0xbf, 0x02,
- 0xc6, 0x7c, 0xdd, 0xd0, 0x78, 0xb5, 0x1e, 0x2f, 0xa6, 0x4f, 0x92, 0x17,
- 0xe6, 0x8f, 0x40, 0xc9, 0xa2, 0x9c, 0xd1, 0xd1, 0x91, 0x51, 0xb4, 0x90,
- 0xe0, 0xc2, 0xf0, 0xb7, 0x39, 0xc1, 0xdf, 0xda, 0x1e, 0x42, 0x07, 0xfb,
- 0x66, 0xa6, 0xb7, 0xa9, 0x42, 0x5a, 0x1a, 0x8d, 0xf0, 0x32, 0xaf, 0x39,
- 0x4f, 0xaf, 0x03, 0x2f, 0xc8, 0x6f, 0x89, 0x8b, 0x3d, 0xdf, 0xdb, 0xff,
- 0x3c, 0x41, 0xf1, 0xc1, 0x9b, 0x57, 0x4f, 0x92, 0xc9, 0x55, 0x36, 0xf9,
- 0x58, 0xad, 0x17, 0x2a, 0x8e, 0x41, 0x53, 0x63, 0x1e, 0x60, 0x9e, 0x01,
- 0xd2, 0x83, 0x99, 0xf8, 0x3c, 0x9f, 0xa0, 0xf4, 0xaf, 0xdf, 0x88, 0x4e,
- 0xcd, 0x34, 0x3a, 0xe5, 0xd9, 0xa1, 0xf6, 0xda, 0xa0, 0x74, 0x01, 0xce,
- 0xa9, 0x89, 0x04, 0x2f, 0x0c, 0x0d, 0xcc, 0xc7, 0x01, 0x84, 0x6d, 0xf4,
- 0xf2, 0x8d, 0x2e, 0xdb, 0x67, 0x4d, 0xaf, 0x37, 0x0e, 0xf6, 0xa3, 0xe1,
- 0xf3, 0x0e, 0xdc, 0xeb, 0x46, 0x63, 0x26, 0xd4, 0x2a, 0xd9, 0x6a, 0x3b,
- 0xb2, 0x07, 0xa0, 0xe5, 0x63, 0x92, 0x00, 0x82, 0xd2, 0x30, 0x5e, 0xf0,
- 0x71, 0x3c, 0xb9, 0x8b, 0x27, 0xa4, 0xb3, 0x28, 0x65, 0xb1, 0x65, 0x84,
- 0x45, 0xc1, 0xac, 0x45, 0x69, 0x42, 0x36, 0x0a, 0x68, 0x91, 0xcd, 0x28,
- 0x04, 0x1b, 0x2a, 0x6d, 0xb6, 0xfe, 0x5b, 0x5d, 0x36, 0x4e, 0xc4, 0x48,
- 0x09, 0xad, 0x87, 0xe2, 0xa0, 0xb5, 0x84, 0x84, 0xd3, 0x06, 0x9b, 0x22,
- 0x60, 0x32, 0xfb, 0x5d, 0x8e, 0x4b, 0xbb, 0xed, 0xa8, 0x18, 0x85, 0x90,
- 0x9c, 0xe7, 0xc0, 0x80, 0x66, 0x8b, 0xba, 0xb8, 0x59, 0x5e, 0x96, 0xf0,
- 0x8f, 0x50, 0x51, 0x58, 0x1a, 0x8b, 0x65, 0xc4, 0x90, 0x4b, 0xdd, 0xd8,
- 0xc6, 0xe2, 0x7a, 0x0a, 0x49, 0x6f, 0xa9, 0x82, 0x7c, 0x7b, 0x0e, 0x62,
- 0x73, 0xc5, 0x32, 0xdb, 0xec, 0xde, 0x16, 0x3d, 0xea, 0xcb, 0x36, 0xed,
- 0x0d, 0x1f, 0x3d, 0x64, 0x9b, 0xc0, 0x44, 0x8d, 0xdd, 0x31, 0xef, 0xf9,
- 0x5a, 0xb2, 0x26, 0x91, 0x1b, 0x66, 0xef, 0xc8, 0xbe, 0x03, 0xe4, 0x32,
- 0xfb, 0xaf, 0xb2, 0x69, 0x63, 0xa8, 0x8d, 0x32, 0xc7, 0x6f, 0xdd, 0xc9,
- 0xd3, 0xdd, 0x93, 0x30, 0x0c, 0xfe, 0xb5, 0xdf, 0x66, 0x3a, 0xf3, 0xeb,
- 0x5f, 0xb9, 0x9a, 0xbd, 0x5f, 0x50, 0xaa, 0xf1, 0xa8, 0xef, 0xbe, 0xf7,
- 0xc8, 0x36, 0xc4, 0xe1, 0x09, 0xb9, 0x73, 0xd1, 0x1a, 0x2e, 0x6c, 0x78,
- 0x42, 0x2f, 0xa0, 0xdc, 0xa5, 0x28, 0x07, 0x50, 0xd9, 0xcd, 0x66, 0x05,
- 0x2a, 0x54, 0x74, 0xfa, 0x66, 0x7b, 0x2b, 0x28, 0xb6, 0xd0, 0x69, 0x89,
- 0x39, 0x29, 0x66, 0xc4, 0x68, 0x66, 0xd6, 0xa4, 0x8f, 0xa6, 0xed, 0x13,
- 0x83, 0xec, 0x7b, 0x2a, 0x3a, 0xfd, 0x00, 0x44, 0x4d, 0xde, 0xaf, 0x88,
- 0x07, 0x87, 0x84, 0xa5, 0x6c, 0xdb, 0xbe, 0xd0, 0xec, 0x92, 0xae, 0xd9,
- 0x39, 0xcc, 0x2f, 0x8d, 0xc9, 0x53, 0xb1, 0x66, 0xa5, 0xdf, 0xa9, 0x50,
- 0x05, 0x0b, 0x95, 0x5f, 0x1a, 0x84, 0x72, 0x3b, 0x14, 0x37, 0xc9, 0x18,
- 0x9c, 0xaf, 0x1e, 0x2c, 0xa3, 0x6a, 0xca, 0x28, 0x8d, 0x6c, 0x7a, 0x34,
- 0xc7, 0x60, 0x75, 0x5f, 0x3b, 0xb6, 0xba, 0xe6, 0x24, 0x11, 0xff, 0x0a,
- 0xf9, 0x42, 0x96, 0x31, 0x40, 0xbf, 0x20, 0x00, 0x14, 0xdd, 0x8e, 0x07,
- 0x37, 0xc0, 0x09, 0x70, 0xbb, 0x5a, 0x2d, 0x8c, 0x78, 0x2d, 0xc3, 0x87,
- 0x31, 0xf7, 0xa3, 0x7e, 0x74, 0x76, 0xe0, 0x36, 0x9f, 0xf9, 0x1b, 0x20,
- 0x78, 0xcf, 0x23, 0xcc, 0xf5, 0xab, 0xce, 0xc2, 0xfe, 0xa6, 0x30, 0x68,
- 0x78, 0x06, 0x0f, 0x86, 0xfa, 0xb5, 0x2e, 0x5a, 0x05, 0xe2, 0xac, 0xb3,
- 0x79, 0xd0, 0xc3, 0xa8, 0xd5, 0x41, 0x1b, 0x4b, 0xbb, 0x16, 0xb5, 0xba,
- 0xb6, 0x56, 0x8f, 0x6a, 0x08, 0xb9, 0x1f, 0x3f, 0xaa, 0x07, 0x1d, 0x3e,
- 0x17, 0xab, 0xa2, 0xb6, 0x9c, 0x9e, 0xf0, 0x99, 0x95, 0xf9, 0x82, 0x80,
- 0xef, 0x86, 0xc9, 0x2b, 0x97, 0xd3, 0x42, 0x80, 0x7b, 0x81, 0xb1, 0x3a,
- 0x5d, 0x77, 0x64, 0x7e, 0x6c, 0xde, 0xad, 0x03, 0x49, 0xea, 0x71, 0x89,
- 0x0b, 0x74, 0xa7, 0x4b, 0x51, 0x56, 0x11, 0x00, 0x61, 0x8a, 0xe7, 0x46,
- 0xc3, 0x97, 0x12, 0xa6, 0x43, 0x6a, 0x96, 0x04, 0x60, 0x88, 0xf4, 0x07,
- 0x7e, 0xcc, 0xdc, 0xaa, 0xd7, 0x28, 0x21, 0x88, 0x79, 0x8a, 0xe8, 0x8b,
- 0xb6, 0xe3, 0x01, 0x6e, 0x44, 0x55, 0x28, 0xcd, 0x47, 0xae, 0xf3, 0x34,
- 0x79, 0x39, 0xaf, 0x07, 0xa3, 0xef, 0x27, 0x1c, 0x61, 0x6b, 0x84, 0xa7,
- 0x82, 0x16, 0xdf, 0xe4, 0x55, 0xa1, 0xee, 0x8c, 0x95, 0x24, 0xad, 0xe6,
- 0xe5, 0x64, 0xbd, 0x20, 0xec, 0x53, 0x62, 0x2b, 0xdb, 0x25, 0x08, 0x1b,
- 0xe9, 0x38, 0x8d, 0xd3, 0xed, 0x43, 0xd0, 0xc3, 0xf4, 0x63, 0xa5, 0x4b,
- 0x92, 0x22, 0x1d, 0xae, 0xc3, 0xb0, 0x73, 0x6e, 0x36, 0xd7, 0x8c, 0x5c,
- 0x41, 0x2d, 0xcb, 0x8e, 0xe1, 0x79, 0x81, 0x02, 0xf3, 0xef, 0xef, 0x4f,
- 0x8e, 0x1a, 0xde, 0x7d, 0x41, 0x96, 0xdf, 0x18, 0xad, 0x60, 0x38, 0x59,
- 0x79, 0x72, 0x06, 0x1d, 0x56, 0xb3, 0x71, 0x35, 0x71, 0xae, 0xb1, 0xbd,
- 0xc5, 0x32, 0x72, 0xa5, 0x1a, 0x7d, 0xe1, 0x97, 0x9d, 0xd1, 0x7d, 0x3d,
- 0xa3, 0x07, 0xbf, 0xf5, 0x19, 0x3d, 0xf8, 0x6d, 0xce, 0xa8, 0x4a, 0x10,
- 0xef, 0xef, 0xfe, 0x71, 0x0d, 0xcc, 0x52, 0x3a, 0xbe, 0xbe, 0xc3, 0xb9,
- 0x99, 0x33, 0x30, 0x60, 0xf0, 0x88, 0x81, 0xf8, 0x2d, 0x06, 0x5c, 0x20,
- 0x1b, 0xab, 0x0d, 0x4b, 0xe4, 0x10, 0x2b, 0xe8, 0x63, 0x3f, 0x39, 0x61,
- 0x40, 0x73, 0xca, 0x4e, 0x92, 0xd7, 0x4f, 0xb9, 0xbe, 0x56, 0xfc, 0xde,
- 0xea, 0xf3, 0x8f, 0x54, 0xe0, 0xe7, 0x13, 0xc0, 0xaa, 0x39, 0x8f, 0x3b,
- 0x2c, 0x66, 0xd5, 0x19, 0xcb, 0x35, 0x85, 0x14, 0x92, 0x97, 0x2b, 0x94,
- 0xc8, 0x1a, 0x8d, 0xe3, 0x96, 0xf1, 0xf5, 0xd0, 0x6f, 0x13, 0x2c, 0x16,
- 0xe6, 0x22, 0x81, 0xc8, 0xf0, 0xe0, 0x4a, 0xe6, 0x7d, 0x7b, 0x3a, 0x34,
- 0x3a, 0xc3, 0x1e, 0xce, 0xc1, 0xfc, 0x25, 0x1b, 0x8e, 0xfb, 0x86, 0xc1,
- 0x2f, 0x83, 0xa6, 0x3a, 0xe3, 0xbb, 0x3a, 0x52, 0x06, 0x86, 0x55, 0x83,
- 0x0a, 0xdb, 0x95, 0x64, 0x99, 0x3e, 0x36, 0x74, 0xdc, 0x31, 0x66, 0xe6,
- 0x47, 0x02, 0xee, 0xcd, 0xa8, 0x4e, 0xc7, 0x1a, 0x57, 0xd4, 0x0f, 0xe5,
- 0x12, 0x1e, 0x2b, 0x6d, 0x45, 0x11, 0x54, 0xcc, 0xfc, 0x3d, 0xd3, 0x34,
- 0x47, 0xcd, 0x21, 0x14, 0x98, 0xd9, 0x66, 0x89, 0x6a, 0xde, 0xa7, 0xbe,
- 0xa3, 0xe4, 0x9b, 0x6e, 0x07, 0x8f, 0xc4, 0x63, 0xcd, 0xf6, 0xaf, 0xea,
- 0x34, 0x0a, 0xe7, 0x2f, 0x16, 0xaf, 0x08, 0x2e, 0x69, 0xd0, 0x44, 0x81,
- 0x3d, 0xe9, 0x96, 0x13, 0xef, 0xc7, 0x62, 0x5f, 0x9c, 0x90, 0x67, 0x93,
- 0xbf, 0x20, 0x0e, 0x28, 0x36, 0xf3, 0x2d, 0x34, 0x34, 0xbc, 0x44, 0xf0,
- 0xe7, 0x73, 0x9f, 0xad, 0x7e, 0x08, 0xa7, 0x67, 0x7d, 0xcf, 0x0e, 0x20,
- 0xba, 0x71, 0x62, 0x15, 0xd4, 0x79, 0x38, 0x1c, 0x46, 0xe0, 0x2c, 0xae,
- 0xf3, 0xec, 0xa6, 0xe1, 0x8a, 0x97, 0x99, 0xf5, 0x6d, 0xa3, 0x0c, 0xf6,
- 0x00, 0x5d, 0x83, 0x42, 0x66, 0xc8, 0x31, 0x10, 0x34, 0x3b, 0xca, 0x49,
- 0xdc, 0x91, 0xf7, 0x9f, 0xf6, 0xc8, 0xfc, 0x91, 0xc9, 0x5c, 0xc5, 0xea,
- 0x41, 0x19, 0x10, 0xd9, 0xf5, 0x71, 0xe8, 0xc3, 0x23, 0x52, 0xde, 0x25,
- 0xd4, 0xb6, 0xc9, 0xc9, 0x34, 0x3a, 0xfe, 0x5c, 0x7f, 0x90, 0x57, 0x8c,
- 0x47, 0xcc, 0xb8, 0x42, 0x61, 0xb4, 0x98, 0x3f, 0xd3, 0x94, 0x07, 0x22,
- 0xcf, 0xf5, 0xf6, 0x32, 0xd7, 0xde, 0x04, 0x8e, 0x28, 0x6e, 0x04, 0x22,
- 0x4d, 0x08, 0xc8, 0x15, 0x13, 0x49, 0x3d, 0x92, 0x1d, 0xf1, 0xfa, 0x56,
- 0x79, 0x99, 0x32, 0xae, 0xad, 0x48, 0xa2, 0x0b, 0x8c, 0xc7, 0x7b, 0x6d,
- 0x77, 0x13, 0x4f, 0x4e, 0xfb, 0x2b, 0x31, 0xd6, 0x91, 0x34, 0xe6, 0x14,
- 0x5f, 0xac, 0xc3, 0x59, 0x6e, 0xdb, 0x88, 0xae, 0x3e, 0xd5, 0x61, 0x6a,
- 0x39, 0xaf, 0x36, 0x83, 0xf6, 0xd1, 0xca, 0x64, 0xf0, 0xca, 0x07, 0xc8,
- 0x0e, 0xa0, 0x06, 0x5c, 0xf7, 0x1f, 0x0c, 0xcc, 0xed, 0xdd, 0xa2, 0x5b,
- 0xcc, 0x6a, 0x05, 0xa3, 0x5e, 0xa0, 0x01, 0xe1, 0x1a, 0x89, 0x27, 0x74,
- 0xf6, 0xa5, 0x7a, 0x5d, 0x0a, 0xd6, 0xdb, 0x60, 0x26, 0x16, 0x12, 0x0e,
- 0xd4, 0x1f, 0x5e, 0xa5, 0xb7, 0xb7, 0xc3, 0x2a, 0xdb, 0x35, 0x5c, 0x5b,
- 0xed, 0x56, 0xd5, 0x1c, 0x1f, 0xad, 0x08, 0x7d, 0x6d, 0x63, 0x6f, 0xe3,
- 0xdb, 0x3b, 0xcb, 0x40, 0x22, 0x9c, 0x27, 0x29, 0x5e, 0x6d, 0x08, 0x5b,
- 0xd7, 0xdc, 0x98, 0xdb, 0x83, 0xb5, 0x53, 0x86, 0x19, 0x70, 0x9a, 0xa0,
- 0xd3, 0xfd, 0x6a, 0x5b, 0x16, 0x0d, 0x2e, 0x39, 0xcb, 0x8e, 0xe3, 0x70,
- 0xf4, 0x01, 0x31, 0x5d, 0x76, 0x95, 0x76, 0xc8, 0x59, 0xf5, 0x42, 0xa3,
- 0x86, 0x28, 0xb6, 0x00, 0x82, 0x3b, 0x44, 0x09, 0xac, 0x0e, 0xf7, 0xfb,
- 0x83, 0x25, 0x5d, 0x7c, 0x8c, 0x40, 0x3e, 0x75, 0xb9, 0x2d, 0xbd, 0xa5,
- 0xa1, 0x54, 0xe4, 0xd0, 0x81, 0x0b, 0xde, 0xdc, 0xdc, 0x0c, 0x37, 0xf9,
- 0x2d, 0xff, 0xcb, 0x31, 0xf0, 0xe6, 0x70, 0x67, 0x86, 0x6b, 0x4f, 0xf3,
- 0xe5, 0xfa, 0x36, 0xf1, 0x30, 0x5e, 0x6c, 0x2b, 0x38, 0x0d, 0xcc, 0x25,
- 0xdf, 0xbf, 0x7b, 0xdd, 0xb7, 0x91, 0x4d, 0x49, 0x61, 0x83, 0xe7, 0xb7,
- 0x0a, 0xb5, 0xb6, 0x2c, 0x67, 0xdc, 0x1d, 0x80, 0x45, 0x1f, 0xbd, 0x3c,
- 0xff, 0xf0, 0xf6, 0xf8, 0xe2, 0xc3, 0xbb, 0x97, 0x3f, 0x80, 0x84, 0xec,
- 0x95, 0x31, 0xf7, 0x15, 0xe2, 0x01, 0x65, 0x51, 0xa0, 0x03, 0xd2, 0x1b,
- 0x2a, 0x1b, 0xcc, 0x97, 0x04, 0xaf, 0x12, 0xeb, 0xd8, 0xe6, 0x30, 0xa3,
- 0x64, 0x9e, 0x66, 0x2e, 0x87, 0x49, 0x83, 0x5e, 0x1f, 0xb3, 0x72, 0x99,
- 0xcd, 0x87, 0x45, 0x79, 0x09, 0x2e, 0xdc, 0x7d, 0x25, 0xf2, 0x33, 0x3a,
- 0xdc, 0xae, 0x64, 0x35, 0x00, 0x82, 0xec, 0xba, 0x9c, 0x01, 0xb1, 0xe4,
- 0xa1, 0x1d, 0x6a, 0x3d, 0xd6, 0x7c, 0x4c, 0x02, 0x70, 0x75, 0xfd, 0x78,
- 0x83, 0x7a, 0xd7, 0xec, 0x13, 0x2e, 0x1d, 0x3e, 0x89, 0x83, 0xc8, 0xf7,
- 0xe3, 0xe7, 0xaa, 0x70, 0x75, 0xe6, 0xfc, 0xae, 0x1f, 0x01, 0x40, 0x20,
- 0x75, 0xae, 0xb0, 0x50, 0x12, 0x54, 0xe0, 0x86, 0x24, 0x9b, 0xe8, 0x91,
- 0x16, 0xa4, 0x36, 0xa7, 0x15, 0xb5, 0x7d, 0x08, 0x5d, 0xbe, 0x87, 0xc1,
- 0xd3, 0xd0, 0x32, 0x44, 0xcb, 0x5d, 0x6f, 0xcd, 0x4f, 0x65, 0xcd, 0x4f,
- 0xff, 0x4b, 0x6b, 0x7e, 0xfa, 0x5f, 0x58, 0xf3, 0xe3, 0xdf, 0x78, 0xcd,
- 0x8f, 0xa3, 0x6b, 0xf6, 0xbe, 0x32, 0xf8, 0x2b, 0xd6, 0xfc, 0xd7, 0xf5,
- 0xf2, 0xe3, 0xc0, 0xcc, 0x17, 0xb7, 0xb0, 0x74, 0xd8, 0xac, 0xe2, 0x26,
- 0x5b, 0xa3, 0xc1, 0x0e, 0xf9, 0xf6, 0x1d, 0xb0, 0xb0, 0xd7, 0x31, 0x34,
- 0xf5, 0x3a, 0xe8, 0x71, 0xdc, 0xa9, 0xad, 0x87, 0xb7, 0x0d, 0x84, 0x1c,
- 0xf5, 0xbe, 0xd5, 0x04, 0x7e, 0x0a, 0x68, 0xf6, 0x3d, 0x99, 0x8d, 0x0e,
- 0xdb, 0xd3, 0x7e, 0x2b, 0x74, 0xd2, 0xd3, 0x10, 0xe7, 0x68, 0x42, 0x6e,
- 0xb2, 0x2b, 0x6d, 0x37, 0x47, 0x31, 0x70, 0x49, 0xf3, 0xe7, 0xe6, 0x46,
- 0x8a, 0x01, 0xa5, 0x03, 0x73, 0x5c, 0x10, 0x31, 0x9f, 0x50, 0x66, 0x5c,
- 0xdc, 0xad, 0x30, 0xa0, 0xb9, 0x9b, 0x4b, 0x73, 0x07, 0x73, 0x22, 0xca,
- 0xfc, 0x86, 0xb2, 0x13, 0x74, 0x92, 0x49, 0x6b, 0x82, 0x12, 0xed, 0xb8,
- 0xca, 0xee, 0xb6, 0x02, 0x85, 0x61, 0x32, 0x2f, 0x20, 0x6f, 0xa6, 0x9b,
- 0x8d, 0x8f, 0xb1, 0x6b, 0x6f, 0xca, 0xf7, 0x45, 0xab, 0xdf, 0xa9, 0x7f,
- 0x6f, 0x7c, 0xcc, 0xb2, 0x55, 0x3a, 0x27, 0x68, 0x0d, 0xe4, 0x3e, 0x74,
- 0x35, 0xc8, 0x6a, 0x24, 0x47, 0x6a, 0xe1, 0x00, 0xbd, 0xd1, 0xc8, 0x3c,
- 0x23, 0x39, 0xc7, 0x1b, 0x89, 0x4a, 0x99, 0x24, 0x9f, 0x52, 0xad, 0x6b,
- 0xbc, 0x5f, 0x8a, 0x6b, 0xc6, 0x60, 0x27, 0x81, 0x96, 0x1b, 0xc5, 0x58,
- 0x30, 0x60, 0xec, 0x27, 0x14, 0x47, 0x0e, 0xa9, 0x39, 0xd7, 0x39, 0x52,
- 0xf2, 0xda, 0x98, 0xc3, 0xf6, 0x7d, 0x7e, 0x9d, 0x50, 0xa5, 0x1a, 0x1d,
- 0x13, 0x78, 0x03, 0xf1, 0x44, 0x61, 0xef, 0x3f, 0xa8, 0x1b, 0xd4, 0x45,
- 0x3a, 0x60, 0x29, 0x05, 0x4e, 0x66, 0xfd, 0xf7, 0xe2, 0xe8, 0xfc, 0xc3,
- 0x77, 0xc7, 0xc7, 0xe7, 0x27, 0xaf, 0x4e, 0x8f, 0xe5, 0xc0, 0xd8, 0x1f,
- 0xbd, 0xbd, 0xf8, 0xfe, 0x54, 0xbb, 0x84, 0x2a, 0x2f, 0x06, 0x0c, 0x2f,
- 0x70, 0xff, 0x2c, 0x94, 0xfb, 0xd4, 0x06, 0xcb, 0x18, 0xd2, 0x2f, 0x4f,
- 0x7e, 0x34, 0x5a, 0xeb, 0xf9, 0xe0, 0xfd, 0x8f, 0x41, 0x0f, 0x12, 0xaf,
- 0xc6, 0x24, 0x6c, 0x22, 0xe0, 0x4a, 0x4e, 0x06, 0x83, 0x65, 0xe1, 0x36,
- 0xb0, 0x33, 0xe5, 0xee, 0x37, 0xbe, 0x06, 0xcd, 0x70, 0xeb, 0xa5, 0x55,
- 0x18, 0xfa, 0x7e, 0xe3, 0x46, 0x3f, 0xad, 0xed, 0xe9, 0x23, 0x6d, 0x9f,
- 0xb6, 0x31, 0x68, 0xd1, 0x6a, 0xd9, 0xf6, 0x31, 0xbb, 0x23, 0x0c, 0xc7,
- 0xe4, 0x05, 0xfe, 0x8c, 0x37, 0x39, 0x3d, 0x2f, 0xf3, 0x6b, 0xe8, 0x7f,
- 0xe6, 0x59, 0x0e, 0xe9, 0xe2, 0xd1, 0xa1, 0x6d, 0xf9, 0x2a, 0x61, 0x65,
- 0x0c, 0x42, 0x99, 0x27, 0x34, 0x68, 0x12, 0xf3, 0xf6, 0x10, 0x32, 0x0e,
- 0x7e, 0xc3, 0xe3, 0xd1, 0x80, 0x86, 0x3c, 0xc3, 0xe4, 0xd5, 0xf1, 0xbb,
- 0x7e, 0x72, 0x7e, 0xfc, 0x86, 0x0b, 0x55, 0x8e, 0xdf, 0x7e, 0xc3, 0x5d,
- 0x70, 0xb5, 0xb9, 0x29, 0x65, 0x42, 0x84, 0xc9, 0x9a, 0x1e, 0x4d, 0xcc,
- 0xbb, 0x94, 0x99, 0x5a, 0x55, 0xe6, 0x76, 0xfd, 0x84, 0x00, 0x3a, 0xbc,
- 0xb6, 0x17, 0xe6, 0x8f, 0x18, 0xa9, 0x8c, 0x1d, 0xf1, 0x6d, 0x84, 0x5c,
- 0xa2, 0x98, 0xd9, 0xdc, 0x19, 0x31, 0x0a, 0x40, 0x0d, 0xa6, 0x98, 0x21,
- 0x48, 0x98, 0xc5, 0xa1, 0x04, 0x22, 0xb3, 0x8f, 0x20, 0x84, 0xb8, 0x75,
- 0xba, 0xc4, 0xe0, 0x61, 0xc5, 0x9a, 0xcf, 0xf5, 0xc1, 0x97, 0x04, 0x44,
- 0xee, 0x88, 0x11, 0xab, 0x8e, 0x2e, 0x73, 0x6e, 0x43, 0xdf, 0x42, 0xa6,
- 0x33, 0xe4, 0xce, 0xa7, 0x8c, 0xc0, 0x80, 0x00, 0x72, 0x51, 0x22, 0x81,
- 0x03, 0xd0, 0x07, 0xff, 0x6b, 0x77, 0x58, 0x55, 0x57, 0xbb, 0xf9, 0xf4,
- 0x43, 0x59, 0xa5, 0x5b, 0xed, 0xbb, 0xc8, 0xfb, 0xf5, 0x14, 0xbf, 0x4e,
- 0xb6, 0x86, 0xf6, 0x51, 0xf9, 0x3b, 0x7e, 0x1e, 0xc5, 0x02, 0xd0, 0x2b,
- 0x88, 0x5d, 0x2b, 0x9a, 0xcf, 0xa9, 0xcd, 0x73, 0xe7, 0xf9, 0xb8, 0x34,
- 0x0a, 0x9c, 0xeb, 0xfa, 0x21, 0xbd, 0x70, 0x57, 0x1f, 0x27, 0xd5, 0xde,
- 0x5e, 0x88, 0x42, 0x6f, 0x4b, 0x1c, 0xfb, 0x9a, 0x97, 0x7b, 0xfe, 0xdd,
- 0xd1, 0xe8, 0xf7, 0x7b, 0x7b, 0x94, 0x06, 0xbd, 0x8d, 0x74, 0xd5, 0x67,
- 0x4f, 0xf6, 0xf6, 0x77, 0x62, 0xea, 0x63, 0x90, 0xd7, 0x33, 0xe3, 0x16,
- 0x98, 0x2b, 0x6f, 0x03, 0x29, 0xcc, 0x2d, 0x45, 0x0f, 0x76, 0xe8, 0x69,
- 0x86, 0x24, 0x41, 0xaa, 0xec, 0xe4, 0x70, 0x26, 0xe5, 0x4e, 0x06, 0xa9,
- 0x17, 0x16, 0x07, 0xa9, 0xc7, 0xb3, 0x3f, 0xec, 0x59, 0xae, 0xf2, 0x73,
- 0xc8, 0x29, 0xff, 0xc4, 0x9b, 0xf5, 0x90, 0xe9, 0xd4, 0x0e, 0xaf, 0xf9,
- 0xeb, 0xa2, 0x44, 0x47, 0x07, 0x34, 0xc5, 0xd7, 0x97, 0x6b, 0x1c, 0xdc,
- 0x4a, 0x10, 0x40, 0x7e, 0x40, 0xe0, 0xab, 0x97, 0x39, 0xf5, 0x98, 0x7f,
- 0xc0, 0xf0, 0xa9, 0x1b, 0xd4, 0x52, 0xdf, 0x13, 0x10, 0xfe, 0xa0, 0xa1,
- 0xb3, 0x8f, 0xbf, 0x91, 0xf4, 0xcc, 0xd9, 0x8d, 0x0f, 0xf9, 0x49, 0xcf,
- 0x64, 0x39, 0x4e, 0x5e, 0xcc, 0xcd, 0x8b, 0xf3, 0x8e, 0xd2, 0xbb, 0x63,
- 0x6e, 0xb3, 0xf5, 0x5d, 0x56, 0x8e, 0xb3, 0xb2, 0xa8, 0x5a, 0x55, 0x42,
- 0xda, 0xdb, 0x95, 0x7d, 0x2a, 0x34, 0x8e, 0xa6, 0x4b, 0x05, 0x6d, 0x95,
- 0x6b, 0xb2, 0xbe, 0x05, 0xdd, 0xbd, 0x89, 0xcb, 0xb3, 0x45, 0xb5, 0x4a,
- 0x38, 0x00, 0xe8, 0x2b, 0x85, 0xff, 0x1a, 0x69, 0x3c, 0xe3, 0xe6, 0xa0,
- 0xe9, 0x7c, 0x0b, 0xdd, 0x7e, 0xda, 0xc7, 0x48, 0x38, 0x6d, 0x6b, 0x88,
- 0x02, 0x34, 0x36, 0xd6, 0x28, 0x0b, 0x8a, 0xca, 0xad, 0x81, 0x93, 0x4e,
- 0x73, 0xd1, 0xfc, 0x6e, 0x1c, 0x73, 0x97, 0x06, 0x58, 0x05, 0x1d, 0x90,
- 0xec, 0x70, 0x4d, 0xe8, 0xa4, 0xae, 0x0c, 0xe3, 0xdf, 0xf8, 0x9a, 0xe2,
- 0x6d, 0x78, 0x68, 0xe4, 0xc8, 0x79, 0x56, 0x55, 0xcc, 0xb7, 0x86, 0xd3,
- 0xbd, 0xf2, 0xf7, 0x59, 0xdf, 0x8f, 0x76, 0xce, 0x7d, 0xc9, 0xd5, 0xe1,
- 0x2d, 0xac, 0x11, 0xea, 0x46, 0x80, 0x92, 0xa6, 0x29, 0x1b, 0x86, 0x52,
- 0xfd, 0xea, 0x12, 0x27, 0x58, 0xd2, 0x84, 0xc1, 0x71, 0x5a, 0x2a, 0xf5,
- 0x0d, 0xd1, 0x69, 0x0f, 0xd8, 0x78, 0x3f, 0x4a, 0xc4, 0x1b, 0x41, 0x75,
- 0x51, 0x37, 0x25, 0xd0, 0x52, 0x97, 0x0e, 0x73, 0x79, 0x9e, 0x75, 0x82,
- 0x68, 0x29, 0xa2, 0xaa, 0xd9, 0xa4, 0xb9, 0xf4, 0x34, 0xd4, 0x6c, 0xc4,
- 0x52, 0xe7, 0x34, 0x90, 0x64, 0x0e, 0x75, 0x18, 0xe0, 0xbd, 0xdf, 0xdd,
- 0x0b, 0xa9, 0x72, 0xdf, 0xde, 0x79, 0x4d, 0xb1, 0x23, 0x30, 0x09, 0x0f,
- 0xc6, 0x8a, 0x6b, 0x95, 0xf9, 0x51, 0xc5, 0xc0, 0x80, 0xee, 0xa4, 0x17,
- 0x46, 0x9e, 0x66, 0x01, 0x58, 0xd6, 0xa8, 0x81, 0xaf, 0x20, 0xad, 0x5e,
- 0xb5, 0x84, 0x8e, 0xde, 0x03, 0xb7, 0x13, 0x8e, 0x84, 0x6d, 0x4e, 0xc6,
- 0xbc, 0x3f, 0x20, 0x95, 0xb5, 0xed, 0x6e, 0x43, 0x9b, 0x12, 0x57, 0xa6,
- 0x4d, 0xa7, 0x96, 0xc0, 0xe8, 0x15, 0xe4, 0x48, 0xb3, 0xa4, 0x99, 0x1c,
- 0xf0, 0x45, 0x4b, 0xfe, 0x2d, 0x19, 0x17, 0x69, 0xe0, 0x03, 0xa1, 0x82,
- 0x07, 0xee, 0xfc, 0x21, 0x4c, 0xb0, 0x35, 0x65, 0xcf, 0x28, 0x6d, 0x89,
- 0x9d, 0x2a, 0x0e, 0x9e, 0x84, 0xa1, 0xb8, 0x69, 0x82, 0x39, 0xd1, 0x81,
- 0xa9, 0x30, 0x36, 0x43, 0xdc, 0xe4, 0xd3, 0xfa, 0x8a, 0x7a, 0xf1, 0xa8,
- 0x65, 0x54, 0x09, 0x2e, 0x00, 0x9c, 0xd4, 0x79, 0x58, 0xf5, 0x36, 0xee,
- 0x70, 0xe0, 0xf1, 0x86, 0x11, 0x51, 0x13, 0x06, 0xc8, 0x82, 0xa3, 0x8e,
- 0xf6, 0x81, 0x9c, 0xda, 0xbb, 0xac, 0xea, 0x59, 0x68, 0x18, 0xf4, 0xcb,
- 0x9e, 0xa1, 0xcd, 0x4e, 0x60, 0xae, 0x69, 0x79, 0xda, 0x50, 0x4f, 0x08,
- 0x78, 0x78, 0xeb, 0x23, 0x83, 0xe2, 0x7f, 0xb7, 0xa5, 0xdd, 0x64, 0xd7,
- 0xcb, 0xda, 0xaf, 0xa0, 0x81, 0x2c, 0x4f, 0x3e, 0xe6, 0xf3, 0x22, 0xea,
- 0x52, 0xef, 0x1b, 0x59, 0xb3, 0xe0, 0x11, 0xde, 0x6c, 0xa9, 0xa3, 0x14,
- 0x80, 0x09, 0x97, 0xa9, 0xfc, 0x9e, 0xc1, 0x52, 0xb6, 0x2e, 0xf9, 0xa1,
- 0x6f, 0xdc, 0x43, 0xad, 0xe1, 0xe0, 0xb5, 0x67, 0x2f, 0xbd, 0x26, 0xd3,
- 0x55, 0x87, 0x28, 0xd0, 0xf8, 0xae, 0x9f, 0x1c, 0x2c, 0x68, 0x53, 0xf6,
- 0xbe, 0x89, 0x09, 0x2e, 0xee, 0x0d, 0x5c, 0x15, 0xb6, 0x5c, 0x7e, 0xf0,
- 0x67, 0x98, 0x5c, 0x44, 0x30, 0xe6, 0x4b, 0x5b, 0x09, 0xc6, 0xf5, 0x28,
- 0x2a, 0x0f, 0x22, 0x41, 0x07, 0xca, 0xa5, 0x5c, 0xc1, 0x48, 0x98, 0x66,
- 0x8a, 0x12, 0xbe, 0x20, 0xef, 0x26, 0xb2, 0xa5, 0x56, 0x02, 0x87, 0x01,
- 0x76, 0x1d, 0x58, 0x08, 0xd2, 0x6a, 0x8e, 0x07, 0xa8, 0x3d, 0x56, 0x11,
- 0x64, 0x56, 0xcf, 0x57, 0x64, 0x20, 0xd9, 0x0e, 0x76, 0xde, 0xa4, 0x50,
- 0xd5, 0x3a, 0x49, 0xc4, 0xc7, 0xf3, 0x09, 0xaf, 0xc4, 0x39, 0xa5, 0xe8,
- 0xe5, 0x55, 0x3d, 0x88, 0xe0, 0xbd, 0x52, 0x0c, 0xe8, 0xfc, 0xec, 0xfc,
- 0x60, 0xc7, 0x07, 0xc5, 0x14, 0x70, 0x04, 0xee, 0xf5, 0x48, 0x51, 0x22,
- 0x0b, 0x9c, 0xd0, 0x57, 0x71, 0xc3, 0x65, 0x7a, 0xa1, 0x6d, 0x39, 0x11,
- 0xc4, 0x38, 0x08, 0x17, 0xfa, 0x22, 0xb9, 0xfc, 0x5d, 0xa1, 0x88, 0xd7,
- 0x05, 0xd1, 0x1d, 0x4c, 0x85, 0x47, 0xfc, 0x2c, 0x84, 0x95, 0xa9, 0x38,
- 0xa1, 0x9c, 0x10, 0x59, 0x06, 0x54, 0xfc, 0xd7, 0x6c, 0x27, 0x82, 0xc2,
- 0x85, 0x60, 0x96, 0x09, 0x27, 0x1e, 0x45, 0x52, 0xba, 0x24, 0xc8, 0xeb,
- 0x9e, 0xa4, 0x80, 0x84, 0x16, 0x43, 0x12, 0xba, 0x90, 0xcb, 0xb5, 0x80,
- 0xb7, 0x14, 0x5c, 0xcb, 0x98, 0xca, 0xc3, 0xae, 0x0a, 0x5c, 0xd7, 0xd7,
- 0xa2, 0x61, 0x91, 0x49, 0xb7, 0xb2, 0x34, 0x79, 0x7b, 0x3a, 0xba, 0xf0,
- 0x83, 0x48, 0xa4, 0x87, 0x05, 0xa9, 0xcc, 0x4d, 0x60, 0x37, 0x2f, 0xb5,
- 0xe8, 0xf4, 0x64, 0x74, 0x31, 0x8c, 0x75, 0x6c, 0x30, 0xda, 0xf9, 0x08,
- 0xe5, 0x36, 0x0d, 0xa0, 0x8c, 0x84, 0x76, 0x4f, 0x8a, 0x45, 0x39, 0x3a,
- 0xc6, 0xd1, 0xa2, 0xbc, 0xf4, 0x41, 0x21, 0xda, 0xc3, 0x99, 0x29, 0xfe,
- 0x89, 0xd3, 0x94, 0x25, 0xc5, 0x59, 0xa3, 0x44, 0xd5, 0x7a, 0x3c, 0xf0,
- 0x90, 0x14, 0x59, 0xdf, 0xa1, 0xd6, 0x5c, 0x86, 0x7b, 0xcd, 0x0d, 0xf5,
- 0x31, 0xb4, 0x31, 0xb7, 0x99, 0xa1, 0x88, 0x3e, 0x82, 0x80, 0xd9, 0x70,
- 0x75, 0x4f, 0x92, 0x8c, 0x10, 0x77, 0xc9, 0xc9, 0x84, 0x67, 0x1f, 0xcc,
- 0x54, 0x20, 0x45, 0x8b, 0x92, 0xd2, 0xcd, 0xb1, 0x59, 0xb3, 0x80, 0xb0,
- 0xdd, 0x2f, 0x89, 0x53, 0x7a, 0x2c, 0xe8, 0x98, 0xae, 0xca, 0x32, 0x76,
- 0x39, 0xd9, 0x69, 0x77, 0x82, 0x00, 0xe7, 0x53, 0xc6, 0xc1, 0xac, 0x9a,
- 0x40, 0x98, 0x0c, 0x7a, 0x00, 0xa1, 0xc3, 0xad, 0x7f, 0xa0, 0xba, 0x75,
- 0xed, 0x24, 0xfb, 0xe4, 0x1a, 0xf9, 0xa9, 0x83, 0x1f, 0x39, 0xe3, 0x99,
- 0x02, 0x65, 0xfd, 0x2e, 0x84, 0xb6, 0x90, 0x8d, 0xb4, 0x09, 0xd3, 0xfb,
- 0x93, 0x57, 0xa7, 0x96, 0x5a, 0x42, 0x1d, 0x4a, 0xa1, 0xb5, 0x6b, 0x45,
- 0x59, 0x8b, 0x8a, 0x4d, 0xda, 0x93, 0x20, 0xe8, 0xb3, 0x5e, 0xe6, 0x7f,
- 0xa3, 0x54, 0x2b, 0xd7, 0xd8, 0x1e, 0xf2, 0x0f, 0xae, 0x73, 0xbd, 0xc9,
- 0xb6, 0x2a, 0xdb, 0xc1, 0x2e, 0x9f, 0xda, 0xf2, 0x0f, 0x8e, 0xf1, 0x45,
- 0xf3, 0x8f, 0xbb, 0x15, 0x8b, 0xc7, 0x4d, 0x8f, 0x04, 0x41, 0x1c, 0x0b,
- 0x12, 0x99, 0xb9, 0x8d, 0x76, 0xa9, 0x76, 0x31, 0xd0, 0x2c, 0x48, 0x31,
- 0x73, 0xa9, 0x75, 0x4d, 0x84, 0x9d, 0xa2, 0x94, 0x8a, 0xc7, 0xed, 0xd7,
- 0xef, 0xce, 0xde, 0x0c, 0x2e, 0xce, 0x76, 0x28, 0x5b, 0x8f, 0x46, 0xde,
- 0x90, 0x1f, 0x52, 0xd9, 0xe6, 0xa8, 0x0e, 0xa2, 0x44, 0x1c, 0x6d, 0xdb,
- 0xd5, 0x8e, 0x54, 0xf9, 0xf0, 0x7d, 0x42, 0xd3, 0xd3, 0xb7, 0x82, 0xde,
- 0x25, 0x4b, 0x56, 0x43, 0x52, 0xea, 0x8b, 0x0a, 0xa7, 0xe3, 0xc4, 0x0b,
- 0x62, 0x71, 0x3e, 0x87, 0x88, 0xed, 0xf1, 0xba, 0xba, 0x4b, 0xa4, 0xb0,
- 0x14, 0x80, 0x85, 0x64, 0x48, 0x85, 0xa1, 0x01, 0xdb, 0x70, 0xdb, 0xc2,
- 0x14, 0xa1, 0xe4, 0x8e, 0x6b, 0xba, 0xea, 0xc2, 0x9c, 0xdd, 0xb4, 0x2c,
- 0x8b, 0x1b, 0xbd, 0xb5, 0xa4, 0xf0, 0xdb, 0x4c, 0x1d, 0x3b, 0x54, 0xde,
- 0x75, 0x42, 0xbb, 0x08, 0x5a, 0x99, 0xb6, 0x0b, 0xdf, 0xa8, 0xfb, 0x3d,
- 0x69, 0x02, 0x6e, 0x68, 0xfa, 0xf7, 0xa0, 0x2e, 0xd7, 0xa8, 0x27, 0x8d,
- 0xfb, 0x9c, 0x4f, 0x21, 0x23, 0x9b, 0xf9, 0xe2, 0x7d, 0x81, 0x53, 0x04,
- 0xfa, 0x0e, 0x35, 0x78, 0xb3, 0x4e, 0x49, 0x72, 0x4e, 0x70, 0x40, 0xf1,
- 0x8f, 0xc1, 0xf1, 0x15, 0x9c, 0x65, 0xa8, 0xf3, 0xe8, 0xdd, 0x4a, 0x39,
- 0xe3, 0x2e, 0x11, 0x2f, 0xaf, 0xb9, 0xe9, 0xa6, 0x66, 0xe0, 0x10, 0x92,
- 0x1a, 0x49, 0x02, 0xfc, 0x34, 0x50, 0x24, 0x15, 0x22, 0x29, 0x07, 0x3c,
- 0xc5, 0x74, 0x3d, 0xa1, 0x6d, 0x42, 0xb8, 0x0f, 0x3d, 0x3d, 0xc7, 0x0c,
- 0xda, 0xaa, 0x08, 0x0f, 0x18, 0xda, 0xe5, 0xca, 0xb3, 0xf7, 0xa6, 0xad,
- 0x62, 0x25, 0xfc, 0x98, 0x6b, 0x54, 0x06, 0x4d, 0x12, 0x89, 0xaf, 0xb6,
- 0xcd, 0x56, 0xcb, 0xe0, 0x44, 0x48, 0x49, 0x1b, 0x25, 0x87, 0xb2, 0x0a,
- 0x88, 0xf9, 0x84, 0x15, 0x2e, 0x11, 0x7f, 0xc0, 0x5a, 0x82, 0x81, 0x29,
- 0xe2, 0xfe, 0x75, 0x5a, 0x19, 0xa1, 0xd4, 0x1c, 0x6f, 0x67, 0x83, 0x6f,
- 0x7a, 0xad, 0x55, 0x15, 0xde, 0xee, 0x35, 0x36, 0x24, 0xbe, 0x73, 0x27,
- 0x0d, 0x80, 0x0b, 0xce, 0xcb, 0xf0, 0x28, 0x2e, 0xf2, 0x89, 0x50, 0x17,
- 0x29, 0x51, 0x3d, 0xa5, 0x16, 0xd7, 0xd7, 0x31, 0xc9, 0x94, 0xda, 0x26,
- 0x8e, 0x75, 0xa2, 0x1f, 0x4d, 0xb6, 0xb5, 0xec, 0xd3, 0x96, 0x21, 0x9d,
- 0xca, 0xaf, 0x0e, 0x6d, 0x5d, 0x2a, 0x04, 0x5a, 0x6b, 0xb8, 0x83, 0x1f,
- 0x7f, 0x6c, 0x36, 0x5d, 0xde, 0xe9, 0x42, 0xc2, 0x90, 0x82, 0x94, 0x29,
- 0x0b, 0x3e, 0x9d, 0x70, 0x50, 0x54, 0xa7, 0x6c, 0x87, 0xf8, 0x02, 0xa5,
- 0xf0, 0xb3, 0xf7, 0x45, 0xdc, 0x44, 0xc6, 0xfe, 0xbb, 0xd2, 0x4a, 0xab,
- 0x46, 0xfe, 0x06, 0x61, 0x64, 0x9c, 0x44, 0x12, 0x16, 0x49, 0xda, 0x6a,
- 0xe2, 0x05, 0x07, 0x54, 0x28, 0x21, 0xdd, 0x27, 0x57, 0xe5, 0x3c, 0x33,
- 0x57, 0x08, 0x2c, 0x08, 0x4a, 0xf3, 0xe6, 0xce, 0xd0, 0x16, 0x35, 0xd3,
- 0xd6, 0x5d, 0xd2, 0x65, 0xcf, 0x3d, 0x25, 0x90, 0x13, 0x3b, 0x29, 0x33,
- 0x71, 0x35, 0x68, 0x07, 0xa0, 0x20, 0x84, 0x0c, 0xc4, 0x1e, 0x3e, 0x3c,
- 0xe4, 0x51, 0x4d, 0xbd, 0xf3, 0xe2, 0xc0, 0x16, 0x5b, 0x3b, 0x26, 0x35,
- 0x18, 0xa1, 0xea, 0x7e, 0x53, 0x10, 0xbe, 0x26, 0x35, 0x5e, 0x22, 0xcc,
- 0xb8, 0x82, 0xbd, 0x5a, 0xd2, 0x33, 0x98, 0x2f, 0x9b, 0x3f, 0xea, 0xc9,
- 0x1d, 0xfa, 0x91, 0x4b, 0x70, 0x41, 0x2c, 0xfe, 0xa9, 0xc2, 0x04, 0xfb,
- 0x02, 0x60, 0x5f, 0x24, 0xc2, 0x69, 0x3f, 0x32, 0xb8, 0x89, 0x35, 0x40,
- 0xce, 0xba, 0x34, 0xc1, 0x50, 0x2c, 0xc8, 0x72, 0x09, 0x51, 0xa6, 0xdd,
- 0x91, 0x45, 0x02, 0x0f, 0x79, 0x3c, 0x1d, 0x28, 0x1d, 0x7b, 0xb6, 0x8c,
- 0x45, 0x3a, 0xa0, 0xc7, 0xaa, 0xae, 0x5c, 0x13, 0x81, 0x1d, 0x27, 0x6a,
- 0x4b, 0xf3, 0x94, 0xc4, 0xa7, 0x1a, 0x5d, 0xb1, 0xb3, 0x46, 0x66, 0x0b,
- 0xb5, 0x93, 0x01, 0x78, 0x48, 0x3f, 0x42, 0x31, 0xc1, 0x03, 0xae, 0x1b,
- 0x3d, 0x65, 0x6c, 0x79, 0x2a, 0x1f, 0x03, 0xc0, 0x74, 0xe4, 0xb3, 0x68,
- 0x26, 0x50, 0xa0, 0x28, 0x9b, 0xd9, 0x1c, 0x3c, 0xda, 0xeb, 0xe3, 0xcf,
- 0x7d, 0x40, 0x85, 0x94, 0xf8, 0xdb, 0x81, 0x85, 0x3b, 0x68, 0x1c, 0x14,
- 0x7a, 0x9c, 0x5c, 0x21, 0xc4, 0xd2, 0x07, 0xb7, 0xb7, 0x61, 0x8f, 0x8a,
- 0xac, 0x59, 0x44, 0x31, 0xb0, 0x85, 0x87, 0xe1, 0x6c, 0x1d, 0x21, 0x29,
- 0x5e, 0x17, 0xb6, 0xa5, 0xe4, 0x32, 0x5f, 0x6a, 0xd7, 0x0d, 0x74, 0x90,
- 0x61, 0x57, 0x03, 0xba, 0xba, 0x0d, 0x80, 0x26, 0x3b, 0xee, 0x23, 0xc6,
- 0xd0, 0x26, 0x82, 0x30, 0x82, 0xbb, 0x64, 0x56, 0x79, 0xdb, 0x55, 0x7c,
- 0xd0, 0xd8, 0x64, 0x73, 0x7d, 0x89, 0x90, 0xb1, 0xf5, 0x31, 0x8a, 0x32,
- 0x94, 0xd6, 0x87, 0x38, 0xb0, 0x68, 0x93, 0x06, 0x1a, 0x06, 0x27, 0x99,
- 0x7f, 0xa1, 0xc9, 0x79, 0xfc, 0xaf, 0x83, 0xb8, 0xb1, 0x2e, 0xf8, 0x27,
- 0x5c, 0x87, 0x25, 0x58, 0x3b, 0x3f, 0x52, 0xb6, 0xbc, 0x52, 0xcb, 0xc5,
- 0x75, 0x6b, 0x87, 0xf0, 0x1d, 0x71, 0xd3, 0xb3, 0x53, 0xc0, 0x39, 0x09,
- 0xaa, 0x6c, 0x2e, 0x50, 0x1a, 0xeb, 0x46, 0x8e, 0xd3, 0x80, 0xd0, 0x91,
- 0x06, 0xba, 0xa6, 0x17, 0xf2, 0x97, 0xc0, 0xfb, 0x49, 0x1d, 0x8b, 0xa1,
- 0x6c, 0x53, 0xcb, 0x99, 0x9d, 0x86, 0x43, 0x86, 0x86, 0xb0, 0x64, 0x11,
- 0xcd, 0x47, 0x5a, 0xc1, 0x8b, 0xdc, 0x6f, 0xdf, 0x73, 0x8d, 0x4b, 0x67,
- 0xd8, 0xdd, 0x95, 0x4c, 0xb5, 0xcb, 0xe0, 0x13, 0x9a, 0xb4, 0x61, 0x51,
- 0x08, 0xac, 0x96, 0x5d, 0xac, 0x62, 0x02, 0x41, 0x6e, 0x1c, 0xdc, 0xd7,
- 0xea, 0xbb, 0x97, 0x19, 0xb6, 0xe6, 0x62, 0x74, 0x95, 0x3a, 0xa1, 0xc6,
- 0xd2, 0x52, 0x7a, 0x1b, 0x18, 0xbd, 0x20, 0x45, 0x3f, 0x61, 0x62, 0x50,
- 0xcb, 0x76, 0xf4, 0xe0, 0xd1, 0xac, 0xce, 0xc6, 0x44, 0x39, 0xb6, 0x42,
- 0x90, 0xd1, 0x92, 0xfa, 0x11, 0xcb, 0xd9, 0x1d, 0x2b, 0x1a, 0x74, 0x73,
- 0x91, 0xab, 0x39, 0xf0, 0x1a, 0xc9, 0x8c, 0x90, 0xae, 0xd2, 0x8f, 0xfb,
- 0xf4, 0xb7, 0x27, 0x8f, 0x9e, 0xef, 0x2b, 0xee, 0xc9, 0xf1, 0xc5, 0xeb,
- 0xb6, 0x7b, 0xb0, 0x34, 0xac, 0xcd, 0x7f, 0x0e, 0xb2, 0xb4, 0xbc, 0x32,
- 0xe6, 0x0a, 0xc0, 0x97, 0x06, 0xe8, 0xe8, 0x31, 0x78, 0xf4, 0x28, 0x96,
- 0x09, 0xf2, 0x09, 0x01, 0x27, 0x0e, 0x5a, 0x2a, 0x39, 0x8c, 0x84, 0x01,
- 0x28, 0xde, 0x8d, 0x0d, 0xcc, 0xfc, 0x65, 0x19, 0xcc, 0x83, 0x8f, 0x97,
- 0x37, 0x1a, 0x59, 0x00, 0x41, 0x1a, 0x4f, 0xac, 0x87, 0x54, 0xcb, 0x47,
- 0x2f, 0xd9, 0x4e, 0xdb, 0x6c, 0x94, 0xd4, 0x77, 0x3b, 0xdc, 0x2c, 0x16,
- 0x1f, 0xa2, 0xfe, 0x71, 0x74, 0xca, 0xc5, 0x26, 0x89, 0x96, 0xe2, 0x57,
- 0x52, 0x8d, 0x58, 0x66, 0x00, 0x71, 0x63, 0x5d, 0x52, 0x1a, 0x71, 0xdd,
- 0x0f, 0x44, 0x47, 0x24, 0x28, 0x27, 0x2b, 0x29, 0x4b, 0xe5, 0x7f, 0xe3,
- 0x7e, 0x6f, 0x64, 0xe4, 0xee, 0x3f, 0x89, 0x10, 0x8e, 0xb4, 0x80, 0x5f,
- 0x40, 0xb8, 0x26, 0xdd, 0x9c, 0xce, 0xc5, 0x3e, 0x41, 0x32, 0xa2, 0x25,
- 0xf6, 0x10, 0xc9, 0xfd, 0xd6, 0x06, 0xd1, 0xbf, 0x78, 0x2d, 0x20, 0xf7,
- 0x70, 0x13, 0x9c, 0xa5, 0x7d, 0x6b, 0x40, 0x7a, 0x3b, 0xb5, 0xef, 0x88,
- 0x2f, 0xe6, 0x07, 0x1f, 0x68, 0x81, 0x30, 0xb4, 0x60, 0x1f, 0x6a, 0x11,
- 0xa4, 0xb9, 0x39, 0xf3, 0x15, 0x50, 0x3e, 0x0c, 0x77, 0xba, 0x2a, 0xad,
- 0xa8, 0x34, 0xa4, 0x50, 0x93, 0x39, 0x69, 0x48, 0x09, 0xa6, 0xf3, 0x6a,
- 0x4c, 0x17, 0xb8, 0x3b, 0x44, 0x89, 0x9e, 0xc1, 0x72, 0xc2, 0x79, 0xf3,
- 0xc3, 0x22, 0xde, 0xf8, 0x41, 0xb9, 0x1b, 0xb9, 0x66, 0xde, 0x1d, 0x9d,
- 0x5f, 0x24, 0x17, 0x67, 0xbe, 0x47, 0x81, 0x4b, 0xb6, 0x09, 0x4c, 0x1c,
- 0x1d, 0x8e, 0xa2, 0x52, 0xbe, 0x0d, 0xa3, 0xae, 0xd6, 0x38, 0x5f, 0x57,
- 0x94, 0x52, 0xc9, 0x88, 0x7a, 0x10, 0x9f, 0x4d, 0x6a, 0x45, 0x2a, 0xdb,
- 0x88, 0x7a, 0x49, 0xdb, 0xe9, 0xcf, 0x2a, 0x2c, 0x59, 0x05, 0x2d, 0x45,
- 0x96, 0x53, 0xbb, 0x79, 0x7a, 0xb1, 0xce, 0x7b, 0x9a, 0x63, 0x6a, 0x6b,
- 0x1c, 0x39, 0x1f, 0x04, 0x93, 0xb9, 0x4e, 0xe7, 0xf9, 0xd4, 0xa3, 0x4a,
- 0xe8, 0x75, 0x5c, 0xb2, 0x85, 0x41, 0x69, 0x30, 0xac, 0xad, 0xea, 0xb3,
- 0x62, 0x4b, 0x46, 0x48, 0x86, 0x05, 0x88, 0x26, 0xba, 0x61, 0xd7, 0xc2,
- 0x4d, 0xe3, 0xce, 0xd2, 0x44, 0x6e, 0xf2, 0x3f, 0x60, 0x41, 0x94, 0xa0,
- 0x61, 0x98, 0x7b, 0x1a, 0x6d, 0x92, 0x52, 0x38, 0x19, 0xd6, 0x9a, 0xc7,
- 0xb0, 0x09, 0xbf, 0xf2, 0xbc, 0x83, 0x5f, 0xef, 0x3b, 0x7b, 0x23, 0x9b,
- 0x49, 0xd8, 0x3c, 0x79, 0x7d, 0xd7, 0xfb, 0x07, 0xaa, 0xd5, 0x42, 0x5a,
- 0x1b, 0x92, 0xa7, 0x8d, 0x42, 0xfa, 0x6d, 0x68, 0xa4, 0x6c, 0x95, 0xd1,
- 0x51, 0xf5, 0x33, 0x77, 0x3c, 0x61, 0x6c, 0xbd, 0x34, 0xf1, 0xd3, 0x10,
- 0xf5, 0x34, 0xaa, 0xa7, 0x8b, 0x5d, 0x69, 0x74, 0xf6, 0x35, 0x2a, 0xd1,
- 0x6f, 0x72, 0xbb, 0xca, 0x04, 0x9b, 0x17, 0x19, 0xc2, 0x42, 0xc0, 0x61,
- 0x45, 0x43, 0x58, 0xd1, 0x52, 0x38, 0x6c, 0x09, 0x1e, 0xbb, 0x88, 0xeb,
- 0xc0, 0xfe, 0x2c, 0x9c, 0x28, 0xe6, 0x8c, 0x5f, 0x35, 0xe8, 0xbe, 0x7f,
- 0xf7, 0xfa, 0xcf, 0xba, 0x33, 0x3b, 0x7d, 0xb5, 0xba, 0x82, 0x4e, 0x68,
- 0x32, 0x5b, 0xbf, 0x00, 0xd8, 0xcb, 0x86, 0x15, 0x1c, 0x94, 0x06, 0xe1,
- 0xdd, 0x3f, 0x42, 0x90, 0x7c, 0x06, 0xf3, 0x4e, 0xb6, 0x11, 0x68, 0x36,
- 0x4f, 0x8d, 0xc4, 0xaf, 0x71, 0x30, 0x7c, 0x42, 0x1e, 0xc1, 0xd7, 0x47,
- 0x4f, 0x0e, 0xf6, 0xf7, 0x76, 0x86, 0xc9, 0x76, 0xeb, 0x76, 0xdb, 0xb9,
- 0x77, 0x99, 0xcd, 0xfd, 0xce, 0x6e, 0x57, 0xe0, 0xdc, 0xed, 0xe3, 0x1f,
- 0xcf, 0xdf, 0xb6, 0x16, 0x49, 0x3b, 0x10, 0xa4, 0x12, 0x6c, 0x58, 0xa3,
- 0x53, 0x4f, 0x03, 0x96, 0x92, 0x5e, 0xed, 0x61, 0xb0, 0xfe, 0x75, 0x99,
- 0xc3, 0xd0, 0xeb, 0x81, 0x1e, 0xbd, 0xd3, 0x62, 0x39, 0x35, 0xc6, 0xd2,
- 0x19, 0x40, 0x2a, 0xb3, 0x9e, 0x39, 0x05, 0xf7, 0xae, 0xae, 0x5b, 0xac,
- 0xbf, 0xe9, 0xd3, 0x51, 0x59, 0x86, 0x39, 0x5e, 0x6f, 0xe8, 0x87, 0x84,
- 0x09, 0x0e, 0x78, 0x1f, 0xae, 0xb2, 0x5a, 0x5f, 0x66, 0x1c, 0xe0, 0x80,
- 0x7f, 0xa2, 0x79, 0xda, 0x6e, 0xa9, 0x25, 0x17, 0xf9, 0x3c, 0x5f, 0x50,
- 0x48, 0xe7, 0x21, 0xd1, 0x40, 0x7a, 0x7c, 0x5b, 0xa3, 0x5a, 0x3b, 0xdc,
- 0x68, 0x5a, 0x82, 0xa8, 0x85, 0xc3, 0x64, 0x26, 0xa3, 0x3c, 0xa2, 0x23,
- 0xf0, 0xa3, 0xce, 0xba, 0xce, 0x9b, 0x55, 0x21, 0x74, 0x14, 0x09, 0x0f,
- 0xa5, 0xdf, 0x84, 0xef, 0x8c, 0x44, 0x81, 0x28, 0x87, 0x86, 0x7a, 0x4e,
- 0xa6, 0xcb, 0x26, 0xd2, 0x31, 0x09, 0x2b, 0x12, 0xac, 0xd9, 0x2d, 0xb5,
- 0x11, 0x36, 0xc6, 0xd4, 0xd3, 0xd0, 0x14, 0x78, 0xc9, 0x8b, 0x11, 0xbb,
- 0xa7, 0xf4, 0x95, 0x56, 0xd6, 0x28, 0x25, 0x61, 0xb4, 0xdf, 0x8a, 0xc3,
- 0x91, 0xd9, 0xb6, 0xf5, 0xdd, 0x56, 0x54, 0x8c, 0x72, 0x60, 0x4e, 0x7c,
- 0x14, 0xad, 0xd0, 0x9c, 0x1f, 0x8a, 0xe3, 0x41, 0xde, 0x6c, 0x25, 0x5d,
- 0x81, 0xb6, 0x87, 0xc4, 0xe6, 0xe2, 0xd1, 0x38, 0x0e, 0xc7, 0xb5, 0xfd,
- 0x30, 0x36, 0x38, 0xd7, 0x60, 0xbe, 0x27, 0x9f, 0x47, 0x98, 0xef, 0xed,
- 0xd9, 0xc5, 0xf1, 0xa1, 0x98, 0x4a, 0x0e, 0x0f, 0x4a, 0xf2, 0x19, 0x24,
- 0x39, 0x13, 0x05, 0x4f, 0x4b, 0xa9, 0xbb, 0x25, 0xd4, 0x62, 0xde, 0xf7,
- 0x7e, 0xe4, 0xc8, 0x53, 0x95, 0x04, 0x4e, 0x09, 0xc7, 0x39, 0xea, 0x4e,
- 0x8c, 0x68, 0x02, 0xbb, 0x10, 0xf3, 0x9c, 0xd3, 0xd6, 0xb0, 0xfd, 0x21,
- 0x36, 0x10, 0xb0, 0x92, 0xa8, 0x23, 0x19, 0xa0, 0xc0, 0x59, 0x45, 0x0c,
- 0x98, 0x88, 0x75, 0x2f, 0xf2, 0x3b, 0x28, 0xe0, 0x05, 0x3a, 0x0a, 0x87,
- 0x6d, 0x70, 0x29, 0x46, 0x8d, 0xd0, 0x0c, 0x37, 0xdc, 0x54, 0x1c, 0xde,
- 0x59, 0xac, 0x33, 0xa1, 0xef, 0x11, 0xb1, 0xa1, 0xf4, 0xf6, 0xa1, 0x12,
- 0x0f, 0x05, 0x5c, 0xe1, 0x1d, 0xf8, 0x57, 0xf0, 0x85, 0xeb, 0x79, 0xb2,
- 0x4c, 0x02, 0xd5, 0x58, 0xfd, 0x14, 0xf0, 0xac, 0x58, 0x0b, 0xbe, 0x92,
- 0x7a, 0xc3, 0x30, 0x81, 0x83, 0x2f, 0x1c, 0x38, 0x07, 0x3d, 0xef, 0xa0,
- 0xda, 0x15, 0x7d, 0x6b, 0x60, 0x50, 0xf2, 0x5a, 0x46, 0xa5, 0x89, 0x5c,
- 0x1a, 0x08, 0xf5, 0x36, 0x8e, 0x45, 0xec, 0xa3, 0x6c, 0x88, 0x09, 0x88,
- 0xab, 0x6f, 0x62, 0x14, 0x4d, 0xbf, 0x06, 0x87, 0xee, 0x77, 0x72, 0xe9,
- 0xe4, 0x0c, 0x75, 0x62, 0x3e, 0xf1, 0xe4, 0x51, 0x87, 0x43, 0x87, 0x2d,
- 0x34, 0xac, 0xd9, 0xdf, 0x79, 0xf3, 0xc6, 0x60, 0xcf, 0x86, 0x21, 0x72,
- 0x82, 0x77, 0x10, 0x3c, 0xc3, 0x4f, 0x17, 0x64, 0x5d, 0xf4, 0x65, 0x8f,
- 0x36, 0x66, 0xf2, 0xbe, 0xd1, 0xad, 0xa1, 0xa7, 0x28, 0xcd, 0x4e, 0x9e,
- 0x64, 0xd5, 0x9e, 0x43, 0xd9, 0x8a, 0xdc, 0x7c, 0x73, 0x55, 0xcc, 0xfd,
- 0xfc, 0x8f, 0xc0, 0xd9, 0x0c, 0x4f, 0x9d, 0x87, 0xf3, 0xea, 0xd5, 0xdc,
- 0xc9, 0xae, 0x80, 0xe8, 0xe4, 0x73, 0x1e, 0x03, 0xc0, 0x22, 0xf9, 0x6b,
- 0x31, 0x16, 0x47, 0x24, 0xea, 0xc0, 0x2f, 0xa3, 0x58, 0x56, 0xe4, 0x12,
- 0x31, 0x77, 0x95, 0xe1, 0xb3, 0xe9, 0x9a, 0xc3, 0x0b, 0x98, 0x8f, 0x54,
- 0x23, 0x70, 0xfb, 0x73, 0x04, 0xfd, 0x92, 0xcb, 0x82, 0x5b, 0xa0, 0xc3,
- 0x69, 0xc9, 0x50, 0x0c, 0x61, 0xbd, 0xff, 0x7e, 0x1b, 0xaf, 0x28, 0x9d,
- 0xc0, 0x25, 0x68, 0x86, 0x16, 0x78, 0x10, 0x86, 0x9c, 0x74, 0x25, 0x1b,
- 0xe9, 0xa4, 0x5e, 0x0b, 0xe1, 0xdb, 0xb3, 0x2b, 0x34, 0x54, 0x60, 0xde,
- 0xa5, 0x46, 0x08, 0x94, 0x87, 0x37, 0x31, 0x7c, 0x97, 0x4e, 0xee, 0x54,
- 0x59, 0x70, 0x37, 0xab, 0x40, 0x9a, 0xba, 0xb6, 0x09, 0x61, 0x95, 0xb3,
- 0x4e, 0x02, 0xf1, 0xfe, 0xbc, 0xea, 0xe8, 0x57, 0xf4, 0x9b, 0xda, 0xd5,
- 0x7e, 0xd7, 0x39, 0x8e, 0xbc, 0x28, 0xf4, 0x6a, 0xe3, 0xa8, 0x67, 0x75,
- 0x0a, 0x1a, 0xdf, 0x83, 0x44, 0xd3, 0xf0, 0x96, 0x71, 0x60, 0xdc, 0xaa,
- 0xff, 0x94, 0x06, 0x22, 0x92, 0x8a, 0xb2, 0x04, 0x43, 0x3d, 0xe2, 0x8d,
- 0x7c, 0x45, 0xdb, 0x6c, 0x6d, 0x93, 0xb8, 0xf2, 0xca, 0xaa, 0x31, 0xd8,
- 0x63, 0x4e, 0x9b, 0x7c, 0xf2, 0xf9, 0x93, 0xc7, 0x3b, 0xcd, 0x3c, 0xdc,
- 0x9d, 0x88, 0xe5, 0x41, 0x07, 0x4e, 0x9a, 0x8a, 0xd0, 0xcd, 0x9e, 0x93,
- 0x8d, 0x42, 0x3a, 0x8d, 0x18, 0x24, 0x39, 0x77, 0x8d, 0x83, 0xc9, 0x40,
- 0xfd, 0x17, 0xc5, 0xbd, 0x19, 0x64, 0xd0, 0x50, 0xaf, 0x70, 0x36, 0x71,
- 0x92, 0x6d, 0x51, 0x84, 0x9c, 0xf4, 0x76, 0xc5, 0x71, 0xdc, 0xdd, 0x82,
- 0xb4, 0x34, 0xcd, 0xfe, 0xdc, 0x41, 0x06, 0x7a, 0xec, 0x06, 0x25, 0xca,
- 0x93, 0xa2, 0x2a, 0x1a, 0x4c, 0x5a, 0x5d, 0xe9, 0x54, 0x69, 0x58, 0x76,
- 0x29, 0x4a, 0x1f, 0x04, 0xb9, 0x76, 0x92, 0x18, 0x54, 0x3b, 0x21, 0xad,
- 0x08, 0xa8, 0x8d, 0x23, 0x24, 0x8d, 0xc1, 0xe8, 0xbf, 0x84, 0x3f, 0x22,
- 0x23, 0x48, 0x8e, 0xa0, 0xec, 0x4b, 0x0c, 0x19, 0x63, 0x91, 0x2d, 0xb4,
- 0x3f, 0x1a, 0xab, 0x1e, 0x45, 0xe9, 0x8a, 0xd3, 0x39, 0x52, 0xc9, 0x97,
- 0x25, 0x65, 0xcc, 0x77, 0x41, 0x4f, 0xa9, 0xdf, 0x2e, 0x55, 0x94, 0x9c,
- 0xc6, 0xc4, 0x3a, 0x2b, 0xbc, 0x94, 0xdb, 0x14, 0x8c, 0xaa, 0x5d, 0xd8,
- 0xa5, 0x7f, 0xb7, 0x5c, 0x19, 0xd6, 0x74, 0xf2, 0x57, 0x5b, 0x74, 0xe8,
- 0x98, 0x3d, 0x59, 0x52, 0x8c, 0x1c, 0x49, 0x9e, 0xbf, 0xb0, 0x3d, 0xf2,
- 0x3c, 0xd9, 0xa6, 0x09, 0xef, 0xee, 0xee, 0xdc, 0x3f, 0x69, 0x79, 0xf2,
- 0xbe, 0x49, 0x9e, 0xb3, 0x2b, 0x8e, 0x3b, 0xaa, 0x58, 0x38, 0x46, 0x37,
- 0x0b, 0x7c, 0xd5, 0x83, 0x8c, 0xe9, 0x33, 0x4f, 0xb2, 0x62, 0x02, 0xc4,
- 0x8d, 0xd0, 0x10, 0xe5, 0x35, 0xf3, 0xf2, 0x9a, 0x2b, 0xd7, 0x7a, 0x7c,
- 0x82, 0xb3, 0x14, 0x01, 0x42, 0xb9, 0x81, 0x04, 0x30, 0x98, 0xbc, 0x34,
- 0x5c, 0x18, 0xea, 0x9b, 0x3a, 0x2b, 0x3a, 0x10, 0xde, 0xfa, 0xd8, 0x2d,
- 0xd3, 0x08, 0x37, 0xe1, 0x68, 0x34, 0x62, 0x52, 0x91, 0xea, 0x20, 0x79,
- 0xd4, 0xa6, 0x18, 0x93, 0xcb, 0x60, 0x3a, 0x0c, 0x20, 0xc1, 0xf9, 0x41,
- 0xd7, 0xce, 0x3e, 0xd6, 0xf0, 0x44, 0xac, 0x37, 0xf1, 0xa9, 0xcb, 0x98,
- 0x46, 0xa6, 0x7e, 0x74, 0xeb, 0x66, 0x4c, 0x6e, 0x3f, 0x06, 0xa2, 0xc3,
- 0xa5, 0x65, 0x18, 0x7a, 0xa2, 0xb9, 0x59, 0xfe, 0x26, 0x9a, 0x31, 0x1c,
- 0xd5, 0x98, 0x7f, 0xda, 0x20, 0x67, 0x9f, 0x8f, 0x29, 0x01, 0x41, 0xc5,
- 0x74, 0x75, 0xea, 0x1b, 0x1a, 0x62, 0x99, 0x38, 0x02, 0xda, 0x2c, 0x54,
- 0x21, 0x30, 0x2d, 0xe7, 0x9e, 0x44, 0xd4, 0xb6, 0x27, 0x4d, 0x5c, 0xc3,
- 0x3a, 0x68, 0xd3, 0x37, 0xf6, 0xac, 0xe9, 0x6b, 0xb0, 0xb0, 0x2c, 0x71,
- 0x0d, 0x8d, 0xd3, 0x8f, 0xab, 0xe4, 0xad, 0x3e, 0x96, 0x6c, 0x8f, 0xce,
- 0xdf, 0x1e, 0x7f, 0x73, 0xb6, 0x73, 0x9f, 0x4f, 0xdd, 0x97, 0xff, 0x76,
- 0x51, 0xa9, 0x66, 0xc9, 0xcb, 0xdc, 0xc9, 0x36, 0xf9, 0x66, 0x34, 0x1a,
- 0xbc, 0x3c, 0x3f, 0x21, 0x43, 0x60, 0x34, 0x32, 0x7f, 0xe9, 0xea, 0x46,
- 0x30, 0x94, 0x1e, 0x83, 0x83, 0xef, 0x49, 0xd1, 0x53, 0xd9, 0xcf, 0xa9,
- 0xb8, 0x28, 0x59, 0x03, 0x37, 0x72, 0x4a, 0x2a, 0x35, 0x34, 0x55, 0x74,
- 0x1b, 0x7c, 0xa0, 0x6d, 0xf2, 0x9c, 0x9f, 0xec, 0xd2, 0xb7, 0x50, 0x8b,
- 0x40, 0x0b, 0x8a, 0xbb, 0x0f, 0xd6, 0x61, 0x87, 0x57, 0x68, 0x3d, 0x94,
- 0x63, 0x4d, 0x02, 0x5a, 0xab, 0x21, 0x8c, 0xed, 0x87, 0xeb, 0x04, 0x41,
- 0x6b, 0x89, 0x5a, 0xc7, 0x8b, 0xcf, 0x18, 0x77, 0x0d, 0xf5, 0x45, 0x0a,
- 0x1c, 0xdc, 0xf2, 0x16, 0x93, 0x91, 0xc6, 0xf0, 0x90, 0xf3, 0xbb, 0x21,
- 0x41, 0x21, 0xd3, 0x7d, 0xd1, 0xce, 0x98, 0x1e, 0xac, 0x93, 0xc3, 0x2d,
- 0xca, 0x50, 0x5b, 0x16, 0xeb, 0xcb, 0xab, 0xd0, 0xff, 0xd0, 0xea, 0xf3,
- 0x2c, 0x9a, 0x14, 0xf1, 0x93, 0x99, 0x65, 0xc0, 0x82, 0xf4, 0xa2, 0xea,
- 0x3d, 0x65, 0x86, 0x08, 0x29, 0xab, 0x37, 0x9c, 0x76, 0x34, 0xfd, 0xa7,
- 0x74, 0x47, 0xdc, 0xa0, 0x81, 0x8c, 0x39, 0x7b, 0x80, 0xdc, 0xbe, 0xcb,
- 0x7a, 0xbe, 0x90, 0xbf, 0xa6, 0xcb, 0x3b, 0x72, 0xef, 0x4b, 0xb0, 0x8b,
- 0x2a, 0xa0, 0x2d, 0x4f, 0x37, 0x19, 0xbd, 0x2e, 0x27, 0x64, 0xe8, 0x73,
- 0x12, 0x36, 0x97, 0x3e, 0x77, 0xf3, 0x2c, 0x14, 0x7a, 0xa3, 0x87, 0x1b,
- 0x7b, 0x8a, 0x54, 0xf4, 0x65, 0x5f, 0xc7, 0xe8, 0x1b, 0x73, 0x58, 0x22,
- 0xc5, 0x69, 0x2d, 0x59, 0xef, 0xc2, 0x05, 0x31, 0x51, 0xc4, 0xcd, 0x89,
- 0xb7, 0xd3, 0x71, 0x55, 0xcc, 0xd7, 0x75, 0xc6, 0xf6, 0x2e, 0x1c, 0xf9,
- 0x28, 0x31, 0xdb, 0xb1, 0x5e, 0x42, 0x1a, 0x5a, 0x8c, 0x3d, 0x6d, 0xbd,
- 0x18, 0x87, 0x96, 0xa5, 0x74, 0x7f, 0x1b, 0x84, 0xe4, 0x50, 0xba, 0xf8,
- 0x27, 0x40, 0x58, 0x6f, 0xa0, 0x15, 0x25, 0xe6, 0x5d, 0x2b, 0xdc, 0x61,
- 0x64, 0xff, 0x74, 0x9f, 0x1a, 0xe4, 0xd1, 0x80, 0x10, 0x24, 0x77, 0xa3,
- 0x56, 0xa3, 0xa9, 0x36, 0x86, 0x88, 0x02, 0x71, 0x36, 0xd1, 0x94, 0x99,
- 0x31, 0x8e, 0xc9, 0xf8, 0xce, 0x7e, 0x8b, 0x3f, 0x93, 0x52, 0x36, 0x9b,
- 0x55, 0x84, 0x1f, 0x0a, 0x2e, 0xe6, 0xb6, 0xa3, 0x29, 0xdd, 0xf6, 0x9a,
- 0xdd, 0xa6, 0x9b, 0x5f, 0x6a, 0x0d, 0xfd, 0x3d, 0xf0, 0x13, 0xba, 0xf6,
- 0x98, 0x55, 0x7c, 0xf7, 0x6d, 0x71, 0x35, 0xf0, 0x9e, 0x0e, 0xe9, 0xa1,
- 0x80, 0x81, 0x91, 0x4f, 0x62, 0x57, 0xa5, 0xea, 0x11, 0xfc, 0x6d, 0x29,
- 0x37, 0x94, 0xe5, 0x13, 0xea, 0x7d, 0xc6, 0x16, 0xc3, 0x15, 0x9b, 0x7b,
- 0x3e, 0xbb, 0xcd, 0x19, 0x3e, 0x80, 0x20, 0x6e, 0xfd, 0xee, 0x87, 0x81,
- 0x65, 0x47, 0x8b, 0xe1, 0xfc, 0x80, 0x6a, 0x62, 0xf1, 0x2b, 0x79, 0x61,
- 0x86, 0x5d, 0x3f, 0xc8, 0x5f, 0xcc, 0x47, 0x7e, 0xc8, 0x97, 0x46, 0x37,
- 0xac, 0x76, 0x7c, 0x45, 0x29, 0x3c, 0xbb, 0xe5, 0x56, 0x65, 0xec, 0x30,
- 0x23, 0x76, 0x5c, 0xaa, 0x2a, 0x34, 0x67, 0x0e, 0x31, 0xaa, 0x0b, 0x34,
- 0x71, 0x39, 0x15, 0xb6, 0xb5, 0xef, 0xdd, 0x2a, 0xa8, 0x20, 0xe3, 0xb2,
- 0x5a, 0x16, 0x25, 0x33, 0x81, 0x3c, 0x31, 0x13, 0x41, 0xa3, 0xc6, 0xa1,
- 0x4d, 0x71, 0xb1, 0x00, 0x84, 0x7e, 0xe4, 0x3f, 0xa3, 0xeb, 0x2a, 0x32,
- 0xbb, 0x20, 0xea, 0x0a, 0xea, 0xd2, 0x1a, 0xb7, 0x9f, 0x98, 0x95, 0xd5,
- 0xab, 0xed, 0xbd, 0x1d, 0xee, 0xe2, 0xc0, 0xe0, 0x0c, 0x9a, 0x18, 0x89,
- 0x35, 0x87, 0x5e, 0x1c, 0x64, 0xd7, 0x26, 0xc9, 0x11, 0x03, 0x43, 0x93,
- 0xb7, 0x8b, 0x70, 0x84, 0x08, 0xd4, 0x90, 0x6a, 0x59, 0x67, 0x7c, 0x88,
- 0x59, 0x59, 0x90, 0x64, 0x5d, 0x2d, 0x13, 0x6e, 0x7b, 0x07, 0x28, 0xf3,
- 0x6d, 0x05, 0x6c, 0x63, 0xaa, 0xed, 0x45, 0x9c, 0xd0, 0xba, 0xc4, 0xa5,
- 0x1b, 0x9e, 0x14, 0xff, 0x1b, 0xca, 0xcd, 0xa7, 0x03, 0x08, 0x90, 0xcb,
- 0xb2, 0x30, 0x57, 0x64, 0x19, 0x41, 0x80, 0x15, 0x93, 0x82, 0x54, 0xfd,
- 0x6c, 0x79, 0x9d, 0x97, 0xc5, 0x92, 0x50, 0x76, 0xaf, 0xd3, 0x32, 0xa7,
- 0x64, 0x97, 0xde, 0xb7, 0x67, 0x6f, 0x8e, 0x7b, 0xbe, 0x4f, 0x64, 0x96,
- 0x8b, 0x23, 0xfd, 0x2a, 0xec, 0x23, 0x60, 0x77, 0x33, 0xe2, 0x34, 0x34,
- 0x77, 0xba, 0x51, 0x72, 0xb0, 0xad, 0xd7, 0x72, 0x92, 0xa0, 0xd6, 0x6b,
- 0x71, 0xb9, 0xd1, 0x25, 0x25, 0x11, 0x46, 0x1a, 0x8b, 0x2a, 0x73, 0xd1,
- 0x05, 0x18, 0xed, 0xff, 0xe4, 0x95, 0x52, 0x50, 0x1b, 0xa8, 0xc2, 0x6f,
- 0x6f, 0x99, 0x78, 0x2d, 0x30, 0xa1, 0xe9, 0x33, 0x03, 0xd8, 0xeb, 0xae,
- 0x7d, 0x3d, 0x2e, 0xee, 0x60, 0xd8, 0x6c, 0x35, 0xb8, 0x2e, 0xd9, 0xaa,
- 0x60, 0x8c, 0xd7, 0x5b, 0x4a, 0x5e, 0x4a, 0x98, 0x76, 0x12, 0x20, 0xec,
- 0x39, 0xde, 0xf1, 0x69, 0xe6, 0x6a, 0xfe, 0x84, 0x1b, 0x9d, 0x07, 0x77,
- 0xa7, 0xef, 0x90, 0x4f, 0xdf, 0x6d, 0x7d, 0x2f, 0x42, 0x58, 0xea, 0x4a,
- 0x24, 0x9b, 0xed, 0xca, 0x9b, 0x19, 0x2c, 0xe8, 0xb2, 0x12, 0x7a, 0x15,
- 0xcd, 0xe7, 0x8b, 0x49, 0xde, 0x48, 0x15, 0xb1, 0xd5, 0xf9, 0x8a, 0xcf,
- 0x45, 0x97, 0x94, 0xc6, 0x4c, 0x54, 0xe8, 0x63, 0xb8, 0x2e, 0xc8, 0xdd,
- 0x3e, 0xa3, 0x2a, 0x6b, 0x50, 0x2e, 0x2f, 0x01, 0x62, 0xe5, 0xe7, 0x3c,
- 0xd0, 0x77, 0xfa, 0x3e, 0x9c, 0x40, 0x3f, 0xe9, 0x00, 0xe1, 0x76, 0x19,
- 0x59, 0x76, 0xb7, 0x18, 0x85, 0x9a, 0x71, 0x8c, 0x6d, 0xa6, 0x8c, 0x62,
- 0x39, 0x87, 0xfa, 0xf1, 0x61, 0x3f, 0x11, 0x52, 0xea, 0x79, 0x43, 0xba,
- 0x44, 0xcd, 0xb0, 0xc1, 0x6c, 0xd4, 0xd8, 0x4b, 0x6b, 0x39, 0xe5, 0x3b,
- 0x11, 0x1d, 0x78, 0x04, 0x68, 0x3e, 0x66, 0x5d, 0xeb, 0x69, 0x34, 0x2b,
- 0x93, 0x46, 0x22, 0xd5, 0xba, 0xbc, 0xa6, 0xaa, 0x6f, 0xe9, 0x3f, 0xc7,
- 0x80, 0xbe, 0x76, 0x3b, 0xdc, 0x3e, 0xc4, 0x6e, 0xf9, 0xc6, 0x14, 0x91,
- 0xbb, 0x5c, 0x0a, 0x3c, 0x5c, 0xf2, 0x8d, 0xcc, 0x43, 0xe6, 0xa7, 0xb6,
- 0x8e, 0xc5, 0x00, 0x0a, 0xca, 0x54, 0x8a, 0x8a, 0x90, 0xa3, 0xeb, 0x32,
- 0x9d, 0xb8, 0xbf, 0x0c, 0xd2, 0x6a, 0x92, 0xe7, 0xda, 0xd1, 0x0c, 0xf1,
- 0xc1, 0x0c, 0x09, 0xe1, 0x51, 0x84, 0x28, 0xbb, 0x1f, 0xda, 0x49, 0x68,
- 0x5a, 0xb0, 0x73, 0x97, 0x53, 0xb4, 0x52, 0x6e, 0x75, 0x89, 0x24, 0x25,
- 0x2a, 0x0d, 0xd5, 0xd8, 0x61, 0xb4, 0xc9, 0x9b, 0xd6, 0x9a, 0x75, 0x98,
- 0xb6, 0xc6, 0xfa, 0xde, 0xf3, 0xcd, 0x6f, 0x25, 0xc1, 0x00, 0x38, 0x6d,
- 0x55, 0x4d, 0x17, 0xa8, 0x79, 0x66, 0xdf, 0x7f, 0x66, 0x53, 0xf6, 0x46,
- 0x0b, 0x16, 0x6c, 0x59, 0x0c, 0xd2, 0xf9, 0x2a, 0x9a, 0xe7, 0x39, 0x32,
- 0xaa, 0x93, 0xf6, 0x7c, 0xa5, 0x2d, 0x78, 0x79, 0x7a, 0xfe, 0x96, 0x30,
- 0x23, 0xd1, 0x3d, 0x60, 0x49, 0xfe, 0x31, 0xfe, 0x19, 0xa9, 0xc8, 0x1e,
- 0xb4, 0x6a, 0xe0, 0x46, 0xe7, 0x3e, 0xd0, 0xb3, 0x88, 0x69, 0xc5, 0x89,
- 0x6d, 0x4b, 0x6a, 0xf4, 0x96, 0x58, 0xd3, 0x45, 0x14, 0x3f, 0x35, 0x2f,
- 0xda, 0xcb, 0x31, 0xdf, 0x1c, 0x26, 0xf6, 0xd3, 0xda, 0x68, 0xc4, 0xd6,
- 0xe2, 0xf1, 0xdb, 0x6d, 0xe4, 0x4d, 0x64, 0x90, 0x91, 0xd6, 0x1a, 0xc8,
- 0xf3, 0x3a, 0xb3, 0xe8, 0x9c, 0x62, 0xd7, 0xd9, 0x48, 0xb9, 0xf6, 0x70,
- 0xe3, 0xbc, 0x22, 0x82, 0x6e, 0x51, 0x84, 0x88, 0xcd, 0xea, 0x44, 0x31,
- 0x58, 0xae, 0x96, 0x6d, 0xbc, 0x39, 0x21, 0x76, 0xab, 0x0e, 0x52, 0x0d,
- 0xd0, 0x00, 0xfe, 0x70, 0x63, 0x65, 0xa4, 0x4e, 0x15, 0xad, 0xe3, 0x36,
- 0x6c, 0xf0, 0xdb, 0x3e, 0x7f, 0x77, 0xbc, 0x86, 0x84, 0x68, 0x7d, 0x41,
- 0x76, 0x97, 0x95, 0x26, 0x7e, 0x02, 0xdf, 0x13, 0x0f, 0x18, 0x63, 0x89,
- 0xa1, 0x8a, 0x39, 0x4b, 0x17, 0x43, 0x64, 0x02, 0x48, 0xa9, 0x0c, 0xfc,
- 0xbe, 0x48, 0x6a, 0x6e, 0x4f, 0x78, 0x9d, 0x8a, 0xc8, 0x72, 0xda, 0x42,
- 0xab, 0x7c, 0x86, 0xbf, 0x41, 0x62, 0x94, 0x07, 0x97, 0xd1, 0xa3, 0x55,
- 0x91, 0x0d, 0x21, 0xa2, 0x71, 0x1b, 0x6d, 0x7e, 0xcb, 0xd0, 0xf9, 0x3c,
- 0x48, 0xad, 0x5d, 0xe0, 0xd0, 0xbb, 0xed, 0x6a, 0xbd, 0xfc, 0x68, 0xa6,
- 0x10, 0x02, 0x02, 0x68, 0xc6, 0x3b, 0xda, 0xbf, 0x50, 0xcf, 0x68, 0x34,
- 0x7d, 0xd0, 0xea, 0x68, 0x7a, 0x1d, 0x90, 0xfd, 0xd7, 0xe4, 0xc5, 0x13,
- 0x10, 0xfb, 0x4d, 0xb8, 0x8c, 0xec, 0x79, 0xb6, 0x2d, 0x91, 0xcd, 0xac,
- 0x2c, 0x01, 0xa3, 0x05, 0x1d, 0xce, 0xdb, 0x80, 0x21, 0xa5, 0x41, 0x93,
- 0x61, 0x48, 0xba, 0x55, 0x44, 0xd9, 0x24, 0x25, 0x4e, 0x41, 0xd4, 0xe0,
- 0x9d, 0x11, 0x13, 0x24, 0x10, 0x87, 0x6b, 0xe2, 0x7a, 0x98, 0x6c, 0xf4,
- 0x4d, 0x42, 0x2f, 0xf2, 0xfa, 0xaf, 0x45, 0x66, 0xd2, 0x44, 0xa7, 0xd8,
- 0xc4, 0x07, 0xe2, 0xae, 0x75, 0x48, 0x16, 0x92, 0x36, 0x55, 0xb9, 0x84,
- 0x68, 0x34, 0x46, 0x6e, 0xb4, 0x66, 0x8d, 0xc8, 0x2d, 0x97, 0xa7, 0x98,
- 0x2d, 0xed, 0xe0, 0x8b, 0x28, 0xf4, 0xf2, 0x27, 0xa7, 0x92, 0x5b, 0x8b,
- 0x47, 0x28, 0xfb, 0xc3, 0x16, 0x91, 0x96, 0x9d, 0xd2, 0xd0, 0x6f, 0x80,
- 0xfd, 0x36, 0x14, 0x85, 0x6f, 0x23, 0x92, 0x90, 0x56, 0x1a, 0x20, 0x09,
- 0x24, 0x1b, 0x04, 0xa1, 0x87, 0x73, 0xd0, 0x92, 0x63, 0x6f, 0x21, 0xf5,
- 0xcc, 0x1f, 0x21, 0xce, 0xc1, 0x03, 0x25, 0x20, 0xa9, 0x7d, 0xd6, 0x72,
- 0x57, 0xe8, 0xe3, 0x0e, 0xd7, 0xd6, 0xaf, 0x17, 0x81, 0x16, 0xd6, 0x48,
- 0xc5, 0x5d, 0x28, 0x05, 0x97, 0x81, 0x10, 0xe4, 0x62, 0xf0, 0x4f, 0x22,
- 0x02, 0xf1, 0x41, 0x63, 0x64, 0x5f, 0x22, 0x2d, 0x05, 0x6e, 0xc0, 0x40,
- 0x0c, 0x9e, 0xd9, 0x30, 0x21, 0x57, 0x9b, 0xd9, 0x3e, 0x83, 0xfa, 0x56,
- 0x42, 0x6f, 0xa9, 0xb8, 0x51, 0xa4, 0xe8, 0xc5, 0x9a, 0xc2, 0x69, 0x41,
- 0x01, 0x89, 0xe3, 0xfc, 0x24, 0x65, 0xa0, 0x1b, 0x40, 0x3d, 0xa4, 0xe5,
- 0x92, 0x33, 0x64, 0xa6, 0x7e, 0xe2, 0xa8, 0x91, 0xa6, 0xf6, 0x78, 0x51,
- 0xcd, 0xe0, 0xa0, 0x0a, 0xfd, 0x46, 0x55, 0x4e, 0x15, 0xe1, 0x51, 0x13,
- 0xd6, 0x55, 0x1d, 0xd5, 0x6a, 0xee, 0x75, 0x9c, 0x98, 0xc6, 0x91, 0xb1,
- 0xf9, 0xb8, 0xdd, 0x87, 0xa6, 0x49, 0x32, 0x3e, 0x39, 0x96, 0xfd, 0x5b,
- 0x94, 0x21, 0xa0, 0x8e, 0x07, 0xa2, 0x31, 0x32, 0x3b, 0x54, 0x7d, 0xbb,
- 0xb0, 0x26, 0x6c, 0xe9, 0xb3, 0x60, 0xef, 0x84, 0xd9, 0xf2, 0x69, 0x14,
- 0x7f, 0xc6, 0x9e, 0x4a, 0xe9, 0x69, 0x2d, 0xe2, 0x0b, 0xc7, 0x48, 0x91,
- 0xaf, 0x4e, 0x5e, 0x99, 0x95, 0xc2, 0xcc, 0x80, 0xb7, 0xfd, 0xeb, 0xae,
- 0x63, 0x09, 0x45, 0xd7, 0x86, 0xe3, 0xc9, 0x33, 0x03, 0x70, 0x5f, 0x1f,
- 0x94, 0x10, 0x28, 0xa5, 0x43, 0x8f, 0xe2, 0x9c, 0x2b, 0xa1, 0xfd, 0xb3,
- 0x3a, 0xba, 0x14, 0x65, 0x84, 0xb5, 0x48, 0x98, 0xf8, 0x57, 0x6b, 0xe4,
- 0x2a, 0xe2, 0x9c, 0x72, 0xcf, 0x3b, 0x69, 0xcb, 0x58, 0x66, 0x98, 0x73,
- 0x73, 0xc2, 0x01, 0x17, 0x70, 0xf8, 0xa1, 0xca, 0x8c, 0x08, 0xe5, 0x2a,
- 0xc7, 0x71, 0x59, 0x7c, 0xcc, 0x58, 0x5c, 0x90, 0x55, 0x48, 0xb8, 0x71,
- 0xaa, 0x00, 0x73, 0xb4, 0x38, 0x9f, 0x4f, 0x6d, 0x8a, 0x74, 0x10, 0x30,
- 0xe7, 0xfe, 0xba, 0x02, 0x38, 0xe3, 0xee, 0xb1, 0x9c, 0x5e, 0x27, 0xa8,
- 0x17, 0xed, 0x42, 0xc3, 0x47, 0x6d, 0x82, 0x14, 0xc2, 0x7f, 0xa2, 0xcc,
- 0xb6, 0xbb, 0xee, 0xcb, 0xec, 0xc8, 0x8e, 0x3e, 0xbc, 0x6d, 0xae, 0xe1,
- 0x25, 0x72, 0x5e, 0x26, 0x2f, 0x58, 0x20, 0xdc, 0xde, 0x51, 0x11, 0x74,
- 0xdb, 0x43, 0x49, 0xed, 0x9f, 0x07, 0x6a, 0x2d, 0x4e, 0x39, 0xff, 0x8a,
- 0x4c, 0x6d, 0x58, 0x50, 0x9c, 0x80, 0x39, 0x75, 0xd0, 0xd5, 0xd2, 0xfe,
- 0xa5, 0xcf, 0x72, 0x3d, 0x84, 0x83, 0xa6, 0x22, 0x56, 0xeb, 0x7b, 0x63,
- 0xaf, 0x01, 0x59, 0x4f, 0xd8, 0x1e, 0x82, 0x1c, 0xa3, 0xaa, 0x10, 0xb1,
- 0x10, 0xfe, 0x05, 0x29, 0xa3, 0xc6, 0x1a, 0xa9, 0x91, 0xc2, 0x47, 0xdf,
- 0x0a, 0xcc, 0x05, 0x6e, 0x85, 0x6a, 0x0b, 0xdd, 0x18, 0xa2, 0xc2, 0x22,
- 0x6a, 0xa1, 0x79, 0x82, 0x7f, 0x9b, 0x73, 0x6f, 0x9a, 0xe4, 0x18, 0xa6,
- 0x66, 0xc4, 0x88, 0xcf, 0x97, 0xba, 0x6f, 0x5c, 0x23, 0x9c, 0x4b, 0x6b,
- 0x0b, 0xce, 0xb6, 0x13, 0xa7, 0x48, 0xaa, 0x99, 0x74, 0xbc, 0x78, 0x1f,
- 0xe9, 0x33, 0xd2, 0xae, 0x85, 0x53, 0xd5, 0xc4, 0xb2, 0xd6, 0x1f, 0xd8,
- 0x1e, 0xa8, 0x0d, 0xeb, 0x89, 0x0d, 0x4b, 0xb2, 0x6a, 0xb8, 0xba, 0x21,
- 0xb6, 0xd8, 0xc4, 0x7b, 0xcc, 0x7f, 0xe5, 0xf0, 0x73, 0x34, 0x1d, 0x20,
- 0x0f, 0x3c, 0x22, 0x94, 0xfe, 0x33, 0x84, 0xa9, 0x1d, 0x6a, 0x80, 0x78,
- 0xcc, 0xfc, 0xd4, 0x3e, 0xd9, 0xd1, 0x3f, 0xe2, 0xd9, 0xf0, 0xc9, 0x01,
- 0xd2, 0x14, 0xe2, 0x6e, 0x40, 0xd6, 0x80, 0x7c, 0xbf, 0x8f, 0x75, 0xfc,
- 0x54, 0xb1, 0xcc, 0x72, 0xef, 0x6c, 0xd9, 0xdd, 0xe0, 0x12, 0x9c, 0x32,
- 0xdb, 0xa2, 0x76, 0xa9, 0x51, 0x1f, 0x92, 0x79, 0x2b, 0xe2, 0x77, 0xe2,
- 0xe4, 0x43, 0x61, 0x38, 0xdb, 0xc5, 0x96, 0x7a, 0xf8, 0x31, 0x6b, 0xd3,
- 0x2e, 0x9a, 0x03, 0xd3, 0xa3, 0x16, 0x5c, 0x3a, 0x6b, 0x43, 0xfd, 0x8d,
- 0xe7, 0xe4, 0xf9, 0xf0, 0x71, 0xe3, 0x9c, 0xd4, 0xf3, 0xc5, 0xe0, 0x66,
- 0x7c, 0x4f, 0xb8, 0xea, 0xe2, 0xf4, 0x0d, 0xa5, 0xeb, 0xa8, 0xb8, 0xa1,
- 0x3e, 0x52, 0x1a, 0x39, 0xc0, 0x5d, 0xc5, 0x1e, 0xde, 0x2b, 0x72, 0x17,
- 0x84, 0xf5, 0x22, 0x44, 0xc6, 0x56, 0x60, 0xc6, 0x55, 0xbc, 0x8b, 0xab,
- 0x46, 0x01, 0x3b, 0xcd, 0x90, 0x1c, 0x82, 0x58, 0xad, 0xe6, 0x79, 0xb4,
- 0x32, 0x51, 0xb3, 0xf8, 0xb3, 0xdb, 0x6c, 0xb2, 0xa6, 0xdc, 0x02, 0xa8,
- 0xf6, 0x40, 0xc0, 0xdb, 0x1c, 0xf3, 0xf0, 0xe2, 0x1c, 0x12, 0xd9, 0x30,
- 0x3f, 0x68, 0x13, 0xa3, 0xbd, 0x76, 0x5e, 0x7c, 0x58, 0x66, 0x42, 0x59,
- 0x6c, 0xb1, 0xdf, 0x05, 0xe1, 0x7d, 0xaa, 0xf1, 0x81, 0x32, 0x63, 0x58,
- 0x2a, 0xbf, 0x5c, 0xb2, 0xfa, 0xf6, 0x26, 0x9f, 0x94, 0x45, 0x55, 0xcc,
- 0xa4, 0x76, 0xcc, 0xe9, 0x75, 0x27, 0x27, 0xa3, 0xe4, 0x26, 0x1b, 0x6b,
- 0x41, 0xff, 0x30, 0xf4, 0xff, 0x93, 0x0c, 0x41, 0x48, 0xab, 0xcc, 0xb3,
- 0x1a, 0x24, 0xd3, 0x20, 0x36, 0x00, 0xee, 0xa8, 0xab, 0xa6, 0xc0, 0x3f,
- 0x91, 0xf5, 0x85, 0xc6, 0xc4, 0x73, 0xbe, 0x98, 0x56, 0x59, 0x11, 0xc9,
- 0x65, 0xe0, 0x09, 0xe8, 0xb5, 0xc2, 0x7c, 0x42, 0xfa, 0xd7, 0x38, 0x95,
- 0x9e, 0x8f, 0xec, 0xd7, 0x31, 0x62, 0x07, 0x0a, 0xa6, 0xf8, 0x9a, 0x3f,
- 0xc2, 0xcb, 0x19, 0x14, 0xdb, 0xd9, 0x9c, 0xf8, 0x96, 0xc3, 0x75, 0x39,
- 0x2d, 0x4a, 0xca, 0x1d, 0xf3, 0xba, 0xb1, 0x51, 0xdf, 0xe2, 0x75, 0x49,
- 0x55, 0xa3, 0x04, 0xbe, 0x1c, 0xca, 0xd3, 0x9b, 0x2b, 0x86, 0x81, 0xd1,
- 0x5d, 0x70, 0x5a, 0x1b, 0xd5, 0x26, 0x4a, 0xcf, 0x1f, 0xcc, 0xdf, 0x5d,
- 0x37, 0xde, 0x6e, 0x44, 0x81, 0x5a, 0x65, 0x3f, 0x5c, 0x41, 0xbc, 0xa4,
- 0x97, 0xbc, 0xca, 0x2f, 0x3b, 0x9a, 0x73, 0x5b, 0x68, 0x1a, 0xa7, 0x16,
- 0xd1, 0x6c, 0xe4, 0xca, 0x2c, 0xf9, 0x8c, 0x26, 0x41, 0xc7, 0x79, 0x2a,
- 0xdb, 0x0c, 0x9d, 0xe7, 0x1d, 0xdc, 0xf7, 0xbf, 0x23, 0x0c, 0xd8, 0x9c,
- 0x8a, 0x3d, 0x01, 0xf7, 0x45, 0xcd, 0x03, 0xf8, 0x9c, 0xb1, 0x34, 0x75,
- 0xec, 0x54, 0xd8, 0xbb, 0xda, 0x7e, 0x50, 0x14, 0x32, 0x92, 0x4b, 0xe4,
- 0x05, 0xd2, 0xe5, 0xdf, 0x53, 0xda, 0x9e, 0x66, 0x94, 0xd2, 0x3f, 0xba,
- 0x05, 0x7e, 0xb0, 0x3f, 0x18, 0x67, 0x29, 0xfa, 0xc3, 0xbd, 0xa8, 0xa1,
- 0x30, 0xdd, 0x53, 0x05, 0x27, 0xe0, 0xf7, 0x7e, 0x36, 0xf2, 0xd7, 0xfc,
- 0x7a, 0x72, 0x41, 0xfa, 0x16, 0xa7, 0xc3, 0x9d, 0xbd, 0x7c, 0x7f, 0xf1,
- 0x6d, 0x92, 0xec, 0x07, 0x9d, 0x82, 0x14, 0x5b, 0x3b, 0x2a, 0x1a, 0x64,
- 0x24, 0x1e, 0x48, 0x8f, 0x37, 0xf5, 0x9b, 0x5f, 0xfe, 0x75, 0xbd, 0x9c,
- 0x44, 0x9d, 0x0c, 0x62, 0x84, 0xb9, 0x98, 0xb3, 0xdc, 0xc1, 0x5c, 0x5f,
- 0xd2, 0xc8, 0x8d, 0xd7, 0x2e, 0x85, 0xe2, 0x2e, 0x1d, 0x84, 0xe1, 0x4d,
- 0xd4, 0x25, 0xdb, 0x92, 0xef, 0xce, 0x86, 0x79, 0x24, 0xc5, 0x5a, 0xab,
- 0x16, 0x10, 0x34, 0x4d, 0xb5, 0xa7, 0xa6, 0x70, 0x30, 0x61, 0xea, 0x76,
- 0x8f, 0xf1, 0x77, 0xaf, 0x8f, 0x5a, 0xc3, 0x3d, 0x7d, 0xf6, 0xe4, 0xd1,
- 0x27, 0xcc, 0xb3, 0x2c, 0xb0, 0x1e, 0xb1, 0xcc, 0xa2, 0xd0, 0x5f, 0x3f,
- 0x94, 0x28, 0xbf, 0x57, 0x57, 0x51, 0x21, 0x0f, 0xf9, 0xd8, 0x20, 0x55,
- 0x3d, 0x45, 0xc2, 0x9d, 0x85, 0x0e, 0x2a, 0x55, 0xeb, 0xff, 0x8f, 0x7f,
- 0x84, 0xd6, 0xdd, 0x5f, 0x7e, 0xa6, 0x80, 0x0e, 0xf5, 0xe5, 0xb5, 0x85,
- 0x1a, 0x2a, 0x6a, 0xaa, 0x86, 0x34, 0xfb, 0xdb, 0xba, 0x90, 0x04, 0x04,
- 0x09, 0x2b, 0x74, 0xb4, 0xd9, 0x82, 0x00, 0xd8, 0xfa, 0xfd, 0x96, 0xed,
- 0xb3, 0xc7, 0xa6, 0xbc, 0x24, 0xeb, 0xca, 0xed, 0x2a, 0xb3, 0xb6, 0x3b,
- 0x5e, 0x12, 0x4f, 0x05, 0x3e, 0x33, 0xab, 0x3f, 0x58, 0x28, 0x3e, 0xdb,
- 0x89, 0xd4, 0xab, 0xff, 0xd1, 0x1e, 0x71, 0x02, 0x50, 0xa8, 0x61, 0x10,
- 0x33, 0xcb, 0x40, 0x76, 0xd3, 0xef, 0x33, 0xd2, 0x08, 0x87, 0x8c, 0xd8,
- 0x90, 0x2f, 0x3b, 0x3c, 0xd5, 0x3d, 0xc9, 0x17, 0xfb, 0x0f, 0xb3, 0x5b,
- 0xfd, 0xfa, 0xa6, 0xf8, 0x87, 0xef, 0x92, 0xee, 0x99, 0x9d, 0x4a, 0x7a,
- 0x58, 0xc4, 0x87, 0xdf, 0xef, 0xa1, 0x62, 0xb1, 0xf7, 0x59, 0xc8, 0x9c,
- 0x6b, 0x2a, 0x8e, 0x64, 0x16, 0xb0, 0x4a, 0xd5, 0x26, 0x38, 0x72, 0xfb,
- 0x49, 0x40, 0x2c, 0xf4, 0xa1, 0x6c, 0xfe, 0x63, 0x88, 0x3f, 0xff, 0xb2,
- 0x37, 0x78, 0xf2, 0xb3, 0xfb, 0xec, 0xef, 0xf7, 0x3e, 0xfc, 0x7e, 0xbf,
- 0x17, 0x2b, 0x49, 0x75, 0x70, 0x27, 0x5e, 0x4a, 0x2a, 0x74, 0xe0, 0xe5,
- 0x9d, 0xd4, 0xe5, 0x48, 0x48, 0xd9, 0xb5, 0xf7, 0x35, 0x54, 0xe2, 0x70,
- 0x4f, 0x5b, 0xf7, 0x4d, 0xaf, 0x91, 0x35, 0x00, 0x05, 0xd7, 0x69, 0xb8,
- 0xda, 0xe2, 0x57, 0xe5, 0xc9, 0x4d, 0xc1, 0xef, 0x2b, 0x28, 0x0c, 0x4e,
- 0x93, 0x54, 0x8c, 0x04, 0x12, 0x74, 0xe9, 0xc5, 0x17, 0x28, 0x35, 0xab,
- 0x76, 0xb0, 0x42, 0x21, 0x3d, 0x24, 0x11, 0xce, 0xdc, 0x81, 0x69, 0xd2,
- 0x08, 0x17, 0x18, 0x6b, 0x71, 0x6c, 0x7f, 0xb2, 0xcc, 0x82, 0x52, 0x51,
- 0x45, 0x73, 0x64, 0x9b, 0x4f, 0x7c, 0xbf, 0xe6, 0x2d, 0x3f, 0xdc, 0xc3,
- 0x22, 0x85, 0x57, 0xae, 0xc1, 0xd6, 0x84, 0x8e, 0x7f, 0x90, 0x6b, 0xf6,
- 0x57, 0xe4, 0xed, 0xf8, 0x77, 0x04, 0xdf, 0x44, 0x66, 0xc0, 0xbc, 0x72,
- 0x01, 0x37, 0xfa, 0x99, 0x9e, 0x0a, 0x73, 0xeb, 0x50, 0x7f, 0xd9, 0x18,
- 0x2e, 0x41, 0x3a, 0x46, 0xf7, 0xdd, 0x46, 0x33, 0x43, 0xdb, 0x99, 0x6e,
- 0xec, 0x10, 0xf6, 0xd2, 0xaa, 0x83, 0x20, 0x3e, 0x29, 0x3c, 0x22, 0x08,
- 0xa1, 0x88, 0x38, 0x9b, 0x1b, 0x8f, 0x0e, 0x90, 0x2d, 0x5c, 0x67, 0x03,
- 0x0f, 0x0a, 0x80, 0xa0, 0x07, 0xe8, 0xa7, 0xbc, 0x42, 0x81, 0x8e, 0x91,
- 0x40, 0xee, 0x20, 0x88, 0x3e, 0xe3, 0xd2, 0x9c, 0xde, 0x19, 0xc9, 0xc9,
- 0x68, 0xd6, 0x43, 0x5b, 0xed, 0xa2, 0x9e, 0x05, 0x11, 0x4e, 0x86, 0xd5,
- 0xb6, 0x06, 0x5b, 0xc9, 0xb6, 0xb5, 0x06, 0xa7, 0x69, 0x75, 0xb5, 0x13,
- 0xf3, 0x3b, 0x3b, 0x57, 0xaf, 0x93, 0x6b, 0xd2, 0x8d, 0x88, 0xee, 0x59,
- 0x16, 0x68, 0xdd, 0x6a, 0xef, 0x19, 0xc3, 0x08, 0x21, 0x29, 0x74, 0x60,
- 0x33, 0x07, 0x1a, 0x3f, 0x41, 0x1d, 0xa7, 0xc0, 0x91, 0xff, 0x9b, 0x54,
- 0xab, 0x87, 0x45, 0xfc, 0xe6, 0x59, 0x4e, 0xeb, 0x1b, 0x70, 0xc9, 0x9b,
- 0xbb, 0x7a, 0xa1, 0xbf, 0xcf, 0xe7, 0xd9, 0x7c, 0x90, 0x2f, 0x16, 0xd9,
- 0x34, 0x92, 0xfc, 0xc6, 0xf5, 0x04, 0xd4, 0x63, 0x99, 0x00, 0x98, 0xe8,
- 0xe9, 0xc4, 0x39, 0x60, 0x22, 0xc8, 0x1d, 0x1a, 0xf3, 0x8b, 0x42, 0xd8,
- 0x4a, 0x58, 0x40, 0x24, 0xaf, 0xe0, 0x11, 0x31, 0x04, 0x10, 0x22, 0x8c,
- 0xe4, 0x7b, 0x5b, 0xaf, 0xb8, 0x70, 0xdb, 0xef, 0x9f, 0x81, 0xce, 0x53,
- 0x69, 0x10, 0x21, 0xe4, 0xd9, 0xa4, 0xb8, 0x78, 0x26, 0x99, 0x8e, 0x46,
- 0x05, 0x1f, 0x37, 0x69, 0xae, 0x7e, 0x1b, 0x41, 0x83, 0x02, 0x3a, 0x88,
- 0xf3, 0x1b, 0xf1, 0xc5, 0xdc, 0x1e, 0x8e, 0x6c, 0x2d, 0xc8, 0x15, 0xb9,
- 0x30, 0x6e, 0x71, 0xd7, 0x51, 0xe4, 0xa3, 0xe2, 0x06, 0xea, 0x5c, 0x69,
- 0xec, 0xbb, 0xd4, 0x3b, 0xf7, 0xee, 0x7f, 0xf6, 0x3d, 0xfa, 0xaa, 0xe9,
- 0xa2, 0xe4, 0x5e, 0xa4, 0xb7, 0x4d, 0x77, 0x5a, 0x0b, 0xd1, 0xd9, 0x7f,
- 0x30, 0xb6, 0x23, 0x69, 0xf5, 0x91, 0x33, 0x16, 0xa6, 0x85, 0xdb, 0x15,
- 0x6f, 0x53, 0xf8, 0x5e, 0x6c, 0xce, 0x41, 0xb0, 0xba, 0xe2, 0xc9, 0x78,
- 0x70, 0x16, 0x94, 0xc5, 0xbc, 0x6a, 0x14, 0x76, 0x09, 0x30, 0x07, 0x64,
- 0x8d, 0x25, 0x1c, 0x7f, 0xb3, 0xca, 0x41, 0xa2, 0x74, 0x19, 0x49, 0xf6,
- 0xaf, 0x22, 0xb1, 0x58, 0xbf, 0xf6, 0xd6, 0x70, 0x4b, 0x44, 0xd1, 0xe8,
- 0xa0, 0xdb, 0xa6, 0x56, 0x49, 0x8d, 0x07, 0xa3, 0x59, 0x3d, 0x24, 0x59,
- 0xa4, 0x1e, 0x90, 0xe0, 0x55, 0xdc, 0x32, 0x98, 0x9f, 0x64, 0x6f, 0x2a,
- 0xca, 0x57, 0x49, 0x4b, 0x26, 0x69, 0x2c, 0x33, 0x25, 0xbb, 0x04, 0xec,
- 0x18, 0xd4, 0x46, 0x80, 0xaf, 0x18, 0x19, 0xb7, 0x8c, 0x54, 0x9a, 0x6f,
- 0xe8, 0xea, 0x84, 0xcc, 0x88, 0xe4, 0xc5, 0xea, 0xaa, 0x34, 0x76, 0x59,
- 0x58, 0xc1, 0x3a, 0xfa, 0x36, 0x61, 0x8c, 0x6e, 0xf3, 0x14, 0x3f, 0x63,
- 0x25, 0xb0, 0x07, 0x63, 0xfc, 0x09, 0xb1, 0x77, 0x91, 0x99, 0x37, 0x48,
- 0xab, 0x41, 0xc0, 0x1d, 0x48, 0xd0, 0xf0, 0x93, 0x51, 0x60, 0x14, 0xc2,
- 0x53, 0x80, 0xac, 0x70, 0x24, 0x2b, 0x2c, 0x81, 0xef, 0x66, 0xf8, 0x63,
- 0x77, 0x38, 0xdc, 0x85, 0x66, 0xb0, 0x6b, 0xfe, 0x93, 0x7b, 0xcd, 0xca,
- 0xda, 0x1d, 0x71, 0xcd, 0x4d, 0x82, 0x6f, 0xc1, 0x3b, 0x2b, 0xdd, 0xe3,
- 0xbd, 0x0e, 0xa3, 0x7f, 0x5b, 0x53, 0x5e, 0x7f, 0x69, 0xec, 0xbc, 0x92,
- 0xe0, 0x62, 0x32, 0x74, 0x5e, 0xb1, 0x5a, 0x6b, 0x24, 0xbd, 0x57, 0xe2,
- 0x95, 0x95, 0xc0, 0x51, 0xb5, 0x7a, 0x2b, 0xc3, 0xe1, 0x42, 0x7e, 0x51,
- 0x2c, 0x22, 0xaf, 0x15, 0x01, 0x94, 0xc0, 0x5b, 0xd2, 0x8d, 0x9e, 0x96,
- 0xc7, 0xfb, 0xad, 0xed, 0xcb, 0xcd, 0x86, 0x4f, 0x8d, 0xcd, 0x4a, 0xc0,
- 0xe1, 0xc8, 0x6b, 0x0e, 0x2b, 0x23, 0xc5, 0xcd, 0xcd, 0x29, 0x2d, 0x6d,
- 0x28, 0x54, 0xba, 0x7f, 0x9c, 0x15, 0xe0, 0xb5, 0xbc, 0xe5, 0xcc, 0xa8,
- 0xed, 0x40, 0x7f, 0xe5, 0x8f, 0xec, 0x60, 0x08, 0xaf, 0xf2, 0x61, 0x95,
- 0xd9, 0x36, 0x5e, 0x62, 0x5a, 0xa4, 0x9c, 0x56, 0x49, 0x46, 0xb5, 0x14,
- 0x84, 0xc4, 0xfc, 0x91, 0xd6, 0x19, 0x68, 0x2f, 0x2d, 0x6f, 0x0a, 0x66,
- 0xcd, 0xc0, 0x5e, 0x37, 0x94, 0x7f, 0x75, 0xfc, 0x4e, 0x2c, 0x06, 0x72,
- 0x0d, 0x42, 0xbd, 0x62, 0x8d, 0x2a, 0x00, 0xfb, 0x27, 0x17, 0xc3, 0xd3,
- 0xc7, 0xe4, 0x09, 0x00, 0xdd, 0xaa, 0xab, 0x74, 0xff, 0xc9, 0x53, 0x99,
- 0xb6, 0x22, 0x71, 0x92, 0x8a, 0xbc, 0xc5, 0xbf, 0xda, 0xdd, 0xe5, 0x14,
- 0x24, 0x38, 0x8d, 0x82, 0xbb, 0x97, 0x3c, 0xb8, 0x78, 0xf6, 0x4f, 0x5b,
- 0x71, 0xfc, 0x1e, 0xb5, 0x29, 0x19, 0xdc, 0x32, 0xa1, 0x98, 0x1e, 0x65,
- 0x2c, 0x37, 0x9a, 0x3e, 0xf5, 0x1b, 0x2d, 0x3d, 0xa9, 0x20, 0x30, 0xdd,
- 0xd0, 0x0b, 0x49, 0xe0, 0xab, 0xa8, 0xe9, 0xb8, 0x91, 0x0e, 0x0a, 0x4a,
- 0x01, 0x4c, 0x70, 0x8f, 0x3a, 0x64, 0xc5, 0x67, 0xb7, 0x35, 0xb9, 0x7b,
- 0x83, 0x42, 0x46, 0x49, 0x25, 0xc6, 0x86, 0x78, 0x23, 0x4b, 0x42, 0x7d,
- 0xce, 0xd1, 0x20, 0xe2, 0x3c, 0x8d, 0x65, 0xb3, 0xb3, 0x94, 0x36, 0x73,
- 0x3d, 0x0e, 0x72, 0xbf, 0xe4, 0x9b, 0x16, 0xc3, 0x9b, 0x3c, 0x6d, 0x5e,
- 0xca, 0xb5, 0x3b, 0x2e, 0x5c, 0x9c, 0x4f, 0x8c, 0xe5, 0x08, 0x10, 0xd8,
- 0x05, 0xd4, 0x33, 0x42, 0x61, 0x1c, 0x6c, 0x95, 0x3e, 0x47, 0xb8, 0xee,
- 0x28, 0x9c, 0x1e, 0x9c, 0x03, 0xc3, 0x0a, 0xbb, 0xe0, 0x03, 0xf1, 0x02,
- 0x04, 0xcd, 0x99, 0x10, 0xb9, 0x7b, 0x3e, 0x7c, 0x74, 0xa8, 0x70, 0xef,
- 0xfd, 0xe4, 0x9b, 0xe5, 0x1a, 0xfb, 0x81, 0x45, 0x7f, 0x33, 0xfa, 0x2e,
- 0x28, 0x5b, 0xc5, 0x1b, 0x8f, 0x0f, 0xf0, 0xc6, 0xdb, 0x11, 0x3f, 0x75,
- 0x53, 0xcc, 0x67, 0xe6, 0xcd, 0xd8, 0x73, 0xcf, 0xf0, 0x9c, 0xe1, 0xb8,
- 0x69, 0x3d, 0xaf, 0x94, 0xa9, 0x36, 0xcc, 0xe4, 0xf1, 0xe3, 0xc8, 0x4c,
- 0xfa, 0xbf, 0xf8, 0x43, 0x67, 0x74, 0xaf, 0x83, 0x99, 0xd0, 0xd3, 0x90,
- 0x18, 0x87, 0x0a, 0x7a, 0x6c, 0xf3, 0x82, 0x4f, 0x29, 0x7c, 0x19, 0xbd,
- 0xe8, 0x21, 0x1d, 0x4f, 0x4b, 0xc2, 0x60, 0xad, 0x09, 0x8b, 0xe6, 0xd9,
- 0xfe, 0xc1, 0xde, 0xee, 0xd3, 0xe1, 0xe3, 0xe1, 0xbe, 0x4d, 0xb0, 0x65,
- 0x90, 0x86, 0x9a, 0x32, 0x9a, 0x22, 0x81, 0x24, 0x4a, 0x2d, 0xcb, 0x97,
- 0x02, 0xc3, 0x64, 0x7f, 0x42, 0x1e, 0x58, 0x97, 0x5a, 0x07, 0x60, 0xa6,
- 0x3d, 0xbf, 0x52, 0x73, 0x18, 0xe9, 0x00, 0x8e, 0xd6, 0xbd, 0x98, 0x84,
- 0x7a, 0x0d, 0xd7, 0xa5, 0x38, 0xbb, 0xc6, 0xf9, 0xdf, 0xd6, 0x79, 0x6d,
- 0xb4, 0x00, 0x08, 0x15, 0xf8, 0x42, 0xb5, 0x85, 0x0b, 0xd9, 0x0d, 0xb4,
- 0x0e, 0x9c, 0x88, 0x88, 0x93, 0x59, 0x10, 0x26, 0x40, 0x4d, 0x0f, 0x51,
- 0x84, 0xaa, 0x41, 0x73, 0x92, 0x5d, 0x09, 0xb7, 0x4e, 0xab, 0x8c, 0x1d,
- 0x31, 0xa1, 0x8e, 0xbc, 0xc6, 0x06, 0xbf, 0x46, 0xfc, 0x25, 0xec, 0x94,
- 0x2e, 0xde, 0x1d, 0x58, 0x8d, 0x36, 0x84, 0xa6, 0x99, 0x5e, 0xae, 0xcf,
- 0x8a, 0xfc, 0x80, 0x8b, 0xc7, 0xd8, 0x97, 0x48, 0xeb, 0x0e, 0xa4, 0x93,
- 0xa3, 0x43, 0x63, 0xc7, 0xa5, 0x43, 0x09, 0x4a, 0x37, 0x39, 0x52, 0xe4,
- 0xca, 0x24, 0xfc, 0x0a, 0xdc, 0x98, 0x2b, 0x73, 0x73, 0x40, 0x5e, 0x61,
- 0xab, 0x9a, 0xb8, 0x55, 0xfc, 0xaf, 0x06, 0xec, 0xdf, 0xb0, 0xbb, 0x65,
- 0x73, 0xbb, 0xb1, 0xb9, 0x8c, 0xf9, 0xab, 0xb9, 0xec, 0xe0, 0xb7, 0xe7,
- 0xb2, 0xfd, 0x87, 0x72, 0x99, 0x63, 0x32, 0x9c, 0xb3, 0x0d, 0x2c, 0x46,
- 0xe0, 0x9b, 0x7c, 0xf5, 0x76, 0x70, 0x99, 0xcf, 0x66, 0x04, 0xf7, 0x12,
- 0x63, 0xb4, 0x06, 0x9f, 0x59, 0x36, 0xeb, 0xe0, 0x32, 0x86, 0xac, 0x64,
- 0x1e, 0xdb, 0xcc, 0x62, 0xcc, 0x63, 0xb8, 0xbd, 0x36, 0x72, 0x59, 0xb3,
- 0x9d, 0xd4, 0x66, 0x3e, 0x73, 0xec, 0xf0, 0x60, 0x2e, 0xd3, 0x0e, 0x79,
- 0x2c, 0x75, 0x3a, 0x58, 0xac, 0xc1, 0x63, 0xc2, 0x64, 0x51, 0x2e, 0x7b,
- 0x1e, 0xe3, 0xb2, 0x83, 0x87, 0x70, 0x99, 0xd9, 0xd0, 0x39, 0xae, 0xca,
- 0x06, 0x97, 0x3d, 0xfe, 0x6d, 0xb9, 0x0c, 0x48, 0x7a, 0xed, 0xaa, 0xf3,
- 0xe4, 0xe5, 0x7f, 0x75, 0x1f, 0x53, 0x1a, 0x56, 0x47, 0x0d, 0x8a, 0xb1,
- 0x7f, 0x99, 0xa4, 0x68, 0x1d, 0xe8, 0x7b, 0x77, 0xac, 0x09, 0x66, 0xb7,
- 0xf7, 0x8b, 0x77, 0x6c, 0xbf, 0x6d, 0x99, 0x94, 0x19, 0xc7, 0x40, 0xfe,
- 0xa2, 0xa1, 0xa8, 0xc3, 0xdd, 0xdd, 0x9f, 0xc9, 0x39, 0x77, 0x88, 0xbb,
- 0xef, 0xe7, 0xb6, 0x0a, 0x1f, 0x53, 0x67, 0x47, 0x67, 0x47, 0xdf, 0x8d,
- 0x24, 0x96, 0x22, 0x3a, 0x87, 0xea, 0x24, 0x6c, 0x83, 0x1b, 0x5d, 0x95,
- 0x70, 0x14, 0x02, 0x35, 0x97, 0xdb, 0xaa, 0x0f, 0x6e, 0xfb, 0x1a, 0xcf,
- 0xa0, 0x04, 0x46, 0x11, 0xc6, 0x84, 0x68, 0x24, 0xc8, 0x8d, 0xe4, 0x89,
- 0xd2, 0x51, 0xab, 0xa4, 0xc3, 0x50, 0xe3, 0x89, 0xd8, 0xa8, 0x8e, 0xb8,
- 0xc4, 0x96, 0xde, 0x8b, 0xdb, 0xf5, 0x55, 0x49, 0x55, 0x62, 0xf4, 0xe8,
- 0x8e, 0x86, 0x32, 0x37, 0xcd, 0x4e, 0xe6, 0xf5, 0x2d, 0x01, 0xcb, 0xaf,
- 0x4a, 0x0d, 0x0f, 0xc7, 0x8c, 0x5c, 0xfb, 0x5b, 0xf5, 0xd9, 0xba, 0x06,
- 0x23, 0x8e, 0x5c, 0x02, 0x12, 0xe9, 0xd1, 0x1b, 0xef, 0x05, 0xc9, 0xb8,
- 0xf9, 0xad, 0xd4, 0xf3, 0x59, 0x54, 0xb1, 0xb9, 0xe1, 0xbe, 0x25, 0x55,
- 0x4b, 0xd9, 0x25, 0xea, 0x20, 0x95, 0x54, 0x04, 0xa2, 0xa9, 0x56, 0xf5,
- 0xd8, 0x0c, 0xd9, 0xf6, 0xf7, 0xf1, 0x2f, 0x52, 0xfc, 0x86, 0xff, 0xfe,
- 0x04, 0xdf, 0x85, 0x13, 0x94, 0xff, 0x75, 0x85, 0x7f, 0xd2, 0xf7, 0x14,
- 0xef, 0xb0, 0xb1, 0xcb, 0x93, 0x38, 0xa1, 0xfd, 0xc2, 0x43, 0x8b, 0x93,
- 0xf2, 0xb6, 0x08, 0xb0, 0x01, 0x69, 0xd5, 0x3e, 0x18, 0x56, 0x90, 0x40,
- 0x66, 0xa5, 0x30, 0x8d, 0xfc, 0x38, 0xae, 0x70, 0x65, 0x3e, 0x66, 0xb3,
- 0xa2, 0x8f, 0xf8, 0x6d, 0x38, 0x5d, 0xf4, 0x5e, 0x36, 0x80, 0x9b, 0x56,
- 0x47, 0x3a, 0x2a, 0x70, 0x93, 0x29, 0x99, 0xf7, 0xde, 0xa3, 0xcf, 0x43,
- 0x97, 0xc4, 0x7b, 0xad, 0x8c, 0x75, 0xc0, 0xc5, 0x94, 0xa4, 0x43, 0x55,
- 0x2a, 0x63, 0x57, 0x10, 0x16, 0xfb, 0x6c, 0xa4, 0x7c, 0x16, 0xb6, 0xef,
- 0x34, 0x63, 0x63, 0x69, 0xcc, 0x76, 0xaf, 0xc8, 0x89, 0xb4, 0xd9, 0x54,
- 0x0a, 0xae, 0x82, 0x5c, 0x2a, 0x0c, 0xe0, 0xaf, 0xe4, 0x4c, 0x93, 0x40,
- 0xbe, 0xc3, 0x8b, 0xa1, 0x01, 0xd0, 0xaf, 0x1c, 0x62, 0xe6, 0x1f, 0x1e,
- 0x3f, 0xc2, 0xae, 0xea, 0x28, 0x68, 0x34, 0x37, 0x2f, 0x04, 0xfa, 0xe6,
- 0x0f, 0x07, 0xe9, 0xf0, 0x9f, 0x88, 0x40, 0xf8, 0xa4, 0x69, 0x45, 0xff,
- 0xbe, 0xef, 0x67, 0xab, 0x8d, 0xd3, 0x32, 0xe2, 0xb3, 0x11, 0x0d, 0x51,
- 0xd1, 0x8a, 0x14, 0xea, 0xc7, 0xa6, 0xb1, 0xa5, 0x6c, 0xc0, 0x52, 0x59,
- 0x8d, 0xfd, 0xa1, 0x19, 0x2a, 0x09, 0x3b, 0x37, 0xd9, 0xb0, 0x11, 0x27,
- 0x3d, 0xb0, 0xa7, 0xa0, 0x1f, 0x40, 0x42, 0xa6, 0xf3, 0x3e, 0x27, 0xc7,
- 0xc5, 0xeb, 0xed, 0x1a, 0x1f, 0x99, 0x96, 0xe9, 0x8d, 0x67, 0x41, 0x33,
- 0xe0, 0xdb, 0x8c, 0x62, 0x42, 0x2e, 0x1f, 0x08, 0xb5, 0x26, 0xc8, 0x0f,
- 0x88, 0x69, 0x1f, 0xd5, 0xa4, 0x44, 0x4b, 0x3e, 0xe9, 0x3c, 0x44, 0x63,
- 0xad, 0x00, 0xb6, 0x6b, 0xd4, 0x8e, 0xcb, 0x4c, 0x2b, 0xb0, 0xed, 0xaa,
- 0x15, 0x62, 0x87, 0x70, 0x75, 0x86, 0x91, 0xf2, 0x06, 0xe7, 0xce, 0xd2,
- 0x5c, 0xc7, 0x54, 0x40, 0x78, 0xf0, 0xaa, 0xd6, 0xc2, 0x7b, 0x21, 0xa6,
- 0x6a, 0x85, 0x86, 0xb0, 0xe6, 0xdb, 0xf9, 0xaa, 0x7d, 0x45, 0x0f, 0xbe,
- 0x28, 0xbe, 0x18, 0xec, 0x68, 0x44, 0x00, 0x28, 0xd0, 0x15, 0xf7, 0x77,
- 0xc7, 0x64, 0x91, 0x3d, 0x70, 0x45, 0x4e, 0x16, 0xb9, 0xbe, 0xa8, 0x9a,
- 0x8b, 0x52, 0xb9, 0x05, 0x90, 0x31, 0x68, 0x55, 0xc6, 0x33, 0x2b, 0x91,
- 0x38, 0x20, 0xf2, 0x0e, 0xee, 0x18, 0x43, 0xad, 0x19, 0x67, 0x8a, 0x52,
- 0x71, 0x38, 0x72, 0x2a, 0xa4, 0x27, 0x01, 0xc7, 0x5a, 0x8a, 0x55, 0xf3,
- 0x6e, 0x02, 0xce, 0x80, 0xca, 0x86, 0x17, 0x2a, 0x54, 0xbe, 0xbc, 0xb7,
- 0x8a, 0xc8, 0x8a, 0x9f, 0x99, 0x38, 0x31, 0x70, 0xf8, 0xa8, 0xaa, 0x8c,
- 0xbb, 0x19, 0x4c, 0xae, 0xb2, 0x85, 0xb4, 0x74, 0xeb, 0xc0, 0x64, 0xe8,
- 0x04, 0x30, 0x68, 0xce, 0x89, 0xd3, 0x6c, 0x67, 0xf5, 0x6a, 0xb8, 0x28,
- 0xfe, 0x6e, 0xc8, 0x9c, 0xa2, 0x47, 0x6c, 0x70, 0x24, 0xcc, 0x5d, 0xbf,
- 0xe4, 0x7d, 0x41, 0xf0, 0x6c, 0x69, 0xad, 0x4a, 0x27, 0xbe, 0x2d, 0xb0,
- 0xa1, 0x80, 0xe9, 0x25, 0x47, 0x66, 0xc6, 0xc7, 0x1f, 0xde, 0xbf, 0x1d,
- 0xbd, 0x3f, 0x6f, 0x33, 0xf6, 0xf9, 0xd9, 0xbb, 0x8b, 0xe3, 0x57, 0x1f,
- 0xce, 0xdf, 0x9d, 0x5d, 0x9c, 0x1d, 0x9d, 0x9d, 0x26, 0xdb, 0x7b, 0x3b,
- 0x1b, 0x6b, 0x45, 0xad, 0x07, 0xc2, 0xc2, 0x30, 0x3b, 0x67, 0x2c, 0xcb,
- 0x2c, 0x3b, 0x8b, 0x6d, 0xac, 0x27, 0x1c, 0xed, 0x07, 0xe1, 0xae, 0x66,
- 0x76, 0x03, 0xbb, 0x22, 0xe8, 0x7a, 0x23, 0xb1, 0x9e, 0x26, 0x97, 0x6b,
- 0x3e, 0x29, 0x2e, 0xf7, 0x84, 0x81, 0xa7, 0x03, 0x85, 0x2b, 0xe3, 0xb0,
- 0xb7, 0x5f, 0x66, 0xb8, 0xd1, 0x1d, 0xf7, 0xa4, 0xad, 0xb3, 0x60, 0x0f,
- 0x48, 0x01, 0x73, 0x5c, 0x51, 0x6d, 0x66, 0x0b, 0xc6, 0x26, 0xa2, 0x96,
- 0x0e, 0xf6, 0x0d, 0xea, 0x77, 0x23, 0x91, 0x45, 0xaa, 0xcd, 0x67, 0x8d,
- 0xce, 0x5c, 0xa5, 0xe7, 0x61, 0xdf, 0x43, 0x79, 0xc5, 0xcc, 0x77, 0x29,
- 0xdd, 0xb7, 0x65, 0x22, 0x14, 0x88, 0xa6, 0xb6, 0x5e, 0x9c, 0x1d, 0x61,
- 0x1e, 0xc0, 0x6f, 0x3d, 0xa9, 0x4a, 0x35, 0x96, 0x21, 0x38, 0x31, 0xbd,
- 0x3c, 0xa3, 0xce, 0xcf, 0x37, 0xde, 0xa4, 0x30, 0x1c, 0x94, 0x32, 0x82,
- 0xc1, 0x8d, 0x48, 0xd8, 0x63, 0x0d, 0x5a, 0x32, 0xe0, 0x10, 0x9d, 0x48,
- 0x52, 0x5f, 0x14, 0xad, 0x6a, 0xe4, 0x2f, 0xe6, 0x1e, 0x46, 0x66, 0x22,
- 0x22, 0x8a, 0xd4, 0xc7, 0xde, 0xf7, 0x99, 0xa1, 0x25, 0x5c, 0xbb, 0xa1,
- 0x54, 0xe9, 0xeb, 0x26, 0xe8, 0xa7, 0xdf, 0x0b, 0x80, 0x2b, 0x51, 0x69,
- 0x22, 0x7d, 0x8b, 0xa2, 0xf5, 0xba, 0x35, 0xad, 0xb6, 0xf8, 0x79, 0x36,
- 0x7c, 0xfa, 0x64, 0xb8, 0x8f, 0x72, 0xcd, 0xb3, 0x39, 0xe2, 0x9b, 0xa2,
- 0x58, 0x90, 0x73, 0x99, 0x3e, 0x20, 0x78, 0x57, 0x94, 0x50, 0xe9, 0x68,
- 0x25, 0x23, 0xc6, 0x6c, 0x29, 0xad, 0x4d, 0xd7, 0x9b, 0x4c, 0x21, 0x42,
- 0xa4, 0x43, 0xbb, 0x34, 0x0a, 0x00, 0xc4, 0x90, 0xf9, 0xcc, 0xa1, 0xe4,
- 0x14, 0x4a, 0x96, 0x5d, 0x5b, 0xd6, 0x9e, 0xd8, 0x1e, 0xa6, 0x23, 0x94,
- 0x54, 0x10, 0xc6, 0x8d, 0x83, 0x1c, 0x21, 0x71, 0x2e, 0x29, 0x89, 0x8f,
- 0x1f, 0x0d, 0x1f, 0x25, 0xa3, 0x37, 0x5f, 0x0b, 0x3c, 0xf1, 0xd7, 0xa3,
- 0x88, 0x26, 0x40, 0xfa, 0xbc, 0xbe, 0x3e, 0xf4, 0x83, 0x8c, 0x58, 0x9c,
- 0x99, 0xdd, 0x1f, 0x53, 0x5b, 0xc0, 0xcb, 0x19, 0xa4, 0xde, 0x8a, 0x93,
- 0xc0, 0xc9, 0xa7, 0x24, 0xed, 0x7b, 0xa0, 0x20, 0xe6, 0xbc, 0x56, 0x59,
- 0x7c, 0xc9, 0xc3, 0xcd, 0xb8, 0x82, 0xfb, 0xc1, 0x41, 0xbb, 0xf7, 0x88,
- 0x39, 0x67, 0xf7, 0x7d, 0x87, 0x4c, 0x34, 0x25, 0xbd, 0x1d, 0xda, 0x77,
- 0xda, 0x79, 0xe3, 0x0c, 0x64, 0xa8, 0x46, 0xe4, 0xd4, 0xde, 0x6c, 0x46,
- 0xaa, 0x21, 0x15, 0x08, 0xf7, 0xe9, 0x97, 0x14, 0x69, 0xb6, 0x09, 0x88,
- 0x53, 0xce, 0x30, 0x8d, 0x42, 0x11, 0xa5, 0x6c, 0x73, 0x5b, 0x19, 0xa7,
- 0x88, 0x94, 0x5b, 0x86, 0xb0, 0xe8, 0xe7, 0x27, 0x55, 0xea, 0xf3, 0x3b,
- 0x0a, 0x43, 0xe6, 0xb7, 0x7c, 0xb6, 0xff, 0x9e, 0x95, 0x45, 0x98, 0xf8,
- 0x40, 0xca, 0x83, 0x82, 0x03, 0x1a, 0x95, 0xfb, 0xa5, 0x42, 0x17, 0xb9,
- 0x1f, 0xe2, 0xab, 0xc1, 0x99, 0xfb, 0x23, 0xb5, 0x92, 0x67, 0xbc, 0x7b,
- 0x56, 0x2a, 0x04, 0xb9, 0x86, 0x70, 0x38, 0x73, 0x0d, 0x56, 0x7b, 0x32,
- 0x60, 0x8e, 0x8a, 0xe6, 0x3b, 0x2e, 0x86, 0x0e, 0x4c, 0x4c, 0x52, 0xff,
- 0xa6, 0x30, 0x65, 0x5c, 0x29, 0x81, 0x0d, 0xaf, 0xa1, 0x6d, 0xa3, 0x03,
- 0x30, 0x14, 0x7d, 0x2e, 0x94, 0xe9, 0x83, 0x24, 0x79, 0x95, 0x2d, 0xef,
- 0x54, 0xa6, 0xbb, 0x3c, 0x44, 0x02, 0x21, 0xba, 0x66, 0x9f, 0x38, 0xbb,
- 0xb7, 0x19, 0xda, 0x8d, 0xb3, 0xab, 0xed, 0x14, 0xc3, 0x29, 0x35, 0xe7,
- 0x1c, 0x93, 0x5c, 0x5f, 0x58, 0x32, 0x48, 0xfe, 0x9b, 0x4f, 0x8b, 0x6d,
- 0xc2, 0xba, 0xd1, 0x50, 0x3b, 0x7d, 0x4f, 0x47, 0xdc, 0x48, 0x86, 0x1d,
- 0x8a, 0x6b, 0x92, 0x49, 0x57, 0xad, 0xc7, 0x7f, 0x15, 0xa8, 0x75, 0xb8,
- 0x16, 0x4a, 0x21, 0x83, 0x64, 0xad, 0x9a, 0x5d, 0x35, 0x0f, 0x70, 0xd8,
- 0xca, 0x48, 0x87, 0x65, 0x6c, 0x38, 0x4a, 0x02, 0xd0, 0x8e, 0x1d, 0x4d,
- 0x16, 0xa3, 0x29, 0x6d, 0xaa, 0x32, 0x3d, 0xfc, 0xac, 0x43, 0xc4, 0x0f,
- 0x66, 0x90, 0xa9, 0x9c, 0x0c, 0xd9, 0xba, 0x7c, 0x99, 0x96, 0x9c, 0x81,
- 0x6b, 0xf3, 0xc1, 0xf1, 0x78, 0xe7, 0x58, 0x2a, 0xa9, 0xab, 0xfe, 0x1f,
- 0xf1, 0x9f, 0x70, 0x0d, 0x0d, 0x96, 0x05, 0x99, 0x55, 0x90, 0xe0, 0x71,
- 0x12, 0x4b, 0xf4, 0x7a, 0xd7, 0x07, 0xbe, 0x70, 0xd7, 0xc0, 0xe6, 0xb1,
- 0x49, 0x8a, 0x3d, 0xe4, 0x03, 0xef, 0x97, 0x0a, 0x0c, 0xa9, 0xdc, 0xbd,
- 0xb2, 0x0d, 0x5b, 0xa4, 0xdc, 0xa6, 0x69, 0x08, 0x01, 0x51, 0x68, 0x25,
- 0x9d, 0x9c, 0xd2, 0x19, 0x52, 0xe5, 0xcb, 0xcc, 0x41, 0xc1, 0x63, 0x27,
- 0x19, 0x37, 0x4c, 0x1a, 0x56, 0x68, 0xe2, 0xf6, 0xaa, 0xa8, 0xb9, 0x75,
- 0x06, 0x72, 0xeb, 0xa1, 0xe9, 0x94, 0xf0, 0x11, 0x7a, 0x44, 0x56, 0x25,
- 0x19, 0xa3, 0xd9, 0xcd, 0xe7, 0x84, 0x03, 0x44, 0x0b, 0x25, 0xe9, 0x91,
- 0x23, 0xaf, 0x9e, 0x04, 0x93, 0xcf, 0x71, 0x76, 0x24, 0xb9, 0x9c, 0x5c,
- 0x70, 0x2f, 0xbd, 0x2e, 0xf2, 0x29, 0x64, 0x8f, 0x0e, 0xd7, 0xc2, 0x9e,
- 0xbe, 0x88, 0x77, 0x7e, 0x72, 0x19, 0x69, 0x62, 0x5f, 0xb9, 0xa4, 0xfd,
- 0xb4, 0x6a, 0xd4, 0x51, 0xe6, 0x8d, 0xf4, 0x7d, 0xca, 0x43, 0x4a, 0x19,
- 0xb7, 0xd2, 0xf0, 0xe4, 0x92, 0x63, 0x57, 0x62, 0x7c, 0xaa, 0xb8, 0xc5,
- 0x0c, 0x29, 0xa1, 0x74, 0x09, 0xab, 0x67, 0x62, 0x41, 0xdd, 0xda, 0xfd,
- 0x31, 0x7c, 0xd7, 0x92, 0xa7, 0x0b, 0xd8, 0x24, 0x6b, 0xa7, 0xe6, 0x0e,
- 0xef, 0xb9, 0x23, 0x6e, 0xef, 0x34, 0xad, 0x73, 0xa3, 0x0a, 0xb6, 0x22,
- 0x90, 0x04, 0x43, 0xe8, 0xbc, 0xa6, 0x0d, 0x6b, 0x65, 0x95, 0x6b, 0xb6,
- 0xb5, 0xf8, 0x6b, 0x16, 0x8b, 0x75, 0xd8, 0x8c, 0x57, 0xa2, 0x75, 0xd2,
- 0xa0, 0xa1, 0x76, 0x5d, 0x16, 0x49, 0x01, 0x12, 0x47, 0x0d, 0xf7, 0x0c,
- 0xf2, 0xda, 0x28, 0x21, 0x79, 0x1f, 0xf1, 0xbb, 0xb8, 0x1f, 0x71, 0xd7,
- 0x42, 0x64, 0x19, 0x86, 0x59, 0x4e, 0x07, 0x46, 0x08, 0xac, 0x36, 0xf8,
- 0xe1, 0x9c, 0xab, 0xaa, 0x91, 0x8f, 0xee, 0x83, 0xf2, 0xf0, 0x4f, 0x38,
- 0xed, 0x55, 0x68, 0x17, 0xd6, 0x73, 0x18, 0x4d, 0xe3, 0x20, 0x46, 0xc9,
- 0x58, 0x5e, 0x6d, 0xfb, 0x9e, 0xc5, 0xa2, 0x3a, 0x1b, 0x09, 0x31, 0x05,
- 0x89, 0x80, 0x4a, 0xb0, 0xae, 0x74, 0x55, 0xa6, 0x9d, 0x90, 0xed, 0x3d,
- 0x57, 0xaa, 0xd2, 0x88, 0x04, 0x40, 0xb0, 0x94, 0x4a, 0x06, 0xef, 0x4b,
- 0x6c, 0xca, 0x05, 0x74, 0x24, 0xd4, 0x3a, 0xe9, 0x49, 0x23, 0x4f, 0x52,
- 0x38, 0xc8, 0x97, 0x76, 0xf1, 0xdd, 0x8e, 0xf8, 0x82, 0x48, 0x4e, 0xd2,
- 0x87, 0x30, 0xb1, 0x7c, 0x23, 0x1e, 0x4c, 0xc7, 0x66, 0xc4, 0xa0, 0x90,
- 0xa6, 0xad, 0x24, 0x71, 0xfd, 0xf9, 0x24, 0x45, 0xe0, 0x36, 0x9e, 0x93,
- 0x3a, 0x92, 0xf3, 0x36, 0xd0, 0xa7, 0x20, 0xa7, 0x35, 0x1d, 0xd8, 0x73,
- 0x0e, 0x72, 0x53, 0xc3, 0xdb, 0xfa, 0x01, 0xe9, 0xda, 0x93, 0x94, 0x61,
- 0x90, 0x38, 0x67, 0x4b, 0xc7, 0x75, 0xff, 0xf4, 0x7f, 0x7b, 0xdb, 0x8f,
- 0x09, 0x69, 0xec, 0x55, 0xb7, 0x97, 0xa5, 0xf9, 0x99, 0x17, 0xe6, 0x44,
- 0x6f, 0x5a, 0x14, 0x3d, 0xf4, 0x6b, 0x16, 0x15, 0xac, 0x8a, 0x96, 0x41,
- 0xf4, 0x0e, 0xf6, 0x84, 0x3f, 0xb3, 0x21, 0x56, 0xd5, 0xb1, 0x04, 0x33,
- 0xe2, 0x86, 0xb6, 0xf6, 0xde, 0x32, 0xec, 0x83, 0xbf, 0x74, 0x25, 0xf7,
- 0x93, 0x91, 0x58, 0x03, 0x7f, 0xfe, 0xe5, 0x90, 0xdc, 0x80, 0xd3, 0x9f,
- 0x3b, 0xe7, 0x71, 0xdc, 0x97, 0xb9, 0x7c, 0x82, 0x69, 0xe4, 0xab, 0x2b,
- 0xe8, 0x96, 0x2f, 0x62, 0x85, 0x70, 0x1e, 0x21, 0xe4, 0xb1, 0xdf, 0xfe,
- 0xfb, 0xe5, 0xdc, 0xc1, 0x85, 0x6d, 0xf8, 0xbe, 0x3c, 0xf6, 0x9b, 0x7f,
- 0x9f, 0xcf, 0xee, 0xbd, 0x6e, 0x1f, 0x12, 0x54, 0xaf, 0xa4, 0xda, 0x20,
- 0x22, 0x13, 0x7f, 0xb5, 0x50, 0x94, 0x0a, 0x86, 0x50, 0x2a, 0xca, 0xc7,
- 0xf0, 0x6e, 0xd0, 0x4f, 0x4e, 0xc4, 0x22, 0x49, 0xc5, 0xdf, 0x44, 0x82,
- 0x91, 0x68, 0x0e, 0x89, 0x23, 0x9d, 0xd6, 0x5e, 0xf0, 0x7f, 0x77, 0xbf,
- 0x8a, 0xed, 0x91, 0x16, 0x46, 0xe1, 0x16, 0xd4, 0xd6, 0x6c, 0xd4, 0xeb,
- 0x8b, 0x21, 0x58, 0x44, 0xe3, 0xb5, 0x5d, 0xac, 0xfc, 0xde, 0x1f, 0xb4,
- 0xd0, 0x58, 0x43, 0x38, 0xa1, 0x90, 0xa6, 0x67, 0xdb, 0x9e, 0x05, 0x36,
- 0x67, 0x08, 0x8a, 0x47, 0xe6, 0x7d, 0xb1, 0xea, 0x6a, 0xec, 0xd9, 0x6e,
- 0xa9, 0xed, 0xe0, 0xa0, 0xbf, 0xed, 0x4b, 0x3f, 0x36, 0x33, 0x1a, 0xb8,
- 0x4a, 0x72, 0x93, 0x25, 0xf8, 0x21, 0xdb, 0x19, 0x82, 0x66, 0x71, 0xf5,
- 0x0d, 0x29, 0xa7, 0x9c, 0x8b, 0x8d, 0x15, 0x1e, 0x9d, 0xbd, 0x7d, 0x7b,
- 0x7c, 0xd4, 0x0e, 0x16, 0xda, 0x0a, 0x21, 0xa7, 0xea, 0x07, 0xbd, 0x80,
- 0xe9, 0xf3, 0xd4, 0x95, 0x45, 0xa2, 0x45, 0xfc, 0x7d, 0xea, 0x14, 0x98,
- 0x0a, 0xe0, 0x35, 0xff, 0x52, 0xca, 0xe5, 0x18, 0x0c, 0x59, 0x38, 0x20,
- 0x52, 0x7b, 0x19, 0xf0, 0xc3, 0xc4, 0x03, 0xd0, 0x22, 0x67, 0x1a, 0x30,
- 0x78, 0xb4, 0x62, 0x97, 0x4c, 0x58, 0x99, 0x05, 0x15, 0x3e, 0x4c, 0xa7,
- 0xbb, 0x52, 0x2c, 0xa0, 0xdf, 0xee, 0xe2, 0x65, 0x46, 0x4f, 0x44, 0x11,
- 0xd7, 0xa0, 0x98, 0x71, 0x87, 0x92, 0x45, 0x5a, 0x7e, 0x44, 0x38, 0xdb,
- 0x2b, 0x80, 0xa0, 0x72, 0x5e, 0x02, 0x72, 0x9f, 0x4e, 0x63, 0x08, 0x1f,
- 0xe4, 0x75, 0xd7, 0xb2, 0x15, 0x07, 0x12, 0xaa, 0xad, 0x7c, 0x0f, 0xb5,
- 0xce, 0x16, 0xaf, 0x2f, 0xb3, 0x1b, 0x7c, 0x86, 0x61, 0x8d, 0x80, 0xd4,
- 0x11, 0x76, 0xf2, 0x61, 0x34, 0x7e, 0x8e, 0x2a, 0xdc, 0x09, 0x42, 0x08,
- 0xb6, 0x6a, 0xc1, 0x9d, 0x72, 0x08, 0xdf, 0x1c, 0x1d, 0x2d, 0xb9, 0x46,
- 0x2b, 0xa0, 0xd5, 0xb7, 0x82, 0x50, 0xda, 0x0a, 0xa8, 0x05, 0x79, 0xc8,
- 0x52, 0xc0, 0x66, 0x61, 0x4b, 0xa9, 0x88, 0xb6, 0x0b, 0xe5, 0xc9, 0x41,
- 0x0d, 0x92, 0x07, 0xbd, 0x6a, 0x0c, 0xa1, 0xbb, 0x9b, 0x76, 0x44, 0xfe,
- 0x46, 0x68, 0x39, 0x40, 0x67, 0x05, 0x9f, 0x30, 0x42, 0xec, 0x49, 0x1b,
- 0x3e, 0x9b, 0x60, 0x9f, 0xc9, 0x49, 0x0a, 0x48, 0xc9, 0x4b, 0x2a, 0x42,
- 0xc1, 0xc3, 0x74, 0x58, 0x03, 0x35, 0x17, 0x02, 0x95, 0xca, 0x34, 0xa5,
- 0xb6, 0x98, 0x63, 0x98, 0x86, 0xba, 0xd8, 0x07, 0xa1, 0xbd, 0x42, 0x44,
- 0x71, 0x14, 0x42, 0x0e, 0xb0, 0xf9, 0xef, 0x6a, 0x5d, 0x07, 0x81, 0x44,
- 0x80, 0xe5, 0x31, 0x52, 0xca, 0x57, 0x83, 0xb0, 0xbb, 0x62, 0x3a, 0xf5,
- 0xf7, 0x94, 0x04, 0x38, 0x99, 0xfd, 0x55, 0x3d, 0xcd, 0x3b, 0xc0, 0x4c,
- 0x6d, 0x81, 0x1b, 0xe1, 0xe5, 0x21, 0xb2, 0x10, 0xb1, 0x6a, 0x88, 0x62,
- 0x8e, 0x55, 0x77, 0xc9, 0xaf, 0xd0, 0xe6, 0x05, 0xfb, 0x8a, 0x8a, 0x88,
- 0x4d, 0x98, 0x48, 0x84, 0x39, 0xd0, 0x92, 0x7e, 0xc6, 0xca, 0x81, 0x63,
- 0x2b, 0xeb, 0xba, 0x94, 0x3e, 0x32, 0x02, 0x2f, 0x3f, 0xf4, 0xdb, 0xdf,
- 0x4c, 0x1f, 0xb3, 0xbb, 0x07, 0xe9, 0x28, 0xf6, 0xb9, 0x4f, 0x31, 0x83,
- 0xe4, 0x85, 0xf9, 0x63, 0xe3, 0xb7, 0x1f, 0xfe, 0xd9, 0x00, 0x39, 0xf4,
- 0x61, 0xb7, 0xae, 0x43, 0xc5, 0x75, 0xb0, 0xb8, 0x41, 0xd9, 0xf0, 0x4d,
- 0x58, 0x54, 0xd9, 0xb8, 0x91, 0x37, 0xde, 0xc1, 0xae, 0xaa, 0xd0, 0xbf,
- 0x86, 0x23, 0x01, 0xfb, 0x18, 0x42, 0xaf, 0x84, 0xa0, 0x1e, 0x76, 0x25,
- 0xdf, 0x7b, 0x05, 0x37, 0x8a, 0xb2, 0xdb, 0x79, 0x56, 0xb6, 0x28, 0xf3,
- 0x81, 0x84, 0x8b, 0x94, 0x21, 0x27, 0xff, 0x45, 0x75, 0x85, 0x2a, 0x41,
- 0x1b, 0xca, 0x0a, 0x7d, 0xa5, 0x41, 0x84, 0x87, 0xdc, 0x4a, 0x01, 0x49,
- 0xda, 0x95, 0x9d, 0x0d, 0x42, 0x85, 0x54, 0xd8, 0x94, 0xf5, 0xee, 0xd8,
- 0x93, 0x9e, 0xfa, 0xcd, 0x8f, 0xc5, 0xc3, 0x53, 0xb6, 0x9b, 0x1b, 0xb3,
- 0x31, 0x5f, 0x9b, 0xf3, 0x81, 0x05, 0x76, 0xbf, 0x33, 0x65, 0xbb, 0x9d,
- 0xb3, 0xed, 0x79, 0x25, 0x22, 0x49, 0xdb, 0x34, 0xda, 0xff, 0x85, 0x29,
- 0xdb, 0x7e, 0xc6, 0x76, 0x4a, 0xf9, 0xda, 0x91, 0x74, 0x6d, 0x21, 0xb4,
- 0xe4, 0x6b, 0x72, 0xc6, 0xf6, 0xc6, 0x94, 0x6d, 0x3f, 0x67, 0x7b, 0x53,
- 0xd2, 0x36, 0x41, 0x0c, 0x6c, 0x48, 0xd9, 0xfe, 0x75, 0x19, 0xdb, 0x5d,
- 0x29, 0xdb, 0xbf, 0x3c, 0x67, 0xfb, 0xb7, 0x4d, 0xd9, 0xfe, 0x2d, 0xb3,
- 0x91, 0xe9, 0xf4, 0x60, 0x47, 0xf2, 0x89, 0x14, 0x9d, 0xbd, 0xb8, 0x0f,
- 0x20, 0xba, 0x99, 0xc0, 0xe2, 0x85, 0x99, 0x65, 0x18, 0xd6, 0x68, 0x3c,
- 0xc5, 0x3d, 0xac, 0x1b, 0x12, 0x5e, 0x89, 0x64, 0xc0, 0xf9, 0x71, 0xe0,
- 0x83, 0xd8, 0x49, 0xaf, 0xaa, 0x39, 0x77, 0x33, 0x44, 0x05, 0x79, 0x60,
- 0x25, 0x3a, 0x39, 0xd3, 0x7a, 0xee, 0xb7, 0x17, 0x39, 0xf5, 0xbc, 0xda,
- 0x3b, 0x70, 0xb6, 0xba, 0xfc, 0x65, 0x8d, 0xb2, 0xe6, 0x98, 0xdd, 0x2e,
- 0x05, 0x23, 0x23, 0x91, 0x32, 0x8a, 0x59, 0xc3, 0xaf, 0x91, 0x97, 0x34,
- 0xb3, 0x2d, 0x5d, 0x6d, 0x48, 0xc2, 0x76, 0x7d, 0x0f, 0x8a, 0x61, 0x08,
- 0xce, 0xc0, 0x5f, 0x07, 0xdd, 0x21, 0x28, 0x7b, 0x51, 0xa1, 0x5d, 0xd1,
- 0x29, 0xdc, 0x1b, 0x1e, 0x50, 0xae, 0xad, 0x0d, 0xe9, 0xc8, 0x3c, 0x03,
- 0x7c, 0x31, 0xfa, 0x3e, 0xe3, 0xbb, 0xbb, 0x1c, 0x34, 0xee, 0x40, 0xa7,
- 0xef, 0x0c, 0x93, 0x77, 0x50, 0x1f, 0x8d, 0xb2, 0x6e, 0x66, 0x24, 0x83,
- 0xcb, 0xef, 0x62, 0xc3, 0x35, 0x21, 0x85, 0x0d, 0xff, 0xbc, 0x7f, 0x77,
- 0x1a, 0xc6, 0xa7, 0x29, 0x7a, 0x70, 0xb8, 0xbb, 0x4b, 0x19, 0x52, 0x57,
- 0xe9, 0xed, 0xed, 0xb0, 0xca, 0x76, 0xa7, 0xc5, 0xa4, 0xda, 0xc5, 0x0e,
- 0xea, 0x97, 0xaf, 0xea, 0xc5, 0xfc, 0xb3, 0xcd, 0xa0, 0xe5, 0x52, 0x3e,
- 0x2d, 0xa8, 0xed, 0x5e, 0xe6, 0x25, 0x5b, 0x5b, 0xd0, 0x63, 0xd9, 0xa9,
- 0xaf, 0x72, 0x3f, 0xc0, 0x1b, 0xa3, 0xaa, 0x02, 0xb3, 0x28, 0xf3, 0x7f,
- 0xd4, 0x3f, 0x07, 0x41, 0xa5, 0x48, 0xfd, 0xb9, 0xdf, 0x6a, 0xdb, 0xab,
- 0x21, 0x08, 0x37, 0x88, 0xed, 0x00, 0x20, 0x04, 0x67, 0x35, 0x89, 0xb0,
- 0x26, 0xcd, 0x94, 0xe8, 0x8d, 0xf6, 0xc7, 0x96, 0xbd, 0xc2, 0x26, 0x7c,
- 0xc4, 0x67, 0x1d, 0x6d, 0xaf, 0x7f, 0x73, 0x91, 0x60, 0xb8, 0x1b, 0xb7,
- 0xfc, 0x43, 0x94, 0x5d, 0xff, 0xd1, 0x4f, 0x71, 0xca, 0x6c, 0x42, 0xde,
- 0x0b, 0xce, 0xb6, 0xdb, 0x38, 0x13, 0xfb, 0xf0, 0xa7, 0x98, 0x09, 0x61,
- 0x2d, 0x44, 0xe5, 0x63, 0x63, 0x0e, 0xf4, 0xd8, 0xa7, 0xf8, 0xfe, 0xf5,
- 0x5e, 0xd7, 0x67, 0xf7, 0xfa, 0xfc, 0xe9, 0xeb, 0xbd, 0xdf, 0xf0, 0xc3,
- 0xef, 0xad, 0xb3, 0x8a, 0xa1, 0x29, 0x5e, 0xe0, 0xcf, 0x43, 0xa5, 0x70,
- 0x57, 0xaf, 0xc0, 0x16, 0x32, 0x46, 0x33, 0xa5, 0x92, 0xe5, 0x9b, 0xbb,
- 0x1b, 0x36, 0x43, 0xc0, 0x74, 0x61, 0xbc, 0x30, 0xc2, 0x97, 0xe0, 0xb3,
- 0x53, 0xeb, 0x8c, 0x81, 0xe2, 0x3b, 0x32, 0x1e, 0x0e, 0x03, 0x14, 0x31,
- 0xdc, 0x8c, 0xe2, 0x65, 0x19, 0x43, 0x21, 0x7e, 0x0d, 0x71, 0x6b, 0x02,
- 0xd2, 0x99, 0x5b, 0x8a, 0x79, 0xad, 0x2e, 0xa3, 0xa0, 0x8f, 0x13, 0x77,
- 0xf9, 0x8e, 0x38, 0xb6, 0x3a, 0x16, 0x4e, 0x5a, 0x08, 0xc9, 0x6c, 0x1f,
- 0x57, 0x6a, 0x6c, 0xfd, 0x68, 0xb1, 0x4e, 0x17, 0xa2, 0x06, 0x7a, 0x19,
- 0x9d, 0xde, 0x11, 0x3f, 0x4c, 0x7a, 0x83, 0xf7, 0xc9, 0x61, 0x2f, 0x20,
- 0xd1, 0xd9, 0x52, 0x3a, 0xf8, 0x90, 0xc7, 0xab, 0x24, 0x80, 0x02, 0x6a,
- 0x09, 0xe6, 0x6b, 0x26, 0x57, 0x80, 0x9f, 0x72, 0xe6, 0x84, 0xed, 0x7e,
- 0x71, 0x19, 0x04, 0xe1, 0x16, 0xda, 0x9d, 0xd8, 0x36, 0xac, 0xc2, 0x45,
- 0x02, 0xa7, 0x8d, 0x83, 0xb2, 0x27, 0xed, 0x89, 0x9b, 0x71, 0x40, 0xb4,
- 0x22, 0x98, 0x88, 0x60, 0x26, 0xaa, 0xf1, 0x43, 0xe8, 0x48, 0x8a, 0xd9,
- 0x56, 0x5a, 0x4a, 0xb7, 0x2a, 0xaa, 0x2a, 0x1f, 0x03, 0xb5, 0x5a, 0x44,
- 0x64, 0x95, 0x71, 0x3e, 0x15, 0x97, 0x5e, 0x83, 0x9a, 0x0d, 0x58, 0x86,
- 0x36, 0x89, 0x68, 0xa5, 0x82, 0x06, 0x21, 0xce, 0x25, 0x33, 0x3b, 0x16,
- 0x6c, 0xd7, 0x39, 0x86, 0x66, 0x6e, 0x4b, 0x93, 0x71, 0x99, 0x67, 0x33,
- 0xa4, 0x3a, 0x32, 0x3a, 0x18, 0x2b, 0x5e, 0x6d, 0x21, 0x3b, 0x07, 0xbe,
- 0x0a, 0x92, 0x74, 0x90, 0x69, 0x5b, 0x01, 0x42, 0x94, 0xd2, 0xaf, 0x29,
- 0xf7, 0xd1, 0xe5, 0x76, 0x97, 0x19, 0x32, 0x07, 0xb4, 0xf9, 0xad, 0x2a,
- 0xf5, 0x9d, 0x39, 0xa9, 0xa5, 0x45, 0x5a, 0xa7, 0x6a, 0x07, 0x42, 0x78,
- 0xb2, 0x20, 0x33, 0xf8, 0x22, 0x75, 0xe6, 0xd4, 0xf4, 0x5d, 0x07, 0xa9,
- 0x30, 0xfc, 0x64, 0x32, 0xde, 0xf3, 0x42, 0xff, 0x82, 0x3a, 0x80, 0x66,
- 0xe3, 0xb6, 0x4d, 0x59, 0xf1, 0x5e, 0x66, 0x74, 0x00, 0x89, 0x13, 0x4f,
- 0x87, 0x9f, 0xa1, 0xc3, 0x41, 0xf2, 0xb6, 0xad, 0xe5, 0x44, 0x12, 0xcb,
- 0x91, 0x40, 0xc7, 0xf9, 0x6a, 0x76, 0x75, 0x35, 0xa1, 0x3e, 0x50, 0x29,
- 0xbf, 0x1f, 0x18, 0x7e, 0x1f, 0x5c, 0xf1, 0x2e, 0x5d, 0xbe, 0x3b, 0x41,
- 0xde, 0xcb, 0x8f, 0xa7, 0x82, 0x10, 0xf6, 0x91, 0xa7, 0x98, 0x41, 0x78,
- 0x27, 0x03, 0x12, 0x9e, 0x73, 0xe3, 0x35, 0x35, 0xde, 0xcf, 0x8c, 0x37,
- 0x3a, 0x9f, 0x17, 0xab, 0x77, 0x18, 0xae, 0x70, 0xb0, 0xc6, 0xa3, 0xc4,
- 0x74, 0x42, 0xa9, 0x9b, 0xc7, 0xb3, 0xa0, 0x27, 0xa7, 0x2f, 0xcb, 0x75,
- 0xa8, 0xeb, 0x3c, 0xb5, 0x0a, 0x94, 0xfb, 0x10, 0xd3, 0x93, 0x51, 0x9e,
- 0x04, 0xe5, 0xa0, 0x2b, 0x0e, 0x47, 0x87, 0x23, 0x56, 0xd9, 0xf9, 0x76,
- 0x34, 0x0a, 0x53, 0xe4, 0x97, 0xc6, 0x38, 0x29, 0x2e, 0x97, 0xf9, 0xdf,
- 0xb3, 0xa9, 0x04, 0x2d, 0xdb, 0xe9, 0xad, 0x8d, 0x22, 0x85, 0xc4, 0x0b,
- 0xc8, 0x23, 0x51, 0x22, 0x94, 0x6f, 0x8c, 0xeb, 0x87, 0x5b, 0x07, 0xe9,
- 0x60, 0x80, 0x23, 0xb3, 0x99, 0x80, 0x08, 0x32, 0x48, 0x0b, 0x6d, 0xb6,
- 0xc5, 0x6c, 0xee, 0x2c, 0x7f, 0x38, 0xd8, 0x5c, 0xe5, 0x0a, 0x81, 0x10,
- 0xea, 0xc0, 0xeb, 0xca, 0x92, 0x5f, 0x51, 0x54, 0x40, 0x6d, 0x2e, 0x7f,
- 0x79, 0x49, 0x41, 0x1c, 0x4b, 0x2b, 0xbb, 0x65, 0x01, 0xda, 0x81, 0x56,
- 0x68, 0x51, 0xd6, 0xb3, 0x3a, 0xda, 0x55, 0x87, 0x69, 0xcc, 0x17, 0xe9,
- 0x83, 0x30, 0x0b, 0x55, 0xf9, 0x4c, 0xc3, 0xb3, 0xd5, 0xc6, 0x2b, 0xb4,
- 0x81, 0x8e, 0x07, 0x00, 0x15, 0xc2, 0x8d, 0xaf, 0x3d, 0x02, 0xc4, 0x9f,
- 0x4e, 0x7d, 0x73, 0x18, 0x7f, 0x21, 0x63, 0x74, 0x41, 0x5b, 0x09, 0x24,
- 0x36, 0x4a, 0xae, 0x68, 0xae, 0x01, 0xba, 0x5d, 0x2a, 0xba, 0x3b, 0xb9,
- 0x97, 0xa5, 0x1a, 0x0c, 0x3c, 0x65, 0xa6, 0x81, 0x01, 0xd0, 0x2b, 0x90,
- 0xea, 0xaa, 0xd4, 0x75, 0x6f, 0x7e, 0x8d, 0x4a, 0x2d, 0xe5, 0x8a, 0x36,
- 0x6b, 0xb9, 0x7e, 0x0d, 0x76, 0x8a, 0x9c, 0x22, 0x22, 0x3e, 0x7e, 0xdb,
- 0x85, 0xb0, 0x79, 0x8b, 0x31, 0xa0, 0x6c, 0xc0, 0x5a, 0x82, 0x17, 0x44,
- 0x5a, 0xc0, 0xda, 0xd8, 0x64, 0x40, 0x72, 0xe6, 0xb2, 0x22, 0xcb, 0x2b,
- 0x7d, 0x48, 0x1f, 0x16, 0xb9, 0xe2, 0xa9, 0x1b, 0xac, 0x54, 0xca, 0xb6,
- 0x17, 0x7b, 0x27, 0x83, 0x74, 0xe8, 0xf2, 0x9f, 0xa0, 0x12, 0xe5, 0x57,
- 0x95, 0xa2, 0x7c, 0xda, 0x4a, 0x14, 0x77, 0x53, 0xe0, 0xd6, 0x09, 0xef,
- 0x09, 0x8a, 0x12, 0xc2, 0x25, 0xc3, 0x69, 0x50, 0x37, 0xa9, 0xed, 0x23,
- 0xc4, 0xaf, 0xb5, 0x86, 0x8b, 0x1f, 0xa6, 0x7e, 0xd2, 0xc8, 0x92, 0xcd,
- 0x02, 0x19, 0xb9, 0x2d, 0x52, 0x63, 0xa7, 0x03, 0x7e, 0x29, 0x43, 0xc9,
- 0xf8, 0x34, 0x13, 0x98, 0xb5, 0x3f, 0xba, 0x3e, 0x3e, 0x9f, 0xda, 0x00,
- 0xdb, 0x33, 0xb2, 0xf9, 0x85, 0x77, 0x1f, 0x7f, 0x79, 0xef, 0x85, 0x4c,
- 0xe7, 0x0c, 0xaf, 0x39, 0x38, 0x53, 0x4f, 0xde, 0xd9, 0x2e, 0xc3, 0xb0,
- 0x83, 0x43, 0x10, 0x56, 0x3b, 0x8c, 0x08, 0x3b, 0x2b, 0xde, 0x90, 0x19,
- 0x87, 0xf7, 0x3b, 0x04, 0x5c, 0xa6, 0x71, 0x57, 0x35, 0x89, 0x8d, 0x44,
- 0x1f, 0x67, 0xf5, 0x4d, 0x96, 0x89, 0xcd, 0xaf, 0x84, 0xf4, 0xa4, 0x80,
- 0x90, 0xa8, 0x33, 0xdf, 0xa5, 0xcf, 0x69, 0x70, 0x10, 0x28, 0x8c, 0xc8,
- 0x6c, 0xfd, 0x22, 0x1a, 0xd3, 0x0d, 0x4e, 0x5f, 0x12, 0x6b, 0xcc, 0xe5,
- 0x42, 0xd4, 0x0d, 0xda, 0x68, 0x2e, 0x6e, 0xa3, 0x62, 0x48, 0xd3, 0x96,
- 0xe4, 0x41, 0xdf, 0xc7, 0x6f, 0x8f, 0xb1, 0x1c, 0xdb, 0x28, 0x60, 0x05,
- 0x02, 0x63, 0xf4, 0xae, 0xcc, 0x47, 0xf7, 0xdf, 0x53, 0xb5, 0x22, 0xd8,
- 0x49, 0x88, 0xcb, 0xc5, 0x42, 0xc3, 0x5d, 0x42, 0x86, 0x3d, 0x39, 0xf2,
- 0xdb, 0x74, 0x65, 0x7e, 0x86, 0x90, 0x20, 0xa1, 0x03, 0x4f, 0xb3, 0x24,
- 0x96, 0x97, 0x40, 0x0c, 0xe0, 0x4f, 0xac, 0x15, 0x16, 0xa7, 0xfd, 0x09,
- 0x31, 0xdf, 0xc5, 0x38, 0x8b, 0x35, 0x2b, 0xaa, 0x04, 0x51, 0x4b, 0xbd,
- 0x53, 0x1a, 0x24, 0x97, 0x60, 0x8b, 0x7f, 0xb9, 0x0a, 0x36, 0xfc, 0x92,
- 0x37, 0xb0, 0x0e, 0x81, 0xe4, 0x1b, 0x8b, 0x2c, 0x86, 0x91, 0x96, 0xa5,
- 0xa4, 0xe9, 0x50, 0x45, 0x56, 0x30, 0x7f, 0xc9, 0xe2, 0xd3, 0x0e, 0x96,
- 0xce, 0xd5, 0x63, 0x3b, 0x52, 0x87, 0x9d, 0x89, 0x01, 0xca, 0xa5, 0x2f,
- 0x08, 0xa0, 0xb5, 0x8c, 0x6f, 0x1b, 0xfd, 0x76, 0x45, 0x26, 0x63, 0x39,
- 0x1c, 0x8d, 0x53, 0x2b, 0xb1, 0x87, 0x48, 0x6c, 0x6e, 0x7b, 0x84, 0xba,
- 0x88, 0xd1, 0xd1, 0xf9, 0x4e, 0x72, 0xde, 0x42, 0x82, 0xa1, 0xa2, 0x24,
- 0x5c, 0xa6, 0xbe, 0x1c, 0x96, 0xce, 0x8a, 0x8c, 0x58, 0xda, 0x8d, 0x1a,
- 0x92, 0xcb, 0x11, 0xb3, 0xb8, 0xbc, 0x14, 0xfa, 0xfd, 0xcd, 0x05, 0x53,
- 0x6b, 0x2d, 0x2f, 0xa9, 0x48, 0x83, 0x41, 0x41, 0xc4, 0xa4, 0xf4, 0x8f,
- 0xa9, 0xb1, 0xa0, 0x0b, 0x94, 0xda, 0x71, 0x2b, 0x33, 0x71, 0xca, 0x2b,
- 0xfe, 0xc9, 0x3c, 0x48, 0x75, 0x24, 0x42, 0x68, 0xd6, 0xb9, 0x87, 0x7e,
- 0x24, 0x3d, 0x45, 0x2b, 0xbe, 0x95, 0x5a, 0xad, 0x28, 0x49, 0x86, 0x5d,
- 0x66, 0xcb, 0x2c, 0x86, 0x10, 0x76, 0x47, 0x17, 0xb9, 0xb0, 0xf4, 0x74,
- 0xd8, 0x86, 0xe2, 0xf7, 0x82, 0x06, 0x32, 0x39, 0xbf, 0x4f, 0x67, 0x07,
- 0x5e, 0x2a, 0xeb, 0x78, 0x68, 0x29, 0x0a, 0x89, 0x08, 0x54, 0x7d, 0x32,
- 0x09, 0x26, 0xc5, 0xea, 0x0e, 0xc4, 0x30, 0x8f, 0x55, 0xd5, 0xd5, 0xbe,
- 0x91, 0x1b, 0xfb, 0xc3, 0xcf, 0xb9, 0xcf, 0xe1, 0x95, 0xb9, 0xac, 0x23,
- 0xe0, 0xca, 0x9c, 0x3e, 0x22, 0xbd, 0x87, 0x5b, 0xe3, 0x89, 0x16, 0x3e,
- 0x74, 0x8a, 0xff, 0xe0, 0xdf, 0xc1, 0x69, 0x84, 0x57, 0xd9, 0xde, 0x05,
- 0x30, 0x54, 0x02, 0xb6, 0x82, 0x4b, 0x19, 0xbd, 0xad, 0x28, 0xd3, 0x60,
- 0x9c, 0xd7, 0xd4, 0xa1, 0x42, 0xad, 0xc8, 0xe6, 0xd1, 0xa4, 0x6e, 0x72,
- 0x25, 0xbd, 0x15, 0xad, 0x89, 0x1f, 0x26, 0xff, 0x4e, 0xd0, 0x98, 0xf2,
- 0x36, 0x97, 0x65, 0x50, 0x32, 0xc4, 0xd7, 0xc7, 0xaf, 0xcf, 0xde, 0x1d,
- 0x37, 0xcb, 0x15, 0x6b, 0xee, 0xa4, 0x47, 0xc1, 0xfe, 0xf6, 0xec, 0x18,
- 0x6d, 0xd0, 0x6f, 0xd3, 0x9c, 0x2f, 0x73, 0xd8, 0xfd, 0xc9, 0xf9, 0x0f,
- 0xaf, 0xec, 0xec, 0xa0, 0x25, 0x2c, 0xb9, 0xe1, 0x99, 0x0c, 0xda, 0x67,
- 0x4a, 0xb7, 0xaf, 0x76, 0x68, 0x01, 0x3b, 0x43, 0x88, 0x03, 0x4e, 0x64,
- 0xd0, 0xf9, 0x51, 0x8a, 0x05, 0x27, 0xc6, 0x68, 0xa9, 0x3e, 0x21, 0xe2,
- 0x57, 0x15, 0x4a, 0xef, 0xed, 0xa0, 0x81, 0xde, 0xcb, 0xd6, 0x11, 0x03,
- 0x4e, 0x71, 0x6a, 0x71, 0x9a, 0x10, 0xaa, 0x1f, 0x80, 0xfe, 0x86, 0x49,
- 0xf8, 0x21, 0x4d, 0x0a, 0xa1, 0xaf, 0xc4, 0x04, 0xf6, 0x15, 0xb2, 0xb4,
- 0x29, 0x10, 0xc2, 0xb7, 0x1d, 0x1c, 0x2e, 0xd4, 0x76, 0x5d, 0xbb, 0xc8,
- 0xf5, 0x19, 0x81, 0x51, 0xc2, 0x3d, 0x3e, 0x21, 0x23, 0x11, 0x72, 0xf3,
- 0xcd, 0xed, 0x0a, 0x85, 0x0e, 0xde, 0x54, 0xed, 0x6f, 0x12, 0xb5, 0xa0,
- 0xb7, 0xfe, 0xb8, 0xe5, 0x6a, 0x42, 0xb8, 0x1b, 0x66, 0xbc, 0x7b, 0xac,
- 0x6b, 0x26, 0xb8, 0x73, 0x5f, 0xfe, 0x96, 0xae, 0xb8, 0xab, 0x1e, 0x5b,
- 0x42, 0x77, 0x92, 0xd2, 0x43, 0x4d, 0x7d, 0xd7, 0x8c, 0x3a, 0x4b, 0x82,
- 0x43, 0x2e, 0x53, 0x1d, 0xa5, 0x6f, 0x61, 0xd9, 0x43, 0xe7, 0x5e, 0xe9,
- 0x77, 0x7c, 0x53, 0x81, 0x43, 0x01, 0x33, 0xed, 0x43, 0x40, 0xa1, 0x08,
- 0xee, 0xdb, 0x76, 0xb7, 0xac, 0x71, 0x50, 0x59, 0xa6, 0x4c, 0x8a, 0x32,
- 0x5a, 0x00, 0x06, 0x46, 0x72, 0xac, 0x5b, 0x11, 0xd2, 0xc4, 0xf3, 0x27,
- 0xcf, 0x71, 0xb5, 0x53, 0x86, 0x92, 0x61, 0x2d, 0x3c, 0x22, 0x68, 0xdd,
- 0x14, 0x3d, 0xa5, 0x49, 0x87, 0xd8, 0xd8, 0xfe, 0x1a, 0xb4, 0x29, 0xfa,
- 0x38, 0x9b, 0x73, 0x53, 0xbf, 0x91, 0x37, 0x48, 0x08, 0xa6, 0xb4, 0x61,
- 0xc3, 0x00, 0xe3, 0x67, 0xd8, 0x27, 0xaf, 0x3e, 0x26, 0xdb, 0xff, 0xb2,
- 0xc3, 0x08, 0x24, 0x9a, 0x96, 0x03, 0xdf, 0x6c, 0xbe, 0x5c, 0x07, 0x9c,
- 0x0f, 0xe7, 0x5c, 0xde, 0x20, 0x2a, 0xd1, 0x9c, 0xd6, 0x37, 0x8e, 0xd5,
- 0xe4, 0x55, 0x75, 0xb1, 0x82, 0xce, 0xc6, 0x08, 0x0a, 0x91, 0x1e, 0xcc,
- 0x66, 0xbb, 0x36, 0xda, 0xa9, 0xdd, 0x65, 0x0b, 0xe1, 0x8d, 0x48, 0x42,
- 0x88, 0x30, 0xce, 0xc5, 0xe1, 0xaa, 0xda, 0xd5, 0x30, 0x79, 0xbf, 0xa4,
- 0x44, 0x3c, 0xe1, 0x3b, 0xb9, 0x27, 0xf2, 0xa5, 0x59, 0xbf, 0xe1, 0x69,
- 0x73, 0x53, 0x44, 0x84, 0xd0, 0xdf, 0x9a, 0xc2, 0x47, 0x84, 0x64, 0x2b,
- 0x40, 0x4a, 0x87, 0x56, 0x7b, 0xd4, 0xa9, 0xd8, 0x4a, 0x92, 0xd7, 0x61,
- 0xb7, 0x4a, 0xee, 0xb6, 0x07, 0x56, 0x37, 0xcb, 0xa1, 0xb1, 0x11, 0x02,
- 0xcf, 0xe6, 0xf3, 0x01, 0x43, 0xe2, 0x03, 0x22, 0x1c, 0xca, 0x3d, 0x57,
- 0x49, 0x53, 0x02, 0x9b, 0x6f, 0xf8, 0x04, 0x37, 0x0b, 0x15, 0x7b, 0x13,
- 0x92, 0xac, 0xc2, 0x8d, 0x48, 0x29, 0x96, 0x06, 0xd6, 0x50, 0xb9, 0xe7,
- 0x9c, 0x21, 0x44, 0x1c, 0x5e, 0x52, 0x57, 0x7f, 0xb9, 0x10, 0x2e, 0x76,
- 0x72, 0x75, 0x59, 0xae, 0xb8, 0xc7, 0x65, 0xac, 0x01, 0xa7, 0xaf, 0x75,
- 0xf3, 0xa3, 0xca, 0x14, 0x55, 0x56, 0xf3, 0x64, 0xf8, 0xdd, 0x93, 0x57,
- 0x7a, 0x14, 0xad, 0x92, 0x01, 0xd3, 0x2f, 0x3e, 0x9c, 0x7d, 0x8c, 0xce,
- 0xa3, 0xbb, 0x35, 0xec, 0x50, 0xce, 0xc4, 0x18, 0xdf, 0x69, 0x15, 0x06,
- 0x7e, 0x17, 0x1f, 0x4e, 0x46, 0x61, 0x55, 0x95, 0xc7, 0xd0, 0x81, 0x89,
- 0x55, 0x8c, 0x25, 0x9a, 0xa3, 0x5d, 0x19, 0x98, 0xe1, 0x32, 0x2b, 0xed,
- 0x67, 0xc2, 0x24, 0xc9, 0xab, 0x45, 0x31, 0x45, 0x4d, 0x57, 0x76, 0x3f,
- 0x2d, 0xf0, 0xa4, 0x3b, 0x6f, 0x52, 0x0e, 0x57, 0x59, 0xa8, 0x5b, 0xae,
- 0xd8, 0x43, 0xe3, 0x82, 0xba, 0x12, 0xca, 0xc4, 0x87, 0x73, 0x4b, 0xd5,
- 0x9e, 0xb3, 0xf2, 0xa6, 0xbf, 0x84, 0x65, 0x52, 0x4c, 0x6a, 0x6f, 0x05,
- 0x78, 0x20, 0x3e, 0x1c, 0x0b, 0xd6, 0xc8, 0xca, 0x50, 0x20, 0x45, 0x16,
- 0xe5, 0xe6, 0x95, 0xf1, 0x83, 0xc1, 0x26, 0x9b, 0x1f, 0x3a, 0x4c, 0xe0,
- 0xc6, 0x0e, 0x77, 0xaf, 0x2c, 0xb6, 0xc3, 0x34, 0x83, 0xf6, 0x06, 0x33,
- 0x82, 0x3c, 0x7e, 0x43, 0x8f, 0x0f, 0xe2, 0xc3, 0xd9, 0x1d, 0x16, 0xcc,
- 0xf2, 0x0d, 0x1b, 0x2c, 0x5f, 0x09, 0xa8, 0x30, 0x5f, 0x1a, 0xf5, 0x6e,
- 0x5d, 0x4e, 0xb2, 0x0f, 0xdc, 0xfc, 0x39, 0x2d, 0x2f, 0xb3, 0xfa, 0xc3,
- 0x66, 0x82, 0xcc, 0x05, 0x4d, 0xe1, 0x6e, 0x41, 0x4d, 0xe3, 0xad, 0xb0,
- 0x10, 0xdc, 0xdf, 0x54, 0xd0, 0x05, 0x8c, 0x82, 0x47, 0xbf, 0x67, 0x6b,
- 0xa6, 0x83, 0xed, 0xdd, 0xf7, 0x12, 0x85, 0xd2, 0x31, 0xd7, 0x65, 0xbe,
- 0x54, 0x10, 0x1b, 0x91, 0x31, 0xde, 0x14, 0x93, 0x18, 0xf2, 0xd2, 0xa6,
- 0x70, 0xd5, 0xe2, 0x23, 0x4a, 0xac, 0xac, 0x12, 0xf0, 0x21, 0xd2, 0xea,
- 0xc5, 0xe7, 0x63, 0x7e, 0x5c, 0xb7, 0x9b, 0xd7, 0x24, 0x35, 0x84, 0xb6,
- 0xb7, 0xb0, 0xbf, 0xd3, 0x49, 0x58, 0x0a, 0xed, 0x5d, 0x88, 0xfa, 0x41,
- 0x7b, 0x22, 0xdb, 0xb3, 0x5b, 0xdd, 0x4c, 0xad, 0x23, 0xc6, 0xfc, 0x55,
- 0xbf, 0xab, 0x97, 0x3b, 0xb5, 0x68, 0xd7, 0xe6, 0xdd, 0x48, 0x60, 0xe2,
- 0xc1, 0x66, 0x8a, 0x55, 0xde, 0xf9, 0xe9, 0x65, 0x1d, 0xea, 0x3f, 0xc1,
- 0xc7, 0xcb, 0x8c, 0xf3, 0x5e, 0x89, 0xbc, 0xb2, 0x19, 0xdd, 0xa4, 0x91,
- 0xa7, 0xdd, 0x14, 0x59, 0xba, 0x3b, 0xd1, 0x55, 0x46, 0x48, 0xd4, 0x2d,
- 0xee, 0xe4, 0xab, 0xad, 0xe3, 0x30, 0xcd, 0xe0, 0x97, 0x15, 0x46, 0x40,
- 0xc2, 0x16, 0x0f, 0xa4, 0x52, 0x6f, 0x13, 0x1b, 0x75, 0xd2, 0xb8, 0x5c,
- 0xdc, 0x73, 0xc4, 0xcd, 0x03, 0x6e, 0x55, 0x8c, 0xc3, 0x61, 0x57, 0x15,
- 0x9c, 0x4b, 0x39, 0xc4, 0x1d, 0x94, 0xef, 0x9a, 0x41, 0x83, 0x07, 0x37,
- 0xcd, 0xc4, 0xe7, 0x3e, 0x7f, 0x32, 0x8e, 0xb4, 0x46, 0x95, 0x43, 0x3e,
- 0x83, 0x9b, 0x59, 0x7c, 0x38, 0xcb, 0x9e, 0xfa, 0x9e, 0x90, 0xa7, 0xef,
- 0xf9, 0x2e, 0xb9, 0x2f, 0x8c, 0x31, 0x1b, 0x43, 0xde, 0xd0, 0xe3, 0xfd,
- 0x8b, 0xc4, 0x03, 0xec, 0xf3, 0xf9, 0xd2, 0xb7, 0xc8, 0xf1, 0x45, 0x73,
- 0xf3, 0x6e, 0x28, 0x65, 0xf1, 0xfa, 0x49, 0xd8, 0x0d, 0xe7, 0xc6, 0xd0,
- 0x14, 0x77, 0xa5, 0x84, 0x3c, 0x4a, 0x54, 0xa5, 0xbe, 0x62, 0xa2, 0xa4,
- 0x12, 0x5c, 0xdc, 0x14, 0x1d, 0x5b, 0xc2, 0xbc, 0x79, 0xfe, 0x24, 0x67,
- 0x6d, 0x31, 0x0c, 0x32, 0x22, 0x87, 0xa2, 0x84, 0x68, 0xdb, 0xe9, 0x2a,
- 0x13, 0x2b, 0x41, 0x1f, 0x4f, 0xb8, 0x09, 0x4c, 0xd8, 0x6e, 0xbb, 0x95,
- 0x40, 0x07, 0xf5, 0xa3, 0x05, 0x83, 0x9e, 0x5d, 0x4e, 0xfd, 0xde, 0xf5,
- 0xde, 0xf2, 0xcb, 0x3e, 0x93, 0xe0, 0xd2, 0x2c, 0x9e, 0xfe, 0x13, 0x2d,
- 0x12, 0x21, 0x95, 0x98, 0x74, 0x15, 0xa0, 0x1e, 0xec, 0x24, 0xef, 0x24,
- 0xb4, 0x09, 0x9d, 0xee, 0xae, 0x06, 0xc8, 0x36, 0x06, 0xd8, 0xce, 0x87,
- 0xe6, 0x32, 0xe4, 0xa2, 0x00, 0x28, 0x48, 0x68, 0xac, 0x10, 0x0b, 0x14,
- 0xef, 0x48, 0x40, 0x94, 0x1d, 0x6e, 0xbb, 0x7b, 0xc3, 0xbd, 0xbe, 0x6f,
- 0x75, 0xba, 0xd4, 0x3f, 0xe8, 0xde, 0xa9, 0x85, 0x68, 0xc7, 0xa7, 0xdb,
- 0x7e, 0x86, 0x77, 0xf8, 0x70, 0x15, 0xba, 0x85, 0xc9, 0xb5, 0xec, 0x0c,
- 0x96, 0x9b, 0xf4, 0x2e, 0x54, 0x4c, 0x1f, 0x0d, 0x1e, 0x3f, 0x7f, 0xde,
- 0xb8, 0xcf, 0x2b, 0x0f, 0xdf, 0xfe, 0xc9, 0xa3, 0x47, 0xb4, 0xb6, 0xa0,
- 0x26, 0xda, 0xfc, 0x62, 0xf0, 0x9c, 0x5e, 0x6c, 0xbe, 0x56, 0x65, 0x66,
- 0x0b, 0xa6, 0xdd, 0xef, 0x0d, 0xf0, 0x9b, 0xc8, 0xe7, 0xc8, 0x9f, 0xd2,
- 0xf9, 0xd6, 0x73, 0x7c, 0x2e, 0xf2, 0x16, 0x3d, 0xcc, 0x74, 0x2c, 0x66,
- 0x33, 0x38, 0xb2, 0xf0, 0xa4, 0xe2, 0xf2, 0xdc, 0xa4, 0xe5, 0x34, 0x5c,
- 0xee, 0xa3, 0xfe, 0x60, 0xaf, 0x6b, 0xb9, 0x14, 0x4d, 0xa6, 0x04, 0x38,
- 0xec, 0x27, 0xec, 0x44, 0x63, 0x7d, 0x70, 0x81, 0x50, 0x7b, 0xa0, 0x3d,
- 0x33, 0xa3, 0xbd, 0xe7, 0xcf, 0xfb, 0x98, 0xd9, 0x93, 0xe7, 0xcf, 0x3b,
- 0x0b, 0xc2, 0xbd, 0xcf, 0xdc, 0x14, 0xce, 0xfd, 0x84, 0xd7, 0x1d, 0xd3,
- 0x54, 0x30, 0x72, 0xe2, 0xdf, 0xc1, 0x6f, 0x92, 0x2f, 0x92, 0xb7, 0x67,
- 0x17, 0xc7, 0x9e, 0x67, 0x86, 0xce, 0x17, 0x07, 0x0c, 0x3d, 0x53, 0x93,
- 0x62, 0xb0, 0x2b, 0x6a, 0xcc, 0x46, 0x56, 0xaf, 0xb1, 0x49, 0x42, 0x63,
- 0x92, 0x8a, 0x55, 0xd4, 0x23, 0xf8, 0xbb, 0x30, 0x23, 0x82, 0xda, 0xaf,
- 0x5d, 0xe6, 0xb5, 0x0f, 0xdb, 0xb4, 0x6d, 0x36, 0x7b, 0x87, 0x5c, 0x1c,
- 0x9c, 0xe4, 0x26, 0xc1, 0x94, 0xad, 0x0a, 0xd5, 0x1d, 0x9c, 0x08, 0x8b,
- 0x7f, 0x14, 0xab, 0xad, 0xa0, 0xc0, 0x22, 0x9b, 0x23, 0x6f, 0x55, 0x6e,
- 0x42, 0x7e, 0x61, 0x40, 0x4f, 0xca, 0x71, 0x21, 0x7b, 0xf5, 0x96, 0x3c,
- 0xf0, 0x29, 0xa1, 0x5a, 0xfa, 0x1f, 0x8f, 0xc4, 0x53, 0x20, 0x09, 0x39,
- 0x11, 0x43, 0x2b, 0xb3, 0x30, 0x8c, 0x8f, 0x6e, 0xbc, 0x55, 0x39, 0x87,
- 0xa7, 0xf5, 0xce, 0x2d, 0xb1, 0x0f, 0x01, 0x1e, 0x21, 0x3b, 0xf1, 0xa7,
- 0xd9, 0x4a, 0x53, 0x4a, 0x97, 0xcd, 0x71, 0x0c, 0x2f, 0xcf, 0xf2, 0xcb,
- 0x75, 0x19, 0x4f, 0xbf, 0xa4, 0x06, 0x94, 0x92, 0xe9, 0xa0, 0xdd, 0x1c,
- 0xd2, 0x9b, 0xb4, 0xcc, 0xb4, 0x65, 0xe1, 0xf2, 0xce, 0x9e, 0x6d, 0xb5,
- 0x82, 0xb5, 0x1e, 0x08, 0xad, 0x36, 0x02, 0x4b, 0x1a, 0x25, 0x5c, 0x46,
- 0x8f, 0x81, 0x97, 0x40, 0x52, 0x74, 0xa4, 0xa5, 0x44, 0x5a, 0xbb, 0x8a,
- 0x2c, 0x71, 0x20, 0x62, 0xb3, 0xa9, 0x25, 0x63, 0x9a, 0x08, 0x09, 0xc2,
- 0x9c, 0xba, 0xad, 0xb9, 0xf3, 0xdd, 0xe3, 0x59, 0xf2, 0xb6, 0x5c, 0x15,
- 0x5e, 0xb7, 0x97, 0x10, 0xb4, 0x01, 0x92, 0x87, 0xe1, 0x5c, 0xe8, 0xaf,
- 0xbc, 0x49, 0xe6, 0xf9, 0x9b, 0xe5, 0xbc, 0x48, 0xa7, 0xce, 0x79, 0xb2,
- 0xd2, 0x74, 0x5d, 0x81, 0x1c, 0x93, 0xad, 0x0d, 0xb2, 0x3a, 0xb0, 0xd3,
- 0xbc, 0xc7, 0xc9, 0xb6, 0x07, 0x28, 0x42, 0x1c, 0xea, 0xb9, 0x41, 0x58,
- 0x4a, 0x81, 0x53, 0x18, 0x20, 0x03, 0x70, 0x37, 0xa1, 0xd9, 0x0b, 0x7e,
- 0xe7, 0xdd, 0xb2, 0x89, 0x2e, 0xd4, 0xbd, 0x16, 0x97, 0xa4, 0xe7, 0xd2,
- 0x48, 0x46, 0x27, 0xff, 0xf3, 0xf8, 0x53, 0x46, 0x9d, 0xca, 0xf4, 0xc6,
- 0x16, 0x0e, 0xfe, 0xc0, 0x80, 0x95, 0x12, 0x0d, 0xb2, 0x48, 0x15, 0xe9,
- 0x5c, 0x6c, 0x78, 0x34, 0x48, 0xa5, 0xdb, 0x83, 0xc2, 0x8a, 0xd2, 0x9c,
- 0xda, 0x30, 0x56, 0xc8, 0xdb, 0xa8, 0xef, 0x73, 0xc8, 0x65, 0x9c, 0x8b,
- 0x4e, 0x15, 0x5f, 0xec, 0x00, 0xe4, 0x7d, 0x5c, 0x90, 0x2b, 0x91, 0x4c,
- 0x7b, 0x78, 0x7b, 0x19, 0x4e, 0x2a, 0xd2, 0x77, 0x96, 0x10, 0x11, 0x31,
- 0x29, 0x33, 0xd7, 0x7b, 0x3a, 0x4c, 0xfa, 0x95, 0xf6, 0x19, 0xb7, 0xd5,
- 0x40, 0x78, 0xaa, 0x4c, 0x5e, 0xbc, 0x7f, 0x77, 0xda, 0x51, 0x2e, 0x39,
- 0xa2, 0x3d, 0x00, 0xb1, 0x7a, 0xef, 0x32, 0x42, 0x33, 0x2b, 0x93, 0xf3,
- 0xf4, 0x32, 0xeb, 0xf9, 0x00, 0x72, 0x0d, 0x04, 0x49, 0x71, 0x40, 0xc4,
- 0xdc, 0x29, 0x7e, 0x3b, 0x14, 0x08, 0x71, 0x17, 0x16, 0xf6, 0x8b, 0x1c,
- 0x67, 0xf3, 0x54, 0x68, 0xb7, 0x2e, 0x11, 0xce, 0x27, 0xca, 0x47, 0x1a,
- 0x83, 0xa9, 0x9f, 0xb2, 0x05, 0xfd, 0xc9, 0x59, 0xa6, 0x5c, 0x96, 0x95,
- 0xae, 0xc0, 0x43, 0x49, 0xef, 0x4f, 0xf0, 0xc0, 0xf7, 0x74, 0x9a, 0x83,
- 0x2c, 0x0c, 0xb2, 0x29, 0x29, 0x10, 0x18, 0x6e, 0x78, 0xa1, 0x9a, 0xbe,
- 0x7b, 0xcc, 0x5a, 0xe3, 0xad, 0x19, 0xf0, 0x78, 0xab, 0x24, 0xd2, 0x8b,
- 0x88, 0x4b, 0x57, 0x00, 0xba, 0xc8, 0x38, 0xac, 0xc8, 0x38, 0x49, 0x4e,
- 0x65, 0x7e, 0x87, 0x12, 0x6c, 0x61, 0x5d, 0x48, 0xa7, 0xd6, 0xc8, 0x0c,
- 0x8a, 0x2d, 0x36, 0x9d, 0xa3, 0x57, 0x91, 0xf5, 0x7e, 0x61, 0x8d, 0xd3,
- 0x02, 0xcd, 0x6d, 0x30, 0xa5, 0x74, 0x69, 0x9d, 0xc9, 0x8d, 0x9d, 0xfd,
- 0xe4, 0x50, 0x87, 0x2e, 0x00, 0xf4, 0x52, 0x9b, 0x75, 0x0d, 0x0c, 0x77,
- 0x2c, 0xa5, 0x0e, 0xde, 0xdb, 0x56, 0x8f, 0xf7, 0xfe, 0xcd, 0x6b, 0xe9,
- 0xe2, 0x35, 0x65, 0xe9, 0x40, 0xcc, 0xf5, 0xa6, 0x5b, 0x53, 0x99, 0x0a,
- 0x6d, 0x61, 0xd0, 0x16, 0xc6, 0x55, 0xcc, 0xca, 0x65, 0x19, 0x75, 0xe7,
- 0x0f, 0xbc, 0x82, 0x96, 0x23, 0x2e, 0xdd, 0x1c, 0xbc, 0xca, 0xcd, 0x25,
- 0x52, 0x31, 0x02, 0x11, 0x69, 0xb9, 0xdc, 0x83, 0x58, 0x0f, 0x22, 0x97,
- 0xf0, 0x0e, 0x42, 0x74, 0xbf, 0x89, 0xd4, 0x75, 0xd8, 0x57, 0x6c, 0xcc,
- 0xc6, 0x70, 0xc4, 0x3d, 0xce, 0x62, 0xa7, 0x2d, 0xa4, 0xce, 0x59, 0x41,
- 0x34, 0x4b, 0xb5, 0x83, 0x81, 0xc0, 0x7b, 0xc0, 0x6f, 0x19, 0xa1, 0x8e,
- 0xc5, 0x05, 0xa2, 0xcc, 0x99, 0x2a, 0xb1, 0xe9, 0xf1, 0xd2, 0x2f, 0x2b,
- 0x30, 0x36, 0x6d, 0x27, 0x7a, 0x4e, 0xf6, 0x68, 0x87, 0x01, 0xcd, 0xa4,
- 0x6c, 0x83, 0x22, 0x8e, 0x9c, 0x30, 0x0a, 0x1f, 0x97, 0xa6, 0x4e, 0xcc,
- 0xb0, 0xc3, 0xd6, 0x12, 0xb4, 0xb9, 0x52, 0xfc, 0xc2, 0xbd, 0x6b, 0x2c,
- 0xac, 0xbe, 0xd2, 0xd0, 0xb7, 0x6c, 0x13, 0x62, 0x03, 0xcb, 0x42, 0x10,
- 0x5e, 0x62, 0x21, 0x74, 0xca, 0xde, 0xc1, 0x23, 0xfe, 0x3d, 0xc8, 0x09,
- 0x1b, 0xc9, 0x1f, 0x06, 0xae, 0xf1, 0xc6, 0xf6, 0x5d, 0x66, 0x34, 0x6c,
- 0x97, 0xf4, 0x41, 0x86, 0x54, 0xa4, 0xfa, 0x33, 0xe1, 0x5e, 0xaf, 0x55,
- 0xa3, 0x2e, 0x85, 0x8c, 0x10, 0x2f, 0xb2, 0xc8, 0x44, 0x97, 0x1e, 0x3a,
- 0xeb, 0x65, 0x76, 0x0b, 0x0c, 0xf0, 0xee, 0xe1, 0x42, 0x25, 0xfb, 0x87,
- 0x97, 0xef, 0xde, 0x9e, 0xbc, 0xfd, 0xe6, 0x10, 0x08, 0x75, 0x59, 0x39,
- 0xa1, 0xc6, 0xda, 0x7f, 0x5d, 0x4f, 0xf3, 0x09, 0x4b, 0x0a, 0x69, 0xf8,
- 0xdc, 0xa8, 0x8c, 0xc9, 0xc4, 0xc1, 0x6a, 0x84, 0x4b, 0x50, 0x08, 0x23,
- 0xc9, 0xbc, 0xa8, 0xeb, 0x29, 0x8b, 0xcb, 0xb5, 0x25, 0xfd, 0x84, 0x54,
- 0x11, 0x0a, 0x03, 0x50, 0x78, 0x14, 0xf2, 0x88, 0x99, 0x16, 0x3d, 0xf5,
- 0x8c, 0xa2, 0xf0, 0xea, 0xf4, 0x34, 0xe9, 0xe8, 0xf6, 0xad, 0xb5, 0x5b,
- 0x9c, 0x31, 0x44, 0x03, 0xd9, 0x7c, 0x53, 0xc4, 0xf3, 0xcc, 0xe5, 0xcf,
- 0x5d, 0x28, 0x3d, 0xa9, 0x67, 0x4c, 0xd7, 0x1f, 0xc2, 0x4c, 0x4e, 0xca,
- 0x33, 0xa6, 0xe4, 0x40, 0xda, 0xe1, 0xbc, 0x9c, 0x92, 0x2d, 0x64, 0x84,
- 0x64, 0x31, 0xab, 0xa1, 0x1e, 0x35, 0x6e, 0xd2, 0x66, 0xbf, 0xa6, 0x4d,
- 0xce, 0xf6, 0x2b, 0xb6, 0x72, 0x1a, 0xc0, 0x29, 0x1c, 0x91, 0xa4, 0xa4,
- 0x55, 0xc3, 0x8f, 0xac, 0x17, 0x52, 0x8f, 0x2f, 0xf8, 0xa4, 0x02, 0x6e,
- 0x9e, 0x66, 0xa9, 0x6d, 0x53, 0x5f, 0x41, 0x5a, 0x86, 0xe2, 0xe2, 0x26,
- 0x2b, 0xc5, 0xf8, 0xb4, 0x55, 0xc4, 0x46, 0xd8, 0x0d, 0x93, 0x51, 0x61,
- 0x9e, 0x8f, 0x54, 0x2d, 0x68, 0x07, 0x4d, 0xd7, 0x22, 0x37, 0xad, 0x25,
- 0x89, 0xd6, 0xe6, 0x55, 0x51, 0x93, 0x30, 0x8a, 0xb9, 0x35, 0xd7, 0x1b,
- 0xe9, 0xde, 0x0d, 0xfe, 0x1f, 0x67, 0x56, 0xa1, 0xb8, 0xd3, 0xd0, 0x0e,
- 0x38, 0xa4, 0x37, 0x30, 0xe2, 0xb4, 0x47, 0x1d, 0x10, 0xd1, 0x53, 0xdc,
- 0x1b, 0xe9, 0x9e, 0xce, 0xb8, 0x7e, 0x9a, 0x7a, 0x7b, 0xc1, 0xd1, 0x4e,
- 0x83, 0x5e, 0x4b, 0xae, 0x54, 0xec, 0x4e, 0xcf, 0x73, 0x2a, 0x1d, 0xdc,
- 0x6c, 0xa8, 0x94, 0xab, 0xf4, 0x32, 0x68, 0x98, 0x41, 0x00, 0xfc, 0xcc,
- 0x35, 0xf3, 0x44, 0x91, 0x9e, 0x57, 0x27, 0xef, 0xbf, 0x2c, 0xd7, 0x4d,
- 0xdf, 0x39, 0x17, 0x72, 0x82, 0xf4, 0xa9, 0x83, 0x3a, 0xbd, 0xd9, 0x70,
- 0x27, 0x9a, 0x57, 0xc3, 0x73, 0x90, 0x1b, 0xa9, 0x4a, 0xaf, 0x5d, 0xc2,
- 0x57, 0xa7, 0xe0, 0xd3, 0x62, 0x95, 0xf6, 0x1d, 0x4d, 0x1b, 0x6a, 0xbd,
- 0x4a, 0x3a, 0x54, 0x9a, 0x78, 0x85, 0x2c, 0x7e, 0xa8, 0xb2, 0x81, 0x49,
- 0x10, 0x69, 0x8e, 0xc8, 0x15, 0x5f, 0x12, 0xe4, 0xea, 0x14, 0xc2, 0x12,
- 0xb9, 0xc9, 0x97, 0xd7, 0x05, 0xfd, 0x46, 0x82, 0x54, 0x91, 0x14, 0x95,
- 0xbc, 0xb3, 0xac, 0xe5, 0xa2, 0x45, 0x55, 0x75, 0xd0, 0x68, 0x11, 0x81,
- 0x59, 0x0b, 0x97, 0x06, 0xfa, 0x3d, 0x5b, 0x5c, 0x9b, 0x96, 0x36, 0x2b,
- 0xf0, 0x61, 0x02, 0xf3, 0xf6, 0x6d, 0x83, 0x78, 0xf3, 0xe2, 0xbc, 0xca,
- 0xa4, 0x67, 0x35, 0x97, 0x04, 0xea, 0x85, 0x23, 0xf7, 0x4d, 0x6e, 0x7d,
- 0x3f, 0xdd, 0x37, 0xc9, 0xb0, 0xd9, 0x7e, 0xb6, 0x61, 0xbf, 0x22, 0xa3,
- 0x91, 0xbb, 0x3f, 0xe2, 0x04, 0x4f, 0xae, 0x8a, 0x42, 0x6a, 0x4e, 0xbb,
- 0x84, 0x6d, 0xc2, 0x0d, 0xd2, 0x80, 0x88, 0xd1, 0xa1, 0x3f, 0x34, 0xfb,
- 0x8d, 0x4a, 0x32, 0x79, 0xd8, 0xde, 0x2c, 0x77, 0x1a, 0xab, 0x87, 0x4e,
- 0xda, 0xbc, 0xdb, 0x78, 0x3e, 0xf6, 0x72, 0x16, 0xe1, 0x1a, 0xc2, 0x2b,
- 0x92, 0x14, 0xe0, 0xab, 0x3b, 0x4e, 0x1e, 0xc9, 0xac, 0xf4, 0x89, 0x12,
- 0xbd, 0xec, 0x38, 0xd7, 0xd2, 0x01, 0x64, 0x13, 0xd7, 0x90, 0xd9, 0xb4,
- 0x6c, 0x06, 0x34, 0x68, 0xa6, 0x79, 0x4d, 0x02, 0xe4, 0x0f, 0xfb, 0x8f,
- 0xba, 0x84, 0x3c, 0x06, 0xd2, 0x1a, 0x57, 0x9c, 0xc6, 0xca, 0xda, 0x5f,
- 0x74, 0x0d, 0xba, 0xc2, 0x00, 0xdc, 0x21, 0xeb, 0x15, 0xfc, 0x74, 0x03,
- 0xf0, 0x4b, 0x5a, 0x75, 0xd1, 0x3f, 0x6e, 0x15, 0xff, 0xda, 0xa6, 0x94,
- 0x1d, 0x3d, 0x29, 0x9d, 0xfc, 0x7a, 0xe7, 0xed, 0x31, 0x06, 0x8a, 0x25,
- 0x98, 0xa9, 0x2c, 0x51, 0x3f, 0x89, 0xa7, 0xb4, 0x3b, 0x9d, 0x81, 0xec,
- 0x7a, 0x6a, 0x3e, 0x28, 0x87, 0x13, 0xa3, 0x85, 0xe6, 0x6b, 0xba, 0x58,
- 0x25, 0x11, 0x91, 0xd5, 0xd7, 0x13, 0xa0, 0x69, 0x2a, 0xa9, 0x83, 0xbb,
- 0x4c, 0x45, 0x3c, 0xce, 0x8b, 0x10, 0x7d, 0x45, 0x04, 0x29, 0x1b, 0xe3,
- 0xa9, 0xa4, 0x6b, 0x12, 0x41, 0xf0, 0xa5, 0xe6, 0xc5, 0x48, 0x39, 0x67,
- 0x83, 0xa8, 0xb7, 0x3f, 0xda, 0x35, 0x42, 0xb2, 0xc7, 0x7d, 0x28, 0xfc,
- 0x1e, 0xbf, 0xdd, 0x4b, 0xb6, 0x21, 0x55, 0x77, 0xac, 0xf2, 0x1a, 0xd6,
- 0x3f, 0x6b, 0x73, 0x16, 0xb6, 0x61, 0x52, 0xbe, 0x21, 0xdb, 0xc9, 0xb3,
- 0xd0, 0x5f, 0x8d, 0x95, 0x57, 0x9a, 0xfb, 0x1f, 0x3d, 0xdf, 0xb8, 0x7a,
- 0x70, 0xb6, 0x9e, 0xc7, 0xcc, 0x1c, 0x9c, 0x6d, 0x09, 0x0e, 0xe5, 0x55,
- 0xb5, 0x16, 0x23, 0xd0, 0x02, 0xcc, 0x58, 0xc4, 0xc1, 0x64, 0x6e, 0xe6,
- 0x43, 0x9f, 0xae, 0xe6, 0xc8, 0x2a, 0xe9, 0x54, 0x4f, 0xc8, 0x3b, 0xac,
- 0x0d, 0xe9, 0xb5, 0x81, 0x27, 0xdb, 0x51, 0xb2, 0x3b, 0xdc, 0x88, 0x4e,
- 0x1a, 0xa9, 0x81, 0x08, 0x7d, 0xba, 0xab, 0x5a, 0xc3, 0xf5, 0xce, 0xce,
- 0x2f, 0x4e, 0xce, 0xde, 0x8e, 0x92, 0x7f, 0xe9, 0x6d, 0x2c, 0xef, 0x6a,
- 0x02, 0x2b, 0xff, 0xd8, 0x77, 0x7b, 0x92, 0xbc, 0x10, 0x3f, 0x43, 0x97,
- 0x6d, 0xec, 0x29, 0xf1, 0x13, 0x73, 0x7b, 0x1b, 0xf9, 0xaa, 0x6f, 0x0a,
- 0xb4, 0x9b, 0xec, 0x56, 0x0b, 0x8d, 0x2e, 0xd0, 0x96, 0x2d, 0x9c, 0x5f,
- 0xdb, 0x88, 0x66, 0x61, 0xef, 0x6c, 0x96, 0xd6, 0xf0, 0x71, 0x09, 0x2c,
- 0x92, 0xaf, 0x91, 0xca, 0x29, 0x2f, 0x10, 0x89, 0x6f, 0x48, 0x2d, 0x65,
- 0x0b, 0x7a, 0x9b, 0x65, 0xa6, 0x2a, 0x5a, 0x55, 0xa4, 0xc3, 0xdc, 0x37,
- 0xc7, 0x17, 0x70, 0xd2, 0x50, 0x95, 0xab, 0x9b, 0x20, 0xb9, 0xba, 0x44,
- 0xf1, 0x49, 0xad, 0x72, 0xa6, 0xc5, 0xad, 0x38, 0x34, 0x46, 0x7b, 0x9e,
- 0xa7, 0xcb, 0x68, 0x09, 0x9b, 0xd1, 0x68, 0x8f, 0x0c, 0x35, 0x0a, 0x07,
- 0xfd, 0xaa, 0xbe, 0x13, 0xaf, 0xaf, 0x09, 0xc3, 0x32, 0x9d, 0xbf, 0xbf,
- 0x10, 0x3f, 0xd5, 0xab, 0xe3, 0xd3, 0xe3, 0x8b, 0xe3, 0xb6, 0xe5, 0x3e,
- 0x66, 0x30, 0x4b, 0x2a, 0x75, 0xa9, 0xb3, 0xc9, 0xd5, 0xb2, 0x98, 0x17,
- 0x97, 0xb9, 0xb4, 0xe2, 0x4d, 0x7e, 0xc8, 0xc6, 0xaf, 0x5e, 0x7e, 0x0f,
- 0x7d, 0x02, 0x3e, 0xa7, 0xf3, 0x77, 0x67, 0xe7, 0xaf, 0x4f, 0xde, 0xbe,
- 0xea, 0x27, 0x47, 0x67, 0xe7, 0x7f, 0xee, 0x27, 0x6f, 0xce, 0xbe, 0x3f,
- 0x8e, 0xa4, 0x38, 0x03, 0xe1, 0x36, 0xe0, 0x18, 0xdb, 0xac, 0xcf, 0x19,
- 0xde, 0x4b, 0x0e, 0x59, 0x78, 0x97, 0x08, 0xf2, 0xff, 0x8d, 0xf6, 0x0b,
- 0x71, 0x4b, 0x67, 0xcd, 0x90, 0xce, 0xdc, 0xa1, 0xdf, 0x1e, 0xbf, 0x7c,
- 0xd5, 0x0f, 0x00, 0xcc, 0xd1, 0x4a, 0xc5, 0x7c, 0x0c, 0xeb, 0xb3, 0x8b,
- 0x26, 0xd8, 0x6b, 0xb6, 0x3e, 0x48, 0x43, 0xe0, 0x20, 0x17, 0x9f, 0x58,
- 0xc3, 0xb0, 0x54, 0xa5, 0x3f, 0xed, 0xca, 0x9c, 0x10, 0x2c, 0xfe, 0xce,
- 0x4e, 0xd9, 0x5e, 0xd9, 0x05, 0x94, 0x35, 0x5f, 0xcd, 0x16, 0xb0, 0x26,
- 0x4a, 0xab, 0xd7, 0x22, 0x2c, 0x3f, 0x4b, 0xb6, 0x03, 0x31, 0xa8, 0xdf,
- 0x80, 0x0a, 0x20, 0x79, 0xc4, 0xae, 0xc7, 0x54, 0x7a, 0x1a, 0x52, 0xd3,
- 0x22, 0x63, 0x26, 0x41, 0xab, 0x9e, 0x39, 0x94, 0xd8, 0xcd, 0x1a, 0xb6,
- 0x00, 0xa9, 0x0b, 0x6c, 0x13, 0x88, 0xa7, 0x04, 0xb2, 0x3d, 0x3d, 0x7f,
- 0xe4, 0x1f, 0x0b, 0x58, 0x54, 0x24, 0x71, 0x7b, 0x3d, 0x33, 0x6c, 0x99,
- 0x71, 0xca, 0x14, 0x6f, 0x93, 0x75, 0x0b, 0x24, 0x83, 0x13, 0x75, 0x4a,
- 0x6c, 0x52, 0xb0, 0xf4, 0xc4, 0xa8, 0x63, 0x86, 0xb1, 0xa2, 0xd4, 0x67,
- 0xd5, 0x14, 0x13, 0xbe, 0x87, 0x04, 0xeb, 0x8c, 0xe8, 0xfb, 0xba, 0xc5,
- 0x8a, 0x66, 0x24, 0x1e, 0x1c, 0x9f, 0x28, 0x04, 0xba, 0x11, 0xf8, 0xb2,
- 0xcc, 0x05, 0x1b, 0x5c, 0x2e, 0xf4, 0xa4, 0x11, 0x25, 0x4b, 0xf1, 0x88,
- 0x26, 0x08, 0xbd, 0x0d, 0xd8, 0x96, 0xf6, 0x73, 0x7e, 0x55, 0x7a, 0x8a,
- 0x6e, 0x2a, 0x73, 0x08, 0x42, 0x54, 0xb4, 0xce, 0x46, 0x67, 0x74, 0x7b,
- 0xca, 0x0f, 0x1e, 0xdd, 0x3a, 0x1f, 0x3b, 0xb4, 0x89, 0x2a, 0x19, 0x08,
- 0xd6, 0x37, 0x15, 0xef, 0x05, 0xa4, 0xdb, 0x7e, 0xdd, 0x21, 0x18, 0x7d,
- 0xaf, 0xad, 0x2d, 0xe8, 0xb7, 0x22, 0xea, 0xf4, 0xc4, 0x1c, 0x87, 0x08,
- 0x34, 0x0e, 0x37, 0xdd, 0xe5, 0x74, 0x04, 0xd2, 0xab, 0x88, 0xfa, 0x66,
- 0xac, 0xf0, 0xc3, 0xe7, 0x67, 0xe7, 0x07, 0xd1, 0x2f, 0xe3, 0x17, 0xf7,
- 0x7d, 0x3a, 0xd8, 0xb3, 0x77, 0xc7, 0x17, 0xef, 0x86, 0xc9, 0xb6, 0x8f,
- 0xf9, 0xfa, 0x74, 0xf8, 0x28, 0x0c, 0xda, 0x9c, 0xbc, 0x79, 0x19, 0x5f,
- 0x2f, 0x7e, 0xd1, 0xf5, 0x55, 0x92, 0x0d, 0xf8, 0x6e, 0x98, 0x47, 0xec,
- 0x21, 0x3d, 0x3d, 0x8a, 0x7d, 0x6f, 0xf4, 0xa6, 0x83, 0xbe, 0xf8, 0xc5,
- 0x86, 0x55, 0x7e, 0x7b, 0x7c, 0x1a, 0xe9, 0xed, 0xf3, 0xfd, 0xbb, 0xd7,
- 0x7f, 0x6e, 0xae, 0xf2, 0xe0, 0x71, 0xe4, 0xab, 0xbf, 0xa5, 0x43, 0x3d,
- 0xab, 0x8a, 0xb9, 0x51, 0x58, 0xa8, 0x8a, 0x83, 0x8a, 0x38, 0x0e, 0xcd,
- 0x15, 0x50, 0xfe, 0xa5, 0x8f, 0x3f, 0x7f, 0x1e, 0x0e, 0x87, 0x5f, 0x86,
- 0x78, 0xe8, 0xe4, 0x9d, 0xb1, 0x0b, 0xc5, 0x83, 0x48, 0x7d, 0x6f, 0xd9,
- 0xde, 0x54, 0x2f, 0x43, 0xf5, 0x41, 0x88, 0x57, 0xac, 0xd2, 0xbc, 0xa4,
- 0x6e, 0x40, 0xd1, 0xab, 0x16, 0x8b, 0x71, 0x35, 0x5e, 0x56, 0x8f, 0x13,
- 0x2c, 0x30, 0x3e, 0xa8, 0xdb, 0xd5, 0x8e, 0x54, 0x54, 0xbb, 0xdb, 0x37,
- 0x9d, 0x06, 0x2e, 0x10, 0xee, 0xc8, 0x82, 0xcf, 0x96, 0xf0, 0xcc, 0xb2,
- 0x95, 0xe3, 0x6e, 0xd9, 0xa5, 0xde, 0x1a, 0xb2, 0xee, 0xa9, 0x9d, 0x7e,
- 0xd4, 0x6f, 0x21, 0x15, 0x92, 0x47, 0x12, 0x4c, 0x27, 0x17, 0x72, 0x4a,
- 0x17, 0x0a, 0x35, 0x98, 0xcd, 0xea, 0xc9, 0x2e, 0xd6, 0x59, 0x35, 0x74,
- 0x3f, 0xab, 0xbc, 0x05, 0xee, 0x23, 0x3f, 0x43, 0x92, 0x6a, 0x67, 0x39,
- 0xad, 0xc5, 0x2b, 0x46, 0x70, 0xe5, 0xbb, 0x9e, 0x8e, 0xce, 0x9a, 0x41,
- 0x28, 0xc7, 0x1a, 0xbd, 0x90, 0xfc, 0xda, 0x43, 0x6d, 0x72, 0x11, 0x08,
- 0x42, 0xaf, 0x40, 0x2d, 0x54, 0xf8, 0x49, 0x2e, 0x2b, 0x0f, 0x21, 0x85,
- 0x82, 0x70, 0xc7, 0x67, 0x8d, 0xbb, 0x40, 0x7d, 0x73, 0xfe, 0xa6, 0x77,
- 0x54, 0x3d, 0xd3, 0x04, 0x18, 0x43, 0x5c, 0xcd, 0x77, 0xac, 0x34, 0xbc,
- 0x09, 0xbf, 0xb6, 0xa9, 0x1a, 0x54, 0x60, 0xbe, 0xf5, 0x2f, 0x5b, 0x50,
- 0x81, 0xe9, 0xf5, 0x68, 0x55, 0xbb, 0xb2, 0x2c, 0x4c, 0x1a, 0x3c, 0x15,
- 0xd1, 0x18, 0x2c, 0x51, 0x2c, 0xf3, 0xa9, 0x14, 0xf5, 0x99, 0x87, 0x96,
- 0x30, 0x4c, 0x7e, 0xc8, 0xe7, 0xd3, 0x49, 0x5a, 0x52, 0x62, 0x58, 0x78,
- 0xb1, 0x0a, 0x9b, 0xf0, 0x49, 0xaa, 0x0a, 0xfa, 0xaa, 0x3b, 0x36, 0xda,
- 0x46, 0x26, 0xce, 0xf5, 0x91, 0x72, 0x1f, 0xbb, 0x19, 0x08, 0x7b, 0x77,
- 0x95, 0x9b, 0x31, 0xfb, 0x28, 0x8d, 0x71, 0xc9, 0x35, 0x7b, 0x77, 0x34,
- 0xf7, 0x55, 0x23, 0x10, 0x83, 0xc7, 0x61, 0x14, 0x25, 0x5f, 0x5d, 0x3f,
- 0x26, 0xc7, 0xd5, 0xd3, 0x3e, 0xff, 0xeb, 0xa9, 0x2b, 0x3c, 0xf1, 0xcc,
- 0x33, 0xb6, 0x60, 0x58, 0xdf, 0x3f, 0x39, 0xd7, 0xf2, 0xd6, 0xb6, 0x34,
- 0x1c, 0x79, 0x68, 0xe4, 0x3c, 0x4b, 0x2d, 0x58, 0x33, 0xef, 0xe8, 0x6c,
- 0x41, 0x11, 0x23, 0xb9, 0xfe, 0x32, 0x2e, 0x01, 0x38, 0x52, 0x57, 0x3f,
- 0x6f, 0xaa, 0x24, 0x36, 0xda, 0xfe, 0xb3, 0x61, 0xa4, 0xf1, 0x76, 0xf4,
- 0x43, 0x36, 0xd1, 0xd7, 0x7d, 0x0d, 0x10, 0x51, 0x14, 0xb0, 0x43, 0xbe,
- 0x8f, 0x2b, 0x24, 0x8e, 0x7e, 0xe8, 0xf9, 0x3d, 0x1f, 0xe2, 0x2d, 0xb5,
- 0x88, 0x6f, 0x37, 0xca, 0x15, 0x76, 0xfa, 0xd2, 0x45, 0xfb, 0xf1, 0xf0,
- 0xd1, 0xc3, 0x73, 0x93, 0x9d, 0xd9, 0xcd, 0xc0, 0x83, 0xfc, 0x13, 0xe2,
- 0x12, 0x49, 0x0e, 0x2b, 0xba, 0x78, 0x6e, 0x63, 0x4f, 0x0c, 0x00, 0xe6,
- 0x34, 0xa4, 0xb8, 0x21, 0x00, 0xdc, 0xb8, 0x03, 0x0a, 0x12, 0xb4, 0x7d,
- 0x06, 0xc8, 0x97, 0xb9, 0xe3, 0x66, 0xf1, 0x77, 0x82, 0x06, 0xdf, 0xc6,
- 0xa5, 0x91, 0xb4, 0x1f, 0x63, 0xb3, 0x82, 0x07, 0x58, 0xa7, 0xe2, 0x61,
- 0x87, 0xf7, 0x20, 0xda, 0x50, 0x28, 0xb2, 0x9a, 0x67, 0xd3, 0x4b, 0xa3,
- 0x5c, 0x2e, 0x16, 0x59, 0xd9, 0x83, 0x6c, 0xa4, 0x57, 0x09, 0x45, 0xff,
- 0x15, 0xc7, 0xdd, 0x15, 0xc3, 0xac, 0xab, 0xd9, 0xbb, 0x97, 0x28, 0xbe,
- 0x9d, 0x5d, 0x6a, 0x99, 0x79, 0x39, 0xd9, 0xd1, 0x96, 0x51, 0x9a, 0x9f,
- 0xe4, 0xd4, 0x2c, 0xe4, 0x38, 0xc5, 0x14, 0x61, 0x8a, 0x43, 0x68, 0xf1,
- 0x67, 0x14, 0xb4, 0x6a, 0xba, 0x5e, 0xcd, 0x19, 0x62, 0x8b, 0x93, 0xa0,
- 0xbc, 0x39, 0xc6, 0x20, 0xed, 0x6c, 0x3b, 0x13, 0xae, 0x51, 0x87, 0x87,
- 0x16, 0xb5, 0x04, 0xe4, 0xab, 0x25, 0x9d, 0x76, 0x8b, 0x44, 0xf6, 0x02,
- 0x9f, 0x1c, 0x67, 0xb0, 0x80, 0x61, 0xe1, 0xa0, 0x29, 0x79, 0x70, 0x3f,
- 0x11, 0xf2, 0x1d, 0xd5, 0x4c, 0x99, 0x85, 0x98, 0xb9, 0x82, 0xbf, 0xc7,
- 0x73, 0xe0, 0x60, 0xa0, 0xa6, 0x15, 0x99, 0xdf, 0xd2, 0x6a, 0xc0, 0xd8,
- 0xfb, 0xc6, 0x40, 0x07, 0x00, 0xbc, 0x82, 0x61, 0x46, 0x82, 0x5e, 0xac,
- 0xa8, 0x52, 0xd6, 0x7f, 0x18, 0xfa, 0xe0, 0x36, 0x06, 0x87, 0xdc, 0x0f,
- 0xc2, 0x06, 0x2a, 0x16, 0xc6, 0x44, 0xcf, 0xc7, 0xf9, 0x1c, 0x8d, 0x66,
- 0x82, 0xba, 0x28, 0xda, 0x35, 0xca, 0xc0, 0x0f, 0x83, 0x2c, 0xf3, 0xf4,
- 0xe3, 0x9d, 0xd7, 0xdd, 0x0b, 0xb5, 0x24, 0x73, 0xf8, 0x08, 0xe1, 0xae,
- 0xe0, 0x78, 0x05, 0x39, 0x3d, 0xaf, 0xd8, 0x2b, 0x80, 0x62, 0x47, 0x6a,
- 0xf4, 0x45, 0xd9, 0x09, 0xd9, 0x34, 0x66, 0x26, 0x4a, 0x9b, 0x0f, 0xa9,
- 0xf5, 0x74, 0xa3, 0x70, 0xd0, 0xc7, 0x91, 0x3c, 0xa0, 0xf8, 0xeb, 0xe0,
- 0x2a, 0xcc, 0xb4, 0xff, 0x90, 0xf8, 0x73, 0x95, 0xfd, 0x70, 0x61, 0x6b,
- 0x92, 0xa0, 0xf8, 0xd6, 0xd9, 0x9d, 0xc1, 0xce, 0xd7, 0x34, 0x89, 0x2f,
- 0x56, 0x53, 0xc8, 0x5c, 0x4e, 0x80, 0xf8, 0x3f, 0x48, 0xc6, 0x68, 0x5c,
- 0x8e, 0x7b, 0x48, 0xca, 0xb0, 0x9c, 0x8a, 0x2d, 0x8d, 0x59, 0x63, 0xce,
- 0x63, 0x2d, 0xde, 0x2e, 0xd7, 0x14, 0x73, 0xa2, 0x69, 0x78, 0x8b, 0x24,
- 0x97, 0xff, 0x7f, 0x26, 0xab, 0x7c, 0x45, 0x89, 0xa2, 0x5f, 0x8a, 0xb7,
- 0x2b, 0x06, 0xc2, 0x47, 0x3d, 0x64, 0xb8, 0x7e, 0xcc, 0x48, 0x72, 0x73,
- 0x81, 0x01, 0x99, 0xb5, 0x2c, 0x96, 0x97, 0x94, 0x20, 0x72, 0x49, 0xe8,
- 0xcf, 0x6c, 0x11, 0x9b, 0x75, 0x54, 0x99, 0xb0, 0x3e, 0x6c, 0x49, 0x9e,
- 0x6b, 0x6b, 0x38, 0xc0, 0x33, 0xe8, 0x44, 0xe8, 0xdc, 0x15, 0x8b, 0xb1,
- 0x66, 0x98, 0xb6, 0x01, 0x5d, 0xfa, 0x82, 0x87, 0x70, 0x27, 0x05, 0x3a,
- 0x11, 0xe1, 0x85, 0x33, 0x96, 0xb5, 0x4f, 0xd8, 0x06, 0x59, 0xf6, 0x6c,
- 0xaf, 0x89, 0x23, 0xc4, 0xb2, 0x0c, 0xf9, 0x84, 0x65, 0x36, 0x83, 0x58,
- 0x6a, 0x2b, 0xbf, 0xcb, 0xb6, 0xd7, 0x58, 0x14, 0x3c, 0xc8, 0x03, 0xfe,
- 0x31, 0x50, 0x64, 0x54, 0x65, 0x3b, 0x46, 0x2d, 0xe6, 0xbb, 0xe3, 0xd7,
- 0xef, 0x47, 0xc7, 0xaf, 0x08, 0x34, 0x38, 0xd6, 0x15, 0x2e, 0xa7, 0xee,
- 0x2b, 0x14, 0x5f, 0xad, 0x0b, 0x36, 0x8d, 0x55, 0xfa, 0x35, 0xc4, 0x1d,
- 0xf7, 0x93, 0xae, 0xb8, 0xe4, 0x9f, 0x65, 0x65, 0x4c, 0x5e, 0x74, 0x49,
- 0xce, 0x0d, 0xe8, 0x49, 0xbc, 0xea, 0x69, 0x86, 0x16, 0x83, 0x2f, 0x38,
- 0x97, 0x2f, 0x80, 0x86, 0xa4, 0x66, 0x84, 0x02, 0x14, 0x66, 0x04, 0x6e,
- 0xb6, 0xd2, 0x13, 0x94, 0x2e, 0x8a, 0xf5, 0x92, 0x03, 0x3c, 0xe6, 0xae,
- 0xd1, 0x33, 0x40, 0x31, 0x34, 0x3e, 0xd1, 0x64, 0x82, 0xa6, 0x1d, 0xfd,
- 0xf0, 0xc8, 0x75, 0xcd, 0xc7, 0x40, 0xf5, 0x99, 0x36, 0x51, 0xb6, 0xf3,
- 0xda, 0xfa, 0x27, 0x58, 0x16, 0x4d, 0xc3, 0xde, 0xa0, 0x24, 0xbb, 0x09,
- 0x67, 0x0c, 0xc2, 0x8f, 0xa7, 0x62, 0x14, 0xe3, 0xcb, 0xc2, 0x1c, 0x97,
- 0xab, 0x85, 0x2d, 0xb8, 0x66, 0x5c, 0x9a, 0x6a, 0xa7, 0x7d, 0x05, 0xb5,
- 0xaf, 0x05, 0xf8, 0x44, 0x28, 0x8f, 0x27, 0x63, 0x20, 0x0a, 0x68, 0x38,
- 0x4c, 0x26, 0x72, 0xfb, 0x22, 0xc7, 0x81, 0xd5, 0xf3, 0x91, 0x40, 0x47,
- 0x10, 0x2d, 0x98, 0x82, 0xa1, 0xd3, 0x0c, 0xbd, 0x93, 0xda, 0x4e, 0x69,
- 0x75, 0x40, 0xe8, 0xbd, 0xa3, 0x53, 0xc7, 0xcc, 0xff, 0x99, 0x3d, 0x29,
- 0xf7, 0xf6, 0x63, 0xb7, 0xf9, 0x22, 0xbd, 0x25, 0x47, 0x7b, 0x27, 0x3b,
- 0x90, 0x57, 0x84, 0x09, 0x82, 0xe7, 0x4a, 0xd6, 0x5f, 0x49, 0x5b, 0x74,
- 0x05, 0x7c, 0x9c, 0x5e, 0x69, 0xb7, 0x5a, 0x84, 0x3d, 0x30, 0xf2, 0xc2,
- 0x04, 0x0a, 0xc2, 0xfb, 0x93, 0x39, 0x53, 0xac, 0x23, 0xc5, 0x22, 0xe1,
- 0x88, 0xda, 0xe6, 0xf6, 0x78, 0xf4, 0xb1, 0x1d, 0xfc, 0x78, 0x5e, 0x20,
- 0xd3, 0xa2, 0xf2, 0x3c, 0xf8, 0x11, 0xe0, 0x51, 0x48, 0xa0, 0x12, 0x5c,
- 0xa8, 0x6e, 0x39, 0x8e, 0x6c, 0x51, 0x43, 0x2e, 0x2a, 0x79, 0x05, 0x0c,
- 0x23, 0xfb, 0xf1, 0xa5, 0xcb, 0x24, 0x2d, 0x83, 0xdf, 0x0c, 0x32, 0xf1,
- 0x75, 0x9c, 0x8c, 0x07, 0xe8, 0x37, 0xd1, 0xe1, 0x65, 0xda, 0x54, 0x62,
- 0xce, 0xe5, 0x6c, 0xd4, 0x0f, 0x52, 0x91, 0x3e, 0x22, 0x66, 0x27, 0x77,
- 0x61, 0x85, 0x10, 0xa3, 0x0a, 0x4d, 0xac, 0x88, 0xdc, 0x65, 0xe9, 0xd2,
- 0x9f, 0x2c, 0xed, 0x80, 0x19, 0x24, 0x2f, 0xa6, 0x54, 0xdb, 0xc9, 0xdd,
- 0xc4, 0x3a, 0x40, 0xb0, 0x64, 0x36, 0x5b, 0x88, 0xb7, 0xdc, 0xe6, 0x8b,
- 0xf5, 0x82, 0x5e, 0xef, 0x73, 0x11, 0xf7, 0x02, 0x1a, 0xb8, 0x6e, 0x2a,
- 0xe5, 0x48, 0xd7, 0xca, 0x51, 0x31, 0x97, 0x2c, 0x44, 0x1b, 0x31, 0x6d,
- 0xcd, 0xba, 0x09, 0xde, 0xe2, 0x46, 0x41, 0xb4, 0x51, 0xff, 0xdb, 0xf9,
- 0x33, 0x79, 0x61, 0xac, 0xd3, 0x2f, 0x23, 0xe8, 0x35, 0xa9, 0x2f, 0x53,
- 0x45, 0x7e, 0x10, 0x67, 0xa2, 0x60, 0x23, 0x9b, 0x7a, 0xee, 0x30, 0xe6,
- 0x38, 0x58, 0x95, 0xbc, 0x49, 0x9d, 0x12, 0xaa, 0x6f, 0xc3, 0x77, 0xc2,
- 0xee, 0x58, 0xa8, 0x0b, 0x60, 0xb1, 0x82, 0x2d, 0x4c, 0x8f, 0x7d, 0x23,
- 0xa7, 0xc2, 0x7a, 0x15, 0xd8, 0x2f, 0x22, 0x28, 0x24, 0x3f, 0x83, 0xdf,
- 0x37, 0x9f, 0x7f, 0x24, 0xb9, 0x7d, 0xe2, 0xa3, 0x43, 0xdc, 0x4f, 0xa8,
- 0xac, 0xee, 0xf8, 0x66, 0xc7, 0x23, 0x9b, 0xd4, 0x40, 0x62, 0x03, 0x82,
- 0xac, 0x25, 0x2e, 0xd9, 0xc2, 0x66, 0x44, 0xb7, 0x43, 0x88, 0x53, 0xde,
- 0xbb, 0x3e, 0x23, 0x30, 0x50, 0x7a, 0xe7, 0xe3, 0xdb, 0xdb, 0x80, 0xc3,
- 0x3d, 0xb7, 0x1e, 0xa3, 0xe6, 0xb2, 0xcf, 0xef, 0xf1, 0xa3, 0xcf, 0xf1,
- 0xcf, 0x27, 0xb7, 0x2d, 0xd7, 0xdf, 0x30, 0x0a, 0x71, 0xeb, 0x80, 0x24,
- 0xd3, 0x71, 0xc1, 0xa9, 0x04, 0x4c, 0xb4, 0x34, 0x42, 0x4e, 0x96, 0x0e,
- 0x37, 0x29, 0x75, 0x3f, 0x0b, 0x13, 0xb4, 0x28, 0xa3, 0x5c, 0xb0, 0x31,
- 0x5c, 0xb2, 0x07, 0x35, 0x5e, 0x35, 0x4a, 0x02, 0x48, 0xa9, 0x74, 0xd2,
- 0x01, 0x0d, 0xf9, 0xd6, 0x1c, 0x44, 0x0e, 0xc8, 0x85, 0xaf, 0x30, 0xf5,
- 0x71, 0xa4, 0xcc, 0x7d, 0x95, 0xcf, 0x59, 0x3b, 0xc3, 0xc1, 0xae, 0x92,
- 0x3d, 0xb3, 0x0b, 0xf9, 0x72, 0x5d, 0x5b, 0xcc, 0x51, 0xfa, 0xa6, 0x05,
- 0xcf, 0x8a, 0x50, 0x7f, 0x4e, 0x06, 0x81, 0xa2, 0x78, 0xe0, 0xf4, 0x55,
- 0x5e, 0x92, 0x03, 0x9f, 0x12, 0xf6, 0x2e, 0x48, 0x88, 0xad, 0x71, 0xcb,
- 0x46, 0x1c, 0xde, 0xb6, 0x7f, 0xa2, 0xde, 0xab, 0xd9, 0xad, 0xa1, 0x36,
- 0x63, 0xc1, 0x79, 0x17, 0x9b, 0xbd, 0xd2, 0x86, 0x5e, 0xdb, 0x99, 0x48,
- 0xfe, 0x62, 0x43, 0x88, 0xdb, 0x46, 0x84, 0x24, 0xe7, 0x8a, 0x5a, 0x8e,
- 0xa4, 0x6d, 0x21, 0xc9, 0x16, 0x68, 0xfc, 0x68, 0x73, 0x1b, 0x48, 0x41,
- 0xdd, 0x7a, 0xfa, 0xd4, 0x22, 0x1a, 0x70, 0x2e, 0xba, 0xd1, 0xe8, 0x35,
- 0xad, 0x97, 0x19, 0x9b, 0xac, 0xbd, 0xc1, 0x4b, 0xe4, 0xbd, 0x1c, 0xc6,
- 0x14, 0x34, 0x61, 0x21, 0x05, 0xd7, 0x37, 0xb2, 0x97, 0x84, 0x01, 0x85,
- 0x1d, 0x33, 0x6d, 0x2b, 0x80, 0x86, 0x03, 0x7c, 0x54, 0x6d, 0x1c, 0x91,
- 0x3c, 0x52, 0xd9, 0x6d, 0x28, 0x99, 0x63, 0xaa, 0xce, 0x3f, 0x51, 0x1c,
- 0x55, 0x29, 0x40, 0x74, 0xd7, 0xf5, 0xd5, 0xdf, 0xf3, 0x69, 0xf2, 0x42,
- 0xb1, 0x97, 0xe3, 0x50, 0x34, 0x38, 0x16, 0xe6, 0x49, 0xb3, 0x7f, 0x15,
- 0x2b, 0xb8, 0xfa, 0x78, 0xb2, 0x2d, 0x23, 0x18, 0x7b, 0x73, 0xba, 0xa6,
- 0x08, 0xc3, 0xe8, 0xe5, 0xe8, 0x34, 0x39, 0x3f, 0x7d, 0x79, 0xf2, 0xd6,
- 0xbc, 0x33, 0x08, 0x7d, 0x6f, 0x16, 0x81, 0x91, 0xf0, 0x7b, 0x02, 0x9d,
- 0xb4, 0x85, 0xd2, 0xd8, 0xfc, 0x50, 0x08, 0xd2, 0x36, 0xa5, 0x7b, 0xb5,
- 0x51, 0x4c, 0x35, 0x58, 0x6b, 0x0a, 0x67, 0x57, 0xf2, 0xa2, 0xa5, 0xae,
- 0xe6, 0xfd, 0x49, 0x62, 0xbd, 0x97, 0x39, 0x21, 0xc7, 0xd2, 0xdc, 0x60,
- 0xd7, 0x9a, 0x0d, 0x13, 0x5b, 0x0d, 0x68, 0xe7, 0x32, 0x52, 0x68, 0xf2,
- 0x66, 0x4e, 0xdc, 0x04, 0xd0, 0x70, 0x88, 0x37, 0x36, 0xe1, 0x55, 0xb6,
- 0x12, 0xf7, 0xa3, 0xa9, 0x9d, 0x09, 0xe5, 0xa7, 0x23, 0xd9, 0x5d, 0xa8,
- 0x24, 0xd7, 0xad, 0x57, 0x64, 0x94, 0x12, 0x0e, 0x42, 0x62, 0x7d, 0x4f,
- 0x54, 0x86, 0xb9, 0x55, 0x05, 0x97, 0xf5, 0xb8, 0xb8, 0xed, 0xab, 0x09,
- 0xe6, 0x95, 0x7e, 0xda, 0xa4, 0xad, 0x4b, 0x23, 0xd9, 0x08, 0x5b, 0x8f,
- 0xc7, 0xab, 0x0b, 0x86, 0x1d, 0x07, 0x9a, 0x78, 0x58, 0x01, 0xb5, 0x30,
- 0xaa, 0xae, 0x19, 0xd0, 0x8f, 0xf5, 0x6c, 0x62, 0x37, 0x1c, 0xb8, 0x80,
- 0xdd, 0xf2, 0xb6, 0xba, 0x73, 0x4c, 0x65, 0x03, 0x36, 0xe9, 0xd7, 0x0a,
- 0x6a, 0x33, 0x04, 0xf1, 0x51, 0x93, 0x1b, 0x36, 0x76, 0x94, 0x68, 0xd9,
- 0x43, 0x9f, 0x0a, 0xf6, 0x9a, 0xdb, 0x10, 0x74, 0x75, 0xf2, 0xad, 0x0e,
- 0xe9, 0xe3, 0x0e, 0x5c, 0x3f, 0x98, 0x0a, 0x03, 0x15, 0x52, 0x71, 0x26,
- 0x37, 0x5c, 0x4e, 0x62, 0xfe, 0x13, 0x7a, 0x66, 0x57, 0x72, 0x7d, 0xef,
- 0x4b, 0x99, 0x63, 0x2c, 0x6d, 0x5d, 0xf9, 0x08, 0xdc, 0x8f, 0x96, 0xe4,
- 0x83, 0x18, 0x2e, 0x9f, 0x4d, 0x38, 0x11, 0x93, 0xab, 0xa2, 0xa7, 0x91,
- 0xf9, 0x5b, 0x0b, 0xa7, 0xd9, 0x2b, 0x1d, 0x63, 0xb8, 0x04, 0x5a, 0x74,
- 0x74, 0x09, 0xfb, 0xbf, 0x70, 0x4e, 0xd5, 0x8c, 0xbb, 0x3e, 0xeb, 0x0c,
- 0xbc, 0x31, 0x03, 0x91, 0x3c, 0x97, 0xaa, 0x81, 0xbf, 0xad, 0x73, 0xa3,
- 0xc8, 0xa1, 0xba, 0x1a, 0x6e, 0x24, 0x3a, 0x87, 0xd2, 0x3a, 0x99, 0x7b,
- 0xb4, 0x53, 0x1f, 0x77, 0xae, 0x25, 0x93, 0x36, 0xda, 0x66, 0x02, 0x81,
- 0x48, 0x36, 0x13, 0xc2, 0x65, 0x45, 0x26, 0x9e, 0x39, 0x0f, 0x47, 0x98,
- 0xf6, 0xc2, 0x5c, 0x86, 0xe4, 0xb0, 0xf7, 0x00, 0x43, 0x35, 0x3f, 0x50,
- 0x8b, 0xf6, 0xa8, 0x2e, 0xa5, 0xfa, 0x18, 0x16, 0xe5, 0xf5, 0x1b, 0xad,
- 0x27, 0xc9, 0x45, 0x2c, 0x72, 0xa9, 0x46, 0xdf, 0xd2, 0x65, 0x3a, 0xdf,
- 0xad, 0xea, 0x29, 0x14, 0x84, 0xf5, 0x72, 0x8e, 0x79, 0x62, 0xa4, 0x8e,
- 0x46, 0xc8, 0x11, 0x60, 0xbd, 0xf7, 0x14, 0x1b, 0x1d, 0x51, 0x6c, 0xd4,
- 0x6d, 0x11, 0xf7, 0x9a, 0xb1, 0x82, 0x50, 0xea, 0x93, 0xbd, 0x74, 0x71,
- 0x9b, 0xae, 0x19, 0xa2, 0xfc, 0xf9, 0xd4, 0x82, 0xd0, 0xe1, 0xf5, 0x12,
- 0x2d, 0x1b, 0xfb, 0xb6, 0x09, 0xf3, 0xe8, 0x1a, 0xfb, 0x65, 0x18, 0x6d,
- 0x4c, 0x7e, 0x29, 0xea, 0x06, 0x61, 0x16, 0x69, 0x5e, 0x6f, 0x9c, 0x27,
- 0xc2, 0xd4, 0xfc, 0x85, 0xb0, 0x65, 0x04, 0x9f, 0xf9, 0xd8, 0x03, 0x2d,
- 0xab, 0x5b, 0x81, 0x1b, 0x1f, 0xa2, 0x71, 0x10, 0xd6, 0x62, 0xfd, 0x52,
- 0xc4, 0x32, 0xbf, 0x9f, 0x8d, 0x03, 0x65, 0x84, 0xfb, 0xd6, 0x96, 0x39,
- 0x48, 0xee, 0x72, 0x03, 0xbb, 0x4b, 0x20, 0x66, 0x23, 0xfe, 0x22, 0xc3,
- 0x4c, 0x6b, 0x01, 0x3b, 0x9a, 0xcc, 0x8d, 0x3e, 0x14, 0xf1, 0x2f, 0x8f,
- 0x04, 0xe9, 0x12, 0xb8, 0x9e, 0xfd, 0xf6, 0xed, 0x5d, 0xad, 0xa1, 0xa4,
- 0xcf, 0xd7, 0xf8, 0xb2, 0x73, 0x01, 0x11, 0x24, 0xa3, 0x62, 0xb4, 0x44,
- 0x61, 0x4c, 0x2d, 0xa6, 0x22, 0xce, 0xa8, 0x87, 0xe8, 0xaa, 0x20, 0xe5,
- 0x16, 0xec, 0xb4, 0x0d, 0x7a, 0x37, 0xec, 0x98, 0x1d, 0x1c, 0x27, 0x3c,
- 0x4c, 0x26, 0x88, 0xd1, 0x9e, 0xbf, 0x1d, 0x75, 0xab, 0x3a, 0x1d, 0x81,
- 0x3c, 0x15, 0x90, 0xb0, 0x18, 0x4c, 0xa5, 0xcd, 0x01, 0x6b, 0xcc, 0x4c,
- 0x55, 0x15, 0xc5, 0x43, 0xa1, 0x42, 0x32, 0x86, 0x35, 0xd5, 0xfd, 0x4f,
- 0x4e, 0x96, 0x41, 0x82, 0x03, 0xbc, 0xcd, 0xdc, 0x29, 0x95, 0x64, 0x0e,
- 0x6b, 0xd6, 0x52, 0x15, 0x5b, 0xe9, 0xd9, 0x6b, 0x4c, 0x49, 0xf5, 0xea,
- 0x48, 0x49, 0x12, 0xbf, 0xb4, 0xad, 0xa8, 0x63, 0xf4, 0xda, 0x4e, 0x23,
- 0x11, 0xa0, 0x68, 0xe0, 0xea, 0xff, 0x53, 0xd5, 0xaf, 0x27, 0xcd, 0x0e,
- 0xa1, 0x82, 0x51, 0xfb, 0xab, 0x0e, 0x54, 0xfa, 0xb0, 0x13, 0xd5, 0x51,
- 0x3e, 0xf8, 0xff, 0xe6, 0x89, 0x4a, 0x93, 0x87, 0x9d, 0xa9, 0xb4, 0x7d,
- 0xa8, 0x42, 0xb1, 0x74, 0xdb, 0x39, 0xe3, 0xdf, 0xf0, 0x94, 0xf1, 0x31,
- 0xfb, 0x45, 0xe7, 0x4c, 0x99, 0xe2, 0xff, 0xe5, 0x53, 0xf6, 0x79, 0x4b,
- 0x0b, 0x24, 0xc0, 0xe7, 0x0d, 0x8d, 0x78, 0xfd, 0x64, 0x54, 0x68, 0xc7,
- 0xd0, 0xb5, 0x76, 0x2d, 0x36, 0x6b, 0xbc, 0x1b, 0x2f, 0x63, 0x09, 0x46,
- 0x32, 0x32, 0x28, 0x18, 0x41, 0xf4, 0x78, 0x62, 0x65, 0x9e, 0xe2, 0xa8,
- 0x6c, 0x1c, 0x38, 0xf4, 0xe3, 0x2a, 0xe4, 0x3d, 0x01, 0x54, 0xd8, 0xde,
- 0xcd, 0x89, 0x74, 0x85, 0x92, 0x65, 0x5d, 0x9a, 0xab, 0x7d, 0x95, 0x53,
- 0x76, 0x70, 0x01, 0xcc, 0x8b, 0x6f, 0x46, 0xa3, 0xc1, 0xcb, 0xf3, 0x93,
- 0x7b, 0xec, 0x2e, 0x02, 0xba, 0x72, 0x93, 0x8c, 0x99, 0xce, 0xdd, 0x79,
- 0xa5, 0xcd, 0x4f, 0x1b, 0x45, 0xb7, 0x4d, 0xd6, 0x97, 0x55, 0xa3, 0x6c,
- 0x42, 0xa7, 0x64, 0x5b, 0x08, 0x41, 0xd9, 0x56, 0x14, 0x79, 0x2a, 0x5d,
- 0x82, 0xdb, 0x86, 0x62, 0x59, 0xf4, 0x44, 0x10, 0xaa, 0x23, 0xc8, 0x30,
- 0xc2, 0xfb, 0x4a, 0xf6, 0x9e, 0x3f, 0xdd, 0x33, 0xc7, 0xe2, 0x8e, 0x83,
- 0x7e, 0xf2, 0xfe, 0xe3, 0xe1, 0xc1, 0xee, 0xe3, 0xe1, 0x63, 0x48, 0x35,
- 0x97, 0x05, 0x22, 0xe3, 0xc7, 0xe3, 0x67, 0x98, 0xd6, 0xdb, 0xe3, 0xa3,
- 0x84, 0x33, 0xf1, 0x09, 0xd5, 0xb4, 0x65, 0x73, 0x71, 0xc2, 0x2e, 0x05,
- 0x8b, 0x86, 0xea, 0x31, 0x66, 0x66, 0x0d, 0xfc, 0x15, 0x01, 0x39, 0x12,
- 0xb5, 0x25, 0x08, 0x84, 0x67, 0x69, 0x67, 0x02, 0x79, 0xc7, 0x66, 0x85,
- 0x50, 0xc6, 0xfc, 0x26, 0x2c, 0xa9, 0xf5, 0x68, 0xe2, 0x51, 0xec, 0x9e,
- 0x7a, 0x99, 0xc7, 0xdd, 0xfb, 0xa3, 0xe6, 0x4b, 0x87, 0x01, 0xe4, 0x9c,
- 0xf8, 0x81, 0x9d, 0x23, 0xf2, 0xd0, 0x1a, 0xa5, 0x55, 0x52, 0x4e, 0x16,
- 0xd6, 0x24, 0x99, 0xfd, 0x6d, 0xba, 0x1c, 0xfe, 0x52, 0x7b, 0x2a, 0xa2,
- 0x10, 0x37, 0xcd, 0x26, 0x9e, 0xbb, 0x08, 0x6a, 0x31, 0x97, 0xba, 0x56,
- 0xc4, 0x26, 0x52, 0xdb, 0x59, 0x46, 0x0c, 0x80, 0xb3, 0xcc, 0x06, 0x94,
- 0x37, 0x90, 0x1d, 0x7d, 0xd3, 0xe0, 0x11, 0x83, 0xdc, 0x7d, 0x6b, 0xb7,
- 0xcc, 0xd2, 0xb9, 0xbc, 0x28, 0xa6, 0x1b, 0x05, 0xe7, 0x83, 0x5f, 0xce,
- 0xa8, 0x5f, 0x66, 0x15, 0x20, 0x4e, 0x72, 0xcb, 0x06, 0x0b, 0xc1, 0xca,
- 0x4f, 0xdb, 0xbc, 0x53, 0xd7, 0x9a, 0x6a, 0x55, 0x9a, 0xeb, 0x24, 0x5f,
- 0x19, 0x51, 0xf8, 0x80, 0x62, 0xa9, 0xee, 0xcd, 0xbf, 0x57, 0xde, 0x39,
- 0x71, 0x11, 0xed, 0xaf, 0xcb, 0xc8, 0x24, 0xe4, 0x7a, 0x2c, 0xc2, 0x4e,
- 0x5e, 0x22, 0x41, 0x1a, 0x72, 0xae, 0x63, 0x40, 0x60, 0xc1, 0x88, 0x38,
- 0x73, 0xe9, 0x0a, 0xed, 0x8c, 0x40, 0x63, 0x49, 0x2a, 0xc0, 0x2b, 0x7c,
- 0x73, 0x2e, 0xac, 0xa6, 0x83, 0x4a, 0x0d, 0xff, 0xce, 0x50, 0xcd, 0xa8,
- 0x4d, 0xc2, 0xdd, 0x8a, 0xc4, 0x7b, 0x45, 0xef, 0x6f, 0x21, 0x0c, 0xa1,
- 0xc2, 0xb1, 0x9f, 0xe1, 0x1e, 0x65, 0x2e, 0x68, 0x46, 0xe7, 0x5f, 0x16,
- 0xc9, 0x36, 0x25, 0xb8, 0x65, 0x3e, 0x4a, 0xaf, 0x26, 0x4c, 0x85, 0xce,
- 0x22, 0x9b, 0x0c, 0xb3, 0x73, 0xaf, 0x61, 0x65, 0xd5, 0xbe, 0x84, 0x4b,
- 0x63, 0x48, 0xf1, 0x0b, 0xe4, 0xec, 0xff, 0x13, 0x6a, 0xe0, 0x93, 0xc4,
- 0xee, 0xd5, 0x43, 0xb4, 0x41, 0x6e, 0x15, 0x41, 0xda, 0x60, 0xe0, 0x7a,
- 0xf4, 0x4c, 0xae, 0xff, 0x5f, 0x1b, 0xfc, 0x3f, 0x49, 0x1b, 0xfc, 0xc5,
- 0xa7, 0xb4, 0x71, 0x48, 0x07, 0x52, 0xaa, 0x61, 0xcf, 0xa5, 0x3b, 0x89,
- 0xf1, 0x0a, 0xaa, 0xf9, 0xdd, 0x03, 0x0f, 0x68, 0xfb, 0x84, 0x26, 0x21,
- 0x2b, 0xfc, 0xbf, 0x71, 0x44, 0x1f, 0x74, 0x32, 0xff, 0x7f, 0xdf, 0xc7,
- 0x7f, 0xb7, 0x73, 0xd8, 0xad, 0x0d, 0x6e, 0x1b, 0x26, 0xbb, 0x41, 0x8e,
- 0x1e, 0x37, 0x6f, 0x24, 0x3b, 0x7b, 0xc7, 0x69, 0x3e, 0x28, 0x2f, 0x66,
- 0xda, 0x9d, 0x9c, 0x7f, 0xff, 0xb4, 0x4f, 0xa1, 0xde, 0x51, 0x3b, 0xaf,
- 0xa5, 0x4c, 0x4e, 0x5f, 0xbd, 0x3c, 0xff, 0x05, 0xa7, 0xfd, 0xcf, 0xe4,
- 0x85, 0x5e, 0x65, 0xd9, 0x74, 0xc0, 0x21, 0xc4, 0x17, 0xf4, 0x8f, 0x48,
- 0xec, 0x3d, 0xb5, 0x70, 0x41, 0xc4, 0xb6, 0x88, 0x2c, 0x86, 0x19, 0x0d,
- 0xf4, 0xb2, 0x51, 0x53, 0x96, 0x02, 0xe2, 0xb5, 0xa2, 0x3e, 0xf2, 0x81,
- 0x8f, 0xa5, 0x58, 0x4e, 0x77, 0xb8, 0x7a, 0x99, 0xbe, 0x4c, 0xac, 0x22,
- 0x89, 0x28, 0x38, 0xdf, 0x97, 0x80, 0xf9, 0xb4, 0x48, 0xc8, 0xde, 0x33,
- 0x74, 0xf0, 0xc3, 0xb6, 0x30, 0x7c, 0x08, 0xee, 0xdc, 0x52, 0x38, 0xfa,
- 0xc9, 0x70, 0x9c, 0x07, 0x8f, 0xe0, 0x7f, 0x27, 0x29, 0x92, 0xd5, 0x9f,
- 0x10, 0x3e, 0xa8, 0xfd, 0xf9, 0xae, 0xcc, 0x9a, 0x8d, 0xa4, 0xf4, 0x77,
- 0xa2, 0x41, 0x41, 0x04, 0xcb, 0x39, 0x74, 0xd8, 0x96, 0x41, 0x3e, 0x7d,
- 0x38, 0x97, 0x84, 0xe7, 0x6b, 0x3f, 0xd1, 0xa4, 0xe6, 0xc9, 0xcc, 0x7f,
- 0x21, 0xb0, 0xa8, 0xb9, 0xca, 0x56, 0xd3, 0xb0, 0x24, 0xed, 0xca, 0x9f,
- 0x95, 0xc4, 0xfc, 0xd0, 0xf0, 0x47, 0xbd, 0xfb, 0xae, 0x50, 0xea, 0xcf,
- 0x61, 0x92, 0xb8, 0xf7, 0xee, 0xe6, 0xcc, 0xe6, 0x62, 0x59, 0x97, 0xe8,
- 0x98, 0xe4, 0x65, 0x81, 0xd2, 0x41, 0x5e, 0x57, 0x5e, 0xe9, 0x17, 0x20,
- 0xd5, 0x67, 0xd4, 0x59, 0x0d, 0x54, 0x0b, 0xfb, 0x07, 0xf3, 0xf9, 0x4e,
- 0xb2, 0x7a, 0x32, 0x74, 0x7b, 0x4b, 0x98, 0xac, 0xe6, 0x97, 0x13, 0xa3,
- 0xe4, 0x12, 0xd7, 0x19, 0x09, 0xdb, 0x4f, 0x38, 0xd7, 0x03, 0x26, 0x4f,
- 0x87, 0xaf, 0x42, 0x93, 0x62, 0x3e, 0x7d, 0xbf, 0xc9, 0xcd, 0x0d, 0x5d,
- 0x43, 0x4c, 0x1c, 0x35, 0x4f, 0xac, 0x58, 0x48, 0x8d, 0x38, 0x23, 0x34,
- 0x19, 0xea, 0xfa, 0x8e, 0x40, 0xf0, 0x6c, 0x9e, 0xde, 0x48, 0x81, 0x6f,
- 0x5b, 0xde, 0x8f, 0x4e, 0x0f, 0xb8, 0x90, 0xe1, 0xe2, 0x74, 0xe4, 0x37,
- 0x04, 0xa9, 0x28, 0x2e, 0x4f, 0x15, 0xdd, 0x5f, 0x1f, 0xbf, 0x1c, 0x5d,
- 0x0c, 0x23, 0x6b, 0x0c, 0x73, 0xa7, 0x1c, 0xc4, 0x03, 0x90, 0x1a, 0xe7,
- 0xe9, 0x1d, 0xe0, 0x80, 0xa5, 0x4e, 0x1c, 0x73, 0xe3, 0xa9, 0xe9, 0xd8,
- 0x30, 0x73, 0xb9, 0xa2, 0x8d, 0xb2, 0xef, 0xc2, 0xec, 0x24, 0x43, 0x3b,
- 0xc9, 0x1f, 0xb6, 0xb9, 0xcb, 0xc4, 0x5a, 0x04, 0x3b, 0x52, 0xcc, 0x91,
- 0x53, 0x80, 0xef, 0x34, 0x3d, 0x11, 0xa8, 0xb3, 0x10, 0x2c, 0x96, 0x6e,
- 0x64, 0x05, 0xa3, 0x77, 0x14, 0xe8, 0x67, 0x67, 0xe7, 0xaa, 0xb4, 0xe2,
- 0xa8, 0xb3, 0xd7, 0x82, 0x14, 0x80, 0x6d, 0x40, 0xa5, 0x0a, 0xab, 0x58,
- 0xd2, 0xea, 0xa3, 0x46, 0x76, 0xa9, 0x51, 0x32, 0x82, 0xc6, 0x1b, 0x53,
- 0xe9, 0xdb, 0x96, 0x90, 0xd9, 0x68, 0x02, 0xf9, 0x40, 0xb9, 0x67, 0x50,
- 0xed, 0x05, 0x07, 0xc0, 0x32, 0x9b, 0xef, 0x6c, 0xd8, 0x71, 0xcd, 0x21,
- 0xf1, 0x1b, 0x39, 0x63, 0xb4, 0x78, 0xf3, 0xc8, 0x64, 0x72, 0x95, 0x99,
- 0x5b, 0x64, 0xe8, 0x41, 0xd5, 0x3c, 0x98, 0x20, 0x9f, 0x05, 0x78, 0xa6,
- 0x11, 0xf2, 0xfc, 0x62, 0x82, 0x3c, 0x7e, 0x1c, 0x12, 0xa4, 0xcc, 0xfe,
- 0x36, 0x8d, 0x35, 0x77, 0xa0, 0xa2, 0x3a, 0xaa, 0xe7, 0xe3, 0x3a, 0xb8,
- 0x77, 0xdc, 0xa1, 0x02, 0x53, 0xdd, 0x45, 0x8f, 0x36, 0x2d, 0x0f, 0x72,
- 0xe8, 0xa0, 0x30, 0xb0, 0x11, 0x80, 0x0c, 0x6e, 0x7d, 0x8b, 0x22, 0xec,
- 0xf5, 0x13, 0xce, 0xe3, 0xf8, 0x46, 0x52, 0xb4, 0x21, 0x1f, 0xd9, 0x28,
- 0xb2, 0x90, 0xd5, 0x42, 0x9d, 0xbe, 0x50, 0x33, 0x6f, 0xcf, 0xce, 0x60,
- 0x30, 0xab, 0x57, 0x76, 0x61, 0x1b, 0xb9, 0xe3, 0x51, 0x8c, 0x18, 0x60,
- 0x0d, 0x23, 0x07, 0xaa, 0x1a, 0x35, 0x9e, 0x66, 0x2a, 0xbf, 0x86, 0x4d,
- 0xa4, 0x6b, 0x5c, 0xa3, 0x8f, 0xf8, 0xbd, 0x6c, 0x22, 0x19, 0x39, 0x48,
- 0xaf, 0x97, 0x84, 0xdd, 0xe9, 0x9a, 0x72, 0x8b, 0x16, 0x39, 0xf5, 0x1f,
- 0xd9, 0x2d, 0x66, 0x33, 0xaa, 0x3a, 0x36, 0x4c, 0x58, 0x97, 0xb9, 0x51,
- 0xf0, 0x43, 0x57, 0x1f, 0xa1, 0x47, 0xbb, 0xca, 0x2d, 0xfe, 0xa6, 0xfb,
- 0x06, 0xd7, 0x75, 0x6e, 0x4c, 0xd8, 0x0e, 0x69, 0xd2, 0xc1, 0x0e, 0x17,
- 0xe5, 0x9d, 0xba, 0x68, 0x36, 0x72, 0x44, 0x98, 0x8c, 0x8a, 0xc6, 0x6a,
- 0x95, 0xf8, 0x6b, 0x08, 0x9c, 0x92, 0x18, 0xff, 0xe1, 0xcc, 0x11, 0x0a,
- 0x54, 0x62, 0x15, 0x3f, 0x58, 0x6c, 0x79, 0x40, 0xae, 0x35, 0x0d, 0x18,
- 0x0b, 0x57, 0xd0, 0x4c, 0xa5, 0x76, 0x2d, 0x90, 0x80, 0xcb, 0x3a, 0x99,
- 0x9b, 0x4b, 0x64, 0x4e, 0x28, 0x1e, 0xd9, 0x72, 0x52, 0xde, 0xad, 0xfc,
- 0x0e, 0x2d, 0xd3, 0x7b, 0xac, 0x9a, 0x7b, 0xb8, 0xb2, 0x51, 0x00, 0xba,
- 0x67, 0xe4, 0xff, 0x4e, 0xa8, 0x93, 0xa6, 0x7a, 0xe9, 0xb1, 0xc1, 0x46,
- 0xc6, 0x48, 0xed, 0x57, 0x85, 0xc1, 0xb8, 0xd3, 0xcb, 0x8c, 0x2b, 0x20,
- 0x14, 0x4e, 0x67, 0x16, 0x3a, 0xd5, 0x41, 0x5a, 0x5b, 0xf4, 0xf5, 0xe0,
- 0xd3, 0xb0, 0xdf, 0x67, 0x7a, 0x5d, 0xef, 0x07, 0x07, 0x60, 0x74, 0xba,
- 0x43, 0x75, 0x27, 0xa8, 0xc4, 0x69, 0xb8, 0xea, 0x20, 0xc4, 0xb4, 0x0b,
- 0xe5, 0x3e, 0xb3, 0xb3, 0xf5, 0x0f, 0x6b, 0xe9, 0x55, 0x1a, 0x64, 0x98,
- 0x11, 0xfc, 0x07, 0xcb, 0x3f, 0x86, 0x61, 0x18, 0x99, 0xbb, 0x86, 0xd3,
- 0x3e, 0xd5, 0xd7, 0x26, 0x5d, 0xb3, 0x2d, 0xba, 0x85, 0x79, 0xfa, 0x7a,
- 0x3f, 0xe9, 0xea, 0x36, 0x32, 0x94, 0xdf, 0x13, 0x52, 0xc9, 0x34, 0xa3,
- 0x86, 0x1d, 0x0a, 0x98, 0x8c, 0x32, 0x5d, 0xe6, 0x36, 0x4a, 0x7b, 0x86,
- 0xc7, 0xfe, 0xe9, 0xde, 0xb3, 0xa7, 0x3b, 0xd1, 0xc4, 0x03, 0x66, 0x26,
- 0xd4, 0xaf, 0xd7, 0xf5, 0x0a, 0x18, 0x0c, 0xc2, 0x46, 0xf8, 0xe7, 0xfe,
- 0xd0, 0xa7, 0x51, 0xd8, 0xc0, 0xaa, 0x7d, 0x4d, 0x2f, 0xa7, 0x60, 0x08,
- 0x90, 0x41, 0x5b, 0xfa, 0x80, 0x51, 0x78, 0x61, 0xb0, 0xee, 0x44, 0xee,
- 0x11, 0x23, 0x87, 0x66, 0x72, 0xd0, 0x6e, 0x84, 0xcc, 0xe6, 0xc1, 0x81,
- 0x4e, 0xe0, 0x80, 0x67, 0xe6, 0xf5, 0x60, 0xe6, 0x99, 0xd2, 0xdf, 0x87,
- 0xcd, 0x7f, 0xf9, 0x01, 0x5e, 0x37, 0xc0, 0xaf, 0xdb, 0xe5, 0x83, 0x4f,
- 0xbd, 0xcb, 0x07, 0xf7, 0xec, 0xf2, 0xc1, 0x43, 0x77, 0xf9, 0xd9, 0x93,
- 0xa7, 0x9f, 0xff, 0xba, 0x5d, 0xf6, 0x88, 0xfc, 0xbf, 0x67, 0x97, 0x3d,
- 0x36, 0xfb, 0x75, 0xbb, 0x2c, 0x89, 0x32, 0x41, 0xe1, 0xa0, 0x94, 0x05,
- 0x51, 0xe2, 0x2f, 0xea, 0x9e, 0x38, 0x61, 0x9b, 0x1f, 0x0e, 0x6b, 0x6a,
- 0xa5, 0xc5, 0x30, 0xb7, 0x36, 0x35, 0xaa, 0x69, 0xc4, 0xf1, 0xe0, 0xf0,
- 0xa3, 0x48, 0xe7, 0x5f, 0xcd, 0xd1, 0x20, 0x73, 0x6b, 0xb0, 0xa5, 0xe1,
- 0x7c, 0xad, 0x91, 0xf7, 0x8a, 0xac, 0x38, 0x51, 0xe9, 0x9f, 0x08, 0x9d,
- 0x19, 0xe6, 0x11, 0x79, 0x99, 0x60, 0x4d, 0xa2, 0xdd, 0x99, 0x4b, 0x78,
- 0x10, 0x2d, 0xab, 0xe2, 0x8c, 0xc0, 0x4a, 0xd3, 0x29, 0x19, 0xbd, 0x4f,
- 0x3d, 0x57, 0x63, 0xa3, 0x27, 0x9b, 0x2b, 0x60, 0x89, 0x3c, 0xa7, 0xbb,
- 0x79, 0x26, 0x17, 0x3b, 0xd6, 0x4c, 0x71, 0x0a, 0xb8, 0x37, 0xda, 0x6e,
- 0x72, 0x69, 0x08, 0x67, 0x9b, 0x3e, 0x68, 0x1e, 0xd7, 0x50, 0x42, 0xa9,
- 0x46, 0x69, 0x6d, 0x4c, 0x87, 0x28, 0x67, 0x0e, 0x0a, 0xc7, 0x62, 0x16,
- 0x11, 0x44, 0xb7, 0x4d, 0x49, 0x8f, 0xed, 0x24, 0xc4, 0x8e, 0x06, 0x74,
- 0xb1, 0xa4, 0xbc, 0xa0, 0x17, 0xa1, 0xdd, 0x1a, 0x86, 0xd3, 0xb4, 0xdd,
- 0xf1, 0x6c, 0xf5, 0x06, 0xf9, 0x0c, 0x50, 0xba, 0x11, 0xa0, 0x4d, 0x10,
- 0xd6, 0x90, 0xac, 0x47, 0x9b, 0x28, 0x7a, 0xaf, 0x37, 0x53, 0x99, 0xab,
- 0x7b, 0x4a, 0x8a, 0x90, 0x96, 0x5f, 0x7b, 0xbd, 0x8f, 0xc5, 0x22, 0x7e,
- 0x85, 0xe9, 0x4e, 0xd7, 0x8b, 0x95, 0xe2, 0xdd, 0xa2, 0xfa, 0x2b, 0xa7,
- 0xd4, 0x36, 0x05, 0xbd, 0xe9, 0x2e, 0xc3, 0xd3, 0x62, 0x30, 0x9b, 0xf5,
- 0xc7, 0x7e, 0x3c, 0xdd, 0x2d, 0xc1, 0x6f, 0xd2, 0xc2, 0xc5, 0x93, 0xda,
- 0x01, 0x6d, 0x06, 0xe9, 0x18, 0x38, 0x67, 0x66, 0xda, 0xd3, 0x6c, 0xbc,
- 0xbe, 0x54, 0xd8, 0x18, 0x5b, 0xc6, 0xda, 0xe4, 0x49, 0xaa, 0x4f, 0x03,
- 0x90, 0x1c, 0x20, 0xe1, 0x08, 0xa6, 0x7e, 0x79, 0x17, 0x22, 0x68, 0xd5,
- 0x68, 0xe1, 0x3b, 0xd9, 0x94, 0x30, 0x17, 0x2c, 0x9d, 0x98, 0x3d, 0xef,
- 0x7b, 0x4b, 0xa7, 0x9f, 0x34, 0x76, 0x34, 0xd2, 0x1f, 0xd1, 0x67, 0x95,
- 0x7a, 0xb2, 0x1a, 0xcc, 0x52, 0xe0, 0x4f, 0x07, 0xe8, 0x21, 0x92, 0x24,
- 0x2b, 0x67, 0xe0, 0xe2, 0xe8, 0x3c, 0x79, 0x9d, 0x4a, 0x4f, 0xb9, 0x64,
- 0xdb, 0x48, 0xe0, 0x67, 0x8f, 0xf7, 0x0e, 0x76, 0x36, 0xda, 0x26, 0x4d,
- 0x4c, 0x45, 0xfa, 0xd6, 0xb2, 0x88, 0xe5, 0xf3, 0x5f, 0xac, 0xcb, 0xa5,
- 0x62, 0xb5, 0x99, 0x0f, 0x7d, 0x78, 0x7b, 0xf6, 0xea, 0xf8, 0xf4, 0xe5,
- 0x9f, 0x2d, 0x32, 0x10, 0x68, 0xa0, 0x18, 0x13, 0x1f, 0x8c, 0x45, 0x7f,
- 0xf7, 0xa1, 0xca, 0xcc, 0x94, 0xeb, 0xed, 0x83, 0x1d, 0x42, 0xef, 0x09,
- 0x0a, 0x42, 0x2f, 0xb3, 0x26, 0xa0, 0x12, 0x17, 0x57, 0x6c, 0x40, 0x05,
- 0x64, 0xa7, 0x2d, 0xbc, 0xb6, 0x8f, 0x86, 0x46, 0x3c, 0x4b, 0x2a, 0x2a,
- 0x77, 0xc7, 0x71, 0x4c, 0xea, 0x95, 0x3d, 0xa7, 0x82, 0x1e, 0x2a, 0xf8,
- 0x38, 0x41, 0x85, 0x2b, 0x0a, 0x2a, 0x73, 0x58, 0x70, 0x72, 0xaa, 0x51,
- 0xb4, 0x31, 0x9b, 0x35, 0xb1, 0x87, 0x09, 0xa7, 0x81, 0xaa, 0x39, 0x36,
- 0x3a, 0x18, 0x9b, 0xb2, 0xbf, 0xa6, 0xcb, 0x22, 0x9b, 0x2f, 0xb3, 0x7a,
- 0x20, 0xd3, 0x7a, 0x61, 0xfe, 0xfb, 0xc5, 0x75, 0x3a, 0x0f, 0xd0, 0x3f,
- 0xd0, 0x38, 0x57, 0x79, 0xd3, 0x26, 0x94, 0xe2, 0x4d, 0xaf, 0xad, 0xd6,
- 0xc8, 0xf6, 0x97, 0xd2, 0x27, 0xcd, 0x51, 0x09, 0xda, 0x48, 0x5d, 0x5c,
- 0xfc, 0xf9, 0xfc, 0xf8, 0x8b, 0x17, 0x10, 0x63, 0x5f, 0xa2, 0x34, 0xa7,
- 0x6a, 0x48, 0xb5, 0xa4, 0xbe, 0x5b, 0x85, 0x6e, 0xfa, 0x1f, 0x5f, 0x9d,
- 0x8c, 0xce, 0x4f, 0xcf, 0x8e, 0xbe, 0x78, 0xf1, 0x23, 0x4c, 0x1c, 0x73,
- 0x79, 0xdc, 0x79, 0xef, 0xda, 0x9f, 0xd9, 0x56, 0x39, 0x21, 0x6a, 0xd4,
- 0xf1, 0x0f, 0x1f, 0x8e, 0xdf, 0x7e, 0xff, 0xc5, 0x8b, 0xeb, 0xb4, 0xec,
- 0x63, 0x7d, 0xfc, 0x76, 0x47, 0x57, 0xea, 0x06, 0xab, 0x41, 0x39, 0x1f,
- 0xcf, 0x3f, 0x56, 0xf9, 0xdf, 0xb3, 0xc4, 0xbc, 0x3e, 0x5f, 0x87, 0xbd,
- 0x2a, 0x2e, 0x18, 0x6c, 0xc7, 0x10, 0x03, 0x7f, 0x4b, 0xbe, 0x3e, 0xfd,
- 0x0e, 0x78, 0xe8, 0xd6, 0x79, 0xbc, 0xe0, 0xe6, 0x7a, 0xc9, 0x97, 0x4f,
- 0xf6, 0xf6, 0x77, 0x5c, 0x4b, 0x67, 0xea, 0xa7, 0x60, 0x66, 0xfc, 0x31,
- 0x28, 0x2a, 0xfb, 0xbb, 0x94, 0xc7, 0xb9, 0x6a, 0x8f, 0xda, 0x59, 0x54,
- 0x6c, 0x0a, 0x8a, 0x27, 0x8e, 0x0a, 0x16, 0x28, 0x23, 0x18, 0x1d, 0xb1,
- 0x4b, 0xca, 0xe4, 0x0f, 0xbc, 0x90, 0x17, 0xaf, 0x3d, 0x20, 0xb3, 0xaf,
- 0x1d, 0xe3, 0x99, 0xe9, 0x88, 0x27, 0x73, 0xe3, 0xfd, 0xf8, 0x09, 0xe3,
- 0x5b, 0x6d, 0x33, 0x9b, 0x88, 0x6d, 0x2e, 0x34, 0xe1, 0x9f, 0x38, 0x9d,
- 0xbd, 0x3c, 0x00, 0x2a, 0x90, 0x2b, 0x18, 0x80, 0x97, 0x56, 0xa9, 0x8c,
- 0xa7, 0xe8, 0x31, 0x9b, 0x41, 0x0c, 0x16, 0x00, 0x99, 0x40, 0x15, 0x13,
- 0x3b, 0xbc, 0x3c, 0x77, 0xd6, 0x3c, 0xbb, 0x4c, 0x27, 0x77, 0x89, 0x6d,
- 0x22, 0x60, 0x61, 0xf0, 0xda, 0x32, 0x90, 0xfc, 0x9e, 0x13, 0xd8, 0x72,
- 0x84, 0x84, 0xc0, 0x52, 0x99, 0x21, 0xb3, 0x50, 0xc7, 0xaa, 0xbe, 0xb0,
- 0xc6, 0xec, 0x86, 0x7c, 0x5f, 0x76, 0x63, 0x22, 0xd8, 0xfe, 0xbc, 0x4d,
- 0xee, 0x03, 0xdb, 0x90, 0xf7, 0x60, 0x23, 0x4d, 0x1f, 0x37, 0xa3, 0x08,
- 0x7f, 0xa7, 0x43, 0x0e, 0xa8, 0x45, 0x72, 0x54, 0xbf, 0xc0, 0x5f, 0x3b,
- 0x9b, 0xad, 0xb0, 0x27, 0x87, 0x3a, 0xef, 0xb2, 0xc2, 0x46, 0xcb, 0xb6,
- 0xe5, 0x16, 0xd2, 0xba, 0x0c, 0x2d, 0x3b, 0x6a, 0x75, 0x8b, 0x77, 0x03,
- 0x99, 0x4a, 0x21, 0x30, 0xbc, 0xe3, 0xe6, 0x71, 0xaa, 0xcc, 0x00, 0x6f,
- 0x74, 0x0c, 0x69, 0x6b, 0x57, 0xc3, 0xb0, 0x15, 0xd5, 0x4d, 0x22, 0x3d,
- 0xe3, 0x05, 0x06, 0x82, 0x44, 0x84, 0x4a, 0x62, 0x08, 0xf5, 0xa5, 0x06,
- 0xc2, 0xa8, 0xbb, 0x5d, 0x21, 0xe8, 0x9a, 0xf4, 0x10, 0xa3, 0x85, 0x55,
- 0x11, 0x74, 0x43, 0xce, 0xf8, 0x57, 0xbf, 0x01, 0x27, 0xad, 0x20, 0xc8,
- 0x68, 0x7b, 0x07, 0x98, 0x49, 0x56, 0xaa, 0x95, 0xa2, 0x44, 0x94, 0x8c,
- 0x74, 0x87, 0x2e, 0x1e, 0xeb, 0xc5, 0xad, 0x05, 0x8d, 0xda, 0xf3, 0x81,
- 0x57, 0x25, 0xee, 0x15, 0x9a, 0xcf, 0xf6, 0x02, 0xcb, 0x90, 0x16, 0x34,
- 0xd2, 0xf0, 0x07, 0x9e, 0xd6, 0x10, 0x00, 0x93, 0x54, 0xe8, 0xc6, 0x35,
- 0x65, 0x46, 0xc5, 0x18, 0xb8, 0xa2, 0xcc, 0x0d, 0x45, 0x77, 0x12, 0xfb,
- 0x71, 0x5a, 0xe4, 0x88, 0x14, 0x67, 0xd7, 0x5c, 0xd8, 0xd0, 0xbe, 0xa2,
- 0x80, 0xcd, 0xa0, 0xc5, 0x04, 0x8d, 0x11, 0xa4, 0x0e, 0x9c, 0xda, 0x8d,
- 0x6e, 0x0f, 0x5c, 0x1f, 0xc8, 0xbc, 0xb6, 0x4a, 0x5b, 0x04, 0x57, 0x2d,
- 0xb1, 0xed, 0x2d, 0x2c, 0x3c, 0x27, 0xfb, 0x83, 0x25, 0x06, 0x95, 0x09,
- 0x4b, 0xe0, 0x6b, 0xbb, 0x5c, 0x1a, 0xab, 0x32, 0x28, 0x0f, 0x2b, 0xf3,
- 0x83, 0xb1, 0x96, 0xd9, 0x8d, 0x3f, 0x96, 0x33, 0x3b, 0xec, 0x78, 0x9f,
- 0x32, 0x02, 0x60, 0x6c, 0x26, 0x94, 0xf3, 0x25, 0x2f, 0xbe, 0x3f, 0x7e,
- 0x37, 0x3a, 0x39, 0x7b, 0xfb, 0x65, 0xd4, 0x1c, 0x96, 0x5f, 0xda, 0x7e,
- 0x9e, 0x5a, 0x08, 0xec, 0x7a, 0x2e, 0xc2, 0x0b, 0xa6, 0xbe, 0x16, 0x6e,
- 0xdd, 0x97, 0x2f, 0xf1, 0x48, 0xd0, 0xca, 0x71, 0x92, 0xad, 0x6a, 0xae,
- 0x46, 0x54, 0x53, 0x5a, 0x63, 0x6b, 0xd2, 0xed, 0x8b, 0x8c, 0xb8, 0x47,
- 0x7d, 0xfd, 0xdb, 0x9e, 0xfd, 0xdb, 0x7e, 0xc8, 0xed, 0xfc, 0x8b, 0x83,
- 0xae, 0x42, 0x32, 0xdf, 0xaf, 0x56, 0x71, 0xf1, 0xb7, 0xda, 0xd8, 0x66,
- 0xbe, 0xcd, 0x88, 0x38, 0x1d, 0x5a, 0x42, 0x82, 0x8f, 0x2b, 0xb1, 0x7a,
- 0xb3, 0xb1, 0x02, 0x59, 0x25, 0xff, 0xfe, 0xfe, 0xe4, 0x68, 0xc0, 0x9e,
- 0x69, 0x12, 0x30, 0xbb, 0x86, 0x7f, 0x6d, 0x04, 0x29, 0x98, 0x50, 0x3c,
- 0xab, 0xca, 0x4b, 0x6a, 0x58, 0xaf, 0xb8, 0xa6, 0x15, 0x40, 0x5a, 0x8c,
- 0x03, 0xe3, 0x53, 0x34, 0xe8, 0x16, 0x34, 0x7c, 0xd4, 0x7c, 0xd1, 0x3c,
- 0x7c, 0xbd, 0xe7, 0x95, 0x19, 0xd9, 0xe7, 0xf6, 0x62, 0xcf, 0xed, 0x85,
- 0xcf, 0xed, 0xc7, 0x9e, 0xdb, 0x0f, 0x9f, 0x3b, 0x88, 0x3d, 0xe7, 0x6d,
- 0x80, 0xe7, 0x89, 0x94, 0x9d, 0xdc, 0x64, 0xaa, 0x37, 0xfe, 0x75, 0x30,
- 0x74, 0xfc, 0xf8, 0x99, 0x75, 0x9f, 0xb4, 0xdb, 0xa3, 0xff, 0x22, 0x4f,
- 0x83, 0x5e, 0x1c, 0x3a, 0x9c, 0x51, 0x5b, 0x5b, 0x71, 0x00, 0xf3, 0xbd,
- 0xbd, 0x83, 0xc1, 0x24, 0x5f, 0x5d, 0xe1, 0x22, 0x7c, 0x21, 0x7f, 0x59,
- 0x03, 0xb6, 0x1c, 0x2e, 0xe3, 0x50, 0x19, 0x3a, 0x1d, 0xed, 0x24, 0x1e,
- 0x32, 0x9e, 0x80, 0x41, 0xd3, 0x6b, 0x09, 0xbd, 0x57, 0x39, 0x5c, 0xbc,
- 0xd0, 0xf3, 0x1f, 0xd4, 0x20, 0x59, 0x0f, 0x92, 0x79, 0x0f, 0x3b, 0x4e,
- 0x64, 0xb8, 0xf0, 0x5a, 0x9b, 0xea, 0xd4, 0x64, 0x6c, 0xc6, 0x6f, 0xd7,
- 0x9c, 0x88, 0xb6, 0x7f, 0x99, 0xba, 0x29, 0xe9, 0x2b, 0x8a, 0xa6, 0x8a,
- 0x2e, 0xa0, 0x4b, 0x1d, 0xbc, 0x31, 0x55, 0xab, 0xf7, 0x17, 0xd1, 0xfb,
- 0xfa, 0xfd, 0xbb, 0xd3, 0x40, 0xbf, 0x4d, 0xe0, 0x1c, 0xaa, 0x0e, 0x77,
- 0x77, 0x41, 0xf9, 0xe1, 0x55, 0x7a, 0x7b, 0x3b, 0xac, 0xb2, 0x5d, 0x23,
- 0xd4, 0xaa, 0x5d, 0xf2, 0x3a, 0xcb, 0xa7, 0xaf, 0xea, 0xc5, 0xfc, 0x1e,
- 0x84, 0x25, 0x41, 0x2f, 0x67, 0xd4, 0xdf, 0x29, 0x23, 0x63, 0xb8, 0x2a,
- 0x7a, 0x12, 0x0a, 0xe2, 0x17, 0x83, 0x6f, 0x20, 0xac, 0xc1, 0x93, 0x9e,
- 0xdd, 0xe0, 0x71, 0xc3, 0x56, 0xe6, 0xbe, 0xa0, 0x6b, 0xdb, 0x82, 0x81,
- 0xa7, 0x04, 0xbc, 0xcf, 0x29, 0x29, 0x0e, 0xab, 0x0d, 0x2f, 0xa0, 0xe4,
- 0x39, 0x0b, 0xe2, 0x4c, 0x16, 0x94, 0xad, 0xa4, 0xf6, 0x2b, 0xe4, 0xb1,
- 0x88, 0xd1, 0xac, 0xf2, 0x23, 0x52, 0x14, 0xc4, 0xe5, 0x25, 0x47, 0x75,
- 0x9d, 0x4f, 0x2c, 0xb9, 0x91, 0x2b, 0x09, 0x8b, 0xc2, 0xe8, 0x3d, 0xe6,
- 0xcf, 0x2f, 0x43, 0x60, 0x80, 0x84, 0x96, 0x10, 0xe4, 0x54, 0xc2, 0x08,
- 0x41, 0x35, 0x1e, 0xd3, 0x9f, 0xbf, 0xe7, 0x37, 0x62, 0x22, 0x1b, 0x27,
- 0x1a, 0xb0, 0xa1, 0x6d, 0xe9, 0x8d, 0xde, 0x9d, 0xf7, 0xfa, 0x9c, 0x48,
- 0x8b, 0x0f, 0x0c, 0xcc, 0xbf, 0x13, 0x32, 0x75, 0xd1, 0xc8, 0xed, 0xc9,
- 0xe3, 0x1d, 0x0e, 0xe0, 0xf2, 0x1c, 0xb9, 0xa6, 0x35, 0x8c, 0xeb, 0xd1,
- 0x2f, 0x6d, 0xd6, 0x27, 0xf7, 0x3b, 0x77, 0x65, 0xc2, 0x46, 0x42, 0x37,
- 0x57, 0xc8, 0xf9, 0x58, 0x7d, 0xd7, 0xe2, 0x23, 0xae, 0x5b, 0x5a, 0x80,
- 0x61, 0xc3, 0x33, 0x34, 0xcd, 0x61, 0x2b, 0x72, 0x56, 0x94, 0x1f, 0xa5,
- 0xe9, 0x94, 0x44, 0x5a, 0x58, 0xa0, 0xb4, 0x17, 0xcb, 0x02, 0xc6, 0x4a,
- 0x18, 0x9f, 0x1b, 0xb9, 0x26, 0x5d, 0x97, 0x2d, 0x14, 0x53, 0xc0, 0xd5,
- 0x8e, 0x66, 0xf6, 0xca, 0xab, 0x86, 0x60, 0xdf, 0x2c, 0xd7, 0xd8, 0x13,
- 0x1a, 0xa5, 0x35, 0xc8, 0x3d, 0xd8, 0x68, 0x8f, 0x5b, 0xbb, 0xaf, 0xc4,
- 0x8b, 0x6c, 0xbb, 0xa5, 0x2b, 0xb6, 0x88, 0xcc, 0x2a, 0x85, 0x7d, 0xc6,
- 0xb7, 0xdb, 0xd5, 0x0d, 0x16, 0x83, 0xb6, 0xab, 0xcc, 0x4f, 0xf1, 0x7f,
- 0xbc, 0x0d, 0x19, 0x6a, 0x54, 0x54, 0x44, 0xb3, 0xdb, 0x6b, 0xaf, 0xf3,
- 0x52, 0xdc, 0x3e, 0x51, 0xe5, 0xd4, 0xe5, 0x15, 0xa9, 0xe0, 0xbb, 0x77,
- 0xfd, 0xfe, 0xf2, 0xe9, 0x63, 0xd1, 0xc4, 0x79, 0x62, 0x7c, 0xcd, 0x2c,
- 0x4e, 0x1e, 0x44, 0x03, 0x21, 0xc1, 0xaf, 0xa4, 0x80, 0xd8, 0x4f, 0x6d,
- 0x96, 0x26, 0xef, 0x7a, 0xc0, 0xa9, 0x9f, 0x82, 0x2e, 0x0d, 0xc2, 0xe0,
- 0xd2, 0x8d, 0x5f, 0x5b, 0x12, 0xd4, 0xf0, 0x63, 0x1a, 0x9e, 0x96, 0x41,
- 0x5a, 0x85, 0xca, 0xd1, 0x87, 0x15, 0xd3, 0x48, 0x74, 0x03, 0x83, 0x68,
- 0x3f, 0xae, 0x10, 0xd7, 0x0a, 0x4e, 0x61, 0xf9, 0x04, 0x59, 0x30, 0xfc,
- 0xf9, 0x20, 0x74, 0x68, 0x35, 0x63, 0x71, 0x3d, 0x72, 0x91, 0x42, 0x6b,
- 0xb8, 0x0f, 0x38, 0xba, 0x1f, 0x44, 0xac, 0x91, 0x9a, 0x08, 0x51, 0x41,
- 0x00, 0xd0, 0x39, 0xda, 0x08, 0xa5, 0xa4, 0xa1, 0x21, 0x1c, 0x52, 0x51,
- 0x03, 0xb4, 0x7b, 0x4a, 0xfa, 0x31, 0x8c, 0x39, 0xe3, 0x65, 0x0a, 0x48,
- 0x2c, 0x76, 0x38, 0xab, 0x42, 0xdc, 0x82, 0x08, 0xa5, 0xf6, 0x57, 0x56,
- 0xef, 0x15, 0xaa, 0x05, 0xe6, 0xcd, 0x7d, 0x45, 0xf0, 0xa1, 0xf2, 0x01,
- 0x9d, 0xe8, 0x57, 0x6e, 0xd6, 0xde, 0xff, 0x61, 0x9b, 0xb5, 0xf7, 0x7f,
- 0xc3, 0x66, 0xed, 0xff, 0xca, 0xcd, 0xda, 0xff, 0x3f, 0x6c, 0xb3, 0xf6,
- 0xff, 0x6f, 0xd8, 0xac, 0x83, 0x5f, 0xb9, 0x59, 0x07, 0xbf, 0xfd, 0x66,
- 0xfd, 0x77, 0x33, 0x48, 0xdf, 0x62, 0xc2, 0x74, 0x6d, 0xa9, 0x92, 0xab,
- 0x19, 0xef, 0x56, 0x05, 0x34, 0x7a, 0x2e, 0x3c, 0x4f, 0xf8, 0xbd, 0xa8,
- 0xcc, 0xd5, 0x2f, 0xc0, 0xfe, 0x73, 0xb1, 0xda, 0x78, 0x80, 0x3d, 0xd2,
- 0x6c, 0x04, 0xe9, 0x27, 0xd0, 0x7a, 0x9b, 0x9b, 0x71, 0xdb, 0x8c, 0xb4,
- 0xc7, 0x36, 0x41, 0xfc, 0x3a, 0xe1, 0x36, 0x70, 0x4a, 0x89, 0x20, 0x57,
- 0x31, 0x6b, 0x5b, 0xaf, 0x03, 0xd9, 0xd0, 0x81, 0x47, 0xe1, 0x2a, 0xbf,
- 0x04, 0xfc, 0xe1, 0xaf, 0x88, 0x96, 0x7b, 0xc1, 0xe9, 0xff, 0x3d, 0xd1,
- 0xf2, 0x07, 0x99, 0xd8, 0xfe, 0x19, 0x29, 0x07, 0xda, 0x13, 0x34, 0xde,
- 0x78, 0xc4, 0x79, 0x4b, 0x51, 0xf2, 0x45, 0xc8, 0xc4, 0x53, 0x46, 0x05,
- 0x43, 0xf6, 0xd0, 0xb1, 0xbc, 0xeb, 0x02, 0x96, 0xcc, 0x7c, 0x21, 0xe4,
- 0x96, 0x54, 0x54, 0x5a, 0x84, 0x29, 0x05, 0x30, 0xe1, 0x55, 0x56, 0x9c,
- 0x06, 0xb9, 0x5e, 0xea, 0x47, 0x24, 0x07, 0x98, 0x00, 0x4d, 0x09, 0xef,
- 0x2e, 0x48, 0xa9, 0x50, 0xc0, 0xdb, 0xfc, 0x3e, 0x95, 0xf9, 0x69, 0x73,
- 0xbd, 0xe9, 0x24, 0x1b, 0xa4, 0xd5, 0x24, 0xcf, 0xe3, 0x3d, 0xc9, 0x35,
- 0xb6, 0x9d, 0x26, 0xb3, 0x35, 0x45, 0x25, 0xcc, 0xf3, 0x09, 0xe2, 0x88,
- 0x58, 0x01, 0x37, 0x60, 0x15, 0x80, 0x30, 0x4c, 0xd8, 0x1c, 0xda, 0xcb,
- 0x42, 0x03, 0x14, 0xfd, 0x88, 0xb3, 0x13, 0xe7, 0x92, 0x5b, 0x6a, 0x30,
- 0xf6, 0x2d, 0xa0, 0x8a, 0xbc, 0x6e, 0xa6, 0x7d, 0x8d, 0x34, 0xb1, 0xf7,
- 0x50, 0xc3, 0xc1, 0x8c, 0xb8, 0x0a, 0x91, 0xd9, 0x6e, 0x34, 0x33, 0xe8,
- 0xc1, 0x55, 0x6b, 0xdb, 0x40, 0x02, 0x95, 0x36, 0x95, 0x1a, 0x17, 0x79,
- 0x59, 0x61, 0xae, 0x3a, 0x52, 0x0b, 0x34, 0x34, 0x63, 0x58, 0xe8, 0x4e,
- 0x5b, 0x2b, 0x50, 0xa7, 0x2b, 0x0d, 0xba, 0x42, 0xe2, 0x9b, 0x23, 0x28,
- 0xb0, 0xb2, 0x5c, 0x3d, 0x93, 0xdd, 0x72, 0xc1, 0x70, 0x68, 0xc1, 0xb1,
- 0xc5, 0x78, 0xa5, 0xc5, 0xb4, 0x2f, 0x47, 0x47, 0x27, 0x27, 0x8d, 0xe2,
- 0x62, 0x90, 0x8e, 0xb1, 0xd9, 0x19, 0xff, 0xa5, 0x02, 0x48, 0x3d, 0xc1,
- 0xc6, 0xc4, 0x32, 0x0b, 0xb8, 0xc9, 0xb1, 0x39, 0x7e, 0x14, 0x4d, 0x32,
- 0x82, 0x20, 0xd7, 0x16, 0xd4, 0xa9, 0xd8, 0x31, 0x4b, 0x33, 0xcd, 0x1c,
- 0x60, 0x7b, 0x57, 0xeb, 0x45, 0xba, 0xfc, 0xf4, 0x60, 0x81, 0x8d, 0x66,
- 0x26, 0xb6, 0x64, 0x47, 0xa8, 0xc5, 0xe7, 0xca, 0x8f, 0x5f, 0x87, 0xbc,
- 0x16, 0xe9, 0x28, 0x75, 0x5e, 0x4a, 0xbf, 0x61, 0x42, 0x14, 0xa4, 0x18,
- 0x02, 0x77, 0x85, 0x32, 0x2b, 0x25, 0x68, 0x53, 0x1e, 0xdc, 0x2c, 0x57,
- 0xa3, 0xe2, 0x94, 0xf9, 0x68, 0x03, 0x66, 0x6d, 0xbf, 0x22, 0x87, 0x06,
- 0x37, 0x0a, 0xe6, 0xbd, 0xf6, 0xdd, 0x48, 0x5f, 0xf8, 0x67, 0x9e, 0x80,
- 0xc6, 0x11, 0xb8, 0xff, 0x0c, 0xf0, 0x11, 0xf8, 0x2d, 0x4e, 0x80, 0x14,
- 0x8c, 0xf5, 0xfe, 0xd0, 0xeb, 0xe8, 0x39, 0xf6, 0x80, 0x71, 0x1a, 0x40,
- 0x3b, 0xff, 0x5c, 0x4e, 0x8b, 0x20, 0xff, 0x78, 0x42, 0xcc, 0xdf, 0xd3,
- 0xf5, 0x32, 0xbf, 0xa5, 0xca, 0x1d, 0xa3, 0x4c, 0xbd, 0x40, 0xbf, 0xad,
- 0x8e, 0x5e, 0x52, 0x47, 0xac, 0x80, 0x24, 0x5a, 0x87, 0x44, 0xab, 0x78,
- 0x6f, 0x5e, 0x36, 0xca, 0xc8, 0x02, 0x39, 0x4b, 0x3c, 0x46, 0xdf, 0x6f,
- 0xea, 0x41, 0x62, 0x3d, 0x92, 0xf3, 0xb4, 0xcc, 0x6a, 0x98, 0xaa, 0x1b,
- 0xa3, 0x75, 0xcd, 0x08, 0xe8, 0x05, 0x21, 0xbf, 0xad, 0x50, 0x1c, 0x32,
- 0xa0, 0x00, 0x5c, 0x94, 0x09, 0x89, 0x18, 0xae, 0x18, 0xa3, 0x19, 0x14,
- 0xf1, 0xda, 0x47, 0x0a, 0xeb, 0xe8, 0xb5, 0xcf, 0xed, 0xc4, 0xa2, 0xe9,
- 0x59, 0xb6, 0xf1, 0x9d, 0x6b, 0x1b, 0x99, 0xb7, 0xa3, 0x2d, 0xd4, 0x98,
- 0xd0, 0x85, 0xa4, 0xa5, 0xa5, 0x73, 0x78, 0x77, 0xb7, 0xfa, 0x57, 0x0e,
- 0x93, 0xb7, 0x67, 0x17, 0xc7, 0x7c, 0x3e, 0x1b, 0xed, 0x35, 0x09, 0x98,
- 0x32, 0x27, 0x60, 0xf4, 0x5d, 0x4d, 0xd9, 0x98, 0x87, 0x35, 0x16, 0xae,
- 0x67, 0xa3, 0xc8, 0x3a, 0x54, 0xf4, 0x51, 0xe0, 0x16, 0xff, 0x3e, 0x62,
- 0x85, 0x9e, 0x95, 0x88, 0xe6, 0x2a, 0xb8, 0x1b, 0x71, 0x5b, 0x7d, 0xf1,
- 0x62, 0xea, 0x57, 0xf9, 0xf2, 0xa3, 0x9d, 0x57, 0xc9, 0x8c, 0xe8, 0xbe,
- 0xa6, 0xb9, 0x6a, 0xad, 0x46, 0x74, 0x41, 0xfe, 0xba, 0xed, 0xf9, 0x28,
- 0xba, 0x14, 0x83, 0x0d, 0xa3, 0xa4, 0x12, 0x9d, 0xaf, 0x90, 0x7b, 0x98,
- 0x2a, 0xe0, 0x30, 0x6f, 0x6c, 0x82, 0xe0, 0xb0, 0xd6, 0x6e, 0x07, 0x60,
- 0xca, 0xf9, 0x7c, 0xe8, 0x57, 0xc7, 0x88, 0xe7, 0x57, 0x8b, 0xf2, 0xb6,
- 0x8d, 0x76, 0xce, 0x9a, 0x1b, 0x1f, 0x1e, 0x74, 0xad, 0xd2, 0xce, 0x22,
- 0xdd, 0x5d, 0x27, 0xe2, 0x30, 0x5e, 0xcd, 0xac, 0x3c, 0x88, 0x8e, 0xed,
- 0x54, 0x11, 0x6d, 0x11, 0x00, 0xdc, 0x51, 0xb5, 0xd3, 0x1c, 0xf1, 0x7c,
- 0xe9, 0xf3, 0x7b, 0x1a, 0x0d, 0xf8, 0xca, 0xbd, 0xfc, 0x52, 0x5a, 0xa2,
- 0x64, 0xea, 0x37, 0xf5, 0xbe, 0x31, 0x34, 0x52, 0xc6, 0x7c, 0x44, 0xbf,
- 0x22, 0x45, 0x51, 0x3b, 0x01, 0x50, 0xdf, 0x1d, 0x4d, 0xdd, 0xaf, 0x33,
- 0xf7, 0x5b, 0xf6, 0x60, 0xaa, 0xad, 0xa9, 0x51, 0xae, 0x38, 0x25, 0x53,
- 0x84, 0x27, 0x91, 0xc0, 0x28, 0x60, 0x85, 0x50, 0xe7, 0xba, 0x52, 0xba,
- 0xdf, 0x49, 0xfe, 0xb8, 0x48, 0x33, 0x41, 0x0d, 0xe6, 0xe1, 0xd8, 0x97,
- 0x99, 0x09, 0x9a, 0x6c, 0xe0, 0xf8, 0xa4, 0xc6, 0xbc, 0xf1, 0x2e, 0x8c,
- 0xd4, 0xeb, 0x5c, 0xab, 0x31, 0x21, 0xd3, 0xc2, 0x03, 0x6d, 0xbb, 0xdc,
- 0xa2, 0x6d, 0x5e, 0xa1, 0x01, 0x90, 0xee, 0x46, 0x62, 0xc3, 0xe4, 0x18,
- 0x4f, 0x87, 0x03, 0xfd, 0x51, 0x1a, 0xef, 0xe5, 0x7e, 0x13, 0x6b, 0xb3,
- 0x10, 0xc2, 0x4a, 0x6c, 0xf3, 0x95, 0x70, 0x1e, 0x43, 0x24, 0xc3, 0xc0,
- 0x25, 0x28, 0x87, 0xa1, 0x74, 0x02, 0x80, 0xda, 0xae, 0xba, 0x66, 0xd2,
- 0xbb, 0x9c, 0x17, 0xe3, 0xb1, 0x59, 0x7c, 0x4f, 0xb5, 0x14, 0xf3, 0xed,
- 0xc0, 0x35, 0xed, 0xcf, 0x24, 0x2d, 0x2f, 0xc9, 0x78, 0xee, 0x93, 0x19,
- 0xc1, 0x7e, 0x7f, 0xcc, 0xc2, 0xb5, 0x7f, 0xd7, 0xcf, 0x6b, 0x2b, 0x8f,
- 0xc8, 0x3d, 0xc3, 0x19, 0x8e, 0x96, 0x01, 0xb1, 0xb6, 0x46, 0x18, 0x81,
- 0x0a, 0x57, 0xf1, 0x53, 0x9d, 0x1e, 0x67, 0x50, 0x76, 0xa5, 0x00, 0x37,
- 0x7a, 0x28, 0xf6, 0xb5, 0x85, 0x6e, 0x5e, 0x85, 0xe1, 0x1a, 0x22, 0x41,
- 0x73, 0x41, 0xbd, 0xff, 0xc0, 0x7f, 0xf6, 0xfa, 0xf8, 0x73, 0xff, 0x1f,
- 0x3d, 0x8a, 0xe8, 0x1c, 0xee, 0xee, 0xde, 0xdc, 0xdc, 0x0c, 0x15, 0x38,
- 0xd2, 0x6c, 0xd9, 0x67, 0x61, 0x85, 0x27, 0xf0, 0xf6, 0x3a, 0x3e, 0x70,
- 0x91, 0xf4, 0xf2, 0xc5, 0xe5, 0x5f, 0xf6, 0x06, 0x7b, 0x8f, 0x1e, 0x3d,
- 0xfa, 0x79, 0xb8, 0x02, 0x7d, 0x67, 0x34, 0xac, 0xf9, 0xd3, 0x1f, 0x76,
- 0x97, 0x67, 0xb2, 0x1b, 0x45, 0xf9, 0xe5, 0xdf, 0xa9, 0x59, 0xbd, 0xe4,
- 0x6e, 0x53, 0xcc, 0xca, 0x87, 0x9e, 0x88, 0xe1, 0xd8, 0x78, 0xba, 0x09,
- 0x2f, 0x81, 0xd3, 0x21, 0x11, 0x91, 0x78, 0x72, 0xb0, 0xbf, 0x9f, 0xb0,
- 0xc2, 0xc1, 0x65, 0x88, 0x9c, 0x9e, 0x01, 0x04, 0x8a, 0x2c, 0xa5, 0x12,
- 0x01, 0xbe, 0xcb, 0x00, 0xb1, 0x99, 0x72, 0xec, 0xc7, 0x70, 0x46, 0x47,
- 0x9a, 0x2a, 0xf5, 0xed, 0x33, 0x42, 0x2c, 0x19, 0x17, 0xd3, 0x3b, 0x37,
- 0xaa, 0x61, 0xf1, 0x12, 0x82, 0x95, 0x7b, 0x58, 0x7b, 0x50, 0x9e, 0xa9,
- 0x64, 0x90, 0x07, 0x65, 0xa3, 0xd2, 0xb3, 0x95, 0x6e, 0x39, 0x42, 0x46,
- 0x5e, 0x82, 0xbe, 0xd4, 0x49, 0x95, 0x10, 0x1b, 0xd7, 0xa5, 0xb4, 0xe7,
- 0xa3, 0xe4, 0x8d, 0x9b, 0xf4, 0xae, 0x71, 0xd9, 0x1b, 0x8a, 0xbf, 0x30,
- 0x7f, 0x04, 0x7e, 0x6f, 0x39, 0x9a, 0x50, 0x2d, 0xc1, 0x4b, 0x74, 0x14,
- 0x66, 0x59, 0x3d, 0xb9, 0x0a, 0x1a, 0xa3, 0x40, 0x82, 0x9b, 0xd9, 0x5e,
- 0x99, 0x05, 0x49, 0xd4, 0xad, 0xab, 0x75, 0xb1, 0xab, 0xbf, 0x36, 0x43,
- 0xa2, 0x5d, 0x15, 0x95, 0x5b, 0x4c, 0x8a, 0xe5, 0x2c, 0xe7, 0x96, 0x69,
- 0x5d, 0xbe, 0x0e, 0xdb, 0x3d, 0x9b, 0xbe, 0xc7, 0x95, 0x3c, 0x38, 0x01,
- 0x93, 0xab, 0x6c, 0x21, 0x12, 0x73, 0x5b, 0xf3, 0x40, 0x7b, 0xc2, 0x83,
- 0xbd, 0x88, 0x45, 0xde, 0x9b, 0xe9, 0xaf, 0xcc, 0x4a, 0x76, 0xa4, 0xc0,
- 0xda, 0x5e, 0x73, 0xd2, 0xc6, 0xef, 0x72, 0x0d, 0xc3, 0x71, 0x9c, 0xca,
- 0x7d, 0xa2, 0x75, 0xff, 0x1d, 0xd9, 0xda, 0x46, 0x2c, 0x66, 0x25, 0x5d,
- 0x62, 0xd5, 0x7a, 0x3c, 0x10, 0xcd, 0x87, 0x66, 0x44, 0x09, 0x33, 0x38,
- 0xad, 0xaf, 0x4e, 0x8e, 0x2e, 0xb8, 0xd4, 0xd9, 0xfc, 0x89, 0x0a, 0x20,
- 0xf3, 0x1f, 0x54, 0x38, 0x87, 0x1d, 0x16, 0xcf, 0x0f, 0x38, 0x2d, 0x8a,
- 0x98, 0x95, 0xa7, 0xc7, 0x12, 0xc2, 0xa6, 0xcd, 0xfa, 0xaa, 0x5f, 0xdf,
- 0x6b, 0xdb, 0x15, 0xc9, 0x87, 0x6e, 0x68, 0x89, 0xb6, 0x42, 0xfe, 0xf1,
- 0x93, 0xe1, 0x23, 0x5e, 0x22, 0x35, 0x73, 0xe6, 0xac, 0x20, 0xa9, 0xc8,
- 0x23, 0x3f, 0x8d, 0x06, 0x2c, 0xd3, 0x78, 0xda, 0x81, 0x9d, 0x4a, 0x3f,
- 0x61, 0xc8, 0x7b, 0x86, 0xcc, 0xd0, 0xdf, 0x7a, 0x19, 0xa0, 0xf7, 0x94,
- 0xf8, 0xe8, 0xdd, 0x25, 0x79, 0xcf, 0x77, 0x6d, 0xb8, 0x72, 0x02, 0x93,
- 0xd7, 0xca, 0x23, 0x12, 0xc2, 0xb1, 0xb2, 0x48, 0xe1, 0x09, 0xc9, 0x85,
- 0xef, 0xbb, 0x96, 0x89, 0x05, 0x6e, 0x01, 0xb9, 0xb3, 0xa4, 0xa2, 0x8a,
- 0x5a, 0x8c, 0xbb, 0x1e, 0xbd, 0x31, 0xfd, 0xa4, 0xab, 0x17, 0xa5, 0x6b,
- 0x15, 0x73, 0xb6, 0xb4, 0x4d, 0xee, 0xfb, 0xd2, 0x06, 0x85, 0x3a, 0xce,
- 0xb2, 0x6c, 0x06, 0x54, 0x01, 0x43, 0xec, 0xc2, 0x29, 0xc8, 0xc4, 0x8d,
- 0x54, 0xf0, 0xa3, 0x78, 0x8b, 0x01, 0x09, 0x44, 0xf1, 0x75, 0x2f, 0xc9,
- 0xa1, 0x17, 0xcd, 0x07, 0xc2, 0xfb, 0xce, 0xdc, 0xe7, 0x8b, 0x61, 0xf2,
- 0x75, 0x86, 0x06, 0xf5, 0xbf, 0x73, 0x67, 0xf7, 0x6b, 0xc1, 0x3e, 0x66,
- 0x0d, 0x3e, 0x56, 0x7c, 0x08, 0x26, 0xdb, 0xd1, 0x9c, 0x62, 0xb6, 0xa9,
- 0x55, 0x17, 0xa6, 0x16, 0x31, 0xcc, 0x92, 0x44, 0xc7, 0x09, 0xb5, 0xe7,
- 0xe5, 0x68, 0x9b, 0x11, 0x1e, 0x83, 0x10, 0x2f, 0x75, 0xa2, 0x10, 0x65,
- 0x82, 0x15, 0x6e, 0x05, 0x03, 0xf8, 0x93, 0xcc, 0x50, 0x72, 0x9d, 0xf5,
- 0xfe, 0x84, 0x80, 0xd6, 0x17, 0x2f, 0x7b, 0x0d, 0x39, 0x11, 0x6b, 0x08,
- 0x59, 0xb1, 0xe4, 0x6d, 0x9a, 0x59, 0x22, 0x6d, 0x71, 0x23, 0x65, 0xb7,
- 0x8c, 0x1a, 0x4b, 0x3c, 0x75, 0x93, 0x2f, 0x0f, 0xf6, 0x85, 0x16, 0xde,
- 0xf6, 0x0c, 0x5e, 0x2a, 0x00, 0xf4, 0x20, 0xbd, 0xc4, 0x40, 0xd1, 0x20,
- 0x5e, 0xa3, 0xf9, 0x2d, 0xd3, 0xf7, 0x3d, 0x5e, 0x79, 0x49, 0xaf, 0x48,
- 0xbb, 0x4c, 0xcd, 0x8e, 0xf4, 0x71, 0x14, 0xd4, 0x03, 0xdb, 0xe2, 0x63,
- 0xf8, 0x51, 0x59, 0xbe, 0x8e, 0xe7, 0xe9, 0xf2, 0xa3, 0x4d, 0x62, 0xe7,
- 0x91, 0xfa, 0xe8, 0xb8, 0xce, 0xb5, 0xcc, 0xee, 0x87, 0x92, 0x31, 0x49,
- 0x57, 0x76, 0xd0, 0x8f, 0x09, 0x1a, 0xf3, 0x22, 0x2d, 0x3f, 0x6a, 0x7a,
- 0xbe, 0xa4, 0x9a, 0xfb, 0x7b, 0x62, 0xcb, 0xd3, 0x99, 0x91, 0xbf, 0x25,
- 0x46, 0xe6, 0xe7, 0xc2, 0xcb, 0x95, 0x93, 0x09, 0x18, 0x79, 0x4a, 0x33,
- 0xf6, 0x3b, 0x18, 0x1b, 0xb1, 0x75, 0x68, 0x1f, 0x90, 0xb0, 0x94, 0xe4,
- 0xbb, 0x58, 0xd5, 0x77, 0x56, 0x4f, 0x21, 0x8f, 0x4e, 0x9b, 0xc4, 0xdb,
- 0xbd, 0xde, 0x8e, 0x05, 0xc8, 0x8f, 0x94, 0x28, 0x29, 0x56, 0x8a, 0x2c,
- 0x02, 0xe8, 0xeb, 0x19, 0x74, 0x5c, 0xce, 0xe8, 0xf3, 0x7a, 0x52, 0xd8,
- 0xfc, 0x0a, 0x02, 0xf5, 0xa0, 0x3b, 0xae, 0xad, 0x95, 0x83, 0xbc, 0x32,
- 0x92, 0x6b, 0x7f, 0x08, 0x5a, 0xe4, 0x75, 0x43, 0x09, 0xaa, 0x56, 0xf0,
- 0x2e, 0x6c, 0xf7, 0x92, 0xde, 0xce, 0x27, 0xcc, 0x93, 0xb0, 0x68, 0xe3,
- 0xe6, 0xca, 0x34, 0x7f, 0x1e, 0x6a, 0x7c, 0xb6, 0xeb, 0xf2, 0xac, 0x05,
- 0x10, 0x50, 0xfa, 0xad, 0xa3, 0xe9, 0x9d, 0x46, 0x74, 0x45, 0x2b, 0x9f,
- 0xb9, 0xc6, 0x53, 0x2e, 0x8a, 0x1c, 0xcb, 0x96, 0x18, 0x26, 0x67, 0xce,
- 0x96, 0x5f, 0xf6, 0x09, 0x78, 0xba, 0x2e, 0x27, 0x62, 0xc9, 0xd3, 0xdf,
- 0x25, 0x17, 0x38, 0x9d, 0xc7, 0x28, 0x40, 0xbd, 0x60, 0x73, 0x02, 0xc2,
- 0xaf, 0x62, 0xb3, 0xd3, 0xf4, 0x7b, 0x41, 0x29, 0x30, 0xbc, 0x83, 0x66,
- 0xe4, 0x9c, 0x96, 0x91, 0x06, 0xa9, 0xfe, 0xbc, 0x88, 0x78, 0x17, 0x5a,
- 0xd6, 0x56, 0x6c, 0xfb, 0x79, 0xf7, 0x78, 0x25, 0x89, 0x19, 0x73, 0xb3,
- 0x77, 0x9c, 0x47, 0xe4, 0xda, 0xaf, 0x98, 0xfb, 0xa4, 0x58, 0xf6, 0x03,
- 0x10, 0x35, 0xa4, 0x41, 0xb0, 0xc3, 0x0f, 0x49, 0xa6, 0x0b, 0xbf, 0x8b,
- 0x16, 0xdb, 0xc5, 0xf4, 0x9e, 0x1e, 0x3f, 0xff, 0xcb, 0x38, 0x2b, 0xdd,
- 0x65, 0xf4, 0xd2, 0x56, 0x52, 0x37, 0xc3, 0x30, 0x55, 0x9f, 0x8b, 0x43,
- 0x83, 0x25, 0x19, 0x71, 0x2f, 0x42, 0x47, 0x30, 0xdd, 0x72, 0x0e, 0xaa,
- 0x57, 0xbe, 0x81, 0x7f, 0x85, 0x86, 0x8f, 0x9e, 0xeb, 0x49, 0x80, 0xf1,
- 0xcc, 0x21, 0x0a, 0x8c, 0x15, 0x1c, 0x20, 0x3a, 0x07, 0x86, 0xc2, 0x84,
- 0xc4, 0x8e, 0xdc, 0x2c, 0xe4, 0xdf, 0xba, 0x6c, 0x77, 0x28, 0x73, 0xd9,
- 0x92, 0x5d, 0x2a, 0x45, 0xa2, 0x00, 0x87, 0x66, 0x7f, 0x42, 0x80, 0xd2,
- 0x29, 0xe3, 0x57, 0x57, 0x0a, 0x4c, 0x2f, 0x04, 0xba, 0x43, 0x7a, 0x2d,
- 0x5f, 0x1e, 0xc8, 0x1c, 0x36, 0x42, 0x9b, 0xc1, 0xe3, 0x41, 0xa0, 0x4a,
- 0x09, 0x1f, 0x69, 0x48, 0xc9, 0x2b, 0x55, 0x9c, 0x20, 0x1f, 0x55, 0xdb,
- 0x9c, 0x85, 0xeb, 0x9c, 0x69, 0xcf, 0x88, 0x81, 0xe3, 0x32, 0xcf, 0x66,
- 0xb0, 0x18, 0x69, 0x45, 0x92, 0x93, 0x1c, 0xb8, 0xec, 0x32, 0x80, 0xcb,
- 0xa3, 0xdc, 0xc1, 0xec, 0x23, 0xaa, 0xf4, 0x73, 0xf2, 0xda, 0xb1, 0xd8,
- 0xb7, 0x08, 0x8e, 0xdc, 0xd4, 0x01, 0xd5, 0xb7, 0xb4, 0x88, 0x54, 0x6b,
- 0xe4, 0xa2, 0x09, 0xbf, 0x10, 0x6f, 0xea, 0x6e, 0x06, 0x77, 0x2d, 0x71,
- 0x8a, 0x6d, 0x07, 0x68, 0xfa, 0x22, 0xdf, 0x1c, 0xa2, 0x5a, 0x7a, 0xad,
- 0x44, 0xe3, 0xf0, 0xe8, 0xa0, 0xd2, 0x77, 0x59, 0x69, 0x34, 0x8f, 0xa2,
- 0x4a, 0xbe, 0x7f, 0xa2, 0xf1, 0x1f, 0xb9, 0xe2, 0x45, 0x0d, 0xd4, 0x33,
- 0xca, 0xd2, 0x8a, 0xa7, 0x1e, 0xc4, 0x8e, 0xa4, 0x10, 0x8a, 0x04, 0xb4,
- 0xbe, 0xee, 0xeb, 0x83, 0x3e, 0x97, 0xf2, 0x91, 0x33, 0x3f, 0x31, 0xec,
- 0x67, 0xfe, 0x19, 0xef, 0x5c, 0x2a, 0x1f, 0xa5, 0x20, 0x0e, 0xa9, 0x07,
- 0x70, 0xa4, 0x9a, 0xbd, 0x1c, 0xd7, 0x29, 0xa1, 0x88, 0x27, 0x6e, 0xe2,
- 0xc9, 0x45, 0x0e, 0x5f, 0xdb, 0xd0, 0x0a, 0xf4, 0x68, 0x9d, 0x98, 0x24,
- 0x3c, 0x39, 0x10, 0xfe, 0x56, 0xe6, 0x0a, 0x54, 0xf8, 0xea, 0x0a, 0x5a,
- 0x30, 0x94, 0x33, 0xf2, 0xb0, 0xc4, 0x3b, 0xa8, 0x88, 0x0a, 0xf0, 0xf6,
- 0xe2, 0xf4, 0x8d, 0xe0, 0xac, 0x38, 0x31, 0x27, 0x5a, 0x8f, 0xf3, 0x48,
- 0x88, 0xd8, 0x49, 0x63, 0x1d, 0x62, 0x3c, 0x62, 0x68, 0xf0, 0x92, 0x61,
- 0x5f, 0x40, 0xb6, 0xbe, 0xe4, 0x55, 0x95, 0x52, 0x09, 0xa9, 0xbe, 0x10,
- 0x21, 0x6a, 0x24, 0x8c, 0x00, 0x26, 0xac, 0x68, 0xef, 0xc9, 0x4f, 0x65,
- 0x2e, 0x0a, 0x23, 0x68, 0x36, 0x75, 0x31, 0xc0, 0x55, 0xae, 0xf2, 0xd0,
- 0xfb, 0x32, 0xaf, 0x04, 0x22, 0x86, 0x5b, 0xd4, 0x24, 0xaf, 0x8a, 0x9b,
- 0xe5, 0xe0, 0x14, 0x05, 0xed, 0xc9, 0x69, 0x71, 0x69, 0x48, 0xf5, 0x36,
- 0xea, 0x32, 0x7b, 0x7f, 0xfe, 0x36, 0xd9, 0x86, 0x6a, 0x91, 0x9c, 0x5b,
- 0x60, 0x47, 0x3c, 0xb9, 0x23, 0xf6, 0x5d, 0xc5, 0x6a, 0x97, 0xed, 0xc5,
- 0x77, 0xfc, 0xe3, 0xcb, 0x37, 0xe7, 0xa7, 0xc7, 0x3f, 0x71, 0xb2, 0x53,
- 0xb0, 0x1c, 0xfc, 0xf8, 0x2b, 0xcf, 0xe0, 0xa5, 0xf0, 0x18, 0x62, 0xbe,
- 0x66, 0x1e, 0x77, 0x9d, 0x57, 0xb9, 0x88, 0x46, 0x65, 0xc1, 0xd1, 0xe8,
- 0xfc, 0x64, 0xa0, 0xa0, 0x8c, 0xdc, 0xe3, 0x3c, 0x5f, 0xc2, 0x3a, 0xa5,
- 0xfb, 0x48, 0xfa, 0x0a, 0x7d, 0x17, 0x46, 0x02, 0xf5, 0x44, 0xf4, 0x93,
- 0xb7, 0x9a, 0x56, 0xda, 0xa7, 0x1d, 0xc7, 0x11, 0x7c, 0x95, 0x53, 0x0f,
- 0xbd, 0x76, 0x32, 0xa0, 0x18, 0x7f, 0xe4, 0xcb, 0x08, 0x00, 0x4f, 0x71,
- 0xaf, 0xf0, 0x1d, 0x43, 0xaa, 0xd6, 0x9c, 0x7d, 0xc7, 0x9d, 0x37, 0x24,
- 0x09, 0x03, 0xda, 0x46, 0x14, 0x1e, 0x05, 0x71, 0x4a, 0x29, 0x44, 0x1a,
- 0xdf, 0xf9, 0x9d, 0x71, 0x2d, 0x8f, 0xf0, 0xbd, 0xd0, 0xee, 0xcd, 0x77,
- 0x98, 0xf4, 0x06, 0xeb, 0xe4, 0xb0, 0xf7, 0x09, 0x55, 0x04, 0xdf, 0xcd,
- 0x1e, 0x69, 0x4e, 0x27, 0xe1, 0x4a, 0xf5, 0xc3, 0x4b, 0x1f, 0x15, 0x4f,
- 0xe1, 0x27, 0xb4, 0x07, 0xc3, 0x41, 0xe6, 0xa8, 0xcb, 0xed, 0x4b, 0xd5,
- 0x8e, 0x97, 0x11, 0xcc, 0xa4, 0x25, 0xc9, 0x25, 0x76, 0xbe, 0xc1, 0x99,
- 0xb5, 0x65, 0xc4, 0x00, 0xc7, 0x50, 0x20, 0xe2, 0x7b, 0x14, 0x18, 0x16,
- 0xeb, 0xb5, 0x98, 0x1a, 0x75, 0xfc, 0x25, 0x87, 0x7f, 0xa8, 0xdd, 0x64,
- 0x38, 0x1c, 0xd1, 0x6a, 0xeb, 0xcb, 0x2d, 0x09, 0x70, 0xf7, 0x44, 0x7d,
- 0x83, 0xac, 0xee, 0xb1, 0x8e, 0x0e, 0xdd, 0x1f, 0xb3, 0x37, 0x27, 0x7e,
- 0xeb, 0xc5, 0x96, 0x8d, 0x84, 0xf7, 0xa2, 0x5a, 0x28, 0xbf, 0x27, 0xf1,
- 0x55, 0xb5, 0x1c, 0x64, 0xf7, 0xa5, 0x58, 0xc1, 0xdc, 0x9a, 0xd3, 0x4c,
- 0x5c, 0x92, 0xe8, 0x39, 0xcd, 0x40, 0xaa, 0x1c, 0xc1, 0x6d, 0xab, 0x1c,
- 0x8d, 0x99, 0xcb, 0x5c, 0xff, 0x45, 0xe7, 0xaa, 0xed, 0x14, 0xd2, 0x39,
- 0xc5, 0x83, 0x5c, 0x7f, 0xe0, 0x31, 0x37, 0xf0, 0xec, 0xd2, 0x87, 0x38,
- 0x4d, 0x18, 0x9e, 0x09, 0x52, 0xf6, 0xa3, 0x15, 0xa9, 0xfd, 0x56, 0xb1,
- 0x27, 0x05, 0x15, 0x43, 0xdf, 0xb1, 0xd7, 0x6a, 0xc6, 0x8c, 0xbc, 0x55,
- 0x02, 0x20, 0xb0, 0xf8, 0x48, 0x9d, 0xe0, 0x8b, 0xb2, 0xf3, 0xa4, 0xaa,
- 0x5f, 0xdd, 0x71, 0x1e, 0xdf, 0xb6, 0x9a, 0xbd, 0x47, 0x4a, 0x39, 0x1e,
- 0x14, 0x75, 0x40, 0x0c, 0xeb, 0x7e, 0x08, 0x19, 0xc5, 0x9d, 0x1c, 0x59,
- 0x2c, 0x6b, 0x54, 0xce, 0x95, 0xc0, 0x4a, 0xa0, 0x5a, 0xcb, 0xce, 0x63,
- 0x3e, 0x6e, 0xbf, 0x7e, 0xbb, 0xd9, 0xf9, 0x58, 0xe2, 0x08, 0xd4, 0xc5,
- 0xa3, 0xbb, 0x50, 0xb6, 0x55, 0x0f, 0x3c, 0xec, 0x86, 0x29, 0xb4, 0xf3,
- 0x8b, 0x27, 0xf2, 0x46, 0x63, 0x52, 0xdf, 0xcb, 0xa9, 0xaa, 0x42, 0x53,
- 0xf2, 0x95, 0x44, 0x2d, 0xfd, 0x50, 0xa0, 0xd4, 0x9e, 0xb2, 0xcb, 0x76,
- 0xa9, 0x2d, 0xf1, 0xc6, 0x7a, 0xf4, 0x28, 0x67, 0x23, 0xa7, 0xd0, 0x4a,
- 0x35, 0x8c, 0xa9, 0xb0, 0xac, 0x93, 0x32, 0xd3, 0xb9, 0xa4, 0x18, 0xd2,
- 0x56, 0x11, 0xca, 0xd4, 0x21, 0x24, 0x4b, 0xaa, 0x6f, 0xc7, 0x8e, 0xc4,
- 0xb5, 0xe9, 0xf6, 0x38, 0x28, 0xa7, 0xe4, 0x29, 0xb8, 0x93, 0x34, 0x26,
- 0xf8, 0x9f, 0xcd, 0xe0, 0x1f, 0x35, 0x17, 0x14, 0x23, 0x67, 0xb7, 0xd9,
- 0x64, 0x5d, 0x37, 0x6b, 0x2a, 0xbd, 0x39, 0x09, 0x7a, 0x1a, 0x4d, 0x69,
- 0x9b, 0x0e, 0x82, 0xda, 0xdb, 0xe7, 0x8a, 0x7c, 0x75, 0xd8, 0xdb, 0x91,
- 0x10, 0x3a, 0x85, 0x57, 0x1d, 0x24, 0x56, 0x2c, 0x38, 0xae, 0x53, 0x2e,
- 0x33, 0xf6, 0x65, 0xbb, 0x4c, 0x91, 0xe8, 0xe7, 0x0d, 0x8f, 0x96, 0xd1,
- 0xaf, 0xbf, 0x66, 0xc7, 0xa7, 0xf7, 0x71, 0xdb, 0xe9, 0x5b, 0x7c, 0xa2,
- 0x55, 0x70, 0x94, 0x83, 0x2f, 0x17, 0x33, 0xf2, 0x48, 0xbc, 0xbc, 0x36,
- 0xdc, 0x4d, 0xbe, 0x0a, 0x7d, 0x55, 0x89, 0x1f, 0xf8, 0xa2, 0xd3, 0x79,
- 0x3d, 0xa8, 0xae, 0x27, 0xf1, 0x1a, 0x18, 0xbf, 0x67, 0x35, 0x65, 0x13,
- 0x98, 0x87, 0x47, 0xd7, 0x93, 0x43, 0xdb, 0xcf, 0xab, 0xb2, 0x22, 0x22,
- 0x0c, 0x38, 0x56, 0x77, 0xcb, 0xc9, 0xd5, 0xab, 0xb7, 0xa3, 0xf8, 0xd0,
- 0xc4, 0xd4, 0xda, 0x1a, 0x13, 0x9d, 0x15, 0xf0, 0xb4, 0xb9, 0x8b, 0x00,
- 0x7c, 0xc9, 0x86, 0x87, 0xc0, 0x85, 0xa2, 0x62, 0xe2, 0xa5, 0xf7, 0xdb,
- 0xf8, 0x70, 0xcd, 0x57, 0xac, 0x37, 0x0e, 0xf7, 0x0b, 0x9f, 0x65, 0x51,
- 0x3f, 0x28, 0xf4, 0x31, 0x48, 0x41, 0x11, 0x5e, 0x53, 0x7c, 0xb8, 0xfa,
- 0x0a, 0x31, 0x1b, 0xc3, 0x55, 0x32, 0x62, 0xd9, 0x9d, 0x6c, 0x35, 0x36,
- 0xcc, 0x31, 0xcf, 0x1b, 0xa4, 0x72, 0x10, 0x0c, 0xf2, 0x4b, 0x4d, 0xa2,
- 0xd1, 0x48, 0xb2, 0xc6, 0xd5, 0x82, 0xc1, 0x8e, 0xae, 0xd2, 0xf2, 0xa8,
- 0x58, 0x5e, 0xc7, 0x67, 0xd5, 0xca, 0x49, 0x62, 0x47, 0x88, 0xf7, 0xdd,
- 0x89, 0x79, 0x3b, 0x9d, 0xd4, 0x04, 0x11, 0x48, 0xa0, 0x98, 0x9a, 0x86,
- 0x18, 0x1f, 0x6e, 0x9b, 0x22, 0x14, 0xc7, 0x5f, 0x1f, 0xbd, 0x3a, 0x39,
- 0xda, 0x69, 0xcf, 0xe4, 0x15, 0x41, 0x03, 0x88, 0xec, 0xe1, 0xeb, 0x86,
- 0x37, 0xca, 0xb2, 0x9d, 0x37, 0x09, 0x7a, 0x58, 0xec, 0x2e, 0x56, 0x90,
- 0x3a, 0x3e, 0xb9, 0xa0, 0x66, 0xb1, 0xe8, 0xb1, 0x43, 0xf2, 0xe9, 0xa3,
- 0x26, 0x2d, 0x2c, 0xb2, 0x05, 0xe2, 0x9f, 0xf6, 0x86, 0x16, 0xc8, 0x3e,
- 0xa8, 0x78, 0xf4, 0xf1, 0x41, 0x7c, 0xb8, 0x29, 0xf4, 0x48, 0xdc, 0xf7,
- 0x5c, 0x3d, 0xf0, 0xbb, 0xf6, 0x22, 0x04, 0x06, 0x3b, 0xfe, 0xb2, 0x62,
- 0x64, 0x33, 0xea, 0x2a, 0x07, 0x70, 0x82, 0x0d, 0xc1, 0x46, 0xed, 0xf3,
- 0x7f, 0x76, 0xf7, 0x2d, 0xb1, 0x6d, 0x29, 0x29, 0xd1, 0xc0, 0x88, 0xea,
- 0x61, 0xe4, 0xb5, 0x03, 0x79, 0xed, 0x60, 0xd3, 0x6b, 0x91, 0xf7, 0x46,
- 0xec, 0x6f, 0xba, 0xef, 0xd8, 0xe4, 0x91, 0xd4, 0xb4, 0x8d, 0x50, 0xa5,
- 0xaf, 0xde, 0x36, 0x07, 0xb0, 0xd1, 0x37, 0xfc, 0x66, 0xa0, 0xb5, 0xa8,
- 0x72, 0xfd, 0x7b, 0xda, 0x7b, 0xc4, 0xd5, 0x75, 0x7e, 0xfd, 0x54, 0xc2,
- 0x8f, 0x38, 0x68, 0xd0, 0x92, 0xe9, 0x47, 0x56, 0x4b, 0x0c, 0xde, 0xf8,
- 0x58, 0x8e, 0x1f, 0x9b, 0xff, 0x7c, 0x87, 0xff, 0xcc, 0xd8, 0x5d, 0xba,
- 0x99, 0xee, 0xa7, 0xc6, 0xe6, 0xcf, 0x22, 0xb1, 0xef, 0x80, 0x0c, 0x76,
- 0x15, 0x2e, 0x37, 0xc1, 0xdc, 0x26, 0x73, 0xbc, 0xce, 0x31, 0xbe, 0xbe,
- 0x84, 0xfa, 0xe8, 0x47, 0x65, 0xd7, 0x71, 0x37, 0xcb, 0xd8, 0xff, 0xe6,
- 0xeb, 0x60, 0x1a, 0x86, 0xd7, 0xff, 0x0e, 0x59, 0x66, 0x0f, 0xf4, 0x34,
- 0x6b, 0x9c, 0xe5, 0x99, 0x9f, 0x84, 0xc7, 0xdf, 0xb1, 0xe7, 0x3b, 0x52,
- 0x65, 0xa0, 0xf6, 0x77, 0xe7, 0xb2, 0xdf, 0x18, 0xbd, 0x04, 0xf7, 0xd9,
- 0x83, 0x57, 0x6d, 0x5f, 0x68, 0x0f, 0x84, 0xa8, 0xe7, 0x68, 0x74, 0xfa,
- 0xe0, 0x81, 0x34, 0x4c, 0xba, 0x39, 0xb3, 0x94, 0xac, 0x16, 0xf9, 0x4f,
- 0x08, 0x58, 0xef, 0xad, 0xeb, 0x57, 0xbe, 0xd6, 0x8e, 0xe3, 0x8c, 0x4e,
- 0xed, 0x7f, 0xa8, 0x1e, 0xf5, 0x4a, 0x45, 0xdd, 0xf9, 0x7a, 0x3c, 0x37,
- 0xdb, 0x31, 0x5a, 0xcf, 0x66, 0xf9, 0x6d, 0x72, 0x8a, 0xb2, 0x3c, 0x96,
- 0x23, 0xe9, 0xd2, 0x26, 0x78, 0x76, 0x91, 0x9f, 0x16, 0xde, 0x3c, 0x8b,
- 0x52, 0x3f, 0xe4, 0xd5, 0xd4, 0xb3, 0xe2, 0x93, 0xf4, 0x56, 0xfc, 0x21,
- 0x33, 0xc9, 0x59, 0x87, 0x10, 0x32, 0x13, 0xc8, 0xaa, 0xd0, 0x12, 0xe2,
- 0x9e, 0x77, 0xfa, 0x9f, 0x5f, 0xb2, 0xea, 0x11, 0xaf, 0x9a, 0xfe, 0xe3,
- 0x27, 0x92, 0x03, 0x2a, 0x02, 0xd7, 0xa3, 0x43, 0xe8, 0x24, 0x37, 0xa0,
- 0x8e, 0xd3, 0x57, 0x00, 0x97, 0xf8, 0x34, 0x49, 0x36, 0xf4, 0x09, 0x26,
- 0xb8, 0x4f, 0x01, 0xb2, 0x11, 0x51, 0xcc, 0x68, 0x9c, 0x31, 0x40, 0x11,
- 0x63, 0xea, 0xea, 0x7f, 0x36, 0xce, 0x55, 0x8a, 0xa5, 0x3a, 0xd4, 0x87,
- 0x77, 0xe7, 0xc9, 0xf6, 0x88, 0x91, 0xaf, 0xde, 0x71, 0x3a, 0xcb, 0xb9,
- 0x18, 0xa5, 0x3b, 0x11, 0x8a, 0xb8, 0xcf, 0x74, 0x10, 0xda, 0xec, 0x7b,
- 0x0c, 0x84, 0x11, 0x99, 0x52, 0x23, 0xca, 0x90, 0xea, 0x58, 0x3a, 0xa5,
- 0x52, 0x71, 0x0e, 0x95, 0x5d, 0x4b, 0x5c, 0x77, 0x19, 0xdc, 0x40, 0x3f,
- 0x26, 0xf0, 0x29, 0x84, 0xbc, 0x92, 0x17, 0xac, 0x09, 0x47, 0xbb, 0xa3,
- 0x73, 0x0b, 0x5f, 0x41, 0x01, 0xf1, 0x75, 0x66, 0xb2, 0x3e, 0x28, 0x04,
- 0x93, 0xa2, 0x31, 0xaa, 0x64, 0xea, 0xc2, 0x75, 0x3f, 0x65, 0x29, 0x15,
- 0x26, 0x8e, 0x97, 0xec, 0x47, 0xe5, 0x31, 0xc4, 0x47, 0x23, 0xc1, 0x14,
- 0x4a, 0xc0, 0x4c, 0x09, 0x4e, 0x8c, 0xbd, 0x55, 0x0c, 0x63, 0xc5, 0xbe,
- 0x39, 0x63, 0x45, 0xdd, 0x06, 0xe4, 0x62, 0x5e, 0x46, 0x20, 0xd0, 0x8b,
- 0x04, 0x2a, 0xce, 0x48, 0xd5, 0xf8, 0x52, 0xe0, 0x62, 0x8a, 0x74, 0xad,
- 0x9f, 0x1b, 0x62, 0xc0, 0x76, 0xef, 0xf1, 0x8c, 0x7a, 0x84, 0xaa, 0xa0,
- 0x11, 0x04, 0x4a, 0xd1, 0x53, 0xeb, 0x86, 0xed, 0x03, 0x1d, 0x5b, 0x3c,
- 0xa9, 0x69, 0x24, 0xf1, 0x42, 0xe7, 0xd8, 0xfb, 0x4a, 0xd3, 0xfd, 0x7a,
- 0x6c, 0x5e, 0x14, 0xec, 0xdd, 0xd0, 0x04, 0x74, 0x3b, 0xa6, 0x0c, 0x19,
- 0x81, 0x1a, 0xe1, 0xf4, 0x19, 0x2a, 0x5d, 0xc0, 0xae, 0x99, 0x21, 0x07,
- 0xbd, 0xa8, 0xe2, 0x6d, 0x09, 0x60, 0x5b, 0xcf, 0x36, 0xcc, 0x53, 0xfd,
- 0x84, 0xc5, 0x33, 0x46, 0x14, 0xda, 0x18, 0x91, 0xf5, 0x3a, 0xe4, 0xc7,
- 0xb1, 0xb8, 0xb8, 0x12, 0x82, 0x66, 0x21, 0x45, 0x12, 0x9b, 0xe1, 0xf0,
- 0x53, 0xc8, 0x1c, 0x45, 0x4e, 0x64, 0x4d, 0x58, 0xf1, 0x9c, 0x68, 0x39,
- 0x26, 0xc4, 0x89, 0x79, 0x71, 0xd3, 0x96, 0x8e, 0x2f, 0x61, 0x09, 0xd9,
- 0xd9, 0x35, 0x6b, 0x2e, 0xcd, 0xdb, 0x7f, 0xf8, 0x0f, 0xfd, 0xe5, 0x07,
- 0x50, 0xea, 0x1f, 0x4a, 0x29, 0xcd, 0x4d, 0x4e, 0x03, 0x7c, 0x10, 0xf2,
- 0x01, 0x24, 0x7f, 0x20, 0xaa, 0xfc, 0x15, 0xa9, 0x6f, 0x4c, 0x1a, 0x40,
- 0x73, 0xd1, 0x80, 0x7f, 0x18, 0xda, 0xbb, 0x5b, 0x06, 0x49, 0x01, 0x78,
- 0x40, 0x46, 0xc9, 0xf8, 0x2e, 0x70, 0x9d, 0x81, 0x0d, 0x7f, 0x5a, 0xf6,
- 0x09, 0x77, 0xdd, 0x98, 0x9e, 0x80, 0x27, 0xe2, 0x0e, 0xdb, 0xbc, 0x8b,
- 0x3f, 0x95, 0x02, 0xb6, 0x65, 0x6c, 0x2e, 0x09, 0x1f, 0xf1, 0xcf, 0xe3,
- 0x06, 0x90, 0x66, 0x3f, 0x89, 0xd7, 0xa7, 0x81, 0xbd, 0x66, 0xc6, 0x49,
- 0xcb, 0xa9, 0x75, 0x18, 0x8c, 0x15, 0xf6, 0x88, 0x33, 0x7a, 0xc6, 0x81,
- 0x97, 0x9d, 0xc0, 0x89, 0x04, 0x8f, 0x5e, 0x5f, 0xe6, 0x0e, 0x8e, 0x36,
- 0x8f, 0xe7, 0x0f, 0xff, 0xc1, 0xd9, 0xa2, 0xff, 0x08, 0xef, 0xb2, 0xb3,
- 0x8b, 0xe3, 0x43, 0x9a, 0xd2, 0x1f, 0x06, 0xd5, 0xdd, 0x62, 0x5c, 0xcc,
- 0xe5, 0xe0, 0x81, 0xf8, 0x86, 0x80, 0xfa, 0x33, 0xe6, 0x12, 0x0a, 0x9b,
- 0x0e, 0x3c, 0xe4, 0x9e, 0x7e, 0xb4, 0x51, 0x0d, 0xec, 0xc5, 0x62, 0xc2,
- 0x55, 0xd4, 0x28, 0x67, 0x31, 0x27, 0xef, 0x0f, 0x89, 0x82, 0xf1, 0x70,
- 0xc3, 0x6a, 0x69, 0x4b, 0x2e, 0x9e, 0x5f, 0x2d, 0x0c, 0x8a, 0x86, 0xaa,
- 0x36, 0xf3, 0x71, 0x6a, 0xad, 0xbc, 0x18, 0xe6, 0x11, 0xe4, 0x85, 0x99,
- 0xe6, 0x07, 0x2a, 0xd4, 0x15, 0x73, 0xfc, 0x88, 0x7f, 0x36, 0xb8, 0xa0,
- 0x9f, 0x99, 0xb9, 0xf9, 0x41, 0x44, 0x24, 0xf0, 0x48, 0x49, 0x52, 0x3f,
- 0x2c, 0x8a, 0x4f, 0x62, 0xf9, 0x9b, 0xb0, 0x45, 0x8c, 0x9c, 0x09, 0xe6,
- 0xa9, 0xa7, 0xfa, 0x43, 0x46, 0xf0, 0xdc, 0xf9, 0x75, 0xb6, 0x79, 0x34,
- 0xea, 0xf7, 0x65, 0xf4, 0x8f, 0x45, 0x2a, 0x19, 0x8f, 0x9c, 0xe2, 0x68,
- 0xcf, 0x93, 0xc2, 0x01, 0x52, 0x02, 0xbc, 0xd9, 0xed, 0xe1, 0x7d, 0xc3,
- 0x81, 0xa6, 0xb9, 0x94, 0x14, 0x4b, 0x82, 0x18, 0xfc, 0x80, 0x5e, 0xbf,
- 0x9c, 0x1a, 0x65, 0x5a, 0x86, 0x6f, 0x68, 0xe4, 0x7b, 0xd6, 0x5a, 0x68,
- 0x28, 0xc5, 0x6f, 0x7d, 0xdd, 0x4c, 0x81, 0x60, 0xfb, 0x13, 0xe6, 0xca,
- 0xa0, 0xe8, 0x6f, 0x1e, 0xce, 0x26, 0x53, 0xd8, 0x10, 0xda, 0x09, 0x3c,
- 0x8e, 0x94, 0xf9, 0xb2, 0x66, 0x7f, 0x25, 0x02, 0x30, 0xc5, 0x02, 0xde,
- 0xe5, 0x48, 0xc8, 0x3f, 0x89, 0x48, 0x7b, 0x8a, 0x53, 0xff, 0x5b, 0xdf,
- 0xcd, 0x87, 0x0d, 0xf4, 0x81, 0x97, 0x8a, 0x61, 0xcc, 0x29, 0xc6, 0x7a,
- 0xdd, 0x3c, 0x1c, 0x17, 0x69, 0x3c, 0x1d, 0x3e, 0x0a, 0x2c, 0xc2, 0x59,
- 0xbd, 0xfa, 0x60, 0x78, 0xa3, 0xbc, 0xfb, 0x80, 0x54, 0x66, 0xda, 0x33,
- 0x8d, 0x7e, 0xd0, 0x0f, 0x88, 0xb2, 0x8c, 0x92, 0xb1, 0x5e, 0x61, 0x1c,
- 0x62, 0xf3, 0x79, 0xc1, 0x06, 0xdd, 0x7d, 0xcb, 0x90, 0x64, 0x01, 0xc9,
- 0x7a, 0xf5, 0xd1, 0xa3, 0xb6, 0x9b, 0x0d, 0x21, 0x1f, 0x07, 0x13, 0x43,
- 0x9a, 0xd2, 0x07, 0x4a, 0x22, 0xb0, 0xcc, 0x64, 0xee, 0xbd, 0xac, 0xcc,
- 0x27, 0x7e, 0x77, 0x64, 0x7a, 0x80, 0x58, 0x8a, 0x21, 0x71, 0x91, 0x55,
- 0x10, 0x45, 0x44, 0x6f, 0xfd, 0x8f, 0xfc, 0xd4, 0x5e, 0x68, 0xcd, 0xe6,
- 0xc4, 0xd2, 0x6e, 0x9b, 0x89, 0x22, 0xfd, 0xca, 0x25, 0x83, 0x9c, 0xdc,
- 0xb3, 0x4e, 0x6a, 0xb9, 0xb0, 0x2f, 0xa5, 0x37, 0x79, 0x5a, 0xd9, 0x09,
- 0xf2, 0x0a, 0xe8, 0x44, 0xd1, 0x7a, 0x11, 0xb1, 0x84, 0x1f, 0xe8, 0xde,
- 0x73, 0xc8, 0x69, 0x8a, 0x50, 0x40, 0x86, 0x1d, 0x94, 0xe1, 0xec, 0xf2,
- 0x36, 0x65, 0xba, 0x09, 0xc2, 0x6b, 0x0e, 0x83, 0xa4, 0x6d, 0x33, 0x86,
- 0x09, 0xbb, 0x2d, 0xc1, 0x46, 0x32, 0x3b, 0x77, 0xf8, 0xb4, 0x10, 0x2f,
- 0xb4, 0xb1, 0x17, 0xef, 0x39, 0xb5, 0xdb, 0xcd, 0xbe, 0xeb, 0x1d, 0xfb,
- 0x6c, 0x2b, 0xc5, 0x58, 0xa2, 0xe1, 0x67, 0x5e, 0xf9, 0x18, 0x27, 0x81,
- 0x52, 0x79, 0xa5, 0x15, 0x3d, 0xf3, 0xbb, 0x24, 0xda, 0x6c, 0x63, 0xc3,
- 0xe7, 0x9f, 0x3c, 0x8a, 0xf0, 0xff, 0x5f, 0x2b, 0xfa, 0xac, 0xbd, 0xb5,
- 0x93, 0x7f, 0x1b, 0x9d, 0xbd, 0x4d, 0x8a, 0xf1, 0x5f, 0x41, 0x5c, 0x0e,
- 0x76, 0x22, 0x45, 0xdd, 0x0a, 0xe5, 0x8f, 0x59, 0xa4, 0x02, 0x84, 0x12,
- 0xd5, 0x3f, 0xe4, 0x2b, 0x4f, 0xf0, 0x9d, 0x9c, 0x63, 0xc7, 0xa9, 0xc6,
- 0x4a, 0x92, 0x5f, 0x39, 0x9b, 0x1d, 0x29, 0x34, 0xf2, 0x03, 0x16, 0x0e,
- 0xf7, 0xef, 0xc8, 0x84, 0xa1, 0x3b, 0xd8, 0xef, 0xe5, 0xd7, 0x35, 0x1a,
- 0xfb, 0x5e, 0x54, 0x3d, 0xf1, 0x83, 0x19, 0x7b, 0xfd, 0x71, 0x18, 0x75,
- 0x4b, 0x22, 0x76, 0xbe, 0x4f, 0x97, 0xfd, 0xe7, 0x11, 0xba, 0xf0, 0x92,
- 0x48, 0xa7, 0xd6, 0x25, 0xf1, 0x02, 0xfc, 0xce, 0x3d, 0xb2, 0x10, 0x5d,
- 0x87, 0x3f, 0xd1, 0x7b, 0x96, 0xe4, 0x16, 0x71, 0xef, 0x4c, 0x14, 0x32,
- 0xc1, 0xf7, 0x40, 0x13, 0x83, 0xc8, 0x2f, 0x34, 0xb8, 0x6d, 0x67, 0xc2,
- 0x13, 0x61, 0x6b, 0xfd, 0x5e, 0xe2, 0x72, 0xd9, 0x9d, 0x3f, 0x89, 0x67,
- 0xfb, 0x91, 0x49, 0x98, 0x05, 0x7f, 0x70, 0xad, 0x27, 0x92, 0xb7, 0x76,
- 0xfd, 0x46, 0xc3, 0x72, 0x3d, 0x29, 0x80, 0x40, 0xaa, 0x53, 0x91, 0x59,
- 0xc4, 0x6d, 0x83, 0x24, 0x62, 0x2a, 0xb4, 0x4e, 0xca, 0x41, 0x74, 0x0e,
- 0xda, 0x60, 0xbb, 0xf2, 0xe7, 0xe0, 0x7e, 0xc8, 0x07, 0x1f, 0x97, 0xf8,
- 0xac, 0x40, 0x92, 0xba, 0xa3, 0xcc, 0xc3, 0x08, 0xf1, 0x80, 0x59, 0x90,
- 0x40, 0xf8, 0x50, 0x55, 0x73, 0x1c, 0xda, 0x7c, 0x76, 0x67, 0xa6, 0x54,
- 0x75, 0xc2, 0x2d, 0xf9, 0x9b, 0xc6, 0xcf, 0x29, 0xcf, 0x78, 0x4e, 0xad,
- 0xad, 0x8a, 0xac, 0xe2, 0x55, 0x86, 0x74, 0x28, 0x46, 0xb3, 0xbf, 0xef,
- 0x44, 0x40, 0xa3, 0xa0, 0xcf, 0xbb, 0xd0, 0xaa, 0x48, 0x3c, 0xab, 0xf6,
- 0x0c, 0x93, 0x47, 0xd6, 0x71, 0x70, 0x0f, 0x37, 0x36, 0x46, 0xc2, 0x20,
- 0x2e, 0x9f, 0xa0, 0x49, 0x90, 0x27, 0x31, 0xd6, 0x50, 0xea, 0x7f, 0x20,
- 0x9d, 0x86, 0x33, 0x00, 0xa4, 0xc8, 0xc2, 0x42, 0x9d, 0x61, 0x50, 0x62,
- 0x0e, 0x8d, 0xe2, 0x0f, 0x4e, 0x71, 0xad, 0xcf, 0x23, 0x60, 0xfd, 0x49,
- 0x0c, 0x0a, 0x86, 0x9a, 0xf8, 0x49, 0xd5, 0x81, 0xee, 0xf5, 0x76, 0x21,
- 0x25, 0xd3, 0x03, 0x94, 0x7a, 0x0f, 0xe8, 0x17, 0x9d, 0xce, 0x29, 0xef,
- 0x30, 0xed, 0x48, 0x4a, 0xa3, 0xaa, 0x9c, 0x92, 0xc7, 0x02, 0xf4, 0x59,
- 0x92, 0x4a, 0xe9, 0x04, 0xcd, 0xae, 0x24, 0x7b, 0x31, 0xdd, 0x3c, 0x9c,
- 0xce, 0x46, 0xba, 0x40, 0x92, 0xdd, 0x78, 0x49, 0xd8, 0x7c, 0x45, 0x8b,
- 0x95, 0xcc, 0xf5, 0x18, 0xa1, 0x1c, 0xd4, 0x02, 0x2b, 0x37, 0x2f, 0xfc,
- 0x0a, 0xa3, 0x50, 0x7e, 0x7a, 0x67, 0xdb, 0x08, 0x99, 0x5f, 0x24, 0x63,
- 0x3a, 0xe4, 0x64, 0x4b, 0x14, 0xde, 0x77, 0xc5, 0x47, 0xa5, 0x93, 0xac,
- 0x41, 0x05, 0xa5, 0xbf, 0x86, 0x2e, 0x49, 0xf9, 0xeb, 0xd6, 0x70, 0xaf,
- 0x9c, 0x6c, 0xaa, 0x1c, 0x9f, 0x46, 0x61, 0x52, 0x8d, 0xc8, 0x5c, 0xac,
- 0xb6, 0xfd, 0x80, 0xeb, 0x3f, 0xd0, 0xb3, 0x3a, 0x5b, 0x6f, 0xe7, 0x97,
- 0xa8, 0x05, 0x31, 0xde, 0x90, 0xdc, 0x75, 0x5f, 0x80, 0x80, 0x21, 0xe5,
- 0xc7, 0xdb, 0x95, 0x03, 0x76, 0x47, 0xa1, 0xeb, 0xd4, 0x85, 0xf3, 0x76,
- 0x92, 0x18, 0xf4, 0x63, 0x5b, 0xbd, 0x36, 0xb3, 0xf5, 0x55, 0x09, 0xba,
- 0x43, 0xee, 0x3d, 0xe9, 0xc0, 0xce, 0xfc, 0x60, 0x5b, 0x2e, 0x71, 0xe0,
- 0xaf, 0xa8, 0x91, 0x27, 0xb4, 0x30, 0x74, 0x24, 0xd1, 0xc6, 0x28, 0xa8,
- 0x4e, 0x0c, 0xeb, 0xd3, 0x11, 0x27, 0x1b, 0x8d, 0x26, 0x21, 0xb7, 0x64,
- 0xd3, 0x68, 0x5a, 0xe2, 0x6b, 0x87, 0xa2, 0x40, 0xdd, 0x3d, 0x72, 0x23,
- 0x06, 0x44, 0x40, 0x5f, 0xb4, 0x90, 0xd9, 0x0f, 0x9a, 0x3f, 0xb9, 0x54,
- 0x92, 0x3c, 0x8a, 0xce, 0x19, 0x71, 0x45, 0x3a, 0xa5, 0x30, 0xf6, 0x69,
- 0x2d, 0xde, 0x79, 0xd8, 0xa7, 0xb5, 0x00, 0x25, 0x1c, 0x0b, 0xdd, 0xa6,
- 0xdc, 0x3e, 0x60, 0xac, 0x14, 0x89, 0x28, 0x97, 0x5e, 0x3f, 0x2c, 0xee,
- 0x51, 0xe6, 0x6c, 0x4d, 0x73, 0x13, 0x54, 0x6b, 0x80, 0xf6, 0xcf, 0xee,
- 0x53, 0x8f, 0xa4, 0x8c, 0x8a, 0x3c, 0x7b, 0x76, 0x3c, 0xa0, 0xdd, 0x36,
- 0x1b, 0x75, 0x75, 0xcc, 0xca, 0x2e, 0xd1, 0x9f, 0x95, 0xfc, 0xb0, 0x3d,
- 0x27, 0x37, 0xa9, 0x5f, 0x38, 0x2b, 0x1e, 0xef, 0x21, 0x73, 0xfa, 0xe5,
- 0xb7, 0x74, 0xeb, 0x9a, 0x6e, 0x5f, 0xcc, 0x8d, 0x9b, 0xf7, 0x21, 0x57,
- 0xd7, 0x3d, 0x17, 0x73, 0xe3, 0xee, 0xbd, 0xff, 0xcc, 0x76, 0x5d, 0xcc,
- 0x7b, 0x31, 0x81, 0x28, 0x3d, 0x06, 0xf4, 0x7f, 0xaf, 0xc9, 0x71, 0xc9,
- 0x9e, 0x19, 0x6a, 0x61, 0x83, 0x3c, 0x20, 0xce, 0x5a, 0x6a, 0x3b, 0x88,
- 0xa3, 0x45, 0xf3, 0x49, 0xbc, 0x7c, 0x44, 0x5d, 0x5d, 0x6c, 0xda, 0xa9,
- 0xbf, 0x8a, 0x1d, 0x56, 0xd6, 0x3a, 0x4f, 0x1e, 0x70, 0xbd, 0x3c, 0x3d,
- 0x88, 0xaf, 0x81, 0xbc, 0x23, 0xff, 0x9c, 0x35, 0x84, 0xee, 0xba, 0xa1,
- 0x83, 0x32, 0xb8, 0x5f, 0x02, 0x48, 0x91, 0x4b, 0x9f, 0x9b, 0x8b, 0xab,
- 0x7b, 0x2f, 0x71, 0xdd, 0x25, 0x19, 0x76, 0x1c, 0x71, 0x28, 0x76, 0xa2,
- 0xdf, 0x63, 0x89, 0xd2, 0xe3, 0x5a, 0x7b, 0xc0, 0xd5, 0xe1, 0xcd, 0x9b,
- 0x23, 0x4a, 0x32, 0x5c, 0x0b, 0x1f, 0xd2, 0xd5, 0x4a, 0xee, 0xce, 0xfb,
- 0x59, 0x9e, 0x71, 0x64, 0xb9, 0x91, 0x3a, 0x9a, 0xf9, 0xf5, 0x39, 0x7b,
- 0xbe, 0xf8, 0xe8, 0x32, 0xf2, 0x29, 0xa7, 0x03, 0x60, 0x22, 0xf7, 0xb2,
- 0xfc, 0x3c, 0xd1, 0x73, 0xb3, 0x3b, 0x1a, 0x7d, 0xbb, 0x9b, 0xd5, 0x13,
- 0xbd, 0xc4, 0x77, 0x5d, 0xfa, 0xa8, 0x75, 0x8b, 0xdc, 0x33, 0x1c, 0xa9,
- 0x11, 0xd4, 0x54, 0x15, 0xcc, 0x6f, 0xe3, 0x0d, 0x0f, 0xe0, 0x7d, 0x22,
- 0x42, 0xd3, 0x47, 0xf0, 0x1b, 0x2f, 0x53, 0x70, 0xf1, 0x75, 0x75, 0x2d,
- 0x57, 0x0f, 0x4d, 0x1a, 0x1a, 0x2a, 0xfb, 0x0f, 0xee, 0x3f, 0xd9, 0x6e,
- 0x71, 0xd1, 0xa5, 0xc0, 0xe5, 0x85, 0x94, 0xb1, 0xf5, 0xea, 0x9f, 0xbe,
- 0x9f, 0x54, 0xb3, 0x08, 0x67, 0x0c, 0x67, 0x8d, 0x50, 0x82, 0xdd, 0xfd,
- 0x13, 0x5e, 0xc1, 0xb7, 0xc4, 0xca, 0xd2, 0x03, 0x84, 0xee, 0x83, 0xa7,
- 0xfc, 0xe0, 0x19, 0x73, 0xd9, 0xbe, 0xaa, 0x6b, 0x98, 0x30, 0xc5, 0x0c,
- 0x34, 0x02, 0x0a, 0x61, 0x35, 0xce, 0x2e, 0xc3, 0x1c, 0x87, 0x98, 0xd3,
- 0xd5, 0xa6, 0x78, 0xc1, 0x15, 0x62, 0x16, 0x36, 0xb0, 0xe3, 0x4a, 0x02,
- 0x79, 0x25, 0xb9, 0xe6, 0x97, 0xc5, 0xbd, 0xb3, 0x4b, 0x05, 0xf9, 0x1f,
- 0xd7, 0x82, 0x17, 0x14, 0x99, 0x28, 0xff, 0x78, 0x15, 0x63, 0x86, 0x75,
- 0xee, 0x1b, 0x0e, 0x0a, 0x1f, 0x17, 0x4a, 0x5e, 0x23, 0xa1, 0xa7, 0x63,
- 0x2f, 0xac, 0x95, 0x72, 0x1f, 0x7b, 0x20, 0xcb, 0x67, 0x3e, 0xb7, 0x56,
- 0xcd, 0xbd, 0x57, 0x92, 0xb9, 0xce, 0x56, 0x4a, 0x1e, 0xf0, 0x85, 0xb4,
- 0x3e, 0x06, 0x9b, 0xf6, 0xf5, 0x60, 0xf4, 0x93, 0x07, 0xb3, 0x02, 0xd7,
- 0x54, 0x5b, 0x15, 0x5b, 0x80, 0xcc, 0x25, 0xfc, 0xc6, 0x3d, 0x0d, 0xf0,
- 0xcb, 0x74, 0xa2, 0x86, 0xea, 0x7d, 0xb3, 0x4b, 0xb9, 0x1d, 0x68, 0x93,
- 0x08, 0x0e, 0x46, 0xc6, 0x2a, 0x14, 0x9c, 0x5d, 0xf7, 0x30, 0x4b, 0x34,
- 0x57, 0x9c, 0x47, 0x97, 0x5c, 0xe0, 0xd1, 0xab, 0x1a, 0x3e, 0xdc, 0x9e,
- 0x8a, 0xba, 0x17, 0x68, 0xae, 0x34, 0xf3, 0x87, 0x1f, 0x9f, 0x4f, 0x21,
- 0xc0, 0x35, 0xc9, 0x11, 0x5a, 0xa9, 0x3b, 0x3e, 0xd2, 0xb4, 0x83, 0x4a,
- 0xce, 0x1e, 0xe8, 0xd8, 0xa1, 0x0a, 0x8f, 0xe6, 0x31, 0x6a, 0x0b, 0x08,
- 0xd9, 0x79, 0x24, 0x8a, 0xde, 0xaf, 0x05, 0xca, 0x0e, 0x78, 0x05, 0x10,
- 0x68, 0xf7, 0xc1, 0x17, 0xac, 0xb1, 0x85, 0x70, 0x74, 0x38, 0x2a, 0xf8,
- 0x00, 0x57, 0xaf, 0xd9, 0xc0, 0xf8, 0x89, 0x61, 0xdd, 0xbc, 0xa9, 0xa9,
- 0x87, 0x54, 0xb6, 0x40, 0xd1, 0x94, 0xf6, 0xc9, 0x29, 0xda, 0x0f, 0x61,
- 0x22, 0xd8, 0x92, 0x91, 0xb3, 0x4a, 0x8d, 0x54, 0xd4, 0x28, 0x73, 0x26,
- 0x9f, 0x33, 0x56, 0x33, 0x8e, 0x0b, 0xe2, 0x75, 0x57, 0x0e, 0x44, 0x26,
- 0x35, 0xf4, 0xc9, 0xc1, 0x7d, 0x21, 0x10, 0x0d, 0x16, 0x21, 0x03, 0x99,
- 0x30, 0x3f, 0xe6, 0x53, 0x97, 0x70, 0xaf, 0xfe, 0x15, 0xdb, 0xf9, 0xe3,
- 0x70, 0xf3, 0x70, 0xda, 0x30, 0xe8, 0x13, 0xa2, 0x0e, 0xdf, 0xa6, 0xe6,
- 0x0c, 0x44, 0xeb, 0x4b, 0xaa, 0xf4, 0x9a, 0xf3, 0xd8, 0x25, 0xe4, 0x64,
- 0x63, 0x59, 0x4d, 0x58, 0xbb, 0x66, 0xbf, 0xc8, 0xaa, 0x8e, 0x94, 0x20,
- 0x19, 0xad, 0x1e, 0x79, 0x07, 0x74, 0x5b, 0x18, 0x8b, 0x3a, 0xa5, 0xda,
- 0x23, 0xf3, 0x83, 0xec, 0xb6, 0xe6, 0xa0, 0x8f, 0x84, 0xc8, 0x30, 0x15,
- 0x74, 0x83, 0xa4, 0xc4, 0x4d, 0x07, 0x67, 0x1c, 0xa9, 0xca, 0x91, 0x8a,
- 0x63, 0xfa, 0x9a, 0xf5, 0x3e, 0xde, 0x4e, 0x2f, 0x87, 0x45, 0x99, 0xe3,
- 0xbe, 0xa1, 0x44, 0x60, 0x1d, 0x0d, 0x8c, 0xdf, 0x27, 0x69, 0x02, 0xeb,
- 0x31, 0x36, 0x9c, 0x04, 0x3c, 0x13, 0x45, 0x26, 0x6e, 0x8e, 0xbb, 0x20,
- 0x66, 0xa5, 0xb8, 0xa7, 0x1d, 0x53, 0x8a, 0x7c, 0x42, 0x6d, 0x95, 0x57,
- 0x22, 0x45, 0x5c, 0xae, 0xe7, 0xb6, 0xa6, 0x8e, 0xd8, 0x25, 0xbb, 0xb5,
- 0x22, 0x3a, 0x7e, 0xc3, 0xa5, 0xcd, 0xa1, 0x67, 0x2d, 0xaf, 0xaa, 0x35,
- 0x6d, 0xd8, 0xeb, 0x93, 0xd3, 0x63, 0x9b, 0x0f, 0xfb, 0xbf, 0x76, 0x87,
- 0x20, 0x78, 0x39, 0x09, 0x32, 0x2f, 0xb9, 0x00, 0xdc, 0xab, 0xe6, 0x97,
- 0x0a, 0xf1, 0xef, 0xfa, 0xdc, 0x9e, 0x98, 0x7e, 0xdc, 0x28, 0x0f, 0x3f,
- 0x7e, 0xfb, 0xfd, 0xc9, 0xbb, 0xb3, 0xb7, 0x6f, 0x8e, 0xdf, 0x5e, 0x7c,
- 0xe6, 0x89, 0xbb, 0x58, 0xa3, 0x99, 0x2a, 0x4c, 0xfa, 0xc8, 0x11, 0xa6,
- 0xbb, 0xa1, 0x3a, 0x59, 0x6e, 0xf8, 0x64, 0xd6, 0x29, 0xff, 0x1a, 0xfa,
- 0xc3, 0x79, 0x0f, 0x69, 0xc4, 0x05, 0x69, 0x54, 0x2b, 0xb8, 0xa9, 0xa6,
- 0x88, 0x77, 0x0f, 0x39, 0x46, 0x63, 0x1b, 0xbc, 0xa3, 0x0c, 0xf6, 0x16,
- 0xbd, 0x05, 0x28, 0x95, 0x1c, 0xb5, 0x87, 0x9f, 0x59, 0x92, 0x70, 0x70,
- 0xd6, 0x85, 0x4b, 0x1a, 0x93, 0x70, 0xcc, 0xfd, 0x9e, 0x11, 0x0a, 0xe2,
- 0x4d, 0x73, 0x14, 0xa9, 0x92, 0xd4, 0x01, 0xfa, 0xe8, 0x55, 0x5a, 0xb9,
- 0x98, 0x98, 0x38, 0x6e, 0x7c, 0x94, 0x29, 0x0f, 0x23, 0xdc, 0xeb, 0x45,
- 0xdf, 0xc6, 0x05, 0xf7, 0x56, 0xf1, 0x17, 0xf5, 0x16, 0x1d, 0xee, 0xee,
- 0xfe, 0xfc, 0x02, 0xca, 0xea, 0x97, 0x7f, 0x39, 0x04, 0x17, 0xfc, 0x1c,
- 0xe2, 0x1b, 0x57, 0xde, 0x44, 0x5c, 0xc9, 0x99, 0x56, 0xa7, 0x82, 0x6f,
- 0x2d, 0x39, 0xc9, 0xa9, 0xfd, 0xe1, 0xfc, 0xdd, 0xd9, 0x8f, 0x7f, 0xfe,
- 0x8d, 0x3f, 0xe1, 0xe5, 0x47, 0xfd, 0x05, 0x99, 0xb3, 0x3a, 0xf8, 0xcf,
- 0xbf, 0xea, 0x6b, 0x1b, 0x3f, 0xd7, 0x1c, 0xbf, 0x2f, 0x29, 0x10, 0xf2,
- 0x46, 0x90, 0xd0, 0x40, 0xa8, 0x0b, 0xdc, 0x88, 0x4f, 0x31, 0x18, 0x9c,
- 0x87, 0xc3, 0xe6, 0x21, 0xf2, 0xfd, 0x56, 0xb5, 0x80, 0x78, 0x42, 0xf7,
- 0x32, 0xe1, 0x4a, 0x51, 0xd5, 0xbd, 0xcb, 0x68, 0xeb, 0x0b, 0x26, 0x04,
- 0x40, 0x1f, 0xfa, 0x54, 0xb3, 0x4f, 0x79, 0xc4, 0x96, 0x1e, 0x2f, 0x4f,
- 0x4f, 0x7f, 0x3d, 0x11, 0xb4, 0x25, 0x5c, 0x93, 0x0c, 0xd4, 0x4b, 0xde,
- 0x2e, 0x68, 0x60, 0x75, 0x54, 0x3d, 0x02, 0x9b, 0x60, 0xa6, 0xdf, 0x9e,
- 0xc9, 0x6c, 0x5e, 0x90, 0x72, 0x3c, 0xa8, 0x32, 0xa3, 0xd2, 0xa6, 0xc8,
- 0xc3, 0xd0, 0x36, 0x03, 0x98, 0x58, 0xb5, 0xcb, 0xb9, 0xb8, 0x41, 0xe7,
- 0x78, 0xff, 0x21, 0x4e, 0xd4, 0x65, 0x7a, 0x72, 0x51, 0x25, 0x55, 0xbd,
- 0x14, 0x16, 0x52, 0x0c, 0xd9, 0x60, 0x9c, 0x17, 0xcc, 0x32, 0xcf, 0x4c,
- 0x24, 0x04, 0x67, 0x41, 0x95, 0xbc, 0x11, 0x79, 0x65, 0x5e, 0x7d, 0xa4,
- 0xa2, 0x20, 0x9c, 0x50, 0xd2, 0x90, 0x14, 0x80, 0x03, 0x2a, 0x2f, 0xcd,
- 0x49, 0x10, 0x82, 0x5c, 0x35, 0x66, 0x5e, 0xc5, 0x66, 0x87, 0x4b, 0x37,
- 0xe5, 0xab, 0x18, 0x6e, 0x54, 0x76, 0xa9, 0xa7, 0x8d, 0xd2, 0x40, 0x69,
- 0xd5, 0xc0, 0xc9, 0x6d, 0x95, 0xc5, 0x08, 0x89, 0x61, 0x4a, 0xf4, 0xb5,
- 0x22, 0x1f, 0x0f, 0xf0, 0xa7, 0xeb, 0x2a, 0x9b, 0xcf, 0x3a, 0xe0, 0x31,
- 0x7c, 0x81, 0xe1, 0x24, 0x86, 0x22, 0x74, 0x54, 0xda, 0x1a, 0xce, 0x31,
- 0x38, 0x90, 0x74, 0x28, 0x4e, 0x12, 0xfa, 0xeb, 0x84, 0x13, 0x5d, 0xae,
- 0xc5, 0x2d, 0x25, 0x7f, 0x08, 0x4b, 0xd8, 0x04, 0x0b, 0x06, 0x36, 0xc5,
- 0xc7, 0x75, 0x6f, 0xbf, 0x98, 0x86, 0x05, 0x77, 0x80, 0x89, 0xf5, 0x6b,
- 0x11, 0x45, 0xb5, 0x18, 0xdc, 0x26, 0x8a, 0xfa, 0xc3, 0x3b, 0xd5, 0x78,
- 0x46, 0x7e, 0xf3, 0x90, 0xe1, 0x2c, 0x02, 0x06, 0xf3, 0x6d, 0x52, 0x23,
- 0xf3, 0xb9, 0x4e, 0x24, 0x4e, 0x23, 0x70, 0x63, 0xd8, 0xd9, 0x58, 0xe1,
- 0x90, 0x37, 0xf1, 0x70, 0xe4, 0x07, 0xcc, 0x34, 0x12, 0xb3, 0x37, 0x8f,
- 0xc1, 0x09, 0xcf, 0xf0, 0x4f, 0xfe, 0x78, 0x76, 0xa2, 0xd4, 0x8d, 0x8d,
- 0x67, 0xc9, 0x7a, 0x9c, 0xe2, 0xe0, 0x65, 0xb1, 0x90, 0x62, 0xbc, 0x5a,
- 0x9e, 0x18, 0x8e, 0x72, 0x9a, 0xe8, 0x40, 0xc8, 0x89, 0x68, 0x40, 0x3f,
- 0x68, 0xe9, 0x99, 0x0b, 0x76, 0x50, 0xec, 0x28, 0xa8, 0x05, 0xa7, 0x7c,
- 0x6e, 0xa9, 0x9f, 0xa3, 0xc0, 0x8f, 0xcd, 0xc2, 0x95, 0x5a, 0x6b, 0x2a,
- 0xcf, 0x1c, 0x6b, 0x95, 0xba, 0xed, 0x10, 0x6b, 0xae, 0xc0, 0x79, 0x51,
- 0xc5, 0xb0, 0x70, 0xc7, 0x28, 0x76, 0xc8, 0xfc, 0xde, 0x60, 0x47, 0x66,
- 0xa1, 0x1f, 0x46, 0xa3, 0xd3, 0x0f, 0x5f, 0xbf, 0x3c, 0xfa, 0xee, 0xf8,
- 0xed, 0xab, 0xe4, 0x85, 0x97, 0x78, 0xfd, 0x65, 0xa4, 0xcc, 0x4d, 0x12,
- 0xa1, 0xba, 0xab, 0x3f, 0x7a, 0x9a, 0xf3, 0xdd, 0x6b, 0x81, 0x62, 0xe5,
- 0xed, 0xa3, 0x7e, 0xa5, 0x83, 0x0c, 0xa0, 0xa3, 0x7b, 0x43, 0x2c, 0xa4,
- 0x1d, 0xd6, 0x92, 0xb4, 0x4d, 0x6f, 0x42, 0x7d, 0x75, 0x25, 0x6e, 0xaa,
- 0x20, 0x75, 0x87, 0x4c, 0x35, 0x8c, 0xcc, 0x3a, 0x7b, 0x48, 0x69, 0x40,
- 0x1b, 0x5c, 0x2d, 0x5d, 0xe7, 0xcc, 0xa4, 0x59, 0x6c, 0x8f, 0x9d, 0x5d,
- 0x2f, 0x5f, 0x6f, 0xb4, 0xa1, 0xd3, 0x04, 0x2e, 0x18, 0xf2, 0x1f, 0xaf,
- 0xa9, 0x28, 0x5e, 0x71, 0x76, 0x78, 0xd3, 0x63, 0x45, 0x5a, 0xe6, 0x05,
- 0x08, 0xc4, 0xd4, 0x2d, 0x3b, 0x15, 0xc8, 0x38, 0x33, 0x97, 0xbe, 0x07,
- 0x5a, 0xc4, 0x97, 0x51, 0x9d, 0xde, 0xd9, 0xb3, 0x1e, 0x07, 0xef, 0x71,
- 0x1b, 0xf9, 0xef, 0xa7, 0x67, 0xdf, 0xbc, 0x3a, 0x79, 0x97, 0xbc, 0x68,
- 0xc2, 0xf8, 0x45, 0xb6, 0x30, 0x56, 0xbe, 0xd3, 0xac, 0x10, 0xe9, 0x5b,
- 0xcc, 0xa0, 0xba, 0x2d, 0xc2, 0x82, 0xa6, 0x32, 0x2a, 0xcf, 0xb8, 0x6f,
- 0xb9, 0xa4, 0x5c, 0xb8, 0x39, 0xb4, 0x96, 0x64, 0x0e, 0xce, 0x74, 0x3d,
- 0xc9, 0x92, 0xbf, 0xcd, 0x8b, 0xcb, 0x2a, 0xb4, 0xb8, 0x89, 0x48, 0xf6,
- 0xe5, 0xbe, 0xa8, 0x49, 0x16, 0x45, 0xaf, 0x62, 0xca, 0xe2, 0x66, 0xa6,
- 0x8c, 0x66, 0x01, 0x03, 0xce, 0x00, 0xb8, 0x10, 0xf3, 0xc7, 0xfb, 0x99,
- 0x27, 0xe8, 0x7d, 0xb3, 0x8d, 0x1b, 0xfc, 0x2a, 0xbb, 0x45, 0x0f, 0x92,
- 0x57, 0x05, 0xb5, 0xb0, 0xcb, 0xac, 0x4d, 0x58, 0x49, 0xa1, 0x86, 0x70,
- 0x8d, 0x11, 0x0c, 0x01, 0xb6, 0x70, 0x4a, 0x17, 0x07, 0x55, 0x70, 0x0c,
- 0x93, 0x1f, 0xa8, 0x5b, 0x08, 0x51, 0x6f, 0x5c, 0x98, 0x3f, 0x00, 0xb1,
- 0x1d, 0xa9, 0x58, 0x30, 0x07, 0xe1, 0xbb, 0xe3, 0x3f, 0x9b, 0xcd, 0x81,
- 0xd2, 0xcd, 0x98, 0x96, 0x5d, 0x1b, 0x43, 0x90, 0x1e, 0x99, 0xe4, 0x9a,
- 0x76, 0xe9, 0x99, 0xa9, 0x23, 0x47, 0x03, 0xe2, 0x23, 0x70, 0xc3, 0xe3,
- 0x0c, 0x31, 0xda, 0xf5, 0xa4, 0x84, 0xf6, 0x40, 0x9e, 0x05, 0x73, 0x53,
- 0x79, 0x54, 0x91, 0xd2, 0xd8, 0x94, 0x51, 0x55, 0x99, 0xaf, 0x89, 0x9f,
- 0x63, 0x90, 0x69, 0x5c, 0x50, 0xc5, 0x65, 0xae, 0xb8, 0xa3, 0xd3, 0xf9,
- 0xdd, 0xdf, 0x33, 0xdb, 0x32, 0xa3, 0x2e, 0xd3, 0x19, 0x14, 0x8e, 0x7c,
- 0x49, 0xf5, 0xa5, 0x6c, 0xf3, 0xf3, 0xf6, 0xa1, 0xc7, 0x66, 0x3b, 0x49,
- 0x95, 0x10, 0x92, 0x68, 0x08, 0xf6, 0x96, 0xa3, 0x8a, 0x40, 0xf1, 0xbe,
- 0x7e, 0x00, 0x3a, 0xf6, 0x55, 0x5a, 0x7e, 0x14, 0x93, 0xf9, 0xc6, 0x11,
- 0x9a, 0x73, 0xb0, 0xe7, 0x21, 0x2e, 0xe1, 0x8d, 0x76, 0xe4, 0xd1, 0x0d,
- 0x38, 0xd4, 0xb6, 0x2a, 0x54, 0xcc, 0x09, 0x49, 0x3a, 0xef, 0x27, 0x5f,
- 0x17, 0xc8, 0x1c, 0xa7, 0x1f, 0x4a, 0xab, 0x15, 0xf3, 0x97, 0xb7, 0xa3,
- 0x51, 0xa4, 0x10, 0xfb, 0xa6, 0x98, 0xcf, 0xcc, 0x83, 0x66, 0x1f, 0x59,
- 0x37, 0x32, 0x7f, 0x5e, 0x9c, 0x1d, 0x9d, 0x9d, 0x9a, 0xbf, 0x1c, 0xbf,
- 0x3e, 0xf9, 0xd1, 0x99, 0x4f, 0xd2, 0xf3, 0x94, 0x37, 0xc2, 0x26, 0x80,
- 0x11, 0xc0, 0xf4, 0xb3, 0x7e, 0x43, 0x6f, 0xe5, 0x44, 0x7a, 0xe4, 0xd0,
- 0x37, 0xac, 0x9e, 0x66, 0x67, 0x70, 0x4f, 0x21, 0x24, 0x10, 0x9d, 0xfc,
- 0xd6, 0x47, 0x59, 0xf3, 0xa4, 0x85, 0x8c, 0x6a, 0x8b, 0x30, 0x1c, 0xc7,
- 0x9d, 0x34, 0x74, 0x41, 0x32, 0x41, 0x7d, 0x13, 0xab, 0xa9, 0x45, 0xf2,
- 0xa4, 0x28, 0x87, 0x30, 0x97, 0x3c, 0x5c, 0xf9, 0xa1, 0x0e, 0xa7, 0xb5,
- 0xcb, 0xd2, 0x2f, 0x10, 0x87, 0xdc, 0xc1, 0xc0, 0x43, 0x40, 0xf7, 0xbd,
- 0x45, 0xaa, 0x67, 0xa0, 0x36, 0x4c, 0x50, 0x4b, 0x1e, 0xff, 0xb2, 0x81,
- 0x65, 0xd6, 0xba, 0x3a, 0xa9, 0x14, 0xd6, 0x0e, 0xd7, 0x5c, 0x93, 0x10,
- 0x40, 0x92, 0xd1, 0x29, 0xf8, 0x0f, 0x8f, 0x87, 0x07, 0x64, 0x28, 0xd7,
- 0x7a, 0xb4, 0x2e, 0x9f, 0xeb, 0x81, 0xf1, 0x1f, 0x37, 0x09, 0xd5, 0x3d,
- 0xf1, 0x55, 0xdb, 0x86, 0x8f, 0xc8, 0xa5, 0xd1, 0xfb, 0x55, 0xe8, 0x83,
- 0xc2, 0x1e, 0x88, 0x57, 0xa4, 0x69, 0x9a, 0x55, 0x1b, 0x3e, 0x1d, 0x12,
- 0x20, 0x28, 0x88, 0x43, 0x25, 0x48, 0xf5, 0x78, 0xd3, 0x18, 0x30, 0x9d,
- 0xff, 0xb6, 0xce, 0xaf, 0x53, 0x2a, 0xe2, 0x36, 0xb7, 0xd4, 0x60, 0xc0,
- 0x2f, 0xb5, 0xc6, 0x48, 0x7f, 0xd5, 0x20, 0x69, 0x73, 0x94, 0x27, 0xbf,
- 0x66, 0x90, 0x27, 0xad, 0x31, 0xae, 0x7e, 0xd5, 0x20, 0x03, 0xd5, 0xa4,
- 0x3f, 0xfb, 0xec, 0xf8, 0xc7, 0x93, 0x8b, 0xe4, 0xe8, 0xec, 0x95, 0x3b,
- 0x60, 0x17, 0x64, 0xcd, 0x31, 0x0b, 0x98, 0x2b, 0x6b, 0x69, 0x78, 0x10,
- 0x9d, 0x2e, 0x6d, 0xd7, 0x2e, 0x4e, 0xb4, 0x47, 0x0e, 0x47, 0xa5, 0xb5,
- 0xe1, 0x79, 0xc9, 0xa0, 0x8b, 0xc8, 0x20, 0x21, 0x37, 0xb7, 0x07, 0x86,
- 0x81, 0x87, 0x17, 0x80, 0x73, 0xbc, 0x54, 0x43, 0x05, 0x27, 0x12, 0x88,
- 0xbe, 0xe6, 0xa2, 0x17, 0xf8, 0x86, 0x71, 0x0a, 0xd4, 0xc6, 0x25, 0x83,
- 0x10, 0x18, 0x23, 0xe3, 0x25, 0x4f, 0x9e, 0x64, 0x5a, 0x31, 0x6b, 0x98,
- 0x19, 0xd2, 0xbf, 0xbc, 0x2f, 0x25, 0xdf, 0x79, 0xad, 0x33, 0xf1, 0x53,
- 0xe1, 0xf7, 0xb4, 0xfe, 0xa7, 0xc1, 0xe9, 0xd2, 0x3a, 0x98, 0x64, 0x1c,
- 0xae, 0xe2, 0xa9, 0xed, 0xd2, 0x21, 0x0d, 0xb3, 0xab, 0x46, 0xd9, 0x73,
- 0x60, 0xda, 0xd8, 0x21, 0xec, 0x77, 0xf6, 0x25, 0xe6, 0x9a, 0xe6, 0x73,
- 0x76, 0xaf, 0x4a, 0x62, 0x74, 0xfe, 0x77, 0xcf, 0x93, 0x71, 0x60, 0x0d,
- 0x57, 0xb3, 0xf2, 0x39, 0x25, 0xc5, 0x4c, 0xf9, 0x44, 0x54, 0x77, 0xc6,
- 0xfa, 0xb9, 0x25, 0xd5, 0x00, 0x6e, 0x26, 0xc1, 0xad, 0x74, 0x6f, 0x3e,
- 0xd6, 0x8c, 0x53, 0x05, 0xc7, 0x2c, 0x4a, 0xeb, 0xb8, 0x53, 0x97, 0xa7,
- 0x73, 0xed, 0x2a, 0x12, 0x89, 0xde, 0xd1, 0x39, 0xe5, 0x0d, 0x84, 0xc7,
- 0x4b, 0x92, 0x3b, 0xf4, 0xab, 0x0a, 0x6c, 0x22, 0x6d, 0x45, 0xbc, 0x1e,
- 0xd0, 0x16, 0xd3, 0xd0, 0x7c, 0x8a, 0xe8, 0x35, 0xe0, 0xfe, 0x97, 0x2d,
- 0x25, 0xdc, 0x87, 0x3a, 0xd0, 0x4b, 0x73, 0x5a, 0x10, 0x01, 0x19, 0x71,
- 0xcc, 0xd0, 0x6d, 0x9c, 0x02, 0x53, 0x89, 0xba, 0x4e, 0xa7, 0x4b, 0x2e,
- 0xe9, 0xd7, 0x1d, 0x88, 0x17, 0xb7, 0xbb, 0x92, 0xde, 0x27, 0xa2, 0x37,
- 0xab, 0x71, 0xab, 0xa5, 0xd9, 0x89, 0xb5, 0x6b, 0x2f, 0x2c, 0x6e, 0x94,
- 0xf8, 0x82, 0x0a, 0xc2, 0xc3, 0x82, 0xc2, 0x8e, 0x05, 0x8e, 0x63, 0x7e,
- 0xee, 0xaa, 0x15, 0x0c, 0x7a, 0xda, 0xfa, 0x8a, 0x7e, 0x84, 0x71, 0x2b,
- 0xdd, 0x17, 0xfc, 0xe0, 0xa5, 0x52, 0x50, 0x9e, 0xf5, 0x46, 0x7b, 0xd6,
- 0xe6, 0x0b, 0x2f, 0x04, 0x4a, 0x23, 0xda, 0x27, 0x3f, 0x17, 0xa7, 0x6d,
- 0x06, 0x74, 0x00, 0x71, 0x31, 0x94, 0xd9, 0x6a, 0x2e, 0x32, 0x53, 0x7e,
- 0x42, 0x39, 0x36, 0xe4, 0x78, 0x25, 0x2a, 0x4f, 0x74, 0x96, 0x46, 0x65,
- 0xf6, 0x7d, 0x66, 0xcf, 0xe5, 0xb3, 0x46, 0xee, 0xb2, 0x89, 0x05, 0x78,
- 0xab, 0xdc, 0x72, 0x1b, 0x8f, 0xc5, 0x3f, 0x42, 0x7e, 0x3e, 0x81, 0x27,
- 0xe9, 0xbf, 0xf5, 0x8d, 0x10, 0xcf, 0x97, 0xaf, 0x2f, 0x0f, 0xa6, 0x11,
- 0xeb, 0x5d, 0x97, 0x8c, 0x8f, 0xe1, 0x14, 0x4f, 0xed, 0x22, 0xc3, 0x0b,
- 0x2e, 0x81, 0x3b, 0x3c, 0x4c, 0xde, 0x14, 0x01, 0xc6, 0x76, 0x31, 0xab,
- 0x05, 0xe3, 0x06, 0x99, 0xf5, 0x4c, 0x1d, 0x63, 0x79, 0x5c, 0x8a, 0xb2,
- 0xe5, 0x06, 0x64, 0xdd, 0x54, 0x2f, 0x43, 0x73, 0xd4, 0xc9, 0xce, 0x5b,
- 0x76, 0xc2, 0x3c, 0x39, 0x3a, 0xec, 0x3d, 0xb2, 0x74, 0x90, 0x1e, 0xa7,
- 0x04, 0xc5, 0x04, 0x42, 0xfc, 0x40, 0xe0, 0xcb, 0x37, 0x29, 0x09, 0x11,
- 0x8b, 0x6f, 0xe0, 0x7c, 0x3b, 0xba, 0x51, 0x50, 0x6b, 0xc2, 0x42, 0x1f,
- 0x4a, 0xdb, 0x4c, 0x39, 0xfa, 0xc0, 0xa5, 0x0a, 0x5c, 0x0f, 0x2c, 0xb7,
- 0x55, 0x9f, 0xfc, 0x95, 0x56, 0x3c, 0x72, 0x3e, 0x0a, 0x59, 0x48, 0x28,
- 0x0e, 0xee, 0x70, 0x5d, 0x03, 0x9c, 0xd3, 0xd3, 0x9b, 0x1d, 0x3a, 0x97,
- 0xb7, 0x9e, 0x3d, 0xb7, 0x9e, 0x1b, 0xe2, 0x94, 0xf3, 0x97, 0xa3, 0x91,
- 0xf2, 0xc9, 0x51, 0xc8, 0x12, 0x12, 0xdc, 0x21, 0xac, 0x3a, 0x81, 0x23,
- 0x09, 0x2d, 0x1a, 0x19, 0xa3, 0x95, 0x8d, 0xb5, 0xc7, 0x32, 0xed, 0x15,
- 0x0b, 0xe6, 0xf8, 0x72, 0x6f, 0x1a, 0x44, 0xe4, 0x50, 0x1f, 0x2b, 0x32,
- 0x02, 0xf2, 0x15, 0xf0, 0x90, 0x4f, 0x56, 0x22, 0x33, 0xa1, 0x7e, 0xa8,
- 0x8c, 0x87, 0x11, 0x6d, 0xe4, 0x4e, 0xde, 0xe8, 0x36, 0xbd, 0x77, 0x10,
- 0x59, 0xf4, 0xf7, 0xbc, 0xaa, 0xfe, 0x7f, 0x65, 0xd1, 0xdf, 0x47, 0x16,
- 0xfd, 0xd8, 0x7e, 0x8b, 0x3f, 0xb5, 0xbf, 0xff, 0x4c, 0x0a, 0x03, 0x39,
- 0x98, 0x01, 0xe0, 0x25, 0x2b, 0x80, 0xf8, 0x6b, 0xbc, 0x62, 0xf3, 0xe0,
- 0x80, 0x51, 0x4e, 0xc2, 0x6f, 0x79, 0x87, 0xd7, 0xfb, 0xd4, 0x13, 0xb7,
- 0x2c, 0x63, 0xf8, 0x60, 0x3c, 0xb8, 0x3f, 0x58, 0xce, 0x04, 0xe2, 0x47,
- 0xbd, 0x5e, 0x70, 0x58, 0xdc, 0x20, 0x71, 0xb6, 0x8e, 0xa7, 0x62, 0xea,
- 0x34, 0xbc, 0xef, 0x3c, 0xb5, 0xfe, 0xe6, 0xdd, 0x7d, 0xcd, 0x35, 0x7a,
- 0x49, 0xb2, 0x78, 0x9e, 0x2d, 0x88, 0x35, 0xa7, 0x19, 0x60, 0xf1, 0x5c,
- 0xa8, 0x84, 0x31, 0x0f, 0x66, 0x65, 0x4a, 0x3d, 0x25, 0xe6, 0xe9, 0x5d,
- 0x04, 0xb8, 0x53, 0x42, 0x6a, 0xec, 0xd7, 0x31, 0xe7, 0xf3, 0x32, 0x5b,
- 0xc2, 0xa5, 0x42, 0x8a, 0x80, 0x58, 0xff, 0x70, 0x21, 0x50, 0x7a, 0xd1,
- 0xcc, 0xc6, 0xb4, 0xe4, 0xab, 0x01, 0xee, 0x4e, 0x25, 0xad, 0xa7, 0xf9,
- 0xcc, 0x88, 0x96, 0x10, 0x47, 0xc0, 0xdd, 0x7b, 0x66, 0xe9, 0x66, 0x77,
- 0x02, 0xb6, 0x1b, 0x43, 0x71, 0x79, 0xa4, 0x53, 0x61, 0xa2, 0x91, 0x53,
- 0xa9, 0x01, 0xa0, 0x74, 0x86, 0x3c, 0x74, 0x2f, 0x96, 0x9e, 0x82, 0xb8,
- 0xc7, 0xd2, 0xf8, 0x1c, 0xb2, 0x4e, 0xda, 0x0a, 0x0c, 0x93, 0x33, 0x0a,
- 0x57, 0x34, 0x5a, 0xa9, 0xb0, 0xf1, 0x96, 0x3a, 0xec, 0x81, 0x26, 0xe3,
- 0x3e, 0xf7, 0x76, 0x58, 0x67, 0xa5, 0x69, 0x82, 0xbb, 0x22, 0x66, 0x1d,
- 0xd6, 0xa1, 0x06, 0xe5, 0xb2, 0xe4, 0xdd, 0xf1, 0xc5, 0x3b, 0xca, 0x88,
- 0x81, 0x00, 0x08, 0x4c, 0xae, 0xb4, 0xdc, 0xb1, 0x68, 0x7c, 0x22, 0xcd,
- 0x9c, 0x1e, 0xe2, 0x04, 0x04, 0x63, 0xa1, 0xda, 0xfd, 0xe6, 0x7f, 0xea,
- 0x7b, 0x5c, 0xbe, 0x99, 0x69, 0xb1, 0xa4, 0x8b, 0x7d, 0x37, 0x51, 0x5a,
- 0xf7, 0xf7, 0x5d, 0xba, 0x26, 0x3a, 0x80, 0xcb, 0x2d, 0x27, 0x95, 0x50,
- 0x43, 0xc9, 0xd5, 0xd7, 0xe2, 0x41, 0xf5, 0x6e, 0xe0, 0x21, 0xce, 0x16,
- 0x2e, 0xca, 0x98, 0xde, 0x21, 0x9f, 0xb6, 0x0a, 0x80, 0x4c, 0xc2, 0xaf,
- 0xad, 0x63, 0xf8, 0x04, 0x4f, 0x82, 0x32, 0x32, 0xfe, 0xe3, 0x47, 0x8f,
- 0xc2, 0x9a, 0x95, 0x74, 0x6c, 0x84, 0xaa, 0x68, 0x73, 0x52, 0x96, 0x4a,
- 0xaf, 0x70, 0x78, 0x89, 0xd4, 0xcb, 0x0a, 0xb6, 0xc6, 0x60, 0x86, 0x78,
- 0x0f, 0x28, 0x16, 0x1a, 0x15, 0xfb, 0x2c, 0x63, 0x7e, 0xa0, 0x32, 0x59,
- 0xa1, 0x59, 0x53, 0xb2, 0x70, 0x05, 0x2d, 0x5d, 0xbd, 0x74, 0x3d, 0xb1,
- 0xbb, 0x85, 0x1d, 0x17, 0x12, 0x26, 0x0c, 0x66, 0x16, 0xc8, 0xef, 0xfd,
- 0x27, 0x11, 0x8e, 0x48, 0x46, 0x17, 0x67, 0xef, 0xb4, 0xc3, 0x50, 0x78,
- 0x3f, 0x53, 0x8a, 0x18, 0x9e, 0xb0, 0xb0, 0x66, 0xfd, 0x10, 0xdb, 0x6e,
- 0x6a, 0x41, 0x35, 0x2c, 0x58, 0xbb, 0xf7, 0x55, 0x96, 0x00, 0xd4, 0x75,
- 0x58, 0xd6, 0xf6, 0xbd, 0x20, 0x09, 0x68, 0x63, 0x02, 0x3d, 0x97, 0xde,
- 0x4b, 0x7c, 0xcc, 0xce, 0xf8, 0xfc, 0x32, 0x3c, 0x0b, 0xf8, 0x48, 0x80,
- 0x5a, 0xd0, 0xd7, 0x40, 0xaa, 0x20, 0x6c, 0x8f, 0xf6, 0x36, 0x2f, 0xf2,
- 0x21, 0x3a, 0x73, 0x8d, 0x27, 0x58, 0xc2, 0xcb, 0x22, 0xad, 0x65, 0x8c,
- 0x1f, 0x53, 0x1a, 0x22, 0x37, 0x66, 0x90, 0x0c, 0xd0, 0x94, 0x83, 0x06,
- 0x93, 0xa0, 0x79, 0x4d, 0x51, 0x2a, 0x14, 0xbd, 0x5c, 0x9c, 0x6a, 0x2c,
- 0x38, 0x3d, 0xdb, 0xbb, 0xf5, 0xcf, 0xcf, 0xde, 0x5d, 0x24, 0xf6, 0xd2,
- 0xa7, 0x2f, 0xd3, 0x8f, 0x5a, 0x07, 0x08, 0x8d, 0xd7, 0x28, 0xb8, 0xe1,
- 0xea, 0x0e, 0x83, 0xc8, 0x8d, 0xd8, 0x04, 0x75, 0x6b, 0x88, 0x3e, 0xf5,
- 0x26, 0x9e, 0x16, 0xec, 0x80, 0x74, 0x79, 0x1a, 0x52, 0xde, 0x4b, 0xf7,
- 0x4c, 0x17, 0x04, 0xa7, 0x53, 0x6e, 0x0f, 0xf6, 0x22, 0x9c, 0x01, 0x2b,
- 0xfa, 0xdd, 0xf1, 0xe8, 0x82, 0x29, 0x86, 0xbf, 0x05, 0xf3, 0x66, 0x20,
- 0x0f, 0xf9, 0x61, 0x60, 0xa8, 0x58, 0xce, 0x40, 0xa6, 0x2e, 0xdc, 0x77,
- 0x18, 0x3f, 0xd2, 0x7d, 0xee, 0xe0, 0xc0, 0x4b, 0xcb, 0x26, 0xa9, 0x29,
- 0x7c, 0x42, 0x07, 0x9c, 0x7e, 0xd0, 0x93, 0x8f, 0xf4, 0x8c, 0x62, 0x36,
- 0xd5, 0x7e, 0xa8, 0xde, 0x08, 0x8f, 0x3d, 0x49, 0x81, 0x7b, 0x4a, 0x06,
- 0x38, 0x61, 0x50, 0x99, 0x39, 0xfd, 0x70, 0xa0, 0xac, 0x42, 0x97, 0x05,
- 0x33, 0x05, 0x3f, 0xe7, 0xc6, 0x79, 0x62, 0x11, 0x30, 0x54, 0x55, 0xf0,
- 0xa6, 0x82, 0x1f, 0x6b, 0x6a, 0x24, 0xa9, 0x6d, 0x2d, 0x96, 0x3b, 0x60,
- 0x4e, 0xff, 0x3a, 0x9d, 0xba, 0xf4, 0x6e, 0x5e, 0xba, 0x7f, 0x2f, 0x18,
- 0x5d, 0x2b, 0x5f, 0xae, 0x19, 0xa3, 0x39, 0x2d, 0xe7, 0x68, 0x68, 0x65,
- 0x64, 0x08, 0x7b, 0x55, 0xf0, 0x5a, 0xac, 0xf9, 0x86, 0xf7, 0x0d, 0xb9,
- 0x7f, 0xe0, 0x54, 0x9c, 0xb8, 0x6b, 0x3a, 0x9d, 0xca, 0x09, 0x76, 0xba,
- 0xbe, 0x39, 0xb0, 0x4b, 0x7b, 0x4d, 0x0c, 0x93, 0xf3, 0xac, 0x24, 0xbc,
- 0x7d, 0xc3, 0xab, 0xff, 0xea, 0x46, 0xe3, 0x43, 0x42, 0xa1, 0x4a, 0x73,
- 0x6d, 0x92, 0x99, 0x92, 0x2f, 0xcd, 0xc6, 0xd2, 0x4f, 0xf0, 0x57, 0xaf,
- 0x73, 0x4b, 0xb0, 0xdc, 0xe7, 0xee, 0xe5, 0xca, 0x2c, 0xc5, 0x18, 0xe8,
- 0xed, 0x47, 0x1e, 0x0b, 0x5f, 0x19, 0xeb, 0x9d, 0x86, 0xb0, 0xb2, 0x19,
- 0x67, 0x59, 0x1a, 0xe2, 0x4d, 0x79, 0x84, 0x99, 0x3e, 0xd3, 0x90, 0xe1,
- 0xde, 0x50, 0x7c, 0x19, 0xbc, 0x1c, 0xdb, 0x3e, 0x84, 0xa8, 0xa7, 0x80,
- 0x22, 0x67, 0xc6, 0x5a, 0x42, 0xd2, 0xce, 0x6d, 0x89, 0x95, 0xcd, 0x97,
- 0x81, 0xac, 0x1c, 0xeb, 0xb1, 0xc1, 0x4a, 0xda, 0xc4, 0x4d, 0x9b, 0x81,
- 0xf7, 0xc7, 0xcc, 0x89, 0x96, 0x6d, 0xec, 0xfd, 0xd5, 0x98, 0x9d, 0x14,
- 0x72, 0x08, 0xc0, 0x2c, 0x9c, 0x06, 0x08, 0x9c, 0x9a, 0x0b, 0xde, 0x57,
- 0xfe, 0x1f, 0x3f, 0x71, 0x43, 0xcd, 0x00, 0x4a, 0x60, 0xc7, 0x72, 0xb2,
- 0xc7, 0xf6, 0xca, 0x62, 0xf4, 0x23, 0x7a, 0x4c, 0x2c, 0x46, 0x22, 0x41,
- 0x08, 0x39, 0xd0, 0xbc, 0x37, 0x1e, 0x3f, 0x13, 0xd3, 0x17, 0xb6, 0xef,
- 0xf2, 0xce, 0x95, 0x5c, 0x0d, 0x39, 0xfd, 0x86, 0xfd, 0x66, 0xdc, 0x8e,
- 0x4f, 0x7e, 0x23, 0x68, 0xc7, 0x57, 0xe2, 0x97, 0x41, 0x87, 0xcd, 0x00,
- 0xda, 0x78, 0xbd, 0x90, 0x62, 0x07, 0xef, 0x4b, 0x9f, 0x8b, 0x27, 0x83,
- 0x4b, 0x68, 0x14, 0xe4, 0xd0, 0x49, 0xd1, 0x42, 0x2d, 0x66, 0x0b, 0x18,
- 0x68, 0x98, 0x87, 0x92, 0xf0, 0x6d, 0x27, 0xe4, 0x10, 0xcc, 0x16, 0x10,
- 0xa1, 0x74, 0x15, 0x8b, 0xba, 0xab, 0x4e, 0x85, 0x42, 0x61, 0x2c, 0xc4,
- 0xb9, 0x20, 0xcf, 0xf1, 0xaf, 0xba, 0x31, 0xfa, 0xca, 0xec, 0xaf, 0xa4,
- 0x48, 0x0e, 0x6d, 0x8b, 0x7b, 0x4d, 0xbe, 0x49, 0x97, 0xeb, 0xd4, 0xb3,
- 0xe5, 0x1f, 0x3f, 0x17, 0x0f, 0x95, 0xb8, 0x41, 0x90, 0x7f, 0xb4, 0x44,
- 0x8b, 0x8f, 0x56, 0x1e, 0xc6, 0x93, 0x3d, 0xeb, 0xab, 0x44, 0x69, 0x81,
- 0x94, 0xff, 0xf9, 0x05, 0x06, 0x46, 0xb8, 0x8d, 0x46, 0xdf, 0x26, 0x6f,
- 0x5e, 0x3d, 0x41, 0xde, 0xe3, 0x65, 0x56, 0xae, 0x4a, 0xe4, 0xba, 0x2b,
- 0x0f, 0x9f, 0x7d, 0xe7, 0x0d, 0xb6, 0xef, 0x1c, 0x9f, 0x72, 0xc5, 0xe6,
- 0x72, 0x7a, 0x09, 0x55, 0x77, 0x79, 0x07, 0xd8, 0x8e, 0x4b, 0x6d, 0x1a,
- 0xce, 0xde, 0x2f, 0x02, 0x9f, 0x10, 0x54, 0x48, 0x56, 0x5a, 0x3e, 0x6b,
- 0x57, 0xcf, 0x34, 0x04, 0xd8, 0x93, 0x03, 0x27, 0xc0, 0xca, 0xbb, 0x15,
- 0xb9, 0xef, 0x2f, 0x61, 0x17, 0x44, 0x4e, 0xd4, 0x13, 0x16, 0x9a, 0x47,
- 0x7c, 0xee, 0xa1, 0xc4, 0x86, 0xaf, 0x91, 0x7a, 0xde, 0x8a, 0x38, 0x3d,
- 0x79, 0xe2, 0x7b, 0x15, 0x2a, 0x69, 0xf8, 0xaa, 0xfd, 0x0f, 0xa0, 0xa3,
- 0x78, 0xcf, 0x3e, 0xb5, 0xcf, 0xc2, 0x71, 0x44, 0x51, 0x02, 0x6d, 0xd4,
- 0xd8, 0xf1, 0x86, 0x28, 0xbf, 0x6a, 0x20, 0xa8, 0xfb, 0x9f, 0x35, 0x1e,
- 0x8f, 0xf6, 0xde, 0x2b, 0xcf, 0x9b, 0x4e, 0x13, 0xea, 0x92, 0x64, 0x59,
- 0x93, 0x16, 0x95, 0xaf, 0xae, 0xfc, 0xc3, 0xf9, 0x94, 0xef, 0xe8, 0x73,
- 0xd4, 0x8b, 0x34, 0xf6, 0x53, 0x85, 0x60, 0xe6, 0xe3, 0x03, 0xe9, 0x59,
- 0x67, 0xde, 0x3f, 0x7a, 0xd9, 0x55, 0xfb, 0x49, 0xdc, 0xee, 0x7d, 0x64,
- 0x4f, 0xce, 0x8c, 0x59, 0x72, 0x71, 0xb9, 0xcc, 0xff, 0xae, 0xf8, 0x3b,
- 0xb8, 0xa0, 0xb5, 0xc9, 0xa6, 0xf7, 0xf8, 0xbe, 0x08, 0x8c, 0xeb, 0x74,
- 0x9e, 0x8b, 0x50, 0x44, 0x96, 0x89, 0x7b, 0xe0, 0x40, 0xb8, 0x96, 0x9b,
- 0xe2, 0x92, 0xf6, 0x8f, 0x6a, 0x25, 0xca, 0x71, 0xca, 0x1a, 0xf5, 0x47,
- 0x4f, 0x1f, 0x8b, 0xce, 0xa5, 0xca, 0x31, 0x6e, 0x5e, 0x10, 0x62, 0x4e,
- 0xc8, 0xc7, 0x6d, 0x31, 0xfd, 0x54, 0xae, 0x3d, 0xd9, 0x4a, 0xaa, 0xe1,
- 0x82, 0xaa, 0x69, 0x5b, 0x96, 0xe2, 0xaf, 0x37, 0xf9, 0x52, 0x6a, 0x82,
- 0x82, 0xd7, 0x9f, 0x76, 0xb8, 0x1f, 0x2b, 0xbe, 0x33, 0x8f, 0x89, 0x97,
- 0xbc, 0xe7, 0x9f, 0x39, 0xd4, 0x0d, 0x07, 0x1b, 0xad, 0x78, 0xc1, 0x7d,
- 0x1f, 0x19, 0x5c, 0x0f, 0x92, 0xf8, 0x4f, 0x32, 0xed, 0xe7, 0x14, 0xe9,
- 0x9f, 0x33, 0xb3, 0x9f, 0x9f, 0x17, 0x97, 0x89, 0x0f, 0x6e, 0xf7, 0x94,
- 0x59, 0xea, 0x35, 0xc5, 0xcf, 0x9c, 0x75, 0xb0, 0x4c, 0x2e, 0x3c, 0x9c,
- 0x07, 0xf7, 0xf4, 0x73, 0xe1, 0x0d, 0xbd, 0x2f, 0xad, 0xb1, 0xda, 0xf5,
- 0xc6, 0xb3, 0x47, 0xbe, 0xb2, 0x3a, 0x45, 0xfa, 0x0a, 0xe3, 0xd0, 0x74,
- 0xbe, 0xc0, 0x9c, 0x71, 0x62, 0xae, 0x91, 0x4b, 0xc3, 0xd4, 0xf4, 0x8c,
- 0x83, 0x0d, 0x76, 0x8f, 0xed, 0x37, 0x84, 0xee, 0x85, 0xaf, 0x3e, 0x25,
- 0x27, 0xaf, 0xbc, 0x07, 0x0f, 0xdc, 0x02, 0xd3, 0x39, 0xb4, 0x81, 0x3b,
- 0x76, 0x54, 0x55, 0xc9, 0x36, 0xde, 0xf2, 0x80, 0x1e, 0x9f, 0x31, 0x67,
- 0xbc, 0x2d, 0x38, 0xec, 0x46, 0xf4, 0x0f, 0x9e, 0x61, 0x76, 0x38, 0xb2,
- 0x70, 0x8e, 0x0e, 0xca, 0x31, 0xd8, 0xfb, 0x67, 0x4f, 0x37, 0x3c, 0x2b,
- 0x97, 0x66, 0x65, 0xaf, 0x7a, 0xef, 0xbd, 0x67, 0xe1, 0x31, 0x57, 0x73,
- 0x40, 0xcb, 0xb9, 0xe4, 0xa4, 0x25, 0xdb, 0xc0, 0xf7, 0xf8, 0x57, 0xf5,
- 0x0c, 0x96, 0x00, 0xee, 0xad, 0xfe, 0xd5, 0x9f, 0xef, 0xe7, 0x7e, 0xe9,
- 0x36, 0xfb, 0x04, 0xa9, 0x0f, 0x05, 0x72, 0x02, 0xfd, 0xa6, 0x58, 0x2e,
- 0x95, 0x92, 0xa8, 0xe3, 0x8d, 0xc0, 0x7b, 0x6e, 0xf4, 0x88, 0xf5, 0xd2,
- 0x49, 0x0e, 0x36, 0x00, 0x05, 0x4e, 0x67, 0xea, 0x63, 0x3c, 0x43, 0xe6,
- 0x8b, 0x17, 0xca, 0xf3, 0xa1, 0x3e, 0x6a, 0x1d, 0x83, 0xea, 0x6a, 0xcd,
- 0x16, 0xb7, 0x5d, 0x91, 0x73, 0xb0, 0x79, 0xaf, 0xed, 0x3b, 0xe9, 0x25,
- 0xd7, 0x3e, 0x57, 0xe6, 0x1d, 0x21, 0x5d, 0x86, 0xcd, 0x72, 0xdb, 0x2a,
- 0x89, 0xdc, 0xe3, 0x65, 0xc1, 0x3e, 0x43, 0xe0, 0x45, 0x6d, 0xa7, 0xf1,
- 0x1c, 0x76, 0xa9, 0xb6, 0xf1, 0x3e, 0x23, 0xaa, 0x0d, 0x72, 0x41, 0x01,
- 0xd5, 0x99, 0x4d, 0x3e, 0xea, 0x91, 0xb1, 0x63, 0x44, 0xde, 0x7a, 0x6c,
- 0x49, 0x0b, 0xee, 0x3b, 0x7f, 0x77, 0xdc, 0x36, 0x02, 0xdc, 0xa3, 0xcc,
- 0x35, 0xef, 0x2e, 0x46, 0xe7, 0x87, 0x98, 0x2f, 0x87, 0x0d, 0xcd, 0x81,
- 0x38, 0x1a, 0x65, 0x7f, 0x93, 0xea, 0xe2, 0xca, 0x3d, 0xfd, 0xb4, 0xe3,
- 0xe9, 0x91, 0x38, 0xf7, 0x4e, 0xa8, 0x25, 0x82, 0xd9, 0x07, 0xff, 0x25,
- 0x66, 0x9a, 0xf5, 0x52, 0xfd, 0xfb, 0xec, 0x02, 0xc3, 0xcc, 0x48, 0x1a,
- 0x22, 0x07, 0xc7, 0x3d, 0xfc, 0xb9, 0xf3, 0xd4, 0x5c, 0xad, 0x97, 0x1f,
- 0xad, 0xbe, 0x28, 0x80, 0xb5, 0xba, 0xc1, 0xee, 0x85, 0xe7, 0x7a, 0x34,
- 0x3c, 0x3f, 0xa8, 0x4d, 0x10, 0xed, 0x8b, 0x87, 0x42, 0x5c, 0x8f, 0x12,
- 0xef, 0x34, 0xf2, 0x75, 0xed, 0xd1, 0xe0, 0xf9, 0x23, 0x7b, 0xfd, 0x0a,
- 0x70, 0xdf, 0xc7, 0xec, 0xce, 0x71, 0x9d, 0x26, 0xa3, 0xad, 0xf2, 0x25,
- 0x5c, 0x10, 0xee, 0x11, 0x37, 0xc0, 0x5e, 0xe3, 0x12, 0x68, 0xab, 0x1b,
- 0x55, 0x9d, 0xd6, 0x6b, 0xef, 0x8a, 0x79, 0xce, 0xbc, 0x33, 0x42, 0xd4,
- 0x71, 0x21, 0xfc, 0x9a, 0x2f, 0xd5, 0xdb, 0xd6, 0x72, 0xa1, 0xd9, 0x97,
- 0x0e, 0x94, 0xd9, 0x01, 0x3f, 0x1a, 0xd3, 0x6c, 0x39, 0x65, 0x80, 0xb4,
- 0x0e, 0x42, 0xdd, 0x12, 0x3d, 0xdb, 0x8d, 0xf0, 0x58, 0x47, 0x68, 0xa1,
- 0xe8, 0xd9, 0xc1, 0xac, 0x87, 0x27, 0x0d, 0x6c, 0xac, 0xe7, 0x4f, 0x24,
- 0x9a, 0x74, 0x9f, 0x0f, 0x70, 0xf7, 0x20, 0x91, 0xa9, 0x7b, 0x90, 0x4a,
- 0xd6, 0xe5, 0xd7, 0xee, 0xc7, 0x28, 0x0e, 0x40, 0xb9, 0x1e, 0xa4, 0xa0,
- 0x6f, 0x93, 0x0f, 0xb0, 0xe9, 0xf5, 0x0b, 0xa0, 0x3c, 0x36, 0xf8, 0x00,
- 0x9f, 0x33, 0xef, 0x52, 0xe2, 0x87, 0xc7, 0x2a, 0xd6, 0x52, 0x44, 0x16,
- 0x07, 0x7b, 0x12, 0x39, 0xe6, 0x4f, 0x4d, 0x92, 0xc8, 0x64, 0x01, 0x39,
- 0x18, 0x58, 0x71, 0x1e, 0x68, 0x0f, 0xc0, 0x93, 0xbe, 0xd3, 0x41, 0x68,
- 0xec, 0xdc, 0x66, 0xdb, 0x72, 0x58, 0xdc, 0xda, 0xd3, 0x42, 0x9d, 0x88,
- 0x29, 0xfd, 0xe3, 0x8f, 0xac, 0x23, 0x58, 0x9c, 0x5b, 0x09, 0x4b, 0xda,
- 0xf6, 0xa5, 0xe6, 0x4e, 0xe5, 0x3e, 0x0c, 0xd8, 0x2c, 0x0a, 0xe6, 0x95,
- 0x19, 0x1a, 0xac, 0x2b, 0x30, 0x1f, 0x09, 0xc6, 0x58, 0x0a, 0x99, 0x21,
- 0x25, 0xc7, 0xe3, 0x91, 0xdb, 0x55, 0x73, 0xc7, 0xab, 0x6b, 0x92, 0x24,
- 0x30, 0xd0, 0xcd, 0x0c, 0x5e, 0xbe, 0xbf, 0xf8, 0xf6, 0xec, 0xdd, 0x28,
- 0xd9, 0x05, 0xf0, 0xce, 0xc5, 0xbb, 0x93, 0xaf, 0xdf, 0x5f, 0x98, 0x7f,
- 0xea, 0x48, 0xaf, 0xd2, 0x65, 0x6e, 0x34, 0x8f, 0x51, 0x9d, 0x2d, 0x8d,
- 0x1c, 0xb8, 0xd4, 0xb5, 0x51, 0x22, 0x26, 0x98, 0xa8, 0x28, 0x15, 0x6f,
- 0x0d, 0xf9, 0x28, 0x85, 0x1c, 0x66, 0xca, 0xa7, 0xa3, 0xe8, 0x04, 0xd2,
- 0xdc, 0x0b, 0xe7, 0x15, 0xc9, 0x5b, 0x88, 0x41, 0x9a, 0xbb, 0x9a, 0x5c,
- 0x7c, 0xfb, 0xf2, 0xed, 0x77, 0x23, 0xed, 0x41, 0xf7, 0xc3, 0x0f, 0x3f,
- 0xb4, 0x03, 0xf7, 0x64, 0xa3, 0x5c, 0xa5, 0xb7, 0xb7, 0xc3, 0x2a, 0xfb,
- 0xec, 0xb3, 0xd1, 0xf1, 0x71, 0xf2, 0xf2, 0x74, 0x74, 0xa6, 0x4f, 0xcd,
- 0xea, 0xd5, 0xf6, 0xde, 0x8e, 0xd1, 0xc1, 0x2f, 0xb3, 0xda, 0xfc, 0xe5,
- 0xb3, 0xcf, 0xfe, 0x3f, 0x9a, 0xd9, 0x3a, 0xf9, 0x55, 0xbe, 0x02, 0x00,
-
+ 0x7b, 0x7b, 0xdc, 0xc6, 0x91, 0x2e, 0xfe, 0xbf, 0x3f, 0x05, 0x96, 0x79,
+ 0x72, 0x48, 0x6e, 0x66, 0x86, 0x37, 0x5d, 0x2c, 0x46, 0xf6, 0x9a, 0xa6,
+ 0x28, 0x9b, 0x6b, 0x4a, 0xe4, 0x6a, 0x28, 0xdb, 0x39, 0xb1, 0x1f, 0x3d,
+ 0xe0, 0x0c, 0x48, 0x22, 0x9a, 0x01, 0x26, 0x00, 0x86, 0x97, 0xec, 0xe6,
+ 0x7c, 0xf6, 0x5f, 0xd7, 0x5b, 0x55, 0xdd, 0x0d, 0x74, 0x63, 0x48, 0x3b,
+ 0x56, 0xf6, 0x5c, 0x7e, 0xd9, 0x73, 0x64, 0x89, 0x04, 0x1a, 0xdd, 0xd5,
+ 0xd5, 0xd5, 0x75, 0x7d, 0x2b, 0x49, 0x1e, 0xfa, 0xdf, 0x07, 0xfc, 0xff,
+ 0x0f, 0xe6, 0x7f, 0xe6, 0xbf, 0x9f, 0x25, 0xc9, 0x59, 0x55, 0xfe, 0x25,
+ 0x9b, 0x34, 0xf1, 0x67, 0x3f, 0x7c, 0xf8, 0xaf, 0x84, 0xff, 0xcf, 0xbc,
+ 0xf3, 0x93, 0xf9, 0xef, 0x67, 0x2b, 0xc7, 0xde, 0x4a, 0xdc, 0x0b, 0xff,
+ 0xf5, 0x61, 0x33, 0x79, 0xe8, 0x85, 0xff, 0x4a, 0x36, 0xf0, 0xc2, 0x07,
+ 0xf9, 0xc2, 0x4b, 0xfa, 0xfb, 0x87, 0x0f, 0xab, 0x3f, 0xf2, 0x13, 0xcd,
+ 0x8a, 0xfe, 0xd8, 0xa2, 0xf7, 0x7e, 0xfa, 0x40, 0x7f, 0x35, 0x3f, 0xf9,
+ 0xec, 0xb3, 0xb7, 0x07, 0x6f, 0x8e, 0xf4, 0xd5, 0xc9, 0xb2, 0x9a, 0x25,
+ 0xc3, 0xa4, 0xa9, 0xd2, 0xa2, 0xbe, 0xcc, 0xaa, 0x24, 0x4d, 0xde, 0xbf,
+ 0x3b, 0xf9, 0xec, 0xb3, 0xf1, 0x9f, 0xde, 0x9e, 0x9e, 0x8d, 0x8f, 0xc7,
+ 0xad, 0xc7, 0xfe, 0x5c, 0x2e, 0x9a, 0xbc, 0x2c, 0x6a, 0x33, 0x7d, 0xf3,
+ 0x50, 0xfd, 0xf3, 0x67, 0x9f, 0xbd, 0x3a, 0x1a, 0x1f, 0xbe, 0x3b, 0x3e,
+ 0x3b, 0x3f, 0x3e, 0x7d, 0xdb, 0x7a, 0x32, 0xc9, 0xeb, 0xc4, 0x0c, 0xd5,
+ 0x94, 0xe5, 0xcc, 0xfc, 0xe1, 0x46, 0x9f, 0xa6, 0x4d, 0x9a, 0x5c, 0x56,
+ 0xe5, 0x3c, 0x29, 0x2b, 0xfa, 0x45, 0x9a, 0xd4, 0x59, 0x75, 0x93, 0x55,
+ 0x83, 0x64, 0x59, 0xe7, 0xc5, 0x55, 0x52, 0x16, 0x59, 0x52, 0x5e, 0x26,
+ 0xcd, 0x75, 0xa6, 0xc3, 0xd5, 0xcb, 0xc5, 0xa2, 0xac, 0x9a, 0x6c, 0x9a,
+ 0x2c, 0xaa, 0xb2, 0x29, 0x27, 0xe5, 0xac, 0x4e, 0x36, 0x5e, 0x1d, 0x1f,
+ 0x9e, 0x0f, 0x92, 0xd7, 0xc7, 0x27, 0x47, 0xe6, 0xcf, 0xf3, 0x33, 0xfc,
+ 0x31, 0x1e, 0x24, 0xdf, 0x9c, 0x9e, 0x7d, 0x7b, 0xf4, 0x6e, 0x90, 0x7c,
+ 0x7b, 0x4e, 0x3f, 0xa3, 0x3f, 0xcd, 0x0f, 0x93, 0xe3, 0x37, 0x07, 0x67,
+ 0x03, 0x1d, 0x8e, 0xfe, 0x41, 0x3f, 0x3c, 0x79, 0x65, 0x7e, 0xc8, 0xff,
+ 0xa1, 0x7f, 0xbe, 0xf9, 0x8f, 0x73, 0x33, 0xe0, 0xd9, 0xe9, 0xd9, 0x1e,
+ 0xff, 0x69, 0x7e, 0xf6, 0xee, 0xfc, 0xcd, 0x19, 0xff, 0x89, 0x7f, 0x8c,
+ 0xcd, 0x3f, 0xc6, 0x87, 0xf4, 0x07, 0x7d, 0x50, 0x87, 0x1b, 0xbf, 0xf9,
+ 0x7a, 0x40, 0x7f, 0x8c, 0xe9, 0x4f, 0xfa, 0x28, 0xfd, 0x69, 0xfe, 0x71,
+ 0x7e, 0x74, 0xf2, 0xf6, 0xe8, 0x3c, 0x49, 0x8b, 0x69, 0x72, 0x6e, 0x9e,
+ 0xdf, 0x1c, 0x25, 0xe7, 0xd7, 0x59, 0x32, 0x29, 0xe7, 0x73, 0xfa, 0x11,
+ 0xa8, 0x33, 0xcd, 0xea, 0xfc, 0xaa, 0x30, 0xeb, 0x32, 0x74, 0xd0, 0xe1,
+ 0x6e, 0xcb, 0xea, 0x63, 0x72, 0x9b, 0x37, 0xd7, 0xe5, 0xb2, 0x31, 0x14,
+ 0x31, 0x04, 0xcb, 0x8b, 0x26, 0xab, 0xd2, 0x09, 0x91, 0x7d, 0xf4, 0x59,
+ 0x8b, 0xc4, 0xe5, 0xa5, 0x21, 0x68, 0x6d, 0x28, 0x78, 0xb1, 0xac, 0x67,
+ 0x65, 0x3a, 0x25, 0xba, 0x99, 0x57, 0x2e, 0x97, 0x86, 0xe2, 0x55, 0x3e,
+ 0xf9, 0x58, 0x27, 0xb3, 0xfc, 0x63, 0x46, 0x54, 0xbb, 0xbb, 0x57, 0x2a,
+ 0x0e, 0x78, 0xd0, 0x74, 0x69, 0x08, 0x5c, 0x0c, 0x75, 0xb8, 0x26, 0x9f,
+ 0xa4, 0xf4, 0x01, 0x90, 0x31, 0x59, 0x2e, 0x68, 0x34, 0x26, 0x5f, 0xb2,
+ 0x28, 0x6b, 0xf3, 0xd2, 0x78, 0x7c, 0x62, 0xe6, 0x5e, 0x14, 0x19, 0xe6,
+ 0x51, 0x0f, 0xcc, 0x3f, 0xca, 0x8f, 0x79, 0x66, 0xfe, 0x72, 0x99, 0xcf,
+ 0xb2, 0x84, 0xb7, 0xd7, 0x0e, 0x47, 0xfb, 0x9c, 0x54, 0x59, 0xbd, 0x9c,
+ 0x67, 0x44, 0xd9, 0xac, 0x49, 0x67, 0x79, 0xf1, 0xd1, 0xfc, 0x95, 0x96,
+ 0x3e, 0x2f, 0xab, 0x6c, 0x94, 0x1c, 0xd4, 0xc9, 0x7d, 0xb9, 0x34, 0x2b,
+ 0x9d, 0xcd, 0x0c, 0x03, 0x64, 0xc9, 0x45, 0x36, 0x2b, 0x6f, 0x07, 0xb4,
+ 0xed, 0x49, 0xb1, 0x9c, 0x5f, 0x98, 0x01, 0xca, 0x4b, 0x37, 0x5c, 0xda,
+ 0x2c, 0xcd, 0x70, 0xfc, 0xf4, 0x3c, 0x35, 0x6b, 0x32, 0xef, 0x56, 0xc9,
+ 0x75, 0x66, 0xd6, 0x5c, 0x2f, 0xf2, 0xe2, 0x5f, 0xda, 0x74, 0x31, 0xb4,
+ 0x5d, 0x94, 0xb7, 0x59, 0x65, 0x28, 0x7b, 0x71, 0x9f, 0x18, 0x22, 0x5c,
+ 0x30, 0x47, 0x5e, 0x1a, 0x8e, 0x4b, 0x52, 0x33, 0x84, 0xe5, 0xc6, 0x61,
+ 0x95, 0xcd, 0x52, 0xe2, 0x2c, 0xfb, 0x8d, 0x91, 0xd9, 0xd1, 0xcc, 0xb2,
+ 0x9e, 0xbc, 0xba, 0xb1, 0xb7, 0x89, 0x97, 0xa7, 0x66, 0x25, 0xf9, 0xac,
+ 0x36, 0xdb, 0x40, 0x27, 0x44, 0x9e, 0xa1, 0x6d, 0xa5, 0xc3, 0x60, 0x18,
+ 0xf5, 0xbe, 0x68, 0xd2, 0x3b, 0x7c, 0x5e, 0x18, 0x75, 0x38, 0xcd, 0x16,
+ 0x59, 0x31, 0xcd, 0x8a, 0x66, 0x94, 0xfc, 0xa9, 0x5c, 0xae, 0x9b, 0x6f,
+ 0x5f, 0xe6, 0x86, 0x06, 0xa9, 0x0c, 0x65, 0xbe, 0x6c, 0x98, 0x60, 0x52,
+ 0xe5, 0x0b, 0x6f, 0x2b, 0xca, 0xc2, 0xec, 0x79, 0xf2, 0xee, 0xf5, 0x61,
+ 0xb2, 0xf7, 0xe2, 0xf3, 0x67, 0x6e, 0xcf, 0xcd, 0x00, 0xc9, 0x24, 0x2d,
+ 0xcc, 0x8a, 0xb3, 0x49, 0x7e, 0x79, 0x9f, 0xcc, 0x97, 0xb3, 0x26, 0x5f,
+ 0x18, 0xea, 0xd3, 0x49, 0xa4, 0xd3, 0xb4, 0x48, 0xab, 0xa6, 0x26, 0x26,
+ 0xc0, 0x0f, 0xb0, 0xf6, 0xdb, 0x2a, 0x6f, 0xe8, 0x54, 0xe1, 0x77, 0x66,
+ 0x86, 0x59, 0x53, 0x5b, 0x4e, 0x33, 0x4c, 0x66, 0xbe, 0x73, 0x61, 0x78,
+ 0xcb, 0x90, 0x96, 0x76, 0xe6, 0xaf, 0xcb, 0x12, 0x0f, 0xd3, 0x26, 0xd0,
+ 0x82, 0xd2, 0xda, 0x4c, 0x64, 0xff, 0x33, 0x27, 0x62, 0xd6, 0xae, 0x9b,
+ 0x66, 0xb1, 0xbf, 0xb5, 0x55, 0xe7, 0x4d, 0x36, 0xfa, 0x4f, 0x73, 0x52,
+ 0x07, 0xcd, 0x6d, 0x39, 0x68, 0xae, 0xab, 0x2c, 0xfb, 0xfb, 0xc8, 0xb0,
+ 0xf6, 0x9a, 0x7d, 0xd6, 0xcc, 0xe6, 0x5e, 0xa6, 0x7b, 0x95, 0x35, 0xe6,
+ 0xbb, 0x7f, 0x5d, 0x66, 0x05, 0x7d, 0xc7, 0xcc, 0x2e, 0x9d, 0x2d, 0xae,
+ 0x53, 0xb3, 0xc9, 0x99, 0xe1, 0x51, 0x3a, 0xfc, 0x86, 0x8d, 0x68, 0xae,
+ 0x7c, 0xfc, 0xff, 0xfc, 0x73, 0xe4, 0xb3, 0x97, 0xf8, 0xaa, 0xf9, 0x73,
+ 0x94, 0xdd, 0xa5, 0x73, 0xb3, 0x64, 0xfa, 0xd8, 0x16, 0x71, 0xde, 0x9f,
+ 0x77, 0x86, 0x3b, 0xdb, 0xdb, 0x3f, 0x8f, 0x9a, 0xbb, 0x66, 0xed, 0x91,
+ 0x6f, 0x6c, 0x6f, 0x7b, 0xef, 0xd0, 0xc3, 0x1b, 0x44, 0x89, 0x64, 0x66,
+ 0x98, 0x89, 0x26, 0xf0, 0xb7, 0xac, 0x2a, 0xeb, 0xcd, 0x47, 0x8e, 0x95,
+ 0x0e, 0xff, 0xd6, 0xf9, 0xf6, 0xdb, 0xac, 0x06, 0x3f, 0xb9, 0x15, 0x27,
+ 0x69, 0x65, 0x78, 0xba, 0x6c, 0x9c, 0x1c, 0x1b, 0x98, 0x03, 0xdb, 0x58,
+ 0xfa, 0x98, 0xf3, 0x68, 0x9e, 0x36, 0x12, 0x30, 0x9d, 0x91, 0xf0, 0xab,
+ 0x93, 0x22, 0xbb, 0x6b, 0x2c, 0x37, 0x94, 0x49, 0x96, 0x4e, 0xae, 0x93,
+ 0xd2, 0xec, 0x49, 0x15, 0xdb, 0x0a, 0x7f, 0x4a, 0x69, 0x35, 0xb9, 0xce,
+ 0x6f, 0x0c, 0x4d, 0x5e, 0xbc, 0x78, 0x36, 0x34, 0x7f, 0xbc, 0xf8, 0x79,
+ 0xeb, 0xa6, 0x9c, 0x19, 0x12, 0x3d, 0xf9, 0x79, 0x8b, 0xf6, 0xff, 0x3f,
+ 0xd3, 0xc1, 0xc5, 0x60, 0xf2, 0xf7, 0xd1, 0x75, 0x33, 0x9f, 0xad, 0xf5,
+ 0xb2, 0x55, 0x5a, 0x98, 0xff, 0x3f, 0x2f, 0x97, 0x45, 0x63, 0x59, 0xc9,
+ 0x70, 0x64, 0xe3, 0x09, 0x2f, 0x73, 0x98, 0xcd, 0x09, 0x26, 0xc6, 0x27,
+ 0x0e, 0xa3, 0x33, 0x69, 0x8e, 0xaf, 0x3b, 0xac, 0xcd, 0xe4, 0x9a, 0x28,
+ 0x60, 0x78, 0x2b, 0x15, 0x32, 0x34, 0x79, 0x4a, 0xe7, 0xd6, 0x88, 0x0f,
+ 0x12, 0x67, 0x18, 0x8b, 0xbf, 0x96, 0x9b, 0x07, 0xcb, 0x6a, 0x9a, 0x55,
+ 0xa3, 0xee, 0x34, 0xec, 0x81, 0xf6, 0xbe, 0x99, 0xe8, 0xe5, 0x43, 0x3f,
+ 0xc0, 0xc4, 0xe6, 0xf9, 0x9d, 0x19, 0x81, 0xfe, 0x49, 0x5f, 0x33, 0x13,
+ 0xe7, 0xd1, 0x12, 0x9a, 0x31, 0x3e, 0xa3, 0xef, 0xbb, 0x03, 0x6d, 0xa6,
+ 0xde, 0x5a, 0x3a, 0x3e, 0xea, 0x16, 0x9f, 0x98, 0xed, 0x5b, 0x98, 0xb7,
+ 0x96, 0x24, 0x75, 0x71, 0xe8, 0x69, 0x18, 0x23, 0x2e, 0xae, 0xcc, 0xce,
+ 0x98, 0xdd, 0x20, 0x6e, 0xa6, 0xcd, 0xba, 0x4f, 0xde, 0x1a, 0xa6, 0x61,
+ 0x51, 0xe5, 0x31, 0xfd, 0x2c, 0x6b, 0x9a, 0x87, 0x37, 0xca, 0x71, 0xee,
+ 0xfe, 0x4e, 0x84, 0x79, 0xfb, 0xde, 0x30, 0xdc, 0xb6, 0xbf, 0xdb, 0x79,
+ 0xfc, 0x07, 0x23, 0xc6, 0xdd, 0xd1, 0x31, 0x33, 0xf8, 0xcf, 0xbf, 0x7b,
+ 0xbc, 0x77, 0x4b, 0xbf, 0xcd, 0x8b, 0x9b, 0xf2, 0xa3, 0x21, 0x13, 0x2e,
+ 0xdd, 0xb4, 0x4d, 0x51, 0x92, 0x54, 0xf3, 0x45, 0x63, 0x6f, 0x33, 0x62,
+ 0x4a, 0xf3, 0xa3, 0x8b, 0xf4, 0x62, 0x76, 0x9f, 0x5c, 0xa7, 0x37, 0x19,
+ 0xad, 0x79, 0x61, 0xb8, 0x95, 0xa8, 0x60, 0x2e, 0x96, 0x19, 0x04, 0x83,
+ 0x88, 0x8e, 0x69, 0xb9, 0xbc, 0x30, 0xe2, 0x87, 0xc4, 0x06, 0x13, 0x27,
+ 0xbd, 0x29, 0xf3, 0x69, 0xeb, 0xea, 0xbe, 0xce, 0x48, 0xe4, 0xd1, 0x87,
+ 0x71, 0x8d, 0x19, 0x91, 0x4b, 0x33, 0xc5, 0x81, 0xcb, 0x1b, 0xba, 0x12,
+ 0x8d, 0xb0, 0x4c, 0x67, 0x75, 0x99, 0x24, 0x57, 0x25, 0x9d, 0x15, 0x88,
+ 0x68, 0x30, 0xbb, 0xd9, 0x98, 0xeb, 0x94, 0xee, 0x3d, 0x73, 0xc5, 0xd9,
+ 0xd3, 0x50, 0x65, 0x90, 0xd6, 0xd8, 0xad, 0x74, 0x36, 0xe0, 0xfb, 0x8d,
+ 0xde, 0x11, 0x5a, 0x25, 0xeb, 0xff, 0x63, 0x7d, 0x90, 0xac, 0xff, 0xdb,
+ 0x3a, 0x78, 0x62, 0xfd, 0x5f, 0xd7, 0xdd, 0x5e, 0x1b, 0xdd, 0xed, 0x26,
+ 0x9f, 0x66, 0xcc, 0x16, 0xc7, 0x67, 0x37, 0xcf, 0x92, 0xbf, 0x91, 0xaa,
+ 0x61, 0xa4, 0x71, 0x76, 0xa7, 0x4c, 0xa9, 0x6b, 0x33, 0x6f, 0x27, 0x46,
+ 0x2c, 0xa7, 0x0b, 0xd2, 0x39, 0xb2, 0x6a, 0x62, 0x38, 0x38, 0xbd, 0x32,
+ 0x3c, 0x6b, 0x6e, 0x6b, 0x1d, 0x8e, 0xc6, 0xa7, 0x57, 0x78, 0x59, 0x46,
+ 0x84, 0x26, 0x45, 0x3a, 0x37, 0xa7, 0xe2, 0x84, 0x66, 0x94, 0x17, 0x91,
+ 0xed, 0xfc, 0xf3, 0x65, 0xf6, 0xf9, 0xf6, 0xfe, 0xfe, 0xde, 0xef, 0x77,
+ 0x9f, 0x66, 0xcd, 0xf5, 0xf6, 0xcf, 0x5b, 0x6e, 0x13, 0x8f, 0x2f, 0x41,
+ 0x78, 0x65, 0x42, 0x9d, 0x06, 0xa9, 0x00, 0x7a, 0x93, 0x98, 0x01, 0xcc,
+ 0xdf, 0xb3, 0xcb, 0xfc, 0x6e, 0xa0, 0x0a, 0x16, 0x9f, 0xbc, 0xd4, 0x30,
+ 0x9c, 0xd9, 0x41, 0x5f, 0x87, 0xb8, 0x5a, 0x66, 0xb5, 0xa1, 0xe5, 0xed,
+ 0x75, 0xda, 0x24, 0x76, 0x00, 0xde, 0xdb, 0x79, 0x7e, 0x75, 0xdd, 0x24,
+ 0xb7, 0x29, 0x5d, 0x48, 0xc7, 0x0d, 0x0f, 0x41, 0x9a, 0x80, 0xb9, 0x86,
+ 0x2e, 0x53, 0x73, 0x9f, 0xd0, 0x2e, 0xe2, 0xda, 0x37, 0x12, 0xca, 0x51,
+ 0xfd, 0x5e, 0xb6, 0xc4, 0xe9, 0x5f, 0x17, 0x69, 0x4d, 0x47, 0xb7, 0x30,
+ 0x22, 0xa2, 0x31, 0x7a, 0xc4, 0x92, 0xfe, 0x75, 0x6d, 0x34, 0x05, 0x50,
+ 0x41, 0x26, 0x8a, 0xcb, 0xf4, 0x35, 0x6d, 0x28, 0xed, 0x8e, 0xbd, 0xe0,
+ 0xcc, 0x36, 0x0d, 0x64, 0xa3, 0xed, 0x1b, 0xb5, 0x39, 0x76, 0x46, 0x40,
+ 0x59, 0xde, 0x20, 0x99, 0x3b, 0x5a, 0xe3, 0x75, 0x62, 0x8e, 0x69, 0x4d,
+ 0xca, 0x04, 0xab, 0x0c, 0x66, 0xf2, 0xde, 0x62, 0x0d, 0xd1, 0xd2, 0x8f,
+ 0xa4, 0xb6, 0x74, 0x94, 0x23, 0xbc, 0x36, 0x2d, 0x0d, 0x9b, 0x99, 0xd9,
+ 0x1a, 0xa1, 0x4c, 0x2b, 0x23, 0x51, 0x0b, 0xaa, 0x80, 0xcd, 0xcd, 0x98,
+ 0xf4, 0xc3, 0xbc, 0xa1, 0x1b, 0x07, 0x4a, 0xaf, 0x99, 0xaf, 0x21, 0x0a,
+ 0x74, 0x33, 0x23, 0xb0, 0xbd, 0xf5, 0xe3, 0x0a, 0x35, 0xcf, 0x26, 0x37,
+ 0x46, 0x93, 0x31, 0x1a, 0x6c, 0x66, 0xdf, 0xc2, 0x9d, 0x3f, 0x21, 0xfd,
+ 0x69, 0x66, 0x4e, 0xcc, 0xa4, 0xac, 0x2a, 0x32, 0x10, 0x68, 0x07, 0x2f,
+ 0x58, 0x94, 0xce, 0x33, 0xa3, 0x6a, 0xf8, 0xe4, 0xcc, 0xe9, 0x7a, 0x33,
+ 0x52, 0xc6, 0xe8, 0x2e, 0x90, 0x23, 0x46, 0xc7, 0x80, 0xec, 0xc7, 0xc2,
+ 0x31, 0x3b, 0x1a, 0x7b, 0x32, 0xc9, 0x16, 0x4d, 0x1d, 0x5b, 0x93, 0x6e,
+ 0xb8, 0x99, 0x4e, 0x95, 0x11, 0xe5, 0x7d, 0xc5, 0x0c, 0x74, 0xb5, 0x8a,
+ 0x01, 0x74, 0x33, 0xd5, 0x75, 0x8c, 0xae, 0x56, 0x5b, 0xaa, 0x35, 0xe0,
+ 0x0d, 0x23, 0xcc, 0x40, 0xf3, 0x39, 0x4d, 0x94, 0x1e, 0xae, 0xf9, 0xac,
+ 0x42, 0x40, 0xd3, 0x46, 0xb2, 0x6a, 0xce, 0xdf, 0xa5, 0x2b, 0xcc, 0xd0,
+ 0xd3, 0x0e, 0x6e, 0xbe, 0x6a, 0xf7, 0x94, 0x3e, 0x4f, 0x36, 0x81, 0xb9,
+ 0xd7, 0xa7, 0xf5, 0xb5, 0x51, 0xd0, 0x6a, 0x39, 0xdb, 0xf9, 0xdc, 0xf0,
+ 0xcc, 0x0d, 0xed, 0xef, 0x22, 0xcb, 0xa6, 0xa3, 0xe4, 0xf4, 0x92, 0x64,
+ 0x6b, 0x65, 0x26, 0xdd, 0xe0, 0xd7, 0x74, 0xb7, 0x18, 0xba, 0x4d, 0xa1,
+ 0xf5, 0xdb, 0xc3, 0xc5, 0x53, 0xf1, 0xee, 0x08, 0xc8, 0xf3, 0xd4, 0xfc,
+ 0xc4, 0xcc, 0x76, 0xd6, 0xbe, 0x88, 0x70, 0x12, 0x8d, 0x0c, 0xa7, 0xe9,
+ 0x5d, 0x64, 0x09, 0x38, 0xf1, 0x22, 0x6b, 0x6e, 0xb3, 0xcc, 0x0e, 0x57,
+ 0x67, 0xe6, 0xf6, 0xa3, 0x4d, 0x63, 0xed, 0x10, 0xe2, 0x90, 0x48, 0x7b,
+ 0xf6, 0xee, 0xf4, 0xfc, 0xf4, 0xf0, 0xf4, 0xa4, 0x6d, 0xe2, 0xc8, 0x35,
+ 0x5d, 0x27, 0x50, 0x51, 0xca, 0xa5, 0xd3, 0xe6, 0x0c, 0x05, 0x49, 0xcb,
+ 0x32, 0xa7, 0xd2, 0xc8, 0x0b, 0x68, 0x7c, 0xe6, 0xec, 0xcf, 0xeb, 0x7d,
+ 0xf3, 0x05, 0x73, 0xe5, 0xcd, 0xc1, 0xef, 0xe6, 0x4a, 0xb1, 0xf7, 0x01,
+ 0xdd, 0xb9, 0xf9, 0x64, 0x39, 0x4b, 0x2b, 0xb3, 0xff, 0xf9, 0xcc, 0xa8,
+ 0xbe, 0xe9, 0xbd, 0xaf, 0x09, 0x10, 0x9d, 0xe7, 0xa4, 0x90, 0xba, 0x6d,
+ 0x26, 0xb3, 0xc6, 0xfc, 0xe7, 0xc4, 0xe8, 0x69, 0x60, 0xd2, 0x99, 0x51,
+ 0xb3, 0x97, 0x0b, 0xb2, 0x0a, 0xa6, 0xb5, 0x35, 0x90, 0xb0, 0xec, 0x69,
+ 0x8e, 0x1d, 0x4f, 0x49, 0x7d, 0x72, 0xef, 0x93, 0x41, 0x64, 0xfe, 0xf3,
+ 0x8e, 0xb8, 0x8b, 0x26, 0x0b, 0x05, 0xd0, 0x08, 0xbd, 0x59, 0x69, 0x18,
+ 0x54, 0x08, 0x3b, 0x52, 0x01, 0x32, 0x25, 0x91, 0xeb, 0xcf, 0x87, 0xb8,
+ 0xae, 0xa6, 0x8f, 0x74, 0xac, 0x4a, 0x7a, 0x8d, 0x04, 0x10, 0xad, 0xb9,
+ 0xca, 0xe6, 0x46, 0xdc, 0xcf, 0xee, 0x59, 0x89, 0xc1, 0x05, 0x53, 0x2d,
+ 0x8b, 0x82, 0x67, 0x96, 0xbc, 0xc9, 0x27, 0x46, 0x7d, 0xba, 0x6c, 0x92,
+ 0x1f, 0x8c, 0x60, 0x2d, 0x6f, 0x65, 0xce, 0x9d, 0xe1, 0xa0, 0xe4, 0x1b,
+ 0x7b, 0xc3, 0xdc, 0x2e, 0xef, 0xdf, 0x1e, 0x26, 0xe9, 0xc2, 0x10, 0x98,
+ 0x94, 0x1c, 0xb0, 0x19, 0x19, 0x40, 0xde, 0x7a, 0xce, 0xcf, 0x36, 0xc6,
+ 0x9b, 0x32, 0x5f, 0xbb, 0x33, 0x7c, 0xb5, 0xbf, 0x26, 0xee, 0x3e, 0x57,
+ 0xbb, 0xf2, 0x4c, 0xe5, 0x1c, 0x0b, 0x70, 0xb3, 0x62, 0xe8, 0x2f, 0x86,
+ 0x11, 0xd2, 0x8f, 0x75, 0x67, 0x02, 0xe0, 0x1d, 0xba, 0xc5, 0x0d, 0x2d,
+ 0x7e, 0xa0, 0xc7, 0xcb, 0xca, 0xb3, 0xb9, 0x68, 0x29, 0xe7, 0x27, 0x63,
+ 0x37, 0x09, 0x36, 0x2a, 0x0d, 0x51, 0x8d, 0x55, 0x65, 0xde, 0x12, 0x2a,
+ 0xda, 0x5f, 0x93, 0xbc, 0x34, 0x93, 0xec, 0x7c, 0xa3, 0xcd, 0x4b, 0x90,
+ 0xa9, 0x98, 0x99, 0xe5, 0x2a, 0x5f, 0x99, 0xb9, 0x31, 0xdb, 0x08, 0x03,
+ 0xac, 0x86, 0x58, 0x26, 0x7e, 0xee, 0x0c, 0xc7, 0x62, 0x0e, 0xc3, 0xd0,
+ 0xbc, 0xc9, 0x48, 0xd8, 0x1e, 0xbd, 0x18, 0x24, 0x3b, 0xa3, 0x6d, 0xfa,
+ 0x63, 0x67, 0x90, 0xec, 0x62, 0xa4, 0xbd, 0x84, 0x4d, 0x0e, 0xd9, 0x0f,
+ 0xe6, 0xbb, 0xd2, 0x99, 0x17, 0x9e, 0x95, 0x51, 0xdb, 0x4b, 0x4c, 0xc5,
+ 0x56, 0x4c, 0xd9, 0x72, 0xeb, 0x24, 0xc3, 0x39, 0x5c, 0xe7, 0xfb, 0x5a,
+ 0x4d, 0x86, 0xb9, 0x31, 0x68, 0x0c, 0x7b, 0xb0, 0x1a, 0xad, 0x67, 0x66,
+ 0xc0, 0x84, 0x20, 0x25, 0x6b, 0xcd, 0x30, 0x44, 0x41, 0x96, 0xe5, 0x5a,
+ 0x92, 0xd1, 0xb3, 0x7c, 0xdd, 0x77, 0x86, 0x33, 0x4c, 0xff, 0xa8, 0x3d,
+ 0x21, 0xb3, 0xbd, 0x87, 0xe8, 0xf4, 0x2d, 0x23, 0xa8, 0xa6, 0x39, 0xad,
+ 0xa9, 0x24, 0x09, 0x8b, 0x43, 0xc4, 0xb2, 0xd1, 0x8c, 0x3f, 0xe0, 0x8d,
+ 0xf0, 0xc6, 0x6f, 0x8d, 0x4c, 0x8e, 0x80, 0x60, 0xff, 0xf0, 0x43, 0x25,
+ 0xfc, 0xde, 0x28, 0x79, 0x25, 0x4b, 0x01, 0x99, 0x49, 0x44, 0xe2, 0x01,
+ 0xa3, 0x77, 0x19, 0x65, 0x26, 0x59, 0xab, 0x97, 0x17, 0x5d, 0x82, 0x93,
+ 0x91, 0x77, 0x91, 0xad, 0xb1, 0xc7, 0xa3, 0x29, 0x17, 0xc6, 0xf4, 0xb9,
+ 0xbd, 0x26, 0x06, 0x66, 0x63, 0xdb, 0x8c, 0xb3, 0x45, 0x96, 0x36, 0x8d,
+ 0xa7, 0xa3, 0x2c, 0x8c, 0x76, 0x95, 0xd7, 0xd7, 0x6b, 0xb4, 0x8f, 0x69,
+ 0x77, 0xff, 0x68, 0x84, 0x91, 0x4e, 0x56, 0xcf, 0x2f, 0xc9, 0xd3, 0xec,
+ 0xce, 0x68, 0x2c, 0xf9, 0x9c, 0x54, 0x96, 0x19, 0x7b, 0x1f, 0x4e, 0xc6,
+ 0x72, 0x5d, 0xe3, 0xe1, 0xbc, 0xf6, 0xef, 0xb6, 0xc0, 0xc5, 0xb2, 0x71,
+ 0x9f, 0x35, 0x9b, 0x9e, 0xd6, 0x74, 0x7a, 0xb6, 0x17, 0x92, 0xd9, 0x5f,
+ 0xbd, 0x68, 0x95, 0x8b, 0x72, 0xb1, 0xa7, 0xd7, 0x05, 0x5f, 0x79, 0x7a,
+ 0xb9, 0x90, 0xdc, 0xa6, 0xed, 0x36, 0xb3, 0xc5, 0xbe, 0x26, 0xc1, 0x9e,
+ 0xaf, 0xd8, 0x66, 0x72, 0xbe, 0x84, 0xdf, 0x87, 0xc9, 0x6d, 0x64, 0x9c,
+ 0xb9, 0x89, 0xcc, 0x25, 0x95, 0xbc, 0x31, 0x42, 0x2b, 0xbd, 0xc2, 0xb7,
+ 0xac, 0x14, 0xc0, 0x25, 0xbe, 0x30, 0x84, 0x30, 0x27, 0x6b, 0x76, 0xcf,
+ 0xd7, 0x82, 0xa1, 0x3d, 0xcf, 0xb0, 0xbb, 0x7a, 0xd2, 0x2b, 0xe7, 0xb8,
+ 0x08, 0xb3, 0x69, 0x9e, 0xf2, 0x8d, 0xe2, 0x38, 0x89, 0xd7, 0x4a, 0xfa,
+ 0xaa, 0x37, 0xad, 0xf1, 0x59, 0xc0, 0x23, 0xf8, 0xa1, 0x39, 0x8f, 0xf6,
+ 0x15, 0xef, 0xec, 0x8c, 0x0f, 0xcf, 0x42, 0xa1, 0x30, 0x1e, 0x7f, 0x6b,
+ 0x79, 0x6a, 0xd7, 0x70, 0xc8, 0xc2, 0xdd, 0xd5, 0xde, 0x9b, 0xe4, 0x91,
+ 0x09, 0xde, 0xa4, 0x1f, 0x6e, 0x4c, 0xab, 0xd4, 0x48, 0xda, 0xa7, 0x9b,
+ 0x72, 0x7d, 0x12, 0xe9, 0x5b, 0x43, 0x7a, 0x83, 0xbc, 0xf9, 0xda, 0x8a,
+ 0x51, 0x37, 0xc8, 0x9b, 0xaf, 0xed, 0xb3, 0x3b, 0x38, 0x1c, 0xcc, 0x8b,
+ 0x58, 0xbf, 0xae, 0xc1, 0x1f, 0x23, 0x26, 0xe6, 0xde, 0x2b, 0xfb, 0x92,
+ 0x3e, 0x60, 0x54, 0xc1, 0x86, 0x0d, 0x81, 0x02, 0x8f, 0x2b, 0x43, 0x08,
+ 0x47, 0x98, 0x7f, 0xb2, 0x60, 0xa2, 0xdf, 0xb3, 0x0c, 0x18, 0x75, 0x86,
+ 0xfb, 0x61, 0xd5, 0xc9, 0x14, 0x97, 0xda, 0xb9, 0xb1, 0x29, 0xf0, 0x41,
+ 0x5a, 0x8d, 0xf9, 0x18, 0x2c, 0x4e, 0x3a, 0x55, 0xd9, 0xac, 0xc8, 0x58,
+ 0xf7, 0x82, 0x36, 0x49, 0xf2, 0xcd, 0x79, 0xcf, 0x6e, 0x48, 0x9b, 0xa9,
+ 0x69, 0xb1, 0x5d, 0xee, 0x33, 0x9a, 0x2d, 0xf4, 0x39, 0x9a, 0x5d, 0x6d,
+ 0x35, 0x30, 0x12, 0x64, 0x35, 0x2b, 0x1e, 0x75, 0x63, 0x66, 0xcd, 0xb7,
+ 0x46, 0x62, 0x26, 0x65, 0x14, 0x00, 0xab, 0x5d, 0x7b, 0xb6, 0x8e, 0x55,
+ 0x36, 0xb0, 0x64, 0x1e, 0xcc, 0xe7, 0x99, 0x73, 0x6f, 0x23, 0x45, 0x44,
+ 0xe1, 0x47, 0x96, 0x5b, 0xf0, 0x01, 0xde, 0x02, 0xd1, 0x4e, 0xbe, 0x79,
+ 0x77, 0x34, 0x1e, 0x27, 0x6f, 0x8e, 0xce, 0x8f, 0xde, 0xb5, 0x7d, 0xab,
+ 0x45, 0x59, 0xcd, 0xa1, 0x70, 0x1a, 0x29, 0x57, 0x2f, 0x66, 0xe9, 0x3d,
+ 0xa9, 0xa2, 0x46, 0xe4, 0x5e, 0x55, 0xa4, 0xf9, 0xcf, 0x33, 0xb2, 0x5d,
+ 0xa7, 0x4b, 0xd8, 0x5a, 0xa5, 0x11, 0x07, 0xa9, 0x38, 0xed, 0xcc, 0x9d,
+ 0x0c, 0x47, 0x9f, 0xbb, 0x91, 0x49, 0x6e, 0x3b, 0x63, 0x5f, 0xd9, 0x8f,
+ 0x3c, 0x67, 0xe4, 0xa7, 0x1d, 0x38, 0x4f, 0x59, 0xc2, 0x1a, 0x5c, 0x2d,
+ 0x64, 0x30, 0x0a, 0xb5, 0x39, 0x5a, 0xf0, 0x74, 0xd0, 0x19, 0xb4, 0xe6,
+ 0x75, 0x76, 0xd9, 0x98, 0x97, 0xcc, 0x86, 0xb0, 0x7f, 0x20, 0x98, 0x93,
+ 0xce, 0xd6, 0xfa, 0xf8, 0x8c, 0x9a, 0xdc, 0x64, 0xee, 0x26, 0xe2, 0x8f,
+ 0x58, 0x23, 0x8b, 0x36, 0xa6, 0x90, 0x47, 0x16, 0xa0, 0xaa, 0xe1, 0xb2,
+ 0x29, 0xbb, 0x52, 0xeb, 0xe5, 0x25, 0x8c, 0x8c, 0x64, 0xe3, 0xe3, 0x20,
+ 0x79, 0x33, 0x48, 0xbe, 0x19, 0x24, 0xe4, 0xc0, 0xdd, 0xc4, 0x5b, 0xc9,
+ 0xce, 0xf6, 0xee, 0x93, 0x84, 0xe5, 0x9e, 0xe5, 0xb1, 0xd7, 0x9e, 0xa1,
+ 0xb8, 0xf3, 0x91, 0x24, 0x04, 0x9e, 0xc2, 0xf0, 0xa3, 0x64, 0xe7, 0x0d,
+ 0xff, 0xe4, 0xc9, 0xe7, 0x4f, 0x9f, 0x3f, 0x93, 0x1f, 0xb6, 0xd5, 0x6f,
+ 0x37, 0x7d, 0xd6, 0x5e, 0xd9, 0x97, 0x4d, 0xce, 0x6d, 0x33, 0x1d, 0x52,
+ 0x05, 0xf3, 0xc2, 0xc8, 0x5c, 0xa3, 0xf7, 0x8b, 0x31, 0x45, 0x0a, 0x77,
+ 0x92, 0xb3, 0x6d, 0xc7, 0x5a, 0x67, 0x6b, 0x38, 0xf3, 0xe2, 0x14, 0x47,
+ 0xc5, 0x6e, 0x11, 0x7b, 0x32, 0x1a, 0x9a, 0x47, 0x7a, 0x41, 0xec, 0x6f,
+ 0x1e, 0x61, 0x05, 0xce, 0xff, 0x92, 0xfd, 0x94, 0xb5, 0xda, 0xcd, 0x2b,
+ 0x66, 0x6a, 0xc6, 0x66, 0x27, 0x33, 0x3c, 0xa4, 0xba, 0x31, 0x54, 0x60,
+ 0xbf, 0xdd, 0xe6, 0x35, 0x18, 0xfd, 0xb6, 0x5c, 0x92, 0x32, 0x4a, 0x0f,
+ 0x18, 0xdd, 0x92, 0x5e, 0x60, 0xae, 0xd6, 0xe1, 0xe6, 0xf9, 0x9d, 0x5c,
+ 0xe1, 0xad, 0x51, 0xcc, 0xdc, 0xcc, 0x3f, 0x17, 0x86, 0x93, 0x78, 0x3e,
+ 0xa3, 0xae, 0xfd, 0x0a, 0xcb, 0x2c, 0xe0, 0x43, 0x12, 0x2c, 0xd0, 0x5b,
+ 0xce, 0x4e, 0xc7, 0xe7, 0x74, 0xb6, 0xcf, 0xde, 0x9f, 0x9b, 0x81, 0xfe,
+ 0x6a, 0x8c, 0xd4, 0xc6, 0xf0, 0x24, 0xbd, 0x58, 0x64, 0x90, 0xce, 0x3a,
+ 0x9c, 0x61, 0x3f, 0xdc, 0xdd, 0xa2, 0xe7, 0xd9, 0x8f, 0xf2, 0x2c, 0xf9,
+ 0x0a, 0x25, 0x1d, 0x4c, 0x43, 0x06, 0xec, 0x65, 0xb0, 0x6f, 0x6d, 0x7c,
+ 0xb9, 0x39, 0x48, 0x86, 0xa5, 0xa5, 0xce, 0x70, 0x28, 0x2f, 0x9a, 0x6f,
+ 0xd7, 0xf9, 0x3c, 0x37, 0xfa, 0xb8, 0x37, 0xf5, 0x46, 0x6e, 0x44, 0x67,
+ 0xf4, 0x4c, 0x0c, 0xd3, 0x60, 0xd6, 0xce, 0x17, 0x4e, 0x24, 0x84, 0xc9,
+ 0xe4, 0xb6, 0xca, 0x2a, 0xcf, 0xe4, 0x81, 0xb6, 0xa4, 0xa3, 0x4d, 0x23,
+ 0x63, 0xaa, 0x45, 0xa8, 0x2e, 0x8b, 0xb4, 0x08, 0x07, 0x02, 0xc0, 0x62,
+ 0xa6, 0x43, 0x96, 0x26, 0x8e, 0x7c, 0xc9, 0xda, 0x45, 0x5a, 0xad, 0x25,
+ 0xd6, 0x5a, 0x94, 0xb0, 0x88, 0x19, 0xfb, 0x0a, 0x36, 0x05, 0xc8, 0x6b,
+ 0x56, 0xfa, 0x3b, 0x6f, 0xa5, 0xfa, 0xf2, 0xd0, 0xbc, 0x4a, 0x0b, 0x83,
+ 0x9f, 0xfc, 0xd2, 0xa8, 0xad, 0x74, 0x6a, 0xd4, 0xc5, 0x06, 0x87, 0x8b,
+ 0x30, 0x4c, 0x9b, 0x5f, 0x78, 0x4c, 0xcf, 0xf7, 0x66, 0x8e, 0x0a, 0x29,
+ 0xfb, 0xac, 0x31, 0xd1, 0xa3, 0x43, 0xb3, 0x65, 0xc3, 0x61, 0x6d, 0xa8,
+ 0x4f, 0x22, 0x63, 0x21, 0x51, 0x89, 0x53, 0xc4, 0x7f, 0xac, 0x1d, 0x75,
+ 0x2a, 0xaa, 0x2d, 0xcb, 0x61, 0xbe, 0xe0, 0x13, 0x8e, 0xec, 0x54, 0x46,
+ 0x23, 0x37, 0x1f, 0x4f, 0xcd, 0x9e, 0x99, 0x33, 0xf7, 0x86, 0x68, 0x25,
+ 0xcb, 0x52, 0x7d, 0x98, 0x58, 0xc3, 0x6c, 0x64, 0xe2, 0x54, 0xe0, 0x74,
+ 0x3a, 0xcd, 0x61, 0xeb, 0xcc, 0xc8, 0xfe, 0x5e, 0x66, 0xf0, 0x90, 0x0a,
+ 0x51, 0xe7, 0x9e, 0x80, 0xa5, 0x0d, 0xbc, 0x26, 0x3d, 0x68, 0x8d, 0xed,
+ 0xc4, 0x21, 0x7d, 0x66, 0x8d, 0xb6, 0x72, 0xde, 0xf9, 0x88, 0x59, 0xc3,
+ 0x54, 0x7c, 0x10, 0x22, 0x10, 0x06, 0x09, 0xac, 0x33, 0xcf, 0x91, 0x09,
+ 0x95, 0xa1, 0xab, 0x29, 0x1a, 0x83, 0x7f, 0x41, 0xce, 0x1e, 0xb1, 0x30,
+ 0x61, 0xaa, 0xe3, 0xcc, 0xd6, 0x3c, 0xb5, 0x81, 0x21, 0x2e, 0x3d, 0x79,
+ 0x75, 0xad, 0x8f, 0x7a, 0x66, 0x7f, 0x6a, 0xd6, 0x46, 0x2a, 0x36, 0x45,
+ 0x04, 0xa6, 0x6a, 0x95, 0x96, 0x15, 0x8b, 0xb3, 0x59, 0x69, 0x38, 0x79,
+ 0x8d, 0x5d, 0x6a, 0xde, 0xc4, 0x69, 0xa6, 0x44, 0x71, 0x0e, 0x9b, 0x39,
+ 0xd5, 0xc9, 0x4e, 0x5b, 0xc8, 0x55, 0x3f, 0x38, 0x35, 0xef, 0x26, 0x07,
+ 0x91, 0xf4, 0xea, 0x57, 0xba, 0x83, 0xbf, 0x8d, 0x26, 0xb1, 0xde, 0xf0,
+ 0x79, 0x84, 0x1f, 0xb8, 0x43, 0xf9, 0x1a, 0xfc, 0x23, 0x66, 0xb6, 0x5d,
+ 0xd9, 0x1c, 0x6a, 0x13, 0xf8, 0x44, 0x77, 0xc6, 0x39, 0xad, 0x23, 0x4e,
+ 0xba, 0xfb, 0xc0, 0xed, 0x4a, 0x46, 0xb0, 0x7f, 0x25, 0xe9, 0x9c, 0x86,
+ 0xa7, 0x66, 0xed, 0x27, 0x58, 0xc7, 0xf0, 0x26, 0xa1, 0xf3, 0x57, 0x98,
+ 0x15, 0xa6, 0xf4, 0x8b, 0x93, 0x1b, 0xef, 0x18, 0x51, 0x94, 0xa1, 0x20,
+ 0x2f, 0xca, 0x00, 0xf1, 0x9d, 0x8b, 0xb2, 0x9c, 0x65, 0xa9, 0x5b, 0x1a,
+ 0xdd, 0x08, 0x59, 0x41, 0xec, 0x2e, 0x3b, 0x6a, 0x44, 0xc2, 0xc2, 0x0a,
+ 0x5c, 0xa3, 0xf1, 0x26, 0xe9, 0x55, 0x9a, 0x5b, 0x7e, 0x93, 0xa3, 0x61,
+ 0x9f, 0x2d, 0x4a, 0x79, 0x9c, 0x76, 0x8a, 0xb4, 0x03, 0x11, 0x5b, 0xcb,
+ 0x9a, 0x8f, 0x8f, 0x59, 0x97, 0x11, 0x3b, 0x90, 0x1d, 0x32, 0x2c, 0x9c,
+ 0x5a, 0x3a, 0xdc, 0x05, 0xdc, 0x78, 0xe4, 0x11, 0x83, 0xf0, 0x85, 0x7f,
+ 0xcb, 0x0c, 0xb9, 0x36, 0x4a, 0xbe, 0x2d, 0x6f, 0x33, 0x84, 0x3e, 0xe1,
+ 0x7f, 0xcc, 0x29, 0x5e, 0x57, 0x9b, 0x27, 0x8c, 0x29, 0x65, 0x4c, 0x01,
+ 0x43, 0x4d, 0xf8, 0x46, 0xf0, 0x33, 0xcf, 0x85, 0x6d, 0x58, 0xfc, 0x96,
+ 0x8f, 0xa2, 0x2e, 0xc2, 0xee, 0xe4, 0x25, 0x9f, 0x88, 0x64, 0x03, 0xbe,
+ 0x97, 0x09, 0x11, 0x6b, 0xd1, 0xb8, 0x55, 0x58, 0x7a, 0x18, 0x49, 0x5d,
+ 0x7b, 0x87, 0x4b, 0xbc, 0xf5, 0xc9, 0xf3, 0xd1, 0xce, 0x8b, 0xd1, 0xf6,
+ 0x88, 0xb4, 0xe8, 0xec, 0x26, 0x37, 0x36, 0x2a, 0x29, 0x18, 0x34, 0x15,
+ 0xfb, 0x22, 0x05, 0xd5, 0xcc, 0xf6, 0x5e, 0x5d, 0xcd, 0xe0, 0xfd, 0xdb,
+ 0x2a, 0x2f, 0x2f, 0x49, 0x43, 0xaa, 0x32, 0xe7, 0xdd, 0x63, 0x0f, 0x2d,
+ 0x91, 0x46, 0x8e, 0x1c, 0xcb, 0xd4, 0xd0, 0xb2, 0x1c, 0xb9, 0x20, 0xcb,
+ 0x70, 0x98, 0x5e, 0x18, 0x25, 0xdc, 0x50, 0x71, 0xb8, 0x2c, 0xf2, 0xbb,
+ 0x61, 0x5d, 0x4e, 0x3e, 0x9a, 0x4d, 0x79, 0xb9, 0x48, 0x9b, 0xeb, 0x2f,
+ 0x3b, 0xfa, 0xd5, 0x06, 0xdd, 0x25, 0x9b, 0xc9, 0x21, 0xfb, 0xbc, 0xcc,
+ 0x17, 0x2a, 0x3e, 0x6d, 0x66, 0x2f, 0x65, 0x8c, 0xe4, 0xbd, 0x19, 0xc3,
+ 0x70, 0xb2, 0xd1, 0x2f, 0x89, 0xc5, 0x30, 0xd6, 0xc0, 0x8a, 0xd1, 0xce,
+ 0x70, 0x66, 0x92, 0x72, 0x8b, 0xf0, 0x65, 0x63, 0x34, 0x48, 0x78, 0x20,
+ 0x92, 0xe4, 0x6d, 0xd9, 0x64, 0xfb, 0xf4, 0x6f, 0x23, 0xc4, 0x1a, 0x50,
+ 0x5d, 0x2e, 0xd7, 0x94, 0x44, 0xc2, 0x25, 0x7f, 0x71, 0x18, 0x9a, 0x12,
+ 0xe0, 0x05, 0x5e, 0x80, 0xf8, 0x41, 0x85, 0x91, 0xd6, 0xbf, 0x5a, 0x1f,
+ 0x90, 0xcf, 0x13, 0x7b, 0x2e, 0x9f, 0xe3, 0x25, 0x92, 0xa6, 0x73, 0xb5,
+ 0x24, 0x9b, 0xad, 0x3b, 0xdc, 0x35, 0xae, 0x6a, 0xba, 0x66, 0xd8, 0x19,
+ 0x0f, 0x26, 0x11, 0x13, 0xdb, 0xfa, 0xc7, 0x47, 0x9f, 0x75, 0x5e, 0x3b,
+ 0xc0, 0x9e, 0x9a, 0xd5, 0x3f, 0x1f, 0x3d, 0xdd, 0x33, 0x3b, 0xea, 0x13,
+ 0x7a, 0xd6, 0x0c, 0xeb, 0x9b, 0x49, 0xf2, 0x12, 0xbe, 0x41, 0x62, 0xd3,
+ 0x28, 0x81, 0x8d, 0xb1, 0xf0, 0xc3, 0xc1, 0xbb, 0xb7, 0xc7, 0x6f, 0xbf,
+ 0xd9, 0xe7, 0x8f, 0x0a, 0xab, 0x75, 0x0c, 0x4c, 0x32, 0x84, 0x31, 0x3b,
+ 0xda, 0x6f, 0xf3, 0x3d, 0x73, 0x91, 0x74, 0x29, 0x32, 0x5d, 0x76, 0x42,
+ 0xd7, 0x56, 0x5a, 0xbb, 0x51, 0xf9, 0x6c, 0x32, 0x79, 0x75, 0x82, 0x46,
+ 0x38, 0x72, 0xf4, 0x1b, 0xca, 0xd2, 0x88, 0xae, 0x4a, 0xc4, 0x20, 0x74,
+ 0xda, 0x9d, 0xe1, 0x16, 0x65, 0xee, 0x6c, 0x8f, 0xec, 0x2e, 0x67, 0x53,
+ 0x5a, 0x07, 0x9b, 0x18, 0x71, 0x94, 0x89, 0xce, 0x00, 0x39, 0x07, 0x57,
+ 0x93, 0xc8, 0xb1, 0x51, 0x72, 0x70, 0x19, 0xf8, 0x47, 0x90, 0x07, 0xa1,
+ 0x17, 0xe0, 0xd4, 0xaa, 0xc1, 0x1c, 0xa1, 0xe6, 0xe1, 0x74, 0x8c, 0xda,
+ 0xec, 0xcc, 0x94, 0xdd, 0xc3, 0xd8, 0x53, 0xfa, 0x4c, 0x67, 0x38, 0x78,
+ 0xc5, 0x21, 0x63, 0x48, 0x1f, 0xcc, 0x69, 0x37, 0xc9, 0x2b, 0x6d, 0xa4,
+ 0xf4, 0xbc, 0x9c, 0xc2, 0xc5, 0x19, 0xd0, 0x67, 0x6c, 0x23, 0x52, 0x6b,
+ 0x6b, 0x6e, 0xd5, 0xc9, 0x06, 0xc5, 0x27, 0x0d, 0x0b, 0x14, 0x57, 0xcd,
+ 0xf5, 0xa6, 0x8b, 0xb9, 0xa8, 0x0f, 0xc1, 0xcc, 0x05, 0xeb, 0x2e, 0xba,
+ 0x7c, 0x8e, 0xa8, 0x39, 0xd4, 0xce, 0xbf, 0x2c, 0xeb, 0x06, 0x8e, 0x5a,
+ 0xb9, 0xfc, 0x79, 0x31, 0x66, 0x66, 0xf3, 0x6c, 0x5e, 0x56, 0xf7, 0xc1,
+ 0x44, 0x40, 0xf8, 0x16, 0x07, 0xe0, 0x66, 0xd4, 0x90, 0x25, 0xa9, 0xff,
+ 0xf5, 0xa0, 0x15, 0x92, 0x80, 0xc6, 0x64, 0xed, 0xc1, 0xae, 0x2f, 0x11,
+ 0xfe, 0x02, 0x0e, 0x3b, 0x88, 0xa3, 0xf7, 0x42, 0xe2, 0x4b, 0xb3, 0x94,
+ 0x44, 0x4d, 0x91, 0xb5, 0x76, 0x07, 0x37, 0x07, 0x2f, 0x6b, 0x15, 0x9f,
+ 0x3f, 0x7b, 0x32, 0xda, 0x69, 0xf1, 0x79, 0x71, 0x4f, 0x39, 0x0e, 0x71,
+ 0xe1, 0x41, 0x16, 0x64, 0xed, 0xec, 0xc7, 0xfc, 0x6a, 0x59, 0x65, 0xac,
+ 0xba, 0x21, 0x2d, 0x42, 0xb3, 0x21, 0x48, 0x1b, 0xba, 0x2e, 0x91, 0x44,
+ 0x60, 0x6e, 0xd1, 0x6c, 0x76, 0x39, 0x88, 0xf8, 0x11, 0xf5, 0x12, 0x80,
+ 0x9c, 0x34, 0xf6, 0x09, 0x86, 0x2a, 0x32, 0xd1, 0xd4, 0xc8, 0x57, 0x9a,
+ 0x50, 0xb8, 0x3c, 0x99, 0xcc, 0xd2, 0x7c, 0x5e, 0x33, 0x9b, 0x88, 0x09,
+ 0x3e, 0x8a, 0x1d, 0x09, 0xf3, 0xff, 0x60, 0xce, 0x5f, 0x90, 0x47, 0xbe,
+ 0xaa, 0xe9, 0x4a, 0xc6, 0x8e, 0xaa, 0xca, 0xcc, 0xde, 0x89, 0xeb, 0x6c,
+ 0xf2, 0x51, 0xfd, 0x6e, 0xaa, 0x6b, 0x76, 0x79, 0x98, 0xd2, 0x23, 0xe0,
+ 0xf6, 0x6f, 0xae, 0xc9, 0x89, 0x5d, 0x1a, 0xe3, 0x97, 0xa2, 0x7a, 0xc6,
+ 0x08, 0x5c, 0x4e, 0x9c, 0x15, 0x7e, 0x67, 0x58, 0xdb, 0x8a, 0x3d, 0xa3,
+ 0x6c, 0x1b, 0x5b, 0x70, 0x3a, 0x6c, 0xaa, 0x7c, 0x11, 0x9d, 0x1d, 0xdc,
+ 0x2a, 0xd8, 0x96, 0x96, 0x5a, 0x4a, 0x89, 0x05, 0xd6, 0xd9, 0x23, 0x6e,
+ 0xfb, 0x49, 0x87, 0x9a, 0x5d, 0x86, 0x04, 0x6d, 0x07, 0xe4, 0x05, 0x33,
+ 0xaa, 0x82, 0x06, 0xc3, 0x8d, 0x41, 0xc4, 0xca, 0xe2, 0xd0, 0x68, 0xb0,
+ 0x75, 0x3e, 0x19, 0xd0, 0xdf, 0xa6, 0xf9, 0x55, 0x46, 0x49, 0x28, 0x74,
+ 0x89, 0x35, 0xb3, 0x39, 0xe7, 0x91, 0x74, 0x86, 0x33, 0xbf, 0xca, 0xae,
+ 0xca, 0x86, 0xd4, 0x90, 0x80, 0x4d, 0xd8, 0x45, 0x69, 0x79, 0x42, 0x15,
+ 0x7e, 0x5f, 0x19, 0x13, 0x2b, 0xcd, 0x7c, 0x5e, 0x0c, 0x70, 0xe6, 0x53,
+ 0x58, 0xfe, 0xdd, 0x5d, 0x37, 0xa3, 0x4d, 0x60, 0x47, 0x91, 0xc2, 0xa8,
+ 0xda, 0xaa, 0xea, 0xf9, 0x24, 0x0f, 0x48, 0x35, 0x6e, 0x6e, 0xf3, 0x49,
+ 0xa6, 0x66, 0xad, 0x0d, 0x46, 0xcf, 0xf2, 0x50, 0xc6, 0xcf, 0xe9, 0x3c,
+ 0xd2, 0x7b, 0xac, 0x8e, 0x53, 0x54, 0xe7, 0x36, 0x27, 0x75, 0x5d, 0x24,
+ 0x1e, 0x94, 0x31, 0xb9, 0x08, 0xd2, 0x2a, 0x47, 0x08, 0x8b, 0x62, 0xbe,
+ 0xea, 0x78, 0x89, 0x9d, 0x2f, 0x9e, 0x37, 0x5e, 0x17, 0x03, 0xc6, 0x19,
+ 0x2e, 0x38, 0x5c, 0x97, 0xf0, 0xbd, 0x04, 0x74, 0x82, 0x19, 0x76, 0x95,
+ 0x21, 0xd8, 0xc7, 0x6a, 0xc3, 0x92, 0x94, 0x4f, 0x4a, 0x19, 0x0a, 0x05,
+ 0x54, 0x96, 0xb1, 0x25, 0x01, 0xab, 0xe3, 0xee, 0x5e, 0xc9, 0x3b, 0xd0,
+ 0xbd, 0x63, 0xb5, 0x4d, 0x76, 0xcf, 0x3b, 0x9b, 0x29, 0x3d, 0x91, 0x2e,
+ 0xc8, 0x4b, 0xdd, 0x3d, 0x9e, 0x64, 0x71, 0x91, 0x6f, 0x6b, 0x53, 0xe3,
+ 0xda, 0x99, 0x44, 0xf6, 0x6d, 0x4e, 0x12, 0x44, 0x11, 0x09, 0x33, 0x39,
+ 0xbf, 0x3c, 0x8e, 0x18, 0x03, 0x5d, 0x21, 0x6e, 0x6e, 0x55, 0x73, 0x0b,
+ 0x4b, 0x8a, 0x52, 0x8b, 0x5f, 0xc9, 0x59, 0x66, 0x73, 0x63, 0x28, 0x12,
+ 0x0d, 0x53, 0xcc, 0x3b, 0xb3, 0x11, 0x21, 0x4e, 0x16, 0x1f, 0x69, 0xc7,
+ 0xb8, 0x5d, 0x06, 0xac, 0xcb, 0xb1, 0x9c, 0x9a, 0x70, 0x5c, 0x5a, 0x94,
+ 0x06, 0xbe, 0x61, 0x30, 0xd1, 0xcb, 0x59, 0x7a, 0xc5, 0x67, 0x26, 0xbf,
+ 0xea, 0x1e, 0xcf, 0xa2, 0x94, 0x04, 0xa5, 0xba, 0x34, 0x72, 0x1d, 0x1e,
+ 0x3d, 0xf6, 0x1d, 0xd5, 0xc9, 0x86, 0xe1, 0xb0, 0xd9, 0x12, 0x97, 0xfc,
+ 0xa9, 0x59, 0xde, 0x78, 0xfc, 0xed, 0xa6, 0x2f, 0xdb, 0x40, 0xdd, 0xb8,
+ 0x64, 0xeb, 0x88, 0x36, 0x12, 0x4e, 0xb0, 0xbd, 0xbf, 0xe6, 0x0d, 0x69,
+ 0x8b, 0x37, 0x6b, 0xd4, 0x55, 0x81, 0xec, 0x00, 0x0d, 0x28, 0x3c, 0x3b,
+ 0xb2, 0x52, 0x89, 0x1e, 0xd4, 0x28, 0x31, 0xf3, 0x75, 0xe7, 0x52, 0x58,
+ 0xc2, 0x23, 0x85, 0x8b, 0xb8, 0x3b, 0x9c, 0x91, 0xf2, 0x46, 0x0e, 0x2d,
+ 0x0b, 0xfa, 0xaf, 0x55, 0x9d, 0x73, 0x58, 0x0a, 0xb4, 0x13, 0x15, 0x05,
+ 0xe6, 0xc9, 0x71, 0x60, 0xd5, 0x4e, 0x23, 0x4f, 0x74, 0x6c, 0xa2, 0x66,
+ 0xe0, 0x63, 0x23, 0xe7, 0x9e, 0xd1, 0xd3, 0x29, 0x01, 0x8e, 0x4e, 0x5b,
+ 0x5c, 0x6e, 0x6f, 0xd4, 0x4b, 0x23, 0x5a, 0xc8, 0x5c, 0x70, 0x92, 0x83,
+ 0xf8, 0xb1, 0x3b, 0x3b, 0x96, 0x2e, 0xe6, 0x9a, 0xf1, 0x84, 0xc8, 0xe6,
+ 0x6f, 0x7d, 0x3a, 0xb0, 0x69, 0xfe, 0x2e, 0x9a, 0x7b, 0x37, 0x33, 0x66,
+ 0x18, 0x14, 0xb1, 0x40, 0x07, 0x3b, 0x3f, 0x19, 0x6f, 0x46, 0xf6, 0xb2,
+ 0x9d, 0x39, 0x43, 0xef, 0x93, 0xa0, 0x4d, 0x1b, 0x0d, 0xf5, 0x96, 0x64,
+ 0x0b, 0x78, 0xd9, 0x33, 0x9e, 0x49, 0xb5, 0xc8, 0x32, 0xb1, 0x34, 0xf1,
+ 0x28, 0xc9, 0x2e, 0xba, 0xa1, 0xa1, 0x23, 0xdb, 0x98, 0x6e, 0x72, 0x78,
+ 0x90, 0xf8, 0xc3, 0xd6, 0xec, 0xc6, 0xeb, 0x46, 0x59, 0xdc, 0x03, 0x1b,
+ 0xf5, 0xa6, 0x48, 0xb0, 0x0b, 0xe8, 0x10, 0x67, 0x47, 0x6f, 0x60, 0xb6,
+ 0xa6, 0x86, 0x71, 0xde, 0xaa, 0x93, 0x52, 0x93, 0xf2, 0x28, 0x18, 0xe5,
+ 0x87, 0xee, 0x9d, 0xa1, 0x8d, 0x84, 0x38, 0x66, 0x2d, 0xcc, 0x8e, 0xf3,
+ 0x6e, 0x72, 0x84, 0xac, 0xbb, 0x8c, 0xd6, 0xdc, 0x2f, 0x24, 0xda, 0x2e,
+ 0x4e, 0xfd, 0xee, 0xa5, 0x3c, 0x23, 0xe5, 0x8d, 0xad, 0x59, 0x6f, 0xcc,
+ 0x60, 0x87, 0x58, 0x63, 0xa1, 0x4b, 0xe0, 0xaa, 0xc8, 0xff, 0x26, 0xda,
+ 0x67, 0x56, 0xdc, 0xe4, 0x55, 0x59, 0x90, 0x76, 0xcb, 0x41, 0xb9, 0x0b,
+ 0x51, 0xbc, 0xa6, 0xc9, 0xfa, 0xe1, 0xfb, 0x77, 0x27, 0x1f, 0x0e, 0x0f,
+ 0x3e, 0x7c, 0xfd, 0xfe, 0xed, 0xab, 0x93, 0xa3, 0xf5, 0xce, 0x70, 0xac,
+ 0xd7, 0x99, 0xf9, 0xd5, 0x64, 0x6d, 0x88, 0x66, 0xc0, 0x83, 0x5e, 0xe5,
+ 0x37, 0x46, 0x98, 0xc1, 0x6e, 0x40, 0xce, 0x00, 0xfe, 0x06, 0x45, 0x20,
+ 0x75, 0x14, 0xef, 0x0c, 0x77, 0xb1, 0x24, 0x05, 0x6d, 0xd4, 0x52, 0x93,
+ 0xf5, 0xa8, 0x88, 0xad, 0xae, 0xf3, 0x8b, 0xa8, 0xd6, 0x19, 0xa9, 0x62,
+ 0x1c, 0x80, 0xb5, 0xd6, 0x21, 0xe4, 0x9e, 0x97, 0x46, 0xb0, 0x6c, 0x8c,
+ 0x85, 0xa4, 0x89, 0x0b, 0x14, 0x22, 0x03, 0xd5, 0x53, 0x33, 0xa1, 0xc8,
+ 0x76, 0xd7, 0x4e, 0x05, 0x35, 0x94, 0xa0, 0x51, 0x0c, 0xff, 0x0e, 0x65,
+ 0x92, 0x93, 0xaa, 0x31, 0x96, 0x4d, 0x96, 0xe3, 0x60, 0x68, 0x7e, 0x17,
+ 0x29, 0xab, 0x70, 0xc8, 0x05, 0xaa, 0x35, 0x85, 0xe4, 0x52, 0xe6, 0xeb,
+ 0x51, 0x76, 0x97, 0xe1, 0xe4, 0xc9, 0x5b, 0x87, 0xcb, 0x0a, 0xe7, 0xf9,
+ 0x07, 0xa3, 0x8b, 0x90, 0xf4, 0x7b, 0xa5, 0x31, 0x3c, 0x7d, 0xc8, 0xdc,
+ 0x31, 0xdd, 0xfb, 0xae, 0x9c, 0x51, 0xc6, 0x57, 0x0a, 0xff, 0x09, 0xdc,
+ 0x5d, 0x67, 0x07, 0xe7, 0xdf, 0xc6, 0xb4, 0xd8, 0x36, 0x1b, 0x42, 0x1b,
+ 0xaf, 0xd5, 0xc7, 0xf8, 0x76, 0x3c, 0x4e, 0x90, 0xe4, 0x4a, 0xe9, 0x18,
+ 0x55, 0x4a, 0x1f, 0xf4, 0x7e, 0x61, 0xb8, 0xba, 0x33, 0xdc, 0xd9, 0x77,
+ 0x87, 0xe3, 0xdf, 0xed, 0xec, 0x90, 0xfa, 0xbe, 0x34, 0x74, 0xd9, 0x30,
+ 0x6f, 0x15, 0xb5, 0x39, 0x99, 0xf3, 0x51, 0x5d, 0x6e, 0xe2, 0xca, 0xae,
+ 0x45, 0x1b, 0x48, 0x6f, 0xcc, 0x55, 0x0b, 0x36, 0x52, 0xa6, 0xee, 0x09,
+ 0xc7, 0xc2, 0xd9, 0x4b, 0x3a, 0x98, 0x91, 0x17, 0xe6, 0xb2, 0x9e, 0x85,
+ 0x9a, 0xf8, 0x46, 0x7e, 0x3a, 0xe6, 0x14, 0xda, 0x74, 0x62, 0xfe, 0x46,
+ 0xde, 0x81, 0xcd, 0xfe, 0x85, 0x8d, 0x59, 0x17, 0xe5, 0x08, 0x39, 0x52,
+ 0x7f, 0x43, 0xa9, 0x50, 0xa8, 0x27, 0x5b, 0xfd, 0x16, 0xc4, 0xbf, 0x36,
+ 0x16, 0x48, 0x13, 0xbe, 0x48, 0x27, 0x1f, 0x6f, 0xd3, 0x6a, 0x0a, 0x5b,
+ 0xc8, 0xb0, 0xcb, 0x45, 0x3e, 0xcb, 0x1b, 0xf6, 0x07, 0x76, 0x2d, 0x69,
+ 0x6c, 0x3f, 0xd1, 0xd0, 0x18, 0x27, 0xc6, 0xcc, 0xaf, 0x39, 0x43, 0x20,
+ 0x6f, 0x7c, 0x2b, 0x16, 0xea, 0x51, 0x33, 0xb2, 0xb7, 0xad, 0xf7, 0xe1,
+ 0xe0, 0x7a, 0xe4, 0x7c, 0xd5, 0x81, 0x4c, 0xd4, 0x71, 0xae, 0x0a, 0x42,
+ 0x5f, 0x4e, 0x59, 0xb6, 0xbb, 0x37, 0x97, 0xfc, 0x3c, 0xa2, 0x1f, 0x22,
+ 0xeb, 0xf9, 0xbb, 0xec, 0xde, 0x18, 0xcd, 0x79, 0xe1, 0x04, 0xa5, 0x15,
+ 0x8d, 0xaa, 0x88, 0xe6, 0xea, 0x41, 0xcf, 0x24, 0x0e, 0x22, 0x97, 0x49,
+ 0xe8, 0x36, 0xe0, 0x01, 0x54, 0x09, 0xa7, 0x31, 0xd6, 0xeb, 0x96, 0x48,
+ 0xc6, 0xa7, 0xc2, 0x4d, 0x1c, 0x9b, 0x9f, 0x17, 0x45, 0x36, 0x93, 0xfd,
+ 0x3b, 0x6f, 0x4b, 0xb7, 0x36, 0xf5, 0xed, 0xb3, 0x66, 0xce, 0x92, 0x51,
+ 0xd1, 0x19, 0xee, 0x39, 0xb2, 0x0e, 0xd3, 0x46, 0xaf, 0x24, 0x4d, 0x76,
+ 0x36, 0x16, 0xd1, 0xb6, 0xfd, 0xd5, 0xa8, 0xfb, 0x15, 0xf7, 0x99, 0xe0,
+ 0x34, 0xad, 0xdc, 0xf2, 0x70, 0x93, 0xff, 0x68, 0xf5, 0x2a, 0x48, 0xbf,
+ 0xce, 0x70, 0xbe, 0x8a, 0x2d, 0x57, 0x98, 0x2c, 0x63, 0xdd, 0xe8, 0xa8,
+ 0x65, 0x05, 0x27, 0x51, 0x55, 0x9a, 0xad, 0x6e, 0x6d, 0xe6, 0x06, 0x58,
+ 0x63, 0x1a, 0x68, 0x25, 0x22, 0xcd, 0x3d, 0xc2, 0x6c, 0xfe, 0x4a, 0x73,
+ 0xb5, 0xd7, 0xdc, 0x6c, 0xdf, 0xd0, 0x90, 0xd4, 0x2f, 0x8d, 0x18, 0x8b,
+ 0x5f, 0xd0, 0x72, 0x43, 0x3f, 0xf2, 0x8a, 0x76, 0x09, 0x09, 0xc1, 0x9d,
+ 0xd5, 0x61, 0xc6, 0x51, 0xf2, 0x46, 0x6f, 0x64, 0x9a, 0x81, 0xf5, 0xba,
+ 0x92, 0x68, 0xa0, 0x24, 0xc6, 0x29, 0x27, 0x77, 0x8b, 0x07, 0x39, 0x9a,
+ 0x60, 0x33, 0x17, 0x47, 0xe3, 0xfe, 0x5a, 0xb2, 0x91, 0x8d, 0xae, 0xcc,
+ 0x3d, 0xbe, 0x46, 0x43, 0xed, 0xec, 0xd3, 0x9f, 0xbb, 0xf8, 0x73, 0x6f,
+ 0x4d, 0x8b, 0x12, 0x7c, 0xda, 0xd3, 0x65, 0xde, 0xbd, 0x8b, 0x3a, 0x57,
+ 0x3b, 0x5f, 0x6f, 0x79, 0x9f, 0xe0, 0x61, 0x95, 0xf5, 0x84, 0x89, 0x9c,
+ 0x84, 0xea, 0x96, 0x52, 0x61, 0xce, 0x8e, 0x88, 0x9b, 0x8c, 0x3d, 0x21,
+ 0x66, 0x6d, 0x94, 0x7d, 0x04, 0xe7, 0xa1, 0x9e, 0xaa, 0xc9, 0x87, 0x2a,
+ 0xbb, 0x4e, 0xeb, 0xeb, 0x64, 0xd9, 0x30, 0x13, 0x1a, 0xbe, 0xed, 0x0e,
+ 0xb7, 0x98, 0xe5, 0xea, 0x61, 0x93, 0x2f, 0x8f, 0xc4, 0xe2, 0x73, 0x5b,
+ 0xc8, 0xde, 0x66, 0x73, 0xd3, 0x95, 0xb7, 0x89, 0x3e, 0x35, 0x94, 0x1a,
+ 0x81, 0xa8, 0x5a, 0x40, 0x97, 0x33, 0x5c, 0x26, 0xc4, 0xeb, 0x43, 0x3f,
+ 0xc1, 0x6e, 0x4e, 0x3a, 0x25, 0xd5, 0x30, 0x24, 0xd9, 0xa5, 0xa1, 0x19,
+ 0x19, 0x74, 0x33, 0xda, 0xb9, 0xb4, 0x88, 0xe6, 0x3a, 0x59, 0x3d, 0x2f,
+ 0xbf, 0x14, 0xa7, 0xad, 0xfc, 0x1b, 0xf7, 0xa9, 0x68, 0x60, 0x35, 0x67,
+ 0xe0, 0x19, 0x55, 0xa0, 0xa5, 0x7b, 0x3d, 0xcc, 0xda, 0x90, 0x8f, 0xbe,
+ 0x62, 0x2e, 0xeb, 0xe5, 0x30, 0x89, 0xf2, 0x75, 0x7e, 0x05, 0x5b, 0x23,
+ 0xe6, 0xbd, 0xb0, 0x5a, 0xcb, 0xaf, 0x3f, 0x24, 0x66, 0xc6, 0x43, 0x72,
+ 0x91, 0x2e, 0xeb, 0x55, 0x67, 0x44, 0x8f, 0x88, 0xc7, 0xe9, 0xfc, 0x92,
+ 0x75, 0x13, 0x73, 0xdc, 0xdc, 0x23, 0x40, 0x97, 0x0b, 0xef, 0x3d, 0xc6,
+ 0x38, 0xf4, 0xce, 0xd5, 0x98, 0xc7, 0x79, 0x27, 0xfe, 0x91, 0x8d, 0xf4,
+ 0x63, 0x3a, 0x4a, 0x4e, 0x0f, 0xc7, 0x67, 0xf4, 0x85, 0x05, 0xa5, 0x0a,
+ 0x6c, 0x52, 0x1e, 0x41, 0x67, 0xb8, 0xec, 0xae, 0xc9, 0x8a, 0x3a, 0xe6,
+ 0x99, 0xe4, 0xbb, 0xa9, 0xed, 0xf3, 0x94, 0xe0, 0x81, 0x0d, 0x53, 0xfb,
+ 0x41, 0x7e, 0x64, 0x19, 0x20, 0x31, 0x94, 0x8f, 0x5a, 0xf0, 0xa1, 0x85,
+ 0x39, 0xf8, 0xd3, 0x4d, 0xeb, 0xa7, 0x19, 0x28, 0x2f, 0xd8, 0x20, 0x61,
+ 0xbd, 0xbc, 0x22, 0x1b, 0xa4, 0x56, 0xcb, 0xd1, 0xa7, 0x46, 0xa8, 0x2a,
+ 0xc8, 0xb2, 0xe1, 0x43, 0xe4, 0xa3, 0x63, 0x46, 0x42, 0x8a, 0x37, 0xb4,
+ 0xa4, 0xa2, 0x74, 0x03, 0x9b, 0xd1, 0xc8, 0xd5, 0x96, 0x53, 0x54, 0x6d,
+ 0x92, 0x19, 0x35, 0x74, 0x1a, 0x51, 0x02, 0x78, 0x4f, 0xd4, 0x76, 0xba,
+ 0x94, 0x0a, 0x97, 0xb8, 0x6b, 0x6a, 0xc2, 0x0a, 0x9a, 0xc6, 0x26, 0x72,
+ 0xf2, 0x8f, 0x92, 0xb2, 0xcc, 0x76, 0x3a, 0x0e, 0xbc, 0x3d, 0xfe, 0xc9,
+ 0x37, 0xc5, 0x92, 0x92, 0x8f, 0x22, 0xb7, 0x31, 0x69, 0x55, 0x74, 0xcd,
+ 0x10, 0xfd, 0x56, 0x79, 0xf5, 0x9e, 0xec, 0xb4, 0xbd, 0xd7, 0x60, 0x36,
+ 0x63, 0x00, 0x64, 0xc9, 0x4b, 0xfa, 0xf3, 0x11, 0x52, 0x99, 0xf3, 0x34,
+ 0xf0, 0x8a, 0x44, 0x3a, 0x59, 0x80, 0xb2, 0x2b, 0xa6, 0x25, 0x9f, 0x83,
+ 0xdb, 0x0b, 0xec, 0x36, 0x22, 0xc1, 0x37, 0x48, 0x5e, 0x51, 0x55, 0xd9,
+ 0xd1, 0xdb, 0x6f, 0xc0, 0x02, 0x67, 0x3b, 0xbb, 0x88, 0x29, 0x59, 0xe3,
+ 0x61, 0x8a, 0x2f, 0xd4, 0xec, 0x46, 0x40, 0x46, 0xe5, 0x22, 0x54, 0x7c,
+ 0x71, 0x23, 0x0c, 0x20, 0x47, 0x29, 0x18, 0x88, 0x8c, 0xe6, 0xe9, 0xa7,
+ 0xbb, 0xbf, 0x02, 0x43, 0xf4, 0x68, 0x20, 0x14, 0xa4, 0xff, 0x7e, 0xcc,
+ 0xee, 0xc5, 0x3f, 0x63, 0xfe, 0x06, 0x92, 0x7a, 0x74, 0xb6, 0x4f, 0x26,
+ 0x2f, 0x3d, 0x02, 0xfd, 0x79, 0x9f, 0x52, 0xa6, 0x29, 0x15, 0xf5, 0xe7,
+ 0xc7, 0x10, 0x3e, 0x7e, 0x1f, 0x86, 0x64, 0x8f, 0x78, 0x5a, 0xe0, 0xe0,
+ 0xd2, 0xfc, 0x31, 0x8e, 0xf5, 0xb3, 0x80, 0x97, 0x82, 0x3e, 0xaa, 0xf5,
+ 0x23, 0x56, 0x4f, 0x0b, 0xab, 0x8f, 0x0c, 0x39, 0xc5, 0x0d, 0x69, 0x87,
+ 0x5d, 0xc2, 0x4f, 0xca, 0x99, 0xa4, 0xa3, 0xb4, 0x3e, 0xec, 0x9b, 0xad,
+ 0x50, 0xe7, 0x77, 0xe5, 0x7e, 0xa3, 0xf3, 0xc9, 0xa2, 0x86, 0x75, 0xe8,
+ 0xee, 0x59, 0xb0, 0x0a, 0x35, 0xb2, 0x19, 0xec, 0xb5, 0xe8, 0x5e, 0x43,
+ 0x54, 0x1b, 0x33, 0x63, 0x2d, 0x69, 0x94, 0xa8, 0x33, 0xaf, 0x47, 0xf7,
+ 0xa7, 0xdc, 0x5c, 0x25, 0x2e, 0xe9, 0xc2, 0xe4, 0x66, 0xb2, 0x44, 0x6b,
+ 0xb9, 0x9a, 0x8c, 0x8c, 0xab, 0x72, 0xd1, 0x0e, 0xb9, 0x2c, 0x27, 0x8c,
+ 0x5c, 0x70, 0x92, 0x41, 0xd7, 0x17, 0xa5, 0x9a, 0x36, 0x33, 0x1e, 0x8a,
+ 0x33, 0x93, 0x35, 0x8f, 0x1e, 0x6b, 0xd1, 0xc8, 0x45, 0xc3, 0x01, 0x4f,
+ 0x39, 0x3c, 0xf9, 0x0d, 0x11, 0x4e, 0x79, 0x07, 0x37, 0x74, 0xb8, 0xa1,
+ 0x14, 0x77, 0x34, 0xff, 0x2d, 0xc8, 0x25, 0xf6, 0x2f, 0x11, 0x6e, 0xf4,
+ 0xd8, 0xcb, 0x72, 0x20, 0x72, 0xf3, 0x24, 0xe2, 0x01, 0xed, 0x85, 0xea,
+ 0x32, 0xa4, 0x74, 0x6e, 0x76, 0xff, 0x78, 0x6b, 0x8e, 0xa6, 0x44, 0xc2,
+ 0x85, 0x34, 0x54, 0xb1, 0xe4, 0x62, 0x86, 0x4e, 0x97, 0x41, 0x48, 0x3b,
+ 0x68, 0x28, 0x89, 0x84, 0xaf, 0x29, 0xf2, 0xba, 0xe6, 0x93, 0x8f, 0x08,
+ 0xb8, 0xc8, 0xf5, 0xe4, 0x2f, 0x50, 0x2b, 0x09, 0xb8, 0x0a, 0x26, 0xdc,
+ 0x02, 0x9a, 0x00, 0xf9, 0x83, 0x89, 0x25, 0xe9, 0x66, 0xce, 0x0b, 0x76,
+ 0xf4, 0xf5, 0x3a, 0x18, 0xcc, 0x6c, 0x3f, 0xbc, 0x3a, 0x7e, 0x97, 0x6c,
+ 0x50, 0x42, 0xc2, 0x45, 0xd7, 0xc2, 0xd5, 0xbb, 0x3d, 0xd9, 0xca, 0x9a,
+ 0xc9, 0xd6, 0xe2, 0x63, 0xbe, 0x65, 0x4c, 0xcd, 0xe9, 0xc5, 0xa6, 0xe7,
+ 0xb4, 0xc4, 0x27, 0x89, 0x13, 0x23, 0x76, 0x69, 0xe0, 0x77, 0x74, 0x76,
+ 0x2a, 0x89, 0x21, 0x6b, 0x9e, 0x82, 0x4a, 0xe0, 0x66, 0x04, 0x65, 0x24,
+ 0x1b, 0x82, 0xa3, 0x39, 0xf0, 0x6d, 0x4a, 0xb2, 0x4a, 0xf7, 0xac, 0x72,
+ 0x39, 0x86, 0x78, 0x71, 0xd8, 0x7b, 0xa3, 0x35, 0x04, 0x72, 0x5b, 0x38,
+ 0xcd, 0x77, 0x40, 0xd5, 0x1f, 0x44, 0x95, 0x05, 0xdd, 0x47, 0x53, 0xf2,
+ 0x01, 0x46, 0x72, 0x41, 0x93, 0xb5, 0xd1, 0xd6, 0x9a, 0xad, 0x76, 0x31,
+ 0x24, 0xe6, 0xa2, 0x2e, 0x1b, 0xec, 0x32, 0x0c, 0x76, 0xb9, 0xac, 0xad,
+ 0x07, 0x93, 0x18, 0x59, 0xb7, 0x6b, 0x14, 0xbd, 0xcb, 0xbd, 0xed, 0xb4,
+ 0x1a, 0x97, 0xd1, 0x8c, 0x71, 0xb0, 0x7c, 0x5b, 0x5d, 0x66, 0x85, 0xcd,
+ 0x5a, 0xfb, 0x69, 0xcd, 0xab, 0x97, 0x68, 0x9d, 0x86, 0xc6, 0x8f, 0x20,
+ 0x88, 0xfc, 0x37, 0x77, 0xb1, 0x3d, 0xc0, 0xd3, 0x6c, 0x96, 0xcf, 0x73,
+ 0xd8, 0x5d, 0x6e, 0x87, 0x68, 0x06, 0xc3, 0x58, 0x58, 0xd0, 0x9b, 0xd2,
+ 0x4f, 0xe1, 0x94, 0xb4, 0x0c, 0x29, 0xa5, 0x5f, 0x63, 0x4a, 0xde, 0x24,
+ 0x22, 0x26, 0x73, 0x7b, 0x4a, 0xb6, 0x8e, 0x69, 0x45, 0xb0, 0xf8, 0xf8,
+ 0x01, 0x3d, 0xde, 0x79, 0x44, 0xf4, 0xcc, 0xb3, 0x50, 0x33, 0x12, 0xeb,
+ 0xe3, 0xa4, 0xde, 0xd9, 0xe9, 0xde, 0x72, 0x1e, 0x4f, 0x0d, 0x98, 0xa9,
+ 0x52, 0xcb, 0x96, 0xef, 0xdf, 0x1d, 0x27, 0x1b, 0x54, 0xd9, 0xfa, 0xfc,
+ 0xe9, 0xce, 0xee, 0xa6, 0x9f, 0x4c, 0xa2, 0x02, 0x20, 0xbc, 0x34, 0x29,
+ 0x04, 0xea, 0x9f, 0x3e, 0x2a, 0x65, 0x10, 0x7d, 0xc3, 0x0d, 0x3c, 0xcd,
+ 0x6e, 0xf2, 0x09, 0x95, 0x15, 0x23, 0x04, 0x0f, 0xe5, 0xff, 0x22, 0x33,
+ 0xb3, 0x0c, 0x28, 0x8e, 0x5f, 0x31, 0xdb, 0xac, 0xf1, 0xfc, 0x8d, 0x85,
+ 0x64, 0x15, 0x65, 0x4a, 0x16, 0x35, 0x4c, 0xd0, 0x08, 0xf5, 0xfc, 0x79,
+ 0xc3, 0x67, 0x91, 0xf6, 0xb8, 0x81, 0x68, 0x5d, 0x5c, 0xf6, 0x0b, 0xed,
+ 0x42, 0xd6, 0xcd, 0xfa, 0xbe, 0x50, 0x4b, 0xc4, 0xaf, 0x0d, 0x1a, 0x53,
+ 0xd2, 0x49, 0x77, 0x03, 0x65, 0x46, 0x6b, 0x74, 0x93, 0x14, 0xb8, 0xd9,
+ 0x53, 0x37, 0xa8, 0x25, 0xbf, 0xaf, 0x06, 0xb5, 0x47, 0x0d, 0xdd, 0xe4,
+ 0xe0, 0x1b, 0xa3, 0xb6, 0xc4, 0x87, 0xfc, 0xa7, 0x78, 0x98, 0xba, 0xd2,
+ 0x53, 0xf6, 0x87, 0xf6, 0x5e, 0x5c, 0x86, 0x17, 0x99, 0x94, 0x84, 0xb0,
+ 0xb8, 0xb5, 0xdb, 0x1d, 0xdc, 0xe3, 0xe6, 0xf5, 0x2d, 0xff, 0x12, 0x6a,
+ 0x3b, 0x7d, 0x28, 0x81, 0x99, 0xbc, 0x3c, 0x1f, 0xc5, 0xcb, 0x83, 0xeb,
+ 0xd9, 0x66, 0x6c, 0x44, 0x1c, 0xc5, 0xba, 0x7f, 0xbb, 0x66, 0x8f, 0x26,
+ 0x25, 0xcc, 0x6a, 0x7f, 0xa2, 0x20, 0x84, 0xf7, 0xb9, 0x51, 0x2b, 0xcf,
+ 0xb1, 0xc7, 0x8d, 0xfd, 0x58, 0x01, 0x68, 0x25, 0x20, 0x9d, 0xe4, 0x98,
+ 0x3b, 0xed, 0x97, 0xc9, 0xc0, 0xd4, 0x93, 0x80, 0xbd, 0x0e, 0x27, 0xd9,
+ 0xcf, 0xc3, 0xe0, 0xca, 0xae, 0xad, 0x2e, 0xe4, 0x34, 0x35, 0x2a, 0x5f,
+ 0x03, 0xe5, 0x42, 0x73, 0xa6, 0xe2, 0x3c, 0x6a, 0x4e, 0xc4, 0x6c, 0x6f,
+ 0x2d, 0x6a, 0xfb, 0x93, 0x8d, 0x13, 0xc9, 0x09, 0x4f, 0xce, 0x5e, 0xff,
+ 0x68, 0xeb, 0xe9, 0x92, 0xa8, 0xf5, 0x0e, 0x2f, 0xd4, 0x1f, 0x6d, 0x00,
+ 0xd8, 0x58, 0x14, 0x94, 0x9c, 0x96, 0x4b, 0x9a, 0x27, 0x3b, 0x89, 0x10,
+ 0x08, 0xdf, 0x74, 0x09, 0x8c, 0x44, 0xea, 0xb5, 0x97, 0xf8, 0x5d, 0x37,
+ 0xd0, 0x54, 0xb2, 0x19, 0xf3, 0xe5, 0x4f, 0xfc, 0x6b, 0xce, 0x70, 0xf9,
+ 0xe9, 0x65, 0x73, 0xbd, 0x9c, 0x5f, 0x98, 0xbd, 0x2c, 0x9a, 0x2f, 0xd7,
+ 0x38, 0xc6, 0x7a, 0xc9, 0xd4, 0x24, 0x2e, 0xe8, 0xb7, 0x39, 0x29, 0x38,
+ 0xc2, 0xe2, 0x5b, 0x99, 0xac, 0x4d, 0x36, 0x9e, 0xdf, 0x20, 0x48, 0x25,
+ 0x5c, 0x63, 0x47, 0x76, 0xa0, 0xea, 0xbd, 0x37, 0xfc, 0xf9, 0xd3, 0x9b,
+ 0x3f, 0xfd, 0xf4, 0x62, 0xef, 0x49, 0xfa, 0x3c, 0x9d, 0x3c, 0xbb, 0xfc,
+ 0x3c, 0x7d, 0x3a, 0x7d, 0xfa, 0xfc, 0xc5, 0xee, 0xe7, 0x4f, 0xd3, 0xe7,
+ 0x4f, 0x2e, 0xd3, 0x67, 0x3b, 0xd9, 0xce, 0x8b, 0xcb, 0xdd, 0xbd, 0xe9,
+ 0xf4, 0x32, 0xfb, 0x7c, 0xfa, 0x3c, 0x5d, 0x1b, 0xc1, 0xf6, 0xd2, 0xb9,
+ 0x87, 0xa2, 0xd6, 0x86, 0xdd, 0xcc, 0x3a, 0xc6, 0xdf, 0x1e, 0x0c, 0x77,
+ 0x92, 0xeb, 0xec, 0x4e, 0x8f, 0x58, 0x3b, 0xb4, 0x4e, 0x28, 0x0b, 0x94,
+ 0x4d, 0xd3, 0xbb, 0x58, 0x45, 0x37, 0x48, 0x5e, 0x97, 0xe4, 0x28, 0x41,
+ 0x66, 0x2d, 0x68, 0xa8, 0x44, 0xe5, 0x44, 0x3a, 0xe7, 0x3b, 0xdc, 0x4f,
+ 0xd4, 0x61, 0x4f, 0xeb, 0xea, 0x1e, 0xfe, 0x13, 0x2a, 0x39, 0x7b, 0x93,
+ 0x4e, 0x8c, 0x8e, 0x44, 0x24, 0x91, 0x27, 0xc7, 0xc6, 0xb0, 0x35, 0x92,
+ 0x7a, 0x90, 0xc8, 0x5f, 0x8c, 0x2d, 0xe3, 0x8d, 0xf1, 0x4d, 0x55, 0x2e,
+ 0x17, 0x67, 0xe5, 0x2c, 0x9f, 0xdc, 0xaf, 0x1a, 0xce, 0x7f, 0xac, 0xf5,
+ 0x8b, 0x23, 0x16, 0xe0, 0x79, 0x9d, 0xfd, 0x13, 0xed, 0x2a, 0x27, 0x8e,
+ 0x1f, 0x34, 0xac, 0x86, 0x93, 0x7c, 0x71, 0x4d, 0x11, 0xde, 0x97, 0xc8,
+ 0xea, 0x33, 0xc2, 0x4e, 0x7e, 0x10, 0x37, 0xa8, 0xc6, 0x72, 0x1a, 0x6b,
+ 0xd9, 0x4a, 0x7d, 0x5b, 0xd4, 0xad, 0x5c, 0xcb, 0xf2, 0xd5, 0x3b, 0x25,
+ 0x99, 0xa4, 0x79, 0xe0, 0xc1, 0x43, 0xe8, 0x47, 0x5e, 0x96, 0x84, 0x03,
+ 0x9b, 0x7a, 0xc9, 0x9e, 0x0b, 0xf9, 0xed, 0x88, 0x4b, 0x07, 0x97, 0x0b,
+ 0x32, 0x2e, 0x00, 0xfa, 0x81, 0x9f, 0x77, 0x4f, 0x19, 0x4d, 0x5e, 0xd8,
+ 0x85, 0xad, 0x10, 0x43, 0xce, 0xf7, 0xef, 0x4e, 0xf6, 0xbb, 0x44, 0x4a,
+ 0xa8, 0xf6, 0xb9, 0xde, 0xdf, 0xda, 0x42, 0xb0, 0xe7, 0x3a, 0xbd, 0xbb,
+ 0x1b, 0xd5, 0xd9, 0xd6, 0xb4, 0x9c, 0xd4, 0x5b, 0x75, 0x3d, 0x53, 0x6a,
+ 0x00, 0x90, 0xe0, 0x53, 0xfa, 0x71, 0xcb, 0x39, 0x64, 0x56, 0x36, 0x1d,
+ 0xd6, 0x75, 0x90, 0x12, 0x44, 0xa5, 0x39, 0x9c, 0x73, 0x70, 0x24, 0x69,
+ 0x68, 0xb8, 0xe5, 0x86, 0x79, 0x81, 0x6a, 0x1a, 0x7d, 0x19, 0xe4, 0xb5,
+ 0x7e, 0x10, 0x9b, 0x8e, 0x33, 0x88, 0xe8, 0x60, 0xa9, 0x48, 0xeb, 0x3f,
+ 0xfa, 0xae, 0x1c, 0xd2, 0xa7, 0xcb, 0xca, 0x96, 0x80, 0xa2, 0x32, 0x79,
+ 0x65, 0xe2, 0xde, 0xb3, 0x8e, 0xeb, 0xc3, 0x2e, 0x22, 0x1e, 0xf9, 0x57,
+ 0xf7, 0x57, 0x9a, 0xb8, 0x27, 0x9d, 0x23, 0xa8, 0x8b, 0xad, 0x63, 0x58,
+ 0xf7, 0xaa, 0xac, 0xcc, 0xcd, 0x31, 0xaf, 0x57, 0xd5, 0x2d, 0xb2, 0xce,
+ 0xd7, 0x0e, 0x15, 0x4e, 0x33, 0xfd, 0x80, 0x72, 0x5f, 0x03, 0x7c, 0x93,
+ 0x6f, 0x39, 0xdd, 0xa8, 0x7b, 0xc9, 0x0a, 0xf8, 0x45, 0x6f, 0x9e, 0x9b,
+ 0xf5, 0xb6, 0x75, 0x77, 0xba, 0xcf, 0xd7, 0xb6, 0x2c, 0x5c, 0x8c, 0x24,
+ 0x14, 0xb1, 0xe6, 0x1e, 0x37, 0x2b, 0x1d, 0x78, 0xe1, 0xa2, 0x2a, 0xe3,
+ 0xda, 0x56, 0xa3, 0x6e, 0x54, 0x55, 0xe9, 0xe9, 0xbf, 0xc3, 0xef, 0x60,
+ 0x87, 0x9a, 0x8b, 0x34, 0xbf, 0xd2, 0x30, 0x7c, 0x6f, 0x12, 0x5e, 0x43,
+ 0x89, 0xcd, 0x1a, 0x64, 0xa7, 0xda, 0x20, 0xf1, 0x72, 0x68, 0xe2, 0x66,
+ 0xcd, 0x99, 0x37, 0xd6, 0xcf, 0xd0, 0x86, 0x9d, 0xf0, 0xd0, 0x27, 0xda,
+ 0xaf, 0x50, 0xb6, 0x55, 0xa2, 0x07, 0xd9, 0x7d, 0xa3, 0x95, 0x00, 0x47,
+ 0x78, 0x28, 0xd8, 0xb4, 0xae, 0x61, 0x88, 0x6c, 0x5c, 0xab, 0x1e, 0xc6,
+ 0x40, 0x3a, 0xba, 0xeb, 0x39, 0x5d, 0xb4, 0x0a, 0x3f, 0x73, 0x60, 0xc6,
+ 0xa4, 0x48, 0xfa, 0x8f, 0xe9, 0x00, 0xa5, 0x17, 0xcb, 0xc5, 0x80, 0xe1,
+ 0xf5, 0xd8, 0xd8, 0xbc, 0x4a, 0xad, 0xb2, 0x86, 0xea, 0x60, 0xe4, 0x95,
+ 0xb9, 0x1f, 0x29, 0x1f, 0x9d, 0xa0, 0x82, 0x66, 0xa5, 0x53, 0xc6, 0xa4,
+ 0xba, 0x91, 0xb0, 0x14, 0x46, 0x81, 0x88, 0x47, 0xbd, 0x12, 0xb8, 0x80,
+ 0x51, 0x01, 0x26, 0x36, 0x89, 0x1b, 0xac, 0x77, 0xa1, 0xb1, 0x74, 0x5c,
+ 0xcc, 0x82, 0xef, 0x81, 0xed, 0x8b, 0x7a, 0x91, 0x24, 0x67, 0x9f, 0x61,
+ 0x1a, 0x72, 0x80, 0x90, 0x08, 0x64, 0x05, 0xd7, 0x1f, 0xa8, 0x07, 0xbc,
+ 0x2e, 0x25, 0xad, 0x93, 0x26, 0x4a, 0xf3, 0xe4, 0x39, 0x76, 0x39, 0xcb,
+ 0xc2, 0x51, 0xb4, 0xec, 0x96, 0xb4, 0x76, 0x99, 0xfc, 0xb5, 0x4d, 0xda,
+ 0xf2, 0x5c, 0xf4, 0x4a, 0xcd, 0x98, 0xa1, 0x1b, 0xd6, 0x44, 0x60, 0x26,
+ 0x55, 0xa6, 0x9f, 0x28, 0xca, 0xee, 0xac, 0x64, 0x1e, 0xb1, 0x84, 0x55,
+ 0xcd, 0xfc, 0xf7, 0x26, 0xa0, 0x15, 0x00, 0x76, 0x9b, 0xe3, 0xf7, 0x62,
+ 0xe6, 0x1e, 0x70, 0xe6, 0xa8, 0xdb, 0x43, 0x38, 0x26, 0xa4, 0xa6, 0x8e,
+ 0xe7, 0xbd, 0xcf, 0xd5, 0xe5, 0x5f, 0x6c, 0xc6, 0xfc, 0xc9, 0xde, 0x60,
+ 0x2e, 0xbb, 0xcd, 0x9c, 0xd5, 0xc9, 0xac, 0x44, 0xe6, 0xa0, 0x38, 0x4e,
+ 0x18, 0x37, 0x84, 0xab, 0x7d, 0x2d, 0x9a, 0x48, 0x67, 0x38, 0x7e, 0x86,
+ 0xb7, 0xe7, 0xd2, 0xaa, 0x25, 0x62, 0xd3, 0x3a, 0x9c, 0x13, 0xe8, 0x25,
+ 0xd6, 0xec, 0x34, 0x93, 0xfb, 0xe9, 0x27, 0xa3, 0x72, 0x18, 0x73, 0xba,
+ 0x33, 0xdc, 0x4f, 0xcd, 0x20, 0xf9, 0xc9, 0xf0, 0xe2, 0x4f, 0x5c, 0xce,
+ 0xf4, 0xd3, 0x0d, 0x59, 0x8c, 0xe4, 0x88, 0xae, 0x67, 0x14, 0x65, 0x62,
+ 0x9d, 0xbc, 0xed, 0xc1, 0x63, 0x44, 0x17, 0xa0, 0x36, 0xc4, 0x53, 0xb8,
+ 0xbc, 0xd4, 0x64, 0x4a, 0xd7, 0x34, 0xdb, 0xb5, 0x9c, 0x17, 0x62, 0xc7,
+ 0x30, 0x73, 0xe2, 0xd8, 0xe3, 0xd2, 0x58, 0xff, 0xdd, 0xba, 0xc7, 0x48,
+ 0x51, 0xda, 0x55, 0x24, 0xc4, 0x71, 0x61, 0xe3, 0x6e, 0xcb, 0xbd, 0x7b,
+ 0x4d, 0xe1, 0x4f, 0x60, 0x9a, 0x72, 0x60, 0xd5, 0xc8, 0xdd, 0x53, 0x72,
+ 0xc4, 0xa3, 0x4a, 0xac, 0x7b, 0xe9, 0x3b, 0xab, 0x93, 0x6a, 0xe7, 0x16,
+ 0xd7, 0xf7, 0x35, 0x89, 0x70, 0x99, 0x8e, 0xd5, 0x1d, 0x68, 0x86, 0xd1,
+ 0x04, 0x99, 0xb1, 0xf3, 0xc7, 0xe1, 0x01, 0xd8, 0x67, 0x46, 0xfa, 0xb5,
+ 0xe4, 0xa6, 0x99, 0xcb, 0xfa, 0x70, 0xdd, 0x8b, 0x97, 0x69, 0x5a, 0x4d,
+ 0x90, 0x69, 0x6f, 0xb3, 0xb7, 0x5d, 0x86, 0x62, 0xf0, 0x49, 0xb8, 0x2c,
+ 0x05, 0x9c, 0x82, 0x86, 0xf4, 0xb2, 0x22, 0x1d, 0x42, 0x0f, 0x15, 0x78,
+ 0x86, 0xd3, 0x1f, 0x44, 0x7c, 0x53, 0x52, 0x57, 0x66, 0xdf, 0xcd, 0x1b,
+ 0x2f, 0x84, 0x34, 0x1c, 0x02, 0x43, 0x6d, 0xc1, 0xb8, 0x67, 0x5c, 0xd6,
+ 0x08, 0x2b, 0x05, 0xa1, 0x55, 0x8a, 0x6c, 0x04, 0xf2, 0x56, 0x13, 0x06,
+ 0x1b, 0x0b, 0xf9, 0x45, 0x67, 0x9c, 0x30, 0xb7, 0x6e, 0x0b, 0x41, 0x45,
+ 0x1a, 0x97, 0x70, 0xe1, 0x4c, 0x90, 0xf1, 0x80, 0xac, 0x1a, 0x29, 0x39,
+ 0x0b, 0x0d, 0x46, 0xba, 0xf5, 0x02, 0x8d, 0x89, 0xe6, 0xf4, 0x05, 0x63,
+ 0xc6, 0xc4, 0xf5, 0xa6, 0xb5, 0xee, 0x1b, 0x3f, 0xd8, 0xec, 0x08, 0x20,
+ 0x8b, 0x48, 0x20, 0xc8, 0xcc, 0x61, 0x43, 0xf2, 0xed, 0x86, 0x7f, 0x45,
+ 0x01, 0x91, 0xd4, 0x7b, 0x69, 0x02, 0xef, 0x66, 0xc2, 0x59, 0xc4, 0x75,
+ 0x24, 0x03, 0xc0, 0x65, 0x63, 0x79, 0x04, 0x76, 0x39, 0x4d, 0x39, 0x5c,
+ 0xdd, 0xb8, 0xbb, 0x58, 0xe3, 0xf4, 0x9e, 0x0e, 0x42, 0xf6, 0xfa, 0x36,
+ 0x05, 0x8f, 0xe8, 0x7b, 0xe2, 0xbb, 0xd6, 0xab, 0xc3, 0x9e, 0xe9, 0xc5,
+ 0x0c, 0x38, 0x64, 0x5a, 0x09, 0x03, 0x05, 0x2a, 0xa0, 0xce, 0xce, 0x26,
+ 0xa5, 0xe1, 0x71, 0x04, 0x90, 0xb2, 0xb1, 0xbe, 0x3d, 0x7d, 0x73, 0x14,
+ 0x77, 0xa9, 0x92, 0x58, 0xcf, 0x9a, 0xee, 0xfb, 0xbb, 0xee, 0xfd, 0x1f,
+ 0x5f, 0x7d, 0xf3, 0xe1, 0xf0, 0xf4, 0xed, 0xeb, 0xe3, 0x6f, 0x1e, 0x1c,
+ 0x25, 0xd9, 0x50, 0xbd, 0xac, 0x9b, 0x7c, 0x31, 0x7a, 0xbe, 0x37, 0xda,
+ 0xde, 0xec, 0x7e, 0x65, 0xcf, 0x7d, 0xe5, 0x97, 0x4e, 0xf0, 0xc9, 0xa6,
+ 0x39, 0x03, 0xc5, 0x50, 0x92, 0xb7, 0xf6, 0xa1, 0xe6, 0x5f, 0x65, 0xcd,
+ 0xe2, 0x76, 0x99, 0x4f, 0x39, 0x57, 0x5d, 0xb4, 0xa2, 0xeb, 0x72, 0xee,
+ 0x65, 0x14, 0x74, 0x87, 0x79, 0xba, 0xa9, 0x79, 0x16, 0x3c, 0xc4, 0xc1,
+ 0xd9, 0xd9, 0xab, 0x83, 0xf3, 0x83, 0x9e, 0x8f, 0x3e, 0xeb, 0x3c, 0xbd,
+ 0xf6, 0x7e, 0x7c, 0xf4, 0xee, 0xec, 0xdd, 0x29, 0x81, 0x89, 0x6c, 0xcf,
+ 0x34, 0x30, 0xf8, 0x2a, 0x6d, 0xd2, 0xb5, 0x9e, 0x11, 0x9e, 0x1b, 0x6e,
+ 0x3a, 0x2d, 0x6c, 0xd2, 0x99, 0x46, 0x38, 0xab, 0x8c, 0x3d, 0xa5, 0xc9,
+ 0x88, 0xf8, 0xb3, 0x9a, 0x08, 0x27, 0x14, 0xad, 0x15, 0x0c, 0x42, 0x27,
+ 0x30, 0x33, 0xa6, 0xc4, 0x38, 0xb2, 0x6e, 0x4a, 0x99, 0x7a, 0x56, 0x66,
+ 0xc6, 0xe0, 0xce, 0x26, 0xcb, 0x46, 0xd9, 0x1a, 0x1c, 0x44, 0x18, 0x33,
+ 0xdd, 0x6d, 0xa2, 0x7a, 0xa0, 0x21, 0xaa, 0xd0, 0xc4, 0x8a, 0xaf, 0x07,
+ 0x89, 0x8d, 0xa9, 0xf0, 0x49, 0x07, 0xc8, 0x91, 0xa1, 0x2f, 0x72, 0xa5,
+ 0xed, 0x6c, 0xc5, 0x8d, 0x13, 0xda, 0xc9, 0x88, 0xb1, 0x00, 0xf2, 0x88,
+ 0xa7, 0x14, 0x08, 0xb2, 0xdf, 0x99, 0x13, 0x37, 0x4c, 0x8e, 0xa4, 0xe0,
+ 0x0d, 0xcb, 0x36, 0x3f, 0x08, 0x1e, 0x6a, 0xac, 0x39, 0x21, 0xe2, 0x3c,
+ 0x2e, 0x0d, 0x3c, 0x24, 0xb0, 0xb5, 0xae, 0x90, 0xe7, 0xd2, 0x56, 0xf3,
+ 0x10, 0x4d, 0x9a, 0x48, 0x2e, 0xf0, 0x6e, 0x61, 0xfa, 0xd3, 0x30, 0xbd,
+ 0x22, 0x0e, 0xfc, 0x82, 0xf0, 0x29, 0x28, 0x1b, 0x9c, 0xfe, 0xb5, 0xb5,
+ 0x33, 0xda, 0x5e, 0x0b, 0x27, 0x4f, 0x47, 0x5d, 0xca, 0xea, 0x25, 0xc4,
+ 0x46, 0xd2, 0xae, 0x29, 0xcb, 0x07, 0xe7, 0xc7, 0x42, 0xca, 0x68, 0xa0,
+ 0x0b, 0x33, 0x7e, 0x74, 0x2a, 0xc3, 0xd3, 0x20, 0x1f, 0x84, 0xb2, 0x78,
+ 0x2b, 0x15, 0x7b, 0x46, 0xea, 0x15, 0x25, 0x8a, 0xf2, 0x0d, 0xc3, 0xcd,
+ 0x66, 0x2d, 0xd0, 0xbd, 0xb5, 0x38, 0x99, 0x0b, 0x40, 0x5f, 0x66, 0x5d,
+ 0x6a, 0xaf, 0xa8, 0x38, 0xf2, 0x35, 0x38, 0x9b, 0xfd, 0x0a, 0x9b, 0xd2,
+ 0x72, 0x81, 0x97, 0x15, 0xcb, 0x52, 0x30, 0x02, 0x8a, 0x53, 0xb7, 0x2d,
+ 0x34, 0xd8, 0xe1, 0x43, 0x1a, 0x86, 0xf4, 0xce, 0x97, 0x5c, 0xad, 0x1e,
+ 0xd8, 0xf6, 0x6f, 0xd2, 0xbb, 0x7c, 0xbe, 0x9c, 0x73, 0xe5, 0x3c, 0xab,
+ 0xb2, 0xf2, 0xa4, 0x5e, 0x7d, 0xe4, 0xb2, 0xe1, 0x64, 0x15, 0xda, 0xd4,
+ 0xf5, 0xda, 0x33, 0xf1, 0x23, 0xd7, 0x88, 0xb9, 0x76, 0xd5, 0x32, 0x95,
+ 0x82, 0xc1, 0x79, 0xde, 0xd4, 0x1d, 0xd7, 0x80, 0xb9, 0xfe, 0x53, 0x4a,
+ 0x3d, 0x20, 0xa8, 0xb5, 0x5c, 0x13, 0x41, 0x63, 0x02, 0x9b, 0xa1, 0x9c,
+ 0xbc, 0xe0, 0x96, 0xa6, 0xaf, 0x66, 0x55, 0x5e, 0x4e, 0xed, 0xb1, 0x21,
+ 0x2d, 0x31, 0x2f, 0x96, 0x86, 0xd0, 0xec, 0x59, 0x6e, 0xf4, 0x37, 0x81,
+ 0xbb, 0x10, 0xd9, 0xf5, 0x63, 0xd4, 0x4c, 0x68, 0x2a, 0xea, 0xf3, 0xd1,
+ 0xde, 0x2e, 0xe1, 0xd6, 0xf8, 0x06, 0xbe, 0x20, 0x5e, 0x91, 0x79, 0x99,
+ 0xcf, 0x6d, 0xbd, 0xe9, 0xe8, 0x9f, 0xe6, 0xc5, 0xa1, 0x4a, 0xdb, 0xe1,
+ 0x3c, 0xbd, 0xc3, 0xf6, 0x45, 0xb7, 0xb5, 0x4c, 0x5e, 0x7e, 0x7b, 0x3a,
+ 0x3e, 0xdf, 0xd9, 0x3f, 0x3b, 0x7d, 0x67, 0xfe, 0xa4, 0xbf, 0xef, 0xe2,
+ 0xef, 0xbb, 0x81, 0xdd, 0x08, 0xd4, 0xb3, 0x34, 0xb1, 0x35, 0x3b, 0xae,
+ 0x38, 0x4c, 0xec, 0x17, 0x6f, 0x20, 0x52, 0x97, 0x49, 0x0a, 0xea, 0x66,
+ 0x45, 0x3c, 0xd5, 0xde, 0xa7, 0x34, 0xdd, 0x6e, 0x94, 0x84, 0x99, 0x83,
+ 0x79, 0xa3, 0xca, 0x92, 0x54, 0xc2, 0x6b, 0x95, 0x7d, 0xd7, 0x26, 0xe7,
+ 0x3a, 0x66, 0xa9, 0xd2, 0x51, 0xf8, 0x5d, 0x64, 0x89, 0xb5, 0x7f, 0x35,
+ 0x99, 0x19, 0xed, 0x3d, 0xa3, 0x94, 0x92, 0x69, 0xc6, 0xf1, 0x16, 0xfa,
+ 0x49, 0xcc, 0xf4, 0x90, 0x22, 0xa0, 0x8a, 0x31, 0x95, 0x3a, 0x33, 0x03,
+ 0x57, 0x6a, 0x90, 0xc7, 0xcc, 0x27, 0x05, 0xae, 0x8d, 0x14, 0xb7, 0x04,
+ 0xb5, 0x02, 0xc8, 0x81, 0xf5, 0x7d, 0x5a, 0xc7, 0x0d, 0x17, 0xdb, 0xbf,
+ 0x3d, 0x3d, 0x4f, 0xd2, 0xcb, 0x4b, 0xae, 0xfa, 0xcc, 0x18, 0x3d, 0x8e,
+ 0x74, 0xd2, 0x2d, 0xc6, 0xbe, 0xe1, 0xa3, 0x13, 0x49, 0xe2, 0x10, 0x8d,
+ 0xe3, 0xfc, 0x64, 0xbc, 0x45, 0x1e, 0x2d, 0x4e, 0x87, 0x1b, 0xbf, 0x3d,
+ 0x1e, 0xb4, 0x7c, 0xd7, 0x7e, 0x12, 0xcc, 0x26, 0x19, 0x37, 0x82, 0xfd,
+ 0xd8, 0xa5, 0xdd, 0x62, 0x61, 0x6f, 0x44, 0x8b, 0x0b, 0x36, 0x4a, 0xd6,
+ 0xb0, 0xa1, 0x6b, 0xac, 0x45, 0xae, 0x61, 0x5f, 0xd7, 0x12, 0x17, 0x43,
+ 0xc5, 0x7c, 0x09, 0xb5, 0xed, 0x3e, 0xac, 0x17, 0x85, 0xbb, 0x82, 0x00,
+ 0x52, 0x48, 0x0b, 0x5a, 0x23, 0xc3, 0x83, 0x16, 0x86, 0x45, 0xad, 0xc9,
+ 0xc0, 0xbb, 0x3c, 0x30, 0xc6, 0x35, 0x7f, 0xa7, 0x61, 0xc1, 0xb4, 0x17,
+ 0x59, 0xcc, 0x82, 0xc0, 0x77, 0xdc, 0xd0, 0x76, 0x6c, 0x33, 0x31, 0xba,
+ 0xdd, 0xd5, 0xa1, 0x2d, 0xcc, 0x61, 0xa4, 0x0b, 0xd9, 0x72, 0xf9, 0x15,
+ 0x25, 0x0d, 0x74, 0x2b, 0xc8, 0xdc, 0x44, 0x02, 0x4f, 0x95, 0x11, 0xd6,
+ 0xe6, 0xb7, 0x6b, 0x9e, 0xb7, 0xa0, 0x09, 0x52, 0xf5, 0x91, 0x40, 0x5a,
+ 0xa9, 0xc5, 0xa2, 0x13, 0x22, 0x50, 0x8c, 0x26, 0xa2, 0xa9, 0x43, 0xf4,
+ 0xce, 0x53, 0xba, 0x75, 0x6c, 0x38, 0x48, 0x2b, 0x80, 0xf4, 0x20, 0x01,
+ 0xa4, 0x4f, 0x10, 0xb2, 0xc4, 0xac, 0x44, 0x0c, 0xa9, 0x3b, 0x1c, 0xa3,
+ 0xcb, 0xa6, 0xe4, 0xc9, 0x9a, 0x20, 0xeb, 0x7e, 0x6d, 0x67, 0xf7, 0xf9,
+ 0x68, 0xdb, 0xfc, 0x9f, 0xd9, 0x17, 0xf1, 0x44, 0x00, 0xce, 0xd2, 0x81,
+ 0x16, 0xda, 0x27, 0xb3, 0xbb, 0x2e, 0x4b, 0xf2, 0x05, 0x54, 0x56, 0x57,
+ 0x6b, 0xa3, 0x47, 0x5f, 0x2a, 0xb4, 0x91, 0xf6, 0x42, 0x49, 0xa7, 0xf2,
+ 0x13, 0x3d, 0xe3, 0xd5, 0x72, 0x16, 0x49, 0xf0, 0xf3, 0x7c, 0xca, 0xc6,
+ 0x0c, 0x2c, 0x67, 0x37, 0xac, 0x74, 0x0f, 0xbf, 0x25, 0xd9, 0xc4, 0xe5,
+ 0x7c, 0xa3, 0x56, 0x7a, 0xd4, 0x8b, 0x96, 0x8f, 0xf0, 0x50, 0xec, 0x32,
+ 0x08, 0xe6, 0xa1, 0x39, 0x0d, 0x2f, 0xcb, 0xcb, 0x4b, 0xa3, 0xad, 0x75,
+ 0x2f, 0xa0, 0x43, 0x79, 0x64, 0xeb, 0x1d, 0x20, 0x9a, 0xbd, 0xca, 0x9b,
+ 0x36, 0x62, 0x60, 0x92, 0x36, 0x6d, 0xa9, 0xc5, 0xc3, 0x8d, 0x62, 0xe5,
+ 0x06, 0xad, 0x27, 0x38, 0x34, 0xc1, 0xcc, 0x88, 0xda, 0xf8, 0x00, 0xef,
+ 0xc5, 0x2f, 0xc2, 0xed, 0x1e, 0x89, 0x8f, 0xf9, 0x62, 0x41, 0x26, 0x0c,
+ 0x40, 0x58, 0x2d, 0xc4, 0x14, 0x8d, 0x86, 0x90, 0x2e, 0x43, 0xcd, 0x49,
+ 0xd2, 0x60, 0xb9, 0xac, 0x26, 0x99, 0x56, 0x78, 0x5d, 0x64, 0x97, 0x61,
+ 0x44, 0x88, 0xa3, 0xf5, 0x3e, 0xb2, 0x8d, 0xa0, 0x71, 0x4c, 0x09, 0xc3,
+ 0xa6, 0x48, 0x59, 0xc6, 0xd0, 0xc5, 0xe2, 0x00, 0x1f, 0xa4, 0x06, 0x70,
+ 0x10, 0x39, 0xff, 0xae, 0x4c, 0xcb, 0x7a, 0xda, 0xc6, 0xc7, 0xff, 0xf3,
+ 0xc8, 0x41, 0x24, 0x5a, 0x0c, 0x42, 0xae, 0x7b, 0x89, 0x95, 0x11, 0x25,
+ 0x6b, 0xc3, 0xc3, 0x64, 0x88, 0x38, 0x94, 0x97, 0x74, 0x52, 0x76, 0xfc,
+ 0xac, 0x50, 0xf5, 0x49, 0x8f, 0x60, 0x84, 0xa2, 0x2d, 0x2a, 0xfb, 0x0f,
+ 0xaf, 0x06, 0x46, 0xd9, 0x16, 0x62, 0xeb, 0x2a, 0x71, 0x44, 0x1a, 0xa9,
+ 0xa0, 0xf3, 0x6b, 0x50, 0x58, 0x5b, 0xdc, 0xca, 0x0b, 0xd2, 0x19, 0xa1,
+ 0xc0, 0x04, 0xc5, 0x19, 0x5a, 0x0e, 0xcb, 0x70, 0x27, 0xcb, 0xe6, 0x9f,
+ 0x18, 0x48, 0x21, 0x30, 0x93, 0x21, 0xa0, 0x76, 0x3d, 0xa6, 0x9e, 0x30,
+ 0x53, 0x13, 0xda, 0xf8, 0xf0, 0x2f, 0xc6, 0x8c, 0x7e, 0xa9, 0xae, 0x88,
+ 0x1e, 0x60, 0x00, 0xeb, 0xb5, 0x28, 0x25, 0x68, 0x02, 0xde, 0xb0, 0x61,
+ 0x5b, 0xa5, 0x35, 0xc3, 0xea, 0x00, 0x0c, 0x5c, 0xa0, 0xcc, 0xbb, 0x67,
+ 0xfe, 0xb2, 0x11, 0x40, 0x16, 0x57, 0x05, 0xee, 0xaa, 0x28, 0x47, 0x14,
+ 0xb5, 0x9a, 0xf1, 0x28, 0x35, 0x86, 0x91, 0x51, 0x04, 0xec, 0x36, 0xb8,
+ 0x73, 0xf3, 0x62, 0xc8, 0xf5, 0xd5, 0xf2, 0x20, 0x42, 0x6b, 0x04, 0x2a,
+ 0x2b, 0xdc, 0xc8, 0xfb, 0xc3, 0x76, 0x76, 0x23, 0x59, 0x16, 0x53, 0x2e,
+ 0x55, 0xa4, 0x6f, 0x46, 0xf1, 0xfb, 0x24, 0xbd, 0xc4, 0xd8, 0x57, 0xf6,
+ 0xeb, 0xf0, 0x84, 0x7d, 0x34, 0xfa, 0x73, 0x31, 0xa0, 0x9f, 0xa3, 0x2a,
+ 0x55, 0xa9, 0x4f, 0x93, 0x6d, 0x32, 0x0e, 0x12, 0x45, 0x74, 0xd9, 0xee,
+ 0x73, 0x9e, 0xab, 0xe4, 0x6d, 0xd6, 0x48, 0x16, 0x09, 0xcf, 0x9d, 0x8f,
+ 0x9b, 0xd6, 0x79, 0x99, 0x49, 0x84, 0x20, 0x7e, 0xb0, 0x9b, 0x5b, 0x05,
+ 0xfb, 0x12, 0xd0, 0x65, 0x04, 0x4f, 0x72, 0x76, 0x0e, 0xcc, 0x39, 0x58,
+ 0x53, 0xcf, 0x2b, 0x4f, 0x3f, 0x2e, 0x11, 0x74, 0x42, 0xe4, 0xc9, 0x69,
+ 0xa6, 0x31, 0x9e, 0x14, 0xbc, 0x8b, 0x00, 0x63, 0x42, 0x4a, 0x9d, 0x08,
+ 0xfe, 0x0b, 0x89, 0x5b, 0xec, 0x31, 0xc6, 0x1a, 0x6c, 0x16, 0x4b, 0xa4,
+ 0xbe, 0xd0, 0xab, 0x2f, 0xa5, 0x7c, 0x9a, 0x6a, 0x6a, 0x2b, 0xbd, 0x65,
+ 0xa2, 0x46, 0x0a, 0x8b, 0x5d, 0x74, 0x9b, 0x82, 0xd5, 0xec, 0x27, 0x62,
+ 0x79, 0x39, 0x5e, 0x26, 0xe4, 0xf0, 0xc2, 0xb1, 0xb3, 0x83, 0xcf, 0x89,
+ 0x7a, 0x64, 0xe5, 0x21, 0xe2, 0x79, 0x73, 0xb1, 0xac, 0x37, 0x5e, 0xa1,
+ 0x29, 0x10, 0x69, 0x2c, 0x51, 0x98, 0x84, 0xb7, 0xd7, 0xe5, 0x8c, 0xcd,
+ 0xe2, 0xae, 0x85, 0x68, 0x2b, 0x7f, 0x8d, 0x6a, 0x45, 0xe3, 0x50, 0x86,
+ 0x2f, 0xfc, 0xc9, 0xc4, 0x71, 0x9d, 0xe8, 0x88, 0x51, 0xf0, 0xb2, 0x94,
+ 0x6a, 0x8f, 0xb4, 0x68, 0xfa, 0x66, 0x10, 0x24, 0xb4, 0x9b, 0x73, 0x7e,
+ 0x51, 0xd6, 0xc2, 0x2f, 0x54, 0x60, 0x6b, 0x58, 0x2c, 0xad, 0x20, 0x96,
+ 0x05, 0x20, 0x4b, 0x21, 0xce, 0xad, 0x4e, 0xa6, 0xc5, 0x3e, 0x45, 0xe0,
+ 0x53, 0xbb, 0xc9, 0xa9, 0x2a, 0xdd, 0xb0, 0x89, 0x51, 0x00, 0xc8, 0x11,
+ 0x0b, 0xde, 0xc1, 0xa0, 0x0c, 0x80, 0x75, 0x9d, 0x7b, 0xa5, 0xeb, 0xe6,
+ 0x14, 0x5e, 0xd3, 0x9d, 0x9e, 0x37, 0xcb, 0xb4, 0x59, 0x99, 0xba, 0xed,
+ 0x17, 0x34, 0xad, 0x14, 0x4f, 0x4e, 0x7d, 0xe9, 0x83, 0x6d, 0xe8, 0x89,
+ 0x2a, 0xfa, 0x1b, 0xf9, 0x92, 0xce, 0xd9, 0x7f, 0x3d, 0x20, 0x98, 0xce,
+ 0x52, 0x89, 0x98, 0xf9, 0x90, 0x50, 0x28, 0xce, 0x95, 0xfb, 0x44, 0x6b,
+ 0xe0, 0x78, 0x4c, 0xbd, 0xee, 0x8f, 0x63, 0x51, 0x7f, 0x44, 0xc0, 0xcc,
+ 0x7c, 0x66, 0xf7, 0x6e, 0x44, 0xaf, 0x7a, 0x56, 0x93, 0xbd, 0x3d, 0x34,
+ 0x5f, 0xfb, 0x89, 0x6e, 0x0a, 0xd3, 0xda, 0xd8, 0xa8, 0xe0, 0xfc, 0xcd,
+ 0xfd, 0xb5, 0x44, 0xb1, 0xdd, 0xf9, 0x52, 0xc7, 0xb8, 0x5a, 0xbe, 0x05,
+ 0x6d, 0xcb, 0xcf, 0x88, 0xe0, 0xf3, 0xdf, 0x1d, 0x8e, 0x3a, 0x8b, 0xec,
+ 0x7c, 0xf1, 0xfd, 0xc1, 0xc9, 0xfb, 0xa3, 0x9d, 0x3f, 0x26, 0xf4, 0xaf,
+ 0x5d, 0xfe, 0xd7, 0xee, 0x5a, 0x74, 0xbb, 0x8c, 0x94, 0x5a, 0xff, 0x62,
+ 0x3d, 0xa9, 0xef, 0xe7, 0x17, 0xe5, 0xcc, 0x6e, 0x97, 0xd0, 0x42, 0x43,
+ 0x65, 0x03, 0xb9, 0xc6, 0xb5, 0xd6, 0x48, 0x3c, 0xe1, 0x5d, 0x91, 0x5d,
+ 0x4b, 0x02, 0x8e, 0x8a, 0x1b, 0xc4, 0xe9, 0xfc, 0xaa, 0xe2, 0x06, 0x35,
+ 0xd7, 0x2a, 0xc5, 0x10, 0xaf, 0xf3, 0x14, 0xb8, 0xa0, 0x90, 0xb4, 0x76,
+ 0x07, 0xbb, 0xf6, 0xcf, 0xa4, 0x88, 0x0e, 0xbe, 0x5f, 0x5c, 0x53, 0x0a,
+ 0x5f, 0x60, 0xe4, 0x91, 0xc8, 0xe4, 0x9c, 0x61, 0x12, 0xa5, 0x71, 0x06,
+ 0xbf, 0x4d, 0xba, 0xbc, 0x21, 0x2c, 0xe1, 0x71, 0xdc, 0x0b, 0x0a, 0xc1,
+ 0x7a, 0x95, 0x59, 0xd9, 0x8b, 0x35, 0xe3, 0xdd, 0xee, 0x70, 0x17, 0xa2,
+ 0xbb, 0x68, 0x24, 0x09, 0x7b, 0x32, 0x3c, 0x41, 0x89, 0xb3, 0x26, 0x6c,
+ 0xb8, 0x63, 0x40, 0xcd, 0x2b, 0xca, 0x56, 0xc7, 0x88, 0xae, 0x8c, 0x52,
+ 0xe4, 0xc9, 0x56, 0xd0, 0x8f, 0xdd, 0xc9, 0x21, 0xf8, 0x0a, 0xe3, 0xc0,
+ 0x18, 0xda, 0xcc, 0xee, 0x01, 0xef, 0x19, 0xa4, 0x6a, 0x15, 0x46, 0x97,
+ 0xdc, 0x30, 0xe2, 0x7d, 0xd3, 0x8f, 0xc4, 0xea, 0xee, 0x61, 0x5b, 0xbc,
+ 0xd8, 0x71, 0xbd, 0x2a, 0x24, 0x60, 0x2b, 0x96, 0x25, 0xc9, 0xba, 0xf4,
+ 0xa6, 0x62, 0x43, 0xb1, 0xfe, 0xdd, 0x2b, 0xec, 0x4a, 0xe9, 0x9c, 0xb3,
+ 0x34, 0x70, 0xd9, 0xe2, 0xc0, 0x09, 0x32, 0x46, 0xb2, 0xe1, 0x78, 0xdf,
+ 0x7c, 0xfd, 0x7e, 0x96, 0x6d, 0xaa, 0x6d, 0x60, 0xaf, 0xbc, 0xad, 0x37,
+ 0xe5, 0xdf, 0xcc, 0xdc, 0x53, 0xbd, 0x37, 0x62, 0x17, 0xa7, 0x5c, 0x84,
+ 0xd1, 0x32, 0x5c, 0xbe, 0x2a, 0x9d, 0x94, 0xe1, 0xba, 0x71, 0x5f, 0x78,
+ 0xb4, 0x0c, 0x64, 0xf4, 0xbe, 0x30, 0xca, 0x19, 0x65, 0x6f, 0x07, 0xfc,
+ 0xd3, 0xba, 0x23, 0xfd, 0x5b, 0x51, 0x09, 0x62, 0xb8, 0xb9, 0x94, 0x9c,
+ 0x1d, 0xcb, 0x66, 0xb8, 0x7a, 0x22, 0x8a, 0x6c, 0xa0, 0x58, 0xf5, 0xdc,
+ 0x46, 0x47, 0x77, 0x59, 0x35, 0x21, 0xd4, 0x09, 0x73, 0x0b, 0x2d, 0x45,
+ 0xa6, 0x2a, 0x6a, 0x1d, 0xc2, 0x6e, 0x16, 0x3d, 0xc9, 0xf3, 0xe5, 0x14,
+ 0xce, 0xab, 0xd6, 0xcb, 0x67, 0x48, 0x88, 0x98, 0x18, 0xee, 0x18, 0x59,
+ 0x00, 0x41, 0xbd, 0x25, 0xdb, 0x32, 0x44, 0x8b, 0xce, 0x10, 0x35, 0x08,
+ 0x73, 0xf8, 0x98, 0xc2, 0xba, 0x4a, 0xd2, 0x27, 0xed, 0x9e, 0x0a, 0xcb,
+ 0x30, 0x9e, 0xa9, 0xcb, 0xa9, 0x27, 0x9e, 0x65, 0x78, 0xa8, 0xfe, 0x84,
+ 0x45, 0xbb, 0x37, 0x40, 0xf3, 0x40, 0x50, 0xa4, 0xb8, 0x57, 0x50, 0xa9,
+ 0x0d, 0x5c, 0x9d, 0xac, 0x21, 0x2a, 0xec, 0x20, 0x82, 0x90, 0x61, 0x6d,
+ 0xf2, 0xac, 0xbc, 0x45, 0xac, 0xa5, 0x8d, 0x52, 0xae, 0xd9, 0x10, 0x9c,
+ 0x65, 0xc7, 0xc2, 0x79, 0x48, 0x1a, 0x13, 0x7f, 0x57, 0x0f, 0x5c, 0x94,
+ 0x03, 0x54, 0xfa, 0x74, 0xca, 0x92, 0x52, 0x97, 0x28, 0xd1, 0xb0, 0x43,
+ 0x99, 0x75, 0x0c, 0xa9, 0x3b, 0xa8, 0x43, 0xc8, 0x24, 0x96, 0x92, 0xb4,
+ 0xe2, 0x8b, 0xb2, 0xb9, 0xf6, 0x32, 0x53, 0x09, 0xd9, 0x8f, 0x9c, 0x3d,
+ 0x97, 0xcb, 0x06, 0x96, 0x80, 0x9a, 0x83, 0x8d, 0xe4, 0x1e, 0x8b, 0xc7,
+ 0x28, 0x48, 0x6e, 0xf8, 0x08, 0x04, 0xb8, 0xb2, 0x71, 0x18, 0xfb, 0x94,
+ 0x50, 0x5b, 0x70, 0xf6, 0xf8, 0x39, 0xac, 0x60, 0x4d, 0x1b, 0xa1, 0xec,
+ 0xa5, 0xba, 0x26, 0x40, 0x39, 0x24, 0xa9, 0x1a, 0xc2, 0x06, 0x08, 0x14,
+ 0x40, 0x26, 0xa0, 0x24, 0x1c, 0xb7, 0x9f, 0x1b, 0x8c, 0x85, 0xe3, 0x8c,
+ 0x47, 0xc6, 0xc9, 0x20, 0xdb, 0xfd, 0x42, 0xf6, 0xa6, 0xde, 0x94, 0x3c,
+ 0xd0, 0x88, 0x67, 0xc4, 0xaa, 0xb1, 0x3d, 0x07, 0xf6, 0x1f, 0xb6, 0x6c,
+ 0x02, 0x4b, 0xcf, 0xb0, 0x39, 0x30, 0xfe, 0xd1, 0x25, 0xc1, 0xa6, 0xca,
+ 0x83, 0xdc, 0xa1, 0xe0, 0x4a, 0x5d, 0x98, 0x2d, 0x16, 0xce, 0x5d, 0x2e,
+ 0xa6, 0x0c, 0xb8, 0x6a, 0x75, 0x7d, 0xe8, 0x4b, 0x1e, 0x1a, 0x66, 0x5d,
+ 0xca, 0x61, 0xc4, 0x07, 0x5a, 0x42, 0x26, 0x02, 0x98, 0xd3, 0x3d, 0xff,
+ 0x7e, 0x94, 0xa5, 0xa5, 0x4a, 0x8b, 0x6a, 0xed, 0xcb, 0x06, 0xf3, 0x22,
+ 0x6e, 0xe0, 0xa1, 0xe1, 0xfd, 0x3a, 0x16, 0x8f, 0xd4, 0x4b, 0xdc, 0x48,
+ 0xf8, 0xbf, 0x2c, 0x8b, 0x49, 0x1b, 0x6e, 0x64, 0x58, 0x0e, 0x3c, 0x50,
+ 0x4e, 0x09, 0xc0, 0xda, 0x6b, 0xa2, 0xcb, 0xf4, 0xf8, 0x90, 0x45, 0x67,
+ 0xa3, 0x12, 0xd1, 0x14, 0x98, 0xde, 0xe4, 0xdd, 0x71, 0x25, 0xb5, 0xd7,
+ 0xb9, 0xd9, 0xa3, 0x6a, 0x72, 0x0d, 0x68, 0x01, 0xf2, 0x26, 0x65, 0x53,
+ 0xbe, 0xdb, 0x03, 0x6d, 0x98, 0x5d, 0x35, 0x18, 0x55, 0xf4, 0xb1, 0x9c,
+ 0xa4, 0x11, 0xc1, 0x87, 0x94, 0x85, 0x4a, 0xe8, 0x60, 0x9a, 0x3a, 0xcf,
+ 0x30, 0xdd, 0xeb, 0x1a, 0xe2, 0x2f, 0x9b, 0xd5, 0x99, 0x97, 0xee, 0x6f,
+ 0xdf, 0x73, 0x57, 0x26, 0x4c, 0xf1, 0x02, 0xbe, 0x59, 0x88, 0xb2, 0xd8,
+ 0x09, 0xc7, 0x54, 0x08, 0x59, 0x88, 0x67, 0x43, 0x96, 0x25, 0xf1, 0xc9,
+ 0xbd, 0x62, 0xce, 0xc8, 0xeb, 0x5d, 0xdc, 0x99, 0x2e, 0x23, 0x1f, 0x8a,
+ 0x99, 0x80, 0xe1, 0x48, 0x48, 0xcf, 0xcd, 0x7d, 0xc7, 0x0b, 0x9b, 0x93,
+ 0x2b, 0x77, 0xfb, 0xf9, 0xd3, 0x6d, 0x3a, 0xe2, 0x04, 0xb6, 0xc7, 0x17,
+ 0x1f, 0xcf, 0x53, 0xa2, 0x63, 0x81, 0x83, 0xa7, 0xd4, 0x5d, 0x10, 0x70,
+ 0x1c, 0x25, 0x7b, 0xae, 0x2d, 0x66, 0x98, 0xed, 0xc8, 0x37, 0x42, 0xb5,
+ 0xd9, 0xe8, 0xc7, 0x46, 0x01, 0x35, 0x43, 0x86, 0xcb, 0x26, 0x48, 0xf9,
+ 0xf5, 0x58, 0xa7, 0xcd, 0x51, 0xb3, 0x4b, 0x46, 0x00, 0x02, 0x76, 0xf4,
+ 0x26, 0xfc, 0x54, 0x37, 0x54, 0x25, 0x94, 0x9c, 0xbc, 0x66, 0x0f, 0xfa,
+ 0xe1, 0x3b, 0xfa, 0x1b, 0xc9, 0x05, 0xf6, 0xd0, 0x8c, 0x70, 0xc8, 0xa8,
+ 0xdf, 0x19, 0x24, 0xf4, 0x9b, 0xef, 0xbb, 0x45, 0x9e, 0x1b, 0xa7, 0xe3,
+ 0xad, 0xbd, 0x17, 0xdb, 0x9b, 0x91, 0xa4, 0x68, 0x82, 0xa7, 0x4e, 0x3d,
+ 0x57, 0xda, 0xb6, 0x1f, 0xc8, 0xe5, 0xd9, 0x10, 0x49, 0x56, 0xc0, 0xb3,
+ 0x68, 0x47, 0x19, 0x39, 0xb7, 0x4c, 0x03, 0xaf, 0x1c, 0x4c, 0x12, 0xb3,
+ 0xfd, 0x52, 0xd5, 0x77, 0xd9, 0x8d, 0xe1, 0xdb, 0x28, 0xfa, 0xc3, 0x49,
+ 0x8e, 0xf2, 0xa5, 0x94, 0x61, 0xa5, 0xf4, 0xa2, 0xa2, 0x6a, 0xf0, 0x76,
+ 0xca, 0x31, 0x1e, 0x49, 0x01, 0xc3, 0x08, 0x16, 0x08, 0x23, 0x38, 0xb5,
+ 0x99, 0x54, 0x85, 0xe4, 0x3f, 0xe4, 0x02, 0x7c, 0x72, 0x07, 0x8e, 0xe7,
+ 0x90, 0xdc, 0x79, 0x31, 0x7a, 0xde, 0xda, 0xd3, 0x65, 0x45, 0xcd, 0x3f,
+ 0x5e, 0xda, 0x6c, 0x43, 0xa4, 0x8e, 0x3e, 0x06, 0xed, 0x46, 0x1d, 0xbe,
+ 0x2e, 0x16, 0xc1, 0x43, 0x11, 0x1b, 0xe0, 0xae, 0x17, 0x78, 0x6b, 0x4a,
+ 0x52, 0x0d, 0xca, 0x1e, 0x38, 0x3d, 0xdd, 0x85, 0x1a, 0x10, 0x79, 0x4f,
+ 0x27, 0xa4, 0x98, 0xe3, 0xfe, 0x28, 0xd1, 0x5d, 0xed, 0xf3, 0x27, 0xbb,
+ 0xbb, 0x83, 0xe4, 0xe9, 0x68, 0x87, 0x70, 0xf4, 0x55, 0x33, 0x4e, 0x67,
+ 0x01, 0x3a, 0x90, 0xe4, 0x49, 0xaa, 0x7b, 0xb7, 0xaf, 0x06, 0x5f, 0xca,
+ 0xee, 0xb5, 0xb8, 0x84, 0x8c, 0xa9, 0x58, 0x39, 0xf0, 0xda, 0x8f, 0xbb,
+ 0x4f, 0x9f, 0xee, 0xbc, 0xd8, 0x3f, 0x1b, 0x3e, 0xdd, 0xdd, 0xa1, 0x0a,
+ 0x7c, 0x01, 0xca, 0xb6, 0x29, 0x53, 0xad, 0xa2, 0xac, 0x7c, 0xca, 0xb0,
+ 0x46, 0xb3, 0x99, 0x56, 0x3b, 0x74, 0x87, 0x33, 0xe6, 0x7d, 0x51, 0xd7,
+ 0xc6, 0x28, 0xfe, 0xc0, 0xa5, 0x78, 0x5b, 0xf5, 0x07, 0xbe, 0x9f, 0xd7,
+ 0xa4, 0x68, 0x3e, 0x8f, 0x38, 0x9a, 0xed, 0xce, 0x20, 0xca, 0x48, 0xea,
+ 0x82, 0x16, 0xfb, 0x68, 0xe3, 0x3c, 0xdd, 0x87, 0x78, 0x15, 0x7c, 0x34,
+ 0x97, 0x4d, 0x0d, 0x02, 0x16, 0xd5, 0x1b, 0x47, 0x87, 0x9b, 0xbc, 0x69,
+ 0xba, 0x97, 0xae, 0x08, 0x8e, 0x67, 0x3a, 0xe0, 0x52, 0x86, 0xb0, 0x66,
+ 0xde, 0x68, 0x0d, 0xa8, 0x28, 0x49, 0x51, 0x3b, 0xa1, 0xcb, 0x62, 0xed,
+ 0x46, 0x01, 0x9a, 0xda, 0xad, 0x29, 0x7a, 0x39, 0xdb, 0x21, 0x88, 0x78,
+ 0x75, 0x74, 0xb2, 0x76, 0x4e, 0x63, 0x96, 0x9a, 0x16, 0xfa, 0x68, 0x19,
+ 0x7a, 0x4e, 0x40, 0xda, 0x4e, 0x1d, 0xfd, 0xaa, 0x03, 0xf0, 0xbc, 0x03,
+ 0xb7, 0x49, 0x16, 0xf4, 0x30, 0xad, 0x27, 0x79, 0xce, 0x4e, 0x82, 0x1e,
+ 0xdf, 0x80, 0xa6, 0x15, 0x03, 0x9b, 0x11, 0x08, 0xcd, 0x79, 0xca, 0xf9,
+ 0x0f, 0x0e, 0xfd, 0x37, 0x18, 0x96, 0x2c, 0x40, 0x23, 0x64, 0x57, 0x8d,
+ 0x2b, 0xa0, 0x7d, 0xd4, 0x59, 0xa2, 0x66, 0x6b, 0xde, 0x5a, 0x6d, 0x75,
+ 0xd7, 0x28, 0x31, 0x77, 0x0b, 0x83, 0x01, 0x46, 0x40, 0x3c, 0xa5, 0x2d,
+ 0x0c, 0x14, 0xbb, 0xba, 0x24, 0x41, 0x11, 0xa3, 0x3d, 0xdc, 0x7e, 0x40,
+ 0x7c, 0xb6, 0x4e, 0x09, 0x7b, 0x99, 0x4a, 0x1a, 0xdd, 0x57, 0x03, 0xad,
+ 0x7c, 0x6f, 0xda, 0x8e, 0x85, 0x34, 0x62, 0x58, 0x71, 0x47, 0xad, 0x04,
+ 0x99, 0x27, 0xd2, 0xd0, 0xa1, 0xe4, 0xee, 0x7a, 0x80, 0xe3, 0xb7, 0x99,
+ 0x55, 0xd2, 0x59, 0x8e, 0x60, 0x81, 0x2d, 0xb5, 0x22, 0xd8, 0x6d, 0x03,
+ 0xb3, 0x3e, 0x00, 0xe2, 0x42, 0x84, 0x16, 0xd9, 0x2d, 0x69, 0x37, 0xb5,
+ 0x68, 0xe6, 0x55, 0x95, 0x93, 0x37, 0xd6, 0xcc, 0xcc, 0xe8, 0xbc, 0x85,
+ 0x38, 0x52, 0xc9, 0x77, 0x00, 0xbe, 0x9b, 0x46, 0xa0, 0x13, 0x26, 0xb8,
+ 0x9d, 0x6a, 0x5b, 0x17, 0x51, 0x00, 0xd6, 0x95, 0xb0, 0x1b, 0x03, 0xda,
+ 0xa0, 0x29, 0x18, 0x26, 0xa7, 0x48, 0xce, 0x4d, 0x3b, 0x6b, 0x8a, 0xac,
+ 0x60, 0x2e, 0xe8, 0x62, 0xf0, 0xc0, 0xb2, 0xe5, 0xb4, 0xa9, 0xfb, 0x63,
+ 0x90, 0x5b, 0x77, 0xc3, 0xdb, 0xdb, 0xdb, 0x21, 0xdd, 0x38, 0x94, 0xce,
+ 0x26, 0x75, 0x4c, 0x9d, 0x4a, 0x25, 0xe7, 0xca, 0xe1, 0x9c, 0xba, 0xc0,
+ 0x24, 0x73, 0x69, 0x85, 0xd5, 0x45, 0xde, 0xa0, 0x68, 0x56, 0x98, 0x0b,
+ 0xaf, 0xc9, 0xa9, 0x95, 0xe9, 0xc0, 0x62, 0x50, 0xef, 0x6e, 0xe4, 0xfa,
+ 0x71, 0x6b, 0x21, 0x74, 0xb7, 0x49, 0x93, 0x11, 0x3c, 0x04, 0x35, 0xd8,
+ 0xd8, 0x4f, 0x86, 0xdf, 0x26, 0x6b, 0x87, 0xb2, 0xda, 0x73, 0xf3, 0xc4,
+ 0x7e, 0x7b, 0x2d, 0xfc, 0x70, 0xb4, 0x39, 0xc7, 0xda, 0xe3, 0x5c, 0x7d,
+ 0xbd, 0x37, 0x19, 0x1a, 0x2b, 0xba, 0x64, 0xb3, 0x26, 0xe2, 0x01, 0xa7,
+ 0xe4, 0x4d, 0x76, 0x17, 0x33, 0xa4, 0x20, 0x96, 0x9e, 0xd6, 0xd2, 0xa0,
+ 0xf3, 0x82, 0x4f, 0xf8, 0x8a, 0xe3, 0x58, 0xa5, 0xb7, 0x0f, 0x9f, 0x71,
+ 0xef, 0x24, 0x0a, 0xf7, 0xce, 0xe0, 0x3f, 0xf6, 0x40, 0xbe, 0xe1, 0x38,
+ 0xd5, 0xdc, 0xe5, 0x58, 0x83, 0x09, 0x6e, 0x7e, 0xe7, 0x8a, 0x15, 0xd9,
+ 0xd5, 0x23, 0x86, 0xde, 0x57, 0x2b, 0x2a, 0x3d, 0x5d, 0xa4, 0xc5, 0xad,
+ 0xa2, 0x15, 0x4e, 0x8c, 0x09, 0x2f, 0xcb, 0x55, 0x8f, 0x10, 0x34, 0x6e,
+ 0x75, 0x03, 0x2f, 0xed, 0x91, 0x37, 0x00, 0xde, 0x72, 0x6f, 0x99, 0x02,
+ 0x29, 0x1d, 0xbb, 0x49, 0x18, 0x53, 0x9b, 0x8e, 0xaa, 0xe2, 0xff, 0x89,
+ 0x1f, 0x38, 0xab, 0x88, 0xd1, 0x51, 0x6a, 0xc2, 0x25, 0x7b, 0x31, 0x50,
+ 0xd8, 0x73, 0xe8, 0x45, 0x87, 0xdf, 0x1c, 0xa3, 0x64, 0xc2, 0x08, 0xd2,
+ 0x42, 0x30, 0x52, 0x78, 0xfe, 0xdc, 0x09, 0xd5, 0x3a, 0x89, 0xae, 0x72,
+ 0xeb, 0x41, 0x4b, 0x93, 0x18, 0xb0, 0xb0, 0xda, 0xf0, 0x89, 0xda, 0xea,
+ 0x92, 0xeb, 0x2d, 0x46, 0xb7, 0x1c, 0x5e, 0xab, 0xa7, 0xa4, 0xae, 0x0e,
+ 0x27, 0x4a, 0x2f, 0x7c, 0x5d, 0x35, 0x89, 0xb4, 0x96, 0xa4, 0x08, 0xdc,
+ 0xb6, 0x41, 0x8d, 0x86, 0xe3, 0x57, 0xee, 0x2c, 0x9b, 0x85, 0xe9, 0xa2,
+ 0xf2, 0xf9, 0x78, 0x17, 0x68, 0xec, 0x49, 0xc7, 0x3d, 0x69, 0x49, 0x97,
+ 0xf9, 0x1e, 0x38, 0x2e, 0x75, 0x24, 0x07, 0x75, 0x2c, 0x1c, 0x62, 0xf3,
+ 0x89, 0x8d, 0x30, 0xfe, 0x77, 0xcd, 0xe7, 0x36, 0x22, 0x13, 0x9a, 0xb7,
+ 0x16, 0x24, 0xfb, 0xa3, 0x29, 0x52, 0xa6, 0xa4, 0x92, 0xc7, 0x87, 0x23,
+ 0x7f, 0xca, 0x17, 0x64, 0x2f, 0x7c, 0x25, 0xce, 0x5f, 0xaa, 0x36, 0xf1,
+ 0x23, 0xc3, 0x52, 0xb7, 0xcf, 0x0a, 0x08, 0x3b, 0x31, 0x40, 0x86, 0xf8,
+ 0x70, 0x9c, 0x38, 0xe0, 0x51, 0x8f, 0x39, 0x8e, 0x9a, 0x39, 0xd4, 0xdc,
+ 0x5d, 0xf8, 0x5f, 0xba, 0xc4, 0xfb, 0xe2, 0x61, 0xea, 0xfd, 0x52, 0xf2,
+ 0xad, 0xa6, 0x1e, 0x77, 0x44, 0xd1, 0x1c, 0xf3, 0x2f, 0x3c, 0xa7, 0x37,
+ 0x12, 0xa8, 0xd8, 0x99, 0x61, 0x9d, 0xdf, 0x6d, 0x29, 0xe3, 0x39, 0x6d,
+ 0xbe, 0xf8, 0xad, 0x76, 0x1d, 0xcc, 0x88, 0x94, 0x15, 0x9a, 0x7c, 0x7c,
+ 0x38, 0x0e, 0xe1, 0x60, 0xef, 0x7d, 0x40, 0x09, 0x31, 0x6a, 0x31, 0x82,
+ 0x80, 0x82, 0x4f, 0x1a, 0x66, 0xe6, 0x0b, 0xf8, 0x97, 0x87, 0xf1, 0xe1,
+ 0xb4, 0xd2, 0x56, 0x0c, 0xdb, 0x60, 0x7d, 0x5f, 0xe9, 0xc5, 0xff, 0xf8,
+ 0xc5, 0x21, 0x5b, 0xcf, 0xb5, 0x15, 0xf7, 0x13, 0x16, 0xd8, 0x37, 0xb8,
+ 0x11, 0x3a, 0xe3, 0xf5, 0xf8, 0x08, 0xca, 0x2a, 0xf7, 0x8e, 0x55, 0x95,
+ 0x60, 0x73, 0xd0, 0x26, 0x18, 0x21, 0x49, 0xe2, 0x32, 0xd0, 0x5d, 0xce,
+ 0x7b, 0xf7, 0x58, 0xf7, 0x8e, 0x7a, 0x9d, 0x44, 0xf7, 0xee, 0xff, 0xa6,
+ 0xf5, 0x81, 0x9f, 0x1d, 0x1b, 0x50, 0xd8, 0xae, 0x16, 0x54, 0x69, 0x2a,
+ 0x55, 0x49, 0x50, 0xe4, 0x43, 0x57, 0x7c, 0xcf, 0xec, 0x80, 0xef, 0x41,
+ 0x4a, 0x11, 0x25, 0x31, 0xcc, 0x04, 0x8b, 0x97, 0x4b, 0x7f, 0xbe, 0x70,
+ 0xca, 0xcc, 0x90, 0x16, 0x39, 0xb4, 0x65, 0x66, 0xc4, 0x84, 0x2b, 0x38,
+ 0xd5, 0x72, 0x66, 0x9c, 0x29, 0x03, 0xf6, 0xeb, 0xbf, 0x1a, 0x15, 0xbe,
+ 0x58, 0xee, 0xf6, 0xd6, 0x4d, 0xb9, 0xf3, 0x79, 0xeb, 0xa6, 0x74, 0xef,
+ 0xf4, 0xdf, 0x91, 0xe8, 0xbe, 0xb6, 0x69, 0x3e, 0x44, 0x79, 0x9e, 0x6d,
+ 0x50, 0x1c, 0xbc, 0xc9, 0x70, 0x06, 0xd4, 0x22, 0x27, 0xc8, 0x1a, 0x8c,
+ 0x85, 0x30, 0x34, 0x6b, 0xcf, 0xf7, 0xda, 0x21, 0x16, 0x0d, 0xf7, 0x40,
+ 0x72, 0x51, 0x19, 0xb3, 0x0e, 0xea, 0xa8, 0xba, 0x68, 0x52, 0x2e, 0x8e,
+ 0xbf, 0x0e, 0x40, 0x07, 0x0c, 0x79, 0x67, 0x16, 0x66, 0xf9, 0xdb, 0xf3,
+ 0x37, 0x27, 0xdc, 0x30, 0x85, 0x8b, 0xdf, 0xa9, 0x8c, 0x50, 0xa6, 0xbb,
+ 0xbc, 0x98, 0xe7, 0x0d, 0x69, 0x27, 0x0d, 0x8b, 0x32, 0x95, 0x8e, 0x41,
+ 0x91, 0x3e, 0xe2, 0xe4, 0x62, 0x3e, 0x2e, 0x62, 0x41, 0x4f, 0x51, 0x24,
+ 0x3d, 0x98, 0x37, 0x4f, 0x03, 0xfe, 0xe5, 0xba, 0x6e, 0x72, 0xc8, 0x69,
+ 0x66, 0xd0, 0xa3, 0x5e, 0xd3, 0x56, 0xd0, 0x23, 0x11, 0x9b, 0xd7, 0xaa,
+ 0x69, 0x68, 0x3a, 0x0c, 0xc0, 0x76, 0x4b, 0x3b, 0xd2, 0xba, 0x6c, 0x4b,
+ 0x1f, 0x80, 0xd2, 0xa5, 0x6d, 0x4d, 0x2b, 0x28, 0x5c, 0xb7, 0x9a, 0x97,
+ 0x2d, 0xd6, 0x69, 0x29, 0x5f, 0xa4, 0x87, 0x90, 0x3e, 0x24, 0xc1, 0xd9,
+ 0x65, 0x45, 0xce, 0x71, 0xd6, 0xaa, 0x63, 0xa5, 0x2a, 0xa2, 0x90, 0x68,
+ 0x88, 0xcc, 0xe6, 0x0b, 0xb4, 0x4c, 0x3d, 0xed, 0x42, 0x42, 0x63, 0x7b,
+ 0x27, 0x38, 0xc2, 0x23, 0x0c, 0x00, 0x87, 0x22, 0x24, 0xec, 0xa6, 0xe1,
+ 0x33, 0x33, 0x3a, 0x3a, 0x00, 0xa7, 0x08, 0x35, 0x05, 0xea, 0x5d, 0x54,
+ 0xc1, 0x76, 0xed, 0x79, 0x6a, 0xd7, 0x94, 0x45, 0x1d, 0x46, 0x00, 0xc1,
+ 0x03, 0xf0, 0x1d, 0xba, 0xb2, 0x94, 0x6d, 0xff, 0x71, 0xe8, 0xcf, 0x17,
+ 0x7f, 0xf2, 0xc0, 0x0b, 0x59, 0xe7, 0xe4, 0xcf, 0xf5, 0xfb, 0xbc, 0x6a,
+ 0x37, 0x71, 0xca, 0x5a, 0xac, 0xae, 0xb8, 0xad, 0x02, 0x23, 0x2e, 0x47,
+ 0x5d, 0x0e, 0x69, 0xdb, 0x01, 0xf3, 0x3f, 0x86, 0x7c, 0xa3, 0x22, 0x39,
+ 0x76, 0xc9, 0xc1, 0x2f, 0xfc, 0x62, 0x7d, 0x38, 0x65, 0xb1, 0x32, 0x4d,
+ 0x0b, 0x43, 0x09, 0x73, 0x62, 0xc3, 0xa4, 0xb3, 0xd9, 0xec, 0x8b, 0x59,
+ 0xb9, 0xac, 0xef, 0xd7, 0x13, 0x69, 0x90, 0x25, 0x3d, 0x65, 0x80, 0x04,
+ 0xc1, 0xa6, 0x27, 0x55, 0x26, 0x2c, 0x8b, 0x8f, 0x7a, 0x29, 0x52, 0x79,
+ 0x4f, 0xcd, 0x81, 0x8f, 0xce, 0x70, 0xeb, 0xde, 0xc7, 0xfe, 0x87, 0x3f,
+ 0x76, 0x94, 0xca, 0x88, 0xa5, 0x49, 0xab, 0xa4, 0x47, 0x59, 0xce, 0x2e,
+ 0xc4, 0x19, 0x33, 0x9b, 0x93, 0x56, 0xf8, 0xdb, 0x0e, 0x48, 0x97, 0x07,
+ 0xa3, 0x5c, 0x2b, 0xda, 0xbd, 0x4b, 0x88, 0x82, 0xa4, 0xe9, 0xa9, 0xd9,
+ 0x12, 0xd3, 0x11, 0x77, 0x8f, 0xc4, 0x68, 0x93, 0xe4, 0x4c, 0x7a, 0x55,
+ 0xba, 0x6b, 0x29, 0x6d, 0x21, 0x04, 0x5f, 0x96, 0xe5, 0x45, 0x5a, 0xad,
+ 0x07, 0xa9, 0xbd, 0x34, 0x6d, 0xb4, 0x23, 0x30, 0x73, 0x9f, 0xb2, 0x67,
+ 0x91, 0x42, 0x15, 0x4e, 0x80, 0x7e, 0xc5, 0x6f, 0x8e, 0x38, 0x8c, 0xe0,
+ 0x9b, 0xcc, 0xb1, 0xbc, 0x9a, 0xd9, 0xd4, 0x4d, 0x3d, 0x69, 0xcd, 0x03,
+ 0xe5, 0x1e, 0xb4, 0x4d, 0x03, 0x67, 0xdc, 0xab, 0x6d, 0x4f, 0x9c, 0x68,
+ 0xee, 0xc2, 0x61, 0xa4, 0x3a, 0xd7, 0x85, 0x57, 0x29, 0x5b, 0x95, 0xf2,
+ 0x10, 0x91, 0x03, 0xa7, 0xf6, 0x34, 0x47, 0x11, 0xad, 0x55, 0xed, 0x9d,
+ 0xf7, 0x30, 0x33, 0x2f, 0x26, 0x44, 0x9c, 0xd0, 0xf0, 0x8e, 0x20, 0x24,
+ 0x92, 0x64, 0x75, 0xc7, 0x4c, 0x36, 0x69, 0x90, 0xde, 0x12, 0x05, 0x83,
+ 0x88, 0x7d, 0xd6, 0xbd, 0xaf, 0xfa, 0xa3, 0x1f, 0x0e, 0x48, 0xda, 0xc9,
+ 0x4b, 0x7e, 0xfd, 0x18, 0x03, 0x5f, 0x83, 0x9c, 0x50, 0x0c, 0x87, 0xe7,
+ 0xf8, 0x09, 0xfb, 0xdb, 0x87, 0x11, 0x6e, 0x6b, 0x19, 0x8c, 0xd9, 0x2c,
+ 0xbb, 0xe2, 0xf5, 0xbd, 0x3c, 0x39, 0xfa, 0xfe, 0xe8, 0x24, 0xb8, 0x09,
+ 0xbf, 0x19, 0x8f, 0xb7, 0x3e, 0x66, 0xd5, 0x45, 0x56, 0x95, 0x84, 0x1c,
+ 0x3e, 0xa6, 0x5c, 0x51, 0x3c, 0x69, 0x93, 0x21, 0xbd, 0x0b, 0xe2, 0xd6,
+ 0xa1, 0x2d, 0xa5, 0x6c, 0x84, 0x85, 0x89, 0x55, 0xf2, 0x49, 0x69, 0x8a,
+ 0x80, 0xca, 0x3b, 0xc9, 0xb9, 0xc5, 0x75, 0x37, 0xa9, 0x32, 0x78, 0x50,
+ 0xd3, 0x08, 0xa6, 0x21, 0xe0, 0x70, 0xa8, 0x99, 0x29, 0xed, 0x29, 0x97,
+ 0x5b, 0x20, 0xc6, 0x6b, 0x17, 0x11, 0xbc, 0xb1, 0x00, 0xe4, 0x44, 0xf2,
+ 0x4a, 0xbe, 0x89, 0xba, 0x6c, 0xa2, 0x12, 0x63, 0x21, 0xb2, 0xd9, 0x71,
+ 0xfa, 0xdd, 0xf0, 0x60, 0x3c, 0x7c, 0x75, 0x74, 0x72, 0xf4, 0xcd, 0xc1,
+ 0xf9, 0x91, 0xd7, 0x01, 0x80, 0xca, 0xa6, 0xa2, 0x7a, 0x8b, 0xad, 0x65,
+ 0xfe, 0x4e, 0x08, 0xc3, 0x99, 0xf4, 0xd4, 0x3f, 0x22, 0x69, 0x72, 0xe9,
+ 0x5e, 0x64, 0xd1, 0x89, 0x53, 0xb2, 0x74, 0x1a, 0xe4, 0xd2, 0xc6, 0x87,
+ 0x33, 0x67, 0x61, 0x36, 0x97, 0xa9, 0x06, 0x2b, 0x48, 0x67, 0xb7, 0xd4,
+ 0xbf, 0xf0, 0x7d, 0x41, 0xf5, 0x26, 0xb9, 0x2d, 0xac, 0xe6, 0xd5, 0xfb,
+ 0x4e, 0x1e, 0x47, 0xd9, 0xd6, 0x06, 0xa3, 0x97, 0x43, 0xdc, 0x05, 0xa0,
+ 0xe8, 0x09, 0x50, 0x4f, 0x5e, 0xe1, 0xc1, 0x0e, 0x2e, 0xbf, 0xeb, 0x25,
+ 0x00, 0x34, 0x56, 0xf9, 0x5d, 0x04, 0xe5, 0x07, 0xb7, 0x2a, 0xf7, 0xd4,
+ 0x56, 0x59, 0x4b, 0x59, 0x3c, 0xdc, 0x5d, 0xf4, 0x3a, 0x73, 0x48, 0x5b,
+ 0x38, 0xf1, 0x17, 0x19, 0x4c, 0x64, 0x84, 0xad, 0xc3, 0xe6, 0xae, 0xc8,
+ 0x8d, 0xcb, 0xb9, 0x91, 0x24, 0x92, 0xdb, 0x50, 0x66, 0x3f, 0x92, 0x0a,
+ 0x3d, 0xce, 0xaf, 0x31, 0x3c, 0x63, 0xd3, 0x69, 0xac, 0xdc, 0x95, 0x26,
+ 0x9b, 0x5d, 0x2d, 0xc2, 0x42, 0xfe, 0xdb, 0xfe, 0x04, 0x25, 0xbc, 0x61,
+ 0xf8, 0x11, 0xf7, 0xf9, 0x11, 0x35, 0x9a, 0x66, 0xf8, 0x4b, 0xdc, 0x56,
+ 0x5d, 0xbf, 0x15, 0xb8, 0xca, 0x15, 0x16, 0xa3, 0x12, 0x2e, 0x56, 0xdd,
+ 0xb0, 0xc2, 0xcf, 0x63, 0x27, 0x3b, 0xb0, 0x7d, 0x08, 0xa6, 0xb2, 0x33,
+ 0x10, 0x16, 0xd2, 0xb2, 0x43, 0x8b, 0x49, 0xe2, 0x79, 0x50, 0x9e, 0xb4,
+ 0x68, 0x35, 0xf6, 0xa0, 0x8e, 0x0a, 0xfa, 0xd7, 0xb0, 0xf7, 0x8a, 0xad,
+ 0x38, 0x1d, 0x66, 0x8b, 0x00, 0xdd, 0x7e, 0xe3, 0xb5, 0xb6, 0xe1, 0x71,
+ 0xad, 0x30, 0xbd, 0x7e, 0x84, 0x5e, 0xf7, 0xb0, 0xa3, 0xb3, 0x77, 0xe7,
+ 0xf8, 0xc8, 0x09, 0xfd, 0x45, 0xe2, 0xd2, 0x75, 0x0c, 0x2f, 0x52, 0xfa,
+ 0xe4, 0x70, 0xab, 0x57, 0x0a, 0x23, 0xba, 0x66, 0xba, 0x92, 0xac, 0xcb,
+ 0x29, 0xda, 0xd2, 0x94, 0x40, 0x4e, 0x02, 0x68, 0x1b, 0xd4, 0xc7, 0x34,
+ 0x54, 0x43, 0x61, 0x13, 0x37, 0x69, 0x0e, 0x02, 0xe9, 0x85, 0x59, 0x70,
+ 0x9e, 0xb9, 0x06, 0xfc, 0x4e, 0xe9, 0x97, 0xe8, 0x85, 0xce, 0x9c, 0xd3,
+ 0x23, 0x74, 0x1d, 0x8a, 0x23, 0x0d, 0x49, 0x6f, 0x25, 0x55, 0x7e, 0x75,
+ 0x6d, 0x76, 0xc2, 0xcc, 0x63, 0xe4, 0xd6, 0xc9, 0x9f, 0x60, 0xf7, 0x33,
+ 0x30, 0x6a, 0xc3, 0xf0, 0x1e, 0x5a, 0xb8, 0xd9, 0x8a, 0x22, 0xad, 0xdd,
+ 0xe0, 0xdc, 0x74, 0xaf, 0xf1, 0x36, 0xe3, 0x78, 0x49, 0x46, 0x06, 0x15,
+ 0xd5, 0x50, 0x52, 0x47, 0xa0, 0xaf, 0x4b, 0xd1, 0xce, 0x40, 0xbb, 0x30,
+ 0xdd, 0x4b, 0x56, 0x09, 0xab, 0x77, 0x97, 0x12, 0xbc, 0x4f, 0x81, 0xbe,
+ 0x0c, 0x1b, 0xe5, 0x82, 0xf5, 0x11, 0x31, 0x36, 0x8a, 0xc8, 0x71, 0x33,
+ 0x84, 0xb7, 0x6d, 0x03, 0xb1, 0x50, 0xd9, 0xb6, 0x88, 0x4a, 0x4e, 0xbc,
+ 0xd1, 0x85, 0x81, 0x33, 0x66, 0x9b, 0x91, 0x5d, 0x39, 0x45, 0x29, 0x64,
+ 0x2a, 0x4c, 0x1c, 0xb4, 0xcf, 0x12, 0x7e, 0x2b, 0x63, 0x5c, 0xc5, 0x82,
+ 0xc5, 0x8b, 0x9d, 0xb4, 0x58, 0xb0, 0x2f, 0xcf, 0xd6, 0x7a, 0xd9, 0x51,
+ 0x82, 0xe6, 0x01, 0x50, 0x1f, 0x9f, 0xdd, 0x3c, 0x6b, 0xd7, 0xa8, 0xb1,
+ 0x76, 0x8a, 0x8b, 0xdd, 0x50, 0xb5, 0x5b, 0xe9, 0xc6, 0xa5, 0x49, 0xe6,
+ 0xdb, 0x98, 0x2e, 0x39, 0x75, 0x6c, 0xb6, 0x02, 0xf1, 0x4e, 0xf0, 0xfd,
+ 0x57, 0x98, 0x1c, 0xf4, 0x53, 0xbc, 0x81, 0xf3, 0x4e, 0x58, 0x5d, 0x57,
+ 0xda, 0x0a, 0x8d, 0x79, 0xf9, 0x22, 0x33, 0x5f, 0xcc, 0xa9, 0x4f, 0xe4,
+ 0x4a, 0xfc, 0xb1, 0xda, 0xf0, 0x1f, 0x95, 0xce, 0xb0, 0xd1, 0x45, 0x2f,
+ 0x22, 0xd6, 0xef, 0xf5, 0x57, 0xe5, 0xf2, 0x76, 0x44, 0x4f, 0x87, 0x67,
+ 0x03, 0x8d, 0xce, 0x73, 0xf5, 0x54, 0xd0, 0x94, 0xdb, 0x10, 0x90, 0xbb,
+ 0x1c, 0x49, 0xfb, 0x40, 0x3c, 0x9a, 0xd6, 0x37, 0xf1, 0x13, 0x5e, 0xdf,
+ 0x44, 0x4f, 0xb8, 0xfe, 0x07, 0x27, 0xdd, 0xa9, 0x9a, 0xbd, 0x67, 0x7d,
+ 0xfc, 0x7d, 0x0f, 0x72, 0x8a, 0x77, 0xc2, 0x75, 0x75, 0xe0, 0x76, 0xef,
+ 0x8c, 0xf3, 0x21, 0x97, 0x3d, 0x72, 0x0d, 0x92, 0xf9, 0x9c, 0x47, 0xbd,
+ 0xfd, 0xf6, 0xa0, 0xdb, 0x73, 0x6e, 0xbe, 0x2f, 0x87, 0xfb, 0xec, 0x60,
+ 0xfc, 0x7d, 0xe7, 0x58, 0x7b, 0x07, 0x39, 0x30, 0x46, 0xa4, 0xf8, 0x83,
+ 0x92, 0x1e, 0x98, 0x79, 0x68, 0xac, 0x28, 0xbf, 0xd7, 0x37, 0x8f, 0xe1,
+ 0x77, 0x33, 0x91, 0x80, 0xdf, 0x03, 0x1a, 0xaf, 0xe2, 0x77, 0x7f, 0xa3,
+ 0x3a, 0x58, 0x98, 0x3e, 0xc7, 0x17, 0xe0, 0x72, 0x54, 0x41, 0x45, 0x58,
+ 0x1d, 0x9c, 0x4e, 0x71, 0x41, 0xb0, 0x76, 0x98, 0x6d, 0x8b, 0x79, 0xfe,
+ 0x12, 0x46, 0xc7, 0x0b, 0x01, 0x9f, 0xeb, 0x8e, 0xfe, 0x62, 0x46, 0x97,
+ 0x03, 0x12, 0xf0, 0x39, 0x94, 0xeb, 0xb3, 0x81, 0xc7, 0xe0, 0x1e, 0xd7,
+ 0xfa, 0x68, 0x08, 0x11, 0x0a, 0xf1, 0x55, 0x9c, 0xd6, 0xde, 0xcd, 0xeb,
+ 0x62, 0xf3, 0x11, 0x8c, 0x9d, 0x81, 0x2d, 0x47, 0xaf, 0x26, 0xa1, 0x73,
+ 0xde, 0xc2, 0x1f, 0xf8, 0xf5, 0x41, 0xb0, 0x56, 0xa4, 0xa2, 0x60, 0x3a,
+ 0xc2, 0x75, 0x0d, 0x5b, 0xdf, 0xc7, 0xd5, 0xf0, 0x7b, 0xbd, 0xb6, 0xf1,
+ 0xd9, 0x74, 0x12, 0x31, 0x88, 0x86, 0x3a, 0xa3, 0x1c, 0x28, 0xc0, 0xf6,
+ 0x75, 0xcf, 0x29, 0x69, 0x78, 0x50, 0x05, 0x48, 0x47, 0x19, 0xe6, 0xc5,
+ 0x30, 0xac, 0x14, 0x68, 0x07, 0x8d, 0x9b, 0x0e, 0x98, 0x33, 0x4a, 0x79,
+ 0x49, 0xcb, 0x95, 0xb0, 0x45, 0x8a, 0xea, 0x6f, 0x71, 0xf1, 0xe3, 0xea,
+ 0x8d, 0xd4, 0x9c, 0x47, 0x11, 0x09, 0xdb, 0xbd, 0x91, 0x9a, 0xb2, 0xe5,
+ 0x5a, 0x7b, 0xd6, 0x81, 0xfc, 0x9e, 0x16, 0xf5, 0x10, 0xb6, 0xd3, 0x25,
+ 0x01, 0xd1, 0xbc, 0xb4, 0x7f, 0x0d, 0x4c, 0x8b, 0x57, 0x6f, 0xc7, 0x1d,
+ 0x95, 0xa2, 0xce, 0xb8, 0x82, 0xea, 0x0a, 0x72, 0xc3, 0xfc, 0xde, 0xba,
+ 0xd6, 0x10, 0xe7, 0xe0, 0xc6, 0xa1, 0x32, 0x64, 0xd8, 0x6a, 0xc2, 0x7c,
+ 0xa2, 0xa3, 0x17, 0x69, 0xa5, 0xfe, 0x12, 0xa6, 0x1c, 0xe2, 0xdc, 0xb4,
+ 0x06, 0x37, 0xbb, 0x0d, 0xd6, 0xd2, 0xc9, 0x8f, 0x14, 0x83, 0x05, 0xe3,
+ 0x0b, 0x82, 0xe6, 0xa9, 0x1d, 0xcc, 0x17, 0xdc, 0xbc, 0x40, 0xf0, 0xfa,
+ 0x14, 0x80, 0x29, 0x45, 0xe2, 0xa3, 0x0e, 0x1a, 0x0b, 0x4a, 0x6d, 0x08,
+ 0xcc, 0x98, 0x64, 0x54, 0x6e, 0x3e, 0x60, 0x37, 0x12, 0x09, 0x17, 0x37,
+ 0x4f, 0x86, 0xf4, 0x78, 0xa2, 0x76, 0x22, 0xff, 0xf0, 0x19, 0x7e, 0x38,
+ 0xea, 0x12, 0x3a, 0xa8, 0x32, 0x93, 0x26, 0xc3, 0xd6, 0xc7, 0xba, 0x2c,
+ 0xa6, 0xd4, 0xa3, 0x86, 0xa6, 0xad, 0x2d, 0x47, 0x6e, 0x81, 0x47, 0xcf,
+ 0xd9, 0x14, 0x5e, 0x97, 0x43, 0xc3, 0x42, 0xc3, 0x10, 0x14, 0xac, 0x6e,
+ 0x6d, 0xfa, 0xde, 0x5e, 0x64, 0xd3, 0xed, 0x8c, 0x5f, 0xca, 0x32, 0x1f,
+ 0xb1, 0xe5, 0x17, 0x39, 0x37, 0x83, 0x7b, 0x99, 0x2f, 0x86, 0xfa, 0x16,
+ 0x5f, 0x1e, 0xf3, 0xf4, 0xa3, 0x5c, 0xea, 0x4f, 0xc0, 0x0a, 0x61, 0xcf,
+ 0x33, 0xed, 0x48, 0xee, 0x47, 0xb4, 0xf8, 0x49, 0xe1, 0x19, 0xd1, 0xb4,
+ 0xc8, 0x21, 0xc4, 0xde, 0x10, 0x56, 0xe4, 0xe5, 0x3b, 0xb1, 0xb2, 0x48,
+ 0xad, 0x5f, 0xf0, 0x3d, 0x36, 0x5a, 0x02, 0x85, 0x99, 0xd8, 0x77, 0x1f,
+ 0xdc, 0x3f, 0xc7, 0x0f, 0xab, 0xf6, 0x4f, 0x69, 0xf6, 0xbf, 0xc7, 0xfe,
+ 0x3d, 0xfb, 0x24, 0xfb, 0xf7, 0xec, 0x7f, 0x9b, 0xfd, 0x7b, 0xf6, 0x8f,
+ 0xef, 0xdf, 0x93, 0xee, 0xfe, 0x3d, 0xfb, 0xdf, 0x65, 0xff, 0xb4, 0x19,
+ 0xa1, 0xee, 0x5e, 0x16, 0xec, 0xdf, 0x58, 0x92, 0x40, 0x14, 0xcb, 0x92,
+ 0x88, 0xad, 0x6f, 0x71, 0xc8, 0x45, 0xd2, 0x80, 0xd9, 0xa7, 0xad, 0x35,
+ 0xbb, 0x0c, 0xa4, 0xda, 0xd3, 0xdd, 0x47, 0x00, 0xf4, 0x74, 0xc8, 0xe3,
+ 0xb3, 0xc4, 0x7e, 0xde, 0xdb, 0x04, 0x87, 0x35, 0x27, 0x8e, 0xe0, 0xa8,
+ 0xc3, 0xd9, 0xac, 0xf1, 0x8c, 0x08, 0xc0, 0xc5, 0xc7, 0xb5, 0xab, 0x9b,
+ 0x8f, 0x41, 0xca, 0x19, 0xe2, 0xed, 0xbf, 0x24, 0x7a, 0x0d, 0xf9, 0xf1,
+ 0x2f, 0xa3, 0xf5, 0xa0, 0xe8, 0x6b, 0xee, 0x26, 0x15, 0x0b, 0x32, 0x78,
+ 0xa4, 0x7b, 0xf4, 0xb6, 0xd9, 0x5d, 0xeb, 0xaa, 0x3a, 0xb2, 0x85, 0x93,
+ 0xe1, 0xc3, 0x5b, 0x56, 0x5e, 0x03, 0xd0, 0xea, 0xe5, 0xfb, 0x77, 0xa1,
+ 0xdb, 0xcd, 0x2c, 0x75, 0x33, 0x09, 0xe0, 0x44, 0xcd, 0x7e, 0x0d, 0xc9,
+ 0xb8, 0x1f, 0xa2, 0xad, 0x82, 0x39, 0x8e, 0xa7, 0xdf, 0x6e, 0x7a, 0x0e,
+ 0x20, 0xc4, 0x20, 0xca, 0xc8, 0x41, 0xe3, 0xca, 0x74, 0x85, 0x5f, 0x20,
+ 0xb4, 0x1f, 0xb7, 0xc3, 0xad, 0x66, 0xda, 0x36, 0xe3, 0x8e, 0x81, 0xce,
+ 0xa5, 0xa6, 0xbd, 0x0a, 0x3a, 0xc1, 0x92, 0x32, 0x98, 0xd7, 0x73, 0xbe,
+ 0x15, 0x09, 0x69, 0x46, 0x6f, 0x42, 0x4c, 0xec, 0x9f, 0x99, 0xc0, 0xfa,
+ 0x6c, 0xb7, 0x45, 0xd5, 0x57, 0xd0, 0x15, 0x97, 0xf3, 0x85, 0x54, 0xdf,
+ 0x3f, 0x50, 0x7d, 0x0c, 0x13, 0x7c, 0x33, 0xf9, 0x01, 0xb5, 0xc5, 0xec,
+ 0xad, 0x97, 0x42, 0x3c, 0xb5, 0xca, 0x6d, 0xe9, 0x91, 0x86, 0xc2, 0x7a,
+ 0xd0, 0x01, 0xa3, 0x80, 0x6c, 0x1d, 0x58, 0x0d, 0xae, 0x19, 0xd3, 0x66,
+ 0x04, 0x24, 0x23, 0x3d, 0x9d, 0x59, 0xca, 0x80, 0x04, 0x29, 0x23, 0x0a,
+ 0xcd, 0xc9, 0x8e, 0x35, 0x52, 0x36, 0x38, 0xa2, 0x48, 0x93, 0x66, 0x94,
+ 0x4d, 0xf3, 0xba, 0x19, 0x6a, 0x24, 0xa5, 0x88, 0xb5, 0x8b, 0x3b, 0xeb,
+ 0xec, 0x01, 0x6f, 0x16, 0xab, 0x9d, 0x51, 0xed, 0x16, 0x9e, 0x02, 0x81,
+ 0xb5, 0x51, 0x1d, 0x92, 0x8a, 0xc9, 0xd4, 0xb9, 0x47, 0xa9, 0xb3, 0x3e,
+ 0xa7, 0x0c, 0x2f, 0xc2, 0x3a, 0x53, 0x2d, 0xd4, 0xe5, 0x15, 0xff, 0x0b,
+ 0x98, 0xa3, 0xa7, 0x6a, 0x89, 0x35, 0x33, 0xdf, 0x33, 0x11, 0x9c, 0x24,
+ 0xbf, 0x2a, 0x2a, 0xc6, 0x51, 0xc6, 0xcc, 0xd1, 0xd5, 0x49, 0x6b, 0x17,
+ 0xee, 0x97, 0xd3, 0x36, 0x52, 0xbd, 0x3e, 0x1a, 0x6c, 0x68, 0x72, 0x32,
+ 0x7b, 0x90, 0x1e, 0x28, 0x20, 0x1c, 0xd1, 0x6d, 0x44, 0x64, 0xc3, 0x36,
+ 0x51, 0x4e, 0x38, 0x5b, 0xfe, 0x3a, 0xf3, 0xa1, 0x05, 0x2c, 0x6e, 0xab,
+ 0xa4, 0x28, 0x62, 0xea, 0x85, 0x24, 0x76, 0x07, 0xdd, 0xb9, 0x00, 0x1c,
+ 0x22, 0x93, 0x5f, 0x13, 0x6c, 0xcf, 0x25, 0xbf, 0xc5, 0xbd, 0xc9, 0x01,
+ 0xc5, 0xf5, 0x4f, 0x2c, 0xe4, 0xf7, 0x0a, 0x27, 0x7c, 0x11, 0x95, 0x5d,
+ 0x71, 0x30, 0x7f, 0x55, 0x52, 0xbd, 0x0f, 0x3a, 0x08, 0xdc, 0x76, 0x16,
+ 0x1d, 0xd6, 0xdb, 0x75, 0x54, 0x34, 0x55, 0xb9, 0x30, 0xdc, 0xf3, 0x4d,
+ 0x4a, 0xab, 0x02, 0x07, 0xbd, 0x4a, 0xb3, 0x79, 0xe0, 0xb5, 0xac, 0x4b,
+ 0xf2, 0x9c, 0x2b, 0x1e, 0x2b, 0xff, 0xcb, 0x73, 0xb6, 0xc2, 0x3c, 0x60,
+ 0xd2, 0x24, 0x95, 0x21, 0x99, 0x61, 0x70, 0xa9, 0xab, 0x42, 0x7b, 0xb9,
+ 0x20, 0xa9, 0xdc, 0x4b, 0x7e, 0x5e, 0x09, 0xdb, 0x81, 0xa1, 0x86, 0xdd,
+ 0xc0, 0x88, 0x0c, 0xfd, 0x32, 0x2a, 0x39, 0x78, 0xdd, 0xd9, 0x4c, 0x81,
+ 0x6d, 0x34, 0x15, 0x7b, 0x52, 0xdd, 0x2f, 0xc8, 0x3d, 0xc0, 0xef, 0xca,
+ 0x39, 0xa7, 0xd9, 0x31, 0x6c, 0xf2, 0x6a, 0x64, 0x80, 0xf7, 0xb5, 0xd7,
+ 0x7b, 0x00, 0xb7, 0x29, 0x39, 0x86, 0x08, 0x44, 0xdc, 0x1c, 0x14, 0xbd,
+ 0x5d, 0xe9, 0xda, 0x99, 0x02, 0xf0, 0xa8, 0xb7, 0x21, 0xa0, 0xb4, 0xf9,
+ 0xf3, 0xbb, 0xc9, 0xc0, 0xf6, 0x30, 0x7c, 0x80, 0x6e, 0x25, 0x14, 0x44,
+ 0xd9, 0xf4, 0x42, 0xe0, 0xf2, 0xbc, 0xc5, 0xbe, 0xe9, 0x9e, 0x0c, 0x9b,
+ 0xd9, 0x9e, 0x12, 0x08, 0x4a, 0x11, 0xa0, 0x2d, 0x19, 0x1b, 0xf7, 0x6a,
+ 0x28, 0xb8, 0x31, 0x3d, 0x7c, 0xe2, 0xa5, 0x53, 0x0a, 0xeb, 0x72, 0xbd,
+ 0x3e, 0x92, 0xf1, 0xac, 0xe3, 0x11, 0x32, 0x4d, 0x33, 0x29, 0x04, 0xcb,
+ 0x87, 0xc4, 0x6d, 0x10, 0x6e, 0x40, 0x75, 0xc1, 0xd1, 0x79, 0x7a, 0xc5,
+ 0x92, 0xcb, 0xca, 0x3a, 0x0f, 0x91, 0x81, 0x9a, 0x34, 0x1b, 0xc1, 0xc8,
+ 0xdd, 0x88, 0x26, 0xe6, 0x6e, 0x32, 0x8f, 0x1c, 0x5f, 0x0e, 0xdf, 0x9a,
+ 0xb5, 0x0f, 0x03, 0x70, 0x2f, 0xf2, 0x4d, 0xc8, 0x6d, 0xe1, 0x32, 0x1c,
+ 0x90, 0x59, 0x8d, 0x5c, 0x14, 0xfa, 0xd2, 0x28, 0x86, 0x17, 0x35, 0x29,
+ 0x2b, 0x01, 0x6d, 0xa2, 0x64, 0x18, 0x73, 0xf2, 0x90, 0x01, 0x54, 0x5b,
+ 0x2c, 0x8e, 0x76, 0xa5, 0xba, 0x83, 0x69, 0x8d, 0x14, 0xd5, 0x5b, 0x1d,
+ 0x55, 0xe0, 0x43, 0x51, 0x87, 0x32, 0xcd, 0x6a, 0xea, 0x43, 0xc6, 0x13,
+ 0x48, 0x0e, 0x7c, 0x11, 0x05, 0xf4, 0xbc, 0xb4, 0xaa, 0xb5, 0x69, 0x48,
+ 0x97, 0x07, 0xf0, 0x60, 0x74, 0xe2, 0xef, 0x6d, 0xd9, 0xa5, 0x8a, 0x45,
+ 0xd9, 0xc2, 0x1a, 0x4e, 0x52, 0xc0, 0x89, 0x90, 0x0b, 0x05, 0xff, 0x84,
+ 0x8f, 0x8f, 0x08, 0x2d, 0x81, 0xda, 0x88, 0x66, 0x21, 0x0d, 0xd2, 0x6c,
+ 0xdf, 0xf4, 0xa5, 0x46, 0x69, 0x5c, 0xb0, 0x45, 0x99, 0xc3, 0x11, 0x97,
+ 0x85, 0x1c, 0x8d, 0x1c, 0xe2, 0x13, 0xa7, 0x94, 0xb8, 0xc2, 0x40, 0xb1,
+ 0x16, 0x0f, 0x2b, 0x84, 0x45, 0x7e, 0x73, 0x76, 0xf0, 0xee, 0x78, 0x7c,
+ 0xfa, 0x76, 0x1f, 0xe2, 0x02, 0x60, 0xb2, 0xf4, 0xc7, 0x2e, 0xb7, 0xf5,
+ 0x02, 0x4e, 0x3b, 0xbe, 0x9a, 0xd7, 0x0c, 0xc5, 0x4b, 0xdf, 0x32, 0x3b,
+ 0xf4, 0x43, 0x96, 0x7e, 0x8c, 0x94, 0xd6, 0x8d, 0x8d, 0x88, 0xa2, 0xc6,
+ 0x61, 0x2d, 0x1e, 0xe5, 0x64, 0xa4, 0xda, 0x6b, 0x0d, 0x0c, 0x44, 0xa4,
+ 0x12, 0x25, 0xe1, 0x3a, 0xf6, 0x4a, 0xd5, 0xa4, 0x9d, 0x73, 0xe4, 0x91,
+ 0xf9, 0xb1, 0xc7, 0x84, 0x1e, 0xae, 0x39, 0xcb, 0xc7, 0x9c, 0x0d, 0xec,
+ 0x84, 0x13, 0xac, 0x5e, 0x12, 0x06, 0x4b, 0xaf, 0x4e, 0x19, 0x70, 0xa3,
+ 0x71, 0x4c, 0xdb, 0x71, 0x80, 0x93, 0xbe, 0xe8, 0xe4, 0xeb, 0xc5, 0xc9,
+ 0x01, 0x76, 0x2d, 0x6b, 0x55, 0x6a, 0xe3, 0xc2, 0x8b, 0x46, 0x1d, 0x1c,
+ 0xa8, 0x37, 0x4d, 0x06, 0x11, 0x12, 0xd5, 0xfc, 0xb2, 0xe2, 0x26, 0x9b,
+ 0x95, 0x0b, 0x1e, 0x8b, 0x74, 0x09, 0x41, 0x6e, 0x66, 0x44, 0xe0, 0x51,
+ 0x4c, 0x33, 0xb2, 0x2c, 0x28, 0x87, 0x4d, 0x51, 0x27, 0x78, 0xa1, 0x3e,
+ 0x1a, 0xb4, 0x8c, 0xc5, 0xe0, 0xc2, 0x91, 0x0d, 0x64, 0x42, 0x91, 0xb7,
+ 0xab, 0x10, 0x3d, 0x8d, 0x49, 0x1c, 0x41, 0xc1, 0x52, 0x2c, 0x20, 0x34,
+ 0x58, 0x40, 0x46, 0xf0, 0x6d, 0x96, 0x7d, 0xe4, 0x6f, 0xda, 0x98, 0x2d,
+ 0xb7, 0xf1, 0xd0, 0x92, 0xa1, 0xb5, 0x1f, 0xb6, 0xd6, 0x84, 0x39, 0xba,
+ 0xfc, 0x8a, 0x58, 0xb5, 0xd9, 0x84, 0xca, 0x6b, 0x9a, 0xe1, 0x2e, 0x7e,
+ 0x41, 0xa9, 0x85, 0xff, 0xb4, 0x32, 0xf7, 0xc5, 0x0d, 0xa9, 0x7a, 0xf8,
+ 0x92, 0x20, 0x3f, 0x47, 0xc0, 0x93, 0xa5, 0x21, 0x7a, 0x5a, 0x7d, 0xac,
+ 0xdd, 0x29, 0x0f, 0x55, 0x81, 0x46, 0x37, 0x81, 0xcc, 0x11, 0x54, 0x4a,
+ 0xd3, 0x62, 0xda, 0x89, 0xff, 0x54, 0xb4, 0xd8, 0x78, 0x45, 0xcc, 0x3c,
+ 0xd6, 0x20, 0x42, 0xbf, 0xb6, 0x64, 0xe9, 0xab, 0x52, 0x5c, 0xc5, 0xdb,
+ 0x38, 0x2c, 0x3b, 0xdb, 0xdb, 0x0f, 0x82, 0x29, 0x0a, 0x9b, 0x2b, 0xa6,
+ 0x22, 0xee, 0xb2, 0xbc, 0xb0, 0x80, 0x8a, 0x8d, 0x56, 0x22, 0x3b, 0x38,
+ 0x45, 0xa0, 0xff, 0xa4, 0xb9, 0x14, 0x75, 0x77, 0x01, 0x66, 0xcd, 0x27,
+ 0x2d, 0xb4, 0xa1, 0xd5, 0xc2, 0x6e, 0x2d, 0xc4, 0x6e, 0x06, 0x68, 0x45,
+ 0xd2, 0x99, 0x8f, 0xf8, 0x3c, 0xef, 0xb7, 0xdf, 0xe9, 0xe6, 0x80, 0xf0,
+ 0x3d, 0x80, 0x10, 0x3f, 0xbd, 0xe8, 0xce, 0x44, 0xf2, 0xf5, 0xbd, 0xf3,
+ 0xe0, 0xda, 0xe8, 0x24, 0xe6, 0x45, 0x8a, 0x16, 0xcf, 0x7f, 0xb4, 0xc2,
+ 0x00, 0x88, 0xe3, 0x25, 0xfe, 0x8b, 0x07, 0x07, 0x6c, 0xae, 0xa9, 0x45,
+ 0x8d, 0x21, 0x19, 0x07, 0x2e, 0x1e, 0xb6, 0xb0, 0xab, 0xb5, 0x30, 0xf3,
+ 0x6e, 0xdd, 0xd4, 0x61, 0x12, 0x0d, 0x26, 0x55, 0x1b, 0x5e, 0xd9, 0x05,
+ 0xa3, 0x0d, 0x7f, 0xd9, 0xae, 0x2c, 0x78, 0xde, 0xde, 0x5f, 0x82, 0xa0,
+ 0x19, 0x02, 0x68, 0xa6, 0x7b, 0x11, 0x12, 0x36, 0x0d, 0x31, 0x39, 0x9c,
+ 0xcd, 0x65, 0xe1, 0x79, 0xe1, 0x09, 0x76, 0x95, 0xb3, 0x39, 0xb5, 0x1e,
+ 0xbd, 0x83, 0xe7, 0xdf, 0x52, 0xaf, 0x15, 0x10, 0x59, 0x95, 0x3d, 0x1f,
+ 0xfd, 0x22, 0xc0, 0xba, 0x68, 0xf9, 0xf3, 0x43, 0xfc, 0x30, 0xae, 0x0a,
+ 0x71, 0xb1, 0x22, 0x46, 0xd4, 0x41, 0xc6, 0x1b, 0xfc, 0x01, 0xac, 0x29,
+ 0x18, 0xbb, 0x75, 0x80, 0xbd, 0xbb, 0xa0, 0xe6, 0x98, 0xd9, 0x88, 0x77,
+ 0x38, 0xea, 0xe4, 0x18, 0x68, 0xd7, 0x1f, 0xb2, 0x20, 0xb8, 0xaa, 0x8c,
+ 0x17, 0x53, 0x3b, 0xe0, 0x5c, 0x94, 0xed, 0xd2, 0x2f, 0xcc, 0xb8, 0xb5,
+ 0xfa, 0x28, 0x8a, 0x58, 0x82, 0x16, 0xb4, 0x73, 0xf3, 0xd4, 0x3a, 0x61,
+ 0x40, 0x22, 0x84, 0xc9, 0x23, 0x5b, 0x9c, 0x5a, 0xd6, 0x40, 0x00, 0xef,
+ 0x93, 0x70, 0xc2, 0xa0, 0x82, 0x74, 0x07, 0xca, 0x23, 0xe5, 0x47, 0x11,
+ 0x88, 0x75, 0x82, 0xcd, 0x01, 0x54, 0xd0, 0xb2, 0xf2, 0xb2, 0xa2, 0xd6,
+ 0xae, 0x73, 0xb3, 0xab, 0xc5, 0x1a, 0x54, 0x22, 0x77, 0xb1, 0xca, 0x77,
+ 0x83, 0xc5, 0x2e, 0x67, 0x5e, 0x84, 0x2e, 0xd4, 0x1d, 0x2c, 0xc6, 0x49,
+ 0x50, 0x04, 0x6e, 0x5d, 0x0a, 0x72, 0xa7, 0x48, 0x5a, 0x31, 0xaf, 0xa1,
+ 0x2c, 0x92, 0xde, 0x0a, 0x1e, 0xc7, 0x1d, 0x62, 0xdf, 0xa2, 0x9f, 0x29,
+ 0x11, 0xdc, 0x35, 0x14, 0xb4, 0x3d, 0x30, 0xe6, 0xe4, 0xca, 0xa7, 0x7f,
+ 0x11, 0x8d, 0x63, 0xd6, 0x31, 0x6d, 0x82, 0x20, 0xa7, 0x45, 0xba, 0x2b,
+ 0x48, 0xb6, 0x76, 0x7a, 0x8f, 0xc2, 0x6c, 0xf7, 0x61, 0x70, 0x77, 0x80,
+ 0x94, 0x6b, 0xa8, 0x78, 0x55, 0xc2, 0x01, 0x24, 0x7c, 0x4c, 0x24, 0x9c,
+ 0x54, 0xf9, 0xa2, 0xe1, 0x8c, 0x34, 0x29, 0x98, 0x79, 0xc8, 0xea, 0xbf,
+ 0x9a, 0x95, 0x17, 0xe9, 0x4c, 0x30, 0x2d, 0x24, 0x5f, 0x55, 0xe3, 0x5e,
+ 0xad, 0xe6, 0x0d, 0x24, 0xde, 0x88, 0x3d, 0x23, 0x6d, 0xaa, 0xcc, 0x8a,
+ 0x87, 0xfb, 0x03, 0xe4, 0x6d, 0xdc, 0x35, 0x2b, 0x3f, 0x68, 0x3f, 0xc1,
+ 0x28, 0xc9, 0xc3, 0xcb, 0x81, 0x9c, 0x5e, 0xc5, 0xaf, 0x41, 0xba, 0x6f,
+ 0xed, 0x1d, 0xa9, 0xc0, 0xf2, 0x06, 0xdc, 0x54, 0x32, 0x5d, 0xb2, 0x3a,
+ 0xe8, 0xee, 0x93, 0x75, 0x49, 0x15, 0x92, 0x36, 0xc0, 0xc8, 0x41, 0xb5,
+ 0x1d, 0x9e, 0x38, 0x23, 0x27, 0x8b, 0xf5, 0xb7, 0xbc, 0x55, 0xff, 0x9d,
+ 0xd9, 0xd5, 0xeb, 0xf2, 0x16, 0x55, 0x77, 0x05, 0x19, 0x27, 0x6e, 0x72,
+ 0x5a, 0x51, 0xe1, 0xd1, 0x8a, 0x5b, 0x58, 0x86, 0x1c, 0x7f, 0xc9, 0x6e,
+ 0x01, 0xe8, 0xd2, 0xbc, 0x27, 0x2b, 0x28, 0xe3, 0xb7, 0x67, 0x69, 0x3b,
+ 0x8a, 0xec, 0xa7, 0x7b, 0x42, 0x6a, 0x90, 0x6b, 0x66, 0x8b, 0x67, 0xdc,
+ 0x3c, 0x77, 0xc3, 0xf0, 0x8b, 0x00, 0x04, 0x70, 0x8b, 0xde, 0x4d, 0x62,
+ 0x30, 0xb9, 0x67, 0x59, 0x12, 0x44, 0xf3, 0xf7, 0xcc, 0x2a, 0x28, 0x6d,
+ 0x99, 0xba, 0xb0, 0x94, 0x85, 0x94, 0x80, 0xc3, 0xe7, 0x21, 0x81, 0x63,
+ 0xe5, 0xa7, 0xac, 0x99, 0x78, 0xbf, 0x9c, 0x66, 0xe9, 0x2c, 0xda, 0x63,
+ 0x8c, 0x26, 0x8c, 0x68, 0x27, 0xcb, 0x36, 0x00, 0xca, 0x15, 0x1a, 0x3c,
+ 0x97, 0xd2, 0x19, 0x4e, 0x1e, 0x2f, 0x5a, 0x48, 0x55, 0x38, 0x53, 0xe1,
+ 0x4e, 0x53, 0xdf, 0x43, 0xfa, 0x35, 0xc1, 0x79, 0x4c, 0x1c, 0x6e, 0x93,
+ 0x57, 0x53, 0x09, 0x5f, 0xd3, 0x9b, 0x93, 0xc4, 0x3e, 0x80, 0xbc, 0x57,
+ 0x4e, 0xde, 0x0d, 0x9a, 0x2d, 0x4a, 0x34, 0x4d, 0xc0, 0x33, 0xf8, 0x9a,
+ 0xd1, 0x62, 0x3c, 0x9a, 0x17, 0xf7, 0x59, 0x22, 0x19, 0xb9, 0x29, 0x47,
+ 0x11, 0xc9, 0x76, 0x10, 0x1f, 0x8b, 0x70, 0xa7, 0x6f, 0x32, 0xcd, 0x76,
+ 0x85, 0xf9, 0xc1, 0xe4, 0x6f, 0x2c, 0x9e, 0x08, 0x8d, 0x25, 0xb2, 0x86,
+ 0xc5, 0xcc, 0xee, 0x6e, 0xfc, 0x64, 0xcc, 0x33, 0xa3, 0x48, 0x4e, 0x95,
+ 0xc5, 0x70, 0xd6, 0xeb, 0xf4, 0x32, 0x53, 0x9b, 0x45, 0x44, 0x77, 0x39,
+ 0x31, 0xe4, 0x43, 0xa6, 0xce, 0x2d, 0x1b, 0x14, 0x45, 0xa4, 0x50, 0x9f,
+ 0xa5, 0x26, 0x49, 0x49, 0x7b, 0xe5, 0xd2, 0x31, 0x10, 0x71, 0x5b, 0xcf,
+ 0xf2, 0x85, 0x86, 0x29, 0x07, 0x49, 0x26, 0x89, 0xa4, 0xd4, 0xec, 0x01,
+ 0x5b, 0xb2, 0x1c, 0x46, 0x1c, 0x70, 0x9a, 0x6a, 0xa7, 0xbd, 0x00, 0x66,
+ 0x64, 0x19, 0x6d, 0x74, 0x46, 0x7f, 0xb2, 0xbd, 0x83, 0xd9, 0x3e, 0xd9,
+ 0x7e, 0xbe, 0xd9, 0xbe, 0x95, 0x67, 0x75, 0x36, 0x44, 0x22, 0xf2, 0x23,
+ 0x2a, 0xf4, 0xe1, 0x8d, 0xa0, 0x37, 0x24, 0x75, 0x59, 0x0b, 0xf2, 0xa1,
+ 0x73, 0xa3, 0xef, 0x33, 0x39, 0x28, 0xeb, 0x6b, 0x82, 0xa7, 0x0e, 0x6e,
+ 0x79, 0x7a, 0x4d, 0xde, 0xe3, 0x9c, 0x46, 0xba, 0x96, 0x98, 0x52, 0x29,
+ 0x5e, 0x96, 0xbe, 0xb2, 0x4c, 0x08, 0x3c, 0x67, 0x2d, 0xf0, 0x58, 0x07,
+ 0x78, 0x59, 0x35, 0x17, 0x50, 0x72, 0x06, 0x07, 0x77, 0x1a, 0xb7, 0x36,
+ 0xa2, 0xca, 0x9c, 0xe4, 0x75, 0x5e, 0xe4, 0xf5, 0x35, 0xb1, 0xfd, 0x9c,
+ 0x92, 0x16, 0xae, 0xb2, 0x10, 0x04, 0xc8, 0x88, 0x23, 0x63, 0x02, 0xb0,
+ 0xb9, 0x5f, 0xa1, 0x45, 0x0f, 0x25, 0x03, 0x33, 0xdd, 0xa5, 0x08, 0x51,
+ 0x3a, 0x13, 0x03, 0x42, 0xd6, 0x2d, 0x33, 0x6a, 0x96, 0x3c, 0xaa, 0x6d,
+ 0x36, 0x35, 0x70, 0x05, 0x98, 0x28, 0xf7, 0x54, 0x44, 0x4b, 0xc5, 0x58,
+ 0xaf, 0xbc, 0x64, 0x83, 0x36, 0xf7, 0x74, 0x6c, 0x44, 0xd0, 0x36, 0x69,
+ 0xe4, 0xb3, 0x94, 0x1a, 0x89, 0xd0, 0xdf, 0xcc, 0xcf, 0x7e, 0x34, 0xba,
+ 0xe8, 0xe8, 0x85, 0xfd, 0xf1, 0xe6, 0xe3, 0x7a, 0x6c, 0xef, 0x76, 0x74,
+ 0x33, 0xaa, 0xaf, 0x90, 0x88, 0x34, 0x1c, 0x56, 0x5f, 0xf0, 0x3f, 0xe2,
+ 0x1e, 0x6f, 0xe0, 0x68, 0x1c, 0xbf, 0x39, 0x20, 0xe4, 0x4d, 0x57, 0xf1,
+ 0xe9, 0xa5, 0x15, 0x6b, 0xd1, 0xb5, 0x76, 0xf5, 0x20, 0xee, 0x80, 0xae,
+ 0x1a, 0x45, 0x42, 0x96, 0x4e, 0x7a, 0x9c, 0x7f, 0x89, 0x54, 0xf2, 0x16,
+ 0x30, 0x02, 0xb4, 0xb9, 0x19, 0xb5, 0x56, 0xa5, 0x83, 0x30, 0x4a, 0x4e,
+ 0x32, 0xee, 0x33, 0xb8, 0xfe, 0xd5, 0x7a, 0xa4, 0x42, 0x7b, 0xfd, 0xe5,
+ 0xba, 0xd7, 0xb5, 0xc7, 0xf5, 0x2f, 0x5d, 0xff, 0x23, 0x99, 0xf5, 0x04,
+ 0x3a, 0xc7, 0xdf, 0x94, 0x2d, 0xe0, 0x9a, 0x09, 0xc9, 0x79, 0xe9, 0x29,
+ 0xba, 0x15, 0x2c, 0xe5, 0x76, 0xfa, 0xe8, 0x82, 0x11, 0xec, 0xa9, 0x08,
+ 0xa2, 0xbd, 0x76, 0x55, 0xe6, 0xd6, 0x83, 0x0a, 0xee, 0xe2, 0x5e, 0x50,
+ 0x0d, 0x73, 0x24, 0xd6, 0xb9, 0xbe, 0xef, 0x3c, 0x23, 0x9e, 0x0a, 0x5c,
+ 0x68, 0x46, 0xcf, 0x87, 0x59, 0xc8, 0x36, 0xb7, 0xf9, 0xf5, 0xd5, 0x55,
+ 0x34, 0xc7, 0xd5, 0x90, 0x80, 0x36, 0x9e, 0xd6, 0x7c, 0x69, 0xec, 0x2d,
+ 0xe8, 0x1b, 0x74, 0xcf, 0xf7, 0x17, 0xc4, 0x38, 0xdd, 0x3d, 0xf2, 0x8c,
+ 0xb7, 0x8a, 0x97, 0x7e, 0xcd, 0x61, 0x4f, 0xdc, 0x03, 0x6c, 0x20, 0x7c,
+ 0x40, 0xce, 0x2c, 0xfc, 0xd4, 0x06, 0x3d, 0x2e, 0x53, 0xc3, 0x19, 0xf7,
+ 0x92, 0x60, 0x34, 0xa3, 0x2a, 0x31, 0x31, 0xa6, 0x02, 0x19, 0x46, 0x7c,
+ 0xcb, 0x29, 0xfc, 0xe6, 0x62, 0xa2, 0x16, 0x6c, 0x4c, 0xc7, 0x42, 0xb4,
+ 0x0d, 0x29, 0x62, 0x82, 0x61, 0x92, 0x68, 0x93, 0x33, 0xf1, 0x5f, 0xa0,
+ 0x3e, 0xa9, 0xeb, 0x1b, 0x97, 0x6a, 0x25, 0x39, 0x89, 0xa2, 0xac, 0xb8,
+ 0x9c, 0x16, 0xd4, 0x5b, 0x41, 0x68, 0x38, 0x6f, 0x92, 0x5f, 0xa0, 0xde,
+ 0x8d, 0x54, 0xc1, 0x82, 0x30, 0xc2, 0x68, 0x0b, 0x87, 0x84, 0xab, 0xc4,
+ 0xba, 0xb0, 0x22, 0xbb, 0x7b, 0x9f, 0x7f, 0x1e, 0x75, 0xf0, 0x31, 0xe4,
+ 0x8c, 0xe1, 0x41, 0x22, 0x93, 0x03, 0x0f, 0x1f, 0xd8, 0x2e, 0x10, 0xf4,
+ 0x75, 0x62, 0x30, 0xf5, 0x72, 0x95, 0xe8, 0x28, 0x4a, 0x5f, 0x0d, 0x9d,
+ 0xbc, 0x70, 0xbe, 0xcc, 0x49, 0xab, 0x10, 0x29, 0x06, 0xe5, 0x8a, 0xa4,
+ 0xc6, 0x3c, 0xef, 0x51, 0xe9, 0x44, 0x49, 0xa8, 0x15, 0x3d, 0x47, 0x70,
+ 0x94, 0xa5, 0xb6, 0x88, 0xbb, 0x3e, 0x1b, 0xc5, 0x01, 0x95, 0x4b, 0x9c,
+ 0xfd, 0x07, 0xbe, 0xea, 0x29, 0xf1, 0x5f, 0x4f, 0x34, 0x03, 0xe6, 0x22,
+ 0xb3, 0x08, 0x54, 0xec, 0xe8, 0xe8, 0x60, 0x05, 0xb2, 0xff, 0xb1, 0xa0,
+ 0x3a, 0x5f, 0x6a, 0xfa, 0x65, 0x86, 0xef, 0x0c, 0x07, 0xd4, 0x8b, 0xab,
+ 0xac, 0x09, 0x6b, 0x53, 0xbd, 0x8a, 0x8e, 0x15, 0x83, 0x47, 0x4e, 0x83,
+ 0x54, 0xd6, 0xbe, 0x94, 0xfe, 0x34, 0xf9, 0xa5, 0x1e, 0x50, 0xed, 0x91,
+ 0xf5, 0x15, 0x27, 0xdb, 0xbe, 0xb4, 0xe8, 0xa4, 0x85, 0x4a, 0xa8, 0xaf,
+ 0xa2, 0x60, 0xb0, 0x0e, 0x69, 0x0e, 0xe0, 0xa4, 0x4d, 0x63, 0x34, 0x6b,
+ 0x27, 0xbd, 0x51, 0x1c, 0x64, 0xe1, 0x27, 0x85, 0xbe, 0x50, 0x91, 0x67,
+ 0x31, 0x20, 0xb2, 0x97, 0xd6, 0x63, 0x2d, 0x2d, 0xdf, 0xa8, 0x38, 0x8b,
+ 0xe6, 0x13, 0xa3, 0x44, 0x2d, 0xde, 0x6b, 0x92, 0x10, 0xe6, 0xe9, 0xc0,
+ 0xea, 0xa1, 0x77, 0x3d, 0x3a, 0x85, 0x7b, 0xef, 0x72, 0x2f, 0x1d, 0x5e,
+ 0x22, 0xd3, 0xd8, 0xc1, 0x2e, 0xfa, 0x21, 0xdc, 0xd4, 0x3a, 0xbd, 0x71,
+ 0x28, 0xba, 0x71, 0x39, 0x5a, 0xa7, 0x43, 0xe7, 0x00, 0x67, 0x5d, 0x95,
+ 0x19, 0xcf, 0x12, 0xc0, 0x63, 0x4c, 0xda, 0x97, 0x70, 0x5c, 0x35, 0xd5,
+ 0x72, 0x42, 0x7a, 0x25, 0x8c, 0x72, 0x7c, 0x29, 0xd4, 0x68, 0x97, 0xb5,
+ 0x86, 0xd9, 0xec, 0x8a, 0xd1, 0x6a, 0x18, 0x7b, 0x06, 0x12, 0x0b, 0x72,
+ 0x32, 0x5b, 0x78, 0x02, 0xac, 0xcd, 0x25, 0x0a, 0x91, 0x5e, 0x04, 0xb0,
+ 0x78, 0xc9, 0xd9, 0x52, 0xe7, 0x7f, 0x63, 0xad, 0x4c, 0x6a, 0x3b, 0x14,
+ 0x47, 0x16, 0x0e, 0x8e, 0x8c, 0x7a, 0x17, 0x25, 0xaf, 0xa8, 0x39, 0x3b,
+ 0x5f, 0xe5, 0xc4, 0x6f, 0x81, 0x9c, 0xf6, 0xcb, 0x9b, 0xf8, 0x3a, 0x22,
+ 0x35, 0xae, 0xca, 0xae, 0x96, 0x74, 0xd1, 0x81, 0x4c, 0x1b, 0x8a, 0x1b,
+ 0xaf, 0x4f, 0x2c, 0xf2, 0x05, 0x7a, 0xba, 0x19, 0x7b, 0x2e, 0x68, 0x66,
+ 0x6d, 0xde, 0x42, 0xd7, 0xf5, 0x65, 0x61, 0xa8, 0xd5, 0x2c, 0x29, 0x17,
+ 0x45, 0x20, 0xf3, 0x8c, 0xf8, 0xfa, 0x0b, 0x02, 0x40, 0xa5, 0xac, 0x9c,
+ 0xbb, 0x90, 0x4d, 0xad, 0xe5, 0x9d, 0x64, 0x97, 0x81, 0xed, 0x92, 0x21,
+ 0xff, 0x91, 0xee, 0x05, 0x4e, 0x29, 0x6c, 0x54, 0x02, 0x48, 0x7f, 0xde,
+ 0x7c, 0x9e, 0xfd, 0x91, 0x42, 0x01, 0x72, 0x94, 0xa1, 0xad, 0x80, 0x2a,
+ 0x98, 0x42, 0x77, 0x38, 0xc0, 0x46, 0xab, 0xf6, 0x24, 0x79, 0xdc, 0x6c,
+ 0xd1, 0x72, 0xeb, 0xb7, 0x01, 0x43, 0xe4, 0x73, 0xb5, 0xaa, 0x00, 0x23,
+ 0xa6, 0x35, 0x97, 0xc4, 0xd5, 0x61, 0xdb, 0x7a, 0x5c, 0x01, 0xac, 0x55,
+ 0xff, 0xc5, 0x1a, 0xbc, 0x24, 0xfa, 0x22, 0x10, 0x93, 0x00, 0xd8, 0xdf,
+ 0x17, 0x0f, 0x2a, 0x35, 0x01, 0x16, 0x81, 0xd6, 0xb6, 0x3b, 0x06, 0xa2,
+ 0x21, 0xae, 0x1b, 0xd9, 0x49, 0xb4, 0x5f, 0x17, 0xa1, 0x19, 0xc3, 0x35,
+ 0xb4, 0x10, 0x0a, 0x15, 0x45, 0xe3, 0xe8, 0x8c, 0x58, 0x40, 0x70, 0x2b,
+ 0x40, 0xa0, 0x50, 0x55, 0xa9, 0x91, 0x97, 0x7f, 0x59, 0x5c, 0xb9, 0xda,
+ 0xc3, 0xc8, 0x81, 0x05, 0x26, 0x67, 0xd8, 0xdd, 0x14, 0x7c, 0x38, 0x7c,
+ 0x9d, 0xc8, 0x7c, 0xbe, 0xf8, 0xaa, 0x35, 0xa0, 0xf6, 0xf0, 0xf2, 0x1b,
+ 0xd8, 0x08, 0x6e, 0xd9, 0xe4, 0x2a, 0xef, 0x25, 0x02, 0x53, 0xe1, 0xbe,
+ 0x5c, 0x7a, 0xe5, 0x24, 0xf5, 0x75, 0x99, 0xc9, 0xce, 0x15, 0xb0, 0x80,
+ 0x9d, 0xdc, 0xd0, 0x54, 0x82, 0xa8, 0x83, 0xbd, 0x7f, 0xca, 0xb8, 0xd3,
+ 0xff, 0xbd, 0xbc, 0x2e, 0xe8, 0x1f, 0x34, 0x3c, 0x8d, 0xfe, 0xc5, 0xce,
+ 0x4e, 0x74, 0xd6, 0xab, 0x37, 0x0c, 0x53, 0xa5, 0x4b, 0x48, 0x0a, 0x04,
+ 0x3c, 0x99, 0xd6, 0x32, 0xf8, 0x47, 0x28, 0x7e, 0x8e, 0xf8, 0x21, 0x53,
+ 0x88, 0x57, 0xa0, 0xb5, 0x7a, 0x2f, 0x73, 0xf6, 0x75, 0x54, 0x18, 0xe6,
+ 0xf6, 0x66, 0x00, 0x0c, 0x60, 0x24, 0x77, 0xa2, 0x7f, 0xe1, 0x6b, 0x94,
+ 0x09, 0x70, 0xff, 0xc5, 0xcb, 0xeb, 0xe5, 0x55, 0x06, 0x79, 0xd9, 0xdc,
+ 0x35, 0x6b, 0x8f, 0x5a, 0xb5, 0xfa, 0x26, 0x38, 0xad, 0xab, 0xf1, 0x52,
+ 0xda, 0x51, 0xa8, 0xd6, 0x52, 0x1c, 0x12, 0x07, 0x54, 0x66, 0x53, 0x1d,
+ 0xba, 0x35, 0xa2, 0xac, 0x84, 0x0e, 0x98, 0x68, 0x82, 0x61, 0xe4, 0x50,
+ 0x53, 0x56, 0xac, 0xe0, 0x36, 0xbb, 0xf8, 0xe2, 0x2b, 0xf2, 0x67, 0xdd,
+ 0xa1, 0xc1, 0x12, 0x6b, 0xb3, 0x44, 0xb8, 0x2d, 0xf4, 0x5b, 0x4a, 0xbc,
+ 0x45, 0x74, 0x07, 0x29, 0xab, 0xfe, 0x61, 0xbd, 0x9a, 0x55, 0x6f, 0xc8,
+ 0xcb, 0xb2, 0x5c, 0x39, 0x22, 0x51, 0x85, 0xbb, 0x71, 0x80, 0x2e, 0x5e,
+ 0x32, 0x3b, 0xa7, 0x78, 0xbb, 0x8a, 0x7c, 0x66, 0x09, 0x77, 0xc1, 0xf0,
+ 0x59, 0x88, 0xe1, 0xa3, 0x20, 0xde, 0xca, 0xb6, 0xb9, 0xde, 0x34, 0x5f,
+ 0x0c, 0xb4, 0xa4, 0x33, 0xd2, 0x34, 0xcf, 0xad, 0x81, 0x8f, 0x21, 0xb8,
+ 0x82, 0xfe, 0xfa, 0x47, 0xfb, 0x3a, 0xfd, 0x61, 0x4e, 0x31, 0x5a, 0x96,
+ 0xac, 0x58, 0xcd, 0xf1, 0xa5, 0xfd, 0xe2, 0x16, 0xd2, 0x0f, 0x6c, 0x98,
+ 0x75, 0x7d, 0xc0, 0xfa, 0xf5, 0x1f, 0xd7, 0x5b, 0x71, 0x2a, 0xc4, 0x90,
+ 0x38, 0x48, 0x35, 0x2d, 0x03, 0x75, 0x96, 0x72, 0xf1, 0x25, 0xca, 0x44,
+ 0xb3, 0xef, 0x99, 0x38, 0x69, 0xdb, 0x89, 0xce, 0xfd, 0xa7, 0x35, 0x3b,
+ 0xfb, 0x9f, 0xd6, 0xdc, 0xfc, 0x7f, 0x5a, 0x73, 0x2b, 0xf8, 0x69, 0x6d,
+ 0x8d, 0x9b, 0x8d, 0x87, 0x86, 0xf0, 0x2f, 0xdd, 0xf4, 0x75, 0xfe, 0xa8,
+ 0xfb, 0xa6, 0xf7, 0x49, 0xef, 0x8b, 0x6b, 0xeb, 0xab, 0x88, 0xe6, 0x52,
+ 0x03, 0xf2, 0x4b, 0x0f, 0x81, 0x9b, 0x09, 0x48, 0xea, 0x95, 0x10, 0x49,
+ 0xa9, 0xe4, 0xa8, 0x82, 0x88, 0xd6, 0x7d, 0x80, 0xd5, 0xe5, 0x9e, 0x20,
+ 0x92, 0xbb, 0xfe, 0x9c, 0x5e, 0x53, 0x2a, 0x0b, 0xf3, 0x6d, 0x03, 0x86,
+ 0x80, 0x76, 0x9d, 0x86, 0xf7, 0x90, 0x7d, 0x3d, 0xb8, 0x77, 0xfe, 0xc3,
+ 0x7c, 0xc1, 0xe6, 0x5d, 0x4b, 0x43, 0x1d, 0x06, 0x1c, 0xd0, 0x72, 0x99,
+ 0x82, 0xf3, 0x55, 0xa4, 0x04, 0x9a, 0x70, 0x8f, 0x73, 0x8e, 0xc8, 0x81,
+ 0x27, 0x02, 0x91, 0x3b, 0xcf, 0xd1, 0xac, 0xd5, 0x2c, 0x6b, 0xc6, 0x86,
+ 0xe9, 0x16, 0xdd, 0x06, 0xa8, 0x7c, 0x40, 0x1f, 0xd5, 0x1a, 0xa6, 0xb9,
+ 0xd8, 0xac, 0xad, 0x20, 0x64, 0x1f, 0x67, 0x10, 0x63, 0xac, 0xd3, 0xa0,
+ 0x55, 0xfd, 0xc5, 0x9a, 0xd1, 0x86, 0xfe, 0x68, 0xf4, 0xcf, 0xca, 0xe8,
+ 0xaf, 0x7f, 0x24, 0xde, 0x5a, 0x9a, 0xdd, 0x72, 0x07, 0xf5, 0x6e, 0x38,
+ 0xbf, 0x37, 0x93, 0x5f, 0xff, 0x25, 0x9c, 0x61, 0x45, 0xda, 0x74, 0xaa,
+ 0x79, 0x0d, 0x9d, 0x04, 0x35, 0x39, 0xb5, 0x82, 0x75, 0xc8, 0x67, 0x52,
+ 0x9f, 0xf9, 0x22, 0x06, 0x01, 0x1c, 0x2c, 0xc4, 0x93, 0xbc, 0x30, 0xd1,
+ 0xbe, 0x38, 0xfd, 0xee, 0x8f, 0x3a, 0xc0, 0x4f, 0x6b, 0x3f, 0x0e, 0xf9,
+ 0xa7, 0xc0, 0x7e, 0xd8, 0x4f, 0x4e, 0xbf, 0x23, 0xe6, 0xfe, 0x65, 0x02,
+ 0x6c, 0xd5, 0x07, 0xbe, 0xe2, 0xbf, 0x80, 0xb3, 0x57, 0x0d, 0x7b, 0xee,
+ 0xa5, 0xc9, 0x7d, 0x61, 0x54, 0xa1, 0xec, 0x1e, 0xf5, 0xa5, 0xc8, 0x18,
+ 0x5d, 0x2c, 0xa8, 0x6a, 0x54, 0xd1, 0x0e, 0x1a, 0x46, 0x3b, 0x80, 0x5e,
+ 0x79, 0x51, 0xc2, 0x57, 0xd0, 0x84, 0xcd, 0x43, 0xd0, 0xbc, 0xe0, 0xaf,
+ 0xc2, 0x5f, 0xc4, 0x52, 0xf7, 0xa2, 0x03, 0xb7, 0x73, 0xcc, 0x34, 0xdf,
+ 0x44, 0xad, 0x0b, 0x73, 0x1e, 0x8e, 0x22, 0x5d, 0xa2, 0x1c, 0x50, 0x1d,
+ 0xff, 0x0d, 0xfa, 0x18, 0xf0, 0xf8, 0xc8, 0xb4, 0xa2, 0xa6, 0xb2, 0x9c,
+ 0x21, 0x36, 0xe7, 0xb6, 0xd2, 0xf0, 0x77, 0x33, 0x56, 0xe1, 0x1f, 0x63,
+ 0x21, 0x00, 0x89, 0x4a, 0x4a, 0x19, 0xd2, 0x65, 0x39, 0x9b, 0x4a, 0x34,
+ 0xc2, 0x70, 0x3e, 0xef, 0xb0, 0xed, 0x24, 0x6c, 0x54, 0x0d, 0x22, 0x84,
+ 0x44, 0x28, 0xe4, 0xb3, 0x31, 0x90, 0x00, 0x09, 0x23, 0x4a, 0x7a, 0x1f,
+ 0x37, 0xba, 0x96, 0xc4, 0x13, 0xb0, 0xbe, 0x99, 0xc8, 0xfc, 0x22, 0x83,
+ 0xd7, 0x49, 0xeb, 0xf1, 0x87, 0xe2, 0x17, 0x8e, 0x78, 0x6e, 0xba, 0xc7,
+ 0x06, 0xa9, 0x6c, 0x52, 0x90, 0x4f, 0x88, 0x80, 0xdf, 0xc2, 0xa5, 0x9a,
+ 0x2b, 0xda, 0x8c, 0x34, 0xfe, 0x43, 0x2e, 0x42, 0x1a, 0x5f, 0xac, 0xcd,
+ 0x99, 0x21, 0x0a, 0x85, 0xa7, 0x2d, 0xf9, 0x9d, 0x78, 0x90, 0xbd, 0xd4,
+ 0x1a, 0xac, 0x5e, 0xf6, 0x6b, 0x14, 0xbc, 0xf0, 0xa3, 0xa4, 0x84, 0x0e,
+ 0x77, 0xf6, 0xbd, 0x36, 0x8e, 0xfc, 0xb3, 0xf8, 0xf0, 0x3e, 0xa0, 0x97,
+ 0xcc, 0x2a, 0xaf, 0x85, 0xfc, 0x2b, 0xc6, 0xdf, 0xb5, 0xe3, 0x7f, 0x16,
+ 0xc1, 0xd0, 0x62, 0x94, 0xab, 0xf8, 0x67, 0xcf, 0xfd, 0x24, 0x70, 0x75,
+ 0x9f, 0x3a, 0x27, 0x46, 0xcb, 0x7d, 0x20, 0x99, 0x7e, 0x8c, 0xb0, 0xc5,
+ 0xe0, 0x39, 0x11, 0xab, 0x7f, 0xca, 0x19, 0x42, 0xbc, 0x0e, 0x43, 0xc6,
+ 0xae, 0x69, 0x08, 0x89, 0x2c, 0x7c, 0x55, 0xce, 0x09, 0x9f, 0x7e, 0xba,
+ 0xef, 0xba, 0x7e, 0x33, 0x1e, 0x50, 0xee, 0x97, 0x56, 0x39, 0xfc, 0x84,
+ 0xb0, 0x9e, 0xbd, 0xd5, 0x00, 0x22, 0xf8, 0x14, 0xa4, 0xb1, 0x34, 0xa8,
+ 0xf0, 0x3a, 0x53, 0xaf, 0x6f, 0xac, 0x8b, 0x43, 0x85, 0x3e, 0x96, 0x22,
+ 0x4c, 0x21, 0x0e, 0xe4, 0x94, 0x40, 0x1f, 0x78, 0xf9, 0xc3, 0x88, 0xd6,
+ 0xb1, 0x2f, 0xd9, 0x0d, 0x72, 0x26, 0x18, 0xf4, 0x0d, 0x89, 0x2c, 0x6a,
+ 0x2e, 0x33, 0x40, 0x63, 0x0b, 0xe8, 0x2d, 0x34, 0x8e, 0x3d, 0xfa, 0xca,
+ 0x60, 0x6c, 0x93, 0x22, 0x5b, 0x5d, 0x4e, 0xc4, 0xfa, 0x17, 0x9b, 0xeb,
+ 0x76, 0x69, 0xfd, 0xe6, 0x50, 0x1b, 0x03, 0x4e, 0x43, 0x8f, 0x36, 0x67,
+ 0x86, 0x7d, 0x6e, 0x73, 0x34, 0x91, 0xcc, 0x86, 0xd8, 0xcc, 0x38, 0x1c,
+ 0x30, 0x43, 0x75, 0x30, 0xc0, 0x4f, 0x5e, 0xe0, 0x6c, 0x32, 0x6e, 0x17,
+ 0xb3, 0x78, 0x3a, 0x6b, 0xa8, 0x50, 0x0b, 0xa5, 0x74, 0x0c, 0x5d, 0x5c,
+ 0xef, 0x7b, 0xda, 0x78, 0xe4, 0x78, 0x52, 0x0c, 0x07, 0x3d, 0xa6, 0xc4,
+ 0x0f, 0xe2, 0x79, 0x32, 0x56, 0xa9, 0xde, 0xeb, 0x5f, 0x6c, 0xf0, 0x7d,
+ 0xe5, 0xfc, 0x68, 0xde, 0xb7, 0xd7, 0x93, 0x9f, 0xe2, 0x80, 0x06, 0x09,
+ 0xbf, 0xeb, 0xd9, 0x07, 0xc2, 0xb3, 0x0f, 0xbd, 0x91, 0xbc, 0xbc, 0x28,
+ 0xa7, 0xf7, 0x5f, 0x22, 0xe2, 0x24, 0xaf, 0xbc, 0xdc, 0xc2, 0x8f, 0x3a,
+ 0x2a, 0x73, 0xdf, 0x40, 0x18, 0xc5, 0x6c, 0x15, 0xfe, 0xfb, 0x15, 0x3d,
+ 0xae, 0x16, 0xc3, 0x7a, 0x32, 0x1a, 0x19, 0x41, 0x54, 0xcf, 0xd1, 0xaf,
+ 0x74, 0xc5, 0xc5, 0x02, 0xec, 0x52, 0x61, 0x04, 0x05, 0x9f, 0x82, 0x3f,
+ 0x47, 0x6d, 0x6b, 0x76, 0x3c, 0xf2, 0xaf, 0xaa, 0x2f, 0xcc, 0x98, 0x07,
+ 0x36, 0x45, 0x32, 0xc9, 0x22, 0x4d, 0x44, 0xe8, 0x10, 0xb3, 0x40, 0x14,
+ 0xc7, 0x1d, 0x6d, 0xc8, 0xe7, 0x17, 0xb9, 0xc0, 0x9a, 0x4e, 0x4b, 0x8b,
+ 0x49, 0x4e, 0x90, 0xe4, 0x8c, 0xcf, 0x63, 0xae, 0xf7, 0x38, 0xea, 0x25,
+ 0x72, 0x0e, 0x29, 0x36, 0x84, 0xdf, 0x5b, 0x03, 0x46, 0xe6, 0x36, 0x3c,
+ 0x12, 0x8c, 0x45, 0x91, 0x2f, 0x83, 0xe4, 0x39, 0x7d, 0xc7, 0x42, 0xc2,
+ 0x05, 0xd9, 0x1b, 0x6c, 0xe9, 0xd7, 0xc9, 0xe7, 0x43, 0x7a, 0xce, 0xb9,
+ 0xde, 0x95, 0xef, 0xdb, 0x99, 0x1b, 0x03, 0xd1, 0x0b, 0x87, 0x48, 0x4b,
+ 0x8d, 0x94, 0x63, 0xd2, 0xca, 0x2e, 0xd2, 0x3a, 0x7b, 0xf6, 0x84, 0x3f,
+ 0xc9, 0x44, 0xaa, 0xf5, 0xd8, 0x3b, 0xcf, 0xab, 0xcb, 0x62, 0x6b, 0x2d,
+ 0xa8, 0x7b, 0x10, 0x00, 0x28, 0x41, 0xca, 0x19, 0x35, 0x48, 0xe5, 0x12,
+ 0x0c, 0xba, 0x4d, 0x8d, 0x22, 0x79, 0xd5, 0xa0, 0x9e, 0xf4, 0xf9, 0x33,
+ 0x6f, 0xd2, 0xa3, 0x07, 0x2c, 0xf4, 0xae, 0x20, 0x95, 0x35, 0x76, 0xd7,
+ 0x64, 0x39, 0x36, 0x38, 0x97, 0xe4, 0xe3, 0x60, 0x10, 0x49, 0x59, 0xa4,
+ 0xf5, 0x2a, 0x3e, 0x74, 0x8c, 0xfc, 0x43, 0xf0, 0x47, 0x65, 0x9d, 0xee,
+ 0x87, 0x57, 0x32, 0xb5, 0x67, 0x22, 0xe9, 0xfb, 0x3c, 0x09, 0x66, 0xec,
+ 0x87, 0xf9, 0x9a, 0x82, 0x07, 0x97, 0xcb, 0x0a, 0xb7, 0x8f, 0x3c, 0xc6,
+ 0x4a, 0x82, 0x56, 0xa9, 0x8a, 0x9e, 0xfe, 0xe6, 0xe0, 0xed, 0xfb, 0x83,
+ 0x93, 0xd1, 0xaf, 0xeb, 0xc5, 0xbb, 0xf2, 0x35, 0x0f, 0x96, 0xa2, 0x83,
+ 0xd9, 0x76, 0x3c, 0xe8, 0xc1, 0xb0, 0x09, 0xa2, 0x0d, 0x84, 0x69, 0xd3,
+ 0xcd, 0xd5, 0xa6, 0x92, 0x61, 0x62, 0x2d, 0x4a, 0x0d, 0x89, 0xc3, 0xb9,
+ 0x71, 0x91, 0x87, 0xc4, 0xc5, 0xbd, 0xac, 0xfd, 0xb4, 0x96, 0xa6, 0xd5,
+ 0x6b, 0xfa, 0xfe, 0x14, 0x3d, 0xb3, 0xb9, 0x74, 0xc8, 0x02, 0x84, 0x44,
+ 0xb8, 0xdc, 0x02, 0x9a, 0xd8, 0x8c, 0x2b, 0x45, 0x19, 0x97, 0xcb, 0xac,
+ 0xe5, 0x74, 0x2b, 0x2f, 0x2f, 0xbd, 0xe2, 0x89, 0x6e, 0x64, 0xef, 0xf0,
+ 0xb0, 0x1f, 0x70, 0xe1, 0x53, 0x42, 0xbf, 0x77, 0xea, 0x91, 0x40, 0x46,
+ 0x27, 0xdd, 0x87, 0x4d, 0xc9, 0xa8, 0x29, 0x2f, 0x65, 0x6e, 0x71, 0xaa,
+ 0x32, 0xea, 0x98, 0x87, 0x1a, 0xa3, 0x4a, 0x2e, 0xcd, 0x89, 0xda, 0x92,
+ 0x83, 0x5c, 0x67, 0x07, 0xe3, 0xb1, 0xc5, 0x02, 0x91, 0x0c, 0x9f, 0xc0,
+ 0x18, 0x43, 0xb0, 0x0f, 0x51, 0x1f, 0x21, 0x86, 0xcb, 0x0d, 0x93, 0x5c,
+ 0x7e, 0x95, 0x1c, 0xe7, 0xcb, 0xb9, 0x39, 0x2f, 0x46, 0xe1, 0x9d, 0x52,
+ 0x7c, 0x98, 0x23, 0xb0, 0x5d, 0xc6, 0x03, 0x20, 0xb9, 0x28, 0x52, 0xd8,
+ 0x6c, 0xf0, 0x1f, 0x0a, 0x7e, 0xc6, 0x5a, 0xca, 0x92, 0x6a, 0xd4, 0xda,
+ 0x03, 0xec, 0x1f, 0x44, 0x7d, 0x3f, 0x6b, 0xe3, 0xe3, 0xf3, 0xa3, 0xe4,
+ 0xe0, 0xfd, 0xf9, 0xb7, 0x6b, 0x4c, 0xe0, 0x2e, 0xf4, 0x11, 0x3c, 0xf5,
+ 0x46, 0xe1, 0xcd, 0x24, 0x6d, 0xda, 0x16, 0x53, 0x73, 0xe9, 0x62, 0x44,
+ 0x53, 0xf2, 0xbe, 0x39, 0x5a, 0xb1, 0x4b, 0x4f, 0x47, 0x4f, 0xbb, 0xbb,
+ 0xd4, 0xdf, 0xca, 0x43, 0xba, 0x31, 0xf0, 0xce, 0x30, 0xed, 0x84, 0xe3,
+ 0xa5, 0xcd, 0x03, 0x25, 0x4e, 0x6d, 0xb9, 0x06, 0x73, 0x92, 0xd6, 0x0c,
+ 0xbb, 0x3f, 0x82, 0x84, 0x6a, 0x61, 0x61, 0x6d, 0x34, 0x1c, 0x6d, 0x2d,
+ 0x2c, 0x72, 0x9c, 0x38, 0x79, 0x39, 0x0e, 0x6a, 0x76, 0x2c, 0xad, 0xa6,
+ 0x16, 0x13, 0x20, 0xa2, 0x1f, 0x6a, 0x8a, 0x1f, 0x25, 0x99, 0x1b, 0x16,
+ 0x18, 0x3d, 0x2e, 0xa1, 0xcc, 0xe5, 0xf1, 0xc5, 0x1b, 0x8d, 0xc0, 0x79,
+ 0x8e, 0x56, 0x76, 0xb6, 0xc7, 0xc5, 0xca, 0xac, 0xc7, 0x78, 0x33, 0x0b,
+ 0xa2, 0xab, 0x24, 0x8a, 0xbc, 0xe4, 0xff, 0xc6, 0xf9, 0x9d, 0xae, 0xdc,
+ 0xaa, 0x9c, 0xb1, 0x07, 0x51, 0x5e, 0xe0, 0xe4, 0x4d, 0xae, 0x75, 0xb4,
+ 0x35, 0x78, 0x29, 0xa2, 0x9f, 0x30, 0x4f, 0x4a, 0x6c, 0x43, 0xd8, 0x97,
+ 0x74, 0x63, 0xbc, 0x99, 0x58, 0x57, 0xeb, 0x39, 0x62, 0x89, 0x18, 0x2f,
+ 0x52, 0xc4, 0x1a, 0x80, 0x0c, 0x07, 0x91, 0x0a, 0x62, 0x67, 0x77, 0x7a,
+ 0x43, 0x8b, 0x09, 0x82, 0x7a, 0x72, 0x3b, 0xed, 0xc1, 0x1d, 0xa5, 0x25,
+ 0x20, 0x77, 0xcc, 0x96, 0x22, 0x1c, 0xfe, 0xf0, 0xca, 0x6b, 0x45, 0xa8,
+ 0xc9, 0x69, 0x09, 0x33, 0x8b, 0xe4, 0x92, 0xf7, 0x41, 0x05, 0x7b, 0x90,
+ 0xa7, 0x68, 0x00, 0x4c, 0xd1, 0xd4, 0x69, 0x96, 0x2d, 0x6c, 0xd7, 0x97,
+ 0x1c, 0x35, 0x96, 0x48, 0xce, 0x31, 0xe7, 0x94, 0x7b, 0xee, 0xcc, 0x43,
+ 0xcf, 0x92, 0xd5, 0x7a, 0x58, 0x72, 0x38, 0x3c, 0x2a, 0xea, 0xad, 0x4a,
+ 0xb1, 0xdb, 0x9d, 0xe7, 0x7b, 0x9f, 0x9b, 0x8b, 0xf9, 0x1e, 0xc9, 0xdf,
+ 0x2d, 0x7c, 0x7a, 0xc6, 0x75, 0xef, 0xc7, 0x6c, 0x15, 0xab, 0x46, 0x53,
+ 0x7a, 0x05, 0x4c, 0x27, 0xa9, 0xc9, 0x8c, 0x80, 0x83, 0x4a, 0xa0, 0x2d,
+ 0x42, 0x10, 0x32, 0x43, 0x44, 0xf5, 0xf6, 0x80, 0x62, 0xe8, 0xe7, 0x49,
+ 0xd4, 0xe2, 0xcc, 0xb0, 0x91, 0xc7, 0xc3, 0x46, 0xb9, 0xa3, 0x66, 0xb3,
+ 0x83, 0xe4, 0xdd, 0xd1, 0xf9, 0xbb, 0x41, 0x32, 0x3e, 0x3f, 0x7d, 0xd7,
+ 0x83, 0xb2, 0xdb, 0x30, 0x48, 0x13, 0xd1, 0x4c, 0xd3, 0x54, 0xf8, 0x54,
+ 0xb6, 0x10, 0x38, 0x91, 0x01, 0xcd, 0x82, 0xa7, 0x8e, 0x82, 0x36, 0x7a,
+ 0xd8, 0x8d, 0x1e, 0xb5, 0xc0, 0x36, 0xe6, 0x7e, 0x58, 0xb9, 0x30, 0xde,
+ 0xf6, 0x47, 0x70, 0x08, 0xf1, 0x22, 0x2d, 0xd7, 0x8a, 0x79, 0xcc, 0xd6,
+ 0x58, 0x6c, 0xe4, 0xfa, 0x77, 0x0d, 0x7e, 0xb4, 0x24, 0xa4, 0x07, 0x99,
+ 0x96, 0x53, 0x72, 0x6b, 0x97, 0x32, 0x6c, 0x58, 0x6e, 0x4d, 0x51, 0x60,
+ 0xa8, 0x15, 0x07, 0xbc, 0xc7, 0x0e, 0x6b, 0xed, 0x01, 0xfe, 0x35, 0xba,
+ 0xd0, 0xe6, 0xc8, 0x4b, 0xe0, 0x49, 0xea, 0x72, 0x9e, 0xb1, 0x9b, 0x1f,
+ 0x8e, 0x20, 0x95, 0x4f, 0xdc, 0xe3, 0x1a, 0x20, 0xe3, 0x31, 0x34, 0x24,
+ 0x0b, 0x07, 0x49, 0xbb, 0xbc, 0x6e, 0xe1, 0x64, 0xb4, 0x0e, 0x81, 0xf7,
+ 0x25, 0x33, 0x66, 0x6a, 0x03, 0x9c, 0xcd, 0x75, 0x9d, 0x95, 0x87, 0x13,
+ 0xd9, 0x16, 0xde, 0x3b, 0x5d, 0x21, 0x43, 0x90, 0x3c, 0x51, 0xc9, 0x42,
+ 0x09, 0x2a, 0x2d, 0x20, 0x20, 0xad, 0x81, 0x82, 0x2a, 0xe1, 0xf7, 0x57,
+ 0x3f, 0x93, 0xa7, 0x34, 0x12, 0x1e, 0x76, 0xe3, 0x20, 0x31, 0x30, 0x73,
+ 0xe5, 0xbc, 0xba, 0xe7, 0x1c, 0xa1, 0x59, 0x76, 0xa5, 0x6e, 0x07, 0xdf,
+ 0xa6, 0x07, 0x4d, 0xcc, 0xef, 0x3a, 0xdd, 0xc6, 0x6a, 0x59, 0xd9, 0x17,
+ 0xf5, 0x41, 0xe5, 0x85, 0x33, 0xac, 0xd4, 0x77, 0x89, 0x94, 0x60, 0xe0,
+ 0xfc, 0xc5, 0xa1, 0xd3, 0x92, 0xe4, 0x7d, 0xc1, 0xb0, 0x42, 0xec, 0x49,
+ 0x2a, 0x90, 0xf8, 0x30, 0xb5, 0x94, 0x23, 0x30, 0x3d, 0x4a, 0xd8, 0xc2,
+ 0xbd, 0x35, 0x2d, 0xa1, 0xd0, 0xd3, 0xa2, 0x43, 0x00, 0x57, 0x38, 0x91,
+ 0x91, 0x47, 0xa0, 0x37, 0x8d, 0x0c, 0x26, 0xe1, 0x2b, 0x2e, 0xee, 0xea,
+ 0xac, 0x14, 0x18, 0x3f, 0xc1, 0x42, 0xcf, 0xfc, 0x6d, 0x63, 0x89, 0x06,
+ 0xfb, 0xc7, 0x09, 0x82, 0x86, 0xa1, 0x76, 0x5a, 0x88, 0x49, 0xb2, 0xda,
+ 0x68, 0x8e, 0x78, 0x21, 0x78, 0x46, 0xcb, 0x62, 0x46, 0xe9, 0xe1, 0x6d,
+ 0xa0, 0x20, 0xa5, 0xe4, 0xa8, 0xff, 0x96, 0x6b, 0xe1, 0x0a, 0xb5, 0x58,
+ 0xb2, 0x8d, 0xd6, 0xd2, 0x5e, 0x5d, 0x2f, 0xee, 0x03, 0x2b, 0x14, 0xef,
+ 0x68, 0xe3, 0x90, 0x8f, 0xd3, 0x2a, 0x16, 0xcf, 0x8b, 0x9c, 0xa0, 0xe4,
+ 0xca, 0x6a, 0x8b, 0xca, 0x14, 0x09, 0x82, 0x35, 0x31, 0x37, 0xa4, 0x66,
+ 0xa2, 0x46, 0x1c, 0x1c, 0xaa, 0xcb, 0x41, 0x80, 0x98, 0xa1, 0x47, 0x91,
+ 0xda, 0x40, 0x01, 0xd8, 0xb7, 0x98, 0x5a, 0xa0, 0xed, 0x28, 0x89, 0xf5,
+ 0xcb, 0x95, 0x5c, 0x10, 0xe4, 0x3a, 0xb6, 0x35, 0x32, 0x6d, 0xde, 0xae,
+ 0x7d, 0xd7, 0x5c, 0x2b, 0x9b, 0xf5, 0xba, 0xb7, 0x92, 0x5b, 0x9b, 0xde,
+ 0x41, 0xcd, 0x37, 0x54, 0x91, 0xac, 0x90, 0xf6, 0xd9, 0x84, 0xe5, 0xd0,
+ 0xfe, 0x58, 0x9d, 0x35, 0xcb, 0x45, 0x78, 0xcf, 0x1f, 0x9f, 0xb9, 0x21,
+ 0x05, 0xba, 0x9d, 0x48, 0x2d, 0x51, 0x51, 0x6f, 0x92, 0x04, 0xab, 0x63,
+ 0x37, 0xc0, 0x5d, 0xfd, 0xdd, 0xd3, 0x08, 0x45, 0x20, 0xb8, 0xdd, 0xfb,
+ 0x70, 0x60, 0xf4, 0x7a, 0x19, 0x5d, 0x8d, 0x92, 0x35, 0xa3, 0x5d, 0x6c,
+ 0xa3, 0x89, 0xb9, 0x36, 0xab, 0x92, 0x7a, 0x27, 0x7d, 0xd7, 0x10, 0xa5,
+ 0x35, 0xdb, 0xf0, 0xcc, 0x68, 0x1d, 0x8a, 0x94, 0xac, 0xd3, 0xfe, 0x6c,
+ 0xbc, 0xa7, 0x9e, 0x64, 0x74, 0x86, 0x37, 0x3f, 0x0b, 0x97, 0x2e, 0x63,
+ 0xad, 0x9a, 0xd5, 0xce, 0x8b, 0xdd, 0xd1, 0xce, 0xb3, 0xcf, 0x47, 0x3b,
+ 0xdb, 0xa3, 0x9d, 0xd6, 0xec, 0xb8, 0x0c, 0x93, 0xba, 0xd1, 0x7b, 0x03,
+ 0x75, 0x9d, 0xc5, 0x94, 0xc7, 0xd3, 0x8f, 0xce, 0xce, 0x5f, 0x98, 0xdf,
+ 0x8f, 0xe8, 0xb9, 0x11, 0x37, 0x1c, 0x0c, 0xbe, 0x31, 0x37, 0x6a, 0x4d,
+ 0x5e, 0x04, 0x71, 0x90, 0xa1, 0xcb, 0x26, 0xd2, 0xeb, 0x7e, 0x91, 0x13,
+ 0x1f, 0x29, 0x66, 0xb2, 0x9b, 0x95, 0xc4, 0xd2, 0x5c, 0xf7, 0x37, 0x3a,
+ 0x9d, 0xf1, 0x19, 0xa9, 0x50, 0x9f, 0x88, 0x1e, 0xe9, 0xe4, 0xba, 0xfd,
+ 0xfe, 0x3f, 0x60, 0xf3, 0xa9, 0x8c, 0x7c, 0x95, 0x3b, 0xef, 0x05, 0x7b,
+ 0xa6, 0xd4, 0x26, 0x81, 0xcf, 0x1d, 0x18, 0x7f, 0x5d, 0x98, 0x38, 0x41,
+ 0xfd, 0x62, 0xf1, 0xd7, 0x01, 0x5a, 0xf3, 0x2e, 0x99, 0x23, 0x0f, 0xd6,
+ 0xd1, 0x4f, 0x42, 0xc2, 0x98, 0x9a, 0x82, 0xd4, 0x45, 0xf2, 0x93, 0xd7,
+ 0x70, 0x61, 0xb1, 0x84, 0xd6, 0xe1, 0xe8, 0xb5, 0x3f, 0xfc, 0xc1, 0x49,
+ 0xa4, 0x31, 0x92, 0x5f, 0xb8, 0x33, 0xd9, 0xd3, 0x01, 0x43, 0x2d, 0x23,
+ 0xe0, 0xc5, 0x3d, 0x5e, 0xd6, 0xf6, 0xff, 0x0c, 0xdf, 0xf0, 0xcf, 0xc3,
+ 0x3f, 0x9b, 0x7f, 0xfe, 0xbc, 0xa6, 0xa7, 0x9a, 0x91, 0x19, 0xb5, 0x4c,
+ 0xc4, 0xe1, 0xde, 0x62, 0x7b, 0x06, 0x16, 0xab, 0x96, 0x05, 0x32, 0x6d,
+ 0xd6, 0xf9, 0xe1, 0x19, 0x1f, 0xc4, 0x8a, 0x63, 0xde, 0x58, 0x27, 0x09,
+ 0x22, 0xa8, 0xf5, 0x24, 0xc1, 0x19, 0xe4, 0x99, 0xf9, 0xc4, 0xd2, 0xd2,
+ 0x7b, 0x67, 0xe0, 0x52, 0x1a, 0x6e, 0x59, 0x02, 0xa4, 0x46, 0xbd, 0xbd,
+ 0x22, 0xff, 0x0a, 0x03, 0x92, 0x8c, 0xa8, 0xda, 0x90, 0x75, 0x69, 0xfe,
+ 0x01, 0x40, 0x1d, 0x0d, 0x93, 0xd8, 0xe3, 0x70, 0x6b, 0xe6, 0x34, 0x10,
+ 0x24, 0x73, 0x2e, 0x89, 0x68, 0x14, 0x41, 0xb7, 0x20, 0x3b, 0x45, 0xa1,
+ 0xdc, 0xab, 0xbc, 0xfe, 0x48, 0x8b, 0x93, 0xea, 0x1e, 0x2f, 0x43, 0x08,
+ 0xf3, 0xf9, 0xcc, 0x6a, 0x7d, 0xf7, 0x8a, 0x58, 0x66, 0xcb, 0xb6, 0x3d,
+ 0xca, 0xba, 0xdb, 0x41, 0xf7, 0x5c, 0x91, 0x6d, 0xa2, 0xa0, 0x8b, 0xf2,
+ 0x58, 0x95, 0xc5, 0xb1, 0x40, 0x3b, 0x69, 0x6a, 0x52, 0x4b, 0x79, 0x66,
+ 0x14, 0x5d, 0xcb, 0x1d, 0x1e, 0x32, 0x5f, 0xb2, 0x41, 0x3f, 0xa0, 0xdb,
+ 0x6f, 0xb3, 0x7b, 0x6b, 0x51, 0xbb, 0xbd, 0x34, 0xf7, 0xfd, 0x32, 0x28,
+ 0xa5, 0xce, 0x49, 0x2b, 0x98, 0x56, 0x66, 0x0e, 0xdc, 0x70, 0x00, 0xc0,
+ 0x2c, 0x8a, 0x00, 0x44, 0x81, 0x5e, 0xd5, 0xe8, 0x3e, 0x8b, 0xda, 0x0a,
+ 0x92, 0x97, 0xec, 0xd4, 0x51, 0xd4, 0xd0, 0xb3, 0x2b, 0xb6, 0x06, 0xe1,
+ 0xe9, 0xbf, 0x10, 0xd8, 0x54, 0x97, 0x73, 0x5b, 0x90, 0x6b, 0xa9, 0x0e,
+ 0x0d, 0x1a, 0x4c, 0x7e, 0x1e, 0x83, 0x5b, 0xf7, 0x2e, 0xd5, 0xdd, 0xed,
+ 0xd0, 0x95, 0x52, 0x7f, 0xcc, 0x99, 0xc8, 0xc3, 0x7c, 0xf1, 0x30, 0x98,
+ 0x2a, 0x6d, 0x9b, 0x42, 0xc8, 0xb7, 0xe4, 0x8a, 0xbd, 0x61, 0xea, 0xe5,
+ 0xd5, 0x15, 0x40, 0x91, 0xc2, 0x8c, 0x3c, 0xae, 0x53, 0x94, 0x8a, 0x01,
+ 0x69, 0x4e, 0x63, 0x64, 0x39, 0xa6, 0xae, 0xe4, 0x70, 0x15, 0x91, 0x22,
+ 0x71, 0x1c, 0xca, 0x7f, 0x2f, 0x70, 0xc2, 0x28, 0x39, 0x96, 0xf3, 0xed,
+ 0x14, 0x99, 0x2a, 0x1b, 0xea, 0x3c, 0xbb, 0x42, 0x90, 0x2c, 0xb0, 0xb0,
+ 0x1b, 0x9f, 0x15, 0x88, 0xf5, 0x0a, 0xd9, 0xd7, 0x93, 0xff, 0x2a, 0x12,
+ 0x90, 0x7c, 0x6c, 0x16, 0xd4, 0x90, 0xc2, 0x48, 0x0c, 0xe1, 0xca, 0x18,
+ 0x9c, 0x95, 0x05, 0x35, 0xf4, 0xb1, 0x8b, 0xba, 0xb7, 0xe6, 0x25, 0xa8,
+ 0xb1, 0xca, 0x2f, 0xe0, 0xe4, 0xa0, 0xaf, 0x2d, 0x3d, 0x19, 0xed, 0x06,
+ 0x1b, 0x5b, 0xcf, 0x86, 0x93, 0xc9, 0x64, 0x08, 0x3d, 0xe0, 0x25, 0xab,
+ 0x27, 0x5b, 0xa2, 0x1c, 0xc4, 0x15, 0xa7, 0x71, 0x26, 0xd4, 0x3e, 0x3c,
+ 0x3c, 0x14, 0x3d, 0xe6, 0xfc, 0xba, 0xa3, 0x50, 0x58, 0xb8, 0x41, 0xd1,
+ 0xa6, 0xa2, 0x4d, 0x02, 0xea, 0xeb, 0x65, 0x43, 0xbc, 0xca, 0x32, 0x43,
+ 0x85, 0xaf, 0xad, 0x8d, 0xed, 0xc0, 0x41, 0x97, 0x66, 0x47, 0x06, 0x2e,
+ 0x25, 0xd1, 0x0c, 0x1e, 0x6c, 0xcd, 0x82, 0x9b, 0x59, 0xe1, 0x45, 0x19,
+ 0xbb, 0xdb, 0x82, 0x9e, 0xe7, 0xea, 0x03, 0x37, 0xea, 0x0c, 0xeb, 0x58,
+ 0x1a, 0xaf, 0x8e, 0x82, 0xcf, 0xa6, 0xb9, 0xe4, 0x7f, 0xa5, 0xf2, 0xad,
+ 0xee, 0xd8, 0x0f, 0xec, 0x87, 0x90, 0xba, 0xbd, 0x25, 0xcf, 0x7a, 0xb7,
+ 0x24, 0x2e, 0xa7, 0x80, 0x78, 0x40, 0x94, 0x4f, 0x36, 0x0e, 0x01, 0x27,
+ 0x4d, 0xed, 0x27, 0x70, 0x26, 0x0e, 0xaf, 0x29, 0x87, 0x6b, 0x66, 0x36,
+ 0xc8, 0xcc, 0xba, 0x86, 0x14, 0xc0, 0xe4, 0xc6, 0xe3, 0x93, 0xad, 0xf3,
+ 0x93, 0x71, 0x90, 0xe9, 0x7e, 0x4f, 0x2e, 0x63, 0xb8, 0x86, 0xdb, 0x0e,
+ 0x4f, 0x26, 0x11, 0x80, 0xfe, 0xe5, 0x06, 0xb2, 0x1c, 0xce, 0x5f, 0x88,
+ 0xa2, 0x5d, 0x2d, 0x0b, 0x2d, 0x82, 0x71, 0x2e, 0xdb, 0x22, 0x2b, 0x00,
+ 0x22, 0xa2, 0xbd, 0x70, 0xb5, 0xdd, 0xe3, 0xdb, 0x83, 0x73, 0xaa, 0x6b,
+ 0x69, 0x24, 0xcf, 0xe3, 0xb2, 0x9c, 0x85, 0x9e, 0xf1, 0x5b, 0x8b, 0x49,
+ 0x83, 0xa8, 0x4d, 0x3a, 0x71, 0x8d, 0xad, 0x54, 0x53, 0xe7, 0xed, 0xab,
+ 0x95, 0xf3, 0x56, 0x91, 0x9f, 0xda, 0x28, 0xf2, 0xed, 0xd0, 0xe5, 0xf9,
+ 0xee, 0x6e, 0xec, 0x44, 0x77, 0x83, 0x09, 0x10, 0xdd, 0x91, 0x77, 0x22,
+ 0xcb, 0x85, 0xcc, 0x96, 0x75, 0xe1, 0xbb, 0x9c, 0x95, 0x57, 0xb9, 0xe1,
+ 0x6f, 0x41, 0xfe, 0x96, 0xe2, 0x12, 0x89, 0x42, 0x05, 0x6e, 0x52, 0x26,
+ 0x0e, 0xd5, 0x5e, 0x2f, 0x01, 0x01, 0xd1, 0x02, 0x2f, 0xe7, 0x43, 0x42,
+ 0x37, 0x85, 0x25, 0xaa, 0x34, 0x35, 0xd1, 0xd2, 0xc7, 0xb0, 0xb2, 0x90,
+ 0x64, 0x4c, 0x3e, 0x31, 0x06, 0xc2, 0xe4, 0x7e, 0xc4, 0x35, 0x80, 0x75,
+ 0x3b, 0xb1, 0x36, 0x6f, 0x41, 0x10, 0x5b, 0x07, 0x29, 0x45, 0xed, 0xa3,
+ 0xc5, 0x3f, 0xb2, 0xc6, 0x95, 0x7e, 0xf8, 0x67, 0xad, 0xcb, 0xe3, 0x1b,
+ 0xb2, 0xc8, 0xae, 0x82, 0x4b, 0xd7, 0x61, 0x10, 0x0d, 0xba, 0x78, 0xe4,
+ 0xae, 0xfb, 0x10, 0xb9, 0x86, 0xb8, 0x55, 0x5d, 0xa7, 0x7d, 0xfd, 0x74,
+ 0x10, 0xed, 0xad, 0x32, 0xe8, 0xb6, 0x2b, 0xa9, 0xc2, 0x26, 0x05, 0x2d,
+ 0x5c, 0x38, 0x0b, 0x3e, 0xd5, 0x19, 0xee, 0x9b, 0x23, 0xaf, 0x0b, 0x4e,
+ 0x07, 0x3e, 0x0e, 0x25, 0x1b, 0xfa, 0x3b, 0xce, 0xc7, 0xa1, 0x20, 0xd4,
+ 0x2d, 0xb5, 0xa8, 0xbf, 0x8d, 0x1b, 0x39, 0xac, 0xc5, 0x9e, 0xbb, 0xce,
+ 0x1a, 0x7c, 0x3c, 0x58, 0x07, 0xcc, 0x6c, 0x96, 0x2a, 0x01, 0x8f, 0x69,
+ 0x80, 0xfe, 0xdf, 0xd6, 0x5d, 0xa7, 0xb7, 0x51, 0xe8, 0x87, 0x70, 0xed,
+ 0xad, 0x3b, 0xc0, 0xf1, 0x2e, 0xf6, 0x34, 0x70, 0xb3, 0xe5, 0x70, 0xa5,
+ 0x54, 0x7b, 0x87, 0xf1, 0x79, 0xac, 0x6e, 0xf5, 0x7c, 0xbe, 0x3d, 0x3a,
+ 0x78, 0xd5, 0x8b, 0x5e, 0xf2, 0x29, 0x20, 0xe5, 0xad, 0xaf, 0xef, 0x22,
+ 0xe3, 0x86, 0x3e, 0x4b, 0x71, 0x93, 0xa4, 0xd8, 0x1c, 0x65, 0x54, 0x86,
+ 0xa8, 0xc9, 0x80, 0xd9, 0x82, 0xbe, 0x85, 0xbd, 0x8d, 0x6d, 0x7a, 0x3d,
+ 0x23, 0x7e, 0xf6, 0x81, 0x38, 0xac, 0x49, 0x55, 0xe6, 0x9a, 0x2a, 0x8f,
+ 0x91, 0xaf, 0xc0, 0xc8, 0xb3, 0xf2, 0xa2, 0xbc, 0xbc, 0x5c, 0x11, 0x15,
+ 0x64, 0x70, 0x60, 0xd4, 0x3e, 0x31, 0xbf, 0xac, 0x11, 0x19, 0xe9, 0xbd,
+ 0x0b, 0x06, 0x8f, 0xae, 0xcc, 0x61, 0x5b, 0x93, 0x64, 0x2c, 0x34, 0x2c,
+ 0x0d, 0xce, 0x46, 0x2b, 0x80, 0xa0, 0x06, 0x83, 0x5a, 0x78, 0xa8, 0xc6,
+ 0x67, 0x6f, 0x8c, 0x66, 0x09, 0xd9, 0x1e, 0x2d, 0x86, 0xea, 0xff, 0xf9,
+ 0xf7, 0x3f, 0xff, 0x1c, 0xe9, 0x54, 0x83, 0x56, 0x8e, 0xd7, 0x5c, 0x52,
+ 0x88, 0x2e, 0xc1, 0x0c, 0xda, 0x65, 0x7b, 0x82, 0x70, 0xa6, 0x09, 0x07,
+ 0x34, 0x9a, 0x3a, 0x9b, 0x5d, 0x7a, 0x78, 0x4b, 0xe1, 0xb5, 0x58, 0xbb,
+ 0x0f, 0xa2, 0xf1, 0x28, 0x55, 0x80, 0x73, 0xc9, 0x2e, 0x75, 0x6c, 0x40,
+ 0xb7, 0x37, 0x97, 0x2f, 0x6d, 0x61, 0xdd, 0x65, 0x27, 0x02, 0xf4, 0x30,
+ 0xd7, 0x92, 0xcd, 0xaf, 0x64, 0x62, 0x06, 0x3c, 0xb6, 0x8e, 0x4e, 0x5f,
+ 0x2a, 0x5f, 0x1b, 0x4e, 0xbd, 0x1f, 0x66, 0xf7, 0xd9, 0x85, 0x91, 0x10,
+ 0xb5, 0x02, 0x3e, 0x0c, 0xe7, 0x75, 0xf2, 0x72, 0x6e, 0x98, 0x3c, 0xef,
+ 0x81, 0xea, 0xf8, 0x96, 0x5e, 0x33, 0x46, 0xb4, 0xbc, 0x67, 0xe1, 0xab,
+ 0xb5, 0x35, 0x34, 0x97, 0xe1, 0x4a, 0x29, 0x72, 0xdb, 0x95, 0x81, 0xc2,
+ 0x92, 0xc0, 0x1d, 0x40, 0xf8, 0xa9, 0x54, 0x4e, 0xe5, 0x01, 0x71, 0x8a,
+ 0x5a, 0x38, 0x5d, 0x1a, 0xcd, 0xd1, 0x4c, 0xdd, 0xd8, 0xd7, 0xb0, 0xe9,
+ 0xc9, 0x2f, 0xc8, 0x1c, 0xc5, 0x45, 0x86, 0xf4, 0x4a, 0x14, 0x3e, 0x40,
+ 0x2f, 0x0f, 0xb1, 0xb0, 0x8c, 0xcc, 0xf1, 0x57, 0x34, 0x52, 0xcc, 0x78,
+ 0xff, 0x93, 0x82, 0x88, 0x12, 0xd2, 0x55, 0xa6, 0xcf, 0x07, 0xda, 0xa6,
+ 0xae, 0x52, 0x91, 0x06, 0xa5, 0xec, 0x34, 0xdc, 0x94, 0xcb, 0xd3, 0x5a,
+ 0xbd, 0xc6, 0x03, 0xc1, 0xa1, 0x44, 0x03, 0x77, 0xd9, 0x16, 0x1f, 0x38,
+ 0x16, 0xe5, 0x87, 0x29, 0x55, 0x43, 0x66, 0x33, 0x16, 0x71, 0x92, 0x57,
+ 0xe5, 0x46, 0x85, 0xc4, 0xed, 0x02, 0xb4, 0x68, 0x67, 0xec, 0x4c, 0x2b,
+ 0xe3, 0x21, 0x0b, 0xd4, 0xef, 0x10, 0x8d, 0xf5, 0x9e, 0x33, 0x52, 0xda,
+ 0x15, 0x22, 0x47, 0x62, 0x3e, 0x00, 0x2b, 0x1f, 0x6d, 0x20, 0x19, 0x7e,
+ 0x84, 0x5e, 0x46, 0x76, 0x05, 0x89, 0x10, 0xd9, 0xef, 0x23, 0xd9, 0xef,
+ 0xce, 0x70, 0x14, 0x6e, 0x49, 0x9e, 0x3d, 0x7d, 0xfa, 0x34, 0xe1, 0x80,
+ 0x4b, 0xb2, 0x76, 0xcc, 0xf8, 0x6c, 0xef, 0x8e, 0x0e, 0x4f, 0xdf, 0xbc,
+ 0x39, 0x7a, 0xfb, 0xea, 0xe8, 0x95, 0x3d, 0x68, 0xba, 0x16, 0xcb, 0x1d,
+ 0xc1, 0x8a, 0x28, 0x4f, 0x70, 0x9a, 0xec, 0x3c, 0xdd, 0x1e, 0xee, 0x3e,
+ 0xdd, 0x4e, 0x0c, 0x2b, 0xa6, 0xb6, 0x3c, 0x2d, 0x9d, 0xa5, 0x64, 0xdf,
+ 0x5e, 0x2f, 0x8d, 0x96, 0x46, 0xb8, 0xce, 0x0d, 0xe1, 0x6c, 0xc0, 0xf3,
+ 0x4a, 0xce, 0xe1, 0x22, 0x6b, 0xc8, 0x8e, 0x8e, 0x64, 0x06, 0x8c, 0xd6,
+ 0x12, 0x0b, 0xd2, 0xe9, 0x42, 0x96, 0xa2, 0xfc, 0x80, 0x41, 0x77, 0xb7,
+ 0xe9, 0x53, 0xa3, 0xe4, 0xb5, 0xd1, 0x3f, 0x2e, 0xcb, 0xbb, 0x84, 0xb5,
+ 0x40, 0xa3, 0x94, 0x66, 0x61, 0xa8, 0xb2, 0xfd, 0x3a, 0xbd, 0xbd, 0xc7,
+ 0x6f, 0xff, 0x13, 0x63, 0xf4, 0x4f, 0x5f, 0xb4, 0x0d, 0x4b, 0x73, 0x90,
+ 0xd1, 0x13, 0x44, 0x6b, 0x11, 0xe3, 0xe0, 0x05, 0x63, 0xb6, 0xc5, 0xbf,
+ 0x3d, 0x38, 0xa3, 0x87, 0x8d, 0x4d, 0x7e, 0xfa, 0xe3, 0x9f, 0x5c, 0x6d,
+ 0xe7, 0xcd, 0x8e, 0x26, 0x33, 0x4a, 0x09, 0x2b, 0x37, 0x55, 0x2d, 0xc2,
+ 0xa0, 0xb7, 0xc5, 0x88, 0xf3, 0x4d, 0x42, 0xbd, 0x67, 0xb0, 0x46, 0xca,
+ 0x41, 0x35, 0xc4, 0xe3, 0x8e, 0x87, 0xb2, 0x6f, 0x55, 0x2d, 0x45, 0x44,
+ 0x61, 0x3d, 0x7f, 0x55, 0xa3, 0x1b, 0xfb, 0x5d, 0xce, 0x0d, 0x7f, 0xf2,
+ 0x62, 0x8a, 0xf0, 0x77, 0xdb, 0x2f, 0xdb, 0x54, 0xcb, 0x96, 0x59, 0xa9,
+ 0x7e, 0xd8, 0xd1, 0x6a, 0x98, 0x8d, 0x45, 0x95, 0xcf, 0xd3, 0x2a, 0x9f,
+ 0xdd, 0x2b, 0x83, 0xdf, 0x72, 0xdb, 0x63, 0xce, 0x94, 0x42, 0xe8, 0xcb,
+ 0xe2, 0x0a, 0x53, 0x0e, 0x41, 0x1a, 0xa9, 0xbf, 0xc9, 0x27, 0x72, 0xa4,
+ 0x04, 0xfb, 0x8b, 0xf7, 0x95, 0xa9, 0xb5, 0x12, 0x0d, 0xa9, 0x6d, 0xff,
+ 0x5b, 0x95, 0x22, 0x5a, 0x7a, 0x4b, 0x6a, 0xee, 0xeb, 0xe3, 0x93, 0xa3,
+ 0xcd, 0xe4, 0x75, 0xd6, 0x48, 0x75, 0x93, 0x26, 0x19, 0xd3, 0x75, 0xff,
+ 0x2f, 0x50, 0xb0, 0x2c, 0x24, 0xad, 0xd4, 0x06, 0x47, 0x73, 0xc1, 0xd8,
+ 0x8c, 0x81, 0xae, 0xa1, 0x95, 0x52, 0xbc, 0x33, 0x58, 0x22, 0x85, 0xe3,
+ 0x34, 0xb5, 0x4c, 0xc3, 0x9b, 0xb2, 0xf3, 0xb1, 0xbc, 0x5b, 0x45, 0x78,
+ 0x18, 0xb5, 0x01, 0x2f, 0xcb, 0xc2, 0x4b, 0x21, 0xa0, 0x79, 0x4b, 0xde,
+ 0x33, 0xc7, 0x03, 0xf3, 0x7a, 0x31, 0x23, 0x61, 0x10, 0x43, 0x77, 0x99,
+ 0x65, 0xae, 0xa2, 0x0f, 0x9c, 0x6f, 0xac, 0x07, 0x9b, 0x88, 0xc9, 0x32,
+ 0x95, 0xd6, 0xeb, 0x11, 0xee, 0x5b, 0x25, 0x1c, 0xa5, 0x9d, 0xf0, 0x7f,
+ 0xb7, 0xbe, 0x5a, 0x81, 0x95, 0x76, 0x84, 0xf6, 0xe7, 0xf2, 0x02, 0x18,
+ 0x0a, 0x0d, 0x59, 0x35, 0x95, 0x49, 0x95, 0xce, 0x16, 0x27, 0xc4, 0xd4,
+ 0x57, 0xf0, 0x83, 0x0b, 0xc5, 0xff, 0x49, 0xba, 0xee, 0xa9, 0x0a, 0x41,
+ 0xc5, 0xdf, 0xee, 0x7e, 0xc9, 0xbc, 0x8f, 0xd6, 0xd1, 0xf6, 0x96, 0x5a,
+ 0x59, 0x01, 0x6d, 0x85, 0xb5, 0x29, 0xca, 0xd7, 0x4f, 0xdb, 0x19, 0xfb,
+ 0xfc, 0xd8, 0xb5, 0x34, 0x2e, 0x80, 0x33, 0x85, 0xcb, 0xc7, 0xea, 0x88,
+ 0xcb, 0xdf, 0x9d, 0x45, 0x17, 0xdd, 0x43, 0x8b, 0x6c, 0xf6, 0xcc, 0x68,
+ 0xea, 0xc1, 0x40, 0x6a, 0xbb, 0xee, 0xf8, 0x99, 0xd9, 0x7d, 0x44, 0x5b,
+ 0x92, 0xaf, 0xfb, 0x22, 0xa8, 0xab, 0xb2, 0xdb, 0x6f, 0x94, 0x16, 0x34,
+ 0x47, 0x0c, 0xd1, 0x50, 0x5d, 0x24, 0xda, 0xb1, 0x8f, 0x3c, 0x43, 0x87,
+ 0xd3, 0xa6, 0xca, 0x27, 0x1f, 0x01, 0x88, 0x56, 0x37, 0x4b, 0xa8, 0x74,
+ 0x69, 0xe1, 0xcf, 0xd2, 0x36, 0xfa, 0x98, 0x96, 0xa0, 0x74, 0x5c, 0xfb,
+ 0x24, 0x15, 0x89, 0x5c, 0x06, 0x84, 0xbf, 0xad, 0xb3, 0xe1, 0xd5, 0xd8,
+ 0xb3, 0x62, 0xd5, 0x34, 0x2a, 0x83, 0xc4, 0xce, 0x2e, 0x22, 0x5d, 0x01,
+ 0xcc, 0x31, 0x26, 0x00, 0x0e, 0xf2, 0xb5, 0xdd, 0x0a, 0xb4, 0xd8, 0x7a,
+ 0x95, 0x71, 0x67, 0x92, 0x91, 0x31, 0x45, 0xe7, 0x54, 0x11, 0x80, 0x34,
+ 0x5b, 0x59, 0xb2, 0x90, 0xc7, 0x48, 0xb6, 0xab, 0xfc, 0x26, 0x9a, 0x65,
+ 0xa1, 0x13, 0x9b, 0x33, 0xde, 0x05, 0xcf, 0x42, 0x53, 0x8e, 0x15, 0xeb,
+ 0x28, 0x11, 0x97, 0x74, 0x42, 0x50, 0x70, 0x76, 0xfb, 0x82, 0x13, 0x3c,
+ 0x23, 0x95, 0x95, 0x80, 0xbc, 0x0a, 0x6e, 0xb6, 0xfe, 0xad, 0xd1, 0x7d,
+ 0xf6, 0xd7, 0x6c, 0x3f, 0x0d, 0x49, 0x8a, 0xca, 0x3a, 0x9c, 0x03, 0x23,
+ 0xa3, 0x28, 0x87, 0xd1, 0x1e, 0x92, 0xac, 0xb8, 0x37, 0x2a, 0xb7, 0x6c,
+ 0xbd, 0x4d, 0x98, 0xd5, 0x6c, 0xeb, 0x5f, 0x06, 0x80, 0x36, 0xb9, 0x0e,
+ 0xab, 0xfc, 0x68, 0x4a, 0x3f, 0x0e, 0x0f, 0xf1, 0xf1, 0xe1, 0xb7, 0x18,
+ 0xef, 0x8f, 0x6b, 0xd6, 0xdd, 0xdb, 0xfd, 0xd5, 0x7e, 0xd8, 0xf4, 0x7d,
+ 0xe2, 0xb5, 0x78, 0x61, 0x2e, 0x01, 0x3e, 0xa6, 0x48, 0xd9, 0xd4, 0x21,
+ 0x6f, 0x02, 0xf2, 0x6d, 0x3a, 0xdd, 0xb2, 0x9b, 0xce, 0xa9, 0x73, 0x7d,
+ 0xdd, 0xc6, 0xcd, 0x2d, 0xb2, 0x00, 0x8a, 0xce, 0x74, 0x58, 0x5e, 0x0e,
+ 0x91, 0x21, 0x4d, 0x90, 0x79, 0x94, 0x8d, 0xe4, 0x9d, 0x3a, 0x00, 0x83,
+ 0x00, 0xfd, 0x74, 0x3a, 0x8d, 0xa9, 0xe6, 0x69, 0x2d, 0x75, 0xc4, 0xca,
+ 0xf8, 0x5a, 0x68, 0xc1, 0x9b, 0xb9, 0x2f, 0x6e, 0x79, 0xbc, 0xae, 0xbd,
+ 0x78, 0x49, 0x0c, 0x6a, 0x41, 0x44, 0xe0, 0x4f, 0x43, 0x79, 0xc4, 0x80,
+ 0xd5, 0x77, 0x2c, 0x1a, 0xf6, 0xdb, 0x9c, 0x5d, 0xb9, 0x70, 0x3e, 0x2f,
+ 0x17, 0x50, 0x59, 0x09, 0xad, 0x39, 0xf0, 0xbe, 0x68, 0x91, 0x08, 0x5f,
+ 0xfd, 0x4f, 0x47, 0xdb, 0x83, 0x20, 0x4a, 0xdf, 0xc0, 0xcc, 0x2f, 0x5c,
+ 0x8a, 0x10, 0x12, 0x24, 0x20, 0x23, 0x87, 0xb1, 0xaa, 0x5a, 0x73, 0x08,
+ 0xef, 0x49, 0x5a, 0xdb, 0x42, 0x5a, 0xe4, 0x16, 0xbb, 0xc2, 0x07, 0x97,
+ 0xd7, 0x03, 0x1a, 0x8a, 0xe0, 0x44, 0xf5, 0x6c, 0x0c, 0xe0, 0x5a, 0x32,
+ 0xb6, 0xbe, 0x1a, 0x76, 0x5b, 0x1e, 0xdb, 0xce, 0x95, 0x7e, 0xf5, 0x86,
+ 0xab, 0x56, 0xef, 0xf7, 0x34, 0xa1, 0x8f, 0xca, 0x81, 0x76, 0x3d, 0x1b,
+ 0x1a, 0xa2, 0x4a, 0x77, 0xee, 0x61, 0x46, 0x3f, 0x64, 0xa0, 0x0e, 0x45,
+ 0x8d, 0xae, 0x1f, 0xa0, 0xd9, 0xde, 0x73, 0xa2, 0x99, 0x6d, 0x2c, 0xa3,
+ 0x1d, 0xd4, 0xdc, 0x05, 0x01, 0xb6, 0xf5, 0xce, 0x52, 0x97, 0x66, 0x24,
+ 0x57, 0x48, 0x12, 0x14, 0x9a, 0xf5, 0x9d, 0x42, 0x5f, 0xb9, 0xef, 0x4d,
+ 0x2d, 0xee, 0xc9, 0xf9, 0xc5, 0xb1, 0x79, 0x4d, 0x8a, 0xfd, 0xf0, 0xad,
+ 0xd9, 0x86, 0xfd, 0xe4, 0xdf, 0xcb, 0x8c, 0x6b, 0x56, 0x1f, 0x28, 0x59,
+ 0xfd, 0xe1, 0xe0, 0xdd, 0xdb, 0xe3, 0xb7, 0xdf, 0xec, 0x3b, 0x88, 0x4e,
+ 0xc8, 0x3c, 0x01, 0xcd, 0x0f, 0xfa, 0xfd, 0x00, 0x59, 0x1f, 0x75, 0x01,
+ 0x29, 0xfb, 0xe6, 0xa3, 0x1d, 0x16, 0x92, 0x21, 0xcb, 0x66, 0xf6, 0x5d,
+ 0x56, 0x19, 0x07, 0x45, 0xd8, 0x16, 0xd5, 0xc2, 0x09, 0xa9, 0xd6, 0xc4,
+ 0x55, 0xc9, 0x6d, 0x3a, 0x23, 0x40, 0x0d, 0xc3, 0x13, 0xe4, 0xe5, 0xce,
+ 0xca, 0x56, 0x7b, 0x40, 0xe2, 0xcb, 0x19, 0xf6, 0xbf, 0xf4, 0x59, 0xc0,
+ 0xeb, 0xf2, 0x47, 0x10, 0x7c, 0x91, 0x96, 0xb0, 0x30, 0xf4, 0xf8, 0x82,
+ 0x80, 0x41, 0xa3, 0x7d, 0xd1, 0xb8, 0xb9, 0x11, 0xd5, 0xec, 0x92, 0xa7,
+ 0x22, 0xe7, 0xf8, 0xbf, 0xa3, 0x87, 0x4d, 0xf2, 0x8a, 0xf8, 0x41, 0x98,
+ 0x50, 0x93, 0x74, 0xc9, 0x27, 0x86, 0x41, 0xc9, 0xe4, 0xa7, 0xae, 0x32,
+ 0xc3, 0x92, 0x60, 0x75, 0xdc, 0x81, 0xab, 0x64, 0x35, 0xac, 0xda, 0x49,
+ 0x75, 0x46, 0xc0, 0xcf, 0x09, 0x2c, 0xf3, 0x5f, 0xba, 0x4a, 0xa2, 0xf8,
+ 0x23, 0xb3, 0xcc, 0x55, 0x25, 0x59, 0x5d, 0xe7, 0x9a, 0x75, 0x9d, 0xd9,
+ 0x22, 0x79, 0x49, 0x3a, 0xb0, 0xb1, 0xa9, 0xef, 0xbf, 0x0c, 0xf0, 0xf6,
+ 0x28, 0xe3, 0x9c, 0x9e, 0x11, 0x4a, 0x53, 0x08, 0x0b, 0x57, 0xb1, 0xcb,
+ 0xa5, 0x15, 0xc1, 0xe5, 0x0d, 0x32, 0x12, 0x0f, 0x53, 0x00, 0x89, 0x63,
+ 0x64, 0x46, 0xc2, 0x3d, 0x27, 0x5c, 0xae, 0xb2, 0x97, 0xaa, 0xc6, 0xaa,
+ 0x1c, 0x47, 0xc4, 0x29, 0xaa, 0x9e, 0xcf, 0x49, 0xeb, 0x46, 0xc7, 0xd9,
+ 0x68, 0x87, 0x2f, 0x08, 0x0c, 0x95, 0x43, 0xb5, 0xc5, 0xea, 0x01, 0x54,
+ 0x35, 0xee, 0x3b, 0x99, 0x11, 0xe5, 0x63, 0x26, 0x5e, 0x33, 0x2b, 0x7d,
+ 0xa5, 0x9b, 0x61, 0x6b, 0x96, 0xb5, 0x86, 0xe9, 0xad, 0x9a, 0x1d, 0xad,
+ 0x5d, 0xdb, 0x1a, 0xbb, 0x18, 0x27, 0x8d, 0xbe, 0xa2, 0x16, 0x29, 0x59,
+ 0x53, 0xe2, 0x3c, 0xee, 0x03, 0xe6, 0xe9, 0x40, 0x30, 0xf0, 0x42, 0x74,
+ 0x95, 0x79, 0xa5, 0xc0, 0x42, 0xad, 0x24, 0x52, 0x62, 0xdc, 0xc5, 0xf2,
+ 0x62, 0x3e, 0x7d, 0x9a, 0xbc, 0x34, 0x7f, 0x04, 0x5a, 0xeb, 0x98, 0xd3,
+ 0x73, 0x0f, 0x29, 0x2c, 0x41, 0x39, 0x43, 0x8c, 0x28, 0xcc, 0xb5, 0x42,
+ 0xb6, 0x2b, 0xd3, 0xde, 0xae, 0xd9, 0xf2, 0xbb, 0x54, 0x61, 0x42, 0xa7,
+ 0xe6, 0x50, 0x34, 0xc8, 0xe5, 0xeb, 0x01, 0x60, 0x72, 0x49, 0xa2, 0xb4,
+ 0xe6, 0x9d, 0xdd, 0xcf, 0x13, 0xaa, 0xe5, 0x78, 0xf3, 0xea, 0x69, 0x32,
+ 0xb9, 0xce, 0x26, 0x1f, 0xeb, 0xe5, 0xdc, 0x32, 0x09, 0xf1, 0x28, 0x45,
+ 0x96, 0x68, 0x9e, 0x01, 0x74, 0x86, 0x99, 0xf8, 0x2c, 0x9f, 0x50, 0x25,
+ 0xe5, 0xa0, 0x15, 0xef, 0xbb, 0xd4, 0x78, 0x9f, 0x67, 0xd6, 0xdb, 0x7b,
+ 0x18, 0xf9, 0x17, 0x9c, 0xa4, 0x14, 0xd9, 0x00, 0x43, 0x03, 0xf3, 0x79,
+ 0xea, 0xe3, 0x61, 0x0c, 0x9d, 0x95, 0x3e, 0xf0, 0xe7, 0xed, 0x30, 0x02,
+ 0x49, 0xca, 0xed, 0xd1, 0x8b, 0x1e, 0x84, 0xe4, 0x16, 0xaa, 0x19, 0x15,
+ 0x7f, 0x59, 0xd0, 0x6c, 0x18, 0x58, 0x64, 0x36, 0xd1, 0x24, 0x09, 0x59,
+ 0x4b, 0xc3, 0xa2, 0xc1, 0xc7, 0xe9, 0xc9, 0x2d, 0x7a, 0x42, 0x5a, 0x44,
+ 0x91, 0x44, 0x06, 0xb6, 0x07, 0x9f, 0x54, 0x64, 0x5d, 0xd9, 0x98, 0x2a,
+ 0xe2, 0xc9, 0x00, 0x86, 0x42, 0x40, 0x3b, 0xa2, 0x05, 0xbb, 0x7a, 0x7a,
+ 0xeb, 0x04, 0x73, 0x6d, 0xe8, 0xa4, 0x32, 0xd9, 0x03, 0xc6, 0xd0, 0xf2,
+ 0x4c, 0xa2, 0x30, 0xe0, 0x69, 0x02, 0x4d, 0x42, 0xbe, 0xcc, 0x91, 0x7e,
+ 0xb7, 0x1d, 0x35, 0xc3, 0x3a, 0x22, 0x1e, 0x41, 0xa0, 0xda, 0xec, 0xa2,
+ 0x28, 0x6f, 0x8b, 0xab, 0x8a, 0x1c, 0x4e, 0xe8, 0x14, 0x9d, 0xc6, 0x82,
+ 0x43, 0x31, 0x28, 0x58, 0x37, 0xb6, 0x31, 0x61, 0x9f, 0xd1, 0xd5, 0xe9,
+ 0x53, 0x45, 0xb2, 0x02, 0x60, 0xe4, 0x8b, 0x13, 0xc4, 0xdb, 0xa2, 0xed,
+ 0x81, 0x6c, 0xd3, 0xce, 0x68, 0xbb, 0xaf, 0x2b, 0x99, 0xd7, 0x8f, 0x4c,
+ 0xf2, 0x48, 0x5a, 0xfb, 0x63, 0xde, 0xf4, 0x0d, 0x0f, 0x4e, 0x1c, 0x31,
+ 0xbc, 0xde, 0x93, 0xce, 0x68, 0x16, 0x2a, 0x1e, 0xc1, 0x6c, 0xda, 0x1a,
+ 0xe8, 0xb1, 0x45, 0x27, 0x32, 0xdd, 0x1d, 0x89, 0x6b, 0xd1, 0xbf, 0x76,
+ 0xbb, 0x4c, 0x67, 0x7e, 0xfd, 0x18, 0xa6, 0x8b, 0xac, 0x65, 0x67, 0xe5,
+ 0x34, 0xbc, 0x79, 0x80, 0x76, 0x8e, 0x78, 0x5a, 0xf2, 0x22, 0xf3, 0xd1,
+ 0x63, 0x11, 0x86, 0xf9, 0xc3, 0x0e, 0x32, 0x78, 0x83, 0xea, 0x87, 0xca,
+ 0x6a, 0x48, 0x46, 0x90, 0xd9, 0xac, 0x40, 0x27, 0x8d, 0x6d, 0x06, 0x6c,
+ 0xb6, 0xbc, 0xae, 0x09, 0xe1, 0x13, 0xc9, 0x03, 0xc4, 0x9d, 0x14, 0x89,
+ 0xf3, 0x21, 0xf8, 0xeb, 0x68, 0x1d, 0x04, 0x18, 0x64, 0xd7, 0x5a, 0x3d,
+ 0xf8, 0x27, 0x91, 0xf4, 0xfd, 0x02, 0x0c, 0x38, 0x02, 0x32, 0xb5, 0x6b,
+ 0xa3, 0x93, 0x60, 0x72, 0x6c, 0xa2, 0xc5, 0x66, 0xe7, 0x41, 0xcc, 0x69,
+ 0x48, 0x4d, 0xea, 0x5f, 0x6b, 0xfd, 0x54, 0x4d, 0xa5, 0xc5, 0xae, 0xed,
+ 0x2a, 0x77, 0xbe, 0xd1, 0x39, 0xc6, 0xf0, 0x91, 0xf9, 0x54, 0x19, 0xcd,
+ 0x5d, 0x06, 0x68, 0x55, 0x27, 0x50, 0xab, 0x11, 0xd6, 0xa5, 0x6c, 0x07,
+ 0xdc, 0xa9, 0x6b, 0xc1, 0x1a, 0x71, 0x58, 0xc1, 0xbb, 0xc4, 0xfa, 0x09,
+ 0x51, 0xa8, 0x1f, 0x3a, 0xb0, 0x67, 0x3b, 0x1e, 0xdd, 0x52, 0x28, 0x00,
+ 0x42, 0xcb, 0xd9, 0xe9, 0xa8, 0xf5, 0xc0, 0xbc, 0x9a, 0xd1, 0xe3, 0x98,
+ 0x7b, 0x7b, 0x10, 0x9d, 0x1d, 0xb1, 0x9b, 0xcf, 0xfc, 0x2d, 0x54, 0xc1,
+ 0x17, 0x11, 0xe6, 0xfa, 0x55, 0x67, 0x61, 0x77, 0x55, 0x5c, 0x39, 0x3c,
+ 0x83, 0x7b, 0x23, 0xfd, 0x5a, 0x1f, 0xad, 0x02, 0x71, 0xd6, 0xd3, 0x8e,
+ 0xe9, 0xb1, 0xd4, 0xea, 0xa1, 0xcd, 0x8e, 0x1e, 0x45, 0x5f, 0xb6, 0xf9,
+ 0xf4, 0xea, 0xee, 0xad, 0xd0, 0x2f, 0xec, 0x61, 0x10, 0x3f, 0xaa, 0x7b,
+ 0x71, 0x6a, 0x5a, 0x95, 0xbf, 0xe3, 0x44, 0x26, 0x1f, 0x64, 0x95, 0xcf,
+ 0x81, 0x24, 0x38, 0x4a, 0x5e, 0xb9, 0x1c, 0x21, 0xb2, 0xf8, 0x0c, 0xc7,
+ 0x76, 0xa9, 0x32, 0x5d, 0xf6, 0xa4, 0xd2, 0x74, 0x4e, 0x7e, 0xb0, 0x5f,
+ 0x7b, 0x92, 0x25, 0xe5, 0x72, 0x41, 0x70, 0xab, 0xab, 0xdf, 0xb5, 0x6b,
+ 0x56, 0xb2, 0x23, 0x4c, 0x03, 0xaa, 0x12, 0xf7, 0xa4, 0x5c, 0x37, 0x09,
+ 0x69, 0x81, 0xf4, 0x7b, 0x7e, 0x12, 0x82, 0xb5, 0x55, 0xa8, 0x26, 0x23,
+ 0xee, 0x7a, 0xb3, 0x5f, 0x84, 0x89, 0x4a, 0x57, 0xa2, 0xea, 0xe8, 0xe6,
+ 0x33, 0x37, 0x79, 0x9a, 0x1c, 0xcc, 0x9a, 0xe1, 0xf8, 0xfb, 0x89, 0x76,
+ 0x3d, 0xb6, 0x94, 0x0a, 0xda, 0xa5, 0xc3, 0x4d, 0x25, 0xb0, 0x83, 0x14,
+ 0x92, 0xca, 0xab, 0xc9, 0x72, 0x0e, 0x28, 0x59, 0x30, 0x95, 0x6d, 0xbb,
+ 0x44, 0xbb, 0xe8, 0xcb, 0x1f, 0xae, 0x5f, 0x08, 0x51, 0x24, 0xd3, 0x8f,
+ 0xb5, 0x2e, 0x49, 0x4a, 0x15, 0xb8, 0xae, 0xa5, 0x45, 0xa3, 0x07, 0xec,
+ 0x88, 0x8e, 0xb1, 0xcc, 0x88, 0xc7, 0x84, 0xbc, 0xf2, 0x1f, 0xef, 0x8f,
+ 0x0f, 0x7d, 0xbd, 0xca, 0x62, 0xf5, 0xf7, 0x87, 0x7f, 0x06, 0x1e, 0xa6,
+ 0xff, 0x25, 0x69, 0xab, 0x9a, 0xdc, 0xac, 0x89, 0x88, 0xad, 0xbd, 0x2d,
+ 0x19, 0xc7, 0xbe, 0xeb, 0x51, 0xbc, 0x2d, 0x7e, 0xd9, 0x19, 0xdd, 0xd5,
+ 0x33, 0xba, 0xf7, 0x5b, 0x9f, 0xd1, 0xbd, 0x5f, 0x7a, 0x46, 0x45, 0xbe,
+ 0xc5, 0x4f, 0x68, 0xdf, 0x69, 0x0d, 0xd4, 0x79, 0x77, 0x7a, 0xc5, 0x83,
+ 0xdf, 0x4e, 0xc2, 0x18, 0x32, 0x1a, 0xc7, 0x50, 0x1c, 0x41, 0x43, 0xae,
+ 0x38, 0x8e, 0x15, 0xdb, 0xf1, 0x19, 0x56, 0x04, 0xcd, 0x41, 0x72, 0xcc,
+ 0xe0, 0xf0, 0x3e, 0x2e, 0xe5, 0x09, 0x97, 0x2b, 0x4b, 0x18, 0xc1, 0xd5,
+ 0xa8, 0x44, 0x20, 0x0d, 0xf2, 0x09, 0xe1, 0xd4, 0xcd, 0x00, 0x40, 0x85,
+ 0x20, 0x06, 0x9c, 0x10, 0xb6, 0x3b, 0xdd, 0x12, 0x51, 0x9a, 0xe4, 0x60,
+ 0x41, 0x55, 0xc7, 0x46, 0xe7, 0xb8, 0x53, 0xc7, 0x0e, 0x31, 0x58, 0x98,
+ 0xdc, 0x55, 0x02, 0x32, 0x40, 0x2b, 0x19, 0x3a, 0xd3, 0xa1, 0x81, 0x19,
+ 0x42, 0x72, 0x46, 0x9c, 0xcf, 0xf0, 0xeb, 0x05, 0xb5, 0x50, 0x31, 0x0c,
+ 0x7e, 0x15, 0x74, 0x29, 0xba, 0xb8, 0x6f, 0x22, 0x75, 0x75, 0xb4, 0x6e,
+ 0xc4, 0x06, 0x36, 0x58, 0x51, 0x35, 0xd7, 0x88, 0x21, 0xe4, 0xa6, 0x31,
+ 0xde, 0x3f, 0x02, 0x0a, 0x39, 0x43, 0xe1, 0x93, 0x8d, 0x54, 0xa0, 0xbb,
+ 0xcc, 0x15, 0x39, 0x00, 0xa5, 0xa0, 0x26, 0x28, 0x41, 0xfa, 0x5b, 0xa6,
+ 0x59, 0xa3, 0x9a, 0x93, 0x29, 0xb8, 0xbd, 0xed, 0x9a, 0xdf, 0x7c, 0x80,
+ 0x36, 0xae, 0xf0, 0xf6, 0x77, 0xa3, 0x71, 0x12, 0x03, 0xa0, 0x8f, 0x8b,
+ 0x3e, 0xa3, 0xcd, 0x11, 0xc4, 0x83, 0x20, 0x52, 0x4b, 0xda, 0x5d, 0x09,
+ 0x94, 0x0c, 0xa3, 0xa2, 0xf6, 0x35, 0xb8, 0xf1, 0xdc, 0x0f, 0x13, 0x6e,
+ 0xf6, 0xca, 0x1f, 0x51, 0xaf, 0x1e, 0x7c, 0x27, 0xa2, 0xc1, 0x90, 0xdf,
+ 0x6d, 0xa0, 0x8d, 0xcb, 0x06, 0x21, 0x3e, 0xa1, 0x2d, 0xe4, 0x73, 0x98,
+ 0xdb, 0xad, 0x23, 0xab, 0x18, 0xd9, 0xa3, 0xd1, 0x28, 0x82, 0x0f, 0x72,
+ 0x93, 0x67, 0xb7, 0xad, 0xe0, 0x86, 0x4c, 0x6c, 0x60, 0xdb, 0x8e, 0xb0,
+ 0x4b, 0xed, 0x86, 0x28, 0x64, 0x86, 0xbc, 0x20, 0x4c, 0xd2, 0x9e, 0xfa,
+ 0x1c, 0x77, 0xe4, 0xfd, 0xa7, 0x3d, 0x32, 0x7f, 0x64, 0x32, 0xd7, 0xb1,
+ 0x02, 0x5b, 0x46, 0x98, 0x76, 0x4d, 0x31, 0x06, 0xe4, 0x63, 0xaa, 0xee,
+ 0x13, 0x34, 0xc2, 0xf2, 0x24, 0x1a, 0x1d, 0x7f, 0x2e, 0xe9, 0xc8, 0x6b,
+ 0x86, 0x78, 0xce, 0x63, 0x55, 0x46, 0x17, 0x99, 0xe6, 0x71, 0x75, 0xda,
+ 0xf0, 0x88, 0x44, 0x57, 0x6d, 0xc3, 0x5c, 0x7c, 0x13, 0xf2, 0xed, 0xa1,
+ 0xaf, 0x8a, 0xb4, 0x75, 0x20, 0xe7, 0x56, 0x24, 0x97, 0x4b, 0x3b, 0xbd,
+ 0xb8, 0x46, 0x60, 0x5e, 0xe6, 0x91, 0x6b, 0xd2, 0x92, 0xe8, 0x02, 0xa3,
+ 0x01, 0xf4, 0x60, 0x90, 0xd6, 0x32, 0x2e, 0xee, 0xb5, 0xcd, 0xa9, 0xf5,
+ 0x6b, 0x5b, 0x55, 0x36, 0x30, 0xb0, 0xbd, 0x82, 0x5f, 0x07, 0x49, 0xd5,
+ 0x0a, 0x16, 0x58, 0xf8, 0x40, 0xf9, 0x40, 0xed, 0x21, 0x8e, 0x07, 0xd8,
+ 0x0d, 0x0e, 0x00, 0x97, 0x06, 0xe6, 0x7e, 0x79, 0xd1, 0x2d, 0xe6, 0xdb,
+ 0x92, 0x61, 0x44, 0xa8, 0xa3, 0xe3, 0x92, 0x32, 0x79, 0x70, 0xfc, 0x05,
+ 0x0e, 0x40, 0x10, 0x00, 0xba, 0xe8, 0x30, 0x16, 0x63, 0x8f, 0x68, 0x3f,
+ 0xba, 0x4e, 0xef, 0xee, 0x46, 0x75, 0xb6, 0x65, 0xb8, 0xb6, 0xde, 0xaa,
+ 0xeb, 0x19, 0x7d, 0xb4, 0x06, 0x9c, 0xdd, 0xca, 0x66, 0xd1, 0x77, 0xf7,
+ 0x96, 0x81, 0x44, 0x38, 0x4f, 0x52, 0x7a, 0xb5, 0x25, 0x6c, 0x5d, 0xb7,
+ 0x68, 0xee, 0xb7, 0xd6, 0xcd, 0xc1, 0x66, 0x04, 0x6f, 0xf2, 0x7b, 0xfb,
+ 0xa5, 0xcb, 0x2c, 0x19, 0x5c, 0xaa, 0x9b, 0x1d, 0xc6, 0x75, 0x25, 0x48,
+ 0x08, 0xb2, 0xbb, 0xea, 0xab, 0x95, 0x49, 0xe4, 0xac, 0xfa, 0xd1, 0x66,
+ 0x43, 0x16, 0x5b, 0x53, 0xc2, 0x4d, 0xb7, 0x04, 0xab, 0x08, 0x1d, 0x14,
+ 0xcd, 0x15, 0x5b, 0x7e, 0x8c, 0x60, 0x68, 0xf5, 0xf9, 0x81, 0xbd, 0xa5,
+ 0x51, 0xf1, 0xcd, 0xbe, 0x43, 0x6b, 0xbc, 0xbd, 0xbd, 0x1d, 0xad, 0x72,
+ 0x04, 0xff, 0xc3, 0x49, 0x05, 0xed, 0xe1, 0x4e, 0x8b, 0xe4, 0x24, 0x2f,
+ 0x96, 0x77, 0x1e, 0x64, 0x8e, 0xed, 0xaa, 0xa7, 0x51, 0xce, 0xe4, 0xfb,
+ 0x77, 0xaf, 0x07, 0x36, 0x52, 0xac, 0x68, 0x25, 0x70, 0xa5, 0xd7, 0x11,
+ 0xad, 0x2d, 0xcb, 0xc1, 0x3c, 0x8c, 0xbf, 0x7d, 0x78, 0x70, 0xf6, 0xe1,
+ 0xed, 0xd1, 0xf9, 0x87, 0x77, 0x07, 0x3f, 0x10, 0x09, 0xd9, 0x2f, 0x63,
+ 0xee, 0x2b, 0x0a, 0xb1, 0x54, 0x65, 0x69, 0xc4, 0xec, 0x1b, 0x12, 0xea,
+ 0x79, 0x01, 0xbc, 0x9a, 0x58, 0x0b, 0x3c, 0xc5, 0xe0, 0x92, 0x79, 0xd2,
+ 0x64, 0xf6, 0x3d, 0x1e, 0x24, 0x7a, 0x7d, 0xcc, 0xaa, 0x22, 0x9b, 0x8d,
+ 0xca, 0xea, 0x8a, 0xb8, 0x70, 0xeb, 0x95, 0xc8, 0xcf, 0xe8, 0x70, 0x5b,
+ 0x92, 0x26, 0x42, 0x98, 0x6e, 0x37, 0xd5, 0x25, 0x41, 0xc0, 0xac, 0xd0,
+ 0x78, 0x5a, 0x0d, 0x7f, 0x3d, 0xd6, 0x7c, 0x02, 0x01, 0xb8, 0xb8, 0x79,
+ 0xb2, 0x4a, 0xbd, 0x6b, 0x5a, 0xe6, 0x90, 0xf4, 0x4c, 0x05, 0x03, 0xc1,
+ 0xf5, 0xe3, 0x67, 0xff, 0x64, 0x1c, 0xe2, 0x1f, 0x44, 0x10, 0x25, 0xa0,
+ 0xcf, 0x95, 0x16, 0x9b, 0x03, 0x15, 0x83, 0x94, 0xb5, 0xd4, 0x2f, 0xb5,
+ 0x43, 0xc3, 0xc5, 0xfa, 0x10, 0xda, 0xea, 0xa7, 0xef, 0x7b, 0x78, 0x16,
+ 0x5a, 0x86, 0xd4, 0xc3, 0xd8, 0x5b, 0xf3, 0x33, 0x59, 0xf3, 0xb3, 0x7f,
+ 0x6c, 0xcd, 0xcf, 0x7e, 0xfd, 0x9a, 0x9f, 0xfc, 0xc6, 0x6b, 0x7e, 0x12,
+ 0x5d, 0xb3, 0xf7, 0x95, 0xe1, 0x5f, 0x68, 0xcd, 0x7f, 0x59, 0x16, 0x1f,
+ 0x87, 0x66, 0xba, 0x74, 0x0b, 0x4b, 0xc7, 0xd2, 0xba, 0xc7, 0x64, 0xb3,
+ 0xc5, 0x14, 0xf0, 0xee, 0x31, 0x6e, 0xaa, 0x00, 0x35, 0x7b, 0x0d, 0x58,
+ 0x53, 0xaf, 0x25, 0x21, 0x87, 0xf2, 0xba, 0x7a, 0xb8, 0x17, 0xca, 0x81,
+ 0x79, 0x90, 0x53, 0x01, 0x75, 0x3d, 0x21, 0x4f, 0x05, 0xa9, 0xf6, 0x6b,
+ 0x32, 0x1b, 0x1d, 0x76, 0x4d, 0x3b, 0xd8, 0xe0, 0xa4, 0xa7, 0x21, 0x70,
+ 0xd4, 0x84, 0x41, 0xe7, 0xaf, 0xb9, 0x97, 0x1f, 0xee, 0x22, 0x44, 0x01,
+ 0xa5, 0x74, 0x82, 0x3b, 0x46, 0x31, 0xac, 0x96, 0x0e, 0x9d, 0x0b, 0x3a,
+ 0x5d, 0x28, 0x33, 0xce, 0xef, 0x17, 0x34, 0x60, 0x72, 0x51, 0x99, 0x0b,
+ 0x18, 0x3e, 0xcb, 0xd9, 0x2d, 0xe5, 0x7a, 0xe8, 0x0c, 0xed, 0x10, 0x76,
+ 0xd5, 0x6c, 0x5d, 0x21, 0xfc, 0xb9, 0x1e, 0x28, 0x0c, 0x93, 0x59, 0x49,
+ 0x12, 0x67, 0xba, 0xda, 0xf8, 0xb8, 0x70, 0xed, 0x62, 0xf9, 0xbe, 0xe8,
+ 0xf4, 0x8f, 0xf5, 0xef, 0x8d, 0x8f, 0x59, 0xb6, 0x48, 0x67, 0xc0, 0x2a,
+ 0xa1, 0x64, 0x92, 0xbe, 0x8e, 0x63, 0x2d, 0xc6, 0xa8, 0xb5, 0x16, 0x03,
+ 0xaf, 0xf8, 0x75, 0xd5, 0x2c, 0xe8, 0x78, 0x27, 0xa9, 0xfc, 0x28, 0xc9,
+ 0xa7, 0x54, 0x3b, 0x1c, 0x6f, 0x40, 0xa3, 0xd9, 0x24, 0x76, 0x0a, 0xa4,
+ 0x98, 0x5c, 0xb8, 0x00, 0x41, 0xc2, 0xe3, 0x5b, 0x5c, 0x3e, 0xe4, 0x3a,
+ 0xdd, 0xe4, 0x94, 0xe6, 0xd8, 0x05, 0x71, 0xee, 0x8c, 0x00, 0x98, 0xae,
+ 0x56, 0x07, 0x0a, 0xde, 0x3c, 0x7a, 0xa2, 0xb4, 0x17, 0x20, 0xf9, 0xfd,
+ 0xd1, 0x96, 0x3b, 0x60, 0x29, 0x85, 0xa2, 0x96, 0xb6, 0x1e, 0x87, 0x67,
+ 0x1f, 0xbe, 0x3b, 0x3a, 0x3a, 0x3b, 0x7e, 0x75, 0x72, 0x24, 0x27, 0xc6,
+ 0xfe, 0xe8, 0xed, 0xf9, 0xf7, 0x27, 0xae, 0xd1, 0xaa, 0x44, 0x55, 0xba,
+ 0x0c, 0x2f, 0x61, 0x0e, 0x11, 0xcb, 0x03, 0x34, 0x16, 0x33, 0xb6, 0xf4,
+ 0xc1, 0xf1, 0x8f, 0x46, 0x6d, 0x3d, 0x1b, 0xbe, 0xff, 0x31, 0xe8, 0xe9,
+ 0xd2, 0x2a, 0xda, 0xe9, 0xda, 0x5d, 0xb6, 0x84, 0x67, 0x38, 0x2c, 0x4a,
+ 0xb7, 0x81, 0xbd, 0x39, 0x8c, 0xbf, 0xf1, 0x35, 0x48, 0x99, 0xe0, 0x85,
+ 0xd5, 0x18, 0xf8, 0x45, 0x6d, 0x9c, 0xe4, 0xa5, 0x09, 0x3e, 0xdb, 0xd6,
+ 0x7e, 0x74, 0x2b, 0x83, 0x16, 0x9d, 0x1e, 0x78, 0x1f, 0xb3, 0x7b, 0x80,
+ 0x62, 0x26, 0x2f, 0xe9, 0xcf, 0x78, 0xd7, 0xd8, 0xe4, 0xac, 0xca, 0x6f,
+ 0x48, 0x01, 0x34, 0x0f, 0x73, 0x90, 0x9c, 0x9e, 0x1d, 0xd9, 0x2e, 0xba,
+ 0x12, 0xa7, 0xa7, 0x51, 0x90, 0xc9, 0x83, 0x51, 0x63, 0xde, 0x1e, 0x04,
+ 0xb0, 0xc8, 0xbd, 0x6a, 0x47, 0xcb, 0x0d, 0xeb, 0xbc, 0x3a, 0x7a, 0x37,
+ 0x48, 0xce, 0x8e, 0xde, 0x70, 0xd9, 0xcf, 0xd1, 0xdb, 0x6f, 0xb8, 0x2d,
+ 0xa6, 0xed, 0x15, 0x3b, 0xd2, 0xd0, 0x60, 0x13, 0x6b, 0x97, 0xc1, 0x34,
+ 0x31, 0xaf, 0x23, 0x28, 0x52, 0xd7, 0xe6, 0x76, 0xfd, 0x84, 0x88, 0x44,
+ 0xbc, 0xb4, 0x97, 0xe6, 0x8f, 0x18, 0xa9, 0x8c, 0x1d, 0xf1, 0xed, 0x66,
+ 0x48, 0x2d, 0x51, 0xcb, 0x6c, 0x32, 0x92, 0x98, 0x04, 0x44, 0x0d, 0x26,
+ 0x98, 0xa1, 0x48, 0x98, 0x16, 0xa3, 0x14, 0x2a, 0x04, 0x68, 0x50, 0x9a,
+ 0xd1, 0x4b, 0x4e, 0x03, 0x5a, 0x3d, 0x8c, 0xbf, 0x1d, 0x10, 0x5b, 0x02,
+ 0xd9, 0xdd, 0xd1, 0x22, 0x5a, 0x6e, 0x8e, 0x40, 0xa0, 0x02, 0x16, 0xd8,
+ 0x98, 0x32, 0xa9, 0x55, 0xd3, 0x7c, 0x0a, 0x4c, 0x0b, 0xb8, 0xe8, 0xca,
+ 0x8a, 0x52, 0x62, 0x92, 0x64, 0xfd, 0x7f, 0x6d, 0x8d, 0xea, 0xfa, 0x7a,
+ 0x2b, 0x9f, 0x7e, 0xa8, 0xea, 0x74, 0xbd, 0x7b, 0x17, 0x79, 0xbf, 0x9e,
+ 0xd2, 0xaf, 0x93, 0xf5, 0x91, 0x7d, 0x54, 0xfe, 0x4e, 0x3f, 0x8f, 0xed,
+ 0x83, 0xde, 0x40, 0xec, 0x59, 0xd1, 0x04, 0x59, 0xed, 0x46, 0x3c, 0xcb,
+ 0x2f, 0x2a, 0xa3, 0xc0, 0xb9, 0x2e, 0x2a, 0xd2, 0x5b, 0x38, 0x59, 0x7c,
+ 0x9c, 0xd4, 0x3b, 0x3b, 0x21, 0xac, 0xbf, 0x8d, 0xa7, 0x0e, 0x34, 0xd7,
+ 0xf9, 0xec, 0xbb, 0xc3, 0xf1, 0xef, 0x76, 0x76, 0x90, 0x57, 0xbe, 0x41,
+ 0xf9, 0xbf, 0xcf, 0x9f, 0xee, 0xec, 0x6e, 0xc6, 0x14, 0xc8, 0x20, 0x51,
+ 0x0a, 0x0a, 0xa5, 0xcf, 0x9e, 0x48, 0x1a, 0x90, 0x22, 0x12, 0x3b, 0xf0,
+ 0x34, 0xa3, 0x9c, 0x4b, 0x72, 0x1e, 0xda, 0x76, 0x32, 0x48, 0x46, 0x0d,
+ 0x72, 0x59, 0xf0, 0x2b, 0x76, 0xdc, 0xaf, 0xf1, 0xfc, 0xf7, 0xd7, 0x2c,
+ 0x5f, 0xf9, 0x59, 0xf9, 0x48, 0xe9, 0xf1, 0xe6, 0x8d, 0x54, 0xaa, 0x6e,
+ 0x78, 0xcd, 0x5f, 0x57, 0x5e, 0xb7, 0xa0, 0xbb, 0x32, 0x76, 0x0e, 0xd8,
+ 0x4e, 0xcc, 0x91, 0x6c, 0x8b, 0xc0, 0x57, 0x2f, 0x33, 0x5a, 0x4b, 0x98,
+ 0x83, 0x88, 0xe3, 0xbd, 0x28, 0xb3, 0xa5, 0xbf, 0x27, 0x21, 0xda, 0xa3,
+ 0x06, 0x99, 0xa8, 0xb8, 0xa9, 0xd7, 0xcc, 0xf1, 0x5d, 0x8b, 0x8e, 0xf8,
+ 0x49, 0xcf, 0x64, 0x75, 0x91, 0xbc, 0x9c, 0x99, 0x17, 0x67, 0xf1, 0x5a,
+ 0xc6, 0x23, 0xee, 0x5b, 0xf6, 0x5d, 0x56, 0x5d, 0x64, 0x55, 0x59, 0x77,
+ 0x6a, 0xae, 0xb4, 0x57, 0x2e, 0x67, 0xb6, 0x63, 0x18, 0xce, 0x3f, 0x8b,
+ 0xb8, 0x34, 0x69, 0xd3, 0x84, 0x3a, 0x01, 0xce, 0xd1, 0x3a, 0xca, 0xbf,
+ 0xe8, 0x00, 0x50, 0xa7, 0x2e, 0xfa, 0xaf, 0x91, 0xc6, 0x97, 0xdc, 0x6d,
+ 0x35, 0x9d, 0xad, 0x53, 0xfb, 0xa4, 0xee, 0x31, 0x12, 0x5e, 0x5b, 0x37,
+ 0xb2, 0x94, 0x47, 0x23, 0xe9, 0x00, 0x00, 0x09, 0x99, 0x07, 0xfb, 0x7a,
+ 0x6d, 0x97, 0x56, 0x3f, 0xab, 0xb2, 0x0e, 0x5a, 0x4a, 0xd9, 0xe1, 0xda,
+ 0x58, 0x54, 0x7d, 0x29, 0xdb, 0xbf, 0xf1, 0x35, 0xc5, 0xdb, 0xf0, 0xe8,
+ 0xd0, 0x51, 0xe0, 0x5a, 0xed, 0x0c, 0xa7, 0x9b, 0xe5, 0xef, 0xb3, 0xbe,
+ 0x1e, 0x6d, 0x45, 0x7c, 0xc0, 0xc5, 0xf6, 0x9d, 0x3e, 0xce, 0x94, 0x06,
+ 0x8b, 0x7a, 0x13, 0x32, 0x0b, 0xa5, 0x94, 0x58, 0x6a, 0xad, 0xd1, 0x87,
+ 0x53, 0xf4, 0x8b, 0x30, 0x38, 0xce, 0xe9, 0x7f, 0x88, 0x73, 0xeb, 0xb4,
+ 0x87, 0x6c, 0xbe, 0x1f, 0x26, 0xe2, 0x8e, 0x40, 0xa9, 0xd9, 0x6d, 0x45,
+ 0x00, 0xb4, 0x85, 0x46, 0x21, 0xf8, 0x7a, 0x8c, 0xa3, 0x92, 0x29, 0x46,
+ 0xad, 0xd9, 0xa4, 0x99, 0x34, 0x88, 0xd4, 0xf4, 0xce, 0x4a, 0xa7, 0xc5,
+ 0x69, 0x81, 0xce, 0x63, 0x40, 0xef, 0xfd, 0xcb, 0x3f, 0xb8, 0x73, 0xac,
+ 0xd0, 0x4b, 0x37, 0x8a, 0x08, 0xee, 0xc4, 0xa3, 0xc1, 0xf7, 0x3a, 0x75,
+ 0x93, 0xa8, 0xc1, 0x18, 0xe2, 0x52, 0x7a, 0x69, 0xe4, 0x69, 0x16, 0xa0,
+ 0x8f, 0xa9, 0x82, 0x20, 0x60, 0x48, 0xd2, 0x3d, 0xd7, 0xeb, 0x61, 0x89,
+ 0x77, 0x89, 0xe7, 0x01, 0xce, 0xe1, 0x07, 0xe7, 0x86, 0xa4, 0xb2, 0x76,
+ 0xdd, 0x6d, 0xd4, 0xf7, 0xc5, 0x95, 0xbd, 0xe3, 0xd8, 0x02, 0xdd, 0x5f,
+ 0x51, 0xa3, 0x34, 0xed, 0x9c, 0x09, 0x42, 0xae, 0x68, 0x49, 0x68, 0x86,
+ 0x6d, 0x91, 0x06, 0x3e, 0x10, 0x94, 0x90, 0x70, 0x2b, 0x95, 0x94, 0x5b,
+ 0x4c, 0xac, 0x4f, 0xd9, 0x2d, 0x8a, 0x2d, 0xb1, 0xf3, 0xa4, 0xb3, 0x27,
+ 0xf3, 0xe2, 0x54, 0x65, 0x73, 0xa2, 0x03, 0x53, 0xe1, 0xc2, 0x0c, 0x71,
+ 0x9b, 0x4f, 0x9b, 0x6b, 0xb4, 0x36, 0x52, 0xcb, 0xa8, 0x16, 0xa0, 0x05,
+ 0x72, 0x53, 0xe7, 0xb1, 0x2a, 0xc2, 0xa8, 0x03, 0x8f, 0x77, 0x0c, 0x34,
+ 0x4d, 0x18, 0x6f, 0x8c, 0x3c, 0x75, 0xd8, 0x06, 0xf8, 0xb4, 0xb7, 0x58,
+ 0xd3, 0xb3, 0x50, 0x3b, 0xd4, 0x7f, 0xfc, 0x92, 0xda, 0x16, 0x85, 0x1e,
+ 0x7a, 0xad, 0xf7, 0x1b, 0xd9, 0x23, 0x82, 0x6b, 0x69, 0xfd, 0x23, 0x37,
+ 0x1a, 0xf8, 0x6e, 0x5d, 0x1b, 0xf4, 0x2e, 0x8b, 0xc6, 0x2f, 0x4a, 0x32,
+ 0x27, 0xf4, 0x63, 0x3e, 0x2b, 0xa3, 0x2e, 0x75, 0x23, 0xda, 0xe6, 0xfc,
+ 0xfa, 0x9b, 0x75, 0xf5, 0x93, 0x12, 0x02, 0xc5, 0x55, 0x2a, 0xbf, 0x66,
+ 0xf0, 0x99, 0xf5, 0x2b, 0x7e, 0xe8, 0x1b, 0x7d, 0x28, 0x6c, 0xca, 0x41,
+ 0x5e, 0x7b, 0xf6, 0xd2, 0x6b, 0x76, 0x62, 0xbd, 0x4f, 0x05, 0x2f, 0xdf,
+ 0x0d, 0x92, 0xbd, 0x39, 0x36, 0x65, 0xe7, 0x9b, 0x68, 0x29, 0x22, 0x80,
+ 0x2e, 0x60, 0x7d, 0x69, 0xa6, 0xcf, 0xf0, 0x4f, 0x64, 0x74, 0x81, 0x66,
+ 0xcc, 0x99, 0xb6, 0xba, 0x8e, 0xeb, 0x37, 0xdd, 0xed, 0xd5, 0xd5, 0x8d,
+ 0x68, 0xab, 0x16, 0x64, 0x23, 0x4c, 0x33, 0x05, 0x5d, 0x9f, 0xc3, 0xb5,
+ 0x49, 0x7d, 0x2e, 0x17, 0x02, 0x2e, 0x42, 0xac, 0x3a, 0xb4, 0x98, 0xae,
+ 0xf5, 0x8c, 0x1e, 0x40, 0xb7, 0xb1, 0x32, 0x48, 0x55, 0x9f, 0x2d, 0x60,
+ 0x20, 0xd9, 0xa6, 0x80, 0xde, 0x94, 0xa8, 0x52, 0x78, 0x92, 0x88, 0x8f,
+ 0xe7, 0x13, 0x5e, 0x89, 0xb3, 0x01, 0xce, 0x67, 0xdd, 0x0c, 0x23, 0x00,
+ 0xba, 0x0c, 0xb8, 0x78, 0x76, 0x7a, 0xb6, 0xb7, 0x69, 0x0b, 0xce, 0xb9,
+ 0x7a, 0x42, 0xe0, 0x26, 0x2c, 0x00, 0xa3, 0x45, 0xa2, 0x50, 0xb4, 0x6b,
+ 0xd4, 0x3d, 0x86, 0xb6, 0x25, 0xd0, 0xd3, 0x21, 0x5a, 0xf0, 0x3d, 0x38,
+ 0xfc, 0x5d, 0xd5, 0x8d, 0xd7, 0x54, 0xd2, 0x1d, 0x4b, 0x07, 0x38, 0xf9,
+ 0x59, 0x88, 0xd3, 0x53, 0x6b, 0x8a, 0x3e, 0x40, 0x6e, 0x86, 0xa8, 0xa7,
+ 0x4c, 0xda, 0x1d, 0x5a, 0xa8, 0xc3, 0x47, 0x67, 0x92, 0x9c, 0x78, 0x14,
+ 0x49, 0xe9, 0x92, 0x20, 0xaf, 0x7b, 0x10, 0x01, 0x09, 0x2d, 0x2f, 0xe5,
+ 0xfb, 0xd6, 0x66, 0x5b, 0x90, 0xb7, 0x94, 0xd8, 0x96, 0x41, 0xaa, 0x47,
+ 0xb1, 0x92, 0x66, 0x69, 0x10, 0x28, 0x8d, 0x42, 0x5a, 0x16, 0x99, 0x34,
+ 0x7f, 0x4b, 0x93, 0xb7, 0x27, 0xe3, 0x73, 0x3f, 0x86, 0x04, 0x3d, 0x2c,
+ 0x48, 0x20, 0x6c, 0x23, 0xe5, 0x79, 0x89, 0x45, 0x27, 0xc7, 0xe3, 0xf3,
+ 0x51, 0xac, 0x05, 0xc6, 0x7e, 0x32, 0xa6, 0xe2, 0x25, 0x0f, 0x78, 0x84,
+ 0xb3, 0x17, 0x19, 0x90, 0x8c, 0x83, 0x63, 0x0a, 0x40, 0x97, 0x57, 0x5e,
+ 0x56, 0x56, 0xc8, 0xa9, 0x34, 0xc5, 0x3f, 0x72, 0xde, 0xb7, 0xe4, 0x8c,
+ 0x6b, 0x88, 0xa8, 0x5e, 0x5e, 0x0c, 0x3d, 0x68, 0x4a, 0xd6, 0x77, 0xd0,
+ 0xec, 0xcc, 0x70, 0xaf, 0xb9, 0xa1, 0x3e, 0x86, 0x36, 0xe6, 0x86, 0xf0,
+ 0x13, 0x33, 0x92, 0xc0, 0x8a, 0xb6, 0xbc, 0xdd, 0x93, 0x24, 0x03, 0x84,
+ 0x31, 0xdc, 0x4c, 0xf4, 0xf4, 0xa3, 0x98, 0x8a, 0x08, 0xd1, 0xa1, 0xa3,
+ 0x34, 0xc7, 0x6c, 0x97, 0x80, 0x50, 0xcc, 0xee, 0x17, 0xc6, 0x29, 0xa5,
+ 0x2e, 0x1e, 0x51, 0x77, 0xe6, 0x3a, 0x64, 0x5b, 0x67, 0xec, 0x6f, 0xb2,
+ 0xb3, 0xee, 0x43, 0x55, 0xce, 0xa7, 0x8c, 0x2c, 0x5a, 0xb7, 0xa1, 0x45,
+ 0x19, 0x45, 0x82, 0x44, 0x0e, 0xb7, 0x52, 0x22, 0xc7, 0x48, 0xcf, 0x4e,
+ 0xb2, 0x4b, 0xae, 0x95, 0xef, 0x3b, 0xfc, 0x91, 0x33, 0xc8, 0x11, 0x27,
+ 0x1b, 0xc4, 0x00, 0xef, 0x62, 0x38, 0x4d, 0x16, 0xcb, 0xa6, 0x48, 0xde,
+ 0x1f, 0xbf, 0x3a, 0xe9, 0x42, 0x1d, 0x21, 0x2f, 0xd9, 0x2e, 0x95, 0xaa,
+ 0x84, 0x54, 0x68, 0x62, 0x47, 0x82, 0xa0, 0xcf, 0xb2, 0xc8, 0xcd, 0xf7,
+ 0x13, 0x56, 0x5d, 0x2f, 0xa9, 0x2e, 0xc6, 0x48, 0xbf, 0x6b, 0x77, 0x8d,
+ 0xad, 0xd7, 0xb6, 0x1f, 0x60, 0x3e, 0xf5, 0x8a, 0x69, 0x24, 0x5f, 0x33,
+ 0x9a, 0xd0, 0xdd, 0xaf, 0x58, 0x3c, 0x69, 0x7b, 0x24, 0x80, 0x19, 0x2d,
+ 0xd0, 0x6e, 0xe6, 0x2e, 0xda, 0x42, 0x35, 0x68, 0xa0, 0x59, 0x90, 0xf7,
+ 0x27, 0x4d, 0xbc, 0xe4, 0xba, 0x36, 0x68, 0x51, 0x59, 0x49, 0x15, 0xe9,
+ 0xc6, 0xeb, 0x77, 0xa7, 0x6f, 0x86, 0xe7, 0xa7, 0x9b, 0xc4, 0x23, 0x18,
+ 0xba, 0x3f, 0x3f, 0xa4, 0xb6, 0x0d, 0x67, 0x1d, 0xe6, 0x8b, 0xf8, 0xd9,
+ 0x36, 0x6a, 0x02, 0x6a, 0x74, 0x2d, 0x68, 0x30, 0x3d, 0x7d, 0x2b, 0x68,
+ 0x06, 0x53, 0xb0, 0x1a, 0x02, 0x3f, 0x86, 0x61, 0xa4, 0x49, 0x4a, 0xda,
+ 0xa2, 0x8d, 0x62, 0x71, 0x4a, 0x87, 0xc8, 0xed, 0x8b, 0x65, 0x7d, 0x9f,
+ 0x48, 0xb5, 0x6e, 0x4d, 0xdb, 0x64, 0x0c, 0xa9, 0x30, 0x34, 0xa0, 0xd0,
+ 0x87, 0x16, 0xf7, 0x89, 0x0a, 0x18, 0xb9, 0x48, 0xae, 0x29, 0xcd, 0xd1,
+ 0x4d, 0xab, 0xaa, 0xbc, 0xd5, 0x4b, 0x0b, 0x95, 0xf4, 0x66, 0x0f, 0xcd,
+ 0xd4, 0x69, 0x93, 0xaa, 0xfb, 0x5e, 0xac, 0x1c, 0x81, 0x7f, 0xd3, 0xfe,
+ 0xeb, 0x2b, 0x75, 0xbf, 0xa7, 0x6d, 0x04, 0x13, 0x4d, 0xa7, 0x1f, 0x36,
+ 0xd5, 0x92, 0x2a, 0x74, 0x7b, 0x32, 0xf8, 0x4e, 0x80, 0x87, 0xd9, 0x49,
+ 0xc1, 0x1f, 0x08, 0x44, 0x25, 0xc1, 0x19, 0xa1, 0x69, 0x9e, 0x2d, 0x78,
+ 0xd4, 0x26, 0x4e, 0x7f, 0x08, 0x8e, 0xaf, 0x20, 0x57, 0x93, 0x46, 0x3f,
+ 0x9b, 0xb9, 0x24, 0x7c, 0xc1, 0x3f, 0xcd, 0x1b, 0xee, 0x63, 0xaa, 0xf9,
+ 0x37, 0xc0, 0xa5, 0xe3, 0x3e, 0xca, 0xe9, 0x7d, 0x68, 0x77, 0x29, 0xe6,
+ 0x54, 0x4e, 0x78, 0x1f, 0xd3, 0xe5, 0x04, 0xbb, 0x44, 0xe1, 0x3e, 0xea,
+ 0x92, 0x7a, 0xc1, 0x30, 0xb8, 0x0a, 0x9a, 0x41, 0x43, 0xbb, 0xea, 0x03,
+ 0xf6, 0xde, 0x74, 0x55, 0x2c, 0x7e, 0xca, 0xb6, 0x7e, 0x23, 0x3d, 0x92,
+ 0x72, 0xfa, 0x6c, 0xdb, 0xb2, 0x8e, 0xbd, 0x49, 0x01, 0x25, 0xd7, 0x78,
+ 0x3a, 0x94, 0x55, 0xd4, 0x82, 0x00, 0xe0, 0xeb, 0x12, 0xf4, 0x27, 0x9c,
+ 0x50, 0x62, 0x5f, 0x44, 0xdc, 0xbf, 0x4e, 0x6b, 0x23, 0x93, 0xda, 0x23,
+ 0x6e, 0xae, 0xf0, 0x4d, 0x2f, 0xb5, 0x4c, 0xc5, 0xdb, 0xbd, 0x93, 0x81,
+ 0xb7, 0x1b, 0x3d, 0x3b, 0xa7, 0xa9, 0xef, 0x22, 0xd4, 0x38, 0x33, 0xc3,
+ 0xa3, 0xb9, 0x88, 0x28, 0xa0, 0x58, 0x52, 0xc2, 0x7f, 0x4a, 0x4d, 0xc3,
+ 0x6f, 0x62, 0x92, 0x29, 0xb5, 0x9d, 0x31, 0x9b, 0x44, 0x3f, 0x9a, 0x6c,
+ 0x68, 0x1d, 0xad, 0x2d, 0xec, 0x3a, 0x91, 0x5f, 0xed, 0xdb, 0x4a, 0x5f,
+ 0x12, 0x68, 0x9d, 0xe1, 0xf6, 0x7e, 0xfc, 0x31, 0x69, 0xb7, 0xb1, 0xde,
+ 0x1c, 0x84, 0x15, 0x26, 0x7e, 0x89, 0xcf, 0xb4, 0xf4, 0xa7, 0x1b, 0x54,
+ 0x29, 0x32, 0xcf, 0x19, 0x6d, 0x00, 0x05, 0x11, 0x23, 0x0b, 0xbb, 0xd1,
+ 0x94, 0xc6, 0xf4, 0xbb, 0xd6, 0xb2, 0x35, 0x24, 0x6f, 0xb8, 0xec, 0x0d,
+ 0xf2, 0x93, 0xa1, 0x64, 0x36, 0x4c, 0xf8, 0x81, 0xb4, 0xd5, 0xbc, 0x0b,
+ 0x0e, 0xa8, 0x20, 0x21, 0xdd, 0x27, 0x56, 0xed, 0x3c, 0x33, 0xd7, 0x14,
+ 0x58, 0x10, 0x94, 0xf7, 0x07, 0x5b, 0x6d, 0x33, 0x90, 0x0a, 0xd6, 0x85,
+ 0xdb, 0x9e, 0x7b, 0x74, 0x70, 0x36, 0xec, 0xa4, 0xca, 0xc4, 0xd1, 0x50,
+ 0xdb, 0x46, 0x05, 0x41, 0x08, 0x99, 0x20, 0x90, 0x66, 0x9c, 0xb7, 0xc6,
+ 0x4e, 0xd5, 0xd4, 0x3b, 0x31, 0x0e, 0xc1, 0xb2, 0xb3, 0x67, 0x5c, 0xd9,
+ 0x12, 0xa8, 0xee, 0xb7, 0x25, 0x29, 0x4f, 0x84, 0x28, 0x02, 0xfc, 0xbd,
+ 0x92, 0x3d, 0x5a, 0xe8, 0xc2, 0xac, 0x57, 0xcd, 0x1f, 0xf4, 0xdc, 0x8e,
+ 0xc0, 0x90, 0x36, 0x1a, 0x46, 0x5c, 0x10, 0x8b, 0x7f, 0xaa, 0x30, 0xc1,
+ 0xc6, 0x10, 0x5a, 0x32, 0xe5, 0xc2, 0x69, 0x7f, 0x37, 0x72, 0x15, 0x6b,
+ 0x88, 0x9c, 0x95, 0x69, 0x94, 0x4b, 0xcc, 0x61, 0xb8, 0x04, 0xb0, 0xdd,
+ 0xee, 0xc8, 0x32, 0xf4, 0x10, 0x89, 0x19, 0x0b, 0xf4, 0xc7, 0x8e, 0x2d,
+ 0x63, 0x8f, 0x0e, 0xf1, 0x58, 0xdd, 0x97, 0x6b, 0xe2, 0x42, 0x66, 0xd2,
+ 0x8b, 0xc6, 0x27, 0x18, 0xee, 0xd7, 0xcb, 0x56, 0x5a, 0x4b, 0xce, 0x1d,
+ 0x5c, 0x09, 0x8e, 0x65, 0x10, 0x31, 0x76, 0xd8, 0xa5, 0x30, 0x2d, 0x03,
+ 0x37, 0xac, 0xad, 0xf9, 0xe5, 0x93, 0x40, 0xd8, 0x27, 0x32, 0x72, 0x2b,
+ 0x19, 0x28, 0x50, 0x94, 0xeb, 0x64, 0x6f, 0x7b, 0xc7, 0x58, 0x4a, 0xdb,
+ 0xbb, 0xe8, 0xcd, 0xbd, 0xb7, 0xbd, 0x67, 0xb1, 0x23, 0x5a, 0x67, 0x44,
+ 0x2a, 0x68, 0xc8, 0x17, 0xc2, 0x16, 0xa8, 0x39, 0x48, 0x77, 0x77, 0x61,
+ 0xd3, 0x8f, 0xac, 0x5d, 0x44, 0x31, 0xb4, 0x95, 0x9c, 0xe1, 0x54, 0x1d,
+ 0x21, 0x11, 0xac, 0x0b, 0xfb, 0x7c, 0x72, 0xdd, 0x34, 0x55, 0x20, 0x01,
+ 0x6e, 0x65, 0xd4, 0xd7, 0x14, 0xac, 0xe9, 0x22, 0xca, 0xc9, 0x86, 0xfb,
+ 0x08, 0x3c, 0xd8, 0x44, 0xa2, 0x8a, 0x00, 0x59, 0x99, 0x95, 0xde, 0xf5,
+ 0x15, 0x1f, 0xb8, 0x4e, 0x88, 0x16, 0xf1, 0x55, 0x05, 0x8d, 0xd6, 0xe0,
+ 0x68, 0xa7, 0xdb, 0x7d, 0xca, 0xf6, 0x30, 0xcc, 0x4d, 0x44, 0x0c, 0x4e,
+ 0x32, 0xff, 0x42, 0x93, 0xf3, 0xf8, 0x5f, 0x7b, 0x51, 0x63, 0x5d, 0xf0,
+ 0x64, 0xc8, 0x03, 0x6a, 0x55, 0x38, 0xa7, 0xc3, 0xb5, 0xa2, 0xba, 0xec,
+ 0x07, 0xe1, 0xe7, 0x63, 0x6e, 0x7a, 0x76, 0x0a, 0x38, 0x27, 0x41, 0x9d,
+ 0xcd, 0x04, 0x9a, 0x64, 0xd9, 0xca, 0x71, 0x1a, 0x02, 0x71, 0x6a, 0xa8,
+ 0x0b, 0x7a, 0x29, 0x7f, 0x09, 0xbc, 0x9f, 0xe8, 0x01, 0x0d, 0x5d, 0x1b,
+ 0x7d, 0x7c, 0x36, 0xad, 0x47, 0x06, 0x36, 0x24, 0x8d, 0x61, 0x89, 0x22,
+ 0xaa, 0xcf, 0x74, 0xc9, 0xf5, 0x39, 0x90, 0xfa, 0xdd, 0x7b, 0xae, 0x75,
+ 0xe9, 0xf4, 0xee, 0xa8, 0xea, 0x96, 0xc1, 0xf8, 0x9a, 0xb4, 0x61, 0x51,
+ 0x1d, 0x9c, 0x8e, 0x6d, 0x1e, 0x8b, 0x09, 0x84, 0x5a, 0xb3, 0xed, 0xd1,
+ 0xa4, 0x5c, 0xdd, 0xf7, 0x32, 0xc7, 0xce, 0x74, 0x92, 0x83, 0x06, 0xcd,
+ 0xba, 0xe1, 0x59, 0x0b, 0x8d, 0x5e, 0x22, 0xc5, 0x80, 0x49, 0x41, 0x5b,
+ 0x8a, 0xb6, 0x46, 0x9a, 0xd4, 0xd9, 0x9a, 0x29, 0xc7, 0x56, 0x80, 0xbf,
+ 0xad, 0xa9, 0x1f, 0xb1, 0x9c, 0x5d, 0xce, 0xfb, 0xc0, 0x86, 0xb6, 0x17,
+ 0xba, 0x98, 0x11, 0x06, 0x26, 0xec, 0x08, 0x69, 0xd4, 0xfd, 0x64, 0x80,
+ 0xbf, 0x3d, 0xdd, 0x7e, 0xc1, 0xec, 0x74, 0x7c, 0x74, 0xfe, 0xba, 0xeb,
+ 0x1e, 0xac, 0x0c, 0x6b, 0xf3, 0x9f, 0xc3, 0x2c, 0xad, 0xae, 0x8d, 0xb9,
+ 0x42, 0x70, 0x56, 0x43, 0x6a, 0x91, 0x32, 0xdc, 0xde, 0x8e, 0x65, 0x82,
+ 0x7c, 0x42, 0x04, 0x8f, 0xbd, 0x8e, 0x4a, 0x4e, 0x46, 0xc2, 0x90, 0xc8,
+ 0xdd, 0x0f, 0xb6, 0xdc, 0x66, 0x2f, 0x8b, 0xc7, 0x2f, 0x8f, 0xb7, 0x52,
+ 0x00, 0xb4, 0x34, 0x11, 0xd7, 0x54, 0x07, 0xab, 0xd4, 0x33, 0xda, 0xbb,
+ 0x5a, 0x93, 0x83, 0xf8, 0xdd, 0x60, 0xc3, 0xa4, 0xb9, 0xdf, 0x4c, 0xb8,
+ 0xd1, 0x27, 0x77, 0xe4, 0x6b, 0x20, 0x6c, 0x60, 0x96, 0x44, 0xb1, 0x0d,
+ 0x6a, 0xa9, 0xee, 0xac, 0x32, 0x42, 0xc5, 0x63, 0x5d, 0x52, 0x3a, 0x9b,
+ 0x3d, 0x8c, 0xec, 0x07, 0x12, 0x54, 0x93, 0x85, 0xd4, 0xf9, 0xf2, 0xbf,
+ 0xe9, 0x7e, 0x6f, 0x65, 0xe4, 0xee, 0x3e, 0x8d, 0x10, 0x0e, 0x5a, 0xc0,
+ 0xaf, 0x24, 0x9c, 0xd3, 0xb7, 0xd8, 0x25, 0xc8, 0xfd, 0xb7, 0xb4, 0x9a,
+ 0x34, 0x92, 0xfb, 0xad, 0x0d, 0xb7, 0x7f, 0xf1, 0x5a, 0x88, 0xda, 0xa3,
+ 0x55, 0xf8, 0xa0, 0xf6, 0xad, 0x21, 0x94, 0x76, 0xf4, 0x43, 0x89, 0x2f,
+ 0xe6, 0x07, 0x1f, 0xba, 0x82, 0xd1, 0xeb, 0x4a, 0x57, 0x55, 0x6a, 0x2e,
+ 0xcf, 0x7c, 0x41, 0xb0, 0x29, 0x86, 0x3b, 0x5d, 0x95, 0x56, 0x54, 0x1a,
+ 0xc2, 0x42, 0xb8, 0x00, 0x24, 0x1d, 0x1d, 0x57, 0x63, 0xb8, 0x90, 0xbf,
+ 0x43, 0xf4, 0xa1, 0x4b, 0x32, 0x9b, 0xe8, 0xac, 0x35, 0x1a, 0x80, 0x51,
+ 0xfb, 0x53, 0xc7, 0x0f, 0xca, 0xdd, 0xe0, 0x9a, 0x79, 0x77, 0x78, 0x76,
+ 0x9e, 0x9c, 0x9f, 0xfa, 0x3e, 0x05, 0xae, 0x81, 0x27, 0xeb, 0x19, 0x2d,
+ 0xa3, 0xa2, 0x52, 0xde, 0x4e, 0xd4, 0x35, 0x0b, 0x11, 0x83, 0x9c, 0x2f,
+ 0x2c, 0xe4, 0x55, 0x02, 0xa3, 0x10, 0x48, 0xc2, 0x3e, 0xb5, 0x22, 0x95,
+ 0x6d, 0xa0, 0x5e, 0xd7, 0xe7, 0xcf, 0x0a, 0xac, 0xcd, 0x8d, 0xf6, 0xd4,
+ 0x58, 0xce, 0xec, 0x4e, 0x78, 0x7a, 0xb1, 0x56, 0x86, 0x9a, 0x61, 0x6a,
+ 0x6b, 0x1c, 0x39, 0x1d, 0x84, 0xe6, 0x72, 0x93, 0xce, 0xf2, 0xa9, 0x47,
+ 0x95, 0xd0, 0xeb, 0x58, 0x70, 0x2b, 0x02, 0x4e, 0x84, 0x61, 0x75, 0x55,
+ 0x1f, 0x16, 0x6b, 0x32, 0x42, 0x33, 0x5a, 0xc1, 0xe0, 0x17, 0xef, 0x1a,
+ 0x83, 0xec, 0x80, 0xda, 0x70, 0x3f, 0xd0, 0x7a, 0x90, 0x9e, 0x61, 0xb8,
+ 0x7b, 0x1a, 0xef, 0x3a, 0x53, 0x3a, 0x19, 0xd6, 0x99, 0xc6, 0xa8, 0x8d,
+ 0x67, 0xf3, 0xa2, 0x87, 0x5f, 0x7f, 0xed, 0xd9, 0x1b, 0xb8, 0x66, 0x4a,
+ 0xa4, 0x5d, 0xcd, 0xa5, 0x59, 0x24, 0xbc, 0x6d, 0x08, 0xe9, 0x77, 0xb1,
+ 0xa6, 0xb2, 0x45, 0x96, 0xb6, 0xea, 0x3c, 0xda, 0xc2, 0xd8, 0x7a, 0x69,
+ 0xe2, 0xa7, 0x21, 0xea, 0x69, 0x14, 0x57, 0x17, 0xfb, 0xd1, 0x70, 0xf8,
+ 0x35, 0x28, 0x31, 0x90, 0x6d, 0x96, 0xd7, 0x55, 0x26, 0xe8, 0x1d, 0x1b,
+ 0x58, 0x4e, 0xcc, 0x06, 0xec, 0x81, 0xb3, 0xc2, 0xa5, 0x74, 0x60, 0x1d,
+ 0x3c, 0x78, 0x19, 0xd7, 0x81, 0x5b, 0xf3, 0x28, 0xec, 0xfb, 0x9c, 0xf1,
+ 0xab, 0x16, 0xdd, 0xf7, 0xef, 0x5e, 0xff, 0x49, 0xb7, 0x66, 0x53, 0xa7,
+ 0x17, 0xb4, 0x96, 0x6b, 0x4f, 0xf7, 0x22, 0xf3, 0x72, 0x61, 0x05, 0x55,
+ 0xa6, 0x45, 0x75, 0xfe, 0x97, 0xe0, 0x42, 0x84, 0xf5, 0xdc, 0x8c, 0x8e,
+ 0x9e, 0x6c, 0x50, 0xa0, 0xd9, 0x3c, 0x37, 0x16, 0xbf, 0xc6, 0xde, 0xe8,
+ 0x29, 0x7c, 0x82, 0xaf, 0x0f, 0x9f, 0xee, 0xed, 0xee, 0x6c, 0x8e, 0x92,
+ 0x8d, 0xce, 0xed, 0xb6, 0xf9, 0xd9, 0xa3, 0xa8, 0x6d, 0xf7, 0x3b, 0xbb,
+ 0x5b, 0x10, 0xeb, 0x6e, 0x1c, 0xfd, 0x78, 0xf6, 0x36, 0x58, 0xa3, 0x59,
+ 0x53, 0x90, 0x4a, 0xd0, 0xb7, 0x46, 0xa7, 0x37, 0xb7, 0xc6, 0xd7, 0xa4,
+ 0x5e, 0x42, 0x34, 0x49, 0x22, 0xc1, 0xfa, 0xd7, 0x55, 0x4e, 0xc6, 0xde,
+ 0x1a, 0x91, 0x64, 0xed, 0xa4, 0x2c, 0xa6, 0xc6, 0x58, 0x3a, 0x25, 0xd8,
+ 0xcf, 0x6c, 0xcd, 0x9c, 0x82, 0x07, 0x57, 0xd7, 0x2f, 0xd6, 0xdf, 0x0c,
+ 0x70, 0x54, 0x8a, 0x30, 0xc7, 0xeb, 0x0d, 0x7e, 0x08, 0x84, 0x75, 0x5b,
+ 0x63, 0x4f, 0xed, 0xcc, 0x39, 0xc0, 0x41, 0xfe, 0x89, 0xf6, 0x69, 0xbb,
+ 0x43, 0x8f, 0x33, 0xf8, 0x3c, 0x5f, 0x22, 0xa4, 0xf3, 0xc8, 0x68, 0x20,
+ 0xde, 0xd8, 0xd0, 0xc8, 0xd6, 0xa6, 0xd7, 0xba, 0x1b, 0x78, 0xc0, 0x1c,
+ 0xed, 0x1b, 0xc5, 0x8b, 0xe5, 0xf1, 0x98, 0x33, 0xae, 0x73, 0x5b, 0x17,
+ 0x22, 0xf8, 0x0c, 0x94, 0xf6, 0x4e, 0xf8, 0x32, 0x83, 0x36, 0x20, 0x6a,
+ 0x2c, 0x0a, 0x84, 0x24, 0x1a, 0xee, 0xe0, 0x59, 0xb4, 0xb1, 0xa3, 0x21,
+ 0xad, 0x20, 0x58, 0xb3, 0x3b, 0xca, 0x44, 0x26, 0x83, 0xea, 0x59, 0x68,
+ 0x0a, 0x1c, 0xc8, 0x52, 0xd4, 0xf2, 0x61, 0x47, 0xab, 0x6a, 0x5b, 0x50,
+ 0x2a, 0x25, 0x65, 0x74, 0xe0, 0x05, 0xe2, 0x5c, 0x1c, 0x2e, 0x26, 0x46,
+ 0x39, 0x2a, 0xc7, 0x04, 0x13, 0xcf, 0x26, 0xfa, 0xd8, 0x53, 0x64, 0x4e,
+ 0x42, 0x6d, 0x08, 0xc5, 0xe1, 0xa4, 0x50, 0x30, 0xae, 0x37, 0xd0, 0xe6,
+ 0x05, 0xe7, 0xfa, 0xa2, 0x73, 0x79, 0xb3, 0x22, 0x1c, 0xd7, 0xf5, 0xc3,
+ 0xd8, 0xe0, 0x5c, 0x8b, 0xf9, 0x9e, 0x7e, 0x1e, 0x61, 0xbe, 0xb7, 0xa7,
+ 0xe7, 0x47, 0xfb, 0x82, 0x1a, 0xa8, 0xf0, 0x5a, 0xb9, 0x40, 0xdc, 0x70,
+ 0x72, 0x26, 0x95, 0x3b, 0x15, 0x52, 0x76, 0x4b, 0x4a, 0xa1, 0xee, 0xfa,
+ 0x20, 0x76, 0xe4, 0x51, 0x25, 0x41, 0xc7, 0x84, 0x63, 0x1d, 0x4d, 0x90,
+ 0xbe, 0xa7, 0x09, 0x7b, 0x80, 0x0f, 0x11, 0x3b, 0x9a, 0xf9, 0x89, 0xf6,
+ 0x3f, 0x04, 0x5b, 0x02, 0x22, 0x0f, 0x40, 0x6e, 0x58, 0x3f, 0x0c, 0x58,
+ 0x48, 0xe2, 0xe7, 0x70, 0x3a, 0xd8, 0x10, 0xc3, 0x84, 0x1a, 0x34, 0x87,
+ 0x7d, 0x85, 0x11, 0xa3, 0xa6, 0xe0, 0x0c, 0x77, 0x30, 0x55, 0x60, 0xe3,
+ 0xcb, 0x58, 0xab, 0x47, 0x4f, 0x25, 0x73, 0xa1, 0xf4, 0xee, 0xa1, 0x12,
+ 0x0f, 0x05, 0xb9, 0xc2, 0x7b, 0x00, 0xc5, 0xd8, 0x19, 0x6e, 0xcf, 0x93,
+ 0xf2, 0x89, 0x39, 0x47, 0xea, 0xab, 0x20, 0xd7, 0x8a, 0x35, 0xe1, 0x05,
+ 0x16, 0x2b, 0x4c, 0xe0, 0x80, 0x08, 0x6c, 0xfb, 0x06, 0x9d, 0xd7, 0x49,
+ 0xcd, 0x0b, 0xa4, 0xae, 0x65, 0x28, 0x4d, 0xe4, 0xe2, 0x4c, 0xee, 0x2c,
+ 0x1d, 0x07, 0x77, 0xf6, 0x61, 0x4b, 0xc4, 0x08, 0xa4, 0xab, 0x6f, 0x62,
+ 0x14, 0x4d, 0xbf, 0x06, 0x87, 0x11, 0x38, 0xe6, 0x88, 0x94, 0xc0, 0x8c,
+ 0x36, 0x1f, 0x79, 0xba, 0xdd, 0xe3, 0xd0, 0x61, 0x13, 0x8d, 0x96, 0xdc,
+ 0xc9, 0xf4, 0x18, 0xee, 0xe0, 0x62, 0x95, 0xb8, 0xfb, 0xb2, 0x50, 0x84,
+ 0xc8, 0x4f, 0x17, 0x64, 0x9d, 0x0f, 0x64, 0x8f, 0x56, 0x66, 0xf2, 0xbe,
+ 0x91, 0x8d, 0xc1, 0x43, 0x79, 0xa1, 0x49, 0x9a, 0xac, 0xd9, 0x03, 0x41,
+ 0x6a, 0xa6, 0x38, 0xd8, 0xe6, 0x64, 0x96, 0xe8, 0x30, 0x6d, 0xd3, 0x3f,
+ 0x42, 0x67, 0x33, 0xf9, 0xe9, 0x46, 0x49, 0xe2, 0x43, 0x1a, 0x52, 0x2c,
+ 0x8b, 0x4e, 0x85, 0x6c, 0x0c, 0x51, 0x1d, 0x6e, 0xe7, 0x0b, 0x42, 0xb0,
+ 0x48, 0xfe, 0x52, 0x5e, 0x88, 0x27, 0x92, 0xf4, 0xd4, 0x18, 0x38, 0xd8,
+ 0x25, 0xea, 0x47, 0x96, 0x86, 0xcb, 0xa6, 0x4b, 0x8e, 0x2e, 0xd0, 0x84,
+ 0xa4, 0x16, 0x81, 0xbb, 0xc9, 0x53, 0xc8, 0x2f, 0xb9, 0xe2, 0x16, 0x46,
+ 0x48, 0x86, 0x56, 0x28, 0x86, 0xb0, 0xde, 0x7f, 0xb7, 0x0b, 0x01, 0x95,
+ 0x4e, 0xc8, 0x29, 0x68, 0x06, 0x17, 0x70, 0x10, 0x06, 0xf1, 0x74, 0x45,
+ 0x1b, 0xe9, 0xa4, 0x59, 0x0a, 0xe1, 0xbb, 0xb3, 0x2b, 0x35, 0x4e, 0x60,
+ 0xde, 0x45, 0x6b, 0x09, 0x64, 0xe2, 0x4d, 0x0c, 0xe7, 0xa5, 0x93, 0x7b,
+ 0xd5, 0x17, 0xdc, 0xe5, 0x2a, 0x18, 0xb1, 0xae, 0x11, 0x45, 0x58, 0xe5,
+ 0xac, 0x93, 0xa0, 0x78, 0x7f, 0x5e, 0xff, 0xfa, 0x06, 0x50, 0x8f, 0xb7,
+ 0xab, 0xfd, 0x36, 0x7e, 0x1c, 0x79, 0x51, 0x2c, 0xdb, 0xd6, 0x51, 0xcf,
+ 0x9a, 0x94, 0xa8, 0xfc, 0x30, 0xb4, 0x4f, 0xcb, 0x61, 0xc6, 0x91, 0x71,
+ 0x6b, 0x01, 0x20, 0x15, 0x44, 0x5b, 0xd8, 0x1d, 0x87, 0x7a, 0xc4, 0x1b,
+ 0xf9, 0x0a, 0xcb, 0xc3, 0x0d, 0x08, 0x2b, 0x57, 0x51, 0x4d, 0xc3, 0x3c,
+ 0xe1, 0x9c, 0xc9, 0xe4, 0xe9, 0xe7, 0x4f, 0x9f, 0x6c, 0x26, 0x9d, 0x4c,
+ 0xdc, 0xcd, 0x88, 0xe5, 0xc1, 0x27, 0x6e, 0x59, 0xdb, 0x0a, 0xc1, 0x79,
+ 0x0e, 0x23, 0x05, 0x7a, 0x8d, 0x58, 0x24, 0x39, 0xb7, 0xe2, 0x23, 0x93,
+ 0x01, 0xfd, 0x2c, 0x59, 0x28, 0x07, 0x19, 0x34, 0xf4, 0x31, 0xb6, 0x70,
+ 0x92, 0x0d, 0x48, 0xf8, 0xb4, 0x76, 0xc2, 0xdb, 0xd5, 0xc6, 0x71, 0xb1,
+ 0x31, 0x94, 0x34, 0x4d, 0xfe, 0xdc, 0x04, 0x86, 0x43, 0xd4, 0xdd, 0xca,
+ 0x3e, 0x67, 0x68, 0xaa, 0xa2, 0x7a, 0x98, 0x5b, 0xe2, 0xda, 0xf6, 0x25,
+ 0xa4, 0xa1, 0xd9, 0xab, 0xc8, 0xd5, 0x8d, 0x7c, 0xf1, 0xc4, 0xb0, 0xef,
+ 0x81, 0xb5, 0xc2, 0x98, 0x36, 0x1d, 0x3a, 0x32, 0x98, 0x32, 0xe0, 0x47,
+ 0xe4, 0x7d, 0x49, 0x11, 0x94, 0x3d, 0x89, 0x22, 0x63, 0xcc, 0xb3, 0xb9,
+ 0x36, 0x9c, 0x63, 0xd5, 0xa3, 0xac, 0x5c, 0x71, 0x3a, 0x07, 0x2a, 0xf9,
+ 0xba, 0x44, 0xc6, 0x7c, 0x1f, 0x96, 0x97, 0xba, 0xed, 0x52, 0x85, 0xc9,
+ 0x69, 0xcd, 0xac, 0xb7, 0xc2, 0x4b, 0xb9, 0x4d, 0xd1, 0xbd, 0xba, 0x85,
+ 0x5d, 0xfa, 0x77, 0xcb, 0x95, 0x61, 0x4d, 0x27, 0x7f, 0xb5, 0x43, 0x88,
+ 0x9e, 0xd9, 0xc3, 0x92, 0x62, 0x1c, 0x4e, 0xf8, 0xfe, 0xc2, 0x7e, 0xd3,
+ 0xb3, 0x64, 0x03, 0x13, 0xde, 0xda, 0xda, 0x7c, 0x78, 0xd2, 0xf2, 0xe4,
+ 0x43, 0x93, 0x3c, 0x63, 0x47, 0x9c, 0xd7, 0xa2, 0xe6, 0xd2, 0x9b, 0x03,
+ 0x7d, 0xd3, 0x03, 0x8c, 0x19, 0x30, 0x47, 0x4a, 0xaa, 0x25, 0x39, 0xcc,
+ 0xef, 0x23, 0xe5, 0x63, 0x88, 0xac, 0xa6, 0xb2, 0xc0, 0xf6, 0xda, 0xc5,
+ 0x4d, 0xc3, 0x08, 0xa1, 0x22, 0x42, 0x28, 0x37, 0x10, 0x90, 0x8d, 0x07,
+ 0x86, 0x09, 0x43, 0x7d, 0xd3, 0x4d, 0xcb, 0x5b, 0x1c, 0x5c, 0x32, 0x9d,
+ 0x68, 0x13, 0x4e, 0xa1, 0xfa, 0xcc, 0x38, 0x2e, 0x15, 0xa9, 0x0e, 0xd2,
+ 0xa7, 0x6d, 0x86, 0x31, 0x9c, 0x06, 0x11, 0x94, 0x75, 0x7e, 0xd2, 0x75,
+ 0xdc, 0x8e, 0xb4, 0x67, 0x69, 0x85, 0x10, 0x78, 0x40, 0x23, 0x51, 0x3f,
+ 0xba, 0x35, 0x33, 0xc4, 0xb9, 0x1f, 0x04, 0x71, 0xd5, 0xc6, 0x69, 0x15,
+ 0x86, 0x9e, 0x30, 0x37, 0xcb, 0xdf, 0xa0, 0xd8, 0x34, 0xab, 0x27, 0x55,
+ 0x7e, 0xc1, 0x3f, 0x6d, 0x11, 0x73, 0xc0, 0x67, 0x14, 0x50, 0x50, 0x31,
+ 0x5d, 0x1d, 0x8d, 0x58, 0x43, 0x2c, 0x13, 0x4b, 0xc3, 0x95, 0x39, 0xa8,
+ 0x36, 0x09, 0x95, 0x83, 0x22, 0x9c, 0x86, 0x1a, 0xde, 0xb3, 0xea, 0x1b,
+ 0xd6, 0x41, 0xdb, 0xbe, 0xb1, 0xe7, 0x6d, 0x5f, 0x83, 0xc5, 0x65, 0xe9,
+ 0x81, 0x7c, 0x45, 0xfe, 0x71, 0x9d, 0xbc, 0xd5, 0xc7, 0x92, 0x8d, 0xf1,
+ 0xd9, 0xdb, 0xa3, 0x6f, 0x4e, 0x37, 0x1f, 0xf2, 0xa9, 0xb7, 0xe5, 0xbf,
+ 0x5d, 0x57, 0xaa, 0x89, 0xf2, 0x32, 0x7d, 0x58, 0x27, 0xdf, 0x8c, 0xc7,
+ 0xc3, 0x83, 0xb3, 0x63, 0x74, 0xcd, 0x1d, 0x9b, 0xff, 0xf6, 0xb4, 0x77,
+ 0x18, 0xa1, 0xb9, 0xc8, 0xf0, 0x7b, 0xa9, 0x9e, 0xae, 0x45, 0xcd, 0x48,
+ 0xe0, 0xb1, 0x46, 0x66, 0x16, 0x94, 0x07, 0x51, 0xef, 0x2c, 0xb2, 0x0d,
+ 0x86, 0xef, 0x9a, 0x3c, 0x67, 0xc7, 0x5b, 0xf8, 0x14, 0x7d, 0x12, 0x0b,
+ 0xea, 0x71, 0x1f, 0x2c, 0xc3, 0x9e, 0xb9, 0xa4, 0xf9, 0x20, 0xcb, 0x1a,
+ 0x02, 0x5a, 0xcb, 0x21, 0x8c, 0xe5, 0x47, 0xd7, 0x89, 0x8b, 0x5a, 0xc7,
+ 0x8b, 0xcf, 0xc8, 0x75, 0x4b, 0xd5, 0x45, 0x8a, 0xc3, 0xdc, 0x71, 0x15,
+ 0xc3, 0x44, 0x63, 0xb4, 0xcd, 0x19, 0xf5, 0xc4, 0x18, 0x6b, 0xd6, 0x63,
+ 0xd7, 0x29, 0xb2, 0x3e, 0x5c, 0x26, 0xc9, 0xfe, 0x3a, 0x67, 0x58, 0x67,
+ 0x45, 0xb9, 0xbc, 0xba, 0x66, 0x03, 0xab, 0xed, 0x87, 0x68, 0x35, 0xcf,
+ 0xb6, 0xed, 0x60, 0xcc, 0x24, 0x03, 0x16, 0xc4, 0x3b, 0xaa, 0xf7, 0x54,
+ 0x19, 0x45, 0x48, 0x59, 0xbd, 0xe1, 0xdc, 0xb7, 0xe9, 0x3f, 0xa5, 0xdd,
+ 0xe4, 0x0a, 0x0d, 0xe4, 0x82, 0xb2, 0x07, 0x88, 0xb6, 0x45, 0x33, 0x83,
+ 0xfa, 0x9a, 0x16, 0xf7, 0x70, 0xec, 0x4b, 0x98, 0x0b, 0xb5, 0xcf, 0x96,
+ 0x9b, 0xdb, 0x2c, 0xde, 0x54, 0x13, 0x98, 0xf8, 0x9c, 0x7e, 0xcd, 0x45,
+ 0xcf, 0xab, 0xb8, 0x95, 0x94, 0x79, 0xa3, 0x83, 0x1b, 0x73, 0x0a, 0xea,
+ 0x79, 0x31, 0xd0, 0x51, 0x06, 0xc6, 0x10, 0x96, 0x38, 0xb1, 0xa8, 0xc0,
+ 0xb2, 0xfd, 0x11, 0x21, 0x84, 0x7e, 0xb2, 0x1b, 0xe9, 0x45, 0x5d, 0xce,
+ 0x96, 0x0d, 0xb4, 0x00, 0x72, 0xdf, 0x53, 0x61, 0xd9, 0xa6, 0x86, 0xb9,
+ 0x81, 0xae, 0x5e, 0x4d, 0x34, 0xc1, 0x99, 0x03, 0x46, 0x11, 0xc7, 0xa4,
+ 0x6b, 0x76, 0x3c, 0x72, 0xc1, 0x2a, 0x0e, 0xa4, 0x8b, 0x67, 0x82, 0x68,
+ 0xca, 0x63, 0x61, 0xa8, 0x05, 0x52, 0xf2, 0x6e, 0x14, 0x38, 0x32, 0xdc,
+ 0x39, 0xdd, 0xa5, 0x16, 0x75, 0x2c, 0xd2, 0x5f, 0x95, 0xb5, 0x8b, 0x34,
+ 0x9c, 0xbe, 0x18, 0x93, 0x69, 0xbd, 0x59, 0xfa, 0x9a, 0x29, 0x73, 0x41,
+ 0xe7, 0xe3, 0xe2, 0xde, 0x7e, 0x8c, 0xbf, 0x93, 0x22, 0x8d, 0xcd, 0xaa,
+ 0xc0, 0x8f, 0x85, 0x15, 0x73, 0x9b, 0xd1, 0x96, 0x6b, 0x3b, 0xed, 0xc6,
+ 0xdd, 0xed, 0x2f, 0x75, 0x86, 0xfe, 0x9e, 0x90, 0x13, 0xec, 0x16, 0x63,
+ 0x37, 0x5a, 0x9b, 0xdc, 0x01, 0xbd, 0x11, 0x2f, 0x03, 0x11, 0x62, 0x84,
+ 0x27, 0x02, 0xd6, 0xa5, 0x3c, 0x12, 0xbb, 0x2a, 0x55, 0x8c, 0xc8, 0xd3,
+ 0x96, 0x72, 0x6f, 0x5e, 0x7e, 0xd9, 0xfb, 0x86, 0x2d, 0x83, 0x2b, 0x57,
+ 0xb7, 0xcf, 0x76, 0xbb, 0x33, 0x7a, 0x04, 0x41, 0xdc, 0xfa, 0xdd, 0x0f,
+ 0x03, 0x9b, 0xce, 0x26, 0x4b, 0xd4, 0x13, 0x41, 0x02, 0x1d, 0x09, 0x17,
+ 0x6e, 0x7c, 0x90, 0xbf, 0xd0, 0x19, 0xf8, 0x21, 0x2f, 0x8c, 0x4e, 0x58,
+ 0x6f, 0x2a, 0x73, 0x4a, 0x62, 0x66, 0x78, 0x6a, 0xab, 0x75, 0xea, 0x0f,
+ 0x6d, 0x64, 0x8d, 0x4b, 0x52, 0x25, 0x95, 0x99, 0x43, 0x8b, 0x81, 0x10,
+ 0xf2, 0xba, 0x24, 0xdf, 0x2f, 0x82, 0xda, 0xb1, 0x89, 0x15, 0x37, 0x18,
+ 0x03, 0x30, 0xe8, 0xc6, 0x20, 0x28, 0xf2, 0x3b, 0x97, 0xdf, 0x62, 0x91,
+ 0x07, 0xfd, 0x90, 0xbf, 0x11, 0x81, 0x74, 0x51, 0x45, 0x66, 0x17, 0x04,
+ 0x5b, 0x89, 0xba, 0x58, 0xe7, 0xc6, 0xd3, 0xcd, 0xe4, 0xb2, 0x59, 0x6c,
+ 0xec, 0x6c, 0x72, 0x4f, 0x0c, 0x86, 0x65, 0xf0, 0x3b, 0x24, 0x87, 0xfe,
+ 0x1b, 0xca, 0xab, 0x4d, 0x0e, 0xed, 0x67, 0x11, 0xf5, 0x27, 0x30, 0x43,
+ 0x14, 0xb0, 0x5e, 0xca, 0x09, 0x66, 0x82, 0xd9, 0x66, 0x45, 0xb6, 0x3c,
+ 0xb8, 0xeb, 0x17, 0x40, 0xd2, 0xdb, 0x82, 0x70, 0xa2, 0x51, 0xd8, 0x6b,
+ 0x6c, 0x87, 0xbc, 0xf1, 0x11, 0xb9, 0xa9, 0xf7, 0x08, 0x57, 0xfd, 0x1b,
+ 0xca, 0xcd, 0xa6, 0x43, 0x92, 0x21, 0x57, 0x55, 0x69, 0x2e, 0xc7, 0x2a,
+ 0x02, 0xa6, 0x2b, 0xd6, 0xc4, 0x39, 0x4a, 0xcf, 0x6e, 0xf2, 0xaa, 0x2c,
+ 0x00, 0xc6, 0x79, 0x93, 0x56, 0x39, 0xf2, 0x5c, 0xd6, 0xbe, 0x3d, 0x7d,
+ 0x73, 0xb4, 0xe6, 0xbb, 0x43, 0x2e, 0x73, 0xad, 0x9e, 0xbd, 0x0e, 0x5b,
+ 0x32, 0xd8, 0xdd, 0x8c, 0xb9, 0x0b, 0xcd, 0x65, 0x3e, 0xf9, 0xa8, 0xd0,
+ 0x19, 0xf7, 0x0c, 0x93, 0x98, 0xd9, 0xba, 0x72, 0xa3, 0x44, 0x4a, 0x0a,
+ 0x8c, 0x34, 0x69, 0x55, 0x0e, 0x43, 0x0e, 0x5c, 0xac, 0x95, 0x96, 0x1a,
+ 0x85, 0x68, 0xa7, 0x55, 0xfa, 0x6d, 0x42, 0x13, 0xaf, 0x95, 0x28, 0x29,
+ 0xf8, 0x5a, 0x96, 0xe6, 0x9c, 0xeb, 0xdd, 0x8b, 0x71, 0x7e, 0x4f, 0x36,
+ 0xcd, 0x7a, 0xfb, 0xea, 0x5b, 0xaf, 0xc9, 0x0c, 0x6f, 0xd6, 0x95, 0xbc,
+ 0x48, 0x95, 0x76, 0x32, 0x3e, 0x6c, 0xdf, 0xde, 0xf3, 0x75, 0xe6, 0x6a,
+ 0xfe, 0x84, 0x1b, 0x9d, 0x07, 0x77, 0xa7, 0x6f, 0x9f, 0x4f, 0xdf, 0x5d,
+ 0x13, 0xc5, 0x06, 0xf3, 0x8b, 0x45, 0x52, 0x57, 0x1d, 0xd9, 0x6e, 0xfe,
+ 0xde, 0xce, 0x5d, 0xa1, 0x8e, 0x35, 0xa1, 0x3f, 0xd1, 0x7c, 0xbe, 0x9c,
+ 0xe4, 0x7e, 0x82, 0x48, 0x80, 0x1e, 0xaf, 0xfa, 0x51, 0xe1, 0xf5, 0x3a,
+ 0xc2, 0x68, 0xbd, 0xe8, 0xc5, 0xe6, 0xca, 0x46, 0x16, 0xa1, 0xc6, 0xe3,
+ 0xf2, 0x8a, 0xf0, 0xab, 0x5c, 0xbe, 0x83, 0x7c, 0x69, 0xe0, 0x23, 0x09,
+ 0x0c, 0x7a, 0xf0, 0xcc, 0x5d, 0x26, 0x96, 0xd5, 0x48, 0x18, 0xd0, 0x9b,
+ 0x21, 0xa1, 0x6d, 0x8e, 0x8c, 0xa2, 0x62, 0x87, 0x9a, 0xb1, 0xa5, 0xa4,
+ 0xba, 0xb4, 0x51, 0xad, 0x67, 0xfe, 0xc6, 0x86, 0x8c, 0xde, 0x58, 0x6c,
+ 0xcf, 0xb3, 0xaa, 0x41, 0xbd, 0x8c, 0x14, 0xaf, 0x3f, 0x6a, 0x57, 0xdb,
+ 0xf3, 0x68, 0x96, 0x26, 0x6d, 0x59, 0xea, 0x65, 0x75, 0x83, 0x8a, 0x6f,
+ 0x69, 0xe6, 0xc7, 0x69, 0xf1, 0x6e, 0x3f, 0x64, 0x1f, 0x22, 0xb7, 0xbc,
+ 0x37, 0x43, 0x4a, 0x59, 0xae, 0x04, 0x15, 0x2e, 0xf9, 0x86, 0x67, 0x61,
+ 0x27, 0x68, 0x6d, 0x1c, 0x02, 0xff, 0x61, 0xfd, 0x35, 0x28, 0x50, 0x29,
+ 0x6b, 0x80, 0x70, 0x37, 0x55, 0x3a, 0x71, 0x7f, 0x19, 0xa6, 0xf5, 0x24,
+ 0xcf, 0xb5, 0x39, 0x1c, 0x45, 0x06, 0x33, 0x4a, 0x05, 0x8f, 0x63, 0x43,
+ 0xd9, 0xfd, 0xb0, 0x7d, 0x99, 0xa6, 0xdc, 0x1b, 0x48, 0x72, 0xb3, 0x52,
+ 0xee, 0x1a, 0x4a, 0x09, 0x4a, 0x28, 0x0c, 0x95, 0xb0, 0x61, 0xac, 0x5f,
+ 0x1e, 0xda, 0x48, 0x98, 0x23, 0xd0, 0x63, 0xd4, 0x1a, 0xbb, 0x7b, 0xc7,
+ 0x37, 0xbc, 0x95, 0x08, 0x43, 0x42, 0x68, 0xab, 0x1b, 0x36, 0x22, 0x6f,
+ 0x6f, 0x77, 0xfd, 0x67, 0x56, 0xe5, 0x6d, 0x74, 0x00, 0xc1, 0x8a, 0x72,
+ 0x98, 0xce, 0x16, 0xd1, 0x0c, 0xcf, 0xf1, 0x66, 0xab, 0x75, 0xee, 0xc1,
+ 0xc9, 0xd9, 0x5b, 0x60, 0x45, 0x52, 0x17, 0x86, 0xa2, 0xe6, 0x7c, 0x1a,
+ 0xfa, 0x19, 0x95, 0x6f, 0x14, 0x0c, 0xa9, 0x8a, 0xcc, 0xaa, 0x69, 0x08,
+ 0x2d, 0xc0, 0x51, 0x71, 0x32, 0x1c, 0x62, 0x96, 0x15, 0xe7, 0xb4, 0x15,
+ 0x89, 0x57, 0xdd, 0xcb, 0x02, 0x5e, 0x2d, 0x8b, 0xee, 0x72, 0xcc, 0x57,
+ 0xdd, 0xb7, 0xb5, 0x61, 0x8b, 0xad, 0xc1, 0x6b, 0xbf, 0x6b, 0xe1, 0x32,
+ 0x4b, 0xc5, 0xc6, 0x0c, 0xe4, 0x79, 0x93, 0x59, 0x50, 0x4e, 0xb1, 0xe8,
+ 0x6c, 0x8c, 0x5c, 0xfc, 0x49, 0x92, 0x4e, 0x04, 0xd0, 0x16, 0x85, 0x87,
+ 0x88, 0xab, 0x13, 0x36, 0x81, 0xd1, 0x10, 0xb6, 0x58, 0x14, 0x5d, 0xac,
+ 0x39, 0x21, 0x77, 0xd4, 0xfc, 0x0c, 0x80, 0x0f, 0x1f, 0x53, 0x12, 0x49,
+ 0x3b, 0x32, 0x5a, 0xb1, 0xc1, 0x6f, 0x07, 0xfc, 0xd5, 0x8b, 0x25, 0x49,
+ 0x88, 0xce, 0x17, 0x64, 0x7b, 0x59, 0x69, 0xe2, 0x27, 0xe8, 0x7b, 0xe2,
+ 0xf8, 0x62, 0x20, 0x31, 0x2a, 0x60, 0xce, 0xd2, 0x39, 0xf5, 0x4c, 0xd5,
+ 0x22, 0x19, 0xf2, 0xf9, 0x52, 0x3e, 0x73, 0x77, 0xc2, 0xcb, 0x54, 0x24,
+ 0x56, 0xab, 0x3d, 0x42, 0xa7, 0x76, 0x86, 0x3f, 0x43, 0x92, 0xd4, 0x1f,
+ 0x3e, 0x56, 0x0f, 0x89, 0xd7, 0x21, 0x43, 0x90, 0x07, 0xc0, 0x11, 0x1b,
+ 0x6d, 0x24, 0xcc, 0x5d, 0x08, 0x78, 0x08, 0x6d, 0xf8, 0x8a, 0x46, 0x78,
+ 0xd7, 0xcb, 0xe2, 0xa3, 0x99, 0x42, 0x08, 0x05, 0xa0, 0xb9, 0xee, 0xd4,
+ 0x4a, 0x87, 0xfb, 0x6f, 0xd3, 0x5f, 0x2c, 0xb2, 0x07, 0x8f, 0x40, 0x0d,
+ 0x10, 0x6e, 0x00, 0xec, 0xfd, 0xbe, 0x6b, 0x8f, 0xc6, 0x66, 0x37, 0xb5,
+ 0xe7, 0xc3, 0xcc, 0xca, 0x12, 0x30, 0x5a, 0xca, 0xa1, 0x3b, 0x2d, 0x3a,
+ 0x19, 0x52, 0x8a, 0xaf, 0xbc, 0x2b, 0x45, 0xe2, 0xd7, 0x0a, 0x9e, 0x86,
+ 0x6a, 0x3c, 0xb2, 0x40, 0x48, 0xb8, 0x04, 0xe2, 0x70, 0x59, 0x73, 0x05,
+ 0xa4, 0x6c, 0x2b, 0xf1, 0x83, 0xdf, 0xca, 0x2e, 0x32, 0x93, 0x36, 0x2e,
+ 0x45, 0x1f, 0x1f, 0xb4, 0xdb, 0x69, 0x3b, 0x18, 0x0b, 0xc9, 0x99, 0xb2,
+ 0x3a, 0x1b, 0x75, 0x99, 0xf6, 0xbb, 0xdc, 0x46, 0xe4, 0x96, 0xcb, 0x50,
+ 0xcc, 0x0a, 0xcb, 0x64, 0xf3, 0x28, 0xe8, 0xf2, 0x27, 0xa7, 0x92, 0x5b,
+ 0x88, 0x47, 0x28, 0xfb, 0xc3, 0x0e, 0x91, 0x8a, 0x47, 0x49, 0xc3, 0xb7,
+ 0xa1, 0x30, 0x7c, 0xdb, 0x96, 0x85, 0x6e, 0xa5, 0x01, 0x86, 0x40, 0xe4,
+ 0x44, 0x3f, 0x28, 0x03, 0x69, 0x78, 0xaa, 0x2f, 0x39, 0x7b, 0x1b, 0x22,
+ 0x1c, 0x88, 0xe3, 0x8f, 0x84, 0xef, 0xc3, 0x52, 0xd0, 0x9a, 0xee, 0xf2,
+ 0xb3, 0x1e, 0xa7, 0xd6, 0xaf, 0x17, 0x81, 0x6a, 0x51, 0x89, 0xa8, 0x0b,
+ 0x25, 0x60, 0x11, 0x08, 0x40, 0xe1, 0xbb, 0x4f, 0x23, 0x02, 0xe9, 0x93,
+ 0xc6, 0xca, 0xbe, 0xa2, 0x7c, 0x14, 0x72, 0x00, 0x06, 0x62, 0xf0, 0xd4,
+ 0x7a, 0x8c, 0xb8, 0xce, 0xcc, 0xb6, 0x6c, 0xd4, 0xb7, 0x12, 0xbc, 0xa5,
+ 0xe2, 0x46, 0x41, 0xa2, 0xe7, 0x4b, 0xc4, 0xd1, 0x82, 0xd2, 0x11, 0xc7,
+ 0xf9, 0x29, 0x23, 0xdc, 0x98, 0x87, 0x6e, 0xd3, 0xaa, 0xe0, 0xcc, 0x98,
+ 0xa9, 0x9f, 0x31, 0x6a, 0x84, 0xa9, 0x3d, 0x5a, 0x33, 0xae, 0x83, 0xa9,
+ 0x43, 0x8f, 0x51, 0x9d, 0xa3, 0x16, 0x3c, 0x6a, 0xc2, 0xe2, 0xd0, 0x58,
+ 0x22, 0x72, 0x61, 0x5b, 0xef, 0xb9, 0xf1, 0x8f, 0x8d, 0x78, 0x37, 0xfa,
+ 0x0f, 0x4d, 0x9b, 0x64, 0x7c, 0x72, 0x2c, 0xfb, 0x77, 0x28, 0x03, 0x8c,
+ 0x8e, 0x47, 0xe2, 0x30, 0x32, 0x43, 0xd4, 0x03, 0xbb, 0xb0, 0x36, 0x60,
+ 0xe9, 0xf3, 0x60, 0xef, 0x84, 0xd9, 0xf2, 0x69, 0x14, 0x79, 0x46, 0x0f,
+ 0xa5, 0x34, 0x07, 0x97, 0x28, 0x13, 0x1d, 0x23, 0x85, 0xbc, 0x3a, 0x7e,
+ 0x65, 0x16, 0x4a, 0x56, 0xc6, 0x95, 0x39, 0x3f, 0x5f, 0xdf, 0x27, 0x3d,
+ 0xc7, 0x92, 0x94, 0x5d, 0x17, 0x89, 0x87, 0x6f, 0x86, 0x70, 0x7d, 0x7d,
+ 0x3c, 0x42, 0x82, 0x27, 0xf5, 0x1a, 0x62, 0x4a, 0x96, 0x84, 0xf4, 0x22,
+ 0x8b, 0xbb, 0x92, 0xc8, 0x14, 0x00, 0x44, 0xc0, 0xf5, 0xd2, 0x70, 0x2a,
+ 0xa9, 0x29, 0xdc, 0x39, 0x90, 0x93, 0xcf, 0x4b, 0x32, 0x0f, 0x20, 0x6e,
+ 0x69, 0xc2, 0xde, 0x8c, 0x03, 0x2e, 0xe0, 0xd0, 0x43, 0x9d, 0x19, 0x11,
+ 0xca, 0x15, 0x8e, 0x17, 0x55, 0xf9, 0x31, 0x63, 0x79, 0x01, 0xa3, 0x10,
+ 0x88, 0x71, 0xac, 0x03, 0x8b, 0x07, 0xdd, 0xdc, 0x50, 0xdc, 0x1d, 0x88,
+ 0xb2, 0x4c, 0x82, 0x50, 0x39, 0xf7, 0x2a, 0x16, 0xa8, 0x19, 0x77, 0x8f,
+ 0xe5, 0x78, 0x1d, 0x18, 0x2f, 0xda, 0xd0, 0x87, 0x8f, 0xda, 0x84, 0x92,
+ 0x07, 0xff, 0x89, 0x32, 0xdb, 0xee, 0xba, 0x2f, 0xb3, 0x23, 0x5b, 0xfa,
+ 0xf8, 0x0e, 0xc4, 0x86, 0x97, 0xe0, 0xbc, 0x4c, 0x5e, 0xb2, 0x40, 0xb8,
+ 0xbb, 0x47, 0xf9, 0x73, 0xd7, 0x43, 0x89, 0x2e, 0xda, 0x43, 0xb5, 0x16,
+ 0xa7, 0x89, 0xeb, 0xfc, 0xc1, 0x25, 0x65, 0x9c, 0x7d, 0x39, 0x75, 0xb8,
+ 0xd5, 0xd2, 0x4b, 0x07, 0x38, 0x3b, 0x21, 0x10, 0x34, 0xb9, 0x38, 0xad,
+ 0xeb, 0x8d, 0xf3, 0x44, 0x61, 0x3e, 0xd1, 0xee, 0x00, 0x6e, 0x0c, 0x8d,
+ 0x1a, 0xc4, 0x3e, 0xf8, 0x57, 0xca, 0x14, 0x35, 0xc6, 0x48, 0x43, 0xc9,
+ 0x7b, 0xfc, 0xa5, 0xc0, 0x5c, 0xe0, 0xae, 0xb2, 0xb6, 0xc4, 0x8d, 0x71,
+ 0x70, 0x2c, 0x96, 0x16, 0xb5, 0x4d, 0xf0, 0xb5, 0x3a, 0x6e, 0xf3, 0x93,
+ 0x1c, 0x91, 0xa5, 0x19, 0x31, 0xe2, 0x15, 0x3a, 0x08, 0x6b, 0xcc, 0xa5,
+ 0xa3, 0x05, 0xe7, 0xd9, 0x89, 0x47, 0x24, 0xd5, 0x04, 0x3a, 0x59, 0x78,
+ 0x1b, 0xe1, 0x33, 0xd2, 0xf9, 0x46, 0xd2, 0xd4, 0xd0, 0xe0, 0x5a, 0x30,
+ 0xb7, 0xc1, 0x00, 0xda, 0x4f, 0xb6, 0x95, 0xe5, 0x04, 0xeb, 0x12, 0x66,
+ 0xcd, 0x6d, 0xa4, 0x27, 0x2c, 0x66, 0x93, 0xb8, 0x87, 0x06, 0xde, 0xdf,
+ 0xf7, 0x3f, 0xdf, 0x56, 0x64, 0x0e, 0x0a, 0x4d, 0xfa, 0xcf, 0xa0, 0x01,
+ 0x70, 0x44, 0x03, 0xa4, 0xe7, 0xcc, 0x4f, 0xed, 0xa3, 0x3d, 0x9d, 0x23,
+ 0x28, 0x49, 0x69, 0x8f, 0x32, 0x14, 0xda, 0xce, 0x6a, 0xe7, 0x09, 0x6c,
+ 0x7a, 0x3c, 0x3f, 0x75, 0x2c, 0xa7, 0x7c, 0xea, 0x29, 0x0d, 0xb2, 0x19,
+ 0xc7, 0x12, 0xdb, 0x5e, 0x47, 0xdf, 0xd9, 0xa8, 0x0f, 0x89, 0x5e, 0x8b,
+ 0xf8, 0x9d, 0x38, 0xed, 0x50, 0xd8, 0xcd, 0x76, 0x04, 0x46, 0x3f, 0x44,
+ 0x66, 0x6d, 0xec, 0xa3, 0x39, 0x30, 0x6b, 0xe8, 0x66, 0xa6, 0x53, 0x36,
+ 0xb4, 0x5f, 0x79, 0x4e, 0x5e, 0x8c, 0x9e, 0xb4, 0xce, 0x49, 0x33, 0x9b,
+ 0x0f, 0x6f, 0x2f, 0x1e, 0x08, 0x54, 0x9d, 0x9f, 0xbc, 0x41, 0xa2, 0x8e,
+ 0x8a, 0x1b, 0x74, 0xe4, 0x92, 0xb7, 0x71, 0x57, 0xb1, 0x7b, 0xf7, 0x1a,
+ 0x88, 0xb6, 0x61, 0xa5, 0x48, 0x24, 0x26, 0x63, 0x2b, 0xdd, 0xc5, 0x51,
+ 0x63, 0x91, 0x3a, 0xcd, 0x88, 0x88, 0x40, 0x10, 0x52, 0xc5, 0x2c, 0x8f,
+ 0xd6, 0x24, 0x6a, 0xfe, 0x7e, 0x76, 0x97, 0x4d, 0x96, 0x48, 0x2a, 0x20,
+ 0xc5, 0x9e, 0xa0, 0xef, 0x56, 0x47, 0x3b, 0x30, 0xdb, 0x56, 0x64, 0xc3,
+ 0xfc, 0xa0, 0x4b, 0x0c, 0x9b, 0x46, 0xa5, 0x8b, 0xe7, 0xd5, 0x07, 0x1e,
+ 0x4f, 0xce, 0x02, 0xc7, 0xef, 0xda, 0xbf, 0x0a, 0x02, 0xfb, 0x28, 0xef,
+ 0x21, 0x65, 0xc6, 0xf0, 0x53, 0x7e, 0x55, 0xb0, 0xba, 0xf8, 0x26, 0x9f,
+ 0x54, 0x65, 0x5d, 0x5e, 0x4a, 0xe1, 0x98, 0x33, 0x6d, 0x8f, 0x8f, 0xc7,
+ 0xc9, 0x6d, 0x76, 0xa1, 0xd5, 0xfc, 0xa3, 0xd0, 0xff, 0xcf, 0x52, 0x84,
+ 0xe2, 0x59, 0x55, 0x9e, 0x35, 0x44, 0x35, 0x8d, 0x60, 0x13, 0xb4, 0x1d,
+ 0x3a, 0x94, 0x0a, 0xf2, 0x13, 0x6c, 0x2f, 0xea, 0xf1, 0x3c, 0xc3, 0xd5,
+ 0xb4, 0xc8, 0xca, 0x48, 0x16, 0x03, 0x4f, 0x40, 0xaf, 0x15, 0x69, 0x31,
+ 0x4e, 0xfa, 0xd7, 0x45, 0x4a, 0x53, 0x62, 0x2b, 0x20, 0x47, 0x5b, 0x79,
+ 0xd2, 0x2e, 0xc5, 0x1b, 0xf6, 0x91, 0xdc, 0x9c, 0x41, 0x99, 0x9d, 0xcd,
+ 0x85, 0xb7, 0x35, 0x09, 0xea, 0x72, 0x2d, 0xa6, 0x65, 0x85, 0xcc, 0x31,
+ 0xaf, 0xb5, 0x1d, 0xf5, 0x80, 0x5e, 0x56, 0xe4, 0xe6, 0x07, 0xec, 0x72,
+ 0x28, 0x4f, 0x6f, 0xaf, 0x4b, 0xee, 0x04, 0x0a, 0x32, 0x3b, 0x9d, 0x0d,
+ 0x15, 0x89, 0xd2, 0xeb, 0x07, 0x52, 0xc1, 0xdd, 0x37, 0xfe, 0x46, 0x45,
+ 0x21, 0x5a, 0x65, 0x3f, 0x5c, 0x29, 0xbc, 0x64, 0x96, 0xbc, 0xca, 0xaf,
+ 0xfa, 0xfa, 0x9c, 0xc3, 0xe5, 0x07, 0x48, 0x1a, 0xa7, 0x18, 0x61, 0x46,
+ 0x72, 0x69, 0x56, 0x7c, 0x4a, 0x3b, 0x7c, 0xc0, 0x48, 0x5c, 0xa1, 0xf3,
+ 0xbc, 0x87, 0xfb, 0xfe, 0xc9, 0x01, 0x40, 0xeb, 0xbb, 0xf0, 0xe6, 0x62,
+ 0x8f, 0x80, 0xd7, 0xfc, 0xc4, 0xa9, 0xec, 0x2e, 0x66, 0x1e, 0x00, 0xe7,
+ 0x3c, 0xa4, 0xaf, 0xc7, 0x83, 0x2c, 0x1a, 0x7f, 0x8c, 0x64, 0x11, 0x79,
+ 0x21, 0x74, 0xf9, 0xf7, 0x14, 0xdb, 0x23, 0xff, 0x90, 0x28, 0xa5, 0x7f,
+ 0x74, 0x4b, 0xfa, 0xc1, 0xee, 0xf0, 0x22, 0x4b, 0xa9, 0xd5, 0xde, 0xcb,
+ 0x86, 0x14, 0xa6, 0x55, 0xf5, 0x6f, 0x5c, 0x8c, 0x90, 0x68, 0xca, 0xa4,
+ 0x57, 0x07, 0xf7, 0x35, 0x0f, 0x71, 0x0e, 0x95, 0x8b, 0x76, 0xf8, 0xf4,
+ 0xe0, 0xfd, 0xf9, 0xb7, 0xc9, 0x6e, 0xd0, 0x23, 0x48, 0xf1, 0x1d, 0x3a,
+ 0x82, 0xe1, 0xbc, 0x3b, 0x86, 0xee, 0x21, 0xa2, 0x3d, 0xe6, 0x46, 0xfd,
+ 0xcb, 0xb2, 0x98, 0x44, 0x9d, 0x0c, 0xdc, 0x1e, 0x4f, 0x60, 0x50, 0x58,
+ 0x93, 0xe2, 0x7b, 0x58, 0x2a, 0x4b, 0x5a, 0xa9, 0xf1, 0x7e, 0xcb, 0xc7,
+ 0xe1, 0x30, 0x0c, 0x6f, 0x9a, 0x89, 0xbb, 0xb0, 0x79, 0x6f, 0xef, 0xc1,
+ 0x60, 0xb2, 0x02, 0x7e, 0xa6, 0x91, 0x6e, 0x74, 0xd7, 0x23, 0x03, 0x86,
+ 0x8f, 0x96, 0x6d, 0xd6, 0x0e, 0x75, 0xf6, 0xdd, 0xeb, 0xc3, 0xce, 0x70,
+ 0xcf, 0x9e, 0x3f, 0xdd, 0xfe, 0x94, 0xc8, 0x6e, 0x6c, 0x95, 0x11, 0x16,
+ 0x49, 0xf2, 0xd2, 0xfc, 0xf1, 0xe5, 0xea, 0xfc, 0x08, 0xa5, 0x97, 0xfa,
+ 0x3a, 0x5c, 0x2c, 0x2d, 0xd7, 0xc2, 0x1a, 0x4e, 0x1a, 0xb6, 0x99, 0xf9,
+ 0x41, 0x77, 0x32, 0xca, 0x98, 0x19, 0xf0, 0xfd, 0x32, 0x3c, 0x65, 0x28,
+ 0x0e, 0xca, 0xab, 0x1a, 0x6a, 0x3d, 0xc2, 0xb0, 0x1c, 0xd8, 0x69, 0x81,
+ 0x5a, 0xbd, 0x5d, 0xcc, 0x39, 0x0d, 0x4f, 0x9e, 0xf4, 0x66, 0x52, 0xbb,
+ 0xc8, 0x1c, 0xe9, 0x79, 0xef, 0xdf, 0x9d, 0xd4, 0xe2, 0x78, 0xe7, 0x47,
+ 0x7b, 0x4b, 0x21, 0xc5, 0x3d, 0xa3, 0x35, 0x38, 0x0c, 0x5f, 0xb6, 0x5c,
+ 0x98, 0x73, 0xda, 0x50, 0xe9, 0x86, 0xed, 0xca, 0xee, 0x9c, 0xe9, 0x51,
+ 0xe1, 0xc6, 0x08, 0xbb, 0x2e, 0x67, 0x12, 0x2d, 0x44, 0xbc, 0x09, 0x6a,
+ 0xc4, 0x0d, 0xd8, 0x26, 0x83, 0xb6, 0x13, 0x3f, 0xe6, 0x26, 0x43, 0x63,
+ 0x10, 0xc1, 0xa1, 0x1a, 0x0e, 0x29, 0xf1, 0xd2, 0x90, 0x0b, 0x39, 0xcb,
+ 0x88, 0xa1, 0x30, 0x42, 0xd3, 0xa3, 0x13, 0x1f, 0xda, 0xfd, 0x0a, 0x3d,
+ 0x2e, 0x71, 0x33, 0xc6, 0x54, 0x03, 0x12, 0xd1, 0xd4, 0x1f, 0xcc, 0xc3,
+ 0x54, 0x21, 0x18, 0xec, 0x2c, 0xc4, 0xcc, 0xbf, 0x7b, 0x3f, 0xe5, 0x64,
+ 0xa6, 0xa1, 0x40, 0x77, 0xf6, 0x75, 0xcc, 0x79, 0xde, 0xee, 0x98, 0xe3,
+ 0xf3, 0x46, 0x14, 0xa3, 0xee, 0x87, 0x8a, 0x80, 0x22, 0xd4, 0xb3, 0x59,
+ 0xca, 0x43, 0x3e, 0x8c, 0x4d, 0xdd, 0x4c, 0x29, 0x33, 0x54, 0x7b, 0xe9,
+ 0x32, 0x87, 0xd1, 0x01, 0xfc, 0xcf, 0xbf, 0x87, 0xce, 0x88, 0x3f, 0xff,
+ 0x8c, 0x00, 0x24, 0x3a, 0x72, 0x5b, 0xc2, 0xe9, 0xd5, 0x58, 0xb7, 0xae,
+ 0xde, 0xbf, 0x2e, 0x4b, 0xc9, 0x95, 0x91, 0x28, 0x58, 0x4f, 0x3f, 0x38,
+ 0xba, 0xaf, 0xd6, 0x7f, 0xb7, 0x6e, 0x5b, 0x6c, 0xb2, 0xf3, 0x5d, 0x72,
+ 0xca, 0x45, 0x19, 0x94, 0x59, 0xdb, 0x2d, 0xe1, 0xfe, 0x20, 0x81, 0x8b,
+ 0xd7, 0xe9, 0xbb, 0xec, 0x2b, 0xbe, 0x40, 0x71, 0x1e, 0x70, 0x16, 0xbc,
+ 0x42, 0x35, 0x81, 0x0c, 0x56, 0x28, 0x4d, 0x8d, 0xda, 0x99, 0x59, 0x06,
+ 0xaa, 0x06, 0x7e, 0x9f, 0xc1, 0x86, 0x19, 0x31, 0xb2, 0x48, 0x5e, 0xf4,
+ 0x04, 0x56, 0xd6, 0x24, 0xb1, 0xf1, 0x3f, 0x8d, 0x70, 0x19, 0x34, 0xb7,
+ 0xe5, 0xdf, 0xfd, 0x08, 0xca, 0x9a, 0xd9, 0xa9, 0x64, 0x8d, 0x16, 0xf1,
+ 0xe1, 0x77, 0x3b, 0x54, 0x5a, 0xbb, 0xf6, 0x59, 0x28, 0x4b, 0x97, 0xa8,
+ 0xe1, 0x65, 0x89, 0x65, 0x6d, 0x80, 0x55, 0xb8, 0xf9, 0xf6, 0x93, 0x04,
+ 0x06, 0x32, 0x20, 0xcb, 0xe8, 0xef, 0x23, 0xfa, 0xf3, 0xcf, 0x3b, 0xc3,
+ 0xa7, 0x3f, 0xbb, 0xcf, 0xfe, 0x6e, 0xe7, 0xc3, 0xef, 0x76, 0xd7, 0x62,
+ 0xb5, 0xd3, 0x0e, 0x97, 0xc7, 0xcb, 0x9d, 0x26, 0xab, 0xad, 0xb8, 0x97,
+ 0x02, 0x32, 0xc9, 0x80, 0x70, 0x6d, 0xbd, 0x21, 0x3c, 0x22, 0x3b, 0x49,
+ 0x8e, 0xf5, 0x51, 0x37, 0x9a, 0xa5, 0xcd, 0xbd, 0xf5, 0xea, 0xbb, 0x2d,
+ 0xf9, 0x7d, 0x45, 0x2f, 0xa2, 0x73, 0xd0, 0xdf, 0x35, 0xd3, 0x99, 0x24,
+ 0x48, 0x21, 0x6c, 0x1c, 0xfe, 0x55, 0x48, 0x0f, 0xc9, 0xd8, 0x34, 0x4a,
+ 0x5b, 0x9a, 0xb4, 0xa2, 0x5b, 0x65, 0x72, 0x71, 0x61, 0x7f, 0x52, 0x64,
+ 0x41, 0x4d, 0xb3, 0xa2, 0x8e, 0xb2, 0x8b, 0x42, 0x2f, 0xbb, 0xd2, 0xe5,
+ 0xd4, 0x48, 0x4f, 0xc3, 0x44, 0x56, 0x6e, 0xb3, 0x03, 0x70, 0x61, 0x05,
+ 0x49, 0x91, 0x7f, 0x01, 0x8a, 0xa7, 0xe7, 0x84, 0x14, 0x01, 0x59, 0x92,
+ 0xb8, 0xb1, 0xf1, 0x61, 0xfc, 0x4c, 0x4f, 0x85, 0x11, 0x0f, 0xa4, 0xc9,
+ 0x31, 0x5e, 0x52, 0x58, 0xf3, 0x7d, 0xd3, 0x96, 0xbf, 0xa0, 0x07, 0x64,
+ 0xca, 0x85, 0x43, 0x82, 0x4c, 0xeb, 0x1e, 0x82, 0xf8, 0xa4, 0xf0, 0x88,
+ 0x20, 0x84, 0x02, 0x71, 0x56, 0xb7, 0x1c, 0x6e, 0x49, 0x57, 0x97, 0x0a,
+ 0xc7, 0x3f, 0xd5, 0x5a, 0x74, 0x8a, 0xe8, 0xaa, 0x38, 0x1f, 0x06, 0xc9,
+ 0x12, 0x74, 0x37, 0x4e, 0xef, 0x8d, 0x58, 0x63, 0xd8, 0xf5, 0x91, 0x55,
+ 0x85, 0xd4, 0x0f, 0xa6, 0x57, 0x5b, 0x9d, 0xac, 0x0f, 0xd7, 0x93, 0x0d,
+ 0xeb, 0xbd, 0x98, 0xa6, 0xf5, 0xf5, 0x66, 0x54, 0xfe, 0xdb, 0xc8, 0x84,
+ 0x93, 0x6b, 0xd2, 0x36, 0x0b, 0x7a, 0x21, 0x0b, 0xb4, 0x7e, 0x2b, 0xad,
+ 0x2b, 0x8b, 0x3b, 0xff, 0xa4, 0x6a, 0x63, 0x2b, 0x9e, 0xdd, 0xaf, 0xa2,
+ 0xfd, 0xe1, 0x59, 0x5c, 0x7b, 0xea, 0x03, 0xd9, 0x9a, 0xb3, 0x59, 0x36,
+ 0x1b, 0xe6, 0xf3, 0x79, 0x36, 0x8d, 0x24, 0x68, 0x72, 0x7a, 0xe2, 0x94,
+ 0x0b, 0x1b, 0xf4, 0x69, 0xcf, 0x53, 0x18, 0x01, 0x97, 0xd1, 0x00, 0x75,
+ 0x14, 0x66, 0x59, 0x02, 0x58, 0x22, 0x74, 0x05, 0x35, 0x8b, 0x41, 0xaa,
+ 0xe8, 0x16, 0x85, 0x9b, 0xd8, 0x5c, 0xd9, 0x40, 0x17, 0xf0, 0x7b, 0xbc,
+ 0x18, 0xc9, 0x6a, 0xbe, 0x3e, 0x0c, 0xbd, 0x96, 0x66, 0x36, 0x04, 0x5e,
+ 0x48, 0xae, 0x0b, 0x1f, 0x83, 0xeb, 0x36, 0x65, 0x1c, 0x42, 0x07, 0x58,
+ 0x46, 0x18, 0x36, 0xce, 0xc1, 0xc9, 0x0a, 0x64, 0x77, 0x38, 0x78, 0x05,
+ 0x48, 0xa4, 0xc8, 0x5d, 0x71, 0x47, 0x5a, 0x19, 0x42, 0x74, 0x90, 0x02,
+ 0x5a, 0x0d, 0xef, 0x07, 0x7f, 0x7a, 0xb7, 0xed, 0x7f, 0x0e, 0x3c, 0xfa,
+ 0xaa, 0x91, 0xad, 0xe4, 0x9e, 0xa7, 0x77, 0x6d, 0xc7, 0x6f, 0x07, 0x75,
+ 0xdc, 0x7f, 0x30, 0xb6, 0x23, 0x69, 0xfd, 0x91, 0x93, 0x6b, 0xa6, 0xa5,
+ 0xdb, 0x15, 0x6f, 0x53, 0xf8, 0x4a, 0x6c, 0xcf, 0x61, 0x90, 0xac, 0xe8,
+ 0x56, 0x40, 0x7e, 0xad, 0xaa, 0x9c, 0xd5, 0x92, 0x14, 0xc3, 0x15, 0x39,
+ 0x16, 0x3b, 0xc6, 0x23, 0x1c, 0x7f, 0xb3, 0xce, 0x89, 0x44, 0x69, 0x11,
+ 0x29, 0x48, 0xa9, 0x23, 0x59, 0x03, 0xa4, 0xee, 0x69, 0x79, 0xb8, 0xe1,
+ 0x96, 0x88, 0x4a, 0xdc, 0x43, 0xb7, 0x55, 0xed, 0xbc, 0x5a, 0x0f, 0xf6,
+ 0xe7, 0x9f, 0x49, 0xcd, 0x2a, 0x50, 0x80, 0xdc, 0x32, 0x98, 0x9f, 0x64,
+ 0x6f, 0x50, 0x68, 0x4e, 0x8d, 0x57, 0xa7, 0x3d, 0xc8, 0x40, 0x55, 0x76,
+ 0x45, 0xd0, 0x78, 0x64, 0xe0, 0x10, 0x40, 0x90, 0x11, 0x6f, 0x45, 0x04,
+ 0x0d, 0x61, 0x45, 0xe7, 0x31, 0xca, 0xe1, 0x49, 0x5e, 0x2e, 0xae, 0xab,
+ 0xb4, 0x0e, 0x31, 0xe4, 0xc7, 0xe3, 0x6f, 0x13, 0x78, 0xf3, 0xa9, 0x7b,
+ 0x30, 0x3f, 0x63, 0x85, 0xaf, 0x07, 0xb6, 0xfd, 0x09, 0xad, 0x08, 0x4a,
+ 0x22, 0x1d, 0xa6, 0xf5, 0x30, 0xe0, 0x0e, 0x4a, 0x25, 0xf2, 0xfb, 0x8b,
+ 0x92, 0xf3, 0x82, 0x7c, 0x5a, 0x54, 0xb9, 0x40, 0x69, 0x35, 0x05, 0x61,
+ 0x10, 0x1a, 0xfe, 0xd8, 0x1a, 0x8d, 0xb6, 0x48, 0x29, 0xd8, 0x32, 0xff,
+ 0xc9, 0xbd, 0x86, 0x7a, 0xdd, 0xde, 0xd7, 0xe6, 0x12, 0xa1, 0x6f, 0x51,
+ 0x18, 0x81, 0x82, 0xe9, 0xb3, 0x7b, 0xbf, 0x0b, 0xee, 0x5f, 0x97, 0x28,
+ 0x3c, 0xa1, 0x2e, 0xcc, 0x15, 0x10, 0x8d, 0xb2, 0x79, 0xc7, 0xc2, 0x0a,
+ 0xac, 0x11, 0x0e, 0xab, 0xd7, 0x82, 0x97, 0xa6, 0xad, 0x79, 0x5d, 0x57,
+ 0x08, 0xf6, 0xe0, 0xd3, 0x22, 0xf2, 0x46, 0x51, 0x6a, 0x01, 0x78, 0x95,
+ 0xae, 0xf4, 0x09, 0x3e, 0xd9, 0xed, 0x6c, 0x5f, 0x6e, 0x36, 0x7c, 0xba,
+ 0x58, 0x5e, 0x00, 0xdc, 0x9e, 0x72, 0xef, 0xc3, 0xea, 0x5d, 0x69, 0x05,
+ 0x10, 0xb4, 0x64, 0x5d, 0xd6, 0x59, 0x60, 0x53, 0x78, 0x6d, 0x99, 0xa5,
+ 0xd2, 0x28, 0x50, 0x5d, 0xf9, 0x23, 0xc8, 0xe1, 0x95, 0xda, 0x1c, 0xb0,
+ 0x43, 0x46, 0xca, 0xa4, 0x6d, 0xd0, 0x7e, 0x01, 0xff, 0x3b, 0x65, 0x00,
+ 0xc3, 0x01, 0x24, 0x29, 0x81, 0x31, 0xcf, 0xb9, 0xf5, 0x5b, 0xdb, 0xfb,
+ 0xca, 0x9b, 0x82, 0x59, 0x33, 0xf5, 0x07, 0x30, 0x94, 0x7f, 0x75, 0xf4,
+ 0x4e, 0xcc, 0x5b, 0x00, 0x26, 0x91, 0x66, 0xc5, 0xca, 0x54, 0xd0, 0x90,
+ 0x02, 0xce, 0xb0, 0x67, 0x4f, 0xe0, 0xb2, 0x22, 0xba, 0xd5, 0xd7, 0xe9,
+ 0xee, 0xd3, 0x67, 0x32, 0x6d, 0x45, 0x8b, 0x85, 0x76, 0xbc, 0xce, 0xbf,
+ 0xda, 0xda, 0xe2, 0x64, 0x39, 0x72, 0x70, 0x06, 0xd7, 0x2e, 0x62, 0x0d,
+ 0xf4, 0xec, 0x1f, 0xd7, 0xe3, 0x09, 0xf2, 0xea, 0xfd, 0xe0, 0x2c, 0xf5,
+ 0x04, 0xd1, 0x67, 0x4e, 0xe4, 0xf7, 0x1b, 0x93, 0x0d, 0xfc, 0x98, 0x2d,
+ 0xa3, 0x7f, 0xa5, 0x2b, 0xfa, 0x75, 0x09, 0xc4, 0x9a, 0x74, 0x28, 0x4e,
+ 0x14, 0x35, 0x85, 0x90, 0xeb, 0x3d, 0xea, 0x70, 0xee, 0xfb, 0x5d, 0x83,
+ 0xc8, 0x44, 0x50, 0x6c, 0x8b, 0xea, 0x4e, 0x70, 0x9d, 0x3f, 0xb2, 0x94,
+ 0x7d, 0xe4, 0x1c, 0xb7, 0x04, 0xe7, 0x69, 0xd2, 0x05, 0xbb, 0xf5, 0xb1,
+ 0x99, 0xcb, 0x8b, 0x20, 0x4b, 0x51, 0xbe, 0x69, 0x61, 0xe6, 0xe1, 0x15,
+ 0xf6, 0xaa, 0x02, 0xdc, 0x71, 0x61, 0x04, 0x09, 0x30, 0x96, 0x23, 0x40,
+ 0x60, 0x12, 0xb4, 0xfa, 0x9a, 0x58, 0x28, 0x09, 0x0e, 0xc6, 0xde, 0x23,
+ 0xeb, 0x23, 0x38, 0x07, 0x86, 0x15, 0xb6, 0x88, 0x0f, 0xc4, 0x61, 0x15,
+ 0x34, 0x10, 0xa3, 0x18, 0xf3, 0x8b, 0xd1, 0xf6, 0xbe, 0xf6, 0x24, 0x18,
+ 0x24, 0xdf, 0x14, 0x4b, 0xda, 0x0f, 0x5a, 0xf4, 0x37, 0xe3, 0xef, 0x82,
+ 0xd2, 0x6a, 0x7a, 0xe3, 0xc9, 0x1e, 0xbd, 0xf1, 0x76, 0xcc, 0x4f, 0xdd,
+ 0x96, 0xb3, 0x4b, 0xf3, 0x66, 0xec, 0xb9, 0xe7, 0xf4, 0x9c, 0xe1, 0xb8,
+ 0x69, 0x33, 0xab, 0x95, 0xa9, 0x56, 0xcc, 0xe4, 0xc9, 0x93, 0xc8, 0x4c,
+ 0x06, 0xbf, 0xf8, 0x43, 0xa7, 0xb8, 0xd7, 0x89, 0x99, 0xa8, 0xf1, 0x26,
+ 0x18, 0x07, 0x45, 0x67, 0xb6, 0xc5, 0xc6, 0xa7, 0x14, 0xbe, 0x8c, 0xb0,
+ 0xf5, 0x98, 0xae, 0xbc, 0x15, 0x90, 0x82, 0x1b, 0xa0, 0x25, 0x3d, 0xdf,
+ 0xdd, 0xdb, 0xd9, 0x7a, 0x36, 0x7a, 0x32, 0xda, 0xb5, 0xa9, 0xe0, 0x8c,
+ 0x24, 0xd2, 0x20, 0xf3, 0x2e, 0x12, 0xf2, 0x44, 0x12, 0x64, 0x5e, 0x08,
+ 0x54, 0x98, 0xfd, 0x09, 0x7c, 0x39, 0x2e, 0x09, 0x94, 0xc0, 0xc3, 0x76,
+ 0xfc, 0x6a, 0xe2, 0x58, 0x97, 0x7a, 0xea, 0x2d, 0x8d, 0x32, 0x48, 0xf1,
+ 0x6f, 0x53, 0x3d, 0x0c, 0x52, 0x31, 0x2e, 0xf2, 0xbf, 0x2e, 0xf3, 0xc6,
+ 0x68, 0x01, 0xf0, 0x28, 0x65, 0x17, 0xb6, 0xcf, 0x10, 0x4c, 0x06, 0xac,
+ 0x83, 0x4e, 0x44, 0x24, 0x1c, 0x22, 0x30, 0x28, 0x44, 0x4d, 0x0f, 0xf5,
+ 0x06, 0x15, 0xcb, 0x39, 0x64, 0x57, 0xc2, 0xed, 0xfd, 0x6a, 0x63, 0x42,
+ 0x4c, 0x48, 0x2f, 0xff, 0xd6, 0x98, 0xdf, 0x37, 0x08, 0x15, 0xa6, 0x71,
+ 0x3f, 0x24, 0x83, 0x62, 0x69, 0xb0, 0x57, 0x33, 0x12, 0x5d, 0x2b, 0x20,
+ 0xf9, 0x01, 0x57, 0x37, 0xb2, 0xd7, 0x1b, 0xeb, 0x0e, 0xa4, 0x93, 0xa3,
+ 0x43, 0x6b, 0xc7, 0xa5, 0x8b, 0x0e, 0x55, 0x17, 0x73, 0x50, 0x93, 0xa1,
+ 0x8f, 0x21, 0xa2, 0x3c, 0x44, 0xcf, 0x98, 0xb3, 0xea, 0x01, 0x0f, 0x34,
+ 0x43, 0xab, 0x0d, 0xdc, 0xdf, 0xf7, 0xb4, 0x31, 0x56, 0x1b, 0x28, 0xd4,
+ 0xa9, 0x47, 0x41, 0x99, 0xf1, 0xce, 0xf3, 0x36, 0x16, 0xbd, 0x8c, 0xf9,
+ 0xab, 0xb9, 0x6c, 0xef, 0xb7, 0xe7, 0xb2, 0xdd, 0xc7, 0x72, 0x99, 0x63,
+ 0x32, 0x3a, 0x67, 0x2b, 0x58, 0x8c, 0x78, 0x4c, 0xae, 0xde, 0x1e, 0x2e,
+ 0xf3, 0xd9, 0x4c, 0xf2, 0x35, 0x43, 0x46, 0x6b, 0xf1, 0x99, 0x65, 0xb3,
+ 0x1e, 0x2e, 0x63, 0x58, 0x55, 0xe6, 0xb1, 0xd5, 0x2c, 0xa6, 0xe0, 0x25,
+ 0xc9, 0x6a, 0x2e, 0x6b, 0xfb, 0x6c, 0x57, 0xf3, 0x99, 0x43, 0x23, 0x78,
+ 0x34, 0x97, 0x69, 0x17, 0x47, 0xc1, 0xf5, 0x7b, 0x04, 0x8f, 0xad, 0x68,
+ 0x5e, 0xbf, 0xf3, 0x22, 0xc6, 0x65, 0x7b, 0x8f, 0xe1, 0x32, 0xb3, 0xa1,
+ 0x33, 0xba, 0x2a, 0x5b, 0x5c, 0xf6, 0xe4, 0xb7, 0xe5, 0xb2, 0x04, 0xab,
+ 0x6a, 0x23, 0x23, 0x24, 0x07, 0xff, 0xe8, 0x3e, 0xa6, 0x18, 0x56, 0x47,
+ 0x0d, 0x00, 0x03, 0x7e, 0x99, 0xa4, 0x68, 0xe3, 0x49, 0x3c, 0xbc, 0x63,
+ 0xbe, 0x54, 0xd8, 0xf9, 0x15, 0x3b, 0xb6, 0xdb, 0xb5, 0x4c, 0xaa, 0x8c,
+ 0x63, 0x75, 0x7f, 0xd6, 0x98, 0xe9, 0xfe, 0xd6, 0xd6, 0xcf, 0xf0, 0xcb,
+ 0xed, 0xd3, 0xdd, 0xf7, 0x73, 0x57, 0x85, 0x8f, 0xa9, 0xb3, 0xe3, 0xd3,
+ 0xc3, 0xef, 0xc6, 0x12, 0xf3, 0x13, 0x9d, 0x43, 0x75, 0x12, 0xb6, 0xc1,
+ 0x8d, 0xae, 0x0a, 0xac, 0x8f, 0x40, 0xcd, 0x45, 0x72, 0x61, 0x32, 0xbc,
+ 0x1b, 0x68, 0xe0, 0x0d, 0xa9, 0xb6, 0x22, 0x8c, 0x01, 0xba, 0x25, 0x28,
+ 0x1a, 0x1c, 0xd3, 0x93, 0x51, 0x7b, 0x21, 0x5c, 0x79, 0x22, 0x32, 0x13,
+ 0xeb, 0x0d, 0x2b, 0xbc, 0x17, 0x37, 0x9a, 0xeb, 0x0a, 0x65, 0x8c, 0x78,
+ 0x74, 0x53, 0xc3, 0xee, 0xab, 0x66, 0x27, 0xf3, 0xfa, 0x16, 0xcd, 0x0f,
+ 0x16, 0x95, 0x66, 0x32, 0xc4, 0x8c, 0x5c, 0xfb, 0x5b, 0x75, 0xd7, 0xc6,
+ 0x20, 0x8e, 0x04, 0xc5, 0xd4, 0xa3, 0x37, 0xbd, 0x17, 0xa4, 0x8d, 0x53,
+ 0xb7, 0x0a, 0x0f, 0x01, 0x90, 0xae, 0x07, 0xc3, 0x7d, 0x05, 0x6a, 0xfb,
+ 0xec, 0x12, 0x75, 0x10, 0x4e, 0xda, 0xcd, 0xd0, 0xf8, 0xad, 0x7e, 0x62,
+ 0x86, 0xec, 0xba, 0xfa, 0xf8, 0x17, 0x29, 0xfd, 0x86, 0xff, 0xfe, 0x94,
+ 0xbe, 0x8b, 0xc0, 0x34, 0xfe, 0x75, 0x4d, 0xff, 0x94, 0x9c, 0x2c, 0xc1,
+ 0xe5, 0xf4, 0x77, 0x79, 0x12, 0x27, 0xb4, 0x5f, 0x1f, 0x6b, 0x91, 0x7c,
+ 0xde, 0x96, 0xae, 0x82, 0xdc, 0x5f, 0xb5, 0x8f, 0xd8, 0x16, 0xa4, 0x3a,
+ 0x5a, 0x29, 0x8c, 0x91, 0x9f, 0xc4, 0x15, 0xae, 0xcc, 0xc7, 0x15, 0x57,
+ 0x8c, 0x1c, 0xbf, 0x57, 0xac, 0x4b, 0x34, 0x91, 0x0d, 0x00, 0xcc, 0x6c,
+ 0xac, 0xeb, 0x07, 0x37, 0x42, 0x93, 0x79, 0xef, 0x6c, 0x7f, 0x1e, 0xba,
+ 0x24, 0xde, 0x6b, 0xfd, 0xb6, 0x03, 0xd7, 0x46, 0x3a, 0x19, 0xea, 0xa9,
+ 0x2e, 0x5c, 0xed, 0x62, 0xec, 0xb3, 0x91, 0x12, 0x6f, 0xb2, 0x7d, 0xa7,
+ 0x19, 0x1b, 0x4b, 0x17, 0x6c, 0xf7, 0x86, 0x75, 0x34, 0x40, 0xac, 0xa8,
+ 0x71, 0xb3, 0x49, 0x4f, 0x88, 0x44, 0x92, 0xa2, 0x02, 0xf9, 0x4e, 0x5e,
+ 0x0c, 0x0d, 0xd5, 0x7f, 0xe5, 0xa0, 0x7b, 0x7f, 0xff, 0x64, 0x9b, 0x76,
+ 0x55, 0x47, 0xa1, 0x5e, 0x88, 0xb3, 0x52, 0xe0, 0x99, 0x7e, 0xbf, 0x97,
+ 0x8e, 0xfe, 0x89, 0x28, 0x99, 0x4f, 0xdb, 0x56, 0xf4, 0xef, 0x06, 0x7e,
+ 0x5e, 0xe5, 0x45, 0x5a, 0x45, 0x7c, 0x36, 0xa2, 0x21, 0x2a, 0xa2, 0x96,
+ 0xe2, 0x51, 0xd9, 0x84, 0xcb, 0x94, 0x0d, 0x58, 0xd4, 0x7f, 0xd9, 0x1f,
+ 0x9a, 0xa1, 0x92, 0xb0, 0xbb, 0x98, 0x8d, 0x18, 0x71, 0x7a, 0x0e, 0x7b,
+ 0x0a, 0x06, 0xec, 0x59, 0x6c, 0x25, 0xa1, 0x0e, 0x38, 0x8d, 0x33, 0x5e,
+ 0x19, 0xda, 0xfa, 0xc8, 0xb4, 0x4a, 0x6f, 0x3d, 0x0b, 0x9a, 0x51, 0x09,
+ 0x2f, 0x11, 0x0e, 0x72, 0xa9, 0x6b, 0x54, 0x26, 0x44, 0x99, 0x2c, 0x31,
+ 0xed, 0xa3, 0x9e, 0x54, 0x99, 0x84, 0x94, 0x09, 0xd9, 0x1a, 0x59, 0x2b,
+ 0x04, 0x09, 0x6d, 0xd4, 0x8e, 0xab, 0x4c, 0x71, 0x02, 0xec, 0xaa, 0x15,
+ 0x08, 0x0a, 0xe8, 0x4f, 0xa3, 0x48, 0x21, 0x8e, 0x73, 0x67, 0x69, 0x56,
+ 0x6e, 0x2a, 0x50, 0x51, 0xf4, 0xaa, 0x22, 0x36, 0x78, 0xd1, 0xa5, 0x7a,
+ 0x81, 0x06, 0xc9, 0xf5, 0x75, 0xbe, 0xe8, 0x5e, 0xd1, 0xc3, 0x2f, 0xca,
+ 0x2f, 0x86, 0x9b, 0x16, 0x4e, 0xb6, 0xbc, 0xc9, 0x6a, 0xd8, 0x42, 0x98,
+ 0x2c, 0xe5, 0xb9, 0x5c, 0xc3, 0xc9, 0x22, 0xd7, 0x17, 0xe0, 0x09, 0x50,
+ 0x74, 0x20, 0xa0, 0xa1, 0x41, 0x3b, 0x3d, 0x9e, 0x19, 0x07, 0x8b, 0x59,
+ 0xde, 0x91, 0x3b, 0xc6, 0x50, 0xeb, 0x92, 0x73, 0x9a, 0x01, 0x60, 0x40,
+ 0xd9, 0x3f, 0xd2, 0x37, 0x83, 0xc3, 0x2c, 0xe5, 0xa2, 0x7d, 0x37, 0x11,
+ 0x16, 0x86, 0xca, 0x86, 0x97, 0x2a, 0x54, 0xbe, 0x7c, 0xb0, 0xde, 0xcd,
+ 0x8a, 0x9f, 0x4b, 0x71, 0x62, 0xd0, 0xe1, 0x43, 0xfd, 0x23, 0xf7, 0xdb,
+ 0x98, 0x5c, 0x67, 0x73, 0x69, 0x3b, 0xd8, 0x83, 0x1b, 0xd2, 0x0b, 0xb2,
+ 0xd1, 0x9e, 0x13, 0x27, 0x84, 0x5f, 0x36, 0x8b, 0xd1, 0xbc, 0xfc, 0x9b,
+ 0x21, 0x73, 0x4a, 0x7d, 0x8c, 0x83, 0x23, 0x61, 0xee, 0xfa, 0x82, 0xf7,
+ 0x85, 0xe2, 0x66, 0x85, 0xb5, 0x2a, 0x13, 0x0f, 0xe9, 0x57, 0xc0, 0x37,
+ 0x05, 0xf1, 0x31, 0x39, 0x34, 0x33, 0x3e, 0xfa, 0xf0, 0xfe, 0xed, 0xf8,
+ 0xfd, 0x59, 0x97, 0xb1, 0xcf, 0x4e, 0xdf, 0x9d, 0x1f, 0xbd, 0xfa, 0x70,
+ 0xf6, 0xee, 0xf4, 0xfc, 0xf4, 0xf0, 0xf4, 0x24, 0xd9, 0xd8, 0xd9, 0x5c,
+ 0x59, 0xd5, 0x6c, 0x3d, 0x10, 0x16, 0x29, 0xdc, 0x39, 0x63, 0x59, 0x66,
+ 0xd9, 0x59, 0x6c, 0xd0, 0x7a, 0xc2, 0xd1, 0x7e, 0x10, 0xee, 0x92, 0x1c,
+ 0x6b, 0x75, 0x19, 0xc3, 0x15, 0x81, 0xeb, 0x0d, 0x62, 0x3d, 0x4d, 0xae,
+ 0x96, 0x7c, 0x52, 0x5c, 0x96, 0x14, 0x63, 0xa3, 0x07, 0x0a, 0x97, 0x24,
+ 0x68, 0xf8, 0x05, 0xb1, 0x2b, 0xdd, 0x71, 0x4f, 0xbb, 0x3a, 0x0b, 0xed,
+ 0x01, 0x14, 0x30, 0xc7, 0x15, 0xf5, 0x6a, 0xb6, 0x60, 0xfc, 0x2c, 0xb4,
+ 0x1d, 0xb1, 0x6f, 0xa0, 0x29, 0x93, 0x04, 0x15, 0xcb, 0xc2, 0x6a, 0x74,
+ 0x23, 0x6a, 0xe8, 0x59, 0x86, 0x01, 0x74, 0xbc, 0x62, 0xe6, 0x5b, 0x48,
+ 0x93, 0x78, 0x99, 0x08, 0x62, 0xd0, 0x44, 0x5f, 0x49, 0xe4, 0x31, 0x0f,
+ 0xd0, 0x6f, 0x3d, 0xa9, 0x8a, 0x6a, 0xe0, 0x10, 0x40, 0x1b, 0x2f, 0x33,
+ 0xb6, 0xd4, 0xad, 0x37, 0x29, 0x1a, 0x8e, 0x94, 0x32, 0x20, 0x35, 0x47,
+ 0x24, 0xec, 0x91, 0xc6, 0x2b, 0x19, 0x17, 0x0b, 0x27, 0x12, 0xea, 0x8b,
+ 0x22, 0xaa, 0x8d, 0xfd, 0xc5, 0x3c, 0xc0, 0xc8, 0x4c, 0x44, 0x8a, 0x21,
+ 0x0d, 0x68, 0xef, 0x07, 0xcc, 0xd0, 0x12, 0xa9, 0x5d, 0x51, 0x54, 0xf7,
+ 0x75, 0x1b, 0x98, 0xd6, 0x6f, 0x56, 0xc1, 0x45, 0xd3, 0x98, 0xc8, 0xc0,
+ 0x22, 0xbd, 0xbd, 0xee, 0x4c, 0xab, 0x2b, 0x7e, 0x9e, 0x8f, 0x9e, 0x3d,
+ 0x1d, 0xed, 0x12, 0x4c, 0xd1, 0xe9, 0x8c, 0x42, 0x9b, 0xa2, 0x58, 0xc0,
+ 0xb9, 0x8c, 0x0f, 0x08, 0x26, 0x1b, 0x52, 0x42, 0x1c, 0xad, 0x64, 0xc4,
+ 0x98, 0x2d, 0xa5, 0x18, 0x0a, 0x7a, 0x93, 0x29, 0x90, 0x0d, 0xe3, 0xe3,
+ 0x69, 0x33, 0x0b, 0x82, 0xc1, 0x32, 0x9f, 0xd9, 0x77, 0xd9, 0xaf, 0x94,
+ 0x0f, 0xda, 0x95, 0xb5, 0xc7, 0xb6, 0xcf, 0xee, 0xf8, 0xf0, 0x4c, 0xe0,
+ 0x66, 0x1c, 0x30, 0x0e, 0xc4, 0x39, 0x5e, 0x37, 0xac, 0xba, 0x3d, 0xda,
+ 0x4e, 0xc6, 0x6f, 0xbe, 0x16, 0x0c, 0xed, 0xaf, 0xc7, 0x11, 0x4d, 0x00,
+ 0xfa, 0xbc, 0xbe, 0x3e, 0xf2, 0xe3, 0x8b, 0xb4, 0x38, 0x33, 0xbb, 0x3f,
+ 0xd0, 0x7f, 0xb5, 0x70, 0x08, 0x99, 0xf9, 0x6e, 0xc5, 0x49, 0xe0, 0xe4,
+ 0x53, 0x92, 0x0e, 0x3c, 0xdc, 0x1a, 0x73, 0x5e, 0x09, 0xab, 0x3c, 0xb6,
+ 0xe4, 0xd1, 0x6a, 0xec, 0xcb, 0xdd, 0xe0, 0xa0, 0x3d, 0x78, 0xc4, 0x9c,
+ 0xb3, 0xfb, 0xa1, 0x43, 0x26, 0x9a, 0x92, 0xde, 0x0e, 0xdd, 0x3b, 0xed,
+ 0xac, 0x75, 0x06, 0x32, 0xaa, 0x9a, 0x85, 0x63, 0x78, 0x96, 0x5d, 0x42,
+ 0x35, 0x44, 0x29, 0xfb, 0x00, 0xbf, 0x44, 0x90, 0xd9, 0x26, 0xcb, 0xc6,
+ 0x81, 0x10, 0xb1, 0x4d, 0xa8, 0x32, 0xf6, 0xb4, 0x6d, 0x0b, 0x9c, 0xba,
+ 0x6e, 0x08, 0x4b, 0x3d, 0x27, 0x05, 0x4f, 0x61, 0x76, 0x8f, 0x30, 0x64,
+ 0x7e, 0xc7, 0x67, 0xfb, 0x6f, 0x59, 0x55, 0x86, 0x39, 0x0f, 0x50, 0x1e,
+ 0x14, 0xbe, 0xd2, 0xa8, 0xdc, 0x07, 0x8a, 0xaf, 0xe5, 0x7e, 0x48, 0x5f,
+ 0x0d, 0xce, 0xdc, 0x1f, 0xcc, 0xda, 0xa8, 0x00, 0x5f, 0x0a, 0x05, 0x1c,
+ 0xbe, 0x12, 0xa0, 0x62, 0x73, 0x8d, 0x53, 0x7b, 0x32, 0x60, 0x46, 0xb5,
+ 0xf7, 0xf7, 0x5c, 0xb6, 0x1f, 0x98, 0x98, 0x50, 0xff, 0xa6, 0x64, 0xca,
+ 0xb8, 0xaa, 0x03, 0x1b, 0x5e, 0xa3, 0xd6, 0xa2, 0x0e, 0x62, 0x53, 0xf4,
+ 0xb9, 0x50, 0xa6, 0x0f, 0x93, 0xe4, 0x55, 0x56, 0xdc, 0xab, 0x4c, 0x77,
+ 0x09, 0xb3, 0x00, 0xca, 0xba, 0x61, 0x9f, 0xb8, 0xc3, 0x72, 0xe1, 0x16,
+ 0x5a, 0x97, 0x6e, 0x8a, 0xe1, 0x94, 0xda, 0x73, 0x8e, 0x49, 0xae, 0x2f,
+ 0x2c, 0x19, 0x20, 0xb4, 0xda, 0xb4, 0xd8, 0x00, 0x1c, 0x93, 0x46, 0xd9,
+ 0xf1, 0x3d, 0x1d, 0x71, 0x25, 0x19, 0x36, 0x11, 0xd7, 0x84, 0x49, 0x57,
+ 0x2f, 0x2f, 0xfe, 0x22, 0xed, 0x00, 0xc8, 0xb5, 0x50, 0x09, 0x19, 0x24,
+ 0xc1, 0xda, 0xec, 0xaa, 0x79, 0x80, 0xc3, 0x56, 0x46, 0x3a, 0x14, 0xb1,
+ 0xe1, 0x10, 0xff, 0xcf, 0xbd, 0x3c, 0x32, 0xc7, 0x62, 0x98, 0x52, 0xb4,
+ 0x1e, 0x3a, 0xeb, 0x51, 0x19, 0xf4, 0xfc, 0x0c, 0x2f, 0x49, 0xa6, 0x72,
+ 0xde, 0x6e, 0xe7, 0xf2, 0x65, 0x5a, 0x72, 0xae, 0xb8, 0xad, 0x5c, 0xa0,
+ 0xc7, 0x7b, 0xc7, 0x52, 0x49, 0x5d, 0x0f, 0xfe, 0x40, 0xff, 0x09, 0xd7,
+ 0xd0, 0x62, 0x59, 0x22, 0xb3, 0x0a, 0x12, 0x7a, 0x1c, 0x62, 0x09, 0xaf,
+ 0xf7, 0x7d, 0xe0, 0x0b, 0x77, 0x0d, 0xac, 0x1e, 0x1b, 0x52, 0xec, 0x31,
+ 0x1f, 0x78, 0x5f, 0x28, 0x7c, 0xa9, 0x72, 0xf7, 0xc2, 0x36, 0x15, 0x92,
+ 0xca, 0xb0, 0xb6, 0x21, 0x44, 0xa8, 0x57, 0x0b, 0x69, 0x36, 0x96, 0x5e,
+ 0x52, 0x51, 0x47, 0x95, 0xb9, 0x76, 0x05, 0xb4, 0x93, 0x0c, 0x6e, 0x27,
+ 0x6d, 0x55, 0xb4, 0xc6, 0x60, 0x51, 0x36, 0xdc, 0xe0, 0x85, 0xaa, 0x40,
+ 0x48, 0xd3, 0xa9, 0xc8, 0x47, 0xe8, 0x11, 0x59, 0x95, 0x64, 0x1a, 0xcd,
+ 0x6e, 0x3e, 0x27, 0x1c, 0x50, 0xb4, 0x50, 0xf2, 0x73, 0xb5, 0xf9, 0x85,
+ 0xe3, 0x4c, 0xfe, 0x1c, 0x27, 0xf2, 0xc2, 0xe5, 0xe4, 0x82, 0x7b, 0xe9,
+ 0x4d, 0x99, 0x53, 0x1a, 0xa8, 0x95, 0xc9, 0x1d, 0x7c, 0xf4, 0xf3, 0xb0,
+ 0x3d, 0x59, 0x34, 0x8b, 0xcf, 0xa6, 0x5f, 0xc2, 0xe5, 0xe1, 0x55, 0xfc,
+ 0xf2, 0xe9, 0xd6, 0xe1, 0x90, 0x82, 0x84, 0x70, 0x75, 0x41, 0x61, 0xa6,
+ 0x22, 0x6d, 0xf4, 0xbc, 0x78, 0xe2, 0x96, 0x66, 0x48, 0x66, 0x1a, 0xe5,
+ 0x61, 0xa4, 0x74, 0x2b, 0x69, 0x45, 0x73, 0xa7, 0x87, 0x8b, 0xef, 0x5a,
+ 0xf2, 0x74, 0x01, 0x5b, 0x0e, 0xe0, 0xd4, 0xdc, 0xd1, 0x03, 0x77, 0xc4,
+ 0xdd, 0xbd, 0x26, 0x20, 0xaf, 0x54, 0xc1, 0x16, 0x40, 0xf3, 0x30, 0x84,
+ 0xce, 0x1b, 0x6c, 0x58, 0xa7, 0x00, 0x42, 0xeb, 0x02, 0xc4, 0x5f, 0x33,
+ 0x9f, 0x2f, 0xc3, 0x86, 0xd1, 0x12, 0xad, 0xf3, 0x53, 0x83, 0x39, 0x8d,
+ 0x14, 0x0a, 0x90, 0x38, 0x6a, 0xb8, 0xaf, 0x95, 0xd7, 0xeb, 0x8b, 0xea,
+ 0x4c, 0x28, 0x7e, 0x17, 0xf7, 0x23, 0x6e, 0x59, 0x1c, 0x37, 0xc3, 0x30,
+ 0xc5, 0x74, 0x68, 0x84, 0xc0, 0x62, 0x85, 0x1f, 0xce, 0xb9, 0xaa, 0xec,
+ 0x5f, 0x38, 0x6b, 0xbb, 0x55, 0x48, 0xc1, 0xd9, 0xd9, 0xab, 0xfc, 0xf3,
+ 0x7b, 0x31, 0x32, 0xc6, 0xd2, 0xbf, 0xbb, 0x97, 0x2c, 0xad, 0xa8, 0xb7,
+ 0xd3, 0x15, 0x93, 0x0f, 0xd4, 0x53, 0x6a, 0xc5, 0xb2, 0xaa, 0x5d, 0xc3,
+ 0x04, 0xa1, 0xd9, 0x7b, 0x2e, 0xa8, 0xc6, 0x88, 0xc0, 0xc9, 0x28, 0xa4,
+ 0xe0, 0xc6, 0xfb, 0x12, 0xdb, 0x71, 0x01, 0x11, 0x01, 0xab, 0xa8, 0x3d,
+ 0x93, 0xf8, 0x49, 0xc4, 0x82, 0x7c, 0x51, 0x17, 0xdf, 0xea, 0x88, 0x23,
+ 0x08, 0x42, 0x12, 0x1f, 0xa2, 0x89, 0xe5, 0x2b, 0x61, 0x8b, 0x62, 0x3b,
+ 0x11, 0x83, 0xeb, 0x9a, 0x76, 0x0a, 0x19, 0xf4, 0xe7, 0x93, 0x94, 0x42,
+ 0xb6, 0xf1, 0x44, 0xd4, 0xb1, 0x9c, 0xb4, 0xa1, 0x3e, 0x45, 0x12, 0x1a,
+ 0x47, 0x37, 0x2f, 0x7c, 0xb7, 0x20, 0xf7, 0xdb, 0xbc, 0x6b, 0x56, 0x3a,
+ 0x6e, 0xe5, 0x6b, 0x14, 0xa8, 0x1f, 0xd8, 0x11, 0xe1, 0xb2, 0xe5, 0x1f,
+ 0xaa, 0x1b, 0xf7, 0x6e, 0x60, 0x27, 0x37, 0x7a, 0xb4, 0x5b, 0xa5, 0x35,
+ 0xbc, 0x24, 0x81, 0xf7, 0xaf, 0x05, 0x0f, 0xfd, 0x9a, 0xb5, 0x74, 0xca,
+ 0x23, 0xdc, 0x1a, 0xbc, 0x49, 0x6b, 0xa9, 0x02, 0x7f, 0x66, 0x05, 0xf3,
+ 0xf7, 0x2c, 0xc1, 0x8c, 0xc8, 0x9d, 0xd4, 0x5f, 0xd2, 0x9f, 0x2b, 0x96,
+ 0x61, 0x1f, 0xfc, 0xa5, 0x2b, 0x79, 0x98, 0x8c, 0xe0, 0x08, 0xfa, 0xf3,
+ 0xcf, 0xfb, 0xf0, 0xfb, 0x4d, 0x7f, 0xee, 0x9d, 0xc7, 0xd1, 0x40, 0xe6,
+ 0xf2, 0x09, 0xa6, 0x91, 0x2f, 0xae, 0x49, 0x99, 0x7c, 0x19, 0xab, 0xd1,
+ 0xf4, 0x08, 0x21, 0x8f, 0xfd, 0xf6, 0xdf, 0xaf, 0x66, 0x0e, 0xc9, 0x6e,
+ 0xc5, 0xf7, 0xe5, 0xb1, 0xdf, 0xfc, 0xfb, 0x7c, 0x64, 0x1f, 0xf4, 0xf3,
+ 0x40, 0x38, 0xbd, 0x92, 0x42, 0x98, 0x88, 0x1c, 0xfc, 0xd5, 0x82, 0x50,
+ 0x8a, 0x6b, 0x42, 0x49, 0x28, 0x1f, 0xa3, 0x77, 0x83, 0x26, 0x87, 0x22,
+ 0x0a, 0x21, 0x09, 0xff, 0x71, 0xa9, 0x05, 0x59, 0x1c, 0x52, 0x46, 0x7a,
+ 0xff, 0xbd, 0xe4, 0xff, 0x6e, 0x7d, 0x15, 0xdb, 0x20, 0x2d, 0x56, 0xa4,
+ 0x3b, 0x4f, 0x9b, 0x05, 0xa2, 0xff, 0x1c, 0x83, 0x03, 0x89, 0x7e, 0x6b,
+ 0x9b, 0xaa, 0xf9, 0xdd, 0x68, 0xb0, 0xca, 0x58, 0x8b, 0x42, 0x21, 0x8f,
+ 0xe6, 0x61, 0x6b, 0x50, 0xc2, 0x65, 0x08, 0x91, 0x9a, 0x91, 0x79, 0x5f,
+ 0xac, 0x2d, 0x06, 0x5b, 0xc4, 0x11, 0xea, 0x37, 0x79, 0x77, 0x00, 0xe5,
+ 0xdf, 0x0e, 0xa4, 0x43, 0xa0, 0x19, 0x8d, 0x58, 0x4a, 0x92, 0x90, 0x45,
+ 0xb6, 0xc8, 0x5e, 0x86, 0x60, 0x6e, 0x5c, 0xdb, 0xc2, 0x05, 0x60, 0x8c,
+ 0x23, 0x60, 0x56, 0x78, 0x78, 0xfa, 0xf6, 0xed, 0xd1, 0x61, 0x37, 0x34,
+ 0x68, 0x5b, 0xa9, 0x3b, 0xc5, 0x3e, 0x9a, 0x28, 0xcb, 0x7d, 0x82, 0x24,
+ 0x36, 0xc4, 0xdf, 0x47, 0xf7, 0xca, 0x54, 0x20, 0xd8, 0xf9, 0x97, 0xd2,
+ 0x86, 0x89, 0xe1, 0xb9, 0x65, 0xfb, 0x23, 0x35, 0xc1, 0x01, 0x33, 0xf8,
+ 0x00, 0x31, 0xdc, 0x18, 0xb6, 0x46, 0x3b, 0x54, 0xa8, 0x9d, 0x30, 0x58,
+ 0x65, 0x16, 0xa8, 0x70, 0x98, 0x4e, 0xb7, 0xa4, 0x2a, 0x40, 0xbf, 0xdd,
+ 0xc7, 0xc8, 0x8c, 0xe8, 0x49, 0xa5, 0x85, 0xc3, 0xf2, 0x92, 0x9b, 0xe6,
+ 0xcc, 0xd3, 0xea, 0x23, 0x05, 0xaf, 0xbd, 0x4a, 0x07, 0x94, 0x99, 0xa3,
+ 0xb9, 0xc0, 0x74, 0x1a, 0x43, 0x9e, 0x81, 0x8f, 0xdd, 0x2f, 0xa6, 0x92,
+ 0xc9, 0x48, 0x67, 0xe9, 0x7d, 0xad, 0xfe, 0xa6, 0xd7, 0x8b, 0xec, 0x96,
+ 0x3e, 0xc3, 0x70, 0x5b, 0x04, 0x1f, 0x13, 0xf6, 0x96, 0xe2, 0xfe, 0x10,
+ 0x1c, 0x43, 0x90, 0x0a, 0x14, 0x6c, 0xd5, 0x9c, 0xbb, 0x37, 0x01, 0x70,
+ 0x9f, 0x7a, 0xac, 0x72, 0xe5, 0x60, 0x40, 0xab, 0x6f, 0x05, 0x34, 0xb7,
+ 0x13, 0x3e, 0x0b, 0xb2, 0x8e, 0xa5, 0xac, 0xd2, 0x02, 0xe9, 0xa2, 0xb6,
+ 0xac, 0x0f, 0x7d, 0x8c, 0x29, 0x8d, 0x6d, 0x20, 0xdb, 0xa4, 0x6e, 0x0d,
+ 0xa1, 0xbb, 0x9b, 0xf6, 0xc4, 0xf9, 0xc6, 0xd4, 0x04, 0x03, 0x67, 0x85,
+ 0x3e, 0x61, 0x24, 0xd8, 0xd3, 0x2e, 0xa0, 0x3b, 0x10, 0x0f, 0xe1, 0x12,
+ 0x25, 0x90, 0xd3, 0x2b, 0x54, 0x9b, 0xd0, 0xc3, 0x38, 0xac, 0x81, 0x52,
+ 0x4b, 0xd2, 0x14, 0xe5, 0xc3, 0x03, 0xb1, 0x01, 0x10, 0xb1, 0x34, 0xd4,
+ 0xa5, 0x7d, 0x10, 0xda, 0x2b, 0x74, 0x19, 0xc7, 0x1c, 0xe4, 0x00, 0x9b,
+ 0xff, 0x2e, 0x96, 0x4d, 0x10, 0x36, 0x24, 0x10, 0x47, 0xc6, 0xef, 0xf9,
+ 0x6a, 0x18, 0xb6, 0xfb, 0x4c, 0xa7, 0xfe, 0x9e, 0x42, 0x7a, 0xc3, 0xc8,
+ 0xaf, 0x9b, 0x69, 0xfe, 0x10, 0xbc, 0x2e, 0xe0, 0xd5, 0x6d, 0x7b, 0xb2,
+ 0xb6, 0x0d, 0x03, 0x8a, 0x39, 0x56, 0xdd, 0x82, 0x17, 0xa1, 0xcb, 0x0b,
+ 0xf6, 0x15, 0x15, 0x11, 0xab, 0xb0, 0xba, 0x80, 0x85, 0xd1, 0x91, 0x7e,
+ 0xc6, 0xa6, 0x21, 0x37, 0x56, 0xd6, 0x77, 0x23, 0x7d, 0x1c, 0x00, 0xe8,
+ 0x99, 0x1f, 0xfa, 0xed, 0xaf, 0xa5, 0x8f, 0xd9, 0xfd, 0xa3, 0x14, 0x14,
+ 0xfb, 0xdc, 0xa7, 0x98, 0x41, 0xf2, 0xd2, 0xfc, 0xb1, 0xf2, 0xdb, 0x8f,
+ 0xff, 0x6c, 0x80, 0x68, 0xfb, 0xb8, 0x2b, 0xd7, 0xe1, 0x34, 0x3b, 0xa0,
+ 0xe6, 0xa0, 0x1d, 0xdd, 0x6d, 0x58, 0xec, 0xdb, 0xba, 0x8e, 0x57, 0x5e,
+ 0xc0, 0xae, 0xda, 0xd5, 0xbf, 0x83, 0x23, 0xe1, 0xf9, 0x18, 0x66, 0xb4,
+ 0x04, 0x9c, 0x1e, 0x77, 0x1f, 0x3f, 0x78, 0x05, 0xb7, 0xc0, 0x02, 0xba,
+ 0x59, 0x55, 0xb6, 0x56, 0xf8, 0x91, 0x84, 0x8b, 0x54, 0xce, 0x27, 0xff,
+ 0xa0, 0xae, 0x82, 0x02, 0xe5, 0x96, 0xa6, 0x82, 0xaf, 0xb4, 0x88, 0xf0,
+ 0x98, 0x5b, 0x29, 0x20, 0x49, 0xb7, 0xe2, 0xb8, 0x45, 0xa8, 0x90, 0x0a,
+ 0xab, 0x72, 0xdc, 0x1d, 0x7b, 0xe2, 0xa9, 0xdf, 0xfc, 0x58, 0x3c, 0x3e,
+ 0x41, 0xbb, 0xbd, 0x31, 0x2b, 0xb3, 0xb3, 0x39, 0xfb, 0x97, 0x73, 0xaa,
+ 0xfb, 0x13, 0xb4, 0xbb, 0x19, 0xda, 0x9e, 0x0f, 0x22, 0x92, 0xa2, 0x8d,
+ 0xd1, 0xfe, 0x2f, 0x4c, 0xd0, 0xf6, 0xf3, 0xb3, 0x53, 0x64, 0x67, 0x47,
+ 0x92, 0xb3, 0x85, 0xd0, 0x92, 0x9d, 0x29, 0xdd, 0x99, 0x57, 0x25, 0x68,
+ 0xfb, 0x19, 0xda, 0xab, 0x52, 0xb4, 0x01, 0x7d, 0xb1, 0x22, 0x41, 0xfb,
+ 0xd7, 0xe5, 0x67, 0xf7, 0x25, 0x68, 0xff, 0xf2, 0x0c, 0xed, 0xdf, 0x36,
+ 0x41, 0xfb, 0xb7, 0xcc, 0x3d, 0xc6, 0xe9, 0xa1, 0x1d, 0xc9, 0x27, 0x52,
+ 0xe9, 0xfb, 0xb2, 0x17, 0xb8, 0x5c, 0x4b, 0x2e, 0x5b, 0xe9, 0x2a, 0x5e,
+ 0x50, 0x59, 0x86, 0x61, 0x8d, 0xc6, 0x53, 0xdc, 0xc3, 0x2a, 0x21, 0xe1,
+ 0x95, 0x48, 0xbe, 0x9b, 0x1f, 0xf5, 0xdd, 0x8b, 0x9d, 0xf4, 0xba, 0x9e,
+ 0x71, 0x7f, 0x4d, 0x42, 0x36, 0x08, 0x4c, 0x44, 0x27, 0x67, 0x3a, 0xcf,
+ 0xfd, 0xf6, 0x22, 0xa7, 0x99, 0xd5, 0x3b, 0x7b, 0xce, 0x50, 0x97, 0xbf,
+ 0x2c, 0xa9, 0x7e, 0x39, 0x66, 0xb4, 0x4b, 0x79, 0xc8, 0xd8, 0x56, 0xe0,
+ 0x8b, 0xbf, 0x17, 0xaf, 0xc1, 0x27, 0x9a, 0xd9, 0x1e, 0xc3, 0x36, 0x00,
+ 0xa1, 0x5c, 0x13, 0x96, 0xbe, 0x00, 0x64, 0xc3, 0x5f, 0x07, 0xee, 0x10,
+ 0x2a, 0x72, 0x51, 0xa1, 0x5d, 0xe3, 0x14, 0xee, 0x8c, 0xf6, 0x18, 0x80,
+ 0x41, 0x03, 0x38, 0x32, 0xcf, 0x00, 0xf7, 0x0e, 0xdf, 0xe7, 0x86, 0x03,
+ 0x2e, 0xe3, 0x8c, 0x7b, 0x22, 0xea, 0x3b, 0xa3, 0xe4, 0x1d, 0xa9, 0x8f,
+ 0x46, 0x59, 0x37, 0x33, 0x92, 0xc1, 0xe5, 0x77, 0xb1, 0xe1, 0xda, 0x50,
+ 0xd7, 0x86, 0x7f, 0xde, 0xbf, 0x3b, 0x09, 0xa3, 0xd1, 0x88, 0x15, 0xec,
+ 0x6f, 0x6d, 0x21, 0x1f, 0xea, 0x3a, 0xbd, 0xbb, 0x1b, 0xd5, 0xd9, 0xd6,
+ 0xb4, 0x9c, 0xd4, 0x5b, 0xb4, 0x83, 0xfa, 0xe5, 0xeb, 0x66, 0x3e, 0x5b,
+ 0x95, 0xe3, 0x90, 0xd7, 0x5a, 0x27, 0xad, 0xc0, 0xde, 0x2e, 0xcf, 0x92,
+ 0xad, 0xad, 0xdc, 0x6f, 0x65, 0x01, 0xb9, 0x1f, 0xe0, 0xe0, 0xa1, 0x86,
+ 0xc0, 0x2c, 0xca, 0xfc, 0x1f, 0x7a, 0x3a, 0x51, 0x08, 0x29, 0x52, 0x68,
+ 0xee, 0xb7, 0x7e, 0xf7, 0x2a, 0x06, 0xc2, 0x0d, 0x62, 0x3b, 0x80, 0x80,
+ 0xab, 0xb3, 0x06, 0x22, 0xac, 0x4d, 0x33, 0x25, 0x7a, 0xab, 0xeb, 0xba,
+ 0x65, 0xaf, 0xb0, 0x2d, 0x24, 0xf8, 0xac, 0xa7, 0x11, 0xfb, 0x6f, 0x2e,
+ 0x12, 0x0c, 0x77, 0xd3, 0x2d, 0xff, 0x18, 0x65, 0xd7, 0x7f, 0xf4, 0x53,
+ 0x9c, 0x32, 0x9b, 0x7e, 0xf7, 0x92, 0x73, 0xeb, 0x56, 0xce, 0xc4, 0x3e,
+ 0xfc, 0x29, 0x66, 0x02, 0x18, 0x90, 0xa8, 0x7c, 0x6c, 0xcd, 0x01, 0x8f,
+ 0x7d, 0x8a, 0xef, 0xdf, 0xec, 0xf4, 0x7d, 0x76, 0x67, 0xc0, 0x9f, 0xbe,
+ 0xd9, 0xf9, 0x0d, 0x3f, 0xfc, 0xde, 0x39, 0xa8, 0x78, 0xe5, 0xf4, 0xe7,
+ 0xbe, 0x52, 0x78, 0x65, 0xf7, 0xca, 0x9e, 0xd6, 0x20, 0x22, 0xdf, 0xdc,
+ 0xdd, 0xb0, 0x1a, 0x9a, 0x28, 0xc6, 0xe6, 0x74, 0xae, 0x18, 0x77, 0x4e,
+ 0x5a, 0x07, 0xa0, 0x97, 0xcb, 0x50, 0x71, 0x47, 0x19, 0xa7, 0x89, 0xa1,
+ 0xb3, 0xe8, 0xd3, 0xd3, 0x52, 0xa1, 0xdc, 0x8c, 0xa1, 0x10, 0xbf, 0x86,
+ 0x32, 0x84, 0xf6, 0x23, 0xb8, 0x55, 0x6c, 0x88, 0xdb, 0x83, 0xec, 0xb7,
+ 0x15, 0xe3, 0xbe, 0xf3, 0x11, 0xc7, 0xd6, 0xaa, 0x9e, 0x28, 0x90, 0xd9,
+ 0x3e, 0xe0, 0xd9, 0x85, 0xf5, 0xa3, 0x41, 0xae, 0x74, 0x85, 0xa8, 0xa2,
+ 0x66, 0xdb, 0xfc, 0x4d, 0xef, 0x88, 0xef, 0x27, 0x6b, 0xc3, 0xf7, 0xc9,
+ 0xfe, 0x5a, 0x40, 0xa2, 0xd3, 0x42, 0x7a, 0x4a, 0xc1, 0xe3, 0x55, 0x01,
+ 0x89, 0x00, 0x6d, 0xea, 0x7c, 0xcd, 0xe4, 0x9a, 0x60, 0xd1, 0x9c, 0x39,
+ 0x61, 0xfb, 0xb1, 0x5c, 0x05, 0x21, 0xb7, 0xb9, 0xf6, 0xcb, 0xb6, 0xfd,
+ 0xd3, 0xe8, 0x22, 0x21, 0xa7, 0x8d, 0x6b, 0xb1, 0x00, 0xed, 0x89, 0x7b,
+ 0xc3, 0x90, 0x68, 0xa5, 0xd0, 0x21, 0x85, 0x2e, 0xa9, 0xec, 0x3e, 0x84,
+ 0x34, 0x45, 0x84, 0xb6, 0xd6, 0xc2, 0xb9, 0x45, 0x59, 0xd7, 0xf9, 0x85,
+ 0x91, 0xd4, 0x57, 0x22, 0x22, 0xeb, 0x8c, 0xb3, 0xa7, 0xb8, 0xd0, 0x9a,
+ 0xa8, 0xd9, 0xc2, 0x5f, 0xe8, 0x92, 0x08, 0x2b, 0x15, 0xd8, 0x07, 0x71,
+ 0x2e, 0x99, 0xd9, 0xb1, 0x60, 0xbb, 0xc9, 0x69, 0x68, 0xe6, 0xb6, 0x34,
+ 0xb9, 0xa8, 0xf2, 0xec, 0x92, 0x12, 0x1b, 0xb1, 0x22, 0x51, 0xbc, 0xba,
+ 0x42, 0x76, 0x46, 0xc0, 0x3f, 0x94, 0x92, 0x43, 0x79, 0xb5, 0x35, 0x41,
+ 0xdb, 0x22, 0xd9, 0x1a, 0x99, 0x8e, 0x2e, 0x93, 0xbb, 0xca, 0x28, 0x4f,
+ 0x80, 0xfa, 0x31, 0x63, 0x11, 0xa9, 0xf6, 0xf6, 0xea, 0xc9, 0x40, 0xad,
+ 0x6c, 0x07, 0x00, 0xd4, 0x36, 0x00, 0x78, 0x4c, 0x0f, 0x28, 0xbe, 0x88,
+ 0x5e, 0xb1, 0x9a, 0xac, 0xeb, 0xb0, 0x13, 0x46, 0x9f, 0x4c, 0xc6, 0x3b,
+ 0x17, 0xf4, 0x2f, 0xc9, 0xfa, 0x6f, 0xb7, 0x12, 0x5c, 0x95, 0x03, 0xef,
+ 0xe5, 0x41, 0x07, 0x40, 0x4d, 0xf1, 0xe4, 0xf7, 0x4b, 0x6a, 0xbd, 0x91,
+ 0xbc, 0xed, 0x6a, 0x39, 0x91, 0x34, 0x72, 0x4a, 0x97, 0xe3, 0xec, 0x34,
+ 0xbb, 0xba, 0x06, 0xf0, 0x0e, 0x28, 0xdc, 0xf7, 0xc3, 0xc0, 0xef, 0x83,
+ 0x2b, 0xde, 0x25, 0xc7, 0xf7, 0xa7, 0xc3, 0x7b, 0xd9, 0xf0, 0x28, 0xff,
+ 0x60, 0x1f, 0x79, 0x4a, 0x33, 0x08, 0xef, 0x64, 0xea, 0x54, 0xc0, 0x99,
+ 0xf0, 0x9a, 0x08, 0xef, 0xe7, 0xc1, 0x1b, 0x9d, 0xcf, 0x8b, 0xcc, 0x3b,
+ 0x6c, 0x61, 0x72, 0xb0, 0xc6, 0x01, 0x73, 0x70, 0x42, 0xd1, 0x65, 0xe6,
+ 0x79, 0xd0, 0x25, 0xd6, 0x97, 0xe5, 0x3a, 0xd4, 0x4d, 0x9e, 0x5a, 0x05,
+ 0xca, 0x7d, 0x88, 0xe9, 0x29, 0x20, 0xf3, 0x69, 0x6f, 0x25, 0x08, 0x49,
+ 0x7b, 0x86, 0xf3, 0x8a, 0xd4, 0x71, 0xbe, 0x1d, 0x8f, 0xc3, 0x84, 0xf8,
+ 0xc2, 0x18, 0x27, 0xe5, 0x55, 0x91, 0xff, 0x0d, 0xd0, 0x57, 0x14, 0xb2,
+ 0xec, 0x26, 0xb3, 0xb6, 0x4a, 0x12, 0x12, 0x2f, 0xfc, 0x4e, 0x69, 0x11,
+ 0xa1, 0x7c, 0x43, 0xca, 0x1c, 0x6e, 0x1d, 0x4a, 0xfe, 0x22, 0x98, 0x3c,
+ 0x9b, 0xf7, 0x47, 0x41, 0x06, 0xe9, 0xea, 0xce, 0xb6, 0x98, 0xcd, 0x94,
+ 0xe5, 0x0f, 0x07, 0x9b, 0xab, 0x5c, 0x21, 0x58, 0x41, 0xfd, 0xd0, 0x4e,
+ 0xbf, 0xbc, 0x84, 0x00, 0x8d, 0x57, 0x7f, 0x79, 0x01, 0x41, 0x1c, 0xe4,
+ 0x0d, 0xb0, 0x51, 0x74, 0x34, 0xfc, 0x9b, 0xc0, 0x43, 0xd0, 0x91, 0x0c,
+ 0x6c, 0xa3, 0x33, 0xc6, 0xca, 0xd7, 0x84, 0xc6, 0x7c, 0x91, 0x3e, 0x0a,
+ 0x4c, 0x53, 0x95, 0xcf, 0x34, 0x3c, 0x5b, 0x5d, 0x1c, 0x4d, 0x1b, 0xe8,
+ 0x78, 0x04, 0x80, 0x26, 0xb9, 0xf1, 0x15, 0xf5, 0x4a, 0xfc, 0xe9, 0x68,
+ 0xe8, 0xc4, 0x68, 0x0b, 0x19, 0xa3, 0x5e, 0xda, 0xba, 0x1f, 0xb1, 0x51,
+ 0xe8, 0xc0, 0x46, 0x9b, 0x0c, 0x13, 0xf8, 0x02, 0x74, 0x77, 0xb8, 0x97,
+ 0xa5, 0xf6, 0x8b, 0xdb, 0xf9, 0x61, 0x80, 0x11, 0xc1, 0x3c, 0x52, 0x15,
+ 0x95, 0xba, 0xee, 0xcd, 0xaf, 0xa9, 0x2e, 0x4b, 0xb9, 0xa2, 0xcb, 0x5a,
+ 0xae, 0x8d, 0x88, 0x9d, 0x22, 0x27, 0x84, 0x88, 0x8f, 0xdf, 0x36, 0xc6,
+ 0x6c, 0xdf, 0x62, 0x8c, 0x73, 0x1c, 0xb0, 0x96, 0x00, 0x03, 0x41, 0x0b,
+ 0x58, 0x1a, 0x9b, 0x8c, 0xc0, 0xc4, 0xb8, 0x88, 0xc8, 0xf2, 0xca, 0x80,
+ 0xa4, 0x0f, 0x8b, 0x5c, 0xf1, 0xd4, 0x0d, 0x17, 0x2a, 0x65, 0xbb, 0x8b,
+ 0xbd, 0x97, 0x41, 0x7a, 0x74, 0xf9, 0x4f, 0x50, 0x77, 0xf2, 0xab, 0x0a,
+ 0x4f, 0x3e, 0x6d, 0xdd, 0x89, 0xbb, 0x29, 0xe8, 0xd6, 0x09, 0xef, 0x09,
+ 0x44, 0x09, 0xc9, 0x25, 0xc3, 0x49, 0x4f, 0xb7, 0xa9, 0xed, 0x6f, 0xc5,
+ 0xaf, 0x75, 0x86, 0x8b, 0x1f, 0xa6, 0x41, 0xd2, 0xca, 0x89, 0xcd, 0x02,
+ 0x19, 0xb9, 0x21, 0x52, 0x63, 0xb3, 0x07, 0x67, 0x29, 0xa3, 0x02, 0xf1,
+ 0x69, 0x26, 0x08, 0x80, 0x7f, 0x70, 0xfd, 0xa5, 0x3e, 0xb5, 0x01, 0xb6,
+ 0x63, 0x64, 0xf3, 0x4b, 0xef, 0x3e, 0xfe, 0xf2, 0xc1, 0x0b, 0x19, 0xe7,
+ 0x8c, 0x5e, 0x73, 0x38, 0xbb, 0x9e, 0xbc, 0xb3, 0x5d, 0xaf, 0xb9, 0x7f,
+ 0x67, 0x13, 0x3f, 0x30, 0x68, 0x64, 0x8d, 0x10, 0xa7, 0x8a, 0x37, 0xca,
+ 0x83, 0xa3, 0xf7, 0x7b, 0x04, 0x5c, 0xa6, 0x71, 0x57, 0x35, 0x89, 0x8d,
+ 0x44, 0xbf, 0xc8, 0x9a, 0x5b, 0xd2, 0xe2, 0x40, 0x0f, 0x25, 0xa4, 0x27,
+ 0x05, 0x84, 0x44, 0x46, 0x0b, 0x89, 0xa5, 0x20, 0x02, 0x4a, 0x5a, 0x05,
+ 0x0a, 0xa3, 0x85, 0x5b, 0xbf, 0x88, 0xc6, 0x74, 0x83, 0xd3, 0x17, 0x6d,
+ 0x18, 0xe7, 0x42, 0xd4, 0x2d, 0xda, 0x68, 0xe6, 0x6d, 0xab, 0x3e, 0x48,
+ 0xf3, 0x94, 0xe4, 0x41, 0xdf, 0xc7, 0x6f, 0x8f, 0xb1, 0x1c, 0xdb, 0x28,
+ 0x3c, 0x05, 0x05, 0xc6, 0xf0, 0xae, 0xcc, 0x47, 0xf7, 0xbf, 0x15, 0xed,
+ 0x0f, 0x62, 0x96, 0x14, 0x97, 0x8b, 0x85, 0x86, 0xfb, 0x84, 0x0c, 0x7b,
+ 0x72, 0xe4, 0xb7, 0xe9, 0xc2, 0xfc, 0x8c, 0x42, 0x82, 0x00, 0xae, 0xe6,
+ 0xbe, 0xa6, 0x41, 0x52, 0x02, 0x18, 0xc0, 0x9f, 0x58, 0x27, 0x2c, 0x8e,
+ 0xfd, 0x09, 0xdb, 0xb1, 0x88, 0x71, 0x16, 0x6b, 0xa2, 0x55, 0x0b, 0x74,
+ 0x96, 0x7a, 0xa7, 0x34, 0x48, 0x2e, 0xc1, 0x16, 0xff, 0x72, 0x15, 0x0c,
+ 0xd4, 0x82, 0x37, 0xb0, 0x09, 0x1b, 0x1c, 0xb4, 0x16, 0x59, 0x8e, 0x22,
+ 0x4d, 0x74, 0xa1, 0xe9, 0xa0, 0xfe, 0x2a, 0x98, 0xbf, 0xe4, 0xec, 0x69,
+ 0x53, 0x55, 0xe7, 0xea, 0xb1, 0x3d, 0xd2, 0xc3, 0x5e, 0xd9, 0x84, 0xbe,
+ 0xa5, 0x2f, 0x08, 0xd0, 0xba, 0x8c, 0x6f, 0x5b, 0x4f, 0xf7, 0x45, 0x26,
+ 0x63, 0x09, 0x1c, 0xad, 0x53, 0x2b, 0xb1, 0x87, 0x48, 0x6c, 0x6e, 0x63,
+ 0x4c, 0x55, 0x10, 0xe3, 0xc3, 0xb3, 0xcd, 0xe4, 0xac, 0x83, 0xfb, 0x22,
+ 0xf0, 0x89, 0x6d, 0x39, 0x2c, 0xad, 0x3e, 0x19, 0x47, 0xb7, 0x1f, 0x23,
+ 0x44, 0xd1, 0xcb, 0x2d, 0x62, 0x34, 0x42, 0xbf, 0xbf, 0xb9, 0x60, 0xea,
+ 0xac, 0xe5, 0x00, 0x25, 0x19, 0x0c, 0x01, 0x22, 0x26, 0xa5, 0x7f, 0x4c,
+ 0x8d, 0x05, 0x5d, 0x52, 0x61, 0x1d, 0xb7, 0xd8, 0x13, 0xa7, 0xbc, 0xa2,
+ 0x9d, 0xcc, 0x82, 0xdc, 0x46, 0x10, 0x42, 0x73, 0xcc, 0x3d, 0xac, 0x23,
+ 0xe9, 0x72, 0x5b, 0xf3, 0xad, 0xd4, 0xe9, 0x45, 0x03, 0x19, 0x76, 0x95,
+ 0x15, 0x59, 0x0c, 0x0f, 0xec, 0x1e, 0x17, 0xb9, 0xb0, 0xf4, 0x74, 0xd4,
+ 0xc5, 0xe8, 0xf7, 0x82, 0x06, 0x32, 0xb9, 0xbc, 0x74, 0xfd, 0x38, 0x7a,
+ 0x70, 0x7c, 0x59, 0xc7, 0xa3, 0x26, 0xb7, 0x24, 0x11, 0xa9, 0xdb, 0x03,
+ 0x4c, 0x82, 0x49, 0xb9, 0xb8, 0x27, 0x62, 0x98, 0xc7, 0xea, 0xfa, 0x7a,
+ 0xd7, 0xc8, 0x8d, 0xdd, 0xd1, 0xe7, 0x8c, 0xfd, 0x7e, 0x6d, 0x2e, 0xeb,
+ 0x08, 0xe8, 0x37, 0xa7, 0x8f, 0x48, 0x3b, 0xec, 0xce, 0x78, 0xa2, 0x85,
+ 0x8f, 0x9c, 0xe2, 0x3f, 0xfc, 0x0f, 0xe2, 0x34, 0x00, 0x53, 0x76, 0x77,
+ 0x81, 0x18, 0x2a, 0x21, 0xb6, 0xda, 0xe4, 0xe6, 0xad, 0x9c, 0x69, 0x70,
+ 0x91, 0x37, 0x68, 0x9d, 0xa2, 0x56, 0x64, 0xfb, 0x68, 0xa2, 0xcd, 0x61,
+ 0x85, 0xb7, 0xa2, 0x15, 0xf0, 0xa3, 0xe4, 0x3f, 0x80, 0x81, 0x29, 0x6f,
+ 0x73, 0x11, 0x06, 0x92, 0x21, 0xbe, 0x3e, 0x7a, 0x7d, 0xfa, 0xee, 0xa8,
+ 0x5d, 0x9c, 0xd8, 0x00, 0x61, 0x2b, 0x41, 0xb0, 0xbf, 0x3b, 0x3b, 0x86,
+ 0x15, 0x14, 0xd0, 0x03, 0xc9, 0x54, 0xc8, 0xc9, 0xee, 0x4f, 0xce, 0x7e,
+ 0x78, 0x65, 0x67, 0x47, 0x5a, 0x42, 0xc1, 0xbd, 0xf8, 0x64, 0xd0, 0x01,
+ 0x53, 0xba, 0x7b, 0xb5, 0x93, 0x16, 0x40, 0x2d, 0x07, 0x4b, 0x49, 0x64,
+ 0xd0, 0xf9, 0x21, 0xc5, 0x82, 0x13, 0x63, 0xb4, 0x30, 0x1f, 0x9d, 0x1a,
+ 0xea, 0x9a, 0x0a, 0xed, 0xed, 0xa0, 0x81, 0xde, 0xcb, 0xd6, 0x11, 0xc3,
+ 0x4b, 0x71, 0x22, 0x71, 0x9a, 0x00, 0xbe, 0x8f, 0x10, 0xfd, 0x46, 0x49,
+ 0xf8, 0x21, 0x4d, 0x0a, 0xc1, 0x57, 0x62, 0x02, 0xfb, 0x9a, 0x72, 0xb2,
+ 0x11, 0x08, 0xe1, 0xdb, 0x8e, 0x1c, 0x2e, 0xc4, 0xb4, 0x16, 0x34, 0x76,
+ 0xc0, 0x50, 0x8b, 0x12, 0xee, 0xf1, 0x09, 0x19, 0x89, 0x90, 0x9b, 0x6f,
+ 0x6e, 0xd4, 0x54, 0xd6, 0xe0, 0x4d, 0xd5, 0xfe, 0x26, 0x51, 0x0b, 0x7a,
+ 0xfd, 0x0f, 0xeb, 0xae, 0x02, 0x84, 0xbb, 0xb4, 0xc6, 0xfb, 0x19, 0xbb,
+ 0x2e, 0x97, 0x9b, 0x0f, 0xe5, 0x6f, 0xe9, 0x8a, 0xfb, 0xaa, 0xaf, 0x25,
+ 0x74, 0x27, 0x29, 0x3d, 0x40, 0xb6, 0x5d, 0x32, 0x20, 0x32, 0x04, 0x87,
+ 0x5c, 0xa6, 0x3a, 0x8a, 0x06, 0xfc, 0xc2, 0x52, 0x8b, 0x86, 0x40, 0x16,
+ 0x5c, 0xe7, 0x3b, 0x15, 0x38, 0x08, 0x98, 0x69, 0x7b, 0x16, 0x84, 0x22,
+ 0xd0, 0x52, 0xb0, 0xbe, 0x2f, 0x1a, 0x3a, 0xa8, 0x2c, 0x53, 0x26, 0x65,
+ 0x15, 0x2d, 0xf7, 0x22, 0x46, 0x72, 0xac, 0x5b, 0x03, 0x57, 0xe2, 0xc5,
+ 0xd3, 0x17, 0x74, 0xb5, 0x23, 0x43, 0x49, 0xfa, 0x3e, 0x0a, 0x8a, 0x3c,
+ 0xa2, 0xa7, 0x0c, 0x11, 0x1e, 0x60, 0xb6, 0xfb, 0x6b, 0x80, 0xbb, 0x8b,
+ 0x14, 0xe7, 0x6c, 0xc6, 0xbd, 0x26, 0xc7, 0xde, 0x20, 0x21, 0x74, 0xd2,
+ 0x8a, 0x0d, 0x23, 0xd0, 0x3e, 0xc3, 0x3e, 0x79, 0xfd, 0x31, 0xd9, 0xf8,
+ 0xd7, 0x4d, 0xc6, 0x1b, 0xd1, 0xb4, 0x1c, 0xf2, 0xcd, 0xe6, 0xc5, 0x32,
+ 0xe0, 0x7c, 0x72, 0xce, 0xe5, 0x2d, 0xa2, 0x82, 0xe6, 0x58, 0xdf, 0x45,
+ 0xac, 0x02, 0xaf, 0x6e, 0xca, 0x45, 0xc2, 0xcd, 0x41, 0xab, 0x20, 0x38,
+ 0x26, 0xdb, 0xb5, 0xd2, 0x4e, 0xed, 0x2f, 0x52, 0x08, 0x6f, 0x44, 0x08,
+ 0x21, 0x40, 0xef, 0x8b, 0xc3, 0x55, 0xb5, 0xab, 0x51, 0xf2, 0xbe, 0x40,
+ 0x22, 0x9e, 0xf0, 0x9d, 0xdc, 0x13, 0x79, 0x61, 0xd6, 0x6f, 0x78, 0xda,
+ 0xdc, 0x14, 0x11, 0x21, 0xf4, 0xd7, 0xb6, 0xf0, 0x11, 0x21, 0xd9, 0x09,
+ 0x90, 0xe2, 0xd0, 0x8a, 0x58, 0xb3, 0x62, 0x2b, 0x49, 0x5e, 0x87, 0x5d,
+ 0x54, 0xb9, 0x0b, 0x24, 0xb1, 0xba, 0x59, 0x0e, 0xc6, 0xa6, 0x10, 0x78,
+ 0x36, 0x9b, 0x0d, 0xb9, 0x55, 0x03, 0x01, 0xd7, 0x93, 0x72, 0xcf, 0x35,
+ 0xd1, 0x48, 0x60, 0xf3, 0x0d, 0x9f, 0xe0, 0x66, 0x41, 0x69, 0x37, 0x20,
+ 0x63, 0x15, 0x5c, 0x44, 0x0a, 0xaf, 0x34, 0xb0, 0x46, 0x75, 0x7a, 0xce,
+ 0x19, 0x02, 0xe2, 0xf0, 0x92, 0xfa, 0xfa, 0x1e, 0x86, 0xb8, 0xb0, 0x29,
+ 0x11, 0x9a, 0xbc, 0x8d, 0xd1, 0xbe, 0xb0, 0xbe, 0xd2, 0xcd, 0x4f, 0x5a,
+ 0xa6, 0xa8, 0xb3, 0xa6, 0x76, 0x77, 0x78, 0x0a, 0x19, 0x88, 0x5d, 0xd3,
+ 0x23, 0xd9, 0x3f, 0x1c, 0xd1, 0x69, 0xca, 0xf5, 0xaa, 0xd2, 0x76, 0x1e,
+ 0xe7, 0xb2, 0x98, 0xb2, 0xb2, 0xf9, 0x12, 0xb3, 0xc9, 0xee, 0xa0, 0x24,
+ 0x19, 0x06, 0xf9, 0xd2, 0x66, 0x81, 0x7d, 0xd6, 0x53, 0x15, 0x44, 0x3d,
+ 0xd1, 0xb9, 0x21, 0xba, 0xf9, 0x36, 0x2f, 0x86, 0x6d, 0x53, 0x82, 0x80,
+ 0xca, 0x32, 0xc5, 0x34, 0x9e, 0x7d, 0xb8, 0xca, 0x1a, 0xfa, 0xed, 0xc6,
+ 0xde, 0x26, 0x91, 0x23, 0x3e, 0xdc, 0x82, 0xea, 0xe2, 0x51, 0x25, 0xdc,
+ 0x9e, 0x86, 0xad, 0x1a, 0x36, 0x0a, 0x89, 0x8b, 0x5f, 0x10, 0xda, 0x74,
+ 0xe0, 0x37, 0x9b, 0x5c, 0x5f, 0x55, 0x0b, 0x6e, 0x68, 0xfb, 0x00, 0x55,
+ 0xf9, 0xc9, 0x80, 0xa6, 0xfc, 0xea, 0xf1, 0x2b, 0x9f, 0x96, 0x42, 0x36,
+ 0x43, 0xb7, 0xf8, 0x70, 0x02, 0xa6, 0x4b, 0x99, 0x23, 0x42, 0x4e, 0xe5,
+ 0x5a, 0x3b, 0x9a, 0xb3, 0xdc, 0x84, 0xf8, 0xf8, 0x4d, 0x7c, 0xb8, 0xd6,
+ 0x96, 0xf0, 0x08, 0x3a, 0x2c, 0xce, 0x9f, 0x31, 0xef, 0x73, 0xea, 0x4d,
+ 0x48, 0x27, 0xec, 0x2a, 0xab, 0xec, 0x47, 0xc2, 0xcc, 0xd3, 0xeb, 0x79,
+ 0x39, 0xa5, 0xb2, 0xb8, 0xec, 0x41, 0x5a, 0xd0, 0x83, 0x4a, 0x0b, 0x29,
+ 0x27, 0xac, 0xfd, 0x75, 0x61, 0x10, 0x73, 0xf2, 0x75, 0xa7, 0x43, 0x30,
+ 0x96, 0xae, 0x6d, 0x99, 0x68, 0x83, 0xe9, 0x8c, 0x5f, 0xf6, 0x97, 0x50,
+ 0x24, 0xe5, 0xa4, 0xf1, 0x56, 0x40, 0x0f, 0xf4, 0x30, 0x2c, 0x6e, 0xab,
+ 0xc8, 0xca, 0xa8, 0xc6, 0x0c, 0x66, 0xfa, 0x43, 0x2b, 0xa3, 0x07, 0x83,
+ 0x5d, 0x36, 0x3f, 0x74, 0x88, 0xca, 0xde, 0x16, 0xf3, 0xe6, 0xc4, 0x87,
+ 0x6b, 0x6f, 0xb0, 0xee, 0x30, 0xe6, 0x10, 0xdb, 0x60, 0xe9, 0x3b, 0x10,
+ 0xaa, 0xad, 0xce, 0xe9, 0xc0, 0xd4, 0xb1, 0x0f, 0xf6, 0x6e, 0xb0, 0x7c,
+ 0x23, 0xa0, 0xc2, 0xac, 0x30, 0x87, 0x6f, 0x59, 0x4d, 0xb2, 0x0f, 0x98,
+ 0x1b, 0x63, 0xd7, 0x7f, 0x58, 0x4d, 0x90, 0x99, 0x00, 0x52, 0xdc, 0xcf,
+ 0x49, 0x23, 0x75, 0x12, 0x58, 0x50, 0x93, 0x53, 0x01, 0x68, 0x30, 0x5a,
+ 0x33, 0x7e, 0xcf, 0x26, 0x62, 0x0f, 0xdb, 0xbb, 0xef, 0x31, 0xd2, 0x32,
+ 0xe7, 0xb7, 0x2d, 0xca, 0xbc, 0xb0, 0x3d, 0xbf, 0xa0, 0x47, 0x78, 0x73,
+ 0x8c, 0x81, 0x57, 0xad, 0x8a, 0x01, 0xce, 0x3f, 0x52, 0x95, 0x9a, 0xd5,
+ 0xac, 0x3e, 0x44, 0xfa, 0x3a, 0x79, 0x8b, 0xe3, 0xa7, 0x75, 0xb7, 0x79,
+ 0x49, 0x52, 0x85, 0x69, 0x01, 0xfd, 0x5b, 0x22, 0x30, 0x09, 0xab, 0xc9,
+ 0x3d, 0x2d, 0x43, 0x3f, 0x68, 0x4f, 0x64, 0x30, 0xbb, 0x47, 0x8b, 0x70,
+ 0x7e, 0x32, 0x2e, 0xc1, 0x5b, 0x75, 0xab, 0x9e, 0x1c, 0x5f, 0xc1, 0x86,
+ 0xbf, 0x58, 0x8e, 0x4f, 0xfa, 0x64, 0x2e, 0x29, 0x62, 0x74, 0x97, 0x41,
+ 0x88, 0x9b, 0xef, 0xfe, 0xf7, 0x8b, 0xf0, 0xc5, 0xed, 0xd4, 0xba, 0x0c,
+ 0x6f, 0x9d, 0x54, 0x52, 0x35, 0x14, 0xcd, 0x94, 0x2e, 0xea, 0x72, 0xb6,
+ 0x24, 0x07, 0x44, 0xda, 0x5c, 0xf3, 0x0e, 0x5d, 0xea, 0x3c, 0x7b, 0xf7,
+ 0xb3, 0x68, 0x42, 0x4d, 0x3d, 0xd8, 0x51, 0xf3, 0x18, 0x32, 0xb4, 0xc1,
+ 0xb2, 0xc2, 0xe1, 0xfd, 0xdb, 0x2a, 0x4f, 0xbb, 0x29, 0xb2, 0x1e, 0xe2,
+ 0x36, 0xa5, 0x8a, 0x30, 0x5e, 0xff, 0x1d, 0x22, 0x5f, 0xed, 0xdc, 0x21,
+ 0xd3, 0x8c, 0x22, 0x08, 0xcc, 0x1d, 0x48, 0x2d, 0xb4, 0xb7, 0x51, 0xf2,
+ 0xd0, 0xd9, 0xec, 0x65, 0xdc, 0x6a, 0xfe, 0x00, 0xc3, 0x9a, 0x07, 0xdc,
+ 0xaa, 0x18, 0x1f, 0xc6, 0xae, 0x2a, 0x10, 0x75, 0xc2, 0x80, 0x3d, 0x94,
+ 0xef, 0x9b, 0x41, 0xeb, 0x60, 0xaf, 0x9a, 0x89, 0x7f, 0xa6, 0xfd, 0xc9,
+ 0x38, 0xd2, 0x1a, 0xa3, 0x83, 0x32, 0x6f, 0xdc, 0xcc, 0x7a, 0x78, 0xfd,
+ 0xbe, 0xf3, 0x9e, 0x90, 0x67, 0xe0, 0x79, 0xd9, 0xb9, 0xb3, 0xd6, 0x7c,
+ 0x11, 0x81, 0x4e, 0x50, 0x99, 0xf9, 0x8b, 0x64, 0x2e, 0x79, 0x92, 0x66,
+ 0x85, 0xef, 0x3b, 0xa2, 0x2f, 0x1a, 0x1d, 0x71, 0x45, 0xc5, 0x95, 0xd7,
+ 0x8d, 0xc7, 0x6e, 0x38, 0x5a, 0x5b, 0xe4, 0xc8, 0x10, 0x40, 0xea, 0x28,
+ 0x52, 0xaa, 0xd1, 0x98, 0x51, 0xcc, 0x29, 0xc0, 0x18, 0x4e, 0xa9, 0xe5,
+ 0x55, 0x58, 0xe1, 0xc1, 0x9f, 0xe4, 0xfc, 0x42, 0x86, 0xe7, 0xa6, 0x18,
+ 0xb7, 0xa8, 0xcb, 0xd0, 0xfe, 0x19, 0x39, 0x9d, 0xed, 0x59, 0x7d, 0x3c,
+ 0xe1, 0x2e, 0x5a, 0x5d, 0xbb, 0x22, 0x48, 0xf5, 0x24, 0x45, 0xb9, 0x83,
+ 0xcc, 0x9f, 0x5d, 0x4d, 0x87, 0xc2, 0x15, 0x6d, 0xb1, 0x3e, 0xac, 0x06,
+ 0x4c, 0x02, 0x23, 0x26, 0x5e, 0xe2, 0x3f, 0xd1, 0x72, 0x26, 0x18, 0x6f,
+ 0xd0, 0xaa, 0x09, 0x8d, 0x63, 0x33, 0x79, 0x27, 0x41, 0x78, 0xb2, 0x3e,
+ 0xee, 0x1b, 0x02, 0x7f, 0xa7, 0x01, 0x36, 0xf2, 0x91, 0xd1, 0x30, 0xb8,
+ 0x7c, 0x85, 0x54, 0x79, 0xea, 0xf5, 0x11, 0x4b, 0x69, 0xd8, 0x94, 0xd0,
+ 0x3d, 0xbb, 0x86, 0xb7, 0x76, 0x46, 0x3b, 0x03, 0xdf, 0x3f, 0xe2, 0x92,
+ 0x54, 0xc9, 0x4a, 0x4c, 0x6d, 0xd7, 0x00, 0xfa, 0x74, 0xd7, 0x23, 0xf6,
+ 0x8e, 0x3e, 0x5c, 0x87, 0x01, 0x0c, 0x04, 0x41, 0x9c, 0x69, 0x7d, 0x9b,
+ 0xde, 0x87, 0x26, 0xd4, 0xf6, 0xf0, 0xc9, 0x8b, 0x17, 0x2d, 0x25, 0xa9,
+ 0xf6, 0x5a, 0x2e, 0x3c, 0xdd, 0xde, 0xc6, 0xda, 0x82, 0x5a, 0x7d, 0xf3,
+ 0x8b, 0xe1, 0x0b, 0xbc, 0xd8, 0x7e, 0xad, 0xce, 0xcc, 0x16, 0x4c, 0xfb,
+ 0xdf, 0x1b, 0xd2, 0x6f, 0x22, 0x9f, 0xc3, 0x9d, 0xd3, 0xfb, 0xd6, 0x0b,
+ 0xfa, 0x5c, 0xe4, 0x2d, 0x3c, 0xcc, 0x74, 0x2c, 0x2f, 0x2f, 0xc9, 0xe5,
+ 0x4a, 0x4f, 0x2a, 0x5e, 0xd4, 0x6d, 0x5a, 0x4d, 0xc3, 0xe5, 0x6e, 0x0f,
+ 0x86, 0x3b, 0x7d, 0xcb, 0x45, 0xde, 0x03, 0x52, 0x35, 0x69, 0x3f, 0xc9,
+ 0xa3, 0x61, 0xec, 0x64, 0x2e, 0x65, 0xeb, 0x0e, 0xb4, 0x63, 0x66, 0xb4,
+ 0xf3, 0xe2, 0xc5, 0x80, 0x66, 0xf6, 0xf4, 0xc5, 0x8b, 0x5e, 0xa0, 0x02,
+ 0xef, 0x33, 0xb7, 0xa5, 0x73, 0x94, 0xd2, 0xeb, 0x8e, 0x69, 0x6a, 0x32,
+ 0xc7, 0xe3, 0xdf, 0xa1, 0xdf, 0x24, 0x5f, 0x24, 0x6f, 0x4f, 0xcf, 0x8f,
+ 0x3c, 0x1f, 0x22, 0xce, 0x17, 0x87, 0xb6, 0x3d, 0xa7, 0x08, 0xb2, 0x05,
+ 0x16, 0xe8, 0x6d, 0x09, 0xff, 0x8c, 0xb1, 0x9e, 0x43, 0xb7, 0x07, 0xca,
+ 0xaa, 0xd4, 0x77, 0xfd, 0x2f, 0x61, 0xee, 0x0e, 0x1a, 0x58, 0x5e, 0xe5,
+ 0x8d, 0x0f, 0x27, 0xb6, 0x61, 0x36, 0x7b, 0x13, 0xce, 0x38, 0x4e, 0xc7,
+ 0x94, 0xb0, 0xdf, 0x7a, 0x4d, 0x75, 0x48, 0x9c, 0xb2, 0x4d, 0xff, 0x28,
+ 0x17, 0xeb, 0x41, 0x29, 0x50, 0x36, 0x9b, 0xb2, 0x76, 0xee, 0x5e, 0x18,
+ 0xe2, 0x49, 0x39, 0x2e, 0xf0, 0xac, 0xdc, 0x21, 0x56, 0x94, 0x02, 0x6d,
+ 0xd5, 0xff, 0x78, 0x24, 0xf2, 0x47, 0x92, 0x90, 0x53, 0x86, 0xb4, 0x86,
+ 0x90, 0x86, 0xf1, 0x51, 0xb7, 0xd7, 0x6b, 0xe7, 0x9a, 0xb7, 0x7e, 0xe4,
+ 0x82, 0xf6, 0x21, 0xc0, 0xc9, 0xe4, 0x70, 0xd3, 0x34, 0x5b, 0x68, 0xf2,
+ 0x73, 0xd1, 0x1e, 0xc7, 0xf0, 0xf2, 0x65, 0x7e, 0xb5, 0xac, 0xe2, 0x89,
+ 0xc2, 0xe8, 0xa1, 0x2a, 0x39, 0x39, 0xda, 0x60, 0x24, 0xbd, 0x4d, 0xab,
+ 0x4c, 0x9b, 0xbe, 0x16, 0xf7, 0xf6, 0x6c, 0xab, 0xbf, 0x46, 0x2b, 0xd7,
+ 0xa8, 0xfb, 0x4b, 0xe0, 0xf3, 0xa1, 0x62, 0x43, 0xa3, 0x1d, 0x92, 0x3f,
+ 0x4b, 0x92, 0xc9, 0xa4, 0xcb, 0x49, 0xda, 0xb8, 0xda, 0x41, 0x71, 0x75,
+ 0xd3, 0x66, 0xd3, 0x65, 0x0a, 0x2c, 0x57, 0x90, 0x20, 0xcc, 0xfe, 0x5c,
+ 0x9f, 0xb9, 0x28, 0x13, 0x3d, 0x0b, 0xbf, 0xe0, 0x75, 0xe9, 0x35, 0x20,
+ 0x0a, 0xc1, 0x44, 0x48, 0xf2, 0x30, 0xcc, 0x10, 0xfe, 0xca, 0x9b, 0x64,
+ 0x9e, 0xbf, 0x2d, 0x66, 0x65, 0x3a, 0x75, 0x6e, 0xbe, 0x85, 0x26, 0x96,
+ 0x0b, 0x14, 0x9e, 0x6c, 0x6d, 0xd8, 0xac, 0xcb, 0xec, 0x34, 0xef, 0x71,
+ 0xb2, 0xe1, 0x01, 0xdd, 0x80, 0x43, 0x3d, 0x87, 0x1d, 0x4b, 0x29, 0xe2,
+ 0x14, 0x06, 0x6e, 0x21, 0x18, 0xa6, 0xd0, 0x41, 0x43, 0xfc, 0xce, 0xbb,
+ 0x65, 0x53, 0xb2, 0xd0, 0xff, 0x9b, 0x2e, 0x49, 0xcf, 0xf9, 0x96, 0x8c,
+ 0x8f, 0xff, 0xe7, 0xd1, 0xa7, 0x8c, 0x8f, 0x56, 0xe9, 0xad, 0x2d, 0x71,
+ 0xfd, 0x81, 0x81, 0x54, 0x25, 0x6e, 0x69, 0x11, 0x54, 0xd2, 0x99, 0x78,
+ 0x9b, 0xa8, 0xc7, 0x34, 0x6e, 0x0f, 0x04, 0xc0, 0xc1, 0x65, 0xe4, 0xe5,
+ 0x0c, 0x1d, 0x92, 0xa8, 0x44, 0x75, 0x88, 0x7a, 0x5c, 0x35, 0x81, 0xda,
+ 0x44, 0x76, 0x55, 0xf3, 0x3e, 0xce, 0xe1, 0xf4, 0x86, 0x13, 0x8a, 0xe2,
+ 0x12, 0x0c, 0x73, 0x16, 0xe9, 0xdc, 0x0d, 0xa4, 0x4e, 0x9a, 0x94, 0x99,
+ 0xeb, 0x03, 0x3d, 0x7a, 0x7d, 0x10, 0x08, 0x69, 0xed, 0x42, 0x81, 0xd4,
+ 0x2a, 0x79, 0xf9, 0xfe, 0xdd, 0x49, 0x4f, 0x61, 0xef, 0x18, 0x7b, 0x40,
+ 0xc4, 0x5a, 0x7b, 0x97, 0x01, 0x65, 0xaf, 0x4a, 0xce, 0x8c, 0x9a, 0xbd,
+ 0xe6, 0x03, 0x1b, 0xb6, 0x90, 0x4d, 0xc5, 0x55, 0x16, 0x73, 0xfc, 0xf9,
+ 0x1d, 0x7a, 0x48, 0x88, 0xbb, 0x04, 0x06, 0xbf, 0x1c, 0xf7, 0x72, 0x96,
+ 0x0a, 0xed, 0x96, 0x15, 0x25, 0x9e, 0x80, 0xf2, 0x91, 0xd6, 0x8a, 0xea,
+ 0x51, 0xef, 0x40, 0xd2, 0x4a, 0xcb, 0x48, 0xb8, 0x8e, 0xd2, 0x05, 0xf1,
+ 0x50, 0xb2, 0xf6, 0x47, 0x8a, 0x15, 0xad, 0xe9, 0x34, 0x87, 0x59, 0x18,
+ 0x0e, 0x56, 0x52, 0x50, 0x0a, 0x43, 0xcb, 0x5f, 0xda, 0x8e, 0x32, 0xd1,
+ 0xac, 0x35, 0x33, 0x20, 0x23, 0x9c, 0xe8, 0x3a, 0x89, 0xb4, 0xc7, 0xe2,
+ 0x22, 0x2b, 0x02, 0x03, 0x65, 0x7c, 0x60, 0xca, 0x8d, 0x4a, 0x4e, 0x64,
+ 0x7e, 0xfb, 0x12, 0x16, 0x64, 0x5d, 0x48, 0xa7, 0xd6, 0xca, 0x61, 0x8b,
+ 0x2d, 0x36, 0x9d, 0x51, 0xfb, 0x2c, 0xeb, 0xa7, 0xa5, 0x35, 0x4e, 0x4b,
+ 0xea, 0xb7, 0x44, 0x53, 0x4a, 0x0b, 0x1b, 0xf6, 0x68, 0xed, 0xec, 0x27,
+ 0x87, 0xe0, 0x74, 0xa1, 0xca, 0x03, 0x6d, 0x77, 0x38, 0x34, 0xdc, 0x51,
+ 0x48, 0xb3, 0x48, 0x6f, 0x5b, 0x3d, 0xde, 0xeb, 0xe9, 0xed, 0xd6, 0x83,
+ 0xe4, 0xec, 0x4d, 0xb7, 0x41, 0x41, 0x15, 0xb6, 0x30, 0xec, 0x07, 0x68,
+ 0x6b, 0xbb, 0xe5, 0xb2, 0x8c, 0x06, 0x9e, 0x86, 0x5e, 0xe9, 0xd5, 0x21,
+ 0x17, 0x19, 0x0f, 0x5f, 0xe5, 0xe6, 0x12, 0xa9, 0x19, 0x19, 0x0b, 0x5a,
+ 0x2e, 0xb7, 0xd1, 0xd6, 0x83, 0xc8, 0xc5, 0xe6, 0xc3, 0x10, 0x75, 0x72,
+ 0x22, 0x15, 0x48, 0xf6, 0x15, 0x1b, 0x5d, 0x34, 0x1c, 0xf1, 0x40, 0x58,
+ 0xc3, 0x69, 0x0b, 0xa9, 0xb3, 0xa9, 0x41, 0xb3, 0x54, 0x3b, 0x6b, 0x08,
+ 0xec, 0x0c, 0x79, 0xd8, 0x23, 0xd4, 0xb1, 0x78, 0x55, 0xc8, 0xf1, 0xaa,
+ 0x13, 0x5b, 0xc8, 0x21, 0x2d, 0xdc, 0x02, 0x63, 0x13, 0xc9, 0xb9, 0xae,
+ 0xf4, 0xb8, 0x1b, 0xb0, 0x36, 0x93, 0xb2, 0x3d, 0xb3, 0x38, 0xc6, 0xc7,
+ 0xe8, 0x90, 0x5c, 0x44, 0x3d, 0x31, 0xc3, 0x8e, 0x3a, 0x4b, 0xd0, 0x7e,
+ 0x5f, 0xf1, 0x0b, 0xf7, 0xbe, 0xb5, 0x30, 0x64, 0x37, 0xfb, 0x8c, 0x47,
+ 0x51, 0xac, 0xa2, 0x14, 0xe4, 0xa1, 0x58, 0xb2, 0x07, 0xf2, 0xcc, 0xe8,
+ 0x11, 0xff, 0x1e, 0xe4, 0xd4, 0xa2, 0xe4, 0xf7, 0x43, 0xd7, 0x10, 0x66,
+ 0xe3, 0x3e, 0x33, 0x1a, 0xb6, 0x4b, 0x4f, 0x82, 0x21, 0xf5, 0x59, 0x8f,
+ 0xd3, 0x42, 0x6e, 0x59, 0x37, 0x0d, 0x32, 0x42, 0xbc, 0x18, 0x38, 0x13,
+ 0x5d, 0x7a, 0x3b, 0x2d, 0x8b, 0xec, 0x8e, 0xb0, 0xe9, 0xfb, 0x87, 0x0b,
+ 0x95, 0xec, 0x1f, 0x0e, 0xde, 0xbd, 0x3d, 0x7e, 0xfb, 0xcd, 0x3e, 0x21,
+ 0x27, 0x66, 0xd5, 0x24, 0xa7, 0x8a, 0xbf, 0xbf, 0x2c, 0xa7, 0xf9, 0x84,
+ 0x25, 0x05, 0xc0, 0x1f, 0x2f, 0xdb, 0x35, 0x5c, 0x99, 0x84, 0x02, 0x8c,
+ 0x70, 0x09, 0x4a, 0xb6, 0x24, 0xed, 0x9c, 0x2a, 0xd0, 0xaa, 0xf2, 0x6a,
+ 0x69, 0x49, 0x3f, 0x81, 0x2a, 0x82, 0x80, 0x15, 0x02, 0xf9, 0x24, 0x8f,
+ 0x98, 0x69, 0xc9, 0x3b, 0x6a, 0x14, 0x85, 0x57, 0x27, 0x27, 0x49, 0x08,
+ 0x31, 0xcd, 0x89, 0xce, 0xc2, 0x5f, 0x9c, 0xdb, 0x86, 0x81, 0x6c, 0x66,
+ 0x34, 0x45, 0x9e, 0xcd, 0xe5, 0x4f, 0xd2, 0xa6, 0x25, 0xf5, 0x8c, 0xe9,
+ 0xfa, 0x43, 0x98, 0x73, 0x8c, 0x8c, 0x78, 0xa4, 0xb1, 0x62, 0x87, 0xf3,
+ 0x6a, 0x0a, 0x5b, 0xc8, 0x08, 0xc9, 0xf2, 0xb2, 0x21, 0xf5, 0xa8, 0x75,
+ 0x93, 0xb6, 0xbb, 0x88, 0xad, 0x0a, 0x0b, 0x5d, 0xb3, 0x95, 0xd3, 0xc2,
+ 0xf4, 0xe1, 0xd8, 0xb9, 0xf6, 0xe9, 0x64, 0xbd, 0x10, 0x6d, 0xe7, 0x28,
+ 0x0b, 0x3c, 0xe0, 0xe6, 0x69, 0x66, 0x6e, 0x45, 0x51, 0x8e, 0x6b, 0x92,
+ 0x96, 0xa1, 0xb8, 0xb8, 0xcd, 0xa4, 0x5f, 0xa8, 0xab, 0x77, 0x37, 0xc2,
+ 0x6e, 0x94, 0x8c, 0x4b, 0xf3, 0x7c, 0xa4, 0xbe, 0x46, 0x3b, 0x10, 0xbb,
+ 0x2e, 0xe3, 0x69, 0x23, 0xe9, 0xde, 0x36, 0x03, 0x10, 0x7d, 0xeb, 0x10,
+ 0x1d, 0x6e, 0xaf, 0x37, 0xcc, 0x1c, 0x00, 0xff, 0x5f, 0x64, 0x56, 0xa1,
+ 0xb8, 0xd7, 0x20, 0x24, 0x71, 0xc8, 0xda, 0xd0, 0x88, 0xd3, 0x35, 0x34,
+ 0x38, 0x1d, 0x16, 0xa5, 0x3f, 0xd2, 0x03, 0xbd, 0xc5, 0xfd, 0x82, 0x8a,
+ 0xee, 0x82, 0xa3, 0xcd, 0x2f, 0xbd, 0x2e, 0x71, 0xa9, 0xd8, 0x9d, 0x9e,
+ 0x83, 0x4f, 0x9a, 0x0a, 0xda, 0xa0, 0x3e, 0xd7, 0x93, 0x66, 0xa4, 0x61,
+ 0x06, 0xa9, 0x1a, 0xa7, 0x0c, 0xb2, 0x27, 0x0f, 0xf9, 0x88, 0x0e, 0xfe,
+ 0xcb, 0x72, 0xdd, 0x0c, 0x9c, 0x73, 0x21, 0x07, 0xda, 0x54, 0x13, 0x54,
+ 0x94, 0x5e, 0x8e, 0x36, 0xa3, 0x19, 0x60, 0x3c, 0x07, 0xb9, 0x91, 0xea,
+ 0xf4, 0xc6, 0xa5, 0x26, 0xf6, 0x0a, 0x3e, 0x2d, 0xab, 0xea, 0xde, 0xd1,
+ 0xd8, 0x50, 0xeb, 0x55, 0xd2, 0xa1, 0xd2, 0xc4, 0x2b, 0xb9, 0xf2, 0x83,
+ 0xea, 0x2d, 0xf4, 0x8c, 0x48, 0xbf, 0x4e, 0xae, 0x4d, 0x94, 0x70, 0x6c,
+ 0xaf, 0x10, 0x96, 0x18, 0x63, 0x5e, 0xdc, 0x94, 0xf8, 0x8d, 0x84, 0x53,
+ 0x23, 0xc9, 0x54, 0x79, 0x6f, 0x01, 0xd6, 0x79, 0x87, 0xaa, 0xea, 0xa0,
+ 0xd1, 0x72, 0x17, 0xb3, 0x16, 0x2e, 0x62, 0xf5, 0x7b, 0x09, 0xb9, 0xf6,
+ 0x41, 0x5d, 0x56, 0xe0, 0xc3, 0x44, 0xcc, 0x3b, 0x40, 0xba, 0xde, 0x35,
+ 0x5e, 0xce, 0x66, 0x75, 0xc6, 0x48, 0x97, 0x52, 0xbc, 0xaa, 0x17, 0x8e,
+ 0xdc, 0x37, 0xb9, 0xf5, 0xfd, 0xf4, 0xdf, 0x24, 0xb6, 0xa0, 0xcd, 0xd2,
+ 0xda, 0xd9, 0xaf, 0x94, 0x7b, 0xcb, 0x0d, 0x49, 0xe9, 0x04, 0x4f, 0xae,
+ 0xcb, 0x52, 0xaa, 0xa3, 0xfb, 0x84, 0x6d, 0xc2, 0x8d, 0xfb, 0x08, 0xbb,
+ 0xa5, 0x47, 0x7f, 0x68, 0xf7, 0x6b, 0x96, 0xb2, 0x87, 0xb0, 0xed, 0x5e,
+ 0xee, 0x34, 0x56, 0x0f, 0x35, 0xb7, 0x7d, 0xb7, 0xf1, 0x7c, 0xec, 0xe5,
+ 0x2c, 0xc2, 0x35, 0x84, 0xfd, 0x84, 0x14, 0xe0, 0xab, 0x3b, 0x4e, 0x1e,
+ 0xc9, 0x01, 0xf6, 0x89, 0x12, 0xbd, 0xec, 0x38, 0x2b, 0xd8, 0x01, 0xb7,
+ 0x83, 0x6b, 0x60, 0x36, 0x15, 0xed, 0x28, 0x11, 0x66, 0x9a, 0x37, 0x10,
+ 0x20, 0xbf, 0xdf, 0xdd, 0xee, 0x13, 0xf2, 0x34, 0x90, 0x56, 0x63, 0xd3,
+ 0x69, 0xac, 0xad, 0xfd, 0x85, 0x6b, 0xd0, 0x95, 0xb0, 0xd0, 0x1d, 0xb2,
+ 0x5c, 0x90, 0x9f, 0x6e, 0x48, 0xfc, 0x92, 0xd6, 0x7d, 0xf4, 0x8f, 0x5b,
+ 0xc5, 0xbf, 0xb6, 0x4f, 0x6a, 0x4f, 0x9b, 0x54, 0x27, 0xbf, 0xde, 0x79,
+ 0x7b, 0x4c, 0x03, 0xc5, 0x52, 0x21, 0x55, 0x96, 0xa8, 0x9f, 0xc4, 0x53,
+ 0xda, 0x9d, 0xce, 0x00, 0xbb, 0x1e, 0xfd, 0x30, 0xe5, 0x70, 0xd2, 0x68,
+ 0xa1, 0xf9, 0x9a, 0xce, 0x17, 0x49, 0x44, 0x64, 0x0d, 0xf4, 0x04, 0x68,
+ 0x42, 0x55, 0xea, 0x60, 0x58, 0x53, 0x11, 0x8f, 0xb3, 0x32, 0xc4, 0x09,
+ 0x12, 0x41, 0xca, 0xc6, 0x78, 0x2a, 0x89, 0xc5, 0x20, 0x08, 0x7d, 0xa9,
+ 0x7d, 0x31, 0x22, 0x3b, 0x72, 0x18, 0xf5, 0xf6, 0x47, 0xbb, 0x99, 0x48,
+ 0x9d, 0x83, 0xdf, 0xa2, 0x61, 0x8d, 0xdf, 0x5e, 0x4b, 0x36, 0x48, 0xaa,
+ 0x6e, 0x5a, 0xe5, 0x35, 0xac, 0xd4, 0xd7, 0xa6, 0x41, 0x6c, 0xc3, 0xa4,
+ 0x7c, 0x43, 0x76, 0xd3, 0xbc, 0x49, 0x7f, 0x35, 0x56, 0x5e, 0x65, 0xee,
+ 0x7f, 0xea, 0x45, 0xc8, 0x75, 0xae, 0x97, 0xcb, 0x59, 0xcc, 0xcc, 0xa1,
+ 0xb3, 0x2d, 0x9d, 0x37, 0xf2, 0xba, 0x5e, 0x8a, 0x11, 0x68, 0xa1, 0x90,
+ 0x2c, 0x12, 0x66, 0x32, 0x33, 0xf3, 0xc1, 0xa7, 0xeb, 0x19, 0xe5, 0x3f,
+ 0xf5, 0xaa, 0x27, 0xf0, 0x0e, 0x8b, 0xe2, 0x6b, 0x7b, 0xca, 0xb2, 0x1d,
+ 0x25, 0xbb, 0xc3, 0x0d, 0x12, 0xa5, 0xc1, 0x1f, 0x11, 0x61, 0x80, 0xbb,
+ 0xaa, 0x33, 0xdc, 0xda, 0xe9, 0xd9, 0xf9, 0xf1, 0xe9, 0xdb, 0x71, 0xf2,
+ 0xaf, 0x6b, 0x2b, 0x0b, 0x11, 0xdb, 0x80, 0xdf, 0x3f, 0x0e, 0xdc, 0x9e,
+ 0x24, 0x2f, 0xc5, 0xcf, 0xd0, 0x67, 0x1b, 0x7b, 0x4a, 0xfc, 0xc4, 0xdc,
+ 0xde, 0x46, 0xbe, 0xea, 0x9b, 0x82, 0x3a, 0x28, 0xbb, 0xd5, 0x01, 0x4a,
+ 0x0c, 0xb4, 0x65, 0x0b, 0x33, 0xd9, 0x35, 0xa2, 0x59, 0xd8, 0x3b, 0x9b,
+ 0xa5, 0x33, 0x7c, 0x5c, 0x02, 0x8b, 0xe4, 0x6b, 0x25, 0x1d, 0xcb, 0x0b,
+ 0x20, 0xf1, 0x2d, 0xd4, 0x52, 0xb6, 0xa0, 0x37, 0x58, 0x66, 0xaa, 0xa2,
+ 0x55, 0x47, 0x3a, 0x1f, 0x7e, 0x73, 0x74, 0x4e, 0x4e, 0x1a, 0xd4, 0x63,
+ 0xbb, 0x09, 0xc2, 0xd5, 0x25, 0x8a, 0x4f, 0x6a, 0x95, 0x33, 0x2d, 0xc3,
+ 0xa6, 0x43, 0x63, 0xb4, 0xe7, 0x59, 0x5a, 0x44, 0x8b, 0x2d, 0x8d, 0x46,
+ 0x7b, 0x68, 0xa8, 0x51, 0x3a, 0x48, 0x62, 0xf5, 0x9d, 0x78, 0xfd, 0x76,
+ 0x18, 0x40, 0xec, 0xec, 0xfd, 0xb9, 0xf8, 0xa9, 0x5e, 0x1d, 0x9d, 0x1c,
+ 0x9d, 0x1f, 0x75, 0x2d, 0xf7, 0x0b, 0x06, 0x59, 0x45, 0x51, 0x56, 0x93,
+ 0x4d, 0xae, 0x8b, 0x72, 0x56, 0x5e, 0xe5, 0xd2, 0x1d, 0x3a, 0xf9, 0x21,
+ 0xbb, 0x78, 0x75, 0xf0, 0x3d, 0xe9, 0x13, 0xe4, 0x73, 0x3a, 0x7b, 0x77,
+ 0x7a, 0xf6, 0xfa, 0xf8, 0xed, 0xab, 0x41, 0x72, 0x78, 0x7a, 0xf6, 0xa7,
+ 0x41, 0xf2, 0xe6, 0xf4, 0xfb, 0xa3, 0x48, 0x32, 0x3e, 0x21, 0x2f, 0x07,
+ 0x1c, 0x63, 0x9b, 0x48, 0x3a, 0xc3, 0xbb, 0xe0, 0x90, 0x85, 0x77, 0x89,
+ 0x1c, 0x74, 0x32, 0x52, 0x0c, 0xe9, 0xcc, 0x1d, 0xfa, 0xed, 0xd1, 0xc1,
+ 0xab, 0x41, 0x00, 0xac, 0x4f, 0x2d, 0x7e, 0xcc, 0xc7, 0x68, 0x7d, 0x76,
+ 0xd1, 0x80, 0x63, 0x67, 0xeb, 0x03, 0x1a, 0x02, 0x07, 0xb9, 0xf8, 0xc4,
+ 0x1a, 0x86, 0x05, 0x9e, 0xc4, 0xb4, 0x2f, 0xc7, 0x47, 0x7a, 0x44, 0x70,
+ 0x77, 0xe6, 0xd5, 0x05, 0x42, 0xa4, 0xac, 0xf9, 0x6a, 0xb6, 0xc0, 0x8a,
+ 0xa1, 0x00, 0x44, 0xcb, 0x05, 0xfd, 0x7c, 0xee, 0x1e, 0x6c, 0xab, 0x41,
+ 0x0b, 0xd4, 0x02, 0xf2, 0x88, 0x5d, 0x8f, 0xa9, 0xf4, 0xda, 0x44, 0x33,
+ 0x2d, 0x63, 0x26, 0x91, 0x56, 0x7d, 0xe9, 0xd0, 0x8b, 0x57, 0x6b, 0xd8,
+ 0x02, 0xf0, 0x2f, 0x00, 0x63, 0x44, 0x3c, 0x25, 0x90, 0xed, 0x35, 0xfb,
+ 0x23, 0xff, 0x58, 0x60, 0xcd, 0x22, 0x25, 0x06, 0xcb, 0x4b, 0xc3, 0x96,
+ 0x19, 0x27, 0xf7, 0xf1, 0x36, 0x59, 0xb7, 0x40, 0x32, 0x3c, 0x56, 0xa7,
+ 0xc4, 0x2a, 0x05, 0x4b, 0x4f, 0x8c, 0x3a, 0x66, 0x18, 0xd5, 0x4c, 0x7d,
+ 0x56, 0x6d, 0x31, 0xe1, 0x7b, 0x48, 0x68, 0x9d, 0x11, 0x7d, 0x5f, 0xb7,
+ 0x58, 0x71, 0xb7, 0xc4, 0x83, 0xe3, 0x13, 0x05, 0xf0, 0x30, 0x81, 0x2f,
+ 0xcb, 0x5c, 0xb0, 0xc1, 0xe5, 0x82, 0x27, 0x8d, 0x28, 0x29, 0xc4, 0x23,
+ 0x9a, 0x50, 0xe8, 0x6d, 0xc8, 0xb6, 0xb4, 0x9f, 0x9d, 0xae, 0xd2, 0x53,
+ 0x74, 0x53, 0x99, 0x43, 0x10, 0xa2, 0xc2, 0x3a, 0x5d, 0xef, 0x53, 0xdf,
+ 0x97, 0xb7, 0xb7, 0x7d, 0xe7, 0x7c, 0xec, 0xa4, 0x4d, 0xd4, 0xc9, 0x50,
+ 0x30, 0xe8, 0x51, 0x66, 0x1a, 0x90, 0x6e, 0xe3, 0x75, 0x8f, 0x60, 0xf4,
+ 0xbd, 0xb6, 0x16, 0x7a, 0xc2, 0x8a, 0xa8, 0x93, 0x63, 0x73, 0x1c, 0x22,
+ 0x20, 0x4e, 0xdc, 0x0c, 0x9a, 0x73, 0x37, 0xa0, 0x57, 0x81, 0xfa, 0x66,
+ 0xac, 0xf0, 0xc3, 0x67, 0xa7, 0x67, 0x7b, 0xd1, 0x2f, 0xd3, 0x2f, 0x1e,
+ 0xfa, 0x74, 0xb0, 0x67, 0xef, 0x8e, 0xce, 0xdf, 0xb5, 0xb3, 0x05, 0xa8,
+ 0x99, 0x55, 0x18, 0xb4, 0x39, 0x7e, 0x73, 0x10, 0x5f, 0x2f, 0xfd, 0xa2,
+ 0xef, 0xab, 0x90, 0x0d, 0xf4, 0xdd, 0x30, 0xe3, 0xdd, 0xc3, 0x24, 0xdb,
+ 0x8e, 0x7d, 0x6f, 0xfc, 0xa6, 0x87, 0xbe, 0xf4, 0x8b, 0x15, 0xab, 0xfc,
+ 0xf6, 0xe8, 0x24, 0xd2, 0x73, 0xea, 0xfb, 0x77, 0xaf, 0xff, 0xd4, 0x5e,
+ 0xe5, 0xde, 0x93, 0xc8, 0x57, 0x7f, 0x4b, 0x87, 0x7a, 0x56, 0x97, 0x33,
+ 0xa3, 0xb0, 0xa0, 0xde, 0x08, 0xe5, 0x46, 0xfb, 0xe6, 0x0a, 0xa8, 0xfe,
+ 0x3c, 0xa0, 0x3f, 0x7f, 0x1e, 0x8d, 0x46, 0x5f, 0x86, 0x38, 0xfd, 0xf0,
+ 0xce, 0xd8, 0x85, 0xd2, 0x83, 0x94, 0x72, 0xd8, 0xb1, 0xbd, 0x51, 0xd9,
+ 0x85, 0x4a, 0x36, 0x8a, 0x57, 0x2c, 0xd2, 0xbc, 0x42, 0x97, 0xaa, 0xe8,
+ 0x55, 0x4b, 0x8b, 0x71, 0xd5, 0x88, 0x56, 0x8f, 0x13, 0xd4, 0x3a, 0x3e,
+ 0xa8, 0x1b, 0xf5, 0xa6, 0xd4, 0xfe, 0xbb, 0xdb, 0x37, 0x9d, 0x06, 0x2e,
+ 0x10, 0xee, 0x14, 0x44, 0x9f, 0xad, 0xc8, 0x33, 0xcb, 0x56, 0x8e, 0xbb,
+ 0x65, 0x0b, 0xbd, 0x35, 0x64, 0xdd, 0x53, 0x3b, 0xfd, 0xa8, 0xdf, 0x42,
+ 0x6a, 0x79, 0x0f, 0x25, 0x98, 0x0e, 0x17, 0x72, 0x8a, 0x0b, 0x05, 0x8d,
+ 0x8f, 0xb3, 0x66, 0xb2, 0x45, 0xeb, 0xac, 0x5b, 0xba, 0x9f, 0x55, 0xde,
+ 0x02, 0xf7, 0x91, 0x9f, 0xcb, 0x8b, 0x2a, 0x6f, 0x4e, 0x6b, 0xf1, 0xca,
+ 0x66, 0x5c, 0xa1, 0xb9, 0xa7, 0xa3, 0xb3, 0x66, 0x10, 0xca, 0xb1, 0x56,
+ 0x8f, 0x2e, 0xbf, 0x4a, 0x56, 0x9b, 0xaf, 0x04, 0x82, 0xd0, 0x2b, 0xa5,
+ 0x0c, 0x15, 0x7e, 0xc8, 0x65, 0xe5, 0x21, 0x4a, 0xa1, 0x00, 0x1e, 0xfe,
+ 0x65, 0xeb, 0x2e, 0x50, 0xdf, 0x9c, 0xbf, 0xe9, 0x3d, 0xf5, 0xf9, 0x98,
+ 0x00, 0x63, 0xdb, 0xab, 0xf9, 0x4e, 0x2b, 0x0d, 0x6f, 0xc2, 0xaf, 0x6d,
+ 0xaa, 0x06, 0xa0, 0x10, 0xd6, 0xff, 0x75, 0x9d, 0x54, 0x60, 0xbc, 0x1e,
+ 0xc5, 0x5f, 0x50, 0x96, 0x25, 0x93, 0x86, 0x9e, 0x8a, 0x68, 0x0c, 0x96,
+ 0x28, 0x96, 0xf9, 0x6c, 0xf6, 0x99, 0xc7, 0x3c, 0x58, 0xc2, 0x28, 0xf9,
+ 0x21, 0x9f, 0x4d, 0x27, 0x69, 0x85, 0x6c, 0xbb, 0xf0, 0x62, 0x15, 0x36,
+ 0xe1, 0x93, 0x54, 0x97, 0xf8, 0xaa, 0x3b, 0x36, 0xda, 0xde, 0x28, 0xce,
+ 0xf5, 0x91, 0xc2, 0x34, 0xbb, 0x19, 0x14, 0xf6, 0xee, 0x2b, 0x8c, 0x64,
+ 0xf6, 0x51, 0x1a, 0xd3, 0x25, 0xd7, 0xee, 0x29, 0xd3, 0xde, 0x57, 0x8d,
+ 0x40, 0x0c, 0x9f, 0x84, 0x51, 0x94, 0x7c, 0x71, 0xf3, 0x04, 0x8e, 0xab,
+ 0x67, 0x03, 0xfe, 0xd7, 0x33, 0x57, 0x22, 0xe5, 0x99, 0x67, 0x6c, 0xc1,
+ 0xb0, 0xbe, 0x7f, 0x7c, 0xa6, 0x85, 0xd8, 0x5d, 0x69, 0x38, 0xf6, 0x50,
+ 0xf2, 0x79, 0x96, 0x5a, 0x5a, 0x69, 0xde, 0xd1, 0xd9, 0x12, 0x45, 0x8c,
+ 0xe4, 0xfa, 0xf3, 0x45, 0x45, 0xd0, 0x38, 0x4d, 0xfd, 0xf3, 0xaa, 0x9a,
+ 0x77, 0xa3, 0xed, 0x3f, 0x1f, 0x45, 0x1a, 0xc2, 0x47, 0x3f, 0x64, 0x53,
+ 0xd2, 0xdd, 0xd7, 0x08, 0xcc, 0x0c, 0x01, 0x3b, 0xca, 0xf7, 0x71, 0x25,
+ 0xef, 0xd1, 0x0f, 0xbd, 0x78, 0xe0, 0x43, 0xbc, 0xa5, 0x16, 0x9b, 0xf0,
+ 0x56, 0xb9, 0xc2, 0x4e, 0x5f, 0xba, 0xbb, 0x3f, 0x19, 0x6d, 0x3f, 0x3e,
+ 0x8b, 0xde, 0x99, 0xdd, 0x0c, 0x91, 0xc9, 0x3f, 0x01, 0x97, 0x48, 0x72,
+ 0x58, 0xd9, 0xc7, 0x73, 0x2b, 0x7b, 0xb5, 0x10, 0xb4, 0x53, 0x4b, 0x8a,
+ 0x1b, 0x02, 0x90, 0x1b, 0x77, 0x88, 0x20, 0x41, 0xd7, 0x67, 0x40, 0xf9,
+ 0x32, 0xe4, 0xcd, 0x06, 0xf3, 0x72, 0x97, 0x82, 0x2e, 0x82, 0x92, 0xa4,
+ 0xfd, 0x18, 0x9b, 0x95, 0x78, 0x80, 0x75, 0x2a, 0x1e, 0x76, 0xf4, 0x00,
+ 0xf6, 0x12, 0x42, 0x91, 0xf5, 0x2c, 0x9b, 0x5e, 0x19, 0xe5, 0x72, 0x3e,
+ 0xcf, 0xaa, 0x35, 0x92, 0x8d, 0x78, 0x15, 0xdd, 0x1d, 0x5e, 0x71, 0xdc,
+ 0x5d, 0xd1, 0xf6, 0x82, 0x62, 0x7a, 0x19, 0xc9, 0x2b, 0x69, 0xd8, 0xc8,
+ 0xae, 0x14, 0x10, 0xa1, 0x9a, 0x6c, 0x6a, 0x2b, 0x33, 0xcd, 0x4f, 0x72,
+ 0x6a, 0x16, 0xe5, 0x38, 0xc5, 0x14, 0x61, 0xc4, 0x21, 0xb4, 0x4c, 0x39,
+ 0x0a, 0xaf, 0x36, 0x5d, 0x2e, 0x66, 0x0c, 0x06, 0xc7, 0x49, 0x50, 0xde,
+ 0x1c, 0x63, 0xe0, 0x8b, 0xb6, 0xcd, 0x0e, 0xa3, 0x29, 0x90, 0x87, 0x96,
+ 0xaa, 0x5e, 0xe0, 0xab, 0x85, 0x4e, 0xbb, 0x0e, 0x91, 0x3d, 0xa7, 0x4f,
+ 0x5e, 0x64, 0x64, 0x01, 0x93, 0x85, 0x93, 0x18, 0x2d, 0x2f, 0xb8, 0x9f,
+ 0x80, 0xd1, 0x88, 0xea, 0x3e, 0xb3, 0x10, 0x33, 0x57, 0xe2, 0xef, 0x8b,
+ 0x19, 0x21, 0xb6, 0x50, 0xf5, 0x35, 0xd5, 0x28, 0x48, 0x0b, 0x0c, 0x63,
+ 0xef, 0x1b, 0x03, 0x9d, 0x1a, 0x13, 0x28, 0x6c, 0x6b, 0x24, 0xe8, 0xc5,
+ 0x8a, 0x2a, 0xea, 0x53, 0xc2, 0xd0, 0x07, 0xb7, 0xd7, 0xd8, 0xe7, 0x3e,
+ 0x25, 0x36, 0x50, 0x31, 0x37, 0x26, 0x7a, 0x7e, 0x91, 0xcf, 0xa8, 0x01,
+ 0x52, 0x50, 0xc1, 0x87, 0x5d, 0x43, 0xad, 0x48, 0x18, 0x64, 0x99, 0xa5,
+ 0x1f, 0xef, 0xbd, 0xae, 0x73, 0x54, 0xf5, 0x34, 0x23, 0x1f, 0x21, 0xb9,
+ 0x2b, 0x38, 0x5e, 0x01, 0xa7, 0xe7, 0x35, 0x7b, 0x05, 0xa8, 0x2c, 0x17,
+ 0x0d, 0xe8, 0x90, 0x9d, 0x90, 0x4d, 0x63, 0x66, 0xa2, 0xb4, 0x9f, 0x91,
+ 0xaa, 0x64, 0x37, 0x0a, 0x07, 0x7d, 0x1c, 0xc9, 0x03, 0x8a, 0xbf, 0x0e,
+ 0xae, 0xc2, 0x4c, 0xfb, 0x62, 0x89, 0x3f, 0x57, 0xd9, 0x8f, 0x2e, 0x6c,
+ 0x4d, 0x12, 0x14, 0xdf, 0x3a, 0xbb, 0x33, 0xd8, 0xf9, 0x9a, 0x26, 0xf1,
+ 0xc5, 0x6a, 0x0a, 0x99, 0xcb, 0x09, 0x10, 0xff, 0x07, 0x64, 0x8c, 0xc6,
+ 0xe5, 0xb8, 0xb7, 0xa9, 0x0c, 0xcb, 0xf9, 0xed, 0xd2, 0x30, 0x38, 0xe6,
+ 0x3c, 0x56, 0x98, 0x81, 0x6a, 0x99, 0x49, 0x66, 0x6d, 0xea, 0x2f, 0x12,
+ 0x2e, 0xff, 0xff, 0x4a, 0x16, 0xf9, 0x02, 0x89, 0xa2, 0x5f, 0x8a, 0xb7,
+ 0x2b, 0x06, 0x17, 0x89, 0xde, 0x46, 0x5c, 0xe9, 0x68, 0x24, 0xb9, 0xb9,
+ 0xc0, 0x90, 0xa2, 0x5b, 0x16, 0x57, 0x48, 0x10, 0xb9, 0x02, 0x48, 0x39,
+ 0x5b, 0xc4, 0x66, 0x1d, 0x75, 0x26, 0xac, 0x4f, 0xb6, 0x24, 0xcf, 0xb5,
+ 0x33, 0x1c, 0x01, 0x89, 0xe8, 0x44, 0x70, 0xee, 0xca, 0xf9, 0x85, 0x66,
+ 0x98, 0x76, 0xa1, 0x87, 0x06, 0x82, 0xdc, 0x71, 0x2f, 0xa5, 0x64, 0x11,
+ 0xe1, 0x45, 0x67, 0x2c, 0xeb, 0x9e, 0xb0, 0x15, 0xb2, 0xec, 0xf9, 0x4e,
+ 0x1b, 0xf1, 0x8a, 0x65, 0x19, 0xe5, 0x13, 0x56, 0xd9, 0x25, 0x89, 0xa5,
+ 0xae, 0xf2, 0x5b, 0x74, 0xbd, 0xc6, 0xa2, 0xe0, 0x91, 0x3c, 0xe0, 0x1f,
+ 0x13, 0xde, 0x91, 0xaa, 0x6c, 0x47, 0x54, 0x35, 0xfc, 0xee, 0xe8, 0xf5,
+ 0xfb, 0xf1, 0xd1, 0x2b, 0xc0, 0x5b, 0xc7, 0xba, 0x15, 0xe6, 0xe8, 0x0a,
+ 0x84, 0xf8, 0x6a, 0x53, 0xb2, 0x69, 0xac, 0xd2, 0xaf, 0x25, 0xee, 0xb8,
+ 0xcf, 0x79, 0xcd, 0xe0, 0x14, 0x2c, 0x2b, 0x63, 0xf2, 0xa2, 0x4f, 0x72,
+ 0xae, 0xc0, 0xf9, 0xe2, 0x55, 0x4f, 0x33, 0x6a, 0x7d, 0xf9, 0x92, 0x73,
+ 0xf9, 0x02, 0x10, 0x53, 0x34, 0xc9, 0x14, 0x48, 0x3b, 0x23, 0x70, 0xb3,
+ 0x85, 0x9e, 0xa0, 0x74, 0x5e, 0x2e, 0x0b, 0x0e, 0xf0, 0x50, 0xbe, 0xb8,
+ 0x9c, 0x01, 0xc4, 0xd0, 0xf8, 0x44, 0xc3, 0x04, 0x4d, 0x7b, 0xfa, 0x34,
+ 0xc2, 0x75, 0xcd, 0xc7, 0x40, 0xf5, 0x99, 0x2e, 0x51, 0x36, 0xf2, 0xc6,
+ 0xfa, 0x27, 0x24, 0x53, 0x3e, 0xec, 0x59, 0x0b, 0xd9, 0x0d, 0x44, 0x3c,
+ 0x12, 0x7e, 0x3c, 0x15, 0xa3, 0x18, 0x5f, 0x95, 0xe6, 0xb8, 0x5c, 0xcf,
+ 0x2d, 0x34, 0x00, 0x23, 0x28, 0xd5, 0x9b, 0xdd, 0x2b, 0xa8, 0x7b, 0x2d,
+ 0x90, 0x4f, 0x04, 0x79, 0x3c, 0x19, 0x43, 0xa6, 0x90, 0x86, 0xc3, 0x64,
+ 0x82, 0xdb, 0x97, 0x72, 0x1c, 0x58, 0x3d, 0x1f, 0x0b, 0xc8, 0x09, 0x68,
+ 0xc1, 0x14, 0x0c, 0x9d, 0x66, 0xd4, 0xd3, 0xab, 0xeb, 0x94, 0x56, 0x07,
+ 0x84, 0xde, 0x3b, 0x3a, 0x75, 0x9a, 0xf9, 0x3f, 0xb3, 0x57, 0xea, 0xce,
+ 0x6e, 0xec, 0x36, 0x9f, 0xa7, 0x77, 0x70, 0xb4, 0xf7, 0xb2, 0x03, 0xbc,
+ 0x22, 0x4c, 0x10, 0x7a, 0xae, 0x62, 0xfd, 0x15, 0xda, 0xa2, 0x2b, 0x35,
+ 0xe5, 0xf4, 0x4a, 0xbb, 0xd5, 0x22, 0xec, 0x09, 0xcd, 0x31, 0x4c, 0xa0,
+ 0x00, 0x32, 0xa5, 0xcc, 0x19, 0xb1, 0x8e, 0x94, 0x16, 0x49, 0x8e, 0xa8,
+ 0x0d, 0x6e, 0xdb, 0x88, 0x8f, 0x6d, 0xd2, 0x8f, 0x67, 0x25, 0x65, 0x5a,
+ 0xd4, 0x9e, 0x07, 0x3f, 0x02, 0x91, 0x4b, 0x12, 0xa8, 0x22, 0x2e, 0x54,
+ 0xb7, 0x1c, 0x47, 0xb6, 0xd0, 0x28, 0x0e, 0xc5, 0xd9, 0x04, 0x18, 0xca,
+ 0x7e, 0x7c, 0xe9, 0x7e, 0x8a, 0x65, 0xf0, 0x9b, 0x41, 0x26, 0xbe, 0x8e,
+ 0x93, 0xf1, 0x00, 0x83, 0x76, 0x1f, 0x03, 0x99, 0x36, 0xc0, 0x10, 0xb8,
+ 0xf0, 0x12, 0x7d, 0x4a, 0x15, 0x93, 0x26, 0x62, 0x76, 0x72, 0x77, 0x60,
+ 0x12, 0x62, 0xa8, 0x25, 0xa6, 0x15, 0xc1, 0x5d, 0x96, 0x16, 0xfe, 0x64,
+ 0xb1, 0x03, 0x66, 0x90, 0xbc, 0x9c, 0xa2, 0x0a, 0x99, 0xbb, 0xdc, 0xf5,
+ 0xc0, 0xb5, 0xc9, 0x6c, 0xd6, 0x29, 0xde, 0x72, 0x97, 0xcf, 0x97, 0x73,
+ 0xbc, 0x3e, 0x60, 0xb8, 0x81, 0x39, 0x69, 0xe0, 0xba, 0xa9, 0xc8, 0x91,
+ 0x6e, 0x94, 0xa3, 0x62, 0x2e, 0x59, 0x12, 0x6d, 0x60, 0xda, 0x86, 0x75,
+ 0x13, 0x7a, 0x8b, 0x1b, 0x58, 0x61, 0xa3, 0xfe, 0xdb, 0xf9, 0x33, 0x79,
+ 0x69, 0xac, 0xd3, 0x2f, 0x23, 0x38, 0x4b, 0xa9, 0x2f, 0x53, 0x45, 0x7e,
+ 0x80, 0x33, 0xa9, 0x60, 0x23, 0x9b, 0x7a, 0xee, 0x30, 0xe6, 0x38, 0xb2,
+ 0x2a, 0x79, 0x93, 0x7a, 0x25, 0xd4, 0xc0, 0x86, 0xef, 0x84, 0xdd, 0x69,
+ 0xa1, 0x2e, 0x80, 0xc5, 0x0a, 0xb6, 0x30, 0x3d, 0xed, 0x1b, 0x9c, 0x0a,
+ 0xcb, 0x45, 0x60, 0xbf, 0x88, 0xa0, 0x90, 0xfc, 0x0c, 0x7e, 0xdf, 0x7c,
+ 0x7e, 0x5b, 0x72, 0xfb, 0xc4, 0x47, 0x47, 0x71, 0x3f, 0xa1, 0xb2, 0xba,
+ 0xe3, 0xdb, 0x9d, 0xb8, 0x6c, 0x52, 0x03, 0xc4, 0x06, 0x09, 0xb2, 0x8e,
+ 0xb8, 0x64, 0x0b, 0x9b, 0xb1, 0x07, 0xf7, 0x49, 0x9c, 0xf2, 0xde, 0x0d,
+ 0x18, 0x2b, 0x04, 0xe9, 0x9d, 0x4f, 0xee, 0xee, 0x02, 0x0e, 0xf7, 0xdc,
+ 0x7a, 0x8c, 0xef, 0xcc, 0x3e, 0xbf, 0x27, 0xdb, 0x9f, 0xd3, 0x3f, 0x9f,
+ 0xde, 0x75, 0x5c, 0x7f, 0xa3, 0x28, 0x18, 0xb3, 0x83, 0x3c, 0x4d, 0x2f,
+ 0x4a, 0x4e, 0x25, 0x60, 0xa2, 0xa5, 0x11, 0x72, 0xb2, 0x74, 0xb8, 0x4d,
+ 0xd1, 0x95, 0x2f, 0x4c, 0xd0, 0x42, 0x46, 0xb9, 0xa0, 0xb8, 0xb8, 0x64,
+ 0x0f, 0x34, 0x04, 0x36, 0x4a, 0x02, 0x91, 0x52, 0xe9, 0xa4, 0x03, 0x1a,
+ 0xf2, 0x2d, 0x39, 0x88, 0x1c, 0x90, 0x8b, 0xbe, 0xc2, 0xd4, 0xa7, 0x23,
+ 0x65, 0xee, 0xab, 0x7c, 0xc6, 0xda, 0x19, 0x1d, 0xec, 0x3a, 0xd9, 0x31,
+ 0xbb, 0x90, 0x17, 0xcb, 0xc6, 0xa2, 0xe3, 0xe2, 0x9b, 0x16, 0xe6, 0x2d,
+ 0x42, 0xfd, 0x19, 0x0c, 0x02, 0xc5, 0x9b, 0xa1, 0xd3, 0x57, 0x7b, 0x49,
+ 0x0e, 0x7c, 0x4a, 0xd8, 0xbb, 0x20, 0x21, 0xb6, 0xd6, 0x2d, 0x1b, 0x71,
+ 0x78, 0xdb, 0xbe, 0x9e, 0x7a, 0xaf, 0x66, 0x77, 0x86, 0xda, 0x8c, 0x5a,
+ 0xe8, 0x5d, 0x6c, 0xf6, 0x4a, 0x1b, 0x79, 0xdd, 0x91, 0x22, 0xf9, 0x8b,
+ 0x2d, 0x21, 0x6e, 0x1b, 0x64, 0x42, 0xce, 0x95, 0x8d, 0x1c, 0x49, 0xdb,
+ 0xda, 0x94, 0x2d, 0xd0, 0xf8, 0xd1, 0xe6, 0xf6, 0xa4, 0x82, 0x0f, 0xf7,
+ 0xec, 0x99, 0xc5, 0xde, 0xe0, 0x5c, 0x74, 0xa3, 0xd1, 0x6b, 0x5a, 0x2f,
+ 0x33, 0x36, 0xac, 0xbd, 0xe1, 0x01, 0xe5, 0xbd, 0xec, 0xc7, 0x14, 0x34,
+ 0x61, 0x21, 0x6d, 0x03, 0x61, 0x64, 0x2f, 0x84, 0x01, 0xc2, 0x8e, 0x99,
+ 0x36, 0xc0, 0xa0, 0xd6, 0x18, 0x7c, 0x54, 0x6d, 0x1c, 0x11, 0x1e, 0xa9,
+ 0xec, 0x2e, 0x94, 0xcc, 0x31, 0x55, 0xe7, 0x9f, 0x28, 0x8e, 0xea, 0x94,
+ 0xe0, 0x9e, 0x97, 0xcd, 0xf5, 0xdf, 0xf2, 0x69, 0xf2, 0x52, 0x51, 0xc2,
+ 0xe3, 0xa0, 0x49, 0x74, 0x2c, 0xcc, 0x93, 0x66, 0xff, 0x6a, 0x56, 0x70,
+ 0xf5, 0xf1, 0x64, 0x43, 0x46, 0x30, 0xf6, 0xe6, 0x74, 0x89, 0x08, 0xc3,
+ 0xf8, 0x60, 0x7c, 0x92, 0x9c, 0x9d, 0x1c, 0x1c, 0xbf, 0x35, 0xef, 0x0c,
+ 0x43, 0xdf, 0x9b, 0xc5, 0x0a, 0x05, 0xd2, 0x54, 0xa0, 0x93, 0x76, 0xf0,
+ 0x44, 0xdb, 0x1f, 0x0a, 0xe1, 0x04, 0xa7, 0xb8, 0x57, 0x5b, 0xc5, 0x54,
+ 0xc3, 0xa5, 0xa6, 0x70, 0xf6, 0x25, 0x2f, 0x5a, 0xea, 0x6a, 0xde, 0x9f,
+ 0x24, 0xd6, 0x7b, 0x99, 0x13, 0x72, 0x2c, 0xcd, 0x0d, 0x76, 0xa3, 0xd9,
+ 0x30, 0xb1, 0xd5, 0x10, 0xed, 0x5c, 0x46, 0x0a, 0x26, 0x6f, 0xe6, 0xc4,
+ 0xcd, 0x29, 0x0d, 0x87, 0x78, 0x63, 0x03, 0x59, 0xb5, 0x93, 0xb8, 0x1f,
+ 0x4d, 0xed, 0x4c, 0x90, 0x9f, 0x4e, 0xc9, 0xee, 0x42, 0x25, 0xb9, 0x6e,
+ 0xbd, 0x22, 0x23, 0xa9, 0x56, 0xb7, 0xbe, 0x27, 0xd4, 0xb6, 0xae, 0xd7,
+ 0xc1, 0x65, 0x7d, 0x51, 0xde, 0x0d, 0xd4, 0x04, 0xc3, 0x12, 0x50, 0x03,
+ 0xeb, 0x92, 0xb6, 0xae, 0x8c, 0x64, 0x03, 0x0a, 0xa4, 0x54, 0xbf, 0x97,
+ 0x0c, 0x90, 0x4f, 0xb8, 0xf7, 0x61, 0x05, 0xd4, 0xdc, 0xa8, 0xba, 0x66,
+ 0x40, 0x3f, 0xd6, 0xb3, 0x8a, 0xdd, 0xe8, 0xc0, 0x05, 0xec, 0x96, 0x77,
+ 0xd5, 0x9d, 0x23, 0x94, 0x0d, 0xd8, 0xa4, 0x5f, 0x2b, 0xa8, 0xcd, 0x10,
+ 0xe0, 0xa3, 0x36, 0x37, 0xac, 0xec, 0x7d, 0xd2, 0xb1, 0x87, 0x3e, 0x15,
+ 0x40, 0x3b, 0x37, 0xcc, 0xe8, 0xeb, 0x30, 0x5d, 0xef, 0xe3, 0xe3, 0xae,
+ 0x0d, 0x44, 0x30, 0x15, 0x86, 0xd4, 0x44, 0x71, 0x26, 0x37, 0x02, 0x4f,
+ 0x62, 0xfe, 0x13, 0x3c, 0xb3, 0x25, 0xb9, 0xbe, 0x0f, 0xa5, 0xcc, 0x31,
+ 0xea, 0xbb, 0xae, 0x7c, 0x4c, 0xdc, 0x5f, 0x5f, 0x97, 0xb7, 0xc3, 0x18,
+ 0x82, 0xa4, 0x4d, 0x38, 0x11, 0x93, 0xab, 0xc6, 0xd3, 0x94, 0xf9, 0xdb,
+ 0x08, 0xa7, 0xd9, 0x2b, 0x9d, 0xc6, 0x70, 0x09, 0xb4, 0xd4, 0x7b, 0x28,
+ 0xec, 0x54, 0xc4, 0x39, 0x55, 0x97, 0xd1, 0x6e, 0xe4, 0x5e, 0x73, 0x8c,
+ 0xa2, 0x24, 0xf4, 0xa7, 0x2b, 0xa0, 0x46, 0xcd, 0xb3, 0xa6, 0x95, 0x45,
+ 0xed, 0xcd, 0x20, 0x10, 0xe0, 0x33, 0xa9, 0x31, 0xf8, 0xeb, 0x32, 0xcf,
+ 0x50, 0xe2, 0x9b, 0x91, 0xd3, 0x09, 0xa7, 0x56, 0x1a, 0x80, 0x63, 0xcc,
+ 0x04, 0x63, 0x72, 0xe5, 0x99, 0x34, 0x83, 0x37, 0xd3, 0x0d, 0x04, 0xb8,
+ 0x99, 0x3e, 0x5d, 0x6d, 0x30, 0x08, 0xcd, 0xe9, 0x39, 0xa4, 0x45, 0xce,
+ 0xcd, 0xd5, 0x09, 0xf7, 0xbe, 0x07, 0x84, 0xab, 0xd9, 0x84, 0x5a, 0xe2,
+ 0x87, 0x2a, 0x96, 0xfa, 0x63, 0x58, 0xc2, 0x37, 0x68, 0x35, 0x50, 0x85,
+ 0x43, 0x59, 0xa4, 0x58, 0x43, 0xdd, 0x77, 0x8b, 0x74, 0xb6, 0x55, 0x37,
+ 0x53, 0x52, 0x27, 0x96, 0xc5, 0x8c, 0xe6, 0x49, 0x23, 0xf5, 0xb4, 0xf3,
+ 0x8e, 0x00, 0x46, 0xbe, 0x47, 0x24, 0x75, 0x8c, 0x48, 0xaa, 0xdb, 0x50,
+ 0xee, 0xa1, 0x64, 0xc5, 0xa6, 0x34, 0xd5, 0xf2, 0x92, 0xcb, 0x6d, 0x72,
+ 0x67, 0x88, 0x5e, 0xe9, 0x53, 0x8b, 0x44, 0x14, 0xaf, 0x17, 0xb4, 0x6c,
+ 0xed, 0xf2, 0xaa, 0xcd, 0xbc, 0xa1, 0xfd, 0x32, 0x6c, 0x79, 0x51, 0xd6,
+ 0x48, 0xd1, 0x37, 0x2b, 0x34, 0xef, 0x4a, 0xbf, 0x93, 0x55, 0x1b, 0x3d,
+ 0x64, 0x00, 0xd9, 0x5f, 0x88, 0xd1, 0x07, 0xac, 0xd8, 0x27, 0x1e, 0x42,
+ 0x5f, 0xd3, 0x89, 0xfd, 0xf8, 0x78, 0xa4, 0xc3, 0xb0, 0x9c, 0xeb, 0x97,
+ 0xc2, 0xf3, 0xf9, 0xcd, 0x9b, 0x1c, 0x02, 0x29, 0x79, 0x80, 0x6d, 0xa5,
+ 0x84, 0xa4, 0x3f, 0xb7, 0x80, 0xea, 0x04, 0x4f, 0x39, 0xe2, 0x72, 0x32,
+ 0x1c, 0xb6, 0x14, 0x64, 0xaf, 0xc9, 0xcc, 0xa8, 0x54, 0x11, 0x17, 0xf5,
+ 0x58, 0x60, 0x5d, 0x09, 0xc4, 0x76, 0xd0, 0x55, 0x00, 0xea, 0x25, 0xe9,
+ 0xf9, 0xb3, 0x25, 0x7d, 0xd9, 0x79, 0x91, 0x80, 0x3f, 0xaa, 0x80, 0x44,
+ 0x51, 0xcc, 0x5e, 0x0b, 0x20, 0x4a, 0xc7, 0xdc, 0x83, 0x2f, 0x56, 0x44,
+ 0x7e, 0x8b, 0xec, 0xdb, 0x45, 0x78, 0x1c, 0xf5, 0xcc, 0x8e, 0x7c, 0x2f,
+ 0x3c, 0x4c, 0x26, 0xf0, 0xe8, 0x9e, 0xcb, 0x9e, 0x4a, 0x5f, 0x75, 0x3a,
+ 0x82, 0xef, 0x2b, 0x88, 0x78, 0x31, 0x4c, 0x56, 0x9b, 0x46, 0xd6, 0x9a,
+ 0x99, 0x6a, 0x3b, 0x0a, 0xfe, 0x83, 0x5a, 0x34, 0xc6, 0xf0, 0xd5, 0xfd,
+ 0x4f, 0x8e, 0x8b, 0x20, 0x47, 0x82, 0x1c, 0xd6, 0xdc, 0x04, 0x18, 0x62,
+ 0x8b, 0x95, 0x73, 0x29, 0xac, 0xad, 0xf5, 0x40, 0xb6, 0xa6, 0xa4, 0xaa,
+ 0x79, 0xa4, 0xaa, 0x89, 0x5f, 0xda, 0x50, 0x88, 0x3d, 0xbc, 0xb6, 0xd9,
+ 0xca, 0x25, 0x28, 0x5b, 0x4d, 0x24, 0xfe, 0xa9, 0x1a, 0xdc, 0xd3, 0x76,
+ 0xff, 0x5b, 0x01, 0x64, 0xfe, 0x55, 0x07, 0x2a, 0x7d, 0xdc, 0x89, 0xea,
+ 0xa9, 0x40, 0xfc, 0x7f, 0xf3, 0x44, 0xa5, 0xc9, 0xe3, 0xce, 0x54, 0xda,
+ 0x3d, 0x54, 0xa1, 0x58, 0xba, 0xeb, 0x9d, 0xf1, 0x6f, 0x78, 0xca, 0xf8,
+ 0x98, 0xfd, 0xa2, 0x73, 0xa6, 0x4c, 0xf1, 0xff, 0xf2, 0x29, 0xfb, 0xbc,
+ 0xa3, 0x48, 0x02, 0xdd, 0x7c, 0x45, 0x9b, 0x69, 0x3f, 0x9f, 0x95, 0x14,
+ 0x6c, 0x52, 0xd7, 0xb6, 0x2c, 0x10, 0x71, 0xbc, 0xd7, 0x34, 0x03, 0x67,
+ 0x46, 0x92, 0x3a, 0x10, 0xcf, 0x00, 0x3d, 0x9e, 0x5a, 0x99, 0xa7, 0xf8,
+ 0x36, 0x2b, 0x07, 0x0e, 0x5d, 0xc1, 0xda, 0xdf, 0x01, 0x18, 0x17, 0xb6,
+ 0x2d, 0x79, 0x22, 0x2d, 0xd0, 0x64, 0x59, 0x57, 0xe6, 0xbe, 0x5f, 0xe4,
+ 0x48, 0x30, 0x2e, 0x09, 0x36, 0xe3, 0x9b, 0xf1, 0x78, 0x78, 0x70, 0x76,
+ 0xfc, 0x80, 0xe9, 0x06, 0x54, 0x37, 0x37, 0xc9, 0x98, 0xf5, 0xdd, 0x9f,
+ 0x9a, 0xda, 0xfe, 0xb4, 0xd1, 0x95, 0xbb, 0x64, 0x3d, 0xa8, 0x5b, 0x95,
+ 0x17, 0x3a, 0x25, 0xdb, 0x2f, 0x8b, 0xf4, 0x75, 0x6d, 0x99, 0x80, 0xea,
+ 0x27, 0xf2, 0xfc, 0x20, 0x1c, 0x86, 0x27, 0x82, 0x68, 0x1f, 0xf0, 0xf1,
+ 0x00, 0x6e, 0x97, 0xec, 0xbc, 0x78, 0xb6, 0x63, 0x8e, 0xc5, 0x3d, 0xc7,
+ 0x0d, 0xe5, 0xfd, 0x27, 0xa3, 0xbd, 0xad, 0x27, 0xa3, 0x27, 0x24, 0xd5,
+ 0x5c, 0x22, 0x89, 0x8c, 0x1f, 0x0f, 0xc1, 0xd1, 0xb4, 0xde, 0x1e, 0x1d,
+ 0x26, 0x9c, 0xcc, 0x0f, 0x08, 0xdf, 0x8e, 0xd9, 0xc6, 0x39, 0xbf, 0x88,
+ 0x37, 0x8d, 0xd4, 0xe9, 0xcc, 0xcc, 0x1a, 0xb8, 0x3c, 0x02, 0x72, 0x24,
+ 0x6a, 0x8e, 0x00, 0x01, 0xa9, 0xb0, 0x33, 0x21, 0x79, 0xc7, 0x96, 0x89,
+ 0x50, 0xc6, 0xfc, 0x26, 0xac, 0xca, 0xf5, 0x68, 0xe2, 0x51, 0xec, 0x81,
+ 0x92, 0x9b, 0x27, 0xfd, 0xfb, 0xa3, 0x16, 0x50, 0x8f, 0x0d, 0xe5, 0xe2,
+ 0x00, 0x81, 0xa9, 0x24, 0xf2, 0xd0, 0xda, 0xb5, 0x75, 0x52, 0x4d, 0xe6,
+ 0xd6, 0xaa, 0xb9, 0xfc, 0xeb, 0xb4, 0x18, 0xfd, 0x52, 0x93, 0x2c, 0xa2,
+ 0x25, 0xb7, 0x2d, 0x2f, 0x9e, 0xbb, 0x08, 0x6a, 0xb1, 0xb8, 0xfa, 0x56,
+ 0xc4, 0x56, 0x56, 0xd7, 0xdf, 0x06, 0x06, 0xa0, 0xb3, 0xcc, 0x36, 0x98,
+ 0x37, 0x90, 0x1d, 0x7d, 0xd5, 0xe0, 0x11, 0x9b, 0xde, 0x7d, 0x6b, 0xab,
+ 0xca, 0xd2, 0x99, 0xbc, 0x28, 0xd6, 0x1f, 0xe2, 0xfb, 0xc1, 0x2f, 0x2f,
+ 0xd1, 0x1c, 0xb6, 0x0e, 0xe0, 0x55, 0xb9, 0x3f, 0x89, 0xc5, 0x1b, 0xe6,
+ 0xa7, 0x6d, 0xea, 0xaa, 0xeb, 0xc3, 0xb6, 0xa8, 0xcc, 0x75, 0x92, 0x2f,
+ 0x8c, 0x28, 0x7c, 0x44, 0xbd, 0x55, 0xff, 0xe6, 0x3f, 0x28, 0xef, 0x9c,
+ 0xb8, 0x88, 0x76, 0x92, 0x66, 0x70, 0x13, 0x41, 0xb1, 0x0a, 0x6e, 0x55,
+ 0x91, 0x20, 0x2d, 0x39, 0xd7, 0x33, 0x20, 0xc1, 0xc9, 0x88, 0x38, 0x73,
+ 0x19, 0x0f, 0xdd, 0xa4, 0x42, 0x63, 0x8c, 0x2a, 0x9a, 0x31, 0xb9, 0xf7,
+ 0x5c, 0x64, 0x4e, 0x07, 0x15, 0x18, 0x80, 0xcd, 0x91, 0xda, 0x56, 0xab,
+ 0x84, 0xbb, 0x15, 0x89, 0x0f, 0x8a, 0xde, 0xdf, 0x42, 0x18, 0x92, 0x0a,
+ 0xc7, 0xae, 0x8a, 0x07, 0x94, 0xb9, 0xa0, 0xf3, 0xa2, 0x7f, 0x59, 0x24,
+ 0x1b, 0xc8, 0x91, 0xcb, 0x7c, 0x48, 0x6a, 0xcd, 0xb9, 0x0a, 0xfd, 0x4d,
+ 0x36, 0x9f, 0x66, 0xf3, 0x41, 0xc3, 0xca, 0xaa, 0x7d, 0x09, 0x57, 0xd7,
+ 0x40, 0xf1, 0x0b, 0xe4, 0xec, 0xff, 0x13, 0x6a, 0xe0, 0xd3, 0xc4, 0xee,
+ 0xd5, 0x63, 0xb4, 0x41, 0xee, 0x8b, 0x02, 0x6d, 0x30, 0xf0, 0x5e, 0x7a,
+ 0x26, 0xd7, 0xff, 0xaf, 0x0d, 0xfe, 0x9f, 0xa4, 0x0d, 0xfe, 0xe2, 0x53,
+ 0xda, 0x3a, 0xa4, 0x43, 0xa9, 0xf6, 0xb0, 0xe7, 0xd2, 0x9d, 0xc4, 0x78,
+ 0x11, 0xd6, 0xec, 0xfe, 0x91, 0x07, 0xb4, 0x7b, 0x42, 0x93, 0x90, 0x15,
+ 0xfe, 0xdf, 0x38, 0xa2, 0x8f, 0x3a, 0x99, 0xff, 0xbf, 0xef, 0xe3, 0x7f,
+ 0xb7, 0x73, 0xd8, 0xaf, 0x0d, 0x6e, 0x18, 0x26, 0xbb, 0xa5, 0x34, 0x3f,
+ 0xee, 0x54, 0x0a, 0x3b, 0x7b, 0xd3, 0x69, 0x3e, 0x54, 0xa1, 0xcc, 0xb4,
+ 0x3b, 0x3e, 0xfb, 0xfe, 0xd9, 0x00, 0xd1, 0xe2, 0x71, 0x37, 0x35, 0xa6,
+ 0x4a, 0x4e, 0x5e, 0x1d, 0x9c, 0xfd, 0x82, 0xd3, 0xfe, 0x27, 0xf8, 0x37,
+ 0x17, 0x59, 0x36, 0x1d, 0x72, 0x14, 0xf2, 0x25, 0xfe, 0x11, 0x09, 0xdf,
+ 0xa7, 0x16, 0x71, 0x08, 0x6c, 0x4b, 0xc1, 0xc9, 0x30, 0x29, 0x02, 0x2f,
+ 0x1b, 0x35, 0xa5, 0x10, 0x1c, 0x30, 0xca, 0xc1, 0xad, 0x43, 0x1f, 0x4b,
+ 0x59, 0x4c, 0x37, 0xb9, 0x00, 0x1a, 0x5f, 0x06, 0xab, 0x48, 0x2e, 0x0b,
+ 0x9d, 0xef, 0x2b, 0x82, 0xbd, 0xb4, 0xb0, 0xdf, 0xde, 0x33, 0x38, 0xf8,
+ 0x61, 0x0f, 0x24, 0x3e, 0x04, 0xf7, 0x6e, 0x29, 0x1c, 0x40, 0x65, 0x98,
+ 0xd4, 0xbd, 0x6d, 0x72, 0xe1, 0x43, 0x8a, 0x64, 0xcd, 0x27, 0x44, 0x20,
+ 0xea, 0x7e, 0xbe, 0x2f, 0x39, 0x67, 0x25, 0x29, 0xfd, 0x9d, 0x68, 0x51,
+ 0x90, 0xe2, 0xed, 0x1c, 0x7d, 0xec, 0xca, 0x20, 0x9f, 0x3e, 0x9c, 0x8e,
+ 0xc2, 0xf3, 0xb5, 0x9f, 0x68, 0x53, 0xf3, 0xf8, 0xd2, 0x7f, 0x21, 0xb0,
+ 0xa8, 0xb9, 0x50, 0x57, 0x33, 0xb9, 0x24, 0x73, 0xcb, 0x9f, 0x95, 0x84,
+ 0x0d, 0xa9, 0xbb, 0x95, 0xba, 0xfc, 0x5d, 0xad, 0xd5, 0x9f, 0xc2, 0x3c,
+ 0x73, 0xef, 0xdd, 0xd5, 0xc9, 0xd1, 0x65, 0xd1, 0x54, 0xd4, 0x1e, 0xcc,
+ 0x4b, 0x24, 0xc5, 0x41, 0x5e, 0xd6, 0x5e, 0xf5, 0x18, 0xf5, 0x0f, 0xb8,
+ 0x44, 0x1b, 0x41, 0xa2, 0x5a, 0xd8, 0x2c, 0x9b, 0xcf, 0x77, 0x92, 0x35,
+ 0x93, 0x91, 0xdb, 0x5b, 0x60, 0xe5, 0x9a, 0x5f, 0x4e, 0x8c, 0x92, 0x0b,
+ 0xae, 0x33, 0x12, 0x76, 0x90, 0x70, 0xba, 0x08, 0x99, 0x3c, 0x3d, 0xbe,
+ 0x0a, 0xcd, 0xab, 0xf9, 0xf4, 0xcd, 0x55, 0x57, 0x77, 0x2f, 0x0e, 0x61,
+ 0x75, 0xd4, 0x3c, 0xb1, 0x62, 0x21, 0x35, 0xe2, 0x0c, 0x80, 0x34, 0x86,
+ 0x53, 0x0c, 0x93, 0x34, 0xf7, 0x94, 0x94, 0x7b, 0x2b, 0x35, 0xc2, 0x5d,
+ 0x79, 0x3f, 0x3e, 0xd9, 0xe3, 0x5a, 0x88, 0xf3, 0x93, 0xb1, 0xdf, 0xfd,
+ 0xa6, 0x46, 0x68, 0x1f, 0x45, 0xe1, 0x5f, 0x1f, 0x1d, 0x8c, 0xcf, 0x47,
+ 0x91, 0x35, 0x86, 0xe9, 0x57, 0x0e, 0x25, 0x82, 0xc0, 0x1e, 0x67, 0xe9,
+ 0x3d, 0xc1, 0x34, 0x4b, 0xa9, 0x39, 0xcd, 0x8d, 0xa7, 0xa6, 0x63, 0x93,
+ 0x99, 0xcb, 0x45, 0x71, 0x48, 0xe0, 0x0b, 0x13, 0x9c, 0x0c, 0xed, 0x24,
+ 0x05, 0xd9, 0xa6, 0x3f, 0x83, 0xb5, 0x80, 0x5c, 0x52, 0xce, 0x28, 0x2d,
+ 0x81, 0xbe, 0xd3, 0xf6, 0x44, 0x50, 0xa9, 0x86, 0xc0, 0xb9, 0xf4, 0x83,
+ 0x33, 0x18, 0xbd, 0xa3, 0xa4, 0xe6, 0x8d, 0x76, 0xae, 0x4a, 0x2b, 0x0e,
+ 0x5c, 0x7b, 0xfd, 0x76, 0x09, 0xf3, 0x8d, 0x80, 0xad, 0xc2, 0x42, 0x98,
+ 0xb4, 0xfe, 0xa8, 0xc1, 0x61, 0x74, 0x05, 0xa7, 0xb8, 0xf3, 0xca, 0x6c,
+ 0xfc, 0xae, 0x25, 0x64, 0x36, 0x1a, 0x38, 0x21, 0x54, 0x31, 0x1a, 0x14,
+ 0x8c, 0x91, 0x03, 0xa0, 0xc8, 0x66, 0x9b, 0x2b, 0x76, 0x5c, 0xd3, 0x50,
+ 0xfc, 0xae, 0xe5, 0x34, 0x5a, 0xbc, 0x53, 0x6a, 0x32, 0xb9, 0xce, 0xcc,
+ 0x2d, 0x32, 0xf2, 0xd0, 0x6e, 0x1e, 0x4d, 0x90, 0xcf, 0x02, 0x48, 0xd4,
+ 0x08, 0x79, 0x7e, 0x31, 0x41, 0x9e, 0x3c, 0x09, 0x09, 0x52, 0x65, 0x7f,
+ 0x9d, 0xc6, 0x3a, 0x99, 0xa0, 0x2e, 0x0f, 0x25, 0x81, 0x5c, 0x4a, 0xf7,
+ 0x8e, 0xdb, 0xb1, 0xd0, 0x54, 0xb7, 0xa8, 0x21, 0xa1, 0x56, 0x18, 0x39,
+ 0x80, 0x51, 0x32, 0xb0, 0x29, 0x2a, 0x19, 0xdc, 0xfa, 0x16, 0xde, 0xd9,
+ 0x6b, 0x9e, 0x9d, 0xc7, 0x21, 0x92, 0xa4, 0xee, 0x43, 0x3e, 0xb2, 0x52,
+ 0x64, 0x51, 0x62, 0x0c, 0xda, 0xda, 0x51, 0xd9, 0xbd, 0x3d, 0x3b, 0xc3,
+ 0xe1, 0x65, 0xb3, 0xb0, 0x0b, 0x5b, 0xc9, 0x1d, 0xdb, 0x31, 0x62, 0x10,
+ 0x6b, 0x18, 0x39, 0x50, 0x37, 0x54, 0x26, 0x6a, 0xa6, 0xf2, 0x6b, 0xd8,
+ 0x44, 0x5a, 0x24, 0xfa, 0x5c, 0xf2, 0x30, 0x9b, 0x48, 0x52, 0x0f, 0x65,
+ 0xe8, 0x4b, 0xce, 0xef, 0x74, 0x89, 0xf4, 0xa4, 0x79, 0x8e, 0x66, 0x3b,
+ 0x5b, 0xe5, 0xe5, 0x25, 0x0a, 0x97, 0x0d, 0x13, 0x36, 0x55, 0x6e, 0x14,
+ 0xfc, 0xd0, 0xd5, 0x07, 0x4c, 0x6f, 0x57, 0xfc, 0xc5, 0xdf, 0x74, 0xdf,
+ 0xe0, 0xd2, 0xd0, 0x95, 0x39, 0xdf, 0x21, 0x4d, 0x7a, 0xd8, 0xe1, 0xbc,
+ 0xba, 0x57, 0x17, 0xcd, 0x4a, 0x8e, 0x08, 0xf3, 0x59, 0xa9, 0x8b, 0x60,
+ 0x2d, 0xfe, 0x1a, 0xe0, 0x5b, 0x82, 0xf1, 0x1f, 0xcf, 0x1c, 0xa1, 0x40,
+ 0x05, 0xab, 0xb4, 0xd2, 0x01, 0x94, 0x07, 0xe4, 0x5a, 0x93, 0xd8, 0xb1,
+ 0x72, 0x05, 0x66, 0x2a, 0xe5, 0x6f, 0x81, 0x04, 0x2c, 0x9a, 0x64, 0x66,
+ 0x2e, 0x91, 0x19, 0x80, 0x40, 0xb2, 0x62, 0x52, 0xdd, 0x2f, 0xfc, 0x76,
+ 0x44, 0xd3, 0x07, 0xac, 0x9a, 0x07, 0xb8, 0xb2, 0x55, 0x43, 0xba, 0x63,
+ 0xe4, 0xff, 0x66, 0xa8, 0x93, 0xa6, 0x7a, 0xe9, 0xb1, 0xc1, 0x06, 0x63,
+ 0xa4, 0xf1, 0x0b, 0xcb, 0xc8, 0xb8, 0xd3, 0xcb, 0x8c, 0x8b, 0x28, 0x14,
+ 0x91, 0xe7, 0x32, 0x74, 0xaa, 0x13, 0x69, 0x6d, 0xdd, 0xd8, 0xa3, 0x4f,
+ 0xc3, 0xee, 0x80, 0xe9, 0x75, 0xb3, 0x1b, 0x1c, 0x80, 0xf1, 0xc9, 0x26,
+ 0x4a, 0x57, 0xa8, 0x98, 0xa7, 0xe5, 0xaa, 0x23, 0x21, 0xa6, 0x2d, 0x57,
+ 0x77, 0x99, 0x9d, 0xad, 0x7f, 0x58, 0xab, 0xb7, 0xd2, 0x20, 0x49, 0x0d,
+ 0x08, 0x22, 0x2c, 0xff, 0x18, 0xc9, 0x61, 0x6c, 0xee, 0x1a, 0xce, 0x1c,
+ 0x55, 0x5f, 0x9b, 0xb4, 0x88, 0xb7, 0x00, 0x19, 0xe6, 0xe9, 0x9b, 0xdd,
+ 0xa4, 0xaf, 0xb5, 0xce, 0x48, 0x7e, 0x0f, 0xb0, 0x93, 0x69, 0x86, 0xee,
+ 0x34, 0x8a, 0xb9, 0x4c, 0x95, 0xbe, 0xcc, 0x6d, 0xc8, 0x9c, 0x26, 0x8f,
+ 0xfd, 0xb3, 0x9d, 0xe7, 0xcf, 0x36, 0xa3, 0xd9, 0x08, 0xcc, 0x4c, 0x54,
+ 0x02, 0xdf, 0x34, 0x0b, 0x82, 0x71, 0x10, 0x36, 0xa2, 0x7f, 0xee, 0x8e,
+ 0x7c, 0x1a, 0x85, 0xdd, 0xda, 0xba, 0xd7, 0x74, 0x31, 0x25, 0x86, 0x20,
+ 0x32, 0x68, 0xff, 0x2a, 0x62, 0x14, 0x5e, 0x18, 0x59, 0x77, 0x22, 0xf7,
+ 0xc0, 0xc8, 0xa1, 0x99, 0x1c, 0xf4, 0xd6, 0x81, 0xd9, 0x3c, 0xdc, 0xd3,
+ 0x09, 0xec, 0xf1, 0xcc, 0xbc, 0x86, 0xe3, 0x3c, 0x53, 0xfc, 0x7d, 0xd4,
+ 0xfe, 0x97, 0x1f, 0xe0, 0x75, 0x03, 0xfc, 0xba, 0x5d, 0xde, 0xfb, 0xd4,
+ 0xbb, 0xbc, 0xf7, 0xc0, 0x2e, 0xef, 0x3d, 0x76, 0x97, 0x9f, 0x3f, 0x7d,
+ 0xf6, 0xf9, 0xaf, 0xdb, 0x65, 0x8f, 0xc8, 0xff, 0x3d, 0xbb, 0xec, 0xb1,
+ 0xd9, 0xaf, 0xdb, 0x65, 0x49, 0xa0, 0x09, 0x6a, 0x0f, 0xa5, 0xb2, 0x08,
+ 0xb9, 0xc3, 0x54, 0x3a, 0xc5, 0x39, 0xdf, 0x92, 0x6d, 0x13, 0x94, 0xe5,
+ 0x4a, 0x3f, 0x6d, 0xee, 0xe3, 0x6b, 0x54, 0xd3, 0x88, 0xe3, 0xc1, 0x41,
+ 0x50, 0x41, 0xe7, 0x5f, 0xcc, 0xa8, 0x1b, 0xec, 0xfa, 0x70, 0x5d, 0xc3,
+ 0xf9, 0x5a, 0x66, 0xef, 0xd5, 0x69, 0x71, 0xf6, 0xd2, 0x3f, 0x11, 0x7d,
+ 0xd3, 0x4f, 0x2e, 0x62, 0x8a, 0x79, 0xe9, 0x61, 0x6d, 0xa2, 0xdd, 0x9b,
+ 0x4b, 0x78, 0x18, 0xad, 0xcc, 0xe2, 0xa4, 0xc2, 0x5a, 0x33, 0x32, 0x19,
+ 0x00, 0x50, 0x3d, 0x57, 0x17, 0x46, 0x4f, 0x36, 0x57, 0x40, 0x41, 0xc9,
+ 0x4f, 0xf7, 0xb3, 0x4c, 0x2e, 0x76, 0x5a, 0x33, 0xe2, 0x14, 0xe4, 0xde,
+ 0xe8, 0xba, 0xc9, 0xa5, 0xfb, 0xa1, 0x64, 0x5a, 0xb9, 0xe4, 0xae, 0x91,
+ 0x84, 0x52, 0x8d, 0xd2, 0xda, 0x9a, 0x0e, 0x28, 0x67, 0x0e, 0x0a, 0xc7,
+ 0x62, 0xe6, 0x11, 0x50, 0xb8, 0x55, 0x79, 0x93, 0xdd, 0x3c, 0xc6, 0x9e,
+ 0x6e, 0x8b, 0xb1, 0xbc, 0xbe, 0xa0, 0xf1, 0xa6, 0xdd, 0x1a, 0x46, 0xe4,
+ 0xb4, 0xad, 0x20, 0x6d, 0x01, 0x08, 0x7c, 0x06, 0x54, 0xfd, 0x11, 0x00,
+ 0x56, 0x00, 0xae, 0x48, 0xd6, 0xa3, 0x1d, 0x43, 0xbd, 0xd7, 0xdb, 0xd9,
+ 0xd0, 0xf5, 0x03, 0x55, 0x49, 0x94, 0xd9, 0xdf, 0x78, 0x8d, 0xbe, 0xc5,
+ 0x22, 0x7e, 0x45, 0xd3, 0x9d, 0x2e, 0xe7, 0x0b, 0x85, 0xcc, 0xa5, 0x02,
+ 0xb2, 0x1c, 0xf9, 0x6e, 0x8a, 0x9b, 0xd3, 0x5f, 0xc9, 0xa7, 0xf5, 0x64,
+ 0x36, 0x15, 0x90, 0xfd, 0x78, 0xba, 0x5b, 0x02, 0x01, 0xa5, 0xb5, 0x8f,
+ 0xc7, 0x8d, 0xc3, 0xea, 0x0c, 0xd2, 0x31, 0xe8, 0x9c, 0xa1, 0xbb, 0xc6,
+ 0xc5, 0xf2, 0x4a, 0x91, 0x67, 0x6c, 0x25, 0x6c, 0x9b, 0x27, 0x51, 0xe2,
+ 0x46, 0x58, 0x74, 0x84, 0x2a, 0x07, 0xa4, 0xfb, 0xe2, 0x3e, 0x04, 0xe1,
+ 0x6a, 0xa8, 0x5f, 0xf5, 0x64, 0x55, 0x16, 0x5d, 0x77, 0xe9, 0x03, 0x2c,
+ 0xdc, 0xad, 0x1b, 0xbc, 0xdf, 0xdd, 0x4e, 0x9f, 0x2f, 0x9a, 0xc9, 0x62,
+ 0x78, 0x99, 0x12, 0x5e, 0x75, 0x80, 0x36, 0x22, 0x49, 0xb5, 0xc2, 0xf0,
+ 0xe7, 0x87, 0x67, 0xc9, 0xeb, 0x54, 0xba, 0x25, 0x26, 0x1b, 0x46, 0xdc,
+ 0x3e, 0x7f, 0xb2, 0xb3, 0xb7, 0xb9, 0xd2, 0x10, 0x69, 0x63, 0x30, 0xe2,
+ 0x5b, 0x45, 0x19, 0xcb, 0xff, 0x3f, 0x5f, 0x56, 0x24, 0x1e, 0x99, 0xd6,
+ 0xe6, 0x4b, 0x1f, 0xde, 0x9e, 0xbe, 0x3a, 0x3a, 0x39, 0xf8, 0x93, 0x85,
+ 0x12, 0x1a, 0xfb, 0xbd, 0x4f, 0x8c, 0xfd, 0x7e, 0xff, 0xa1, 0xce, 0xcc,
+ 0x9c, 0x9b, 0x78, 0xff, 0x13, 0xd7, 0xf8, 0x44, 0x01, 0x98, 0xb8, 0x18,
+ 0x63, 0x05, 0x8a, 0xa0, 0xf5, 0xd0, 0x6e, 0x8f, 0x76, 0x25, 0xc1, 0x5f,
+ 0x1a, 0xc3, 0x38, 0x7e, 0xf4, 0x8a, 0xa4, 0x53, 0xc1, 0x1a, 0x65, 0xd8,
+ 0x86, 0xb0, 0xe0, 0x8d, 0xd0, 0x9e, 0xf2, 0x49, 0x4e, 0xe6, 0x9a, 0x1c,
+ 0x61, 0x2a, 0xf2, 0xb8, 0xbc, 0x6c, 0x63, 0x15, 0x03, 0xd7, 0x01, 0xd5,
+ 0x1f, 0x2b, 0xbd, 0x89, 0x6d, 0x41, 0xdf, 0xe0, 0x66, 0xc8, 0x66, 0x45,
+ 0xd6, 0x0c, 0x65, 0x62, 0x2f, 0xcd, 0x7f, 0xbf, 0xb8, 0x49, 0x67, 0x01,
+ 0x5a, 0x08, 0xb5, 0x84, 0x56, 0x46, 0xb4, 0x29, 0xa5, 0xf4, 0xa6, 0xd7,
+ 0x30, 0x6e, 0x6c, 0x3b, 0xa7, 0xe9, 0x93, 0xe6, 0x5c, 0x04, 0x0d, 0xd2,
+ 0xce, 0xcf, 0xff, 0x74, 0x76, 0xf4, 0xc5, 0x4b, 0x92, 0x59, 0x5f, 0x52,
+ 0x29, 0x4f, 0xdd, 0x12, 0x61, 0x49, 0x73, 0xbf, 0x08, 0x7d, 0xf2, 0x3f,
+ 0xbe, 0x3a, 0x1e, 0x9f, 0x9d, 0x9c, 0x1e, 0x7e, 0xf1, 0xf2, 0x47, 0xb2,
+ 0x67, 0xcc, 0x4d, 0x71, 0xef, 0xbd, 0x6b, 0x7f, 0x66, 0xdb, 0x15, 0x85,
+ 0x28, 0x53, 0x47, 0x3f, 0x7c, 0x38, 0x7a, 0xfb, 0xfd, 0x17, 0x2f, 0x6f,
+ 0xd2, 0x6a, 0x40, 0xeb, 0xe3, 0xb7, 0x7b, 0xfa, 0xad, 0xb7, 0x58, 0x8d,
+ 0x34, 0xf1, 0x8b, 0xd9, 0xc7, 0x3a, 0xff, 0x5b, 0x96, 0x98, 0xd7, 0x67,
+ 0xcb, 0xb0, 0xb7, 0xc5, 0x39, 0x83, 0xf3, 0x18, 0x62, 0xd0, 0xdf, 0x92,
+ 0xaf, 0x4f, 0xbe, 0x23, 0xfc, 0x74, 0xeb, 0x29, 0x9e, 0x73, 0xdb, 0xc8,
+ 0xe4, 0xcb, 0xa7, 0x3b, 0xbb, 0x9b, 0xae, 0x59, 0x39, 0xfa, 0x2f, 0x98,
+ 0x19, 0x7f, 0x0c, 0x8a, 0xd0, 0xfe, 0x26, 0xe5, 0x74, 0xae, 0x3a, 0xa4,
+ 0x71, 0xe6, 0x13, 0xdb, 0x7d, 0xe2, 0x76, 0x43, 0x81, 0x03, 0x72, 0x82,
+ 0xa9, 0xd7, 0x7b, 0x85, 0xcc, 0xff, 0xc0, 0xe5, 0x78, 0xfe, 0xda, 0x03,
+ 0x3e, 0xfb, 0xda, 0xb1, 0x9e, 0x99, 0x8e, 0xb8, 0x2d, 0x57, 0x5e, 0x86,
+ 0x9f, 0x30, 0x98, 0xd5, 0xb5, 0xa9, 0x41, 0x6c, 0x73, 0x7b, 0x09, 0xff,
+ 0xc4, 0xe9, 0xec, 0x05, 0xfd, 0x51, 0x50, 0x57, 0x32, 0x60, 0x2f, 0x56,
+ 0xa9, 0x8c, 0xa7, 0x68, 0x33, 0x0f, 0x58, 0x5f, 0xf9, 0x9c, 0x60, 0x29,
+ 0xb2, 0xda, 0x3a, 0xb8, 0x3c, 0xf7, 0xd5, 0x2c, 0xbb, 0x4a, 0x27, 0xf7,
+ 0xb6, 0xed, 0x00, 0x36, 0x64, 0xda, 0x3d, 0x9d, 0xc0, 0xe7, 0x9a, 0x90,
+ 0xdd, 0x06, 0xe0, 0x84, 0x84, 0x81, 0x2e, 0x16, 0xb0, 0xe6, 0xac, 0xd7,
+ 0x8b, 0xa7, 0x66, 0x11, 0xc4, 0xb4, 0xc0, 0xab, 0x1f, 0x43, 0xc1, 0x76,
+ 0x9e, 0x6e, 0x73, 0x1f, 0xb1, 0x0d, 0x5c, 0x05, 0x2b, 0x69, 0xfa, 0xa4,
+ 0x1d, 0x32, 0xf8, 0x1b, 0x0e, 0x39, 0x41, 0x33, 0xc2, 0x2b, 0xfd, 0x92,
+ 0xfe, 0x1a, 0x6f, 0xce, 0x82, 0xee, 0xa2, 0xf0, 0xdb, 0xa0, 0xa9, 0x34,
+ 0xab, 0x67, 0x58, 0xb6, 0xad, 0xcf, 0x90, 0x1e, 0x72, 0xd4, 0xe3, 0xa3,
+ 0x71, 0xf1, 0x84, 0x38, 0xf0, 0xa9, 0xf5, 0xea, 0x53, 0xcf, 0x28, 0xd4,
+ 0x71, 0x10, 0x67, 0xf4, 0x8c, 0x67, 0xab, 0xfe, 0xe8, 0xf7, 0x11, 0xcf,
+ 0xae, 0x24, 0x63, 0x44, 0x3b, 0x60, 0xad, 0x6c, 0x76, 0x15, 0x62, 0x33,
+ 0x71, 0x85, 0x80, 0x3a, 0x09, 0x38, 0x43, 0x85, 0x22, 0x8a, 0xb6, 0xd7,
+ 0x80, 0x99, 0x66, 0xad, 0x2a, 0x28, 0x95, 0x94, 0xc2, 0x22, 0x77, 0x68,
+ 0xe4, 0x11, 0x98, 0x1a, 0xa9, 0x80, 0xd4, 0x8e, 0x12, 0x0d, 0x37, 0xc7,
+ 0x73, 0x08, 0x7e, 0x98, 0xd0, 0x06, 0x9a, 0x85, 0x49, 0xd3, 0x1a, 0xee,
+ 0x10, 0x94, 0x84, 0xd8, 0xcf, 0xa2, 0x2f, 0x8f, 0xfb, 0x3b, 0x74, 0xe1,
+ 0x4e, 0xaa, 0x7b, 0xba, 0x71, 0x05, 0xe6, 0x7c, 0xbc, 0x10, 0x82, 0xb0,
+ 0x1c, 0xb4, 0x9c, 0xa0, 0x35, 0x82, 0xd4, 0x8d, 0xa3, 0x91, 0xee, 0xc6,
+ 0xd0, 0x75, 0x38, 0xcd, 0x1b, 0xab, 0xa1, 0x45, 0x70, 0xd8, 0x6c, 0x37,
+ 0x0c, 0x8b, 0xe6, 0xc9, 0xbe, 0x5f, 0xe5, 0x0f, 0xe1, 0x08, 0xfa, 0xd8,
+ 0x16, 0x57, 0xd2, 0xaa, 0x08, 0x42, 0x68, 0x38, 0x50, 0xf5, 0x3a, 0x83,
+ 0x15, 0xd9, 0xad, 0x3f, 0x98, 0xb3, 0x31, 0xec, 0x80, 0x9f, 0xd2, 0xdd,
+ 0x6f, 0x0c, 0x24, 0x2a, 0xff, 0x4b, 0x5e, 0x7e, 0x7f, 0xf4, 0x6e, 0x7c,
+ 0x7c, 0xfa, 0xf6, 0xcb, 0xa8, 0xed, 0x2b, 0xbf, 0xb4, 0x9d, 0x6a, 0xb5,
+ 0x70, 0xd8, 0x75, 0x13, 0x25, 0x97, 0x97, 0x3a, 0x56, 0xb8, 0xad, 0x5d,
+ 0x5e, 0xd0, 0x23, 0x41, 0x93, 0xd2, 0x49, 0xb6, 0x68, 0xa0, 0x2f, 0xa9,
+ 0xd9, 0xac, 0x71, 0x34, 0x69, 0x0e, 0x06, 0x83, 0x6d, 0x7b, 0xa0, 0x7f,
+ 0xdb, 0xb1, 0x7f, 0xdb, 0x8d, 0x60, 0x7f, 0xf2, 0x6f, 0xf6, 0x62, 0x04,
+ 0xd2, 0x0e, 0xb7, 0xd6, 0x8d, 0x46, 0xdf, 0x99, 0x32, 0x29, 0xd8, 0xa6,
+ 0x36, 0x53, 0x1e, 0xc4, 0xd1, 0xe5, 0x63, 0x1a, 0xab, 0xde, 0x6c, 0xac,
+ 0x30, 0xd6, 0xc9, 0x7f, 0xbc, 0x3f, 0x3e, 0x1c, 0xb2, 0x1b, 0x1a, 0x02,
+ 0x66, 0xcb, 0xf0, 0xaf, 0x0d, 0x17, 0x05, 0x13, 0x8a, 0xa7, 0x50, 0x79,
+ 0x19, 0x0c, 0xcb, 0x05, 0xd7, 0xc0, 0x12, 0xf0, 0x16, 0xe3, 0xc6, 0xf8,
+ 0x14, 0x0d, 0xba, 0x0b, 0x8d, 0xb6, 0xdb, 0x2f, 0x9a, 0x87, 0x6f, 0x76,
+ 0xbc, 0xb2, 0x24, 0xfb, 0xdc, 0x4e, 0xec, 0xb9, 0x9d, 0xf0, 0xb9, 0xdd,
+ 0xd8, 0x73, 0xbb, 0xe1, 0x73, 0x7b, 0xb1, 0xe7, 0xbc, 0x0d, 0xf0, 0xdc,
+ 0x8e, 0x76, 0x2b, 0xad, 0x51, 0xee, 0xfe, 0xba, 0xdb, 0xb2, 0xcf, 0xf7,
+ 0x46, 0x3e, 0x2b, 0xfa, 0xc5, 0xa0, 0xe2, 0x62, 0xf0, 0x8a, 0xea, 0x7e,
+ 0x91, 0x5b, 0x41, 0x2f, 0x0e, 0x1d, 0xce, 0xe8, 0xad, 0x1d, 0xa7, 0xbf,
+ 0xf9, 0xe8, 0xce, 0xde, 0x70, 0x92, 0x2f, 0xae, 0xe9, 0x1a, 0x7c, 0x29,
+ 0x7f, 0x59, 0x12, 0xcc, 0x39, 0xf9, 0x87, 0x43, 0x65, 0xe8, 0x64, 0xec,
+ 0x03, 0xe9, 0x09, 0x76, 0x34, 0xde, 0x4a, 0xf0, 0x5a, 0xed, 0x60, 0xf4,
+ 0xba, 0x5e, 0xfe, 0x10, 0xc0, 0x92, 0x62, 0x98, 0xb6, 0x78, 0xcd, 0x2c,
+ 0x93, 0xf6, 0x1c, 0xe4, 0x38, 0xf7, 0xda, 0xf6, 0xea, 0xe4, 0x64, 0x78,
+ 0xee, 0x3a, 0xcd, 0x09, 0x10, 0x5d, 0x67, 0x32, 0xba, 0x2f, 0xc9, 0xf3,
+ 0x23, 0xc6, 0x5e, 0xa5, 0x46, 0xac, 0x85, 0x0e, 0xdc, 0x9a, 0xa9, 0xd5,
+ 0xfa, 0xd1, 0x22, 0x26, 0x72, 0x5f, 0xbf, 0x7f, 0x77, 0x12, 0xe8, 0xb7,
+ 0x09, 0x79, 0x82, 0xea, 0xfd, 0xad, 0x2d, 0xa2, 0xfc, 0xe8, 0x3a, 0xbd,
+ 0xbb, 0x1b, 0xd5, 0xd9, 0x96, 0x11, 0x6a, 0xf5, 0x16, 0x5c, 0xcc, 0xf2,
+ 0xed, 0xeb, 0x66, 0x3e, 0x7b, 0x40, 0x39, 0xa9, 0x2d, 0xe0, 0xf9, 0xec,
+ 0x5e, 0xcc, 0x4b, 0xa0, 0x69, 0xb8, 0xca, 0xfb, 0xdc, 0xdb, 0xd6, 0xb0,
+ 0x66, 0x4f, 0xba, 0xd1, 0x13, 0x8f, 0x1b, 0x2e, 0x37, 0xf7, 0x05, 0x6e,
+ 0x6d, 0x0b, 0x1e, 0x9e, 0x02, 0xa8, 0x9f, 0xf3, 0x4f, 0x1c, 0xb6, 0x1b,
+ 0xbd, 0x40, 0x25, 0xd2, 0x59, 0x10, 0x54, 0xb2, 0x20, 0x6e, 0x15, 0xda,
+ 0xb5, 0xc0, 0x3d, 0x11, 0xa3, 0x5a, 0xed, 0x87, 0x9f, 0x10, 0xb1, 0xe5,
+ 0x25, 0x47, 0x75, 0x9d, 0x4f, 0x2c, 0xb9, 0x29, 0x31, 0x92, 0x2c, 0x0a,
+ 0xa3, 0xf7, 0x98, 0x3f, 0xbf, 0x0c, 0x81, 0x04, 0xb0, 0x82, 0x6e, 0xfa,
+ 0x24, 0x99, 0x20, 0x54, 0x8d, 0xc7, 0xa4, 0xe7, 0xaf, 0x81, 0xf2, 0x9e,
+ 0x38, 0xef, 0x83, 0x7b, 0xc0, 0xb6, 0xad, 0x8d, 0xdf, 0x9d, 0xad, 0x0d,
+ 0x38, 0x6b, 0x96, 0xbe, 0x30, 0x34, 0xff, 0x4e, 0x60, 0xea, 0x52, 0xe3,
+ 0xb7, 0xa7, 0x4f, 0x36, 0x39, 0x5a, 0xcb, 0x73, 0xe4, 0x1a, 0xd8, 0x30,
+ 0x88, 0x87, 0x5f, 0xba, 0x14, 0xcf, 0xaa, 0xd5, 0xa2, 0xd1, 0x48, 0xe7,
+ 0xf6, 0x02, 0x39, 0xf7, 0x6a, 0xc0, 0xb9, 0x34, 0x2b, 0x74, 0x4b, 0x87,
+ 0x48, 0x6c, 0x78, 0x06, 0xf3, 0x1c, 0x75, 0xe2, 0x64, 0x65, 0xf5, 0x51,
+ 0xba, 0x54, 0x49, 0x5c, 0x05, 0x02, 0xa5, 0xbb, 0xd8, 0xb6, 0x80, 0x69,
+ 0xfb, 0x63, 0xbd, 0x35, 0x0b, 0xc1, 0x06, 0xe2, 0x37, 0x49, 0xac, 0x53,
+ 0xb4, 0x87, 0x57, 0x0d, 0xc1, 0xbe, 0x29, 0x96, 0xb4, 0x29, 0x18, 0x48,
+ 0xc7, 0x91, 0x61, 0x1e, 0xc0, 0x52, 0x7b, 0xd2, 0xd9, 0x7d, 0x25, 0x5e,
+ 0x64, 0xdb, 0x13, 0x4b, 0x58, 0x6c, 0x12, 0x0c, 0x2b, 0x05, 0x8a, 0x8e,
+ 0xb0, 0x84, 0x80, 0xb9, 0xf6, 0xd6, 0xf4, 0x29, 0x5e, 0x90, 0xb7, 0x23,
+ 0x23, 0x0d, 0x81, 0x8a, 0xed, 0xe0, 0xf6, 0xda, 0xeb, 0xd4, 0x14, 0xb7,
+ 0x4f, 0x54, 0x39, 0x75, 0x49, 0x44, 0x2a, 0xf6, 0x1e, 0x5c, 0xbf, 0xbf,
+ 0x7c, 0x7c, 0x2c, 0x9a, 0x25, 0x4f, 0x14, 0xd0, 0x2c, 0xe2, 0x47, 0xad,
+ 0xdf, 0xa1, 0xf6, 0xf6, 0x52, 0x40, 0x9b, 0x46, 0xb5, 0x69, 0xe0, 0x88,
+ 0xe0, 0x51, 0xc1, 0x31, 0x35, 0x51, 0x22, 0xe0, 0xd4, 0x4f, 0x41, 0x97,
+ 0x16, 0x61, 0xe8, 0xd2, 0x8d, 0x5e, 0x5b, 0x12, 0xc0, 0xf0, 0xe3, 0x17,
+ 0x9e, 0x92, 0x01, 0xa5, 0x42, 0xc5, 0x68, 0x3b, 0xa5, 0xbc, 0xb7, 0x72,
+ 0x46, 0x42, 0x19, 0x34, 0x8a, 0xf6, 0xef, 0x8a, 0xe0, 0x60, 0x91, 0x0b,
+ 0x58, 0xbf, 0x22, 0x10, 0xd7, 0x0c, 0xff, 0xd1, 0x74, 0x02, 0xd8, 0xaa,
+ 0x1b, 0x4b, 0xd9, 0xfd, 0x2c, 0x4c, 0xab, 0xf9, 0x40, 0x27, 0xf7, 0x83,
+ 0x10, 0x66, 0x9b, 0x0b, 0xff, 0x01, 0x17, 0x9d, 0x53, 0xd3, 0xa1, 0x14,
+ 0xfa, 0x19, 0x45, 0x3e, 0x6a, 0xb4, 0x4b, 0x73, 0x00, 0x00, 0x72, 0xc5,
+ 0x75, 0xef, 0x10, 0x1a, 0xc7, 0x1c, 0xf2, 0x2a, 0x25, 0x08, 0x2d, 0xf6,
+ 0x2e, 0xab, 0x16, 0xd2, 0x81, 0x14, 0x45, 0xbb, 0x2c, 0xab, 0xf7, 0x0a,
+ 0xd9, 0x02, 0xf3, 0xe6, 0xa1, 0xa2, 0xf9, 0x50, 0xf9, 0x20, 0xb5, 0xe8,
+ 0xd7, 0x6d, 0xd6, 0xce, 0xff, 0x59, 0x9b, 0xb5, 0xf3, 0x7f, 0xc7, 0x66,
+ 0xed, 0xfe, 0xba, 0xcd, 0xda, 0xfd, 0x3f, 0x6b, 0xb3, 0x76, 0xff, 0xef,
+ 0xd8, 0xac, 0xbd, 0x5f, 0xb7, 0x59, 0x7b, 0x9f, 0x60, 0xb3, 0xfe, 0x77,
+ 0x33, 0x48, 0xdf, 0xd2, 0x84, 0x71, 0x67, 0xa9, 0x92, 0xab, 0xe9, 0xed,
+ 0x56, 0x07, 0x34, 0x7a, 0x2e, 0x39, 0x9e, 0xe8, 0xf7, 0xa2, 0x32, 0xd7,
+ 0xbf, 0x00, 0x2b, 0xd0, 0x19, 0x7b, 0x51, 0x8f, 0x42, 0xa4, 0x37, 0x09,
+ 0xa5, 0x9a, 0x90, 0xd2, 0xdb, 0xde, 0x8c, 0x3b, 0xd9, 0x03, 0x35, 0x93,
+ 0xfa, 0xbb, 0x60, 0xa0, 0xd5, 0x29, 0xef, 0x04, 0xc6, 0xb0, 0x4e, 0x61,
+ 0x24, 0x91, 0x30, 0xda, 0x55, 0x78, 0xdf, 0x75, 0xa3, 0x8f, 0xf9, 0x15,
+ 0xc1, 0x25, 0xf6, 0x63, 0x6b, 0x68, 0x60, 0xbc, 0x1d, 0x17, 0xf7, 0xc2,
+ 0xd0, 0x2e, 0x30, 0xee, 0xac, 0xd6, 0xfe, 0xd0, 0xb8, 0xd5, 0x31, 0x1f,
+ 0x0a, 0x8e, 0x6b, 0x13, 0x86, 0xfe, 0xd0, 0x78, 0x3c, 0xf4, 0xdd, 0x31,
+ 0xb4, 0xfd, 0x33, 0x52, 0x0d, 0xb5, 0x87, 0x68, 0xbc, 0x51, 0x89, 0x73,
+ 0x96, 0x52, 0x7d, 0x17, 0x90, 0x8c, 0xa7, 0x8c, 0x22, 0x46, 0xa9, 0x42,
+ 0x47, 0xf2, 0xae, 0x8b, 0x4e, 0x32, 0xf3, 0x85, 0x10, 0x5d, 0xa5, 0x32,
+ 0xbf, 0xc5, 0xa4, 0x52, 0xc8, 0x13, 0x5e, 0x65, 0xcd, 0x59, 0x8f, 0xcb,
+ 0x42, 0x3f, 0xe3, 0xb0, 0x40, 0x80, 0x8f, 0x17, 0xe4, 0x4f, 0x28, 0x40,
+ 0x6e, 0xfe, 0x90, 0xca, 0xfc, 0xac, 0xbd, 0xde, 0x74, 0x92, 0x0d, 0xd3,
+ 0x7a, 0x92, 0xe7, 0xf1, 0x1e, 0xe6, 0x1a, 0xc8, 0x4e, 0x93, 0xcb, 0x25,
+ 0xa2, 0x12, 0xe6, 0xf9, 0x84, 0x82, 0x86, 0xb4, 0x02, 0x6e, 0xd8, 0x2a,
+ 0x80, 0x62, 0x34, 0x5d, 0x73, 0x62, 0xaf, 0x4a, 0x0d, 0x50, 0x0c, 0x22,
+ 0xce, 0x4e, 0x3a, 0x97, 0xd8, 0x62, 0xb3, 0x3b, 0x00, 0xcb, 0x05, 0xb6,
+ 0x91, 0xd7, 0xff, 0x74, 0xa0, 0xb1, 0x26, 0x76, 0x20, 0xb6, 0x20, 0x5a,
+ 0xdf, 0x07, 0xf6, 0xee, 0xda, 0x70, 0x8d, 0x5c, 0xb5, 0xb6, 0x6d, 0x24,
+ 0xa1, 0xd8, 0xa6, 0x52, 0xd0, 0x22, 0xaf, 0x2a, 0x2c, 0x56, 0x4f, 0x1e,
+ 0x81, 0x86, 0x66, 0x0c, 0x0b, 0xdd, 0x6b, 0x2b, 0x06, 0x74, 0xc6, 0xd2,
+ 0x08, 0x2b, 0xc9, 0x7c, 0x73, 0x06, 0x05, 0x86, 0x96, 0x4b, 0x65, 0xb2,
+ 0x3b, 0xae, 0x0e, 0x0e, 0x2d, 0x38, 0xb1, 0x19, 0xaf, 0xd1, 0xa8, 0x94,
+ 0x9e, 0x3d, 0x18, 0x1f, 0x1e, 0x1f, 0xb7, 0x6a, 0x89, 0x89, 0x78, 0x8c,
+ 0xe6, 0x0e, 0x0c, 0x98, 0x9a, 0x50, 0xed, 0xb3, 0x2a, 0x0e, 0xf0, 0xca,
+ 0x4d, 0x91, 0xcd, 0xf1, 0x43, 0x34, 0xc9, 0x48, 0x82, 0x5c, 0x5b, 0x56,
+ 0xa7, 0x9c, 0xa3, 0xb6, 0x2c, 0xcc, 0x34, 0x73, 0x02, 0xe7, 0xbb, 0x5e,
+ 0xce, 0xd3, 0xe2, 0xd3, 0x83, 0x0b, 0x76, 0xcf, 0x9d, 0x3d, 0x67, 0x60,
+ 0x0c, 0x9c, 0x2b, 0x3f, 0x58, 0x1d, 0xf2, 0x5a, 0xa4, 0x03, 0xd5, 0x59,
+ 0x25, 0xfd, 0x89, 0x19, 0x6f, 0x4f, 0x5a, 0x48, 0x99, 0x65, 0x02, 0x07,
+ 0x95, 0x47, 0x36, 0x6b, 0xd5, 0xf8, 0x37, 0x77, 0x67, 0x11, 0x41, 0x42,
+ 0x67, 0xa6, 0xeb, 0x57, 0xe4, 0xd0, 0xe0, 0x4a, 0xc1, 0xbc, 0xd3, 0xbd,
+ 0x1b, 0xf1, 0x91, 0x7f, 0xe6, 0x09, 0xf0, 0x0f, 0xc0, 0x83, 0xfc, 0x2f,
+ 0x07, 0xa0, 0xe7, 0x04, 0x00, 0xce, 0xd3, 0x75, 0x5b, 0x7d, 0xf8, 0x10,
+ 0x40, 0xf9, 0x58, 0xfb, 0xfd, 0x5a, 0xbc, 0x47, 0xd9, 0x23, 0x4e, 0x92,
+ 0xd9, 0xf7, 0xff, 0x2e, 0x4e, 0x0b, 0xd3, 0x73, 0x7c, 0x21, 0xe6, 0xef,
+ 0xe9, 0xb2, 0xc8, 0xef, 0x50, 0xa6, 0x63, 0x94, 0xa9, 0x97, 0xd4, 0x9f,
+ 0xab, 0xa7, 0xf7, 0xd4, 0x21, 0xab, 0x1f, 0x89, 0x16, 0x1d, 0x61, 0x15,
+ 0xef, 0xcd, 0xcb, 0x46, 0x13, 0x99, 0x53, 0x82, 0x12, 0x8f, 0x31, 0xf0,
+ 0x9b, 0x80, 0x40, 0xac, 0x47, 0x12, 0x9c, 0x8a, 0xac, 0x21, 0x53, 0x75,
+ 0x65, 0xb4, 0xae, 0x1d, 0x01, 0x3d, 0x07, 0x52, 0xdc, 0x82, 0x2a, 0x41,
+ 0x86, 0x88, 0xbf, 0x45, 0x99, 0x90, 0xfd, 0x84, 0xae, 0xf4, 0xa2, 0x5b,
+ 0xdc, 0xe7, 0x75, 0x9c, 0x14, 0xfe, 0x91, 0x5b, 0x1f, 0xfd, 0xc7, 0x62,
+ 0xb9, 0x58, 0xb6, 0x51, 0x9e, 0x6b, 0x33, 0x99, 0x77, 0xa3, 0x2d, 0x68,
+ 0x64, 0xe8, 0x42, 0xd2, 0xd2, 0x02, 0x3a, 0xbc, 0xbb, 0x3b, 0xfd, 0x2e,
+ 0x47, 0xc9, 0xdb, 0xd3, 0xf3, 0x23, 0x3e, 0xa0, 0xad, 0x76, 0x9c, 0x00,
+ 0xb2, 0xcc, 0x01, 0xa4, 0xbe, 0xa5, 0x19, 0x1b, 0xb3, 0xb0, 0xa0, 0xc2,
+ 0xf5, 0x78, 0x64, 0x51, 0x47, 0xd5, 0x7b, 0x88, 0xda, 0xd2, 0xbf, 0x01,
+ 0x99, 0xa5, 0xe9, 0x75, 0xed, 0x45, 0x48, 0xdf, 0xd6, 0xae, 0xfa, 0xe2,
+ 0xc5, 0xd4, 0xaf, 0xf3, 0xe2, 0xa3, 0x9d, 0x57, 0xc5, 0x8c, 0xe8, 0xbe,
+ 0xa6, 0x89, 0x69, 0x9d, 0xc6, 0x75, 0x41, 0xb2, 0xba, 0xed, 0x11, 0x29,
+ 0x6a, 0x14, 0x83, 0x13, 0x53, 0xfd, 0x24, 0x75, 0xca, 0xa2, 0x44, 0xc3,
+ 0x54, 0x01, 0x8a, 0x79, 0x63, 0x13, 0x8a, 0x0f, 0x6b, 0xa1, 0x76, 0x00,
+ 0xbe, 0x9c, 0xcf, 0x46, 0x7e, 0x29, 0x8c, 0x78, 0x7d, 0xb5, 0x02, 0x6f,
+ 0xc3, 0x68, 0xe7, 0xac, 0xb4, 0xf1, 0xe1, 0xa1, 0x2e, 0x57, 0xda, 0x89,
+ 0xa4, 0xbf, 0x4b, 0x45, 0x14, 0xc8, 0xab, 0x9d, 0x81, 0x47, 0x92, 0x63,
+ 0x23, 0x55, 0x00, 0x5c, 0x8a, 0xff, 0x6d, 0xaa, 0xda, 0x69, 0x4e, 0x78,
+ 0x5e, 0xf8, 0xec, 0x1e, 0x44, 0xec, 0xa4, 0xd3, 0xa5, 0x88, 0xa5, 0xe4,
+ 0x40, 0x9a, 0xa8, 0x64, 0xe4, 0x3b, 0xed, 0x7e, 0x67, 0xe4, 0x7f, 0x87,
+ 0x2b, 0xa0, 0x36, 0x03, 0x60, 0x3f, 0x80, 0x0b, 0x3a, 0xce, 0xf3, 0xbe,
+ 0x4d, 0xf3, 0xa4, 0xb4, 0x37, 0x46, 0x29, 0xc0, 0xcc, 0x00, 0x3f, 0x46,
+ 0x89, 0xe1, 0x48, 0xa6, 0x08, 0x4f, 0x22, 0x90, 0x27, 0x38, 0x7f, 0x1c,
+ 0xbd, 0xee, 0x70, 0x5f, 0x72, 0xc3, 0x3c, 0x4e, 0x18, 0x17, 0x89, 0xc6,
+ 0x48, 0xc3, 0xb2, 0x5a, 0x0a, 0x50, 0xd3, 0x33, 0x61, 0x36, 0x29, 0x37,
+ 0xf2, 0x8d, 0x76, 0x6d, 0xf4, 0xeb, 0x40, 0x49, 0xa2, 0x85, 0xc7, 0xd9,
+ 0xf6, 0xc4, 0xa5, 0x26, 0x7b, 0x65, 0x61, 0x4d, 0x9e, 0x78, 0xe3, 0x31,
+ 0x69, 0x2e, 0x93, 0x1c, 0xd1, 0x1b, 0xe1, 0x60, 0x7f, 0x90, 0x56, 0x7d,
+ 0xb9, 0xdf, 0xf6, 0xfa, 0x16, 0x87, 0xa1, 0xcb, 0x57, 0xc2, 0x79, 0xd2,
+ 0xc3, 0x08, 0xa0, 0x0d, 0x23, 0x69, 0x1b, 0x40, 0x4a, 0xbb, 0xaa, 0x99,
+ 0xc9, 0xda, 0xd5, 0xac, 0xbc, 0xb8, 0x30, 0x0b, 0x5f, 0xf3, 0x94, 0x52,
+ 0xf3, 0xe5, 0xc0, 0x35, 0xed, 0xcf, 0x23, 0x49, 0xab, 0x2b, 0xd8, 0xce,
+ 0x03, 0x4e, 0xac, 0x13, 0x6c, 0x5e, 0xba, 0x90, 0x35, 0x66, 0x20, 0xdf,
+ 0xd7, 0xd6, 0x1f, 0x91, 0x7b, 0x86, 0x3b, 0x6b, 0x28, 0x63, 0xd0, 0xc2,
+ 0x5a, 0x51, 0x04, 0x14, 0xa9, 0xd2, 0x4f, 0x75, 0x82, 0x9c, 0x2d, 0xd9,
+ 0x9b, 0xef, 0xdb, 0xea, 0xb9, 0x38, 0xd0, 0x96, 0xbb, 0x79, 0x1d, 0x86,
+ 0x6b, 0x40, 0x85, 0xf6, 0x82, 0xd6, 0xfe, 0x93, 0xfe, 0xb3, 0x33, 0xa0,
+ 0x3f, 0x77, 0xff, 0xbe, 0x86, 0x88, 0xce, 0xfe, 0xd6, 0xd6, 0xed, 0xed,
+ 0xed, 0x48, 0x81, 0x26, 0xcd, 0x96, 0x7d, 0x16, 0x96, 0x73, 0x12, 0xe2,
+ 0x5e, 0xcf, 0x07, 0xce, 0x93, 0xb5, 0x7c, 0x7e, 0xf5, 0xe7, 0x9d, 0xe1,
+ 0xce, 0xf6, 0xf6, 0xf6, 0xcf, 0xa3, 0x05, 0x91, 0xf8, 0x12, 0xc3, 0x9a,
+ 0x3f, 0xfd, 0x61, 0xb7, 0x78, 0x26, 0x5b, 0x71, 0x54, 0x60, 0xfe, 0xa5,
+ 0x22, 0x58, 0x18, 0xca, 0xa2, 0x3f, 0x15, 0x33, 0xf2, 0xbe, 0x27, 0x64,
+ 0x38, 0x3a, 0x9e, 0x7a, 0xa8, 0x58, 0x21, 0x9a, 0xc4, 0x05, 0xe7, 0x3a,
+ 0x3f, 0xdd, 0xdb, 0xdd, 0x4d, 0x58, 0xe5, 0xe0, 0x9a, 0x43, 0x4e, 0xd0,
+ 0x20, 0xb8, 0x89, 0x2c, 0x45, 0x3d, 0x00, 0xdf, 0x65, 0x04, 0xc9, 0x99,
+ 0x72, 0xec, 0xc7, 0xf0, 0x46, 0x5f, 0x4e, 0x2a, 0xf8, 0x96, 0xa0, 0x39,
+ 0x8d, 0xf4, 0x29, 0xa7, 0xf7, 0x6e, 0x60, 0xc3, 0xe5, 0x15, 0xc9, 0x56,
+ 0x6e, 0x7b, 0xdd, 0x08, 0x84, 0x10, 0xfa, 0x4f, 0x84, 0x5a, 0x9b, 0xed,
+ 0xf1, 0x8a, 0x4b, 0x0e, 0x48, 0xca, 0x05, 0xd1, 0x17, 0x9d, 0x57, 0x81,
+ 0xf0, 0xb8, 0xac, 0xa4, 0x9d, 0x1f, 0x92, 0x37, 0x6e, 0xd3, 0xfb, 0xd6,
+ 0x65, 0x6f, 0x28, 0xfe, 0xd2, 0xfc, 0x11, 0xf8, 0xbd, 0x6d, 0x55, 0x34,
+ 0xb1, 0x12, 0x56, 0xd8, 0x4c, 0xae, 0x83, 0x26, 0x2a, 0x10, 0xdf, 0xa4,
+ 0xba, 0x5f, 0x9b, 0xd5, 0xdc, 0x4b, 0x3f, 0xce, 0xde, 0x56, 0xc7, 0xae,
+ 0xd8, 0xda, 0x0c, 0x4a, 0xed, 0xad, 0x50, 0x5b, 0x31, 0x29, 0x8b, 0xcb,
+ 0x9c, 0x5b, 0xac, 0xf5, 0xfa, 0x3a, 0x6c, 0xbb, 0x6d, 0xfa, 0xa8, 0xd4,
+ 0xed, 0xd0, 0x19, 0x98, 0x5c, 0x67, 0x73, 0x91, 0x97, 0x1b, 0x9a, 0xf5,
+ 0xb9, 0x26, 0x4c, 0xb8, 0x16, 0x5e, 0x69, 0x6b, 0x97, 0xf2, 0x1b, 0xb3,
+ 0x98, 0x4d, 0x29, 0xa6, 0xb6, 0xb7, 0x9c, 0x74, 0xfd, 0xbb, 0x5a, 0x92,
+ 0xd5, 0x78, 0x91, 0xca, 0x75, 0xa2, 0x35, 0xfe, 0x88, 0x43, 0xc5, 0xb0,
+ 0x19, 0x8c, 0x4c, 0xcc, 0x2a, 0xdc, 0x62, 0xe6, 0x84, 0x5d, 0x0c, 0x45,
+ 0xf7, 0x91, 0x4b, 0x15, 0x49, 0x33, 0xe6, 0xc4, 0xbe, 0x3a, 0x3e, 0x34,
+ 0x42, 0xe9, 0xf5, 0xf9, 0xd9, 0x00, 0xf5, 0x3e, 0x03, 0x94, 0x33, 0x87,
+ 0x1d, 0x19, 0xcf, 0xe0, 0x2e, 0x02, 0xa3, 0x4a, 0xbf, 0xfa, 0xd4, 0xa5,
+ 0x0d, 0xba, 0x0a, 0x55, 0xad, 0x66, 0xf5, 0x7a, 0x69, 0x46, 0x92, 0x9f,
+ 0x5b, 0x5a, 0xa2, 0x4d, 0xb6, 0x7c, 0xf2, 0x74, 0xb4, 0xcd, 0x6b, 0x44,
+ 0xf3, 0x67, 0x4e, 0x0a, 0x92, 0xf2, 0x3b, 0xf8, 0x69, 0x34, 0x60, 0x99,
+ 0xc6, 0xd3, 0x0e, 0xec, 0x74, 0x06, 0x09, 0x43, 0xe4, 0x33, 0x3e, 0x86,
+ 0xfe, 0xd6, 0xcb, 0x00, 0x5d, 0xa9, 0x99, 0xfa, 0xb0, 0xb8, 0xc4, 0x96,
+ 0x1d, 0x6c, 0x73, 0x8a, 0xb4, 0x95, 0x89, 0x16, 0xcf, 0x0a, 0x78, 0x4e,
+ 0xac, 0x06, 0x12, 0x3c, 0x81, 0x5a, 0x05, 0x4e, 0x7d, 0x1f, 0xb8, 0x26,
+ 0x8b, 0x25, 0xdd, 0x02, 0x72, 0x63, 0x49, 0x01, 0x55, 0xab, 0x27, 0x79,
+ 0x4c, 0x3f, 0xe9, 0xeb, 0x5d, 0x69, 0x5b, 0xcb, 0x9c, 0x16, 0xd4, 0x87,
+ 0x9e, 0xfa, 0xce, 0x0f, 0xb8, 0x67, 0x0a, 0xda, 0xd3, 0x82, 0x79, 0x09,
+ 0x93, 0x40, 0xf0, 0x78, 0x51, 0xda, 0x41, 0xc8, 0xe7, 0x17, 0xec, 0xa6,
+ 0x8b, 0x55, 0x6a, 0xb1, 0xfb, 0x54, 0x14, 0x5f, 0xf7, 0x9e, 0x9c, 0x78,
+ 0xd1, 0x7c, 0x48, 0x7a, 0xdf, 0x9b, 0x2b, 0x7d, 0x3e, 0x4a, 0xbe, 0xce,
+ 0xa8, 0xa1, 0xfd, 0xbf, 0xb8, 0xb3, 0xfb, 0xb5, 0x60, 0x25, 0xb3, 0x06,
+ 0x1f, 0xab, 0x34, 0x04, 0x97, 0x6d, 0x6a, 0x52, 0x31, 0x9b, 0xd4, 0xaa,
+ 0x0b, 0xa3, 0xa7, 0x0c, 0x73, 0x24, 0x08, 0x39, 0x41, 0x3f, 0x5f, 0x0e,
+ 0xb7, 0x65, 0xc1, 0x84, 0x01, 0xa7, 0xe3, 0x15, 0x93, 0x8a, 0x58, 0xc0,
+ 0xcd, 0x05, 0x13, 0x54, 0xdc, 0x66, 0x6b, 0x7f, 0xa4, 0x60, 0xd6, 0x17,
+ 0x07, 0x36, 0x54, 0x1a, 0x47, 0xce, 0x82, 0xa2, 0x57, 0xb3, 0xdc, 0x6d,
+ 0xdb, 0x58, 0x22, 0x6d, 0xe9, 0x46, 0xca, 0xee, 0x18, 0x37, 0x16, 0x3c,
+ 0x75, 0x9b, 0x17, 0x7b, 0xbb, 0x42, 0x0b, 0x6f, 0x7b, 0x86, 0x07, 0x0a,
+ 0x18, 0x3d, 0x4c, 0xaf, 0x68, 0xa0, 0x68, 0x10, 0xaf, 0xd5, 0x2c, 0x97,
+ 0xe9, 0xfb, 0x9e, 0x5e, 0x39, 0xc0, 0x2b, 0xd2, 0x5e, 0x53, 0xb3, 0x23,
+ 0x7d, 0xd0, 0x04, 0xf5, 0xc0, 0x76, 0xf8, 0xb8, 0x54, 0xf1, 0x7a, 0x31,
+ 0x4b, 0x8b, 0x8f, 0x36, 0x61, 0x9d, 0x07, 0x1a, 0x50, 0x83, 0x76, 0xae,
+ 0x5b, 0x76, 0x3f, 0x14, 0xf2, 0xf0, 0x9d, 0x1d, 0xf4, 0x6f, 0x82, 0x9b,
+ 0x71, 0x9e, 0x56, 0x28, 0x69, 0x05, 0xd9, 0x24, 0xa9, 0xde, 0xdf, 0x14,
+ 0x5b, 0x8d, 0x0e, 0x46, 0xfe, 0x56, 0x3b, 0x88, 0x06, 0x6d, 0x28, 0x94,
+ 0xd5, 0x39, 0xfb, 0xdc, 0xa6, 0xe7, 0xf7, 0x30, 0xb6, 0x64, 0x38, 0x90,
+ 0x7c, 0x45, 0x8e, 0xef, 0x7c, 0xd1, 0xdc, 0x5b, 0x2d, 0x05, 0x0e, 0x9d,
+ 0x2e, 0x85, 0x37, 0xd6, 0xd6, 0x36, 0x19, 0x4f, 0x28, 0xa2, 0x46, 0x73,
+ 0xd1, 0x9c, 0x48, 0x46, 0x5d, 0x04, 0xe1, 0xb5, 0x67, 0xa4, 0xe3, 0x72,
+ 0x46, 0x9f, 0xd7, 0xc5, 0xc2, 0x66, 0x58, 0x2c, 0xb8, 0xb5, 0x7a, 0x57,
+ 0xe6, 0x80, 0xbe, 0x89, 0xa6, 0xd9, 0x5b, 0x00, 0x91, 0x0c, 0x19, 0xdc,
+ 0xbe, 0x16, 0x54, 0x2f, 0xc8, 0xbb, 0xb0, 0xb1, 0x96, 0xac, 0x6d, 0x7e,
+ 0xc2, 0x3c, 0x09, 0x8b, 0x4e, 0x6e, 0xae, 0x4c, 0xf3, 0xe7, 0xbe, 0x46,
+ 0x67, 0xfb, 0x2e, 0x4f, 0x7b, 0x75, 0x73, 0x7f, 0x76, 0x6a, 0x92, 0xa7,
+ 0xf1, 0x5c, 0xb1, 0x18, 0x2e, 0x5d, 0xa3, 0x2a, 0x17, 0x47, 0x8e, 0x65,
+ 0x4b, 0x8c, 0x92, 0x53, 0x67, 0xcb, 0x17, 0x03, 0x00, 0x55, 0x37, 0xd5,
+ 0x44, 0xb1, 0x7b, 0xe9, 0xef, 0x92, 0x0b, 0x9c, 0xce, 0xa2, 0xb7, 0x28,
+ 0x32, 0xe7, 0xeb, 0x1c, 0xd0, 0xf9, 0xf6, 0x1a, 0xf6, 0xa0, 0xc5, 0xb9,
+ 0x2b, 0xbb, 0xbb, 0x0d, 0x0d, 0xf7, 0x50, 0xfb, 0x72, 0x80, 0xc1, 0x05,
+ 0xa9, 0xfe, 0xbc, 0x88, 0x68, 0x33, 0xbf, 0xf8, 0x7a, 0x6b, 0xc9, 0xca,
+ 0x98, 0x99, 0x7d, 0xa3, 0x5e, 0xef, 0x56, 0xa1, 0x67, 0xd8, 0x13, 0xc2,
+ 0x53, 0x2a, 0x8b, 0x41, 0x80, 0x98, 0x86, 0x3c, 0x08, 0xf6, 0xf7, 0x21,
+ 0xcd, 0x74, 0xee, 0xf7, 0xdd, 0x62, 0xcb, 0x18, 0x6f, 0xea, 0x09, 0x74,
+ 0x1f, 0xa7, 0x93, 0xd2, 0x5f, 0x33, 0x2f, 0x6d, 0x28, 0x75, 0x33, 0x0c,
+ 0x53, 0x0d, 0xb8, 0x12, 0x34, 0x58, 0x92, 0x91, 0xf7, 0x22, 0x74, 0x04,
+ 0xc0, 0x2d, 0xe7, 0xa0, 0x7a, 0xed, 0xd3, 0xea, 0x9a, 0x1a, 0x44, 0x7a,
+ 0xce, 0x27, 0x41, 0xc1, 0x33, 0xa7, 0x28, 0x30, 0x56, 0xd0, 0x22, 0x84,
+ 0x51, 0xe7, 0x0d, 0x85, 0x81, 0xdd, 0x4e, 0xb9, 0x59, 0x94, 0x80, 0xeb,
+ 0xf2, 0xdd, 0x49, 0x9d, 0xcb, 0x0a, 0x76, 0xaa, 0x94, 0x0a, 0x67, 0x98,
+ 0x4c, 0x42, 0x34, 0xd2, 0x29, 0x23, 0x58, 0xd7, 0x3c, 0xa2, 0x10, 0xe7,
+ 0x9e, 0x52, 0x6b, 0xf9, 0xea, 0xa0, 0xcc, 0x61, 0x23, 0xb3, 0x19, 0x6a,
+ 0x9e, 0x88, 0x53, 0x3b, 0xca, 0x47, 0x1a, 0x58, 0xf2, 0x4a, 0x13, 0x6d,
+ 0x73, 0x73, 0xef, 0x23, 0x6b, 0x9b, 0xd3, 0x70, 0x93, 0x33, 0xed, 0x19,
+ 0x20, 0xf0, 0xa2, 0xca, 0xb3, 0x4b, 0x23, 0xa0, 0xb1, 0x24, 0x4e, 0x4a,
+ 0x0e, 0x5c, 0x76, 0x19, 0x81, 0xd1, 0x53, 0xb9, 0x83, 0xd9, 0x47, 0x2a,
+ 0xc9, 0xcf, 0xe1, 0xb6, 0x63, 0xb1, 0x6f, 0xe1, 0x1a, 0xb9, 0x09, 0x04,
+ 0x95, 0xda, 0x62, 0x15, 0xa9, 0x16, 0xc4, 0x45, 0x13, 0x7e, 0x49, 0xbc,
+ 0xa9, 0xbb, 0x99, 0x18, 0xac, 0xa0, 0x53, 0x6c, 0x3b, 0x46, 0xe3, 0x8b,
+ 0x7c, 0x73, 0x88, 0x6a, 0xe9, 0xb5, 0x1e, 0x8d, 0x5b, 0x09, 0xdc, 0x28,
+ 0xe3, 0xbb, 0xac, 0x32, 0xea, 0x47, 0x69, 0xd6, 0xfd, 0xfd, 0x53, 0x4d,
+ 0xed, 0x95, 0x7b, 0x5e, 0x54, 0x41, 0x39, 0xa5, 0xe8, 0xc1, 0x8c, 0xa9,
+ 0x07, 0xb1, 0x23, 0xae, 0xfe, 0x21, 0xda, 0xea, 0x9b, 0xa2, 0x0b, 0xb2,
+ 0x7f, 0xa4, 0xc3, 0xa1, 0x03, 0x18, 0xe3, 0x86, 0xfb, 0x28, 0xa5, 0xa9,
+ 0xaf, 0xd3, 0x29, 0x7f, 0x13, 0x16, 0xb9, 0xd1, 0x6e, 0x89, 0x5b, 0xc8,
+ 0x97, 0x6a, 0xce, 0x6d, 0x79, 0xd1, 0x40, 0xcb, 0x4c, 0xdd, 0xcc, 0xcf,
+ 0x73, 0xf2, 0xb6, 0xa9, 0x44, 0x8d, 0x16, 0x85, 0x89, 0x4e, 0xe9, 0x40,
+ 0xfb, 0x3b, 0xb9, 0x2b, 0xa4, 0xc4, 0xd7, 0xd7, 0xa4, 0x06, 0x93, 0x7a,
+ 0x06, 0x0f, 0xcb, 0x67, 0x71, 0x10, 0x7a, 0x22, 0xda, 0xdb, 0xf3, 0x93,
+ 0x37, 0x83, 0xce, 0xb1, 0x13, 0x7d, 0xd2, 0xc3, 0xb8, 0x53, 0x91, 0x23,
+ 0x3c, 0x15, 0xa2, 0x6c, 0x54, 0x89, 0xd0, 0xc3, 0xc6, 0x2e, 0x19, 0xe5,
+ 0x85, 0x48, 0x37, 0x90, 0xc4, 0xaa, 0x4a, 0x0a, 0x1f, 0xd5, 0xe9, 0xc2,
+ 0x74, 0x0d, 0xc3, 0x08, 0xc4, 0x84, 0x35, 0xf6, 0x1e, 0x7e, 0x2a, 0x73,
+ 0x51, 0x18, 0x61, 0xb3, 0xaa, 0xeb, 0xc1, 0xb9, 0x33, 0x49, 0xdc, 0x57,
+ 0x79, 0x29, 0x24, 0x5e, 0xb8, 0xa1, 0x4d, 0xf2, 0xaa, 0xbc, 0x2d, 0x86,
+ 0x27, 0x54, 0xbb, 0x9e, 0x9c, 0x94, 0x57, 0x74, 0x82, 0xde, 0xc6, 0x5d,
+ 0x66, 0xef, 0xcf, 0xde, 0x26, 0x1b, 0xa4, 0x5a, 0x24, 0x67, 0x16, 0xc5,
+ 0x91, 0x1e, 0xdd, 0x14, 0xe3, 0xae, 0x66, 0xad, 0xcb, 0xf6, 0xee, 0x3b,
+ 0xfa, 0xf1, 0xe0, 0xcd, 0xd9, 0xc9, 0xd1, 0x4f, 0x6c, 0xdf, 0x05, 0xcb,
+ 0xa1, 0x1f, 0x7f, 0xe5, 0x19, 0xbc, 0x08, 0x8f, 0x51, 0xc4, 0xd7, 0xcc,
+ 0xe4, 0xbe, 0xef, 0x2a, 0x67, 0xb1, 0xa8, 0x2c, 0x38, 0x1e, 0x9f, 0x1d,
+ 0x0f, 0x15, 0x7f, 0x91, 0x3b, 0xa2, 0xe7, 0x05, 0xd9, 0xa6, 0xb0, 0x3e,
+ 0xb5, 0x0d, 0x11, 0x71, 0xd1, 0x30, 0xf0, 0x88, 0xc9, 0x79, 0x18, 0x24,
+ 0x6f, 0x35, 0xad, 0x74, 0x80, 0x4d, 0xa7, 0x33, 0xf8, 0x2a, 0x47, 0xd3,
+ 0xbd, 0x6e, 0x3e, 0x20, 0x71, 0x87, 0x5c, 0xd3, 0x01, 0xba, 0xa9, 0xd7,
+ 0xd0, 0xb6, 0xce, 0x66, 0xec, 0x39, 0xee, 0xbd, 0x1f, 0x59, 0x44, 0x62,
+ 0x17, 0x51, 0x78, 0x14, 0xc4, 0x29, 0xa5, 0x10, 0x89, 0x0c, 0x16, 0xd7,
+ 0x49, 0xd7, 0x72, 0x08, 0xdf, 0x0a, 0xdd, 0x5e, 0x7e, 0xfb, 0xc9, 0xda,
+ 0x70, 0x99, 0xec, 0xaf, 0x7d, 0x42, 0x15, 0xc1, 0x77, 0xb3, 0x47, 0x9a,
+ 0xd9, 0x69, 0xc9, 0xb7, 0x0b, 0xca, 0x48, 0xeb, 0x15, 0x4f, 0xe7, 0xa7,
+ 0xeb, 0xc9, 0xf0, 0x90, 0x39, 0xe9, 0x62, 0x4d, 0x5d, 0x2c, 0xaf, 0xae,
+ 0x22, 0x00, 0x49, 0xd4, 0xf5, 0x37, 0x83, 0xeb, 0x8d, 0x3c, 0x59, 0xeb,
+ 0x75, 0xc2, 0x01, 0x14, 0x33, 0xff, 0x35, 0x04, 0x85, 0x45, 0x09, 0x2b,
+ 0xcb, 0x29, 0x69, 0xe3, 0x07, 0x1a, 0xff, 0x41, 0x7b, 0xca, 0x70, 0x38,
+ 0x56, 0x50, 0xd7, 0xbf, 0x5c, 0x4f, 0x24, 0xbc, 0x6d, 0xec, 0x68, 0xd6,
+ 0xdf, 0x20, 0xaf, 0xd7, 0x58, 0x4f, 0xbf, 0xe0, 0x16, 0x9a, 0x83, 0x64,
+ 0xfd, 0xe5, 0xba, 0x3c, 0xb7, 0x16, 0xd5, 0x42, 0xf9, 0x1d, 0x0e, 0xaf,
+ 0xb2, 0xe1, 0x30, 0xb1, 0x0e, 0x68, 0xd2, 0x6f, 0xf3, 0xe9, 0x34, 0x2b,
+ 0xc4, 0x1f, 0x49, 0x0d, 0xaa, 0x13, 0xc6, 0x4c, 0x1d, 0x88, 0x5b, 0xa4,
+ 0xab, 0x72, 0x60, 0xea, 0x3a, 0x73, 0x9e, 0x2b, 0x75, 0x4d, 0xe6, 0x19,
+ 0x68, 0x43, 0x85, 0x74, 0x86, 0x88, 0x90, 0xeb, 0x27, 0x2c, 0x5f, 0xed,
+ 0x3b, 0x29, 0x9c, 0x22, 0x4c, 0x9e, 0x09, 0x28, 0xfb, 0xd1, 0xf2, 0xd3,
+ 0x6e, 0x71, 0x27, 0x82, 0x8a, 0xa1, 0xef, 0xd8, 0x6b, 0x4d, 0x63, 0x46,
+ 0x5e, 0xaf, 0x08, 0x0d, 0xb0, 0xfc, 0x88, 0xce, 0xf1, 0x65, 0xd5, 0xf7,
+ 0x7d, 0x75, 0xab, 0x3b, 0xc6, 0xe3, 0xab, 0x56, 0x93, 0xf7, 0xa0, 0x94,
+ 0xd3, 0x83, 0xa2, 0x0b, 0xa8, 0x61, 0x3d, 0x08, 0xf1, 0xa1, 0xb8, 0xf3,
+ 0x23, 0xcb, 0x65, 0x8d, 0xca, 0xb9, 0x7a, 0x57, 0x09, 0x54, 0x6b, 0x8d,
+ 0x79, 0xcc, 0xc7, 0xed, 0x17, 0x6b, 0xb7, 0x3b, 0x25, 0x4b, 0x20, 0x01,
+ 0x7d, 0x3c, 0x56, 0xd6, 0xf9, 0xb7, 0xaa, 0x7f, 0x47, 0xfd, 0xa0, 0x84,
+ 0x7e, 0xd4, 0x33, 0x4c, 0xe4, 0x8d, 0xc6, 0xa4, 0xbe, 0x97, 0x53, 0x55,
+ 0x87, 0xa6, 0xe4, 0x2b, 0x89, 0x5a, 0xfa, 0xc1, 0x40, 0xa9, 0x3d, 0x65,
+ 0xaf, 0x6d, 0xa1, 0x2d, 0xf4, 0x38, 0x37, 0x42, 0x33, 0x36, 0x72, 0x84,
+ 0x56, 0xea, 0x51, 0x44, 0x85, 0x65, 0x9d, 0x14, 0x2c, 0x67, 0x33, 0x62,
+ 0xe0, 0x9b, 0xa7, 0x38, 0xa6, 0xbe, 0xaf, 0xf9, 0x51, 0x03, 0x2f, 0xed,
+ 0x22, 0x12, 0xd7, 0xc6, 0xfd, 0xb1, 0x57, 0x4d, 0xe1, 0x2c, 0xb8, 0x97,
+ 0x34, 0x26, 0xf2, 0x3e, 0x9b, 0xe1, 0x3f, 0x6a, 0x36, 0x2c, 0x0d, 0x9e,
+ 0xdd, 0x65, 0x93, 0x65, 0xd3, 0xae, 0xa9, 0xf4, 0xe6, 0xa4, 0x58, 0x69,
+ 0x3c, 0xad, 0x0d, 0x1c, 0x05, 0x81, 0x90, 0x5a, 0x3b, 0x53, 0xa0, 0xab,
+ 0xfd, 0xb5, 0x4d, 0x89, 0xa1, 0xa7, 0xac, 0xc1, 0xf3, 0x8f, 0x63, 0xc1,
+ 0x71, 0x9d, 0x73, 0x95, 0xb1, 0x3b, 0xdb, 0xe5, 0x89, 0x44, 0x3f, 0x6f,
+ 0x98, 0xb4, 0x9a, 0xc6, 0xbe, 0xfd, 0x9a, 0x1d, 0x9f, 0xde, 0xa7, 0x6d,
+ 0x67, 0x70, 0xf1, 0x89, 0xd6, 0xc1, 0x51, 0x0e, 0xbe, 0x5c, 0x5e, 0xc2,
+ 0x21, 0x71, 0x70, 0x63, 0xb8, 0x1b, 0xae, 0x0a, 0x7d, 0x55, 0xe9, 0x1f,
+ 0xf8, 0xa2, 0xd3, 0x59, 0x33, 0xac, 0x6f, 0x26, 0xf1, 0x1a, 0x18, 0xbf,
+ 0xc7, 0x35, 0x72, 0x09, 0xcc, 0xc3, 0xe3, 0x9b, 0xc9, 0xbe, 0xed, 0xff,
+ 0x55, 0x5b, 0x11, 0x11, 0x06, 0x1c, 0xeb, 0xfb, 0x62, 0x72, 0xfd, 0xea,
+ 0xed, 0x38, 0x3e, 0x34, 0xf3, 0x34, 0xef, 0x36, 0x5c, 0x18, 0x29, 0x9e,
+ 0x37, 0xb7, 0x11, 0xe1, 0x5c, 0xe2, 0x1a, 0x13, 0x70, 0x50, 0x73, 0xd5,
+ 0x1f, 0x78, 0xbf, 0x8b, 0x0f, 0xd7, 0x7a, 0xc1, 0x3a, 0xe3, 0xe8, 0x7a,
+ 0xe1, 0xa3, 0x2c, 0xfa, 0x07, 0x6a, 0x3f, 0x86, 0x29, 0x11, 0xa4, 0xac,
+ 0x62, 0x6a, 0x94, 0xdd, 0x59, 0x0a, 0xd8, 0x18, 0xae, 0x92, 0x21, 0xab,
+ 0xfe, 0x64, 0xab, 0x0b, 0xc3, 0x1c, 0xb3, 0xbc, 0x45, 0x2a, 0x87, 0xb7,
+ 0x20, 0xbf, 0xd4, 0x14, 0x1a, 0x8d, 0x24, 0x6b, 0x5c, 0x2d, 0x18, 0xec,
+ 0xf0, 0x3a, 0xad, 0x0e, 0xcb, 0xe2, 0x26, 0x3e, 0xab, 0x4e, 0x5d, 0x0d,
+ 0xd7, 0x8d, 0x7a, 0xdf, 0x9d, 0x98, 0xb7, 0xd3, 0x49, 0x03, 0x3c, 0x40,
+ 0x20, 0x60, 0x6a, 0x12, 0x62, 0x7c, 0xb8, 0x0d, 0x44, 0x28, 0x8e, 0xbe,
+ 0x3e, 0x7c, 0x75, 0x7c, 0xb8, 0xd9, 0x9d, 0xc9, 0x2b, 0xe0, 0x00, 0xf0,
+ 0x36, 0x69, 0xc7, 0x53, 0x52, 0x1c, 0x95, 0xe9, 0xbc, 0x29, 0xe0, 0x51,
+ 0x2b, 0xa6, 0x58, 0x45, 0xea, 0xf9, 0xe4, 0x1c, 0x05, 0x97, 0x68, 0xb3,
+ 0x03, 0x01, 0x05, 0xc1, 0x0e, 0xc9, 0x32, 0xcf, 0xe6, 0x14, 0x01, 0xb5,
+ 0x77, 0x34, 0x23, 0xf4, 0x91, 0x8e, 0x47, 0x9f, 0x1b, 0xc6, 0x87, 0x9b,
+ 0x92, 0x26, 0x49, 0x97, 0x3d, 0x17, 0x0f, 0xfc, 0x4b, 0x77, 0x11, 0x82,
+ 0x79, 0x1d, 0x7f, 0x59, 0x01, 0xb1, 0x19, 0x62, 0x95, 0x03, 0x38, 0xc1,
+ 0x86, 0xd0, 0x46, 0xed, 0xf2, 0x7f, 0xb6, 0x76, 0x2d, 0xb1, 0x6d, 0x31,
+ 0x29, 0xa8, 0x60, 0x24, 0xf5, 0x28, 0xf2, 0xda, 0x9e, 0xbc, 0xb6, 0xb7,
+ 0xea, 0xb5, 0xc8, 0x7b, 0x63, 0xf6, 0x37, 0xad, 0x38, 0x36, 0x41, 0x1d,
+ 0x8e, 0x7e, 0x60, 0x25, 0x2e, 0xe9, 0xab, 0xb7, 0xed, 0x01, 0x6c, 0x00,
+ 0x8e, 0x7e, 0x33, 0xd4, 0x5a, 0x54, 0xb9, 0xfe, 0x3d, 0xfd, 0x3d, 0xe2,
+ 0xea, 0x3a, 0xbb, 0x79, 0xe6, 0x85, 0x1f, 0x49, 0x4f, 0xc6, 0x8f, 0xac,
+ 0x96, 0x18, 0xbc, 0xf1, 0xb1, 0xba, 0x78, 0x62, 0xfe, 0xf3, 0x1d, 0xfd,
+ 0xe7, 0x92, 0xbd, 0xa5, 0xab, 0xe9, 0x7e, 0x62, 0x6c, 0xfe, 0x2c, 0x12,
+ 0xfb, 0x0e, 0xc8, 0x60, 0x57, 0xe1, 0x52, 0x13, 0xcc, 0x85, 0x32, 0xa3,
+ 0xd7, 0x39, 0xc6, 0x37, 0x90, 0x50, 0x1f, 0x7e, 0x54, 0xf5, 0x1d, 0x77,
+ 0xb3, 0x8c, 0xdd, 0x6f, 0xbe, 0x0e, 0xa6, 0x61, 0xb8, 0xfd, 0x6f, 0x24,
+ 0xcb, 0xec, 0x81, 0x36, 0x2c, 0xd7, 0x3a, 0xcc, 0x97, 0x7e, 0x16, 0x1e,
+ 0x7f, 0xc8, 0x1e, 0xf0, 0xb0, 0xca, 0x40, 0xed, 0xef, 0xde, 0x65, 0xbf,
+ 0x31, 0x7a, 0x09, 0xdd, 0x67, 0x8f, 0x5e, 0xb5, 0x7d, 0xa1, 0x3b, 0x10,
+ 0x45, 0x3d, 0xc7, 0xe3, 0x93, 0x47, 0x0f, 0xa4, 0x61, 0xd2, 0xd5, 0x99,
+ 0xa5, 0x30, 0x5a, 0xe4, 0x3f, 0x21, 0x3a, 0xbd, 0xb7, 0xae, 0x5f, 0xf9,
+ 0x5a, 0x37, 0x8e, 0x33, 0x3e, 0xd1, 0xff, 0xd0, 0x73, 0xd7, 0x2a, 0xe8,
+ 0xce, 0x96, 0x17, 0x33, 0xb3, 0x19, 0xe3, 0xe5, 0xe5, 0x65, 0x7e, 0x97,
+ 0x9c, 0x50, 0x49, 0x1e, 0xcb, 0x10, 0xa8, 0xdb, 0x9a, 0xe0, 0xd9, 0x47,
+ 0x7e, 0xbe, 0x74, 0xe8, 0x30, 0xf2, 0x69, 0x6c, 0x95, 0x11, 0xb9, 0xba,
+ 0x7a, 0x56, 0x7d, 0xd6, 0x16, 0xfc, 0xad, 0x7a, 0x79, 0xd9, 0x23, 0x84,
+ 0xcc, 0x14, 0xb2, 0x3a, 0xb4, 0x84, 0xb8, 0x47, 0x9e, 0xfe, 0xe7, 0x97,
+ 0xac, 0x7a, 0xcc, 0xab, 0xf6, 0x50, 0xac, 0xc0, 0xd3, 0x84, 0x14, 0x41,
+ 0x77, 0xa3, 0x43, 0xe3, 0x84, 0x27, 0x50, 0x87, 0x19, 0x30, 0x58, 0x4b,
+ 0x98, 0x51, 0xe5, 0x8b, 0x16, 0x44, 0xce, 0xcc, 0x9f, 0x14, 0x20, 0x1b,
+ 0xb3, 0xe1, 0x53, 0xc6, 0x00, 0x3c, 0xc8, 0xd8, 0xd5, 0xff, 0xac, 0x9c,
+ 0xab, 0x14, 0x4b, 0xf5, 0xa8, 0x0f, 0xa8, 0x40, 0x1b, 0x33, 0xce, 0xd5,
+ 0x3b, 0xce, 0x67, 0x39, 0x13, 0xbb, 0x74, 0x73, 0x15, 0x49, 0x7a, 0x08,
+ 0x6d, 0x76, 0x3e, 0x86, 0xb8, 0x48, 0x99, 0x52, 0x63, 0x64, 0x48, 0xf5,
+ 0x2c, 0x1d, 0xa9, 0x54, 0x9c, 0x43, 0x65, 0x3f, 0x12, 0xd7, 0x5d, 0x86,
+ 0xb7, 0xa4, 0x1f, 0x03, 0x69, 0x8a, 0x02, 0x5e, 0xc9, 0x4b, 0xd6, 0x84,
+ 0xa3, 0xdd, 0xd4, 0xb9, 0xe5, 0xaf, 0xa0, 0x80, 0xf8, 0x3a, 0x33, 0xcc,
+ 0x0f, 0x84, 0x60, 0x52, 0x6a, 0xa4, 0x2a, 0x99, 0xba, 0xe4, 0xb8, 0x9f,
+ 0xb2, 0x94, 0x0a, 0x13, 0xc7, 0x2b, 0x01, 0x1b, 0x10, 0xef, 0x46, 0x22,
+ 0x4e, 0x1a, 0x89, 0xa7, 0x20, 0x07, 0x33, 0x05, 0x7c, 0x18, 0x9c, 0x55,
+ 0x8c, 0x5a, 0xc5, 0x61, 0x1d, 0xc3, 0x7c, 0xd3, 0x98, 0x01, 0xda, 0x0e,
+ 0x05, 0x2a, 0xca, 0x48, 0xcd, 0xfe, 0x5a, 0xf9, 0x4a, 0xe8, 0x63, 0x4a,
+ 0xeb, 0x98, 0xc5, 0xd8, 0xc0, 0x76, 0x4f, 0xd6, 0x78, 0x3e, 0x6b, 0x02,
+ 0xfa, 0xa3, 0x41, 0x04, 0x64, 0xe9, 0xa9, 0x81, 0xc3, 0x26, 0x82, 0x8c,
+ 0xcf, 0x5e, 0xc8, 0x48, 0xe2, 0x85, 0xa8, 0xbc, 0x5f, 0x69, 0xb2, 0xdf,
+ 0x9a, 0x66, 0x89, 0xb4, 0x7c, 0x1b, 0x76, 0x38, 0x4b, 0x95, 0x08, 0xd4,
+ 0x08, 0xe7, 0xce, 0xa0, 0x74, 0x81, 0x76, 0xcd, 0x0c, 0x3a, 0x5c, 0x8b,
+ 0xeb, 0xfd, 0x96, 0x06, 0x89, 0x6d, 0x56, 0xdb, 0x32, 0x50, 0xf5, 0x2b,
+ 0xea, 0x8f, 0xa8, 0x97, 0x17, 0xc6, 0x8a, 0x6c, 0x96, 0x21, 0x3f, 0x4a,
+ 0x64, 0x11, 0xc0, 0x2c, 0x88, 0x12, 0xd1, 0x4e, 0x38, 0xf4, 0x14, 0x58,
+ 0xa3, 0x94, 0x13, 0xdc, 0x00, 0x16, 0x5e, 0x12, 0x2d, 0x2f, 0x18, 0x72,
+ 0x62, 0x56, 0xde, 0x76, 0xa5, 0xe3, 0x01, 0x05, 0xa3, 0xdd, 0xec, 0xda,
+ 0x55, 0x97, 0x66, 0x80, 0xdf, 0xff, 0xa7, 0xfe, 0xf2, 0x03, 0x11, 0xeb,
+ 0xef, 0x4a, 0x2c, 0x99, 0x76, 0x1a, 0xe0, 0x83, 0xc0, 0x0d, 0xf0, 0x7b,
+ 0x10, 0xe5, 0x2f, 0x94, 0xf9, 0xc6, 0x94, 0x21, 0x18, 0x2e, 0x0c, 0xf7,
+ 0xfb, 0x91, 0xbd, 0xba, 0x75, 0x08, 0xc2, 0x3b, 0x60, 0xa7, 0xc6, 0xc5,
+ 0x7d, 0xe0, 0x3a, 0x23, 0x1e, 0xfc, 0xa9, 0x18, 0x00, 0x64, 0xdd, 0x58,
+ 0x9e, 0x04, 0x4f, 0xc4, 0x1d, 0xb9, 0x79, 0x1b, 0x7f, 0xaa, 0x04, 0x59,
+ 0xcb, 0xd8, 0x5c, 0x12, 0x3e, 0xe2, 0x9f, 0xc7, 0x0d, 0x20, 0x9b, 0x51,
+ 0xaa, 0x74, 0x6e, 0x41, 0xad, 0x99, 0x91, 0xd2, 0x6a, 0x6a, 0x5d, 0x06,
+ 0x17, 0x0a, 0x7c, 0xc4, 0xac, 0xda, 0xdd, 0x7b, 0x80, 0x13, 0x09, 0xf8,
+ 0xbc, 0xbe, 0xca, 0x3d, 0x1c, 0x6d, 0x7c, 0xf5, 0xf7, 0xff, 0xc9, 0xd9,
+ 0xa2, 0x7f, 0x0f, 0xef, 0xb2, 0xd3, 0xf3, 0xa3, 0x7d, 0x4c, 0xe9, 0xf7,
+ 0xc3, 0xfa, 0x7e, 0x7e, 0x51, 0xce, 0xe4, 0xd4, 0x11, 0xed, 0x0d, 0x01,
+ 0xf5, 0x67, 0xcc, 0x23, 0x08, 0x9b, 0x0e, 0x3d, 0xe4, 0x9e, 0x41, 0xb4,
+ 0x2b, 0x0d, 0xec, 0xc5, 0xa4, 0x9c, 0x70, 0x11, 0x35, 0x55, 0xb4, 0x98,
+ 0xd3, 0xf7, 0xfb, 0x44, 0xe1, 0x78, 0xb8, 0xc5, 0xb5, 0x34, 0x32, 0xf7,
+ 0xe0, 0x72, 0xe3, 0x85, 0xbd, 0x51, 0xfa, 0x79, 0x8c, 0x62, 0xad, 0xbc,
+ 0x18, 0xe6, 0x11, 0x09, 0x0b, 0x33, 0xcd, 0x0f, 0xa8, 0xd4, 0xe5, 0x57,
+ 0x0f, 0xf9, 0x47, 0xc3, 0x73, 0xfa, 0x91, 0x24, 0x83, 0x6b, 0x00, 0x91,
+ 0xb8, 0x53, 0xeb, 0x91, 0x06, 0x91, 0xa2, 0xf8, 0x24, 0x96, 0xbf, 0x49,
+ 0xb6, 0x88, 0x11, 0x34, 0xc1, 0x3c, 0xf5, 0x5c, 0x7f, 0xc8, 0x80, 0xc5,
+ 0x9d, 0xdf, 0x64, 0xab, 0x47, 0x03, 0x5f, 0x90, 0x02, 0x32, 0x07, 0x10,
+ 0xad, 0x97, 0x49, 0xec, 0x20, 0x89, 0x18, 0xfd, 0x8f, 0x03, 0xdb, 0xa3,
+ 0x87, 0x86, 0xe3, 0xe8, 0x0f, 0xdc, 0x52, 0x92, 0x1d, 0x46, 0x4e, 0x40,
+ 0xaf, 0x37, 0x4e, 0x43, 0x45, 0x5a, 0x14, 0x0d, 0xc0, 0xb8, 0x0f, 0xac,
+ 0x15, 0x30, 0xb0, 0x2c, 0xb8, 0xfc, 0x66, 0xd9, 0x94, 0x03, 0xe1, 0x92,
+ 0x20, 0x38, 0xeb, 0xa1, 0xa2, 0x6c, 0x89, 0xd5, 0xc3, 0xb9, 0x54, 0x0a,
+ 0x89, 0xa0, 0x1d, 0x93, 0xcb, 0x11, 0x79, 0x2f, 0x4b, 0x76, 0x56, 0xe6,
+ 0xa8, 0x6e, 0x9a, 0x93, 0x7f, 0x39, 0x12, 0xf2, 0x4f, 0x62, 0xee, 0x46,
+ 0x04, 0xaa, 0xff, 0xdd, 0xcb, 0xc9, 0x60, 0x0b, 0x7d, 0xe8, 0xe5, 0x62,
+ 0x8c, 0x04, 0xd8, 0x75, 0xf5, 0x70, 0x5c, 0xa4, 0xf1, 0x6c, 0xb4, 0x1d,
+ 0x58, 0x84, 0x97, 0xcd, 0xe2, 0x83, 0x61, 0x8e, 0xea, 0xfe, 0x03, 0xa5,
+ 0x32, 0x63, 0xcf, 0x34, 0xfa, 0x81, 0x1f, 0x80, 0xb4, 0x8c, 0x92, 0xb1,
+ 0x5c, 0xd0, 0x38, 0x60, 0xf2, 0x59, 0xc9, 0xe6, 0xdc, 0x43, 0xcb, 0x68,
+ 0x27, 0x0d, 0xfb, 0xe8, 0x51, 0x1b, 0xed, 0xee, 0x8f, 0x4f, 0x82, 0x89,
+ 0x51, 0x96, 0xd2, 0x07, 0x64, 0x11, 0x58, 0x66, 0x32, 0x37, 0x5f, 0x56,
+ 0xe5, 0x13, 0xbf, 0x9b, 0x32, 0x1e, 0x00, 0x3f, 0x31, 0xfe, 0x2d, 0xa5,
+ 0x15, 0x44, 0xe1, 0xcf, 0x3b, 0xff, 0x83, 0x9f, 0xda, 0x45, 0xd6, 0x34,
+ 0x23, 0x16, 0x57, 0xa0, 0x99, 0x26, 0x25, 0x5f, 0x79, 0xa9, 0x20, 0x61,
+ 0x7f, 0x8a, 0xce, 0xff, 0xd0, 0x5f, 0x61, 0x57, 0x3a, 0x65, 0xcf, 0xf2,
+ 0xb4, 0xb6, 0x33, 0xe4, 0x25, 0xe0, 0x48, 0x61, 0xc1, 0x82, 0xea, 0xf7,
+ 0xe0, 0x39, 0xe4, 0x3c, 0x45, 0x52, 0x40, 0x46, 0x3d, 0x94, 0xe1, 0xec,
+ 0xf2, 0x2e, 0x65, 0xfa, 0x09, 0xa2, 0x6b, 0x1e, 0xae, 0xfe, 0xb6, 0xc2,
+ 0x1f, 0x6e, 0x48, 0xb4, 0x11, 0x76, 0xe7, 0x26, 0x67, 0x13, 0x80, 0x19,
+ 0x14, 0x2a, 0x51, 0x73, 0x14, 0x56, 0x0f, 0xb7, 0xd1, 0xee, 0xd3, 0xde,
+ 0xb3, 0xcf, 0x16, 0xa0, 0x86, 0x85, 0x06, 0xfd, 0x2c, 0x71, 0xa8, 0x35,
+ 0xac, 0xfa, 0xd3, 0x7a, 0x12, 0x2b, 0x7a, 0x14, 0xc8, 0xe2, 0x17, 0x7c,
+ 0xfe, 0xe9, 0x76, 0x84, 0xff, 0xff, 0x52, 0xe3, 0xb3, 0xf6, 0xd6, 0x4e,
+ 0xfe, 0x7d, 0x7c, 0xfa, 0x36, 0x29, 0x2f, 0xfe, 0x42, 0xc4, 0x65, 0x9d,
+ 0x8b, 0x52, 0xd4, 0xad, 0x50, 0xfe, 0x98, 0x45, 0x2a, 0x40, 0x90, 0xa8,
+ 0xfe, 0x21, 0x5f, 0xf8, 0x82, 0xef, 0xf8, 0x0c, 0xad, 0x8c, 0x51, 0x63,
+ 0x25, 0x52, 0x99, 0xf3, 0xd9, 0x29, 0x89, 0x46, 0x7e, 0x00, 0xf1, 0xf0,
+ 0xe0, 0x8e, 0x4c, 0x18, 0xb7, 0x03, 0x7e, 0x2f, 0xaf, 0xa6, 0x71, 0xa8,
+ 0x9a, 0x9e, 0xba, 0xc1, 0xc8, 0x5c, 0x7f, 0x12, 0x89, 0xba, 0x25, 0x11,
+ 0x3b, 0xdf, 0xa7, 0xcb, 0xee, 0x8b, 0x08, 0x5d, 0x78, 0x49, 0xd0, 0xa9,
+ 0xed, 0x92, 0x78, 0xfe, 0xad, 0x46, 0x3d, 0xed, 0x85, 0x78, 0x33, 0x7d,
+ 0x60, 0x49, 0x6e, 0x19, 0x0f, 0xce, 0x44, 0x01, 0x03, 0x3c, 0xe2, 0x82,
+ 0x3f, 0xe4, 0xe7, 0x1a, 0xdb, 0xee, 0x4c, 0x83, 0x6d, 0xf5, 0x87, 0x89,
+ 0xcb, 0x65, 0x77, 0xfe, 0x24, 0x9e, 0xef, 0x46, 0x26, 0x61, 0x96, 0xfb,
+ 0xc1, 0xf5, 0x99, 0x48, 0xde, 0xf2, 0xea, 0x69, 0xf9, 0x46, 0xc7, 0x72,
+ 0x1d, 0x28, 0x08, 0x6f, 0x54, 0x27, 0x23, 0xf3, 0x88, 0xda, 0x06, 0x49,
+ 0xc4, 0x54, 0xe8, 0x9c, 0x94, 0xbd, 0xe8, 0x1c, 0x6c, 0x76, 0xac, 0x3d,
+ 0xf7, 0xb2, 0x0b, 0x56, 0x22, 0x76, 0xc2, 0x34, 0x1e, 0x49, 0x56, 0xcf,
+ 0x41, 0x51, 0xb9, 0x36, 0x28, 0x44, 0x9c, 0x22, 0xff, 0xce, 0x9c, 0x3a,
+ 0x4a, 0x31, 0x5f, 0xfd, 0x9e, 0xed, 0xfa, 0x4d, 0x50, 0x24, 0x28, 0x75,
+ 0xf5, 0x10, 0x84, 0x08, 0x30, 0x74, 0x59, 0xb3, 0x63, 0xfc, 0x78, 0x4c,
+ 0xca, 0x59, 0xa0, 0xd8, 0x26, 0xb1, 0xf4, 0xdf, 0x36, 0x35, 0x9e, 0xef,
+ 0xf5, 0xec, 0x88, 0x7e, 0xba, 0xb6, 0x3b, 0x02, 0x4a, 0xe8, 0x0f, 0x59,
+ 0x0c, 0x92, 0x4a, 0x73, 0x59, 0x52, 0xc2, 0xbe, 0x63, 0x94, 0xc7, 0xb1,
+ 0xc5, 0x23, 0xf6, 0x04, 0xd2, 0xf1, 0x43, 0x5d, 0xcf, 0x48, 0x84, 0xe5,
+ 0x97, 0xf7, 0x66, 0x4a, 0x75, 0x2f, 0xf8, 0x94, 0xcf, 0xc2, 0xfc, 0x9c,
+ 0x9e, 0x1f, 0xcf, 0xc5, 0xb7, 0x5e, 0xc3, 0x47, 0xb0, 0xc8, 0x28, 0x35,
+ 0x8c, 0x81, 0xfc, 0x1f, 0x92, 0x0f, 0xa4, 0x5e, 0xe1, 0xf3, 0x2e, 0xce,
+ 0x2c, 0xf2, 0xdf, 0xaa, 0x81, 0xa3, 0x64, 0x5b, 0x1c, 0x29, 0x0f, 0x5e,
+ 0x8d, 0xad, 0x91, 0x68, 0x10, 0x97, 0x5a, 0xd1, 0x26, 0xc8, 0xd3, 0xd8,
+ 0x41, 0x51, 0xea, 0x7f, 0x80, 0x3b, 0x86, 0xf3, 0x21, 0xa4, 0xe4, 0xc4,
+ 0xb2, 0x18, 0x0d, 0x8a, 0x93, 0xa2, 0x19, 0x0d, 0xc3, 0x13, 0xd2, 0x71,
+ 0x66, 0x91, 0x3e, 0x05, 0x49, 0x04, 0x18, 0x07, 0xed, 0x0b, 0x51, 0x80,
+ 0xe1, 0xb6, 0x7a, 0xa3, 0x94, 0x02, 0xf2, 0x21, 0xd5, 0xbd, 0x0f, 0xf1,
+ 0x8b, 0xa4, 0xd7, 0x55, 0xe7, 0x89, 0x96, 0xcd, 0x81, 0x66, 0xca, 0xaa,
+ 0x0a, 0x2e, 0x36, 0x0c, 0xb0, 0x77, 0x71, 0x9f, 0x4f, 0xa8, 0xd3, 0x17,
+ 0x12, 0x3a, 0xd3, 0xcf, 0x1e, 0x75, 0x12, 0xa4, 0x01, 0x26, 0x4c, 0xe8,
+ 0x2b, 0x60, 0x15, 0x96, 0x1d, 0x56, 0x32, 0xca, 0x42, 0x84, 0x72, 0xa4,
+ 0x24, 0xd9, 0x5b, 0xe4, 0xdc, 0xe9, 0x4d, 0xe6, 0x2a, 0xe9, 0xdc, 0x24,
+ 0x9c, 0x4f, 0x6d, 0x05, 0xee, 0x2f, 0x93, 0xb8, 0xf6, 0xe2, 0x90, 0x7b,
+ 0x03, 0xd7, 0x46, 0x59, 0x75, 0x2e, 0x86, 0x87, 0x14, 0x9e, 0xa8, 0xac,
+ 0x96, 0x35, 0xe8, 0xb5, 0xe1, 0xad, 0xe1, 0xc1, 0x4b, 0xe3, 0x37, 0xbe,
+ 0x35, 0xda, 0xfa, 0xd7, 0x27, 0x51, 0x1f, 0x55, 0x3f, 0x34, 0xaa, 0x92,
+ 0xf6, 0x5d, 0x90, 0xc6, 0x0b, 0x70, 0x10, 0xac, 0x59, 0x0d, 0x76, 0x6d,
+ 0xf3, 0x97, 0x28, 0x49, 0x31, 0xde, 0x90, 0x44, 0xfe, 0x96, 0x65, 0x85,
+ 0xcc, 0x6e, 0xf9, 0xc5, 0x46, 0xed, 0x50, 0xed, 0xa9, 0xee, 0x77, 0x6a,
+ 0xfd, 0x89, 0x9b, 0x31, 0x20, 0xcc, 0xae, 0xb1, 0x61, 0xa6, 0xeb, 0x2b,
+ 0x56, 0xb8, 0x52, 0x1f, 0x3c, 0xe9, 0x84, 0x24, 0xfa, 0xc1, 0x76, 0x9b,
+ 0xe2, 0x30, 0x68, 0xd9, 0x50, 0xd6, 0xd4, 0xdc, 0xd0, 0x11, 0xa2, 0x8d,
+ 0x31, 0x61, 0x9d, 0x18, 0xd6, 0xa7, 0x23, 0x2e, 0x47, 0x8c, 0xa6, 0x19,
+ 0x15, 0xab, 0x46, 0xd3, 0x72, 0x67, 0x3b, 0x14, 0xae, 0x8c, 0x07, 0xe4,
+ 0x46, 0x0c, 0x96, 0x01, 0x5f, 0xb4, 0x68, 0xe1, 0x4c, 0x53, 0xfe, 0xe4,
+ 0x8a, 0x15, 0x78, 0x0e, 0xa6, 0xd5, 0x5f, 0xf4, 0x05, 0x5e, 0xfc, 0xd3,
+ 0x52, 0xc9, 0x94, 0x3c, 0x8e, 0x74, 0x5a, 0x8c, 0x13, 0x8e, 0x45, 0x8d,
+ 0xb6, 0xdc, 0x3e, 0xd0, 0x58, 0x29, 0xa5, 0xe5, 0x5c, 0x79, 0xad, 0xc0,
+ 0xb8, 0x3d, 0x9b, 0x33, 0xbb, 0xcd, 0x4d, 0x50, 0x2f, 0xa9, 0x5f, 0xc1,
+ 0xe5, 0x43, 0xca, 0x22, 0xc3, 0xea, 0xb1, 0x9f, 0xd3, 0x8e, 0x47, 0xd8,
+ 0xbf, 0xed, 0x1e, 0x65, 0x3d, 0xb3, 0xb2, 0x4b, 0x04, 0x71, 0x75, 0x5a,
+ 0x5a, 0xc3, 0xf5, 0x1b, 0xcd, 0x8a, 0x47, 0x7b, 0xcc, 0x9c, 0xfe, 0xd1,
+ 0x5b, 0xba, 0x7b, 0x2f, 0x73, 0x83, 0x1d, 0xbd, 0x2f, 0x1f, 0x75, 0x75,
+ 0xad, 0xbe, 0x98, 0x5b, 0x77, 0xef, 0xc3, 0x67, 0xb6, 0xef, 0x62, 0xde,
+ 0x89, 0x09, 0x44, 0x69, 0xaf, 0xa0, 0xff, 0x7b, 0xcd, 0xa9, 0xe6, 0xe4,
+ 0x2f, 0xa7, 0xde, 0x3d, 0x09, 0x4a, 0xc4, 0xe1, 0xff, 0xb8, 0x85, 0xff,
+ 0xc3, 0x79, 0xcb, 0xe3, 0x10, 0x02, 0x49, 0xa4, 0x98, 0x06, 0xc6, 0x88,
+ 0x3a, 0xfe, 0x38, 0x2b, 0x53, 0xfd, 0x77, 0xec, 0xc0, 0x1b, 0x3d, 0xfe,
+ 0x7a, 0x79, 0xb6, 0x17, 0x5f, 0x03, 0x66, 0xf4, 0x89, 0xd7, 0xd0, 0xef,
+ 0xbb, 0x1c, 0x25, 0x3e, 0xe8, 0xf6, 0xea, 0xe1, 0xa4, 0xe4, 0x87, 0xdd,
+ 0x9d, 0x7e, 0x53, 0x4d, 0xa6, 0x0c, 0x43, 0xb0, 0x23, 0x28, 0x97, 0x70,
+ 0x48, 0xe1, 0x01, 0xbb, 0x1c, 0x2f, 0x68, 0x25, 0x06, 0xd7, 0xca, 0xb7,
+ 0x6f, 0x8e, 0x28, 0xc9, 0xe8, 0x52, 0xf8, 0x90, 0x2e, 0x16, 0x72, 0x77,
+ 0x3e, 0xc2, 0x63, 0xc7, 0xb8, 0xba, 0xdc, 0x44, 0x9e, 0x1a, 0x19, 0x0e,
+ 0xb8, 0x98, 0xa0, 0xfc, 0xe8, 0xca, 0x13, 0x60, 0x20, 0x24, 0xcb, 0xe2,
+ 0x41, 0x96, 0x9f, 0xe9, 0xb9, 0xd9, 0x1a, 0x8f, 0xbf, 0xdd, 0xca, 0x9a,
+ 0x89, 0xde, 0xe1, 0x5b, 0x2e, 0x97, 0x56, 0x7c, 0x44, 0x0f, 0xeb, 0xe4,
+ 0xd0, 0x23, 0xd0, 0x4f, 0x96, 0x98, 0xdf, 0x46, 0x5f, 0x1e, 0xc1, 0xfb,
+ 0x20, 0x42, 0xdb, 0x63, 0xf2, 0x09, 0x96, 0x49, 0xed, 0x08, 0xf4, 0x23,
+ 0x6d, 0xc7, 0x17, 0x26, 0xbd, 0xc1, 0x90, 0xde, 0x77, 0xf7, 0x9b, 0x0f,
+ 0x9f, 0x6c, 0xb7, 0xb8, 0xe8, 0x52, 0xc8, 0xff, 0x47, 0x09, 0x74, 0xcb,
+ 0xc5, 0x7f, 0xcb, 0x7e, 0x7a, 0x69, 0x39, 0x48, 0x37, 0x7c, 0x78, 0xc2,
+ 0x0b, 0x72, 0xb5, 0xb1, 0xb6, 0xf4, 0xf0, 0x8c, 0x1f, 0x3d, 0xe1, 0xc7,
+ 0xcd, 0x58, 0x0b, 0x29, 0x48, 0xb3, 0xb7, 0x2a, 0x1b, 0xcd, 0x19, 0x51,
+ 0x14, 0x69, 0xc3, 0x40, 0x25, 0x44, 0x57, 0x61, 0xc6, 0x47, 0xd4, 0x05,
+ 0xad, 0x39, 0x6f, 0x9c, 0x44, 0x96, 0x0d, 0xed, 0xa0, 0x92, 0x4e, 0x5f,
+ 0x4b, 0xe6, 0xfd, 0x55, 0xf9, 0xe0, 0xec, 0x52, 0xe9, 0x83, 0x40, 0xd7,
+ 0x82, 0x17, 0x21, 0x9a, 0x28, 0xff, 0x78, 0x25, 0x74, 0x86, 0x75, 0x1e,
+ 0x1a, 0x8e, 0xf4, 0x3d, 0x2e, 0x1b, 0xbd, 0xa1, 0xf4, 0xa6, 0x9e, 0xbd,
+ 0xb0, 0x56, 0xca, 0x43, 0xc4, 0xa6, 0x9c, 0xa7, 0xd9, 0xcc, 0x5a, 0x35,
+ 0x0f, 0x5e, 0x49, 0xe6, 0x3a, 0x5b, 0x28, 0x79, 0x88, 0x2f, 0xa4, 0xeb,
+ 0x33, 0xb1, 0xe9, 0x40, 0x0f, 0xc6, 0x20, 0x79, 0x34, 0x2b, 0x20, 0x1e,
+ 0xa6, 0xa4, 0x75, 0xa8, 0xee, 0xd8, 0x4b, 0x4a, 0x66, 0xe1, 0x5f, 0xa6,
+ 0x13, 0xdb, 0xfe, 0xec, 0xa1, 0xd9, 0xa5, 0xdc, 0x09, 0xb5, 0x43, 0x05,
+ 0xce, 0xca, 0x6b, 0x69, 0x14, 0xc8, 0x35, 0x7c, 0xd4, 0x75, 0x9e, 0x0b,
+ 0xea, 0xa5, 0xcd, 0xb3, 0xf0, 0xa9, 0x55, 0x3b, 0xf9, 0xfc, 0x88, 0x0b,
+ 0x2f, 0xea, 0x5e, 0xc0, 0x54, 0x31, 0xf3, 0xc7, 0x1f, 0x9f, 0x4f, 0x70,
+ 0xe0, 0x39, 0xe3, 0x93, 0x54, 0xd2, 0xee, 0xc1, 0xc1, 0x5d, 0x76, 0xa1,
+ 0x27, 0xeb, 0x61, 0x37, 0x17, 0xea, 0x5d, 0x24, 0xa7, 0xcc, 0x25, 0x8f,
+ 0x76, 0x44, 0x04, 0x47, 0x1e, 0x67, 0x75, 0xf9, 0xb0, 0x16, 0x88, 0x1d,
+ 0xf0, 0x5a, 0xf6, 0x51, 0xef, 0x13, 0xf6, 0xb2, 0x1b, 0x3b, 0x88, 0x0e,
+ 0x4e, 0xa3, 0x4c, 0xf3, 0xb0, 0xe3, 0xdb, 0xec, 0x61, 0xfc, 0xc4, 0x88,
+ 0x55, 0xd0, 0x36, 0x12, 0x42, 0x2a, 0x2b, 0x7a, 0x08, 0x27, 0xc2, 0x22,
+ 0x5b, 0xfd, 0x31, 0x4c, 0x44, 0xb6, 0x64, 0xe4, 0xac, 0xa2, 0xab, 0x8c,
+ 0x1a, 0x65, 0xfc, 0x65, 0x5b, 0x53, 0x0a, 0x63, 0x35, 0xe3, 0x28, 0x29,
+ 0xbd, 0xee, 0x4a, 0xa3, 0x60, 0x53, 0x93, 0x3e, 0x39, 0x7c, 0x28, 0x20,
+ 0x84, 0xd8, 0x19, 0x05, 0xcf, 0x90, 0x91, 0x8d, 0xa2, 0x44, 0x8a, 0x9e,
+ 0x69, 0x98, 0x5e, 0x3c, 0x2c, 0xda, 0x07, 0x65, 0xff, 0x31, 0x5e, 0xbb,
+ 0xfa, 0x53, 0x62, 0x30, 0xdf, 0xa5, 0xe6, 0x0c, 0xc4, 0xaa, 0x6d, 0xea,
+ 0x14, 0xb7, 0x90, 0x6b, 0x50, 0xc5, 0x15, 0x52, 0x6d, 0x78, 0x3f, 0xee,
+ 0x93, 0xa9, 0x88, 0x8d, 0xd0, 0x4c, 0x23, 0x05, 0x59, 0x46, 0xad, 0x47,
+ 0xd9, 0x10, 0x5f, 0x16, 0xc6, 0xa2, 0x4e, 0x51, 0x8b, 0x45, 0xbb, 0x9c,
+ 0xdd, 0x35, 0x1c, 0x05, 0xc3, 0xef, 0x68, 0x2e, 0xd4, 0x09, 0x93, 0x52,
+ 0x2f, 0x1c, 0xbc, 0x73, 0xa4, 0x46, 0x49, 0x4a, 0xf2, 0xf1, 0x35, 0xeb,
+ 0x7d, 0xbc, 0x9b, 0x5e, 0x8d, 0xca, 0x2a, 0xa7, 0xfb, 0x06, 0x29, 0xd8,
+ 0x3a, 0x18, 0xf1, 0xfd, 0x00, 0xf2, 0x84, 0xac, 0xc7, 0xd8, 0x70, 0x1a,
+ 0xff, 0x4d, 0x12, 0x0e, 0x00, 0x07, 0x43, 0xcf, 0xc1, 0xaf, 0xf4, 0x3b,
+ 0x3b, 0xaa, 0xa0, 0xc0, 0xc4, 0xa0, 0x32, 0xb4, 0xa2, 0xcd, 0x36, 0x1b,
+ 0xd7, 0x34, 0x1a, 0xbb, 0x5a, 0xb7, 0x50, 0xca, 0x14, 0x30, 0x8c, 0x57,
+ 0x31, 0x28, 0x47, 0xe0, 0x59, 0xcb, 0xeb, 0x7a, 0x89, 0x0d, 0x7b, 0x7d,
+ 0x7c, 0x72, 0x64, 0xb3, 0x83, 0xff, 0xd7, 0xd6, 0x88, 0x48, 0x5e, 0x4d,
+ 0x82, 0x3c, 0x54, 0x2e, 0x87, 0xf7, 0xb0, 0x0d, 0xa4, 0x5e, 0xfe, 0xbb,
+ 0x01, 0x77, 0x66, 0xc6, 0x8f, 0x5b, 0xc5, 0xf2, 0x47, 0x6f, 0xbf, 0x3f,
+ 0x7e, 0x77, 0xfa, 0xf6, 0xcd, 0xd1, 0xdb, 0xf3, 0xcf, 0x3c, 0x71, 0x17,
+ 0x6b, 0xbb, 0x53, 0x87, 0x49, 0x30, 0x39, 0x05, 0x2d, 0x6f, 0x51, 0x33,
+ 0xcc, 0xbd, 0xae, 0xcc, 0x4a, 0xe5, 0x5f, 0x23, 0x7f, 0x38, 0xef, 0x21,
+ 0x8d, 0x3f, 0x51, 0x4e, 0xd9, 0x82, 0xfc, 0x54, 0x53, 0x8a, 0xfd, 0x8f,
+ 0x38, 0x62, 0x65, 0x7b, 0xdb, 0x53, 0x55, 0xf0, 0x1d, 0x75, 0x5a, 0x40,
+ 0x62, 0x3d, 0xf5, 0x31, 0xff, 0xcc, 0x92, 0x84, 0x63, 0xd5, 0x2e, 0x78,
+ 0xd4, 0x9a, 0x84, 0x63, 0xee, 0xf7, 0xb5, 0x24, 0xcc, 0x26, 0xd1, 0xd5,
+ 0x28, 0x72, 0x27, 0x14, 0x02, 0x7c, 0x16, 0xa8, 0x1a, 0x1a, 0x23, 0x64,
+ 0x21, 0xe1, 0x65, 0x88, 0x79, 0x88, 0xe9, 0x77, 0xb6, 0xcd, 0x56, 0x80,
+ 0x92, 0xee, 0xad, 0xe2, 0xcf, 0xea, 0x2c, 0xda, 0xdf, 0xda, 0xfa, 0xf9,
+ 0x25, 0x29, 0xab, 0x5f, 0xfe, 0x79, 0x9f, 0xf8, 0xe0, 0xe7, 0x10, 0xed,
+ 0xb9, 0xf6, 0xa6, 0x21, 0x32, 0xd7, 0xab, 0xd5, 0x25, 0xbe, 0xb5, 0xe4,
+ 0x84, 0x53, 0xfb, 0xc3, 0xd9, 0xbb, 0xd3, 0x1f, 0xff, 0xf4, 0x1b, 0x7f,
+ 0xc2, 0xcb, 0x16, 0xfb, 0x33, 0xe5, 0x11, 0xeb, 0xe0, 0x3f, 0xff, 0xe6,
+ 0x5f, 0x6b, 0x0f, 0x3f, 0x90, 0x7c, 0x10, 0x1c, 0xc5, 0x88, 0x42, 0xc6,
+ 0x38, 0x14, 0xdc, 0x8b, 0x24, 0x71, 0xc0, 0x14, 0x9e, 0x8f, 0xc3, 0x66,
+ 0x66, 0xe2, 0x8a, 0xab, 0xdb, 0x0c, 0x9a, 0x86, 0x4d, 0x01, 0x46, 0x0c,
+ 0x41, 0xe0, 0xf2, 0xfb, 0x14, 0x20, 0x83, 0x40, 0x30, 0x18, 0x26, 0x03,
+ 0x39, 0xd5, 0x96, 0x1e, 0x07, 0x27, 0x27, 0xbf, 0x29, 0x11, 0xcc, 0x05,
+ 0x51, 0x94, 0x6e, 0x2d, 0x43, 0xab, 0xa1, 0x6a, 0xe7, 0xbc, 0xd5, 0xa0,
+ 0xdb, 0x6f, 0x4f, 0x65, 0x36, 0x2f, 0xa1, 0x1c, 0x0f, 0xeb, 0xcc, 0xa8,
+ 0xb4, 0x29, 0x05, 0x97, 0xb4, 0xe5, 0x02, 0x4d, 0xac, 0xde, 0xe2, 0xcc,
+ 0xe4, 0xfa, 0xcb, 0x20, 0x4b, 0x8d, 0x7c, 0x73, 0x54, 0x4b, 0x02, 0x13,
+ 0x0a, 0x89, 0xcb, 0x4c, 0x4d, 0x2e, 0x32, 0x45, 0x19, 0x50, 0x69, 0x21,
+ 0xd6, 0x28, 0x3d, 0x8e, 0xf3, 0xa4, 0xd1, 0xef, 0x3e, 0x6b, 0x42, 0xa8,
+ 0x1a, 0x42, 0x0c, 0x30, 0x32, 0xaf, 0xca, 0xeb, 0x8f, 0x28, 0x91, 0xa2,
+ 0x13, 0x0a, 0x05, 0x49, 0xa1, 0x48, 0x48, 0xe5, 0xc5, 0x9c, 0x46, 0x8c,
+ 0x96, 0xe4, 0xaa, 0x53, 0xf3, 0x3a, 0x36, 0x3b, 0xba, 0x74, 0x53, 0xbe,
+ 0x8a, 0xc9, 0x8d, 0xca, 0x2e, 0xf5, 0xb4, 0x55, 0x2a, 0x29, 0x9d, 0x2b,
+ 0x38, 0xcf, 0xaf, 0xb6, 0x90, 0x29, 0x31, 0x84, 0x8d, 0x81, 0xe2, 0x13,
+ 0xd0, 0x03, 0xfc, 0xe9, 0xa6, 0xce, 0x66, 0x97, 0x71, 0xb0, 0x90, 0xa8,
+ 0xb4, 0x10, 0xb0, 0x92, 0x5a, 0xbb, 0xe4, 0x29, 0xb3, 0xd2, 0x66, 0x65,
+ 0x80, 0xd7, 0xa2, 0x40, 0x49, 0xe8, 0xaf, 0xd3, 0x6c, 0x41, 0x3f, 0x17,
+ 0xe6, 0x0e, 0x7e, 0x14, 0x79, 0xd9, 0xd5, 0x86, 0x73, 0x91, 0x9a, 0xee,
+ 0xed, 0x17, 0xd3, 0xb0, 0xfc, 0x90, 0x40, 0x73, 0xfd, 0xca, 0x4c, 0xb9,
+ 0x79, 0x87, 0x77, 0x89, 0x62, 0x20, 0xf1, 0x3e, 0xb5, 0x9e, 0x91, 0xdf,
+ 0x3c, 0x66, 0x38, 0x0f, 0x48, 0x84, 0xa7, 0x9a, 0x34, 0x94, 0x09, 0xde,
+ 0x24, 0xe2, 0x17, 0x67, 0x25, 0x1c, 0xb0, 0x61, 0x61, 0xd5, 0x91, 0x37,
+ 0xf1, 0x55, 0x13, 0xed, 0x9d, 0x69, 0x24, 0x83, 0xc1, 0x3c, 0x46, 0x2e,
+ 0x78, 0xc6, 0xc3, 0xf2, 0xc7, 0xb3, 0xf3, 0x84, 0xb6, 0xca, 0x73, 0x64,
+ 0x3d, 0x4e, 0x51, 0x01, 0xb3, 0x58, 0x48, 0x31, 0x9a, 0x24, 0xe6, 0x1f,
+ 0x19, 0x39, 0x0b, 0x16, 0x01, 0x03, 0x4a, 0xb8, 0x6d, 0x2d, 0xe9, 0x42,
+ 0x1d, 0x92, 0x87, 0x10, 0x54, 0xc6, 0x23, 0xb9, 0x5d, 0xeb, 0x09, 0x11,
+ 0xf9, 0xb1, 0x59, 0xc9, 0x52, 0x7a, 0x8e, 0x62, 0xd5, 0x0b, 0x2d, 0xda,
+ 0xd7, 0x50, 0x9d, 0xb9, 0x02, 0x67, 0x65, 0x1d, 0x43, 0x06, 0xbe, 0xa0,
+ 0xca, 0x8f, 0xac, 0xe9, 0x29, 0x2c, 0x70, 0x33, 0x92, 0x50, 0x96, 0xe4,
+ 0x44, 0x92, 0xd1, 0x45, 0x55, 0xf0, 0x10, 0x86, 0xdc, 0x69, 0x6b, 0x40,
+ 0xe9, 0xcb, 0x5c, 0x60, 0x1f, 0xc3, 0xd0, 0x60, 0x2c, 0x54, 0x6e, 0xb7,
+ 0x05, 0xfd, 0x55, 0xd4, 0x7b, 0x49, 0xff, 0x4c, 0x6d, 0xc3, 0x40, 0x7b,
+ 0x45, 0xee, 0x27, 0x6b, 0xfb, 0xfb, 0x3b, 0x6b, 0x71, 0xaf, 0x1d, 0xee,
+ 0x50, 0x82, 0x45, 0xda, 0xdf, 0xdf, 0xa6, 0x87, 0x38, 0x39, 0x31, 0xbb,
+ 0x97, 0x9a, 0x70, 0x7c, 0xc7, 0x2d, 0xe9, 0xd0, 0xec, 0xdd, 0x87, 0xf1,
+ 0xf8, 0xe4, 0xc3, 0xd7, 0x07, 0x87, 0xdf, 0x1d, 0xbd, 0x7d, 0x95, 0xbc,
+ 0xf4, 0x32, 0xeb, 0xbf, 0x0c, 0xb5, 0xdf, 0x87, 0x8a, 0x7b, 0xd6, 0x34,
+ 0xa5, 0x7f, 0x6d, 0xd0, 0x45, 0x3c, 0xcb, 0xbb, 0xd2, 0x8b, 0x73, 0xdb,
+ 0xa5, 0xc8, 0x24, 0x69, 0x0d, 0x83, 0x0a, 0x1c, 0xd4, 0x3b, 0x90, 0x0a,
+ 0xed, 0x4d, 0x49, 0xb4, 0xe0, 0x55, 0x25, 0xc2, 0x56, 0x70, 0xa8, 0xce,
+ 0x94, 0x59, 0xf7, 0x15, 0xd4, 0x20, 0xea, 0x69, 0xac, 0xd0, 0x04, 0x9c,
+ 0x78, 0x76, 0x19, 0xab, 0xb1, 0xf2, 0x5c, 0x15, 0xfa, 0xf1, 0xa4, 0xd5,
+ 0x69, 0x50, 0x93, 0xf4, 0xc8, 0x3b, 0xf1, 0x11, 0xb0, 0x07, 0x8a, 0xa4,
+ 0x94, 0x44, 0xba, 0xa1, 0x49, 0x25, 0x2c, 0x6d, 0x41, 0xea, 0x16, 0x9d,
+ 0x0a, 0x20, 0xa0, 0x99, 0xcb, 0xc0, 0x43, 0xa5, 0xe2, 0xab, 0xb5, 0x49,
+ 0xef, 0x9d, 0xf0, 0x8a, 0xa3, 0x33, 0xb9, 0x8d, 0xfc, 0x8f, 0x93, 0xd3,
+ 0x6f, 0x5e, 0x1d, 0xbf, 0x4b, 0x5e, 0xb6, 0x71, 0x1a, 0x23, 0x5b, 0x18,
+ 0xdd, 0xc3, 0x76, 0x0d, 0xd0, 0xc0, 0xa2, 0x42, 0x35, 0x1d, 0xb1, 0x1c,
+ 0x74, 0x0d, 0x72, 0x2a, 0x5d, 0x2a, 0xf9, 0x34, 0x6e, 0x02, 0x9d, 0x05,
+ 0x91, 0x24, 0x98, 0x2e, 0x27, 0x86, 0xb9, 0xff, 0x3a, 0x2b, 0xaf, 0xea,
+ 0x88, 0x13, 0x81, 0x19, 0xc5, 0x0e, 0x30, 0xb0, 0x78, 0x0d, 0x6c, 0xc0,
+ 0xb0, 0x88, 0xa0, 0x3f, 0xa7, 0x92, 0xb4, 0x8e, 0xc8, 0x59, 0x46, 0x78,
+ 0x1a, 0xb1, 0x10, 0x83, 0x17, 0x5f, 0xcd, 0xa7, 0xc9, 0x86, 0xa1, 0xf7,
+ 0x75, 0x76, 0xb7, 0x39, 0x4a, 0x5e, 0x95, 0x64, 0x1c, 0xf8, 0x89, 0x1d,
+ 0x75, 0xa6, 0x58, 0x7b, 0x8a, 0xe3, 0x64, 0xce, 0x71, 0x00, 0x1e, 0x9d,
+ 0xe2, 0x2e, 0x44, 0x89, 0xce, 0x28, 0xf9, 0x01, 0xdd, 0x60, 0x40, 0xbc,
+ 0x8b, 0xd2, 0xfc, 0x41, 0x18, 0xea, 0x91, 0x92, 0x14, 0x73, 0x14, 0xbe,
+ 0x3b, 0xfa, 0x93, 0xd9, 0x1c, 0xb2, 0x23, 0x18, 0xb4, 0xb4, 0x77, 0x63,
+ 0x18, 0xb3, 0x25, 0x6b, 0x02, 0xaa, 0x77, 0xe8, 0x6c, 0x07, 0xf1, 0x40,
+ 0x49, 0x82, 0xc8, 0x02, 0x9d, 0x20, 0x46, 0x95, 0x9f, 0x54, 0xa4, 0x10,
+ 0xc1, 0x57, 0x62, 0x2e, 0x5f, 0x8f, 0x2a, 0x92, 0x54, 0x93, 0x36, 0x92,
+ 0xee, 0x7e, 0x8d, 0x12, 0x6d, 0x70, 0x73, 0xa8, 0x68, 0x70, 0xc5, 0x1c,
+ 0x17, 0x32, 0x93, 0xda, 0x91, 0xce, 0xee, 0xff, 0x96, 0xd9, 0xae, 0x28,
+ 0x4d, 0x95, 0x5e, 0x92, 0x16, 0x65, 0x06, 0xa4, 0x02, 0x62, 0xf6, 0x63,
+ 0xf0, 0xe6, 0x51, 0x13, 0xd5, 0x6e, 0x16, 0x32, 0x20, 0xb0, 0x30, 0x04,
+ 0x07, 0x00, 0xa8, 0x4e, 0x44, 0xf1, 0xdc, 0x7e, 0x20, 0x00, 0xf4, 0xeb,
+ 0xb4, 0xfa, 0x28, 0x5e, 0x80, 0x5b, 0x47, 0x68, 0xce, 0xda, 0x9f, 0x85,
+ 0xc0, 0x93, 0xb7, 0xe0, 0x12, 0x20, 0xb7, 0xeb, 0x16, 0xec, 0x6b, 0xe7,
+ 0x9c, 0x01, 0xaa, 0x70, 0x8d, 0x84, 0x9e, 0x0d, 0x92, 0xaf, 0x4b, 0x92,
+ 0xc8, 0xf8, 0x21, 0x37, 0xd3, 0x19, 0x24, 0x6f, 0xc7, 0xe3, 0x48, 0xa5,
+ 0xfd, 0x6d, 0x39, 0xbb, 0x34, 0x8f, 0x99, 0x7d, 0x64, 0x75, 0xcf, 0xfc,
+ 0x79, 0x7e, 0x7a, 0x78, 0x7a, 0x62, 0xfe, 0x72, 0xf4, 0xfa, 0xf8, 0x47,
+ 0x67, 0x11, 0x32, 0xce, 0x5a, 0xab, 0xd4, 0x18, 0xf0, 0xe1, 0xcf, 0x07,
+ 0xbe, 0x0a, 0xca, 0x25, 0x12, 0x54, 0x1d, 0x81, 0x7b, 0x2d, 0xd0, 0x4e,
+ 0xac, 0xa6, 0xec, 0xe9, 0xb8, 0x00, 0x49, 0xca, 0xef, 0x7c, 0x18, 0x3d,
+ 0x4f, 0x5c, 0xc8, 0xc8, 0xb6, 0xcc, 0xc6, 0x71, 0x1c, 0x71, 0x92, 0xaf,
+ 0xe2, 0x4a, 0x97, 0x3c, 0xf7, 0xc9, 0x5c, 0x21, 0x61, 0x5a, 0x93, 0x33,
+ 0x52, 0x57, 0xba, 0x1a, 0xf1, 0x0f, 0x74, 0xb8, 0x4e, 0x3f, 0x48, 0x0f,
+ 0xe4, 0xdf, 0x88, 0x66, 0x7f, 0x91, 0xea, 0xe8, 0x30, 0xbc, 0x90, 0x41,
+ 0x23, 0xe6, 0x3a, 0x8d, 0xa2, 0x0d, 0x56, 0xd7, 0xd1, 0x06, 0x48, 0x0d,
+ 0x70, 0x23, 0xb6, 0xd7, 0x24, 0x04, 0x90, 0x8b, 0x15, 0xf9, 0x0c, 0xe4,
+ 0xc3, 0xf1, 0x90, 0x2a, 0x45, 0x53, 0x89, 0x03, 0x2f, 0x70, 0xc5, 0x37,
+ 0xfd, 0x07, 0xf9, 0xdf, 0x1c, 0xc1, 0x16, 0x6d, 0xfa, 0x1c, 0x72, 0x43,
+ 0x3a, 0x2d, 0xc2, 0x22, 0x90, 0xc4, 0x83, 0x45, 0xe8, 0x56, 0xa3, 0x3d,
+ 0x10, 0x47, 0x4f, 0xdb, 0xda, 0xac, 0xfb, 0x3e, 0x4d, 0xee, 0x49, 0xa1,
+ 0x81, 0xfb, 0x74, 0x50, 0xf1, 0x48, 0xa5, 0x3e, 0xf5, 0x93, 0x55, 0x63,
+ 0x90, 0x37, 0xe0, 0xaf, 0xcb, 0xfc, 0x26, 0x45, 0x95, 0xbe, 0xb9, 0xa6,
+ 0x86, 0x43, 0x7e, 0xa9, 0x33, 0x46, 0xfa, 0xab, 0x06, 0x49, 0xdb, 0xa3,
+ 0x3c, 0xfd, 0x35, 0x83, 0x3c, 0xed, 0x8c, 0x71, 0xfd, 0xab, 0x06, 0x19,
+ 0xaa, 0x71, 0xf0, 0xd9, 0x67, 0x47, 0x3f, 0x1e, 0x9f, 0x27, 0x87, 0xa7,
+ 0xaf, 0xdc, 0x01, 0x3b, 0x87, 0x85, 0x0a, 0x0e, 0x30, 0x17, 0x56, 0x61,
+ 0x78, 0x90, 0x1a, 0x99, 0xda, 0xae, 0x6c, 0x5c, 0x48, 0x41, 0x59, 0x29,
+ 0xb5, 0xd6, 0xfe, 0xe7, 0x15, 0x23, 0x6a, 0x52, 0x4e, 0x0c, 0x03, 0x82,
+ 0x7a, 0x68, 0x27, 0xf4, 0xf4, 0x9c, 0xf0, 0x3a, 0xaf, 0xd4, 0xf2, 0xa2,
+ 0x53, 0x49, 0x90, 0xcd, 0xe6, 0xa2, 0x17, 0x70, 0x8e, 0x8b, 0x94, 0x30,
+ 0x39, 0x0b, 0x46, 0x99, 0xa0, 0xc2, 0xee, 0xc6, 0xf9, 0x66, 0xcb, 0xcb,
+ 0x96, 0xe5, 0x24, 0xdd, 0xe8, 0x07, 0x52, 0xd3, 0x9f, 0x37, 0x3a, 0x15,
+ 0xbf, 0xd6, 0x61, 0x47, 0x0b, 0xbc, 0x5a, 0x9c, 0x2e, 0xbd, 0xa1, 0x21,
+ 0xe3, 0xe8, 0x26, 0x46, 0x16, 0x2d, 0x04, 0x89, 0xf4, 0xee, 0xa8, 0x5b,
+ 0x75, 0xed, 0x81, 0xb5, 0x66, 0x87, 0xb0, 0xdf, 0xd9, 0x95, 0x30, 0x72,
+ 0x9a, 0xcf, 0xd8, 0x67, 0x2c, 0x99, 0xef, 0xf9, 0xdf, 0x3c, 0xe7, 0xcc,
+ 0x9e, 0xb5, 0xc5, 0xcd, 0xca, 0x67, 0xc8, 0xf4, 0x99, 0xf2, 0x81, 0xa8,
+ 0xef, 0x8d, 0xb6, 0x79, 0x07, 0xcd, 0x80, 0x7c, 0x67, 0x82, 0x4a, 0xea,
+ 0xde, 0x7c, 0xa2, 0x29, 0xc5, 0x16, 0xfe, 0x14, 0xbd, 0x6b, 0x17, 0xed,
+ 0x4c, 0x00, 0xe7, 0xb1, 0x56, 0xb4, 0x19, 0xb9, 0xa4, 0xf3, 0x0a, 0x95,
+ 0xea, 0xc3, 0xcf, 0x62, 0x09, 0xab, 0xfa, 0x51, 0x85, 0xae, 0x91, 0xc6,
+ 0x31, 0x5e, 0x8f, 0x6f, 0x8b, 0x59, 0x49, 0x57, 0x36, 0xe8, 0x35, 0xe4,
+ 0x06, 0xa7, 0x1d, 0xbb, 0xc2, 0xc7, 0xb2, 0xd0, 0x2b, 0x73, 0x5a, 0x82,
+ 0x80, 0x03, 0xc1, 0x9e, 0x2b, 0x2f, 0x52, 0x82, 0xcd, 0x42, 0x5f, 0xf1,
+ 0xb4, 0x60, 0xcc, 0x06, 0xdd, 0x81, 0x38, 0x7a, 0x81, 0xab, 0xd9, 0x7e,
+ 0x2a, 0x7a, 0xb3, 0x5a, 0xeb, 0x52, 0x7a, 0xef, 0x0b, 0x16, 0x36, 0x30,
+ 0xc4, 0xb3, 0x45, 0xa6, 0xcd, 0x04, 0xf6, 0x07, 0xd6, 0x07, 0x01, 0x19,
+ 0x12, 0xa1, 0xee, 0xc4, 0xb7, 0x9e, 0xf5, 0x7c, 0x85, 0x91, 0x49, 0xdd,
+ 0x47, 0xfc, 0x78, 0xac, 0x92, 0x50, 0x9e, 0xf5, 0x46, 0x7b, 0xde, 0xe5,
+ 0x0b, 0x2f, 0xaa, 0x8b, 0x11, 0xed, 0x93, 0x9f, 0x8b, 0x1f, 0x3a, 0x23,
+ 0xf8, 0x07, 0x71, 0x9c, 0x18, 0x4b, 0x64, 0x26, 0x2b, 0x93, 0x9f, 0x20,
+ 0x69, 0x08, 0x9e, 0x64, 0x50, 0x79, 0xa2, 0xb3, 0x34, 0x2a, 0xb3, 0xef,
+ 0x06, 0x7c, 0x21, 0x9f, 0xa5, 0xbc, 0x65, 0x36, 0x1b, 0x81, 0x60, 0x96,
+ 0x5b, 0x7e, 0xe3, 0xd1, 0xf8, 0x47, 0x54, 0x82, 0x61, 0x2e, 0xa6, 0xd2,
+ 0xfe, 0x5b, 0xde, 0x08, 0x00, 0x9b, 0x3b, 0x61, 0x44, 0x5a, 0xed, 0xb2,
+ 0x62, 0xf8, 0x13, 0xa7, 0x79, 0x6a, 0x93, 0x20, 0x5e, 0x2e, 0xa9, 0x24,
+ 0x04, 0x66, 0x9b, 0xbc, 0x29, 0x03, 0x10, 0xf5, 0xf2, 0xb2, 0x11, 0x08,
+ 0x5b, 0x6e, 0x56, 0xcc, 0xf4, 0x31, 0x96, 0xc7, 0x95, 0x28, 0x5b, 0x1e,
+ 0xca, 0x3a, 0x37, 0xba, 0xe6, 0xeb, 0xd0, 0x9c, 0x75, 0x38, 0xf8, 0x23,
+ 0xb3, 0xeb, 0xf6, 0xf1, 0xd9, 0xd9, 0xb6, 0x74, 0xe0, 0x1e, 0xb6, 0x80,
+ 0xda, 0x22, 0x2a, 0xfc, 0x00, 0x60, 0xed, 0xdb, 0x14, 0x32, 0xc4, 0xe2,
+ 0x57, 0x38, 0x87, 0x95, 0x0d, 0xf1, 0x93, 0x52, 0x13, 0x56, 0x72, 0x15,
+ 0xb8, 0x5e, 0x53, 0x8e, 0xa8, 0x70, 0x31, 0x0a, 0x17, 0x7c, 0xcb, 0x75,
+ 0x35, 0x80, 0x33, 0xd7, 0x0a, 0x48, 0xce, 0xb1, 0x81, 0xec, 0xbd, 0xc9,
+ 0x62, 0x00, 0x64, 0x0a, 0xbf, 0xea, 0xe9, 0xcd, 0x0e, 0x7e, 0xcd, 0x5b,
+ 0xcf, 0x8e, 0x5d, 0xcf, 0x2d, 0x18, 0xe5, 0xec, 0x60, 0x3c, 0x56, 0x36,
+ 0x39, 0x0c, 0x39, 0x42, 0x32, 0x07, 0x08, 0x16, 0x4c, 0xc1, 0x3f, 0x23,
+ 0x16, 0x8d, 0x0c, 0xd2, 0x49, 0x30, 0xdb, 0x61, 0x99, 0xf6, 0x8a, 0x05,
+ 0x33, 0xb4, 0x09, 0x59, 0x2f, 0xf3, 0x95, 0xae, 0xf8, 0x76, 0x35, 0x25,
+ 0xe3, 0x86, 0x01, 0x27, 0xab, 0x10, 0x9d, 0x01, 0xec, 0xa2, 0x32, 0x1e,
+ 0x6e, 0x81, 0xbb, 0x45, 0xde, 0x6a, 0x27, 0xbe, 0xb3, 0x17, 0x2e, 0xfa,
+ 0x7b, 0x5e, 0xd5, 0xe0, 0x1f, 0x5a, 0xf4, 0xf7, 0x91, 0x45, 0x3f, 0x71,
+ 0x07, 0x87, 0x3f, 0x96, 0xec, 0xee, 0x3e, 0xd7, 0x02, 0x53, 0xc3, 0xc7,
+ 0xf8, 0x9e, 0xfb, 0xa0, 0xf7, 0x45, 0xf3, 0xdc, 0x10, 0xd9, 0xe9, 0x11,
+ 0xc7, 0x80, 0x3b, 0xbc, 0xde, 0xa7, 0x9e, 0xda, 0x4f, 0x19, 0xc3, 0x87,
+ 0xbc, 0x8f, 0xc6, 0xfc, 0x60, 0x29, 0x13, 0x08, 0x1f, 0x75, 0xe3, 0x91,
+ 0x0b, 0xe6, 0x96, 0x32, 0x81, 0x1b, 0xab, 0x4b, 0x76, 0x3e, 0xa5, 0xb3,
+ 0xf0, 0xbe, 0xf3, 0xcc, 0xba, 0xd0, 0xb7, 0x76, 0x35, 0x79, 0xea, 0x00,
+ 0xb2, 0x78, 0x96, 0xcd, 0xb9, 0xcf, 0x58, 0x46, 0xb0, 0x87, 0x2e, 0xf4,
+ 0xc3, 0xa0, 0x16, 0x97, 0x55, 0x8a, 0xa6, 0x21, 0xb3, 0xf4, 0x3e, 0x82,
+ 0xcc, 0x2a, 0x51, 0x42, 0x76, 0x55, 0xa5, 0x34, 0xfb, 0x82, 0xbc, 0x32,
+ 0xd0, 0x04, 0xc4, 0xfc, 0x27, 0x07, 0x02, 0xed, 0x68, 0x79, 0x69, 0xc3,
+ 0x74, 0xf2, 0xd5, 0x00, 0x58, 0xa9, 0x96, 0xde, 0xe2, 0x7c, 0x64, 0x44,
+ 0x4b, 0x88, 0x43, 0x1c, 0xef, 0x3c, 0x77, 0x5b, 0x64, 0xf7, 0x81, 0x4c,
+ 0x37, 0x86, 0x5b, 0xf3, 0xa8, 0xa7, 0xb2, 0x44, 0x63, 0xc1, 0x52, 0xe6,
+ 0x41, 0x19, 0x1a, 0x79, 0xe8, 0x31, 0xad, 0x3c, 0x05, 0x71, 0x87, 0xa5,
+ 0xf1, 0x19, 0x09, 0x3b, 0xe9, 0x1b, 0x31, 0x4a, 0x4e, 0x11, 0x81, 0x69,
+ 0x75, 0xca, 0x61, 0xe3, 0x2d, 0x75, 0xe0, 0x12, 0x6d, 0xc6, 0x7d, 0xe1,
+ 0x76, 0x58, 0xe7, 0xa4, 0x89, 0x8f, 0x5b, 0x2a, 0x64, 0xed, 0x85, 0xa2,
+ 0x91, 0xc6, 0x2c, 0x79, 0x77, 0x74, 0xfe, 0x0e, 0x39, 0x3e, 0x10, 0x00,
+ 0x81, 0xc9, 0x95, 0x56, 0x9b, 0x16, 0x6e, 0x51, 0xc4, 0x99, 0xd3, 0x43,
+ 0x9c, 0x80, 0x60, 0xb0, 0x5b, 0xbb, 0xdf, 0xfc, 0x4f, 0x7d, 0x8f, 0xeb,
+ 0x73, 0x33, 0xad, 0x86, 0x75, 0xd1, 0xfc, 0x36, 0x0c, 0xef, 0xee, 0xae,
+ 0xcb, 0x40, 0x45, 0x8f, 0x77, 0xb9, 0xe6, 0xa4, 0xd8, 0x6d, 0x24, 0x99,
+ 0x8d, 0x5a, 0x20, 0xaa, 0xde, 0x0d, 0x7a, 0x88, 0x33, 0xa0, 0xcb, 0x2a,
+ 0x72, 0xe5, 0xca, 0xa7, 0xf5, 0xfe, 0xe7, 0x29, 0x58, 0x2b, 0x53, 0xbe,
+ 0xc6, 0x3f, 0x65, 0xe9, 0x29, 0x7d, 0x0f, 0x92, 0x27, 0xdb, 0xdb, 0x91,
+ 0xa2, 0xa4, 0xf4, 0xc2, 0x08, 0x55, 0xd1, 0xe6, 0xa4, 0xee, 0x18, 0x6f,
+ 0x71, 0xc4, 0x0c, 0xea, 0x65, 0x4d, 0xa6, 0xc6, 0xf0, 0x92, 0x42, 0x58,
+ 0x44, 0xb1, 0xd0, 0xa8, 0xd8, 0x65, 0x19, 0xf3, 0x03, 0x0a, 0xa1, 0x95,
+ 0x68, 0x1d, 0xe1, 0xc2, 0x55, 0xd2, 0xb8, 0x7c, 0x3d, 0x9f, 0x0b, 0x7c,
+ 0x17, 0x1c, 0xfb, 0x0c, 0x66, 0x16, 0xc8, 0xef, 0xdd, 0xa7, 0x21, 0x47,
+ 0x8c, 0xcf, 0x4f, 0xdf, 0x09, 0x87, 0x85, 0x57, 0x33, 0x53, 0x04, 0x8f,
+ 0x38, 0xd0, 0xba, 0x41, 0x08, 0x5e, 0x38, 0xb5, 0xa8, 0x29, 0x16, 0x8c,
+ 0xdf, 0xfb, 0x2a, 0x4b, 0x00, 0x34, 0x96, 0x96, 0xa5, 0x7d, 0x2f, 0x58,
+ 0x11, 0xda, 0x76, 0x42, 0xcf, 0xa5, 0xf7, 0x12, 0x1f, 0xb3, 0x53, 0x3e,
+ 0xbf, 0x8c, 0xbe, 0x43, 0x7c, 0x24, 0x38, 0x3c, 0xd4, 0xb6, 0x42, 0x0a,
+ 0x3b, 0x34, 0xf1, 0x39, 0xe0, 0x45, 0x3e, 0x44, 0xa7, 0xae, 0xb3, 0x08,
+ 0x4b, 0x78, 0x59, 0xa7, 0xb5, 0x8a, 0xe9, 0xc7, 0x48, 0xad, 0xe4, 0xce,
+ 0x1b, 0x92, 0xd4, 0x9a, 0x72, 0x1c, 0x64, 0x12, 0x74, 0x27, 0x2a, 0xab,
+ 0xa9, 0xa4, 0x2e, 0xca, 0xc5, 0xa9, 0xc6, 0x82, 0xd3, 0xb3, 0xdd, 0xad,
+ 0x7f, 0x76, 0xfa, 0xee, 0xdc, 0xde, 0xf9, 0xf4, 0x59, 0xfc, 0xa0, 0x73,
+ 0x7a, 0xa8, 0xd6, 0x48, 0x0a, 0xb3, 0xe5, 0x66, 0xa3, 0x2d, 0x08, 0x82,
+ 0x51, 0x62, 0x13, 0xf0, 0x96, 0x60, 0x1c, 0x1d, 0x68, 0x80, 0xfe, 0xd3,
+ 0xd3, 0x92, 0x5d, 0x90, 0x56, 0xde, 0xb0, 0x13, 0x06, 0x17, 0x4d, 0x0f,
+ 0xc6, 0xaa, 0x53, 0x6e, 0xf7, 0x76, 0x42, 0xce, 0x20, 0x1b, 0xfa, 0xdd,
+ 0xd1, 0xf8, 0x9c, 0x67, 0x4e, 0x7f, 0x0b, 0x66, 0xce, 0x40, 0x2d, 0xf2,
+ 0xc3, 0x30, 0x80, 0x66, 0x39, 0x83, 0xb2, 0x8f, 0xc9, 0x77, 0x47, 0xe3,
+ 0x47, 0xda, 0x0b, 0xee, 0xed, 0x79, 0x99, 0xe6, 0x10, 0x9a, 0xc2, 0x27,
+ 0x38, 0xdf, 0xf8, 0xc1, 0x9a, 0x7c, 0x65, 0xcd, 0xa8, 0x65, 0x53, 0x6d,
+ 0x78, 0xeb, 0x8d, 0xf0, 0xc4, 0x8d, 0xb0, 0xa0, 0x9b, 0x4a, 0x06, 0x38,
+ 0x66, 0xd4, 0xa0, 0x19, 0x7e, 0x38, 0x54, 0x56, 0xc1, 0x65, 0xc1, 0x4c,
+ 0xc1, 0xcf, 0xb9, 0x71, 0x9e, 0xaa, 0xef, 0xce, 0xaa, 0x0a, 0xde, 0x54,
+ 0xe8, 0xc7, 0x9a, 0xee, 0x09, 0x6d, 0xa3, 0xc3, 0x72, 0x7b, 0xcc, 0xe9,
+ 0x5f, 0xa7, 0x28, 0x56, 0x97, 0x94, 0x75, 0x5e, 0xbb, 0x7f, 0x2f, 0x18,
+ 0x65, 0x2b, 0x2f, 0x96, 0x0c, 0xc3, 0x9d, 0x56, 0x33, 0x6a, 0x59, 0x66,
+ 0x84, 0x08, 0xac, 0x43, 0x7a, 0x2b, 0xd6, 0x5d, 0xc5, 0xfb, 0x86, 0xdc,
+ 0x3f, 0xe4, 0x54, 0x9c, 0xb8, 0x8b, 0x3a, 0x9d, 0xca, 0x21, 0x76, 0xba,
+ 0xbe, 0x39, 0xb0, 0x85, 0xbd, 0x26, 0x46, 0xc9, 0x59, 0x56, 0xa1, 0x9f,
+ 0x82, 0xe1, 0xd5, 0x7f, 0x73, 0xa3, 0xf1, 0x21, 0x41, 0xf4, 0xd5, 0x5c,
+ 0x9b, 0x24, 0x39, 0xcd, 0x3d, 0x66, 0x76, 0x16, 0x3f, 0xa1, 0xbf, 0x7a,
+ 0xad, 0x79, 0x82, 0xe5, 0xbe, 0x70, 0x2f, 0xd7, 0x66, 0x25, 0xc6, 0x42,
+ 0xef, 0x3e, 0xf2, 0x44, 0xf8, 0xca, 0x98, 0xef, 0x18, 0xc2, 0x8a, 0x66,
+ 0x3a, 0xcb, 0xd2, 0xf3, 0x70, 0xca, 0x23, 0x5c, 0xea, 0x33, 0x2d, 0x11,
+ 0xee, 0x0d, 0xc5, 0x97, 0xc1, 0xc1, 0x85, 0x6d, 0x34, 0x49, 0x05, 0x22,
+ 0xa4, 0xc8, 0x99, 0xb1, 0x0a, 0x92, 0xb4, 0x33, 0x5b, 0x35, 0xe6, 0xe7,
+ 0xff, 0x80, 0xb4, 0x16, 0x76, 0xb3, 0x4b, 0xdc, 0xb4, 0x9d, 0x4b, 0xf0,
+ 0x84, 0x39, 0xd1, 0xb2, 0x8d, 0xbd, 0xbf, 0x5a, 0xb3, 0x93, 0xca, 0x14,
+ 0x81, 0x0f, 0x26, 0xa7, 0x01, 0xc5, 0x82, 0xcd, 0xfd, 0xee, 0x2b, 0xff,
+ 0x4f, 0x9e, 0xba, 0xa1, 0x2e, 0x09, 0x75, 0xc2, 0xca, 0xf5, 0x83, 0x96,
+ 0x53, 0xce, 0x36, 0x44, 0xcb, 0xed, 0x93, 0x6c, 0x36, 0x62, 0x33, 0x22,
+ 0x38, 0xba, 0x3e, 0x4d, 0x9e, 0x8b, 0xe9, 0x4b, 0xb6, 0x6f, 0x71, 0xef,
+ 0xca, 0xc8, 0x46, 0x9c, 0x51, 0xc4, 0x7e, 0x33, 0xee, 0xb7, 0x28, 0xbf,
+ 0x11, 0xcf, 0xf1, 0xb5, 0xf8, 0x65, 0xa8, 0x85, 0x6a, 0x80, 0x5d, 0xbd,
+ 0x9c, 0x4b, 0xfd, 0x86, 0xf7, 0xa5, 0xcf, 0xc5, 0x93, 0x21, 0x75, 0x41,
+ 0x8a, 0xf6, 0xe8, 0x2d, 0x84, 0x14, 0x5d, 0xb1, 0x9a, 0x6d, 0x9b, 0xd1,
+ 0x29, 0x4a, 0x0b, 0x6a, 0xdb, 0x52, 0x2a, 0x02, 0x30, 0x4e, 0x62, 0x56,
+ 0x94, 0x5d, 0xf5, 0x28, 0x94, 0x1e, 0x86, 0x28, 0xd1, 0x5b, 0x1e, 0xe3,
+ 0x5f, 0xad, 0x00, 0x61, 0xac, 0xb2, 0xbf, 0x40, 0x91, 0x1c, 0xf1, 0x65,
+ 0xc3, 0x65, 0xfe, 0xbc, 0xca, 0x62, 0x99, 0x7a, 0xb6, 0xfc, 0x93, 0x17,
+ 0xe2, 0xa1, 0x12, 0x37, 0x08, 0x65, 0x55, 0x15, 0x59, 0x13, 0xa4, 0x96,
+ 0x3c, 0xdd, 0xb1, 0xbe, 0x4a, 0x2a, 0x97, 0x90, 0x8a, 0x46, 0xbf, 0x68,
+ 0x82, 0xba, 0x78, 0x8c, 0xbf, 0x4d, 0xde, 0xbc, 0x7a, 0x4a, 0xc9, 0x9c,
+ 0x57, 0x59, 0xb5, 0xa8, 0x28, 0x81, 0x5f, 0x79, 0xf8, 0xf4, 0x3b, 0x6f,
+ 0xb0, 0x5d, 0x97, 0x79, 0xa7, 0x80, 0xcf, 0x22, 0xcc, 0xc4, 0x5e, 0x30,
+ 0x5b, 0x48, 0xe0, 0x2c, 0x57, 0x03, 0x09, 0xb4, 0x2b, 0x1e, 0xb2, 0xe2,
+ 0x7e, 0x42, 0x6b, 0xf9, 0xac, 0x5b, 0x10, 0xd4, 0x12, 0x60, 0x4f, 0xf7,
+ 0x9c, 0x00, 0xab, 0xee, 0x17, 0x70, 0xdf, 0x5f, 0x91, 0x59, 0x10, 0x39,
+ 0x51, 0x4f, 0x59, 0x68, 0x1e, 0xf2, 0xb9, 0x27, 0x1d, 0x36, 0x7c, 0x0d,
+ 0xea, 0x79, 0x27, 0xe2, 0xf4, 0xf4, 0xa9, 0xef, 0x55, 0xa8, 0xa5, 0xa7,
+ 0xaf, 0x36, 0xb8, 0x20, 0x0d, 0xc5, 0x7b, 0xf6, 0x99, 0x7d, 0x96, 0xfc,
+ 0x46, 0x88, 0x12, 0x68, 0x27, 0xce, 0x9e, 0x37, 0x44, 0xf9, 0x55, 0x03,
+ 0x41, 0x15, 0x33, 0xd6, 0x77, 0x3c, 0xda, 0x7b, 0xaf, 0xbc, 0x68, 0x3b,
+ 0x4d, 0xd0, 0xa2, 0xcb, 0x32, 0x26, 0x16, 0x95, 0x2f, 0xae, 0xfd, 0xc3,
+ 0xf9, 0x8c, 0xef, 0xe8, 0xb3, 0x6e, 0x0d, 0x8c, 0xca, 0xc0, 0xcc, 0x87,
+ 0x7f, 0xd2, 0xa3, 0xce, 0xac, 0x7f, 0x78, 0x90, 0xf4, 0x95, 0xb3, 0x82,
+ 0xd7, 0xbd, 0x8f, 0xec, 0xc8, 0x99, 0x31, 0x4b, 0x2e, 0xaf, 0x8a, 0xfc,
+ 0x6f, 0x99, 0x97, 0x07, 0xac, 0x5d, 0x54, 0xbd, 0xc7, 0x77, 0x45, 0x60,
+ 0xdc, 0xa4, 0xb3, 0x5c, 0x84, 0x22, 0x25, 0xce, 0xb8, 0x07, 0xf6, 0x84,
+ 0x6b, 0xb9, 0xeb, 0x31, 0xe7, 0xbd, 0x99, 0x51, 0x91, 0xb6, 0x95, 0xb5,
+ 0x4a, 0xaa, 0x9e, 0x3d, 0x11, 0x9d, 0x4b, 0x75, 0x63, 0xba, 0x79, 0x89,
+ 0x10, 0x33, 0x80, 0x5b, 0x77, 0xc5, 0xf4, 0x33, 0xb9, 0xf6, 0x64, 0x2b,
+ 0x6d, 0x27, 0x55, 0xdb, 0x95, 0x96, 0xfe, 0x7a, 0x9b, 0x17, 0x52, 0xe4,
+ 0x14, 0xbc, 0xfe, 0xac, 0xc7, 0xfd, 0x58, 0xf3, 0x9d, 0x79, 0x04, 0x5e,
+ 0xf2, 0x9e, 0x7f, 0xee, 0x4e, 0x42, 0x0b, 0x18, 0x5c, 0x51, 0xa1, 0x07,
+ 0x3e, 0xfa, 0xbb, 0x9e, 0x25, 0x76, 0xa1, 0x64, 0xdc, 0xb2, 0x2b, 0xd2,
+ 0x20, 0xe9, 0xd2, 0x7e, 0x7e, 0x56, 0x92, 0x34, 0xf5, 0xbe, 0xc7, 0x2c,
+ 0xf5, 0x1a, 0xd1, 0x33, 0x67, 0x1c, 0x14, 0xc9, 0xb9, 0x07, 0xe4, 0xe1,
+ 0x9e, 0x7e, 0x21, 0xbc, 0xa1, 0xf7, 0xa5, 0x35, 0x56, 0xfb, 0xde, 0x78,
+ 0xbe, 0xed, 0x2b, 0xab, 0x53, 0xca, 0xc8, 0x61, 0xa0, 0xa1, 0xde, 0x17,
+ 0x98, 0x33, 0x8e, 0xcd, 0x35, 0x72, 0x65, 0x98, 0x1a, 0xcf, 0x38, 0x50,
+ 0x68, 0xf7, 0xd8, 0x6e, 0x4b, 0xe8, 0x9e, 0xfb, 0xea, 0x53, 0x72, 0xfc,
+ 0xca, 0x7b, 0x70, 0xcf, 0x2d, 0x30, 0x9d, 0x91, 0x36, 0x70, 0xcf, 0x7e,
+ 0xaa, 0x3a, 0xd9, 0xa0, 0xb7, 0x3c, 0x24, 0xcf, 0xe7, 0xcc, 0x19, 0x6f,
+ 0x4b, 0x0e, 0xbb, 0x81, 0xfc, 0xc1, 0x33, 0xcc, 0x0e, 0x87, 0x16, 0xaf,
+ 0xd3, 0x61, 0x75, 0x06, 0x7b, 0xff, 0xfc, 0xd9, 0x8a, 0x67, 0xe5, 0xd2,
+ 0xac, 0xed, 0x55, 0xef, 0xbd, 0xf7, 0x3c, 0x3c, 0xe6, 0x6a, 0x0e, 0x68,
+ 0x89, 0x9a, 0x39, 0x6a, 0x74, 0xd2, 0x92, 0x0d, 0x02, 0x70, 0xf9, 0x37,
+ 0x75, 0x0c, 0x56, 0x84, 0xcc, 0x5c, 0xff, 0x9b, 0x3f, 0xdf, 0xcf, 0xfd,
+ 0x3a, 0x37, 0xf6, 0x0a, 0xa2, 0xcf, 0x08, 0xa5, 0x39, 0xfa, 0x5d, 0xcf,
+ 0x5c, 0x7e, 0x28, 0xa8, 0xe3, 0x8d, 0xc0, 0x7b, 0x6e, 0xf4, 0x88, 0x65,
+ 0xe1, 0x24, 0x07, 0x1b, 0x81, 0x82, 0x96, 0x34, 0xf5, 0x11, 0xbc, 0x49,
+ 0xe6, 0x8b, 0x07, 0xca, 0xf3, 0xa1, 0x6e, 0x77, 0x8e, 0x41, 0x7d, 0xbd,
+ 0x64, 0x93, 0xdb, 0xae, 0xc8, 0x39, 0xd8, 0xbc, 0xd7, 0x76, 0x9d, 0xf4,
+ 0xc2, 0xdc, 0xa0, 0x36, 0x1e, 0x9a, 0xd9, 0xb2, 0x4d, 0x6e, 0xdb, 0x60,
+ 0x01, 0xd3, 0xe5, 0xb6, 0x2a, 0x11, 0x17, 0x17, 0xc8, 0xb1, 0x8d, 0xb4,
+ 0x27, 0x2d, 0x5f, 0x0a, 0x88, 0xbc, 0xcf, 0x88, 0x6a, 0x43, 0xe9, 0xad,
+ 0x84, 0xc5, 0x9a, 0x4d, 0x3e, 0xea, 0x91, 0x91, 0x41, 0x5c, 0xd9, 0x91,
+ 0xf7, 0xd6, 0x13, 0x4b, 0x5a, 0x18, 0x34, 0xef, 0x8e, 0xba, 0x56, 0x80,
+ 0x7b, 0x94, 0xb9, 0xe6, 0xdd, 0xf9, 0xf8, 0x6c, 0x9f, 0xe6, 0xcc, 0x71,
+ 0x43, 0x73, 0x20, 0x0e, 0xc7, 0xd9, 0x5f, 0xa5, 0x62, 0xba, 0x76, 0x4f,
+ 0x3f, 0xeb, 0x79, 0x7a, 0x2c, 0x8e, 0xbd, 0x63, 0xf4, 0xbc, 0x30, 0xfb,
+ 0xe0, 0xbf, 0xc4, 0x4c, 0xb3, 0x2c, 0xd4, 0xbf, 0xcf, 0xfe, 0x2f, 0x9a,
+ 0x19, 0xa4, 0x21, 0xe5, 0x15, 0xb9, 0x87, 0x3f, 0x77, 0x36, 0xcd, 0xf5,
+ 0xb2, 0xf8, 0x68, 0xf5, 0x45, 0x41, 0x24, 0xd6, 0x0d, 0x76, 0x2f, 0xbc,
+ 0xd0, 0xa3, 0xe1, 0xf9, 0x41, 0x6d, 0xce, 0xeb, 0x40, 0x3c, 0x14, 0xe2,
+ 0x76, 0x94, 0x98, 0xa7, 0x91, 0xaf, 0x4b, 0x8f, 0x06, 0x2f, 0xb6, 0xed,
+ 0xf5, 0x2b, 0xc0, 0x8c, 0x1f, 0x91, 0x80, 0x23, 0x5c, 0xa7, 0xf9, 0x75,
+ 0x8b, 0xbc, 0x20, 0x17, 0x84, 0x7b, 0xc4, 0x0d, 0xb0, 0xd3, 0xba, 0x04,
+ 0xba, 0xea, 0x06, 0xc3, 0x50, 0x78, 0x9e, 0x76, 0xe6, 0x9d, 0x31, 0x45,
+ 0x1d, 0xe7, 0xc2, 0xaf, 0x79, 0xa1, 0xde, 0xb6, 0x8e, 0x0b, 0xcd, 0xbe,
+ 0xb4, 0xa7, 0xcc, 0x4e, 0xf8, 0xb2, 0x31, 0xcd, 0x96, 0x53, 0x06, 0xa0,
+ 0x74, 0x00, 0x56, 0x4d, 0xf4, 0x6c, 0x37, 0xc2, 0x13, 0x1d, 0xa1, 0x83,
+ 0x92, 0x68, 0x07, 0xb3, 0x1e, 0x9e, 0x34, 0xb0, 0xb1, 0x5e, 0x3c, 0xd5,
+ 0x68, 0x92, 0xca, 0x55, 0x46, 0xc4, 0xb1, 0x6e, 0x40, 0xdf, 0x0f, 0xb8,
+ 0xb5, 0x27, 0xb3, 0x0f, 0x5c, 0x7e, 0xdd, 0x86, 0x9b, 0xbf, 0xcc, 0x01,
+ 0xc8, 0x3e, 0x3f, 0x36, 0xa6, 0x99, 0x0b, 0xba, 0x80, 0x0a, 0x2b, 0x7c,
+ 0x80, 0x2f, 0x98, 0x77, 0x91, 0xf8, 0xe1, 0xf3, 0x8a, 0xd5, 0xf0, 0x39,
+ 0xa7, 0x91, 0x9d, 0x89, 0xdc, 0xff, 0x0c, 0x8d, 0xb0, 0x60, 0xb5, 0x50,
+ 0x83, 0x42, 0xba, 0x88, 0x03, 0xed, 0x81, 0x00, 0xc3, 0xef, 0x75, 0x08,
+ 0x8c, 0x9d, 0xdb, 0x6c, 0x56, 0x0e, 0x8b, 0x5b, 0x7b, 0x5a, 0x28, 0x13,
+ 0x31, 0xa5, 0x7f, 0xfc, 0x91, 0x75, 0x04, 0x4a, 0x02, 0xf1, 0x23, 0xa4,
+ 0xb6, 0x3f, 0xad, 0xb9, 0x50, 0x59, 0xad, 0xa4, 0xcd, 0x42, 0x2c, 0xaf,
+ 0xca, 0x66, 0x19, 0x41, 0xf2, 0xb3, 0x8d, 0x0b, 0xc1, 0x18, 0xcb, 0x8a,
+ 0x33, 0xd4, 0xe4, 0x78, 0x3c, 0x65, 0x77, 0x35, 0xdc, 0xd2, 0xec, 0x06,
+ 0x92, 0x84, 0x0c, 0x74, 0x33, 0x83, 0x83, 0xf7, 0xe7, 0xdf, 0x9e, 0xbe,
+ 0x1b, 0x27, 0x5b, 0x04, 0xac, 0x74, 0xfe, 0xee, 0xf8, 0xeb, 0xf7, 0xe7,
+ 0xe6, 0x9f, 0x3a, 0xd2, 0xab, 0xb4, 0xc8, 0x8d, 0xe6, 0x61, 0x58, 0x35,
+ 0x2b, 0x8c, 0x20, 0xb8, 0xd2, 0xc5, 0x71, 0x83, 0x0f, 0xc3, 0x45, 0x65,
+ 0xa5, 0x78, 0x7a, 0x94, 0x90, 0x52, 0xce, 0x5c, 0x96, 0x20, 0xa2, 0x13,
+ 0x94, 0xbb, 0x5f, 0x3a, 0xaf, 0x48, 0xde, 0x81, 0x84, 0xd2, 0x74, 0xdc,
+ 0xe4, 0xfc, 0xdb, 0x83, 0xb7, 0xdf, 0x8d, 0xb5, 0xc9, 0xe0, 0x0f, 0x3f,
+ 0xfc, 0xd0, 0x0d, 0xdc, 0xc3, 0x3e, 0xb9, 0x4e, 0xef, 0xee, 0x46, 0x75,
+ 0xf6, 0xd9, 0x67, 0xe3, 0xa3, 0xa3, 0xe4, 0xe0, 0x64, 0x7c, 0xaa, 0x4f,
+ 0x5d, 0x36, 0x8b, 0x8d, 0x9d, 0x4d, 0xa3, 0x80, 0x5f, 0x65, 0x8d, 0xf9,
+ 0xcb, 0x67, 0x9f, 0xfd, 0x7f, 0xe3, 0x30, 0x39, 0xb1, 0xc8, 0xc9, 0x02,
+ 0x00,
};
#define BUF_SIZE 0x10000
static voidpf zalloc_func(voidpf opaque, unsigned int items, unsigned int size)
diff --git a/src/tool_main.c b/src/tool_main.c
index ccf098e9..b6045467 100644
--- a/src/tool_main.c
+++ b/src/tool_main.c
@@ -322,11 +322,6 @@ int main(int argc, char *argv[])
/* Start our curl operation */
result = operate(&global, argc, argv);
-#ifdef __SYMBIAN32__
- if(global.showerror)
- tool_pressanykey();
-#endif
-
/* Perform the main cleanup */
main_free(&global);
}
diff --git a/src/tool_operate.c b/src/tool_operate.c
index ad4e85dd..e3fec0b4 100644
--- a/src/tool_operate.c
+++ b/src/tool_operate.c
@@ -320,8 +320,10 @@ static CURLcode pre_transfer(struct GlobalConfig *global,
if(S_ISREG(fileinfo.st_mode))
uploadfilesize = fileinfo.st_size;
- if(uploadfilesize != -1)
+ if(uploadfilesize != -1) {
+ struct OperationConfig *config = per->config; /* for the macro below */
my_setopt(per->curl, CURLOPT_INFILESIZE_LARGE, uploadfilesize);
+ }
per->input.fd = per->infd;
}
return result;
@@ -333,7 +335,8 @@ static CURLcode pre_transfer(struct GlobalConfig *global,
static CURLcode post_per_transfer(struct GlobalConfig *global,
struct per_transfer *per,
CURLcode result,
- bool *retryp)
+ bool *retryp,
+ long *delay) /* milliseconds! */
{
struct OutStruct *outs = &per->outs;
CURL *curl = per->curl;
@@ -343,6 +346,7 @@ static CURLcode post_per_transfer(struct GlobalConfig *global,
return result;
*retryp = FALSE;
+ *delay = 0; /* for no retry, keep it zero */
if(per->infdopen)
close(per->infd);
@@ -512,10 +516,10 @@ static CURLcode post_per_transfer(struct GlobalConfig *global,
static const char * const m[]={
NULL,
"(retrying all errors)",
- "timeout",
- "connection refused",
- "HTTP error",
- "FTP error"
+ ": timeout",
+ ": connection refused",
+ ": HTTP error",
+ ": FTP error"
};
sleeptime = per->retry_sleep;
@@ -529,13 +533,12 @@ static CURLcode post_per_transfer(struct GlobalConfig *global,
sleeptime = (long)retry_after * 1000; /* milliseconds */
}
}
- warnf(config->global, "Transient problem: %s "
+ warnf(config->global, "Problem %s. "
"Will retry in %ld seconds. "
"%ld retries left.\n",
m[retry], sleeptime/1000L, per->retry_numretries);
per->retry_numretries--;
- tool_go_sleep(sleeptime);
if(!config->retry_delay) {
per->retry_sleep *= 2;
if(per->retry_sleep > RETRY_SLEEP_MAX)
@@ -578,7 +581,8 @@ static CURLcode post_per_transfer(struct GlobalConfig *global,
}
outs->bytes = 0; /* clear for next round */
}
- *retryp = TRUE; /* curl_easy_perform loop */
+ *retryp = TRUE;
+ *delay = sleeptime;
return CURLE_OK;
}
} /* if retry_numretries */
@@ -620,7 +624,7 @@ static CURLcode post_per_transfer(struct GlobalConfig *global,
fputs("\n", per->progressbar.out);
if(config->writeout)
- ourWriteOut(per->curl, &per->outs, config->writeout);
+ ourWriteOut(per->curl, per, config->writeout);
/* Close the outs file */
if(outs->fopened && outs->stream) {
@@ -922,7 +926,7 @@ static CURLcode single_transfer(struct GlobalConfig *global,
if((PARAM_OK == file2string(&etag_from_file, file)) &&
etag_from_file) {
- header = aprintf("If-None-Match: \"%s\"", etag_from_file);
+ header = aprintf("If-None-Match: %s", etag_from_file);
Curl_safefree(etag_from_file);
}
else
@@ -1050,6 +1054,15 @@ static CURLcode single_transfer(struct GlobalConfig *global,
}
}
+ if(config->output_dir) {
+ char *d = aprintf("%s/%s", config->output_dir, per->outfile);
+ if(!d) {
+ result = CURLE_WRITE_ERROR;
+ break;
+ }
+ free(per->outfile);
+ per->outfile = d;
+ }
/* Create the directory hierarchy, if not pre-existent to a multiple
file output call */
@@ -1511,6 +1524,9 @@ static CURLcode single_transfer(struct GlobalConfig *global,
if(config->pinnedpubkey)
my_setopt_str(curl, CURLOPT_PINNEDPUBLICKEY, config->pinnedpubkey);
+ if(config->ssl_ec_curves)
+ my_setopt_str(curl, CURLOPT_SSL_EC_CURVES, config->ssl_ec_curves);
+
if(curlinfo->features & CURL_VERSION_SSL) {
/* Check if config->cert is a PKCS#11 URI and set the
* config->cert_type if necessary */
@@ -1696,7 +1712,7 @@ static CURLcode single_transfer(struct GlobalConfig *global,
char *home;
char *file;
result = CURLE_FAILED_INIT;
- home = homedir();
+ home = homedir(NULL);
if(home) {
file = aprintf("%s/.ssh/known_hosts", home);
if(file) {
@@ -1839,12 +1855,7 @@ static CURLcode single_transfer(struct GlobalConfig *global,
my_setopt(curl, CURLOPT_MAXFILESIZE_LARGE,
config->max_filesize);
- if(4 == config->ip_version)
- my_setopt(curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
- else if(6 == config->ip_version)
- my_setopt(curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V6);
- else
- my_setopt(curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_WHATEVER);
+ my_setopt(curl, CURLOPT_IPRESOLVE, config->ip_version);
/* new in curl 7.15.5 */
if(config->ftp_ssl_reqd)
@@ -2140,6 +2151,7 @@ static CURLcode add_parallel_transfers(struct GlobalConfig *global,
struct per_transfer *per;
CURLcode result = CURLE_OK;
CURLMcode mcode;
+ bool sleeping = FALSE;
*addedp = FALSE;
*morep = FALSE;
result = create_transfer(global, share, addedp);
@@ -2151,6 +2163,11 @@ static CURLcode add_parallel_transfers(struct GlobalConfig *global,
if(per->added)
/* already added */
continue;
+ if(per->startat && (time(NULL) < per->startat)) {
+ /* this is still delaying */
+ sleeping = TRUE;
+ continue;
+ }
result = pre_transfer(global, per);
if(result)
@@ -2175,7 +2192,7 @@ static CURLcode add_parallel_transfers(struct GlobalConfig *global,
all_added++;
*addedp = TRUE;
}
- *morep = per ? TRUE : FALSE;
+ *morep = (per || sleeping) ? TRUE : FALSE;
return CURLE_OK;
}
@@ -2189,6 +2206,7 @@ static CURLcode parallel_transfers(struct GlobalConfig *global,
struct timeval start = tvnow();
bool more_transfers;
bool added_transfers;
+ time_t tick = time(NULL);
multi = curl_multi_init();
if(!multi)
@@ -2211,27 +2229,39 @@ static CURLcode parallel_transfers(struct GlobalConfig *global,
if(!mcode) {
int rc;
CURLMsg *msg;
- bool removed = FALSE;
+ bool checkmore = FALSE;
do {
msg = curl_multi_info_read(multi, &rc);
if(msg) {
bool retry;
+ long delay;
struct per_transfer *ended;
CURL *easy = msg->easy_handle;
result = msg->data.result;
curl_easy_getinfo(easy, CURLINFO_PRIVATE, (void *)&ended);
curl_multi_remove_handle(multi, easy);
- result = post_per_transfer(global, ended, result, &retry);
- if(retry)
- continue;
+ result = post_per_transfer(global, ended, result, &retry, &delay);
progress_finalize(ended); /* before it goes away */
all_added--; /* one fewer added */
- removed = TRUE;
- (void)del_per_transfer(ended);
+ checkmore = TRUE;
+ if(retry) {
+ ended->added = FALSE; /* add it again */
+ /* we delay retries in full integer seconds only */
+ ended->startat = delay ? time(NULL) + delay/1000 : 0;
+ }
+ else
+ (void)del_per_transfer(ended);
}
} while(msg);
- if(removed) {
+ if(!checkmore) {
+ time_t tock = time(NULL);
+ if(tick != tock) {
+ checkmore = TRUE;
+ tick = tock;
+ }
+ }
+ if(checkmore) {
/* one or more transfers completed, add more! */
(void)add_parallel_transfers(global, multi, share,
&more_transfers,
@@ -2271,6 +2301,7 @@ static CURLcode serial_transfers(struct GlobalConfig *global,
return result;
for(per = transfers; per;) {
bool retry;
+ long delay;
bool bailout = FALSE;
result = pre_transfer(global, per);
if(result)
@@ -2293,9 +2324,11 @@ static CURLcode serial_transfers(struct GlobalConfig *global,
/* store the result of the actual transfer */
returncode = result;
- result = post_per_transfer(global, per, result, &retry);
- if(retry)
+ result = post_per_transfer(global, per, result, &retry, &delay);
+ if(retry) {
+ tool_go_sleep(delay);
continue;
+ }
/* Bail out upon critical errors or --fail-early */
if(result || is_fatal_error(returncode) ||
@@ -2470,7 +2503,8 @@ static CURLcode run_all_transfers(struct GlobalConfig *global,
/* cleanup if there are any left */
for(per = transfers; per;) {
bool retry;
- CURLcode result2 = post_per_transfer(global, per, result, &retry);
+ long delay;
+ CURLcode result2 = post_per_transfer(global, per, result, &retry, &delay);
if(!result)
/* don't overwrite the original error */
result = result2;
@@ -2524,7 +2558,7 @@ CURLcode operate(struct GlobalConfig *global, int argc, argv_item_t argv[])
/* Check if we were asked for the help */
if(res == PARAM_HELP_REQUESTED)
- tool_help();
+ tool_help(global->help_category);
/* Check if we were asked for the manual */
else if(res == PARAM_MANUAL_REQUESTED)
hugehelp();
diff --git a/src/tool_operate.h b/src/tool_operate.h
index 0fa5adee..6cb3bd03 100644
--- a/src/tool_operate.h
+++ b/src/tool_operate.h
@@ -51,9 +51,14 @@ struct per_transfer {
struct OutStruct etag_save;
struct InStruct input;
struct HdrCbData hdrcbdata;
+ long num_headers;
+ bool was_last_header_empty;
char errorbuffer[CURL_ERROR_SIZE];
bool added; /* set TRUE when added to the multi handle */
+ time_t startat; /* when doing parallel transfers, this is a retry transfer
+ that has been set to sleep until this time before it
+ should get started (again) */
/* for parallel progress bar */
curl_off_t dltotal;
diff --git a/src/tool_panykey.c b/src/tool_panykey.c
index 7c519028..e7ee9951 100644
--- a/src/tool_panykey.c
+++ b/src/tool_panykey.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -21,7 +21,7 @@
***************************************************************************/
#include "tool_setup.h"
-#if defined(__SYMBIAN32__) || defined(NETWARE)
+#if defined(NETWARE)
#ifdef NETWARE
# ifdef __NOVELL_LIBC__
@@ -37,11 +37,9 @@
void tool_pressanykey(void)
{
-#if defined(__SYMBIAN32__)
- getchar();
-#elif defined(NETWARE)
+#if defined(NETWARE)
pressanykey();
#endif
}
-#endif /* __SYMBIAN32__ || NETWARE */
+#endif /* NETWARE */
diff --git a/src/tool_panykey.h b/src/tool_panykey.h
index e5c6f393..2e8846ce 100644
--- a/src/tool_panykey.h
+++ b/src/tool_panykey.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -23,14 +23,10 @@
***************************************************************************/
#include "tool_setup.h"
-#if defined(__SYMBIAN32__) || defined(NETWARE)
-
+#if defined(NETWARE)
void tool_pressanykey(void);
-
#else
-
#define tool_pressanykey() Curl_nop_stmt
-
#endif
#endif /* HEADER_CURL_TOOL_PANYKEY_H */
diff --git a/src/tool_paramhlp.c b/src/tool_paramhlp.c
index e57daa2e..03cd44fe 100644
--- a/src/tool_paramhlp.c
+++ b/src/tool_paramhlp.c
@@ -34,6 +34,7 @@
#include "tool_msgs.h"
#include "tool_paramhlp.h"
#include "tool_version.h"
+#include "dynbuf.h"
#include "memdebug.h" /* keep this as LAST include */
@@ -56,100 +57,52 @@ struct getout *new_getout(struct OperationConfig *config)
return node;
}
+#define MAX_FILE2STRING (256*1024*1024) /* big enough ? */
+
ParameterError file2string(char **bufp, FILE *file)
{
- char *string = NULL;
+ struct curlx_dynbuf dyn;
+ curlx_dyn_init(&dyn, MAX_FILE2STRING);
if(file) {
- char *ptr;
- size_t alloc = 512;
- size_t alloc_needed;
char buffer[256];
- size_t stringlen = 0;
- string = calloc(1, alloc);
- if(!string)
- return PARAM_NO_MEM;
while(fgets(buffer, sizeof(buffer), file)) {
- size_t buflen;
- ptr = strchr(buffer, '\r');
+ char *ptr = strchr(buffer, '\r');
if(ptr)
*ptr = '\0';
ptr = strchr(buffer, '\n');
if(ptr)
*ptr = '\0';
- buflen = strlen(buffer);
- alloc_needed = stringlen + buflen + 1;
- if(alloc < alloc_needed) {
-#if SIZEOF_SIZE_T < 8
- if(alloc >= (size_t)SIZE_T_MAX/2) {
- Curl_safefree(string);
- return PARAM_NO_MEM;
- }
-#endif
- /* doubling is enough since the string to add is always max 256 bytes
- and the alloc size start at 512 */
- alloc *= 2;
- ptr = realloc(string, alloc);
- if(!ptr) {
- Curl_safefree(string);
- return PARAM_NO_MEM;
- }
- string = ptr;
- }
- strcpy(string + stringlen, buffer);
- stringlen += buflen;
+ if(curlx_dyn_add(&dyn, buffer))
+ return PARAM_NO_MEM;
}
}
- *bufp = string;
+ *bufp = curlx_dyn_ptr(&dyn);
return PARAM_OK;
}
+#define MAX_FILE2MEMORY (1024*1024*1024) /* big enough ? */
+
ParameterError file2memory(char **bufp, size_t *size, FILE *file)
{
- char *newbuf;
- char *buffer = NULL;
- size_t nused = 0;
-
if(file) {
size_t nread;
- size_t alloc = 512;
+ struct curlx_dynbuf dyn;
+ curlx_dyn_init(&dyn, MAX_FILE2MEMORY);
do {
- if(!buffer || (alloc == nused)) {
- /* size_t overflow detection and avoiding huge files */
- if(alloc >= (SIZE_T_MAX/4)) {
- Curl_safefree(buffer);
+ char buffer[4096];
+ nread = fread(buffer, 1, sizeof(buffer), file);
+ if(nread)
+ if(curlx_dyn_addn(&dyn, buffer, nread))
return PARAM_NO_MEM;
- }
- alloc *= 2;
- /* allocate an extra char, reserved space, for null termination */
- newbuf = realloc(buffer, alloc + 1);
- if(!newbuf) {
- Curl_safefree(buffer);
- return PARAM_NO_MEM;
- }
- buffer = newbuf;
- }
- nread = fread(buffer + nused, 1, alloc-nused, file);
- nused += nread;
} while(nread);
- /* null terminate the buffer in case it's used as a string later */
- buffer[nused] = '\0';
- /* free trailing slack space, if possible */
- if(alloc != nused) {
- newbuf = realloc(buffer, nused + 1);
- if(!newbuf) {
- Curl_safefree(buffer);
- return PARAM_NO_MEM;
- }
- buffer = newbuf;
- }
- /* discard buffer if nothing was read */
- if(!nused) {
- Curl_safefree(buffer); /* no string */
- }
+ *size = curlx_dyn_len(&dyn);
+ *bufp = curlx_dyn_ptr(&dyn);
+ }
+ else {
+ *size = 0;
+ *bufp = NULL;
}
- *size = nused;
- *bufp = buffer;
return PARAM_OK;
}
@@ -460,6 +413,7 @@ ParameterError str2offset(curl_off_t *val, const char *str)
return PARAM_BAD_NUMERIC;
}
+#define MAX_USERPWDLENGTH (100*1024)
static CURLcode checkpasswd(const char *kind, /* for what purpose */
const size_t i, /* operation index */
const bool last, /* TRUE if last operation */
@@ -479,12 +433,11 @@ static CURLcode checkpasswd(const char *kind, /* for what purpose */
if(!psep && **userpwd != ';') {
/* no password present, prompt for one */
- char passwd[256] = "";
+ char passwd[2048] = "";
char prompt[256];
- size_t passwdlen;
- size_t userlen = strlen(*userpwd);
- char *passptr;
+ struct curlx_dynbuf dyn;
+ curlx_dyn_init(&dyn, MAX_USERPWDLENGTH);
if(osep)
*osep = '\0';
@@ -500,22 +453,15 @@ static CURLcode checkpasswd(const char *kind, /* for what purpose */
/* get password */
getpass_r(prompt, passwd, sizeof(passwd));
- passwdlen = strlen(passwd);
-
if(osep)
*osep = ';';
- /* extend the allocated memory area to fit the password too */
- passptr = realloc(*userpwd,
- passwdlen + 1 + /* an extra for the colon */
- userlen + 1); /* an extra for the zero */
- if(!passptr)
+ if(curlx_dyn_addf(&dyn, "%s:%s", *userpwd, passwd))
return CURLE_OUT_OF_MEMORY;
- /* append the password separated with a colon */
- passptr[userlen] = ':';
- memcpy(&passptr[userlen + 1], passwd, passwdlen + 1);
- *userpwd = passptr;
+ /* return the new string */
+ free(*userpwd);
+ *userpwd = curlx_dyn_ptr(&dyn);
}
return CURLE_OK;
diff --git a/src/tool_parsecfg.c b/src/tool_parsecfg.c
index 5aeb2eeb..abd493ae 100644
--- a/src/tool_parsecfg.c
+++ b/src/tool_parsecfg.c
@@ -31,6 +31,7 @@
#include "tool_homedir.h"
#include "tool_msgs.h"
#include "tool_parsecfg.h"
+#include "dynbuf.h"
#include "memdebug.h" /* keep this as LAST include */
@@ -39,7 +40,9 @@
#define ISSEP(x,dash) (!dash && (((x) == '=') || ((x) == ':')))
static const char *unslashquote(const char *line, char *param);
-static char *my_get_line(FILE *fp);
+
+#define MAX_CONFIG_LINE_LENGTH (100*1024)
+static bool my_get_line(FILE *fp, struct curlx_dynbuf *, bool *error);
#ifdef WIN32
static FILE *execpath(const char *filename)
@@ -82,7 +85,7 @@ int parseconfig(const char *filename, struct GlobalConfig *global)
if(!filename || !*filename) {
/* NULL or no file name attempts to load .curlrc from the homedir! */
- char *home = homedir(); /* portable homedir finder */
+ char *home = homedir(".curlrc");
#ifndef WIN32
if(home) {
pathalloc = curl_maprintf("%s%s.curlrc", home, DIR_CHAR);
@@ -135,17 +138,23 @@ int parseconfig(const char *filename, struct GlobalConfig *global)
if(file) {
char *line;
- char *aline;
char *option;
char *param;
int lineno = 0;
bool dashed_option;
+ struct curlx_dynbuf buf;
+ bool fileerror;
+ curlx_dyn_init(&buf, MAX_CONFIG_LINE_LENGTH);
- while(NULL != (aline = my_get_line(file))) {
+ while(my_get_line(file, &buf, &fileerror)) {
int res;
bool alloced_param = FALSE;
lineno++;
- line = aline;
+ line = curlx_dyn_ptr(&buf);
+ if(!line) {
+ rc = 1; /* out of memory */
+ break;
+ }
/* line with # in the first non-blank column is a comment! */
while(*line && ISSPACE(*line))
@@ -158,7 +167,7 @@ int parseconfig(const char *filename, struct GlobalConfig *global)
case '\n':
case '*':
case '\0':
- Curl_safefree(aline);
+ curlx_dyn_reset(&buf);
continue;
}
@@ -190,7 +199,6 @@ int parseconfig(const char *filename, struct GlobalConfig *global)
param = malloc(strlen(line) + 1); /* parameter */
if(!param) {
/* out of memory */
- Curl_safefree(aline);
rc = 1;
break;
}
@@ -219,7 +227,7 @@ int parseconfig(const char *filename, struct GlobalConfig *global)
break;
default:
warnf(operation->global, "%s:%d: warning: '%s' uses unquoted "
- "white space in the line that may cause side-effects!\n",
+ "whitespace in the line that may cause side-effects!\n",
filename, lineno, option);
}
}
@@ -280,10 +288,13 @@ int parseconfig(const char *filename, struct GlobalConfig *global)
if(alloced_param)
Curl_safefree(param);
- Curl_safefree(aline);
+ curlx_dyn_reset(&buf);
}
+ curlx_dyn_free(&buf);
if(file != stdin)
fclose(file);
+ if(fileerror)
+ rc = 1;
}
else
rc = 1; /* couldn't open the file */
@@ -335,39 +346,23 @@ static const char *unslashquote(const char *line, char *param)
/*
* Reads a line from the given file, ensuring is NUL terminated.
- * The pointer must be freed by the caller.
- * NULL is returned on an out of memory condition.
*/
-static char *my_get_line(FILE *fp)
+static bool my_get_line(FILE *fp, struct curlx_dynbuf *db,
+ bool *error)
{
char buf[4096];
- char *nl = NULL;
- char *line = NULL;
-
+ *error = FALSE;
do {
- if(NULL == fgets(buf, sizeof(buf), fp))
- break;
- if(!line) {
- line = strdup(buf);
- if(!line)
- return NULL;
+ /* fgets() returns s on success, and NULL on error or when end of file
+ occurs while no characters have been read. */
+ if(!fgets(buf, sizeof(buf), fp))
+ /* only if there's data in the line, return TRUE */
+ return curlx_dyn_len(db) ? TRUE : FALSE;
+ if(curlx_dyn_add(db, buf)) {
+ *error = TRUE; /* error */
+ return FALSE; /* stop reading */
}
- else {
- char *ptr;
- size_t linelen = strlen(line);
- ptr = realloc(line, linelen + strlen(buf) + 1);
- if(!ptr) {
- Curl_safefree(line);
- return NULL;
- }
- line = ptr;
- strcpy(&line[linelen], buf);
- }
- nl = strchr(line, '\n');
- } while(!nl);
+ } while(!strchr(buf, '\n'));
- if(nl)
- *nl = '\0';
-
- return line;
+ return TRUE; /* continue */
}
diff --git a/src/tool_setopt.c b/src/tool_setopt.c
index 9858d49c..0dd7a57a 100644
--- a/src/tool_setopt.c
+++ b/src/tool_setopt.c
@@ -219,26 +219,34 @@ static const struct NameValue setopt_nv_CURLNONZERODEFAULTS[] = {
/* Escape string to C string syntax. Return NULL if out of memory.
* Is this correct for those wacky EBCDIC guys? */
-static char *c_escape(const char *str, size_t len)
+
+#define MAX_STRING_LENGTH_OUTPUT 2000
+#define ZERO_TERMINATED -1
+
+static char *c_escape(const char *str, curl_off_t len)
{
const char *s;
unsigned char c;
char *escaped, *e;
+ unsigned int cutoff = 0;
- if(len == CURL_ZERO_TERMINATED)
+ if(len == ZERO_TERMINATED)
len = strlen(str);
- /* Check for possible overflow. */
- if(len > (~(size_t) 0) / 4)
- return NULL;
+ if(len > MAX_STRING_LENGTH_OUTPUT) {
+ /* cap ridiculously long strings */
+ len = MAX_STRING_LENGTH_OUTPUT;
+ cutoff = 3;
+ }
/* Allocate space based on worst-case */
- escaped = malloc(4 * len + 1);
+ escaped = malloc(4 * (size_t)len + 1 + cutoff);
if(!escaped)
return NULL;
e = escaped;
- for(s = str; (c = *s) != '\0'; s++) {
+ for(s = str; len; s++, len--) {
+ c = *s;
if(c == '\n') {
strcpy(e, "\\n");
e += 2;
@@ -259,13 +267,15 @@ static char *c_escape(const char *str, size_t len)
strcpy(e, "\\\"");
e += 2;
}
- else if(! isprint(c)) {
- msnprintf(e, 5, "\\%03o", (unsigned)c);
+ else if(!isprint(c)) {
+ msnprintf(e, 5, "\\x%02x", (unsigned)c);
e += 4;
}
else
*e++ = c;
}
+ while(cutoff--)
+ *e++ = '.';
*e = '\0';
return escaped;
}
@@ -289,7 +299,7 @@ CURLcode tool_setopt_enum(CURL *curl, struct GlobalConfig *config,
if(nv->value == lval)
break; /* found it */
}
- if(! nv->name) {
+ if(!nv->name) {
/* If no definition was found, output an explicit value.
* This could happen if new values are defined and used
* but the NameValue list is not updated. */
@@ -404,7 +414,7 @@ static CURLcode libcurl_generate_slist(struct curl_slist *slist, int *slistno)
CLEAN1("slist%d = NULL;", *slistno);
for(; slist; slist = slist->next) {
Curl_safefree(escaped);
- escaped = c_escape(slist->data, CURL_ZERO_TERMINATED);
+ escaped = c_escape(slist->data, ZERO_TERMINATED);
if(!escaped)
return CURLE_OUT_OF_MEMORY;
DATA3("slist%d = curl_slist_append(slist%d, \"%s\");",
@@ -455,7 +465,7 @@ static CURLcode libcurl_generate_mime_part(CURL *curl,
case TOOLMIME_DATA:
#ifdef CURL_DOES_CONVERSIONS
/* Data will be set in ASCII, thus issue a comment with clear text. */
- escaped = c_escape(part->data, CURL_ZERO_TERMINATED);
+ escaped = c_escape(part->data, ZERO_TERMINATED);
NULL_CHECK(escaped);
CODE1("/* \"%s\" */", escaped);
@@ -474,7 +484,7 @@ static CURLcode libcurl_generate_mime_part(CURL *curl,
#endif
if(!ret) {
Curl_safefree(escaped);
- escaped = c_escape(data, CURL_ZERO_TERMINATED);
+ escaped = c_escape(data, ZERO_TERMINATED);
NULL_CHECK(escaped);
CODE2("curl_mime_data(part%d, \"%s\", CURL_ZERO_TERMINATED);",
mimeno, escaped);
@@ -483,7 +493,7 @@ static CURLcode libcurl_generate_mime_part(CURL *curl,
case TOOLMIME_FILE:
case TOOLMIME_FILEDATA:
- escaped = c_escape(part->data, CURL_ZERO_TERMINATED);
+ escaped = c_escape(part->data, ZERO_TERMINATED);
NULL_CHECK(escaped);
CODE2("curl_mime_filedata(part%d, \"%s\");", mimeno, escaped);
if(part->kind == TOOLMIME_FILEDATA && !filename) {
@@ -508,28 +518,28 @@ static CURLcode libcurl_generate_mime_part(CURL *curl,
if(!ret && part->encoder) {
Curl_safefree(escaped);
- escaped = c_escape(part->encoder, CURL_ZERO_TERMINATED);
+ escaped = c_escape(part->encoder, ZERO_TERMINATED);
NULL_CHECK(escaped);
CODE2("curl_mime_encoder(part%d, \"%s\");", mimeno, escaped);
}
if(!ret && filename) {
Curl_safefree(escaped);
- escaped = c_escape(filename, CURL_ZERO_TERMINATED);
+ escaped = c_escape(filename, ZERO_TERMINATED);
NULL_CHECK(escaped);
CODE2("curl_mime_filename(part%d, \"%s\");", mimeno, escaped);
}
if(!ret && part->name) {
Curl_safefree(escaped);
- escaped = c_escape(part->name, CURL_ZERO_TERMINATED);
+ escaped = c_escape(part->name, ZERO_TERMINATED);
NULL_CHECK(escaped);
CODE2("curl_mime_name(part%d, \"%s\");", mimeno, escaped);
}
if(!ret && part->type) {
Curl_safefree(escaped);
- escaped = c_escape(part->type, CURL_ZERO_TERMINATED);
+ escaped = c_escape(part->type, ZERO_TERMINATED);
NULL_CHECK(escaped);
CODE2("curl_mime_type(part%d, \"%s\");", mimeno, escaped);
}
@@ -623,7 +633,8 @@ CURLcode tool_setopt_slist(CURL *curl, struct GlobalConfig *config,
/* generic setopt wrapper for all other options.
* Some type information is encoded in the tag value. */
-CURLcode tool_setopt(CURL *curl, bool str, struct GlobalConfig *config,
+CURLcode tool_setopt(CURL *curl, bool str, struct GlobalConfig *global,
+ struct OperationConfig *config,
const char *name, CURLoption tag, ...)
{
va_list arg;
@@ -711,14 +722,17 @@ CURLcode tool_setopt(CURL *curl, bool str, struct GlobalConfig *config,
va_end(arg);
- if(config->libcurl && !skip && !ret) {
+ if(global->libcurl && !skip && !ret) {
/* we only use this for real if --libcurl was used */
if(remark)
REM2("%s set to a %s", name, value);
else {
if(escape) {
- escaped = c_escape(value, CURL_ZERO_TERMINATED);
+ curl_off_t len = ZERO_TERMINATED;
+ if(tag == CURLOPT_POSTFIELDS)
+ len = config->postfieldsize;
+ escaped = c_escape(value, len);
NULL_CHECK(escaped);
CODE2("curl_easy_setopt(hnd, %s, \"%s\");", name, escaped);
}
diff --git a/src/tool_setopt.h b/src/tool_setopt.h
index 9fe142cf..3db88c6b 100644
--- a/src/tool_setopt.h
+++ b/src/tool_setopt.h
@@ -98,14 +98,15 @@ CURLcode tool_setopt_mimepost(CURL *curl, struct GlobalConfig *config,
CURLcode tool_setopt_slist(CURL *curl, struct GlobalConfig *config,
const char *name, CURLoption tag,
struct curl_slist *list);
-CURLcode tool_setopt(CURL *curl, bool str, struct GlobalConfig *config,
+CURLcode tool_setopt(CURL *curl, bool str, struct GlobalConfig *global,
+ struct OperationConfig *config,
const char *name, CURLoption tag, ...);
#define my_setopt(x,y,z) \
- SETOPT_CHECK(tool_setopt(x, FALSE, global, #y, y, z), y)
+ SETOPT_CHECK(tool_setopt(x, FALSE, global, config, #y, y, z), y)
#define my_setopt_str(x,y,z) \
- SETOPT_CHECK(tool_setopt(x, TRUE, global, #y, y, z), y)
+ SETOPT_CHECK(tool_setopt(x, TRUE, global, config, #y, y, z), y)
#define my_setopt_enum(x,y,z) \
SETOPT_CHECK(tool_setopt_enum(x, global, #y, y, setopt_nv_ ## y, z), y)
@@ -122,9 +123,9 @@ CURLcode tool_setopt(CURL *curl, bool str, struct GlobalConfig *config,
#define my_setopt_slist(x,y,z) \
SETOPT_CHECK(tool_setopt_slist(x, global, #y, y, z), y)
-#define res_setopt(x,y,z) tool_setopt(x, FALSE, global, #y, y, z)
+#define res_setopt(x,y,z) tool_setopt(x, FALSE, global, config, #y, y, z)
-#define res_setopt_str(x,y,z) tool_setopt(x, TRUE, global, #y, y, z)
+#define res_setopt_str(x,y,z) tool_setopt(x, TRUE, global, config, #y, y, z)
#else /* CURL_DISABLE_LIBCURL_OPTION */
diff --git a/src/tool_urlglob.c b/src/tool_urlglob.c
index 430ca88b..23238b14 100644
--- a/src/tool_urlglob.c
+++ b/src/tool_urlglob.c
@@ -28,6 +28,7 @@
#include "tool_doswin.h"
#include "tool_urlglob.h"
#include "tool_vms.h"
+#include "dynbuf.h"
#include "memdebug.h" /* keep this as LAST include */
@@ -607,26 +608,21 @@ CURLcode glob_next_url(char **globbed, struct URLGlob *glob)
return CURLE_OK;
}
+#define MAX_OUTPUT_GLOB_LENGTH (10*1024)
+
CURLcode glob_match_url(char **result, char *filename, struct URLGlob *glob)
{
- char *target;
- size_t allocsize;
char numbuf[18];
char *appendthis = (char *)"";
size_t appendlen = 0;
- size_t stringlen = 0;
+ struct curlx_dynbuf dyn;
*result = NULL;
- /* We cannot use the glob_buffer for storage here since the filename may
- * be longer than the URL we use. We allocate a good start size, then
- * we need to realloc in case of need.
+ /* We cannot use the glob_buffer for storage since the filename may be
+ * longer than the URL we use.
*/
- allocsize = strlen(filename) + 1; /* make it at least one byte to store the
- trailing zero */
- target = malloc(allocsize);
- if(!target)
- return CURLE_OUT_OF_MEMORY;
+ curlx_dyn_init(&dyn, MAX_OUTPUT_GLOB_LENGTH);
while(*filename) {
if(*filename == '#' && ISDIGIT(filename[1])) {
@@ -671,7 +667,7 @@ CURLcode glob_match_url(char **result, char *filename, struct URLGlob *glob)
default:
fprintf(stderr, "internal error: invalid pattern type (%d)\n",
(int)pat->type);
- Curl_safefree(target);
+ curlx_dyn_free(&dyn);
return CURLE_FAILED_INIT;
}
}
@@ -686,36 +682,24 @@ CURLcode glob_match_url(char **result, char *filename, struct URLGlob *glob)
appendthis = filename++;
appendlen = 1;
}
- if(appendlen + stringlen >= allocsize) {
- char *newstr;
- /* we append a single byte to allow for the trailing byte to be appended
- at the end of this function outside the while() loop */
- allocsize = (appendlen + stringlen) * 2;
- newstr = realloc(target, allocsize + 1);
- if(!newstr) {
- Curl_safefree(target);
- return CURLE_OUT_OF_MEMORY;
- }
- target = newstr;
- }
- memcpy(&target[stringlen], appendthis, appendlen);
- stringlen += appendlen;
+ if(curlx_dyn_addn(&dyn, appendthis, appendlen))
+ return CURLE_OUT_OF_MEMORY;
}
- target[stringlen]= '\0';
#if defined(MSDOS) || defined(WIN32)
{
char *sanitized;
- SANITIZEcode sc = sanitize_file_name(&sanitized, target,
+ SANITIZEcode sc = sanitize_file_name(&sanitized, curlx_dyn_ptr(&dyn),
(SANITIZE_ALLOW_PATH |
SANITIZE_ALLOW_RESERVED));
- Curl_safefree(target);
+ curlx_dyn_free(&dyn);
if(sc)
return CURLE_URL_MALFORMAT;
- target = sanitized;
+ *result = sanitized;
+ return CURLE_OK;
}
-#endif /* MSDOS || WIN32 */
-
- *result = target;
+#else
+ *result = curlx_dyn_ptr(&dyn);
return CURLE_OK;
+#endif /* MSDOS || WIN32 */
}
diff --git a/src/tool_version.h b/src/tool_version.h
index 46247d35..54f821b4 100644
--- a/src/tool_version.h
+++ b/src/tool_version.h
@@ -25,7 +25,7 @@
#define CURL_NAME "curl"
#define CURL_COPYRIGHT LIBCURL_COPYRIGHT
-#define CURL_VERSION "7.72.0"
+#define CURL_VERSION "7.73.0"
#define CURL_VERSION_MAJOR LIBCURL_VERSION_MAJOR
#define CURL_VERSION_MINOR LIBCURL_VERSION_MINOR
#define CURL_VERSION_PATCH LIBCURL_VERSION_PATCH
diff --git a/src/tool_writeout.c b/src/tool_writeout.c
index 41441ff3..393e1686 100644
--- a/src/tool_writeout.c
+++ b/src/tool_writeout.c
@@ -38,6 +38,8 @@ static const struct writeoutvar variables[] = {
CURLINFO_RESPONSE_CODE, JSON_LONG},
{"response_code", VAR_HTTP_CODE, 0,
CURLINFO_RESPONSE_CODE, JSON_LONG},
+ {"num_headers", VAR_NUM_HEADERS, 0,
+ 0, JSON_LONG},
{"http_connect", VAR_HTTP_CODE_PROXY, 0,
CURLINFO_HTTP_CONNECTCODE, JSON_LONG},
{"time_total", VAR_TOTAL_TIME, 0,
@@ -104,7 +106,7 @@ static const struct writeoutvar variables[] = {
0, JSON_NONE}
};
-void ourWriteOut(CURL *curl, struct OutStruct *outs, const char *writeinfo)
+void ourWriteOut(CURL *curl, struct per_transfer *per, const char *writeinfo)
{
FILE *stream = stdout;
const char *ptr = writeinfo;
@@ -156,6 +158,9 @@ void ourWriteOut(CURL *curl, struct OutStruct *outs, const char *writeinfo)
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &longinfo))
fprintf(stream, "%03ld", longinfo);
break;
+ case VAR_NUM_HEADERS:
+ fprintf(stream, "%ld", per->num_headers);
+ break;
case VAR_HTTP_CODE_PROXY:
if(CURLE_OK ==
curl_easy_getinfo(curl, CURLINFO_HTTP_CONNECTCODE,
@@ -275,14 +280,13 @@ void ourWriteOut(CURL *curl, struct OutStruct *outs, const char *writeinfo)
fprintf(stream, "%ld", longinfo);
break;
case VAR_EFFECTIVE_FILENAME:
- if(outs->filename)
- fprintf(stream, "%s", outs->filename);
+ if(per->outs.filename)
+ fputs(per->outs.filename, stream);
break;
case VAR_PRIMARY_IP:
- if(CURLE_OK ==
- curl_easy_getinfo(curl, CURLINFO_PRIMARY_IP,
- &stringp))
- fprintf(stream, "%s", stringp);
+ if((CURLE_OK == curl_easy_getinfo(curl, CURLINFO_PRIMARY_IP,
+ &stringp)) && stringp)
+ fputs(stringp, stream);
break;
case VAR_PRIMARY_PORT:
if(CURLE_OK ==
@@ -291,10 +295,9 @@ void ourWriteOut(CURL *curl, struct OutStruct *outs, const char *writeinfo)
fprintf(stream, "%ld", longinfo);
break;
case VAR_LOCAL_IP:
- if(CURLE_OK ==
- curl_easy_getinfo(curl, CURLINFO_LOCAL_IP,
- &stringp))
- fprintf(stream, "%s", stringp);
+ if((CURLE_OK == curl_easy_getinfo(curl, CURLINFO_LOCAL_IP,
+ &stringp)) && stringp)
+ fputs(stringp, stream);
break;
case VAR_LOCAL_PORT:
if(CURLE_OK ==
@@ -326,10 +329,9 @@ void ourWriteOut(CURL *curl, struct OutStruct *outs, const char *writeinfo)
}
break;
case VAR_SCHEME:
- if(CURLE_OK ==
- curl_easy_getinfo(curl, CURLINFO_SCHEME,
- &stringp))
- fprintf(stream, "%s", stringp);
+ if((CURLE_OK == curl_easy_getinfo(curl, CURLINFO_SCHEME,
+ &stringp)) && stringp)
+ fputs(stringp, stream);
break;
case VAR_STDOUT:
stream = stdout;
@@ -338,7 +340,7 @@ void ourWriteOut(CURL *curl, struct OutStruct *outs, const char *writeinfo)
stream = stderr;
break;
case VAR_JSON:
- ourWriteOutJSON(variables, curl, outs, stream);
+ ourWriteOutJSON(variables, curl, per, stream);
default:
break;
}
diff --git a/src/tool_writeout.h b/src/tool_writeout.h
index 68bacb9d..377f0b2b 100644
--- a/src/tool_writeout.h
+++ b/src/tool_writeout.h
@@ -22,6 +22,7 @@
*
***************************************************************************/
#include "tool_setup.h"
+#include "tool_operate.h"
typedef enum {
VAR_NONE, /* must be the first */
@@ -38,6 +39,7 @@ typedef enum {
VAR_HTTP_CODE,
VAR_HTTP_CODE_PROXY,
VAR_HEADER_SIZE,
+ VAR_NUM_HEADERS,
VAR_REQUEST_SIZE,
VAR_EFFECTIVE_METHOD,
VAR_EFFECTIVE_URL,
@@ -80,6 +82,6 @@ struct writeoutvar {
jsontype jsontype;
};
-void ourWriteOut(CURL *curl, struct OutStruct *outs, const char *writeinfo);
+void ourWriteOut(CURL *curl, struct per_transfer *per, const char *writeinfo);
#endif /* HEADER_CURL_TOOL_WRITEOUT_H */
diff --git a/src/tool_writeout_json.c b/src/tool_writeout_json.c
index dfe51b9f..bae7f5c1 100644
--- a/src/tool_writeout_json.c
+++ b/src/tool_writeout_json.c
@@ -103,13 +103,20 @@ static int writeString(FILE *str, CURL *curl, const char *key, CURLINFO ci)
return 0;
}
-static int writeLong(FILE *str, CURL *curl, const char *key, CURLINFO ci)
+static int writeLong(FILE *str, CURL *curl, const char *key, CURLINFO ci,
+ struct per_transfer *per, const struct writeoutvar *wovar)
{
- long val = 0;
- if(CURLE_OK == curl_easy_getinfo(curl, ci, &val)) {
- fprintf(str, "\"%s\":%ld", key, val);
+ if(wovar->id == VAR_NUM_HEADERS) {
+ fprintf(str, "\"%s\":%ld", key, per->num_headers);
return 1;
}
+ else {
+ long val = 0;
+ if(CURLE_OK == curl_easy_getinfo(curl, ci, &val)) {
+ fprintf(str, "\"%s\":%ld", key, val);
+ return 1;
+ }
+ }
return 0;
}
@@ -149,12 +156,13 @@ static int writeVersion(FILE *str, CURL *curl, const char *key, CURLINFO ci)
}
void ourWriteOutJSON(const struct writeoutvar mappings[], CURL *curl,
- struct OutStruct *outs, FILE *stream)
+ struct per_transfer *per, FILE *stream)
{
int i;
fputs("{", stream);
for(i = 0; mappings[i].name != NULL; i++) {
+ const struct writeoutvar *wovar = &mappings[i];
const char *name = mappings[i].name;
CURLINFO cinfo = mappings[i].cinfo;
int ok = 0;
@@ -168,7 +176,7 @@ void ourWriteOutJSON(const struct writeoutvar mappings[], CURL *curl,
ok = writeString(stream, curl, name, cinfo);
break;
case JSON_LONG:
- ok = writeLong(stream, curl, name, cinfo);
+ ok = writeLong(stream, curl, name, cinfo, per, wovar);
break;
case JSON_OFFSET:
ok = writeOffset(stream, curl, name, cinfo);
@@ -177,7 +185,7 @@ void ourWriteOutJSON(const struct writeoutvar mappings[], CURL *curl,
ok = writeTime(stream, curl, name, cinfo);
break;
case JSON_FILENAME:
- ok = writeFilename(stream, name, outs->filename);
+ ok = writeFilename(stream, name, per->outs.filename);
break;
case JSON_VERSION:
ok = writeVersion(stream, curl, name, cinfo);
diff --git a/src/tool_writeout_json.h b/src/tool_writeout_json.h
index d3988d52..0390ae5c 100644
--- a/src/tool_writeout_json.h
+++ b/src/tool_writeout_json.h
@@ -24,7 +24,7 @@
#include "tool_setup.h"
#include "tool_writeout.h"
-void ourWriteOutJSON(const struct writeoutvar mappings[],
- CURL *curl, struct OutStruct *outs, FILE *stream);
+void ourWriteOutJSON(const struct writeoutvar mappings[], CURL *curl,
+ struct per_transfer *per, FILE *stream);
#endif /* HEADER_CURL_TOOL_WRITEOUT_H */
diff --git a/test-driver b/test-driver
index 8e575b01..89dba1e0 100755
--- a/test-driver
+++ b/test-driver
@@ -1,9 +1,9 @@
#! /bin/sh
# test-driver - basic testsuite driver script.
-scriptversion=2013-07-13.22; # UTC
+scriptversion=2018-03-07.03; # UTC
-# Copyright (C) 2011-2014 Free Software Foundation, Inc.
+# Copyright (C) 2011-2020 Free Software Foundation, Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -16,7 +16,7 @@ scriptversion=2013-07-13.22; # UTC
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program that contains a
@@ -140,9 +140,9 @@ echo ":copy-in-global-log: $gcopy" >> $trs_file
# Local Variables:
# mode: shell-script
# sh-indentation: 2
-# eval: (add-hook 'write-file-hooks 'time-stamp)
+# eval: (add-hook 'before-save-hook 'time-stamp)
# time-stamp-start: "scriptversion="
# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC"
+# time-stamp-time-zone: "UTC0"
# time-stamp-end: "; # UTC"
# End:
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 60ce5c26..9f3e4753 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -26,7 +26,7 @@ add_subdirectory(server)
add_subdirectory(unit)
function(add_runtests targetname test_flags)
- # Use a special '${TFLAGS}' placeholder as last argument which will be
+ # Use a special '$TFLAGS' placeholder as last argument which will be
# replaced by the contents of the environment variable in runtests.pl.
# This is a workaround for CMake's limitation where commands executed by
# 'make' or 'ninja' cannot portably reference environment variables.
@@ -35,7 +35,7 @@ function(add_runtests targetname test_flags)
COMMAND
"${PERL_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/runtests.pl"
${test_flags_list}
- "\${TFLAGS}"
+ "\$TFLAGS"
DEPENDS testdeps
VERBATIM USES_TERMINAL
)
diff --git a/tests/FILEFORMAT.md b/tests/FILEFORMAT.md
index c280c852..0f66de27 100644
--- a/tests/FILEFORMAT.md
+++ b/tests/FILEFORMAT.md
@@ -40,6 +40,34 @@ server's port number (in ASCII) followed by a space and the hexadecimal byte
%b64[%HTTPPORT %9a]b64%
+## Hexadecimal decoding
+
+In the preprocess stage, a special instruction can be used to have runtests.pl
+generate a sequence of binary bytes.
+
+To insert a sequence of bytes from a hex encoded string, use this syntax:
+
+ %hex[ %XX-encoded data to decode ]hex%
+
+For example, to insert the binary octets 0, 1 and 255 into the test file:
+
+ %hex[ %00%01%FF ]hex%
+
+## Repeat content
+
+In the preprocess stage, a special instruction can be used to have runtests.pl
+generate a repetetive sequence of bytes.
+
+To insert a sequence of repeat bytes, use this syntax to make the `<string>`
+get repeated `<number>` of times. The number has to be 1 or large and the
+string may contain `%HH` hexadecimal codes:
+
+ %repeat[<number> x <string>]%
+
+For example, to insert the word hello a 100 times:
+
+ %repeat[100 x hello]%
+
# Variables
When the test is preprocessed, a range of "variables" in the test file will be
@@ -93,6 +121,7 @@ Available substitute variables include:
- `%TFTP6PORT` - IPv6 port number of the TFTP server
- `%TFTPPORT` - Port number of the TFTP server
- `%USER` - Login ID of the user running the test
+- `%VERSION` - the full version number of the tested curl
# `<testcase>`
@@ -237,6 +266,7 @@ about to issue.
POP3 `CAPA` and SMTP `EHLO` commands
- `AUTH [mechanisms]` - Enables support for SASL authentication and specifies
a list of space separated mechanisms for IMAP, POP3 and SMTP
+- `STOR [msg]` respond with this instead of default after `STOR`
#### For HTTP/HTTPS
@@ -380,7 +410,7 @@ Brief test case description, shown when the test runs.
Set the given environment variables to the specified value before the actual
command is run. They are cleared again after the command has been run.
-### `<command [option="no-output/no-include/force-output/binary-trace"] [timeout="secs"][delay="secs"][type="perl"]>`
+### `<command [option="no-output/no-include/force-output/binary-trace"] [timeout="secs"][delay="secs"][type="perl/shell"]>`
Command line to run.
Note that the URL that gets passed to the server actually controls what data
@@ -398,6 +428,9 @@ the address "[1234::ff]" would be treated as test case 255.
Set `type="perl"` to write the test case as a perl script. It implies that
there's no memory debugging and valgrind gets shut off for this test.
+Set `type="shell"` to write the test case as a shell script. It implies that
+there's no memory debugging and valgrind gets shut off for this test.
+
Set `option="no-output"` to prevent the test script to slap on the `--output`
argument that directs the output to a file. The `--output` is also not added
if the verify/stdout section is used.
@@ -425,10 +458,13 @@ parameter is the not negative integer number of seconds for the delay. This
'delay' attribute is intended for very specific test cases, and normally not
needed.
-### `<file name="log/filename">`
+### `<file name="log/filename" [nonewline="yes"]>`
This creates the named file with this content before the test case is run,
which is useful if the test case needs a file to act on.
+If 'nonewline="yes"` is used, the created file will have the final newline
+stripped off.
+
### `<stdin [nonewline="yes"]>`
Pass this given data on stdin to the tool.
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 9773b86d..7424fe6b 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -25,7 +25,7 @@ PDFPAGES = testcurl.pdf runtests.pdf
MANDISTPAGES = runtests.1.dist testcurl.1.dist
EXTRA_DIST = ftpserver.pl httpserver.pl secureserver.pl runtests.pl \
- getpart.pm FILEFORMAT.md README stunnel.pem memanalyze.pl testcurl.pl \
+ getpart.pm FILEFORMAT.md README.md stunnel.pem memanalyze.pl testcurl.pl \
valgrind.pm ftp.pm sshserver.pl sshhelp.pm pathhelp.pm testcurl.1 runtests.1 \
serverhelp.pm tftpserver.pl rtspserver.pl directories.pm symbol-scan.pl \
CMakeLists.txt mem-include-scan.pl valgrind.supp extern-scan.pl \
diff --git a/tests/README b/tests/README.md
index 209887df..4b524a04 100644
--- a/tests/README
+++ b/tests/README.md
@@ -1,53 +1,19 @@
- _ _ ____ _
- ___| | | | _ \| |
- / __| | | | |_) | |
- | (__| |_| | _ <| |___
- \___|\___/|_| \_\_____|
-
-The curl Test Suite
-
- 1. Running
- 1.1 Requires to run
- 1.2 Port numbers used by test servers
- 1.3 Test servers
- 1.4 Run
- 1.5 Shell startup scripts
- 1.6 Memory test
- 1.7 Debug
- 1.8 Logs
- 1.9 Test input files
- 1.10 Code coverage
- 1.11 Remote testing
-
- 2. Numbering
- 2.1 Test case numbering
-
- 3. Write tests
- 3.1 test data
- 3.2 curl tests
- 3.3 libcurl tests
- 3.4 unit tests
-
- 4. TODO
- 4.1 More protocols
- 4.2 SOCKS auth
-
-==============================================================================
-
-1. Running
-
- 1.1 Requires to run
-
- perl (and a unix-style shell)
- python (and a unix-style shell, for SMB and TELNET tests)
- python-impacket (for SMB tests)
- diff (when a test fails, a diff is shown)
- stunnel (for HTTPS and FTPS tests)
- OpenSSH or SunSSH (for SCP, SFTP and SOCKS4/5 tests)
- nghttpx (for HTTP/2 tests)
- nroff (for --manual tests)
-
- 1.1.1 Installation of python-impacket
+# The curl Test Suite
+
+# Running
+
+## Requires to run
+
+ - perl (and a unix-style shell)
+ - python (and a unix-style shell, for SMB and TELNET tests)
+ - python-impacket (for SMB tests)
+ - diff (when a test fails, a diff is shown)
+ - stunnel (for HTTPS and FTPS tests)
+ - OpenSSH or SunSSH (for SCP, SFTP and SOCKS4/5 tests)
+ - nghttpx (for HTTP/2 tests)
+ - nroff (for --manual tests)
+
+### Installation of python-impacket
The Python-based test servers support both recent Python 2 and 3.
You can figure out your default Python interpreter with python -V
@@ -56,33 +22,33 @@ The curl Test Suite
You can use pip or your OS' package manager to install 'impacket'.
On Debian/Ubuntu the package names are:
- Python 2: 'python-impacket'
- Python 3: 'python3-impacket'
+
+ - Python 2: 'python-impacket'
+ - Python 3: 'python3-impacket'
On FreeBSD the package names are:
- Python 2: 'py27-impacket'
- Python 3: 'py37-impacket'
+
+ - Python 2: 'py27-impacket'
+ - Python 3: 'py37-impacket'
On any system where pip is available:
- Python 2: 'pip2 install impacket'
- Python 3: 'pip3 install impacket'
+
+ - Python 2: 'pip2 install impacket'
+ - Python 3: 'pip3 install impacket'
You may also need to manually install the Python package 'six'
as that may be a missing requirement for impacket on Python 3.
- 1.2 Port numbers used by test servers
-
- Tests are written to use as few fixed fixed port numbers as possible and all
- tests should be written to use suitable variables instead of port numbers so
- that test cases continue to work independent on what port numbers the test
- servers actually use.
+### Port numbers used by test servers
- The remaining fixed-port test servers that are still used, use the port
- range 8890 - 8904 by default, but can be moved with runtests' -b option.
+ All test servers run on "random" port numbers. All tests should be written
+ to use suitable variables instead of fixed port numbers so that test cases
+ continue to work independent on what port numbers the test servers actually
+ use.
- See the FILEFORMAT for a listing of existing port number variables.
+ See [FILEFORMAT](FILEFORMAT.md) for the port number variables.
- 1.3 Test servers
+### Test servers
The test suite runs simple FTP, POP3, IMAP, SMTP, HTTP and TFTP stand-alone
servers on the ports listed above to which it makes requests. For SSL tests,
@@ -99,27 +65,28 @@ The curl Test Suite
The HTTP server supports listening on a Unix domain socket, the default
location is 'http.sock'.
- 1.4 Run
+### Run
- './configure && make && make test'. This builds the test suite support code
+ `./configure && make && make test`. This builds the test suite support code
and invokes the 'runtests.pl' perl script to run all the tests. Edit the top
variables of that script in case you have some specific needs, or run the
script manually (after the support code has been built).
- The script breaks on the first test that doesn't do OK. Use -a to prevent
- the script from aborting on the first error. Run the script with -v for more
- verbose output. Use -d to run the test servers with debug output enabled as
- well. Specifying -k keeps all the log files generated by the test intact.
-
- Use -s for shorter output, or pass test numbers to run specific tests only
- (like "./runtests.pl 3 4" to test 3 and 4 only). It also supports test case
- ranges with 'to', as in "./runtests 3 to 9" which runs the seven tests from
- 3 to 9. Any test numbers starting with ! are disabled, as are any test
- numbers found in the files data/DISABLED or data/DISABLED.local (one per
+ The script breaks on the first test that doesn't do OK. Use `-a` to prevent
+ the script from aborting on the first error. Run the script with `-v` for
+ more verbose output. Use `-d` to run the test servers with debug output
+ enabled as well. Specifying `-k` keeps all the log files generated by the
+ test intact.
+
+ Use `-s` for shorter output, or pass test numbers to run specific tests only
+ (like `./runtests.pl 3 4` to test 3 and 4 only). It also supports test case
+ ranges with 'to', as in `./runtests.pl 3 to 9` which runs the seven tests
+ from 3 to 9. Any test numbers starting with ! are disabled, as are any test
+ numbers found in the files `data/DISABLED` or `data/DISABLED.local` (one per
line). The latter is meant for local temporary disables and will be ignored
by git.
- When -s is not present, each successful test will display on one line the
+ When `-s` is not present, each successful test will display on one line the
test number and description and on the next line a set of flags, the test
result, current test sequence, total number of tests to be run and an
estimated amount of time to complete the test run. The flags consist of
@@ -134,7 +101,7 @@ The curl Test Suite
m memory
v valgrind
- 1.5 Shell startup scripts
+### Shell startup scripts
Tests which use the ssh test server, SCP/SFTP/SOCKS tests, might be badly
influenced by the output of system wide or user specific shell startup
@@ -150,51 +117,51 @@ The curl Test Suite
output of a shell startup script. Locate, cleanup or adjust the shell
script.
- 1.6 Memory test
+### Memory test
The test script will check that all allocated memory is freed properly IF
- curl has been built with the CURLDEBUG define set. The script will
+ curl has been built with the `CURLDEBUG` define set. The script will
automatically detect if that is the case, and it will use the
'memanalyze.pl' script to analyze the memory debugging output.
Also, if you run tests on a machine where valgrind is found, the script will
- use valgrind to run the test with (unless you use -n) to further verify
+ use valgrind to run the test with (unless you use `-n`) to further verify
correctness.
- runtests.pl's -t option will enable torture testing mode, which runs each
+ runtests.pl's `-t` option will enable torture testing mode, which runs each
test many times and makes each different memory allocation fail on each
successive run. This tests the out of memory error handling code to ensure
that memory leaks do not occur even in those situations. It can help to
- compile curl with CPPFLAGS=-DMEMDEBUG_LOG_SYNC when using this option, to
+ compile curl with `CPPFLAGS=-DMEMDEBUG_LOG_SYNC` when using this option, to
ensure that the memory log file is properly written even if curl crashes.
- 1.7 Debug
+### Debug
If a test case fails, you can conveniently get the script to invoke the
debugger (gdb) for you with the server running and the exact same command
- line parameters that failed. Just invoke 'runtests.pl <test number> -g' and
+ line parameters that failed. Just invoke `runtests.pl <test number> -g` and
then just type 'run' in the debugger to perform the command through the
debugger.
- 1.8 Logs
+### Logs
All logs are generated in the log/ subdirectory (it is emptied first in the
- runtests.pl script). Use runtests.pl -k to force it to keep the temporary
- files after the test run since successful runs will clean it up otherwise.
+ runtests.pl script). They remain in there after a test run.
- 1.9 Test input files
+### Test input files
- All test cases are put in the data/ subdirectory. Each test is stored in the
- file named according to the test number.
+ All test cases are put in the `data/` subdirectory. Each test is stored in
+ the file named according to the test number.
- See FILEFORMAT for the description of the test case files.
+ See [FILEFORMAT.md](FILEFORMAT.md) for a description of the test case file
+ format.
- 1.10 Code coverage
+### Code coverage
- gcc provides a tool that can determine the code coverage figures for
- the test suite. To use it, configure curl with
- CFLAGS='-fprofile-arcs -ftest-coverage -g -O0'. Make sure you run the normal
- and torture tests to get more full coverage, i.e. do:
+ gcc provides a tool that can determine the code coverage figures for the
+ test suite. To use it, configure curl with `CFLAGS='-fprofile-arcs
+ -ftest-coverage -g -O0`. Make sure you run the normal and torture tests to
+ get more full coverage, i.e. do:
make test
make test-torture
@@ -207,7 +174,7 @@ The curl Test Suite
The text mode tool gcov may also be used, but it doesn't handle object files
in more than one directory very well.
- 1.11 Remote testing
+### Remote testing
The runtests.pl script provides some hooks to allow curl to be tested on a
machine where perl can not be run. The test framework in this case runs on
@@ -215,63 +182,48 @@ The curl Test Suite
system using ssh or some other remote execution method. See the comments at
the beginning of runtests.pl for details.
-2. Numbering
-
- 2.1 Test case numbering
+## Test case numbering
- Test cases used to be numbered by category, but the ranges filled
+ Test cases used to be numbered by category ranges, but the ranges filled
up. Subsets of tests can now be selected by passing keywords to the
- runtests.pl script via the make TFLAGS variable.
+ runtests.pl script via the make `TFLAGS` variable.
- New tests should now be added by finding a free number in
- tests/data/Makefile.inc.
+ New tests are added by finding a free number in `tests/data/Makefile.inc`.
-3. Write tests
+## Write tests
Here's a quick description on writing test cases. We basically have three
kinds of tests: the ones that test the curl tool, the ones that build small
applications and test libcurl directly and the unit tests that test
individual (possibly internal) functions.
- 3.1 test data
+### test data
Each test has a master file that controls all the test data. What to read,
what the protocol exchange should look like, what exit code to expect and
what command line arguments to use etc.
- These files are tests/data/test[num] where [num] is described in section 2
- of this document, and the XML-like file format of them is described in the
- separate tests/FILEFORMAT document.
+ These files are `tests/data/test[num]` where `[num]` is just a unique
+ identifier described above, and the XML-like file format of them is
+ described in the separate [FILEFORMAT.md](FILEFORMAT.md) document.
- 3.2 curl tests
+### curl tests
A test case that runs the curl tool and verifies that it gets the correct
data, it sends the correct data, it uses the correct protocol primitives
etc.
- 3.3 libcurl tests
+### libcurl tests
The libcurl tests are identical to the curl ones, except that they use a
specific and dedicated custom-built program to run instead of "curl". This
- tool is built from source code placed in tests/libtest and if you want to
+ tool is built from source code placed in `tests/libtest` and if you want to
make a new libcurl test that is where you add your code.
- 3.4 unit tests
+### unit tests
- Unit tests are tests in the 13xx sequence and they are placed in tests/unit.
- There's a tests/unit/README describing the specific set of checks and macros
- that may be used when writing tests that verify behaviors of specific
- individual functions.
+ Unit tests are placed in `tests/unit`. There's a tests/unit/README
+ describing the specific set of checks and macros that may be used when
+ writing tests that verify behaviors of specific individual functions.
The unit tests depend on curl being built with debug enabled.
-
-4. TODO
-
- 4.1 More protocols
-
- Add tests for TELNET, LDAP, DICT...
-
- 4.2 SOCKS auth
-
- SOCKS4/5 test deficiencies - no proxy authentication tests as SSH (the
- test mechanism) doesn't support them
diff --git a/tests/appveyor.pm b/tests/appveyor.pm
index 64b2ab3b..1b3889dc 100644
--- a/tests/appveyor.pm
+++ b/tests/appveyor.pm
@@ -34,12 +34,12 @@ sub appveyor_check_environment {
}
sub appveyor_create_test_result {
- my ($testnum, $testname)=@_;
+ my ($curl, $testnum, $testname)=@_;
$testname =~ s/\\/\\\\/g;
$testname =~ s/\'/\\\'/g;
$testname =~ s/\"/\\\"/g;
my $appveyor_baseurl="$ENV{'APPVEYOR_API_URL'}";
- my $appveyor_result=`curl --silent --noproxy "*" \\
+ my $appveyor_result=`$curl --silent --noproxy "*" \\
--header "Content-Type: application/json" \\
--data "
{
@@ -55,7 +55,7 @@ sub appveyor_create_test_result {
}
sub appveyor_update_test_result {
- my ($testnum, $error, $start, $stop)=@_;
+ my ($curl, $testnum, $error, $start, $stop)=@_;
my $testname=$APPVEYOR_TEST_NAMES{$testnum};
if(!defined $testname) {
return;
@@ -83,7 +83,7 @@ sub appveyor_update_test_result {
$appveyor_category = 'Error';
}
my $appveyor_baseurl="$ENV{'APPVEYOR_API_URL'}";
- my $appveyor_result=`curl --silent --noproxy "*" --request PUT \\
+ my $appveyor_result=`$curl --silent --noproxy "*" --request PUT \\
--header "Content-Type: application/json" \\
--data "
{
@@ -98,7 +98,7 @@ sub appveyor_update_test_result {
"$appveyor_baseurl/api/tests"`;
print "AppVeyor API result: $appveyor_result\n" if ($appveyor_result);
if($appveyor_category eq 'Error') {
- $appveyor_result=`curl --silent --noproxy "*" \\
+ $appveyor_result=`$curl --silent --noproxy "*" \\
--header "Content-Type: application/json" \\
--data "
{
diff --git a/tests/azure.pm b/tests/azure.pm
index 004c3d30..98d777ba 100644
--- a/tests/azure.pm
+++ b/tests/azure.pm
@@ -37,8 +37,9 @@ sub azure_check_environment {
}
sub azure_create_test_run {
+ my ($curl)=@_;
my $azure_baseurl="$ENV{'SYSTEM_TEAMFOUNDATIONCOLLECTIONURI'}$ENV{'SYSTEM_TEAMPROJECTID'}";
- my $azure_run=`curl --silent --noproxy "*" \\
+ my $azure_run=`$curl --silent --noproxy "*" \\
--header "Authorization: Bearer $ENV{'AZURE_ACCESS_TOKEN'}" \\
--header "Content-Type: application/json" \\
--data "
@@ -56,12 +57,13 @@ sub azure_create_test_run {
}
sub azure_create_test_result {
- my ($azure_run_id, $testnum, $testname)=@_;
+ my ($curl, $azure_run_id, $testnum, $testname)=@_;
$testname =~ s/\\/\\\\/g;
$testname =~ s/\'/\\\'/g;
$testname =~ s/\"/\\\"/g;
+ my $title_testnum=sprintf("%04d", $testnum);
my $azure_baseurl="$ENV{'SYSTEM_TEAMFOUNDATIONCOLLECTIONURI'}$ENV{'SYSTEM_TEAMPROJECTID'}";
- my $azure_result=`curl --silent --noproxy "*" \\
+ my $azure_result=`$curl --silent --noproxy "*" \\
--header "Authorization: Bearer $ENV{'AZURE_ACCESS_TOKEN'}" \\
--header "Content-Type: application/json" \\
--data "
@@ -69,7 +71,8 @@ sub azure_create_test_result {
{
'build': {'id': '$ENV{'BUILD_BUILDID'}'},
'testCase': {'id': $testnum},
- 'testCaseTitle': '$testname',
+ 'testCaseTitle': '$title_testnum: $testname',
+ 'testCaseRevision': 2,
'automatedTestName': 'curl.tests.$testnum',
'outcome': 'InProgress'
}
@@ -83,7 +86,7 @@ sub azure_create_test_result {
}
sub azure_update_test_result {
- my ($azure_run_id, $azure_result_id, $testnum, $error, $start, $stop)=@_;
+ my ($curl, $azure_run_id, $azure_result_id, $testnum, $error, $start, $stop)=@_;
if(!defined $stop) {
$stop = $start;
}
@@ -104,7 +107,7 @@ sub azure_update_test_result {
$azure_outcome = 'Failed';
}
my $azure_baseurl="$ENV{'SYSTEM_TEAMFOUNDATIONCOLLECTIONURI'}$ENV{'SYSTEM_TEAMPROJECTID'}";
- my $azure_result=`curl --silent --noproxy "*" --request PATCH \\
+ my $azure_result=`$curl --silent --noproxy "*" --request PATCH \\
--header "Authorization: Bearer $ENV{'AZURE_ACCESS_TOKEN'}" \\
--header "Content-Type: application/json" \\
--data "
@@ -126,9 +129,9 @@ sub azure_update_test_result {
}
sub azure_update_test_run {
- my ($azure_run_id)=@_;
+ my ($curl, $azure_run_id)=@_;
my $azure_baseurl="$ENV{'SYSTEM_TEAMFOUNDATIONCOLLECTIONURI'}$ENV{'SYSTEM_TEAMPROJECTID'}";
- my $azure_run=`curl --silent --noproxy "*" --request PATCH \\
+ my $azure_run=`$curl --silent --noproxy "*" --request PATCH \\
--header "Authorization: Bearer $ENV{'AZURE_ACCESS_TOKEN'}" \\
--header "Content-Type: application/json" \\
--data "
diff --git a/tests/data/DISABLED b/tests/data/DISABLED
index 198728fd..1806a5db 100644
--- a/tests/data/DISABLED
+++ b/tests/data/DISABLED
@@ -2,31 +2,24 @@
# test cases are run by runtests.pl. Just add the plain test case numbers, one
# per line.
# Lines starting with '#' letters are treated as comments.
+#
+# Uses SRP to "a server not supporting it" but modern stunnel versions
+# will silently accept it and remain happy
+323
+#
594
+836
+882
+938
1209
1211
+# fnmatch differences are just too common to make testing them sensible
+1307
1316
+# test 1510 causes problems on the CI on github
+# example: https://travis-ci.org/curl/curl/builds/81633600
+1510
1512
-836
-882
-938
# test 1801 causes problems on Mac OS X and github
# https://github.com/curl/curl/issues/380
1801
-# test 1510 causes problems on the CI on github
-# example: https://travis-ci.org/curl/curl/builds/81633600
-1510
-# Pipelining test that is causing false positives a little too often
-1903
-# fnmatch differences are just too common to make testing them sensible
-1307
-# Pipelining is deprecated
-530
-584
-1900
-1901
-1902
-2033
-# Uses SRP to "a server not supporting it" but modern stunnel versions
-# will silently accept it and remain happy
-323
diff --git a/tests/data/Makefile.inc b/tests/data/Makefile.inc
index 3752502e..8a63358d 100644
--- a/tests/data/Makefile.inc
+++ b/tests/data/Makefile.inc
@@ -58,7 +58,7 @@ test307 test308 test309 test310 test311 test312 test313 test314 test315 \
test316 test317 test318 test319 test320 test321 test322 test323 test324 \
test325 test326 test327 test328 test329 test330 test331 test332 test333 \
test334 test335 test336 test337 test338 test339 test340 test341 test342 \
-test343 test344 test345 test346 \
+test343 test344 test345 test346 test347 test348 \
test350 test351 test352 test353 test354 test355 test356 test357 test358 \
test359 \
test393 test394 test395 test396 test397 \
@@ -66,20 +66,20 @@ test393 test394 test395 test396 test397 \
test400 test401 test402 test403 test404 test405 test406 test407 test408 \
test409 \
\
-test430 test431 test432 \
+test430 test431 test432 test433 test434 \
\
test490 test491 test492 \
\
test500 test501 test502 test503 test504 test505 test506 test507 test508 \
test509 test510 test511 test512 test513 test514 test515 test516 test517 \
test518 test519 test520 test521 test522 test523 test524 test525 test526 \
-test527 test528 test529 test530 test531 test532 test533 test534 test535 \
+test527 test528 test529 test531 test532 test533 test534 test535 \
test537 test538 test539 test540 test541 test542 test543 test544 \
test545 test546 test547 test548 test549 test550 test551 test552 test553 \
test554 test555 test556 test557 test558 test559 test560 test561 test562 \
test563 test564 test565 test566 test567 test568 test569 test570 test571 \
test572 test573 test574 test575 test576 test577 test578 test579 test580 \
-test581 test582 test583 test584 test585 test586 test587 test588 test589 \
+test581 test582 test583 test585 test586 test587 test588 test589 \
test590 test591 test592 test593 test594 test595 test596 test597 test598 \
test599 test600 test601 test602 test603 test604 test605 test606 test607 \
test608 test609 test610 test611 test612 test613 test614 test615 test616 \
@@ -136,56 +136,52 @@ test1136 test1137 test1138 test1139 test1140 test1141 test1142 test1143 \
test1144 test1145 test1146 test1147 test1148 test1149 test1150 test1151 \
test1152 test1153 test1154 test1155 test1156 test1157 test1158 test1159 \
test1160 test1161 test1162 test1163 test1164 test1165 test1166 test1167 \
-test1168 \
-\
-test1170 test1171 test1172 test1173 test1174 test1175 test1176 test1177 \
-test1178 test1179 \
+test1168 test1170 test1171 test1172 test1173 test1174 test1175 \
+test1176 test1177 test1178 test1179 \
\
test1190 test1191 test1192 test1193 test1194 test1195 test1196 test1197 \
\
test1200 test1201 test1202 test1203 test1204 test1205 test1206 test1207 \
test1208 test1209 test1210 test1211 test1212 test1213 test1214 test1215 \
-test1216 test1217 test1218 test1219 \
-test1220 test1221 test1222 test1223 test1224 test1225 test1226 test1227 \
-test1228 test1229 test1230 test1231 test1232 test1233 test1234 test1235 \
-test1236 test1237 test1238 test1239 test1240 test1241 test1242 test1243 \
-test1244 test1245 test1246 test1247 test1248 test1249 test1250 test1251 \
-test1252 test1253 test1254 test1255 test1256 test1257 test1258 test1259 \
-test1260 test1261 test1262 test1263 test1264 test1265 test1266 test1267 \
-test1268 test1269 test1270 test1271 \
+test1216 test1217 test1218 test1219 test1220 test1221 test1222 test1223 \
+test1224 test1225 test1226 test1227 test1228 test1229 test1230 test1231 \
+test1232 test1233 test1234 test1235 test1236 test1237 test1238 test1239 \
+test1240 test1241 test1242 test1243 test1244 test1245 test1246 test1247 \
+test1248 test1249 test1250 test1251 test1252 test1253 test1254 test1255 \
+test1256 test1257 test1258 test1259 test1260 test1261 test1262 test1263 \
+test1264 test1265 test1266 test1267 test1268 test1269 test1270 test1271 \
\
test1280 test1281 test1282 test1283 test1284 test1285 test1286 test1287 \
test1288 test1289 test1290 test1291 test1292 test1293 test1294 test1295 \
-test1296 \
-\
-test1298 test1299 test1300 test1301 test1302 test1303 test1304 test1305 \
-test1306 test1307 test1308 test1309 test1310 test1311 test1312 test1313 \
-test1314 test1315 test1316 test1317 test1318 test1319 test1320 test1321 \
-test1322 test1323 test1324 test1325 test1326 test1327 test1328 test1329 \
-test1330 test1331 test1332 test1333 test1334 test1335 test1336 test1337 \
-test1338 test1339 test1340 test1341 test1342 test1343 test1344 test1345 \
-test1346 test1347 test1348 test1349 test1350 test1351 test1352 test1353 \
-test1354 test1355 test1356 test1357 test1358 test1359 test1360 test1361 \
-test1362 test1363 test1364 test1365 test1366 test1367 test1368 test1369 \
-test1370 test1371 test1372 test1373 test1374 test1375 test1376 test1377 \
-test1378 test1379 test1380 test1381 test1382 test1383 test1384 test1385 \
-test1386 test1387 test1388 test1389 test1390 test1391 test1392 test1393 \
-test1394 test1395 test1396 test1397 test1398 test1399 test1400 test1401 \
-test1402 test1403 test1404 test1405 test1406 test1407 test1408 test1409 \
-test1410 test1411 test1412 test1413 test1414 test1415 test1416 test1417 \
-test1418 test1419 test1420 test1421 test1422 test1423 test1424 test1425 \
-test1426 test1427 test1428 test1429 test1430 test1431 test1432 test1433 \
-test1434 test1435 test1436 test1437 test1438 test1439 test1440 test1441 \
-test1442 test1443 test1444 test1445 test1446 test1447 test1448 test1449 \
-test1450 test1451 test1452 test1453 test1454 test1455 test1456 test1457 \
-test1458 test1459 test1460 \
+test1296 test1297 test1298 test1299 test1300 test1301 test1302 test1303 \
+test1304 test1305 test1306 test1307 test1308 test1309 test1310 test1311 \
+test1312 test1313 test1314 test1315 test1316 test1317 test1318 test1319 \
+test1320 test1321 test1322 test1323 test1324 test1325 test1326 test1327 \
+test1328 test1329 test1330 test1331 test1332 test1333 test1334 test1335 \
+test1336 test1337 test1338 test1339 test1340 test1341 test1342 test1343 \
+test1344 test1345 test1346 test1347 test1348 test1349 test1350 test1351 \
+test1352 test1353 test1354 test1355 test1356 test1357 test1358 test1359 \
+test1360 test1361 test1362 test1363 test1364 test1365 test1366 test1367 \
+test1368 test1369 test1370 test1371 test1372 test1373 test1374 test1375 \
+test1376 test1377 test1378 test1379 test1380 test1381 test1382 test1383 \
+test1384 test1385 test1386 test1387 test1388 test1389 test1390 test1391 \
+test1392 test1393 test1394 test1395 test1396 test1397 test1398 test1399 \
+test1400 test1401 test1402 test1403 test1404 test1405 test1406 test1407 \
+test1408 test1409 test1410 test1411 test1412 test1413 test1414 test1415 \
+test1416 test1417 test1418 test1419 test1420 test1421 test1422 test1423 \
+test1424 test1425 test1426 test1427 test1428 test1429 test1430 test1431 \
+test1432 test1433 test1434 test1435 test1436 test1437 test1438 test1439 \
+test1440 test1441 test1442 test1443 test1444 test1445 test1446 test1447 \
+test1448 test1449 test1450 test1451 test1452 test1453 test1454 test1455 \
+test1456 test1457 test1458 test1459 test1460 test1461 test1462 test1463 \
+test1464 test1465 \
\
test1500 test1501 test1502 test1503 test1504 test1505 test1506 test1507 \
test1508 test1509 test1510 test1511 test1512 test1513 test1514 test1515 \
test1516 test1517 test1518 test1519 test1520 test1521 test1522 test1523 \
test1524 test1525 test1526 test1527 test1528 test1529 test1530 test1531 \
test1532 test1533 test1534 test1535 test1536 test1537 test1538 test1539 \
-test1540 test1541 \
+test1540 \
\
test1550 test1551 test1552 test1553 test1554 test1555 test1556 test1557 \
test1558 test1559 test1560 test1561 test1562 test1563 test1564 test1565 \
@@ -206,14 +202,14 @@ test1700 test1701 test1702 \
\
test1800 test1801 \
\
-test1900 test1901 test1902 test1903 test1904 test1905 test1906 test1907 \
-test1908 test1909 test1910 \
+ test1904 test1905 test1906 test1907 \
+test1908 test1909 test1910 test1911 test1912 test1913 test1914 \
\
test2000 test2001 test2002 test2003 test2004 test2005 test2006 test2007 \
test2008 test2009 test2010 test2011 test2012 test2013 test2014 test2015 \
test2016 test2017 test2018 test2019 test2020 test2021 test2022 test2023 \
test2024 test2025 test2026 test2027 test2028 test2029 test2030 test2031 \
-test2032 test2033 test2034 test2035 test2036 test2037 test2038 test2039 \
+test2032 test2034 test2035 test2036 test2037 test2038 test2039 \
test2040 test2041 test2042 test2043 test2044 test2045 test2046 test2047 \
test2048 test2049 test2050 test2051 test2052 test2053 test2054 test2055 \
test2056 test2057 test2058 test2059 test2060 test2061 test2062 test2063 \
@@ -224,5 +220,5 @@ test2078 \
test2080 \
test2100 \
\
-test3000 test3001 \
-test3002 test3003 test3004 test3005 test3006 test3007 test3010
+test3000 test3001 test3002 test3003 test3004 test3005 test3006 test3007 \
+test3008 test3009 test3010 test3011 test3012 test3013 test3014 test3015
diff --git a/tests/data/test1 b/tests/data/test1
index 7c0e1602..461375b6 100644
--- a/tests/data/test1
+++ b/tests/data/test1
@@ -42,12 +42,10 @@ http://%HOSTIP:%HTTPPORT/1
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test10 b/tests/data/test10
index 806aa697..c5053b5d 100644
--- a/tests/data/test10
+++ b/tests/data/test10
@@ -43,12 +43,10 @@ the
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
PUT /we/want/10 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 78
Expect: 100-continue
diff --git a/tests/data/test1001 b/tests/data/test1001
index 53d7da38..6edaade7 100644
--- a/tests/data/test1001
+++ b/tests/data/test1001
@@ -81,14 +81,11 @@ test
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://%HOSTIP:%HTTPPORT/1001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Content-Range: bytes 2-4/5
-User-Agent: curl/7.12.1-CVS (i686-pc-linux-gnu) libcurl/7.12.1-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS libidn/0.4.6
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 0
@@ -97,6 +94,7 @@ GET http://%HOSTIP:%HTTPPORT/1001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="auser", realm="testrealm", nonce="1053604144", uri="/1001", response="6af4d89c952f4dd4cc215a6878dc499d"
Content-Range: bytes 2-4/5
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 3
diff --git a/tests/data/test1002 b/tests/data/test1002
index 5b6ef943..7ec7501f 100644
--- a/tests/data/test1002
+++ b/tests/data/test1002
@@ -80,14 +80,11 @@ test
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://%HOSTIP:%HTTPPORT/1002.upload1 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Content-Range: bytes 2-4/5
-User-Agent: curl/7.12.1-CVS (i686-pc-linux-gnu) libcurl/7.12.1-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS libidn/0.4.6
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 0
@@ -96,6 +93,7 @@ GET http://%HOSTIP:%HTTPPORT/1002.upload1 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="auser", realm="testrealm", nonce="1053604144", uri="/1002.upload1", response="198aa9b6acb4b0c71d02a197a5e41f54"
Content-Range: bytes 2-4/5
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 3
@@ -105,7 +103,7 @@ st
GET http://%HOSTIP:%HTTPPORT/1002.upload2 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Content-Range: bytes 2-4/5
-User-Agent: curl/7.16.1
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 0
@@ -114,7 +112,7 @@ GET http://%HOSTIP:%HTTPPORT/1002.upload2 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="auser", realm="testrealm", nonce="1053604144", uri="/1002.upload2", response="d711f0d2042786d930de635ba0d1a1d0"
Content-Range: bytes 2-4/5
-User-Agent: curl/7.16.1
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 3
diff --git a/tests/data/test1004 b/tests/data/test1004
index 955163b3..05e92a59 100644
--- a/tests/data/test1004
+++ b/tests/data/test1004
@@ -43,12 +43,10 @@ http://%HOSTIP:%HTTPPORT/1004 --proxy ""
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1004 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1008 b/tests/data/test1008
index a1ef0dd7..a076fa0d 100644
--- a/tests/data/test1008
+++ b/tests/data/test1008
@@ -110,23 +110,22 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
CONNECT test.remote.example.com.1008:%HTTPPORT HTTP/1.1
Host: test.remote.example.com.1008:%HTTPPORT
Proxy-Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
CONNECT test.remote.example.com.1008:%HTTPPORT HTTP/1.1
Host: test.remote.example.com.1008:%HTTPPORT
Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
GET /path/10080002 HTTP/1.1
-User-Agent: curl/7.12.3-CVS (i686-pc-linux-gnu) libcurl/7.12.3-CVS OpenSSL/0.9.6b zlib/1.1.4
Host: test.remote.example.com.1008:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
[DISCONNECT]
diff --git a/tests/data/test1011 b/tests/data/test1011
index 566867dd..6d3297a7 100644
--- a/tests/data/test1011
+++ b/tests/data/test1011
@@ -56,19 +56,17 @@ http://%HOSTIP:%HTTPPORT/blah/1011 -L -d "moo"
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
POST /blah/1011 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 3
Content-Type: application/x-www-form-urlencoded
mooGET /blah/moo.html&testcase=/10110002 HTTP/1.1
-User-Agent: curl/7.10 (i686-pc-linux-gnu) libcurl/7.10 OpenSSL/0.9.6c ipv6 zlib/1.1.3
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1012 b/tests/data/test1012
index 4edc1731..943db91c 100644
--- a/tests/data/test1012
+++ b/tests/data/test1012
@@ -56,19 +56,17 @@ http://%HOSTIP:%HTTPPORT/blah/1012 -L -d "moo" --post301
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol nonewline="yes">
POST /blah/1012 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 3
Content-Type: application/x-www-form-urlencoded
mooPOST /blah/moo.html&testcase=/10120002 HTTP/1.1
-User-Agent: curl/7.10 (i686-pc-linux-gnu) libcurl/7.10 OpenSSL/0.9.6c ipv6 zlib/1.1.3
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 3
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test1015 b/tests/data/test1015
index a2b2cefa..c568b867 100644
--- a/tests/data/test1015
+++ b/tests/data/test1015
@@ -38,13 +38,10 @@ content to _?!#$'|<>
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol nonewline="yes">
POST /1015 HTTP/1.1
-User-Agent: curl/7.17.2-CVS (i686-pc-linux-gnu) libcurl/7.17.2-CVS OpenSSL/0.9.8g zlib/1.2.3.3 c-ares/1.5.2-CVS libidn/1.1 libssh2/0.19.0-C
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 133
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test1021 b/tests/data/test1021
index 84d1e62a..10a0314a 100644
--- a/tests/data/test1021
+++ b/tests/data/test1021
@@ -115,27 +115,27 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
CONNECT test.remote.example.com.1021:%HTTPPORT HTTP/1.1
Host: test.remote.example.com.1021:%HTTPPORT
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
CONNECT test.remote.example.com.1021:%HTTPPORT HTTP/1.1
Host: test.remote.example.com.1021:%HTTPPORT
Proxy-Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
CONNECT test.remote.example.com.1021:%HTTPPORT HTTP/1.1
Host: test.remote.example.com.1021:%HTTPPORT
Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
GET /path/10210002 HTTP/1.1
-User-Agent: curl/7.12.3-CVS (i686-pc-linux-gnu) libcurl/7.12.3-CVS OpenSSL/0.9.6b zlib/1.1.4
Host: test.remote.example.com.1021:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1024 b/tests/data/test1024
index 086ef267..4971eedb 100644
--- a/tests/data/test1024
+++ b/tests/data/test1024
@@ -81,20 +81,20 @@ http://%HOSTIP:%HTTPPORT/want/1024 -L -c log/jar1024
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/1024 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /data/10240002.txt HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /want/10240003.txt HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Cookie: firstcookie=want
diff --git a/tests/data/test1025 b/tests/data/test1025
index 494f8f8d..66f7532b 100644
--- a/tests/data/test1025
+++ b/tests/data/test1025
@@ -81,22 +81,22 @@ http://%HOSTIP:%HTTPPORT/want/1025 -L -c log/jar1025 -b forcedcookie=yes
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/1025 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Cookie: forcedcookie=yes
GET /data/10250002.txt HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Cookie: forcedcookie=yes
GET /want/10250003.txt HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Cookie: firstcookie=want; forcedcookie=yes
diff --git a/tests/data/test1028 b/tests/data/test1028
index b154372a..c10d5812 100644
--- a/tests/data/test1028
+++ b/tests/data/test1028
@@ -52,12 +52,10 @@ http://%HOSTIP:%HTTPPORT/10280001 -L
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /10280001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
USER anonymous
diff --git a/tests/data/test1029 b/tests/data/test1029
index c77209ca..9a351a4f 100644
--- a/tests/data/test1029
+++ b/tests/data/test1029
@@ -36,12 +36,10 @@ http://%HOSTIP:%HTTPPORT/we/want/our/1029 -w '%{redirect_url}\n'
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/want/our/1029 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1030 b/tests/data/test1030
index 5a8ed4cd..735c08b7 100644
--- a/tests/data/test1030
+++ b/tests/data/test1030
@@ -79,12 +79,10 @@ four is the number of lines
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
PUT /1030 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 85
Expect: 100-continue
@@ -96,7 +94,7 @@ four is the number of lines
PUT /1030 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="gimme all yer s3cr3ts", nonce="11223344", uri="/1030", response="01cb59db1ddaac246b072d5f5f0716d9"
-User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 85
Expect: 100-continue
diff --git a/tests/data/test1031 b/tests/data/test1031
index 9cfbab5c..b12785a0 100644
--- a/tests/data/test1031
+++ b/tests/data/test1031
@@ -59,16 +59,15 @@ http://%HOSTIP:%HTTPPORT/want/this/1031 -L
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/this/1031 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /want/this/1031?coolsite=yes/10310002.txt HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1032 b/tests/data/test1032
index b0b6834c..0c38ae13 100644
--- a/tests/data/test1032
+++ b/tests/data/test1032
@@ -42,13 +42,11 @@ HTTP HEAD with --range
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
HEAD /1032 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Range: bytes=1-3
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1033 b/tests/data/test1033
index 9ad5d252..908dd32c 100644
--- a/tests/data/test1033
+++ b/tests/data/test1033
@@ -47,12 +47,10 @@ http://%HOSTIP:%HTTPPORT/1033
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1033 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1035 b/tests/data/test1035
index 62f9d7ae..b67eab28 100644
--- a/tests/data/test1035
+++ b/tests/data/test1035
@@ -42,9 +42,6 @@ http://too-long-IDN-name-cürl-rüles-la-la-la-dee-da-flooby-nooby.local/page/10
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<errorcode>
3
</errorcode>
diff --git a/tests/data/test1040 b/tests/data/test1040
index e21ed819..d480bb44 100644
--- a/tests/data/test1040
+++ b/tests/data/test1040
@@ -65,13 +65,11 @@ http://%HOSTIP:%HTTPPORT/1040 -C -
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1040 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Range: bytes=100-
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1041 b/tests/data/test1041
index c77d616a..4797cf93 100644
--- a/tests/data/test1041
+++ b/tests/data/test1041
@@ -50,15 +50,13 @@ http://%HOSTIP:%HTTPPORT/1041 -Tlog/test1041.txt -C -
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
# curl doesn't do a HEAD request on the remote file so it has no idea whether
# it can skip part of the file or not. Instead, it sends the entire file.
<protocol>
PUT /1041 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Content-Range: bytes 0-99/100
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 100
Expect: 100-continue
diff --git a/tests/data/test1042 b/tests/data/test1042
index dfebaa15..d374d2ab 100644
--- a/tests/data/test1042
+++ b/tests/data/test1042
@@ -80,13 +80,11 @@ http://%HOSTIP:%HTTPPORT/1042 -C 200
<errorcode>
33
</errorcode>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1042 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Range: bytes=200-
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1043 b/tests/data/test1043
index 4ab49876..e200b61e 100644
--- a/tests/data/test1043
+++ b/tests/data/test1043
@@ -70,13 +70,11 @@ http://%HOSTIP:%HTTPPORT/1043 -C -
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1043 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Range: bytes=40-
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1045 b/tests/data/test1045
index fa8ad4b4..9de169ba 100644
--- a/tests/data/test1045
+++ b/tests/data/test1045
@@ -39,12 +39,10 @@ http://%HOSTIP:%HTTPPORT/1045 --interface %CLIENTIP
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1045 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1046 b/tests/data/test1046
index e86e1329..0f04b8a3 100644
--- a/tests/data/test1046
+++ b/tests/data/test1046
@@ -47,12 +47,10 @@ perl -e "print 'Test requires default test client host address' if ( '%CLIENT6IP
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1046 HTTP/1.1
Host: %HOST6IP:%HTTP6PORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1051 b/tests/data/test1051
index 080e1d1d..7a8eae1b 100644
--- a/tests/data/test1051
+++ b/tests/data/test1051
@@ -73,9 +73,6 @@ the
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
# The primary reason libcurl sends the data part twice in this test is that
# the test HTTP server is blocking until it has read the entire request,
@@ -85,6 +82,7 @@ the
<protocol>
PUT /want/1051 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 78
Expect: 100-continue
@@ -100,6 +98,7 @@ the
feature
PUT /want/data/10510002.txt?coolsite=yes HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 78
Expect: 100-continue
diff --git a/tests/data/test1052 b/tests/data/test1052
index 10c16b4a..e0c2f32a 100644
--- a/tests/data/test1052
+++ b/tests/data/test1052
@@ -69,9 +69,6 @@ the
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
# The primary reason libcurl sends the data part twice in this test is that
# the test HTTP server is blocking until it has read the entire request,
@@ -80,6 +77,7 @@ the
<protocol>
PUT /want/1052 HTTP/1.0
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 78
@@ -94,6 +92,7 @@ the
feature
PUT /want/data/10520002.txt?coolsite=yes HTTP/1.0
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 78
diff --git a/tests/data/test1053 b/tests/data/test1053
index 239a1100..5f3ec293 100644
--- a/tests/data/test1053
+++ b/tests/data/test1053
@@ -71,12 +71,12 @@ bar
# Verify data after the test has been "shot"
<verify>
<strip>
-^(User-Agent:|Content-Type: multipart/form-data;|------------).*
+^(Content-Type: multipart/form-data;|------------).*
</strip>
<protocol>
POST /we/want/1053 HTTP/1.1
-User-Agent: curl/7.18.2 (i686-pc-linux-gnu) libcurl/7.18.2 OpenSSL/0.9.7a ipv6 zlib/1.1.4
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 410
Content-Type: multipart/form-data; boundary=----------------------------9ef8d6205763
@@ -99,8 +99,8 @@ bar
------------------------------9ef8d6205763--
POST /we/want/data/10530002.txt?coolsite=yes HTTP/1.1
-User-Agent: curl/7.18.2 (i686-pc-linux-gnu) libcurl/7.18.2 OpenSSL/0.9.7a ipv6 zlib/1.1.4
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 410
Content-Type: multipart/form-data; boundary=----------------------------9ef8d6205763
diff --git a/tests/data/test1054 b/tests/data/test1054
index 54d02326..ac6671f6 100644
--- a/tests/data/test1054
+++ b/tests/data/test1054
@@ -58,18 +58,17 @@ http://%HOSTIP:%HTTPPORT/blah/1054 -L -d @log/test1054.txt --post301
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol nonewline="yes">
POST /blah/1054 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 10
Content-Type: application/x-www-form-urlencoded
field=dataPOST /blah/moo/testcase/10540002 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 10
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test1055 b/tests/data/test1055
index f25db8f4..4788ae77 100644
--- a/tests/data/test1055
+++ b/tests/data/test1055
@@ -54,12 +54,10 @@ the
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
PUT /1055 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 78
Expect: 100-continue
diff --git a/tests/data/test1056 b/tests/data/test1056
index 756d0f27..7ccdb219 100644
--- a/tests/data/test1056
+++ b/tests/data/test1056
@@ -60,16 +60,15 @@ http://%HOSTIP:%HTTPPORT/we/are/all/twits/1056 -L
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/are/all/twits/1056 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /moo/10560002 HTTP/1.1
Host: %HOST6IP:%HTTP6PORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1058 b/tests/data/test1058
index 4eb34da7..d177b5fd 100644
--- a/tests/data/test1058
+++ b/tests/data/test1058
@@ -39,13 +39,11 @@ http://%HOSTIP:%HTTPPORT/want/1058 -r -101
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/1058 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Range: bytes=-101
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1059 b/tests/data/test1059
index 615e625c..32e5aec3 100644
--- a/tests/data/test1059
+++ b/tests/data/test1059
@@ -46,12 +46,10 @@ ftp://test-number:1059/wanted/page -p -x %HOSTIP:%HTTPPORT
<errorcode>
56
</errorcode>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
CONNECT test-number:1059 HTTP/1.1
Host: test-number:1059
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
</protocol>
diff --git a/tests/data/test1060 b/tests/data/test1060
index c4b264c1..889a3905 100644
--- a/tests/data/test1060
+++ b/tests/data/test1060
@@ -18,7 +18,7 @@ HTTP proxy Digest auth
HTTP/1.1 407 Authorization Required to proxy me my dear
Proxy-Authenticate: Digest realm="weirdorealm", nonce="12345"
Content-Length: 40000
-X-tra-long-header: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+X-tra-long-header: %repeat[16080 x a]%
And you should ignore this data. aaaaaaaaaaaaaaaa
And you should ignore this data. aaaaaaaaaaaaaaaa
@@ -845,7 +845,7 @@ Server: no
HTTP/1.1 407 Authorization Required to proxy me my dear
Proxy-Authenticate: Digest realm="weirdorealm", nonce="12345"
Content-Length: 40000
-X-tra-long-header: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+X-tra-long-header: %repeat[16080 x a]%
HTTP/1.1 200 OK swsbounce
Server: no
@@ -881,21 +881,21 @@ http://test.remote.haxx.se.1060:8990/path/10600002 --proxy http://%HOSTIP:%HTTPP
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
CONNECT test.remote.haxx.se.1060:8990 HTTP/1.1
Host: test.remote.haxx.se.1060:8990
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
CONNECT test.remote.haxx.se.1060:8990 HTTP/1.1
Host: test.remote.haxx.se.1060:8990
Proxy-Authorization: Digest username="silly", realm="weirdorealm", nonce="12345", uri="test.remote.haxx.se.1060:8990", response="e1fbed39c26f4efe284adc0e576ff638"
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
GET /path/10600002 HTTP/1.1
Host: test.remote.haxx.se.1060:8990
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1061 b/tests/data/test1061
index 6ddddfee..1c1c3b1d 100644
--- a/tests/data/test1061
+++ b/tests/data/test1061
@@ -19,7 +19,7 @@ HTTP proxy Digest auth
HTTP/1.1 407 Authorization Required to proxy me my dear
Proxy-Authenticate: Digest realm="weirdorealm", nonce="12345"
Transfer-Encoding: chunked
-X-tra-long-header: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+X-tra-long-header: %repeat[16080 x a]%
9c40
And you should ignore this data. aaaaaaaaaaaaaaaa
@@ -850,7 +850,7 @@ Server: no
HTTP/1.1 407 Authorization Required to proxy me my dear
Proxy-Authenticate: Digest realm="weirdorealm", nonce="12345"
Transfer-Encoding: chunked
-X-tra-long-header: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+X-tra-long-header: %repeat[16080 x a]%
HTTP/1.1 200 OK swsbounce
Server: no
@@ -886,21 +886,21 @@ http://test.remote.haxx.se.1061:8990/path/10610002 --proxy http://%HOSTIP:%HTTPP
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
CONNECT test.remote.haxx.se.1061:8990 HTTP/1.1
Host: test.remote.haxx.se.1061:8990
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
CONNECT test.remote.haxx.se.1061:8990 HTTP/1.1
Host: test.remote.haxx.se.1061:8990
Proxy-Authorization: Digest username="silly", realm="weirdorealm", nonce="12345", uri="test.remote.haxx.se.1061:8990", response="4e23449fa93224834299e7282a70472c"
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
GET /path/10610002 HTTP/1.1
Host: test.remote.haxx.se.1061:8990
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1064 b/tests/data/test1064
index dd05ddf3..3d2f4d2c 100644
--- a/tests/data/test1064
+++ b/tests/data/test1064
@@ -44,18 +44,17 @@ test
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
PUT /1064.upload1 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 5
test
PUT /10640002.upload2 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 5
diff --git a/tests/data/test1065 b/tests/data/test1065
index 5688ff96..1d27ffb4 100644
--- a/tests/data/test1065
+++ b/tests/data/test1065
@@ -45,18 +45,17 @@ test
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
PUT /1065.upload1 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 5
test
GET /10650002.url2 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1066 b/tests/data/test1066
index bacedefb..8175af17 100644
--- a/tests/data/test1066
+++ b/tests/data/test1066
@@ -41,16 +41,15 @@ http://%HOSTIP:%HTTPPORT/want/1066 http://%HOSTIP:%HTTPPORT/want/10660001 --dump
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/1066 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /want/10660001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1067 b/tests/data/test1067
index 9fc7a6fa..4706a0a5 100644
--- a/tests/data/test1067
+++ b/tests/data/test1067
@@ -59,17 +59,16 @@ http://%HOSTIP:%HTTPPORT/want/1067 -L --referer "firstone.html;auto"
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/1067 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Referer: firstone.html
GET /want/data/10670002.txt?coolsite=yes HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Referer: http://%HOSTIP:%HTTPPORT/want/1067
diff --git a/tests/data/test1068 b/tests/data/test1068
index f9bfec90..15a702d1 100644
--- a/tests/data/test1068
+++ b/tests/data/test1068
@@ -38,12 +38,10 @@ more than one byte
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
PUT /bzz/1068 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Transfer-Encoding: chunked
Expect: 100-continue
diff --git a/tests/data/test1070 b/tests/data/test1070
index 81b473de..6056e5d9 100644
--- a/tests/data/test1070
+++ b/tests/data/test1070
@@ -48,12 +48,10 @@ OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol nonewline="yes">
POST /1070 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Expect: 100-continue
Content-Length: 2313
diff --git a/tests/data/test1071 b/tests/data/test1071
index 4352e611..d89b74bd 100644
--- a/tests/data/test1071
+++ b/tests/data/test1071
@@ -85,12 +85,10 @@ four is the number of lines
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
PUT /1071 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 85
Expect: 100-continue
@@ -102,6 +100,7 @@ four is the number of lines
PUT /1071 HTTP/1.0
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="gimme all yer s3cr3ts", nonce="11223344", uri="/1071", response="df4cef6b52a30e65d472dd848d2055a1"
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 85
diff --git a/tests/data/test1072 b/tests/data/test1072
index 14b6d804..128f0944 100644
--- a/tests/data/test1072
+++ b/tests/data/test1072
@@ -55,12 +55,10 @@ which is impossible in HTTP/1.0
<errorcode>
25
</errorcode>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
PUT /1072 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Transfer-Encoding: chunked
Expect: 100-continue
diff --git a/tests/data/test1073 b/tests/data/test1073
index 481f9098..80f5ec0d 100644
--- a/tests/data/test1073
+++ b/tests/data/test1073
@@ -49,12 +49,10 @@ which is impossible in HTTP/1.0
<errorcode>
25
</errorcode>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
PUT /1073 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Transfer-Encoding: chunked
Expect: 100-continue
diff --git a/tests/data/test1074 b/tests/data/test1074
index 3464b418..840d4619 100644
--- a/tests/data/test1074
+++ b/tests/data/test1074
@@ -59,16 +59,15 @@ Connection: close
surprise2
</stdout>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/1074 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /wantmore/10740001 HTTP/1.0
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1075 b/tests/data/test1075
index 4b30c593..f0f255ab 100644
--- a/tests/data/test1075
+++ b/tests/data/test1075
@@ -64,12 +64,10 @@ four is the number of lines
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
PUT /1075 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 85
Expect: 100-continue
@@ -81,6 +79,7 @@ four is the number of lines
PUT /1075 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Basic dGVzdHVzZXI6dGVzdHBhc3M=
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 85
Expect: 100-continue
diff --git a/tests/data/test1076 b/tests/data/test1076
index ad079eb9..8322be23 100644
--- a/tests/data/test1076
+++ b/tests/data/test1076
@@ -56,19 +56,17 @@ http://%HOSTIP:%HTTPPORT/blah/1076 -L -d "moo" --post302
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol nonewline="yes">
POST /blah/1076 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 3
Content-Type: application/x-www-form-urlencoded
mooPOST /blah/moo.html&testcase=/10760002 HTTP/1.1
-User-Agent: curl/7.10 (i686-pc-linux-gnu) libcurl/7.10 OpenSSL/0.9.6c ipv6 zlib/1.1.3
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 3
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test1077 b/tests/data/test1077
index e917e8a5..8b1d288d 100644
--- a/tests/data/test1077
+++ b/tests/data/test1077
@@ -57,17 +57,16 @@ FTP over HTTP proxy with downgrade to HTTP 1.0
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET ftp://%HOSTIP:%HTTPPORT/we/want/that/page/1077 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET ftp://%HOSTIP:%HTTPPORT/we/want/that/page/10770002 HTTP/1.0
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test1078 b/tests/data/test1078
index d705dbca..65c77ed7 100644
--- a/tests/data/test1078
+++ b/tests/data/test1078
@@ -53,22 +53,22 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<proxy>
CONNECT %HOSTIP.1078:%HTTPPORT HTTP/1.0
Host: %HOSTIP.1078:%HTTPPORT
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
</proxy>
<protocol>
GET /we/want/that/page/1078 HTTP/1.1
Host: %HOSTIP.1078:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /we/want/that/page/1078 HTTP/1.0
Host: %HOSTIP.1078:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1079 b/tests/data/test1079
index ac7b899f..460439d5 100644
--- a/tests/data/test1079
+++ b/tests/data/test1079
@@ -58,17 +58,16 @@ http://%HOSTIP:%HTTPPORT/1079 -u testuser:testpass --digest
<errorcode>
52
</errorcode>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1079 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /1079 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="testrealm", nonce="1053604145", uri="/1079", response="e340c7cdca0950462070f46ee139e9f7"
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1080 b/tests/data/test1080
index e0f7d62a..9fa48576 100644
--- a/tests/data/test1080
+++ b/tests/data/test1080
@@ -36,16 +36,15 @@ http://%HOSTIP:%HTTPPORT/we/want/our/1080 http://%HOSTIP:%HTTPPORT/we/want/our/1
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/want/our/1080 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /we/want/our/1080 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1081 b/tests/data/test1081
index d9f895fd..2a5a765e 100644
--- a/tests/data/test1081
+++ b/tests/data/test1081
@@ -44,16 +44,15 @@ http://%HOSTIP:%HTTPPORT/we/want/our/1081 http://%HOSTIP:%HTTPPORT/we/want/our/1
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/want/our/1081 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /we/want/our/10810002 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1082 b/tests/data/test1082
index 8e4078b2..0df70afa 100644
--- a/tests/data/test1082
+++ b/tests/data/test1082
@@ -42,12 +42,10 @@ perl -e "print 'Test requires default test client host address' if ( '%CLIENTIP'
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1082 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1083 b/tests/data/test1083
index 1b1db053..89beea0f 100644
--- a/tests/data/test1083
+++ b/tests/data/test1083
@@ -46,12 +46,10 @@ perl -e "if ('%CLIENT6IP' ne '[::1]') {print 'Test requires default test client
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1083 HTTP/1.1
Host: %HOST6IP:%HTTP6PORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1087 b/tests/data/test1087
index 883d9864..f6742940 100644
--- a/tests/data/test1087
+++ b/tests/data/test1087
@@ -88,23 +88,23 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://first.host.it.is/we/want/that/page/10871000 HTTP/1.1
Host: first.host.it.is
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://first.host.it.is/we/want/that/page/10871000 HTTP/1.1
Host: first.host.it.is
Authorization: Basic aWFtOm15c2VsZg==
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://goto.second.host.now/10871002 HTTP/1.1
Host: goto.second.host.now
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test1088 b/tests/data/test1088
index f2b6fc26..649cb88e 100644
--- a/tests/data/test1088
+++ b/tests/data/test1088
@@ -89,24 +89,24 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://first.host.it.is/we/want/that/page/10881000 HTTP/1.1
Host: first.host.it.is
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://first.host.it.is/we/want/that/page/10881000 HTTP/1.1
Host: first.host.it.is
Authorization: Basic aWFtOm15c2VsZg==
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://goto.second.host.now/10881002 HTTP/1.1
Host: goto.second.host.now
Authorization: Basic aWFtOm15c2VsZg==
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test1089 b/tests/data/test1089
index d2a18a21..d4b87913 100644
--- a/tests/data/test1089
+++ b/tests/data/test1089
@@ -50,16 +50,15 @@ http://%HOSTIP:%HTTPPORT/1089 -w "%{num_connects}\n%{num_redirects}\n%{size_down
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1089 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /10890001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1090 b/tests/data/test1090
index 3304f911..9ae803fb 100644
--- a/tests/data/test1090
+++ b/tests/data/test1090
@@ -57,16 +57,15 @@ http://%HOSTIP:%HTTPPORT/1090 -w "%{num_connects}\n%{num_redirects}\n%{size_down
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1090 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /10900001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1092 b/tests/data/test1092
index 725a274b..d3ea9024 100644
--- a/tests/data/test1092
+++ b/tests/data/test1092
@@ -43,12 +43,10 @@ FTP with type=i over HTTP proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET ftp://%HOSTIP:%HTTPPORT/we/want/that/page/1092;type=i HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test1095 b/tests/data/test1095
index 6bfe54f3..3e562b03 100644
--- a/tests/data/test1095
+++ b/tests/data/test1095
@@ -65,18 +65,16 @@ http://%HOSTIP:%HTTPPORT/1095 -u testuser:testpass --digest
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1095 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /1095 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="test \"this\" realm!!", nonce="1053604145", uri="/1095", response="a1c7931ece9e8617bae2715045e4f49f"
-User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1096 b/tests/data/test1096
index 30748c1b..a6c32c3a 100644
--- a/tests/data/test1096
+++ b/tests/data/test1096
@@ -11,6 +11,7 @@ FAILURE
<reply>
<servercmd>
REPLY RETR 550 no such file!
+REPLY SIZE 500 command not understood
</servercmd>
</reply>
diff --git a/tests/data/test1097 b/tests/data/test1097
index 82f23846..218d57bb 100644
--- a/tests/data/test1097
+++ b/tests/data/test1097
@@ -59,19 +59,16 @@ http://test.a.galaxy.far.far.away.1097:%HTTPPORT/1097 --proxy http://%HOSTIP:%HT
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol nonewline="yes">
CONNECT test.a.galaxy.far.far.away.1097:%HTTPPORT HTTP/1.1
Host: test.a.galaxy.far.far.away.1097:%HTTPPORT
Proxy-Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-User-Agent: curl/7.19.5-CVS (i686-pc-linux-gnu) libcurl/7.19.5-CVS OpenSSL/0.9.8g zlib/1.2.3.3 c-ares/1.6.1-CVS libidn/1.12 libssh2/1.0.1_CVS
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
POST /1097 HTTP/1.1
-User-Agent: curl/7.19.5-CVS (i686-pc-linux-gnu) libcurl/7.19.5-CVS OpenSSL/0.9.8g zlib/1.2.3.3 c-ares/1.6.1-CVS libidn/1.12 libssh2/1.0.1_CVS
Host: test.a.galaxy.far.far.away.1097:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 11
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test1098 b/tests/data/test1098
index 0d397340..a8d25cbe 100644
--- a/tests/data/test1098
+++ b/tests/data/test1098
@@ -43,17 +43,16 @@ ftp://ftp-site/moo/1098 ftp://ftp-site/moo/1098 --proxy http://%HOSTIP:%HTTPPORT
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET ftp://ftp-site/moo/1098 HTTP/1.1
Host: ftp-site:21
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET ftp://ftp-site/moo/1098 HTTP/1.1
Host: ftp-site:21
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test11 b/tests/data/test11
index 9d93f80e..3eed8a17 100644
--- a/tests/data/test11
+++ b/tests/data/test11
@@ -59,16 +59,15 @@ http://%HOSTIP:%HTTPPORT/want/11 -L
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/11 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /want/data/110002.txt?coolsite=yes HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1100 b/tests/data/test1100
index 101b1e7a..5bb80720 100644
--- a/tests/data/test1100
+++ b/tests/data/test1100
@@ -89,14 +89,10 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
-<protocol>
POST /1100 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 0
Content-Type: application/x-www-form-urlencoded
@@ -104,14 +100,14 @@ Content-Type: application/x-www-form-urlencoded
POST /1100 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 18
Content-Type: application/x-www-form-urlencoded
stuff to send awayGET /1100 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-User-Agent: curl/7.19.5-CVS (i686-pc-linux-gnu) libcurl/7.19.5-CVS GnuTLS/2.6.6 zlib/1.2.3.3 c-ares/1.6.1-CVS libidn/1.14 libssh2/1.1
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1101 b/tests/data/test1101
index 75c66195..eaf16bd6 100644
--- a/tests/data/test1101
+++ b/tests/data/test1101
@@ -40,13 +40,11 @@ http://user:secret@%HOSTIP:%HTTPPORT/gimme/1101
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /gimme/1101 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Basic dXNlcjpzZWNyZXQ=
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1104 b/tests/data/test1104
index e66da58a..2c5b9fcf 100644
--- a/tests/data/test1104
+++ b/tests/data/test1104
@@ -68,17 +68,16 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://%HOSTIP:%HTTPPORT/want/1104 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://%HOSTIP:%HTTPPORT/want/data/11040002 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Cookie: test2=true
diff --git a/tests/data/test1105 b/tests/data/test1105
index 78204458..8142ad26 100644
--- a/tests/data/test1105
+++ b/tests/data/test1105
@@ -41,12 +41,10 @@ perl -e "print 'Test requires default test server host' if ( '%HOSTIP' ne '127.0
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol nonewline="yes">
POST /we/want/1105?parm1=this*that/other/thing&parm2=foobar/1105 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 33
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test1106 b/tests/data/test1106
index 37a77e36..e23c33c0 100644
--- a/tests/data/test1106
+++ b/tests/data/test1106
@@ -44,12 +44,10 @@ ftp://%HOSTIP:23456/1106
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET ftp://%HOSTIP:23456/1106 HTTP/1.1
Host: %HOSTIP:23456
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test1109 b/tests/data/test1109
index b68b5a22..e504ce9d 100644
--- a/tests/data/test1109
+++ b/tests/data/test1109
@@ -33,12 +33,10 @@ http://%HOSTIP:%HTTPPORT/1109#test
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1109 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1110 b/tests/data/test1110
index 94cfe910..50bd4d20 100644
--- a/tests/data/test1110
+++ b/tests/data/test1110
@@ -34,12 +34,10 @@ http://%HOSTIP:%HTTPPORT/1110?q=foobar#fragment
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1110?q=foobar HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1111 b/tests/data/test1111
index d9db12c7..1ba21bff 100644
--- a/tests/data/test1111
+++ b/tests/data/test1111
@@ -34,12 +34,10 @@ http://%HOSTIP:%HTTPPORT/1111?q=foobar#fragment#fragment2
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1111?q=foobar HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1115 b/tests/data/test1115
index f9d6e364..0b1f034e 100644
--- a/tests/data/test1115
+++ b/tests/data/test1115
@@ -39,12 +39,10 @@ http://%HOSTIP:%HTTPPORT/1115
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1115 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1116 b/tests/data/test1116
index b72cbd60..ce5305d7 100644
--- a/tests/data/test1116
+++ b/tests/data/test1116
@@ -56,12 +56,10 @@ http://%HOSTIP:%HTTPPORT/1116 -D log/heads1116
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1116 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1117 b/tests/data/test1117
index 963f1efe..79c9fd4b 100644
--- a/tests/data/test1117
+++ b/tests/data/test1117
@@ -68,18 +68,17 @@ Content-Type: text/plain
partial body
</stdout>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/1117 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Range: bytes=10-22
+User-Agent: curl/%VERSION
Accept: */*
GET /wantmore/11170001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Range: bytes=10-22
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1118 b/tests/data/test1118
index bc776aff..702b2dfe 100644
--- a/tests/data/test1118
+++ b/tests/data/test1118
@@ -42,12 +42,10 @@ http://%HOSTIP:%HTTPPORT?email=name@example.com/1118
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /?email=name@example.com/1118 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1119 b/tests/data/test1119
index 5fb3c944..2f1b54c2 100644
--- a/tests/data/test1119
+++ b/tests/data/test1119
@@ -27,5 +27,4 @@ Verify that symbols-in-versions and headers are in sync
OK
</stdout>
</verify>
-
</testcase>
diff --git a/tests/data/test1121 b/tests/data/test1121
index 405066ff..839c5536 100644
--- a/tests/data/test1121
+++ b/tests/data/test1121
@@ -34,12 +34,10 @@ HTTP multiple provided Host: headers
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1121 HTTP/1.1
Host: host1
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1122 b/tests/data/test1122
index 78d50d77..d5b51a2c 100644
--- a/tests/data/test1122
+++ b/tests/data/test1122
@@ -55,12 +55,10 @@ http://%HOSTIP:%HTTPPORT/1122 --tr-encoding
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1122 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Connection: TE
TE: gzip
diff --git a/tests/data/test1123 b/tests/data/test1123
index bd441a99..841a326a 100644
--- a/tests/data/test1123
+++ b/tests/data/test1123
@@ -186,12 +186,10 @@ http://%HOSTIP:%HTTPPORT/1123 --tr-encoding
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1123 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Connection: TE
TE: gzip
diff --git a/tests/data/test1124 b/tests/data/test1124
index 58f63f93..61c5cfb6 100644
--- a/tests/data/test1124
+++ b/tests/data/test1124
@@ -54,12 +54,10 @@ http://%HOSTIP:%HTTPPORT/1124 --tr-encoding
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1124 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Connection: TE
TE: gzip
diff --git a/tests/data/test1125 b/tests/data/test1125
index 1883734d..51e3db78 100644
--- a/tests/data/test1125
+++ b/tests/data/test1125
@@ -55,12 +55,10 @@ http://%HOSTIP:%HTTPPORT/1125 --tr-encoding -H "Connection: close"
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1125 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Connection: close, TE
TE: gzip
diff --git a/tests/data/test1126 b/tests/data/test1126
index 52f4db41..4f99072c 100644
--- a/tests/data/test1126
+++ b/tests/data/test1126
@@ -38,12 +38,10 @@ http://%HOSTIP:%HTTPPORT/1126 -z "dec 12 12:00:00 1999 GMT"
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1126 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
If-Modified-Since: Sun, 12 Dec 1999 12:00:00 GMT
diff --git a/tests/data/test1127 b/tests/data/test1127
index 3cc42c26..e1453a60 100644
--- a/tests/data/test1127
+++ b/tests/data/test1127
@@ -47,12 +47,10 @@ http://%HOSTIP:%HTTPPORT/1127 -z "dec 12 12:00:00 1999 GMT"
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1127 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
If-Modified-Since: Sun, 12 Dec 1999 12:00:00 GMT
diff --git a/tests/data/test1128 b/tests/data/test1128
index a20487b4..a18f487e 100644
--- a/tests/data/test1128
+++ b/tests/data/test1128
@@ -48,17 +48,16 @@ http://%HOSTIP:%HTTPPORT/1128 http://%HOSTIP:%HTTPPORT/11280001 -z "dec 12 12:00
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1128 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
If-Modified-Since: Sun, 12 Dec 1999 12:00:00 GMT
GET /11280001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
If-Modified-Since: Sun, 12 Dec 1999 12:00:00 GMT
diff --git a/tests/data/test1129 b/tests/data/test1129
index cc523673..cadf8064 100644
--- a/tests/data/test1129
+++ b/tests/data/test1129
@@ -42,7 +42,7 @@ skip: 1053700
<client>
# 1053700 x 'x'
<file name="log/file1129">
-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+%repeat[1053700 x x]%
</file>
<server>
http
@@ -74,12 +74,10 @@ Content-Type: text/html
-foo-
</stdout>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
POST /1129 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 1053700
Content-Type: application/x-www-form-urlencoded
@@ -87,6 +85,7 @@ Expect: 100-continue
POST /11290001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 1053700
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test1130 b/tests/data/test1130
index eb1e59f5..01836cd7 100644
--- a/tests/data/test1130
+++ b/tests/data/test1130
@@ -74,12 +74,10 @@ Content-Type: text/html
-foo-
</stdout>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
POST /1130 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Expect: 100-continue
Content-Length: 100
@@ -87,6 +85,7 @@ Content-Type: application/x-www-form-urlencoded
POST /11300001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Expect: 100-continue
Content-Length: 100
diff --git a/tests/data/test1131 b/tests/data/test1131
index 96843af5..64df118f 100644
--- a/tests/data/test1131
+++ b/tests/data/test1131
@@ -74,18 +74,17 @@ Content-Type: text/html
FAILURE2
</stdout>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
PUT /1131 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 100
Expect: 100-continue
PUT /11310001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 100
Expect: 100-continue
diff --git a/tests/data/test1133 b/tests/data/test1133
index 738e8061..555bafcd 100644
--- a/tests/data/test1133
+++ b/tests/data/test1133
@@ -40,12 +40,12 @@ foo
# Verify data after the test has been "shot"
<verify>
<strip>
-^(User-Agent:|Content-Type: multipart/form-data;|Content-Type: multipart/mixed; boundary=|-------).*
+^(Content-Type: multipart/form-data;|Content-Type: multipart/mixed; boundary=|-------).*
</strip>
<protocol>
POST /we/want/1133 HTTP/1.1
-User-Agent: curl/7.10.4 (i686-pc-linux-gnu) libcurl/7.10.4 OpenSSL/0.9.7a ipv6 zlib/1.1.3
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 1264
Content-Type: multipart/form-data; boundary=----------------------------24e78000bd32
diff --git a/tests/data/test1134 b/tests/data/test1134
index e290b536..52aafcce 100644
--- a/tests/data/test1134
+++ b/tests/data/test1134
@@ -45,18 +45,17 @@ http://%HOSTIP:%HTTPPORT/1134 -u user1:password1 --next http://%HOSTIP:%HTTPPORT
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1134 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Basic dXNlcjE6cGFzc3dvcmQx
+User-Agent: curl/%VERSION
Accept: */*
GET /11340001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Basic MnVzZXI6cGFzc3dvcmQy
+User-Agent: curl/%VERSION
Accept: */*
[DISCONNECT]
diff --git a/tests/data/test1138 b/tests/data/test1138
index 0c91d204..a69d40fd 100644
--- a/tests/data/test1138
+++ b/tests/data/test1138
@@ -56,17 +56,15 @@ http://%HOSTIP:%HTTPPORT/we/are/all/twits/1138 -L
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/are/all/twits/1138 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /we/are/all/moo.html/?name=%d8%a2%d8%ba%d8%a7%d8%b2-%d8%b3%d9%85-%d8%b2%d8%af%d8%a7%db%8c%db%8c-%d8%a7%d8%b2-%d8%a8%d8%a7%d8%b2%d8%a7%d8%b1-%d9%be%d9%88%d9%84&testcase=/11380002 HTTP/1.1
-User-Agent: curl/7.10 (i686-pc-linux-gnu) libcurl/7.10 OpenSSL/0.9.6c ipv6 zlib/1.1.3
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1141 b/tests/data/test1141
index b0cff8e3..063d3b28 100644
--- a/tests/data/test1141
+++ b/tests/data/test1141
@@ -54,17 +54,16 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://%HOSTIP:%HTTPPORT/want/1141 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://foo.example.com/want/11410001 HTTP/1.1
Host: foo.example.com
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test1142 b/tests/data/test1142
index 5f1e2b35..3577ac46 100644
--- a/tests/data/test1142
+++ b/tests/data/test1142
@@ -49,12 +49,10 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://%HOSTIP:%HTTPPORT/want/1142 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test1143 b/tests/data/test1143
index 7776cfa8..8239c444 100644
--- a/tests/data/test1143
+++ b/tests/data/test1143
@@ -37,12 +37,10 @@ MSYS2_ARG_CONV_EXCL=http:/
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/1143 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1144 b/tests/data/test1144
index 84c22dba..58835556 100644
--- a/tests/data/test1144
+++ b/tests/data/test1144
@@ -54,12 +54,10 @@ HTTP HEAD, receive no headers only body
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
HEAD /1144 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1148 b/tests/data/test1148
index c4232f08..a4839e27 100644
--- a/tests/data/test1148
+++ b/tests/data/test1148
@@ -45,12 +45,10 @@ LC_NUMERIC=en_US.UTF-8
#
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1148 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1150 b/tests/data/test1150
index e86c7e15..f951f570 100644
--- a/tests/data/test1150
+++ b/tests/data/test1150
@@ -39,17 +39,16 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
GET http://test.remote.example.com.1150:150/path HTTP/1.1
Host: test.remote.example.com.1150:150
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://test.remote.example.com.1150:1234/path/ HTTP/1.1
Host: test.remote.example.com.1150:1234
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test1151 b/tests/data/test1151
index d793944c..e3abcbe9 100644
--- a/tests/data/test1151
+++ b/tests/data/test1151
@@ -44,12 +44,10 @@ http://%HOSTIP:%HTTPPORT/1151 -c log/cookies1151.txt
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1151 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1154 b/tests/data/test1154
index 3582eb99..8213528c 100644
--- a/tests/data/test1154
+++ b/tests/data/test1154
@@ -15,7 +15,7 @@ Date: Thu, 09 Nov 2010 14:49:00 GMT
Server: test-server/fake
Content-Length: 6
Connection: close
-Long: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+Long: %repeat[102400 x A]%
-foo-
</data>
@@ -40,12 +40,10 @@ http://%HOSTIP:%HTTPPORT/1154
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1154 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1155 b/tests/data/test1155
index 3db824d5..90d33bd7 100644
--- a/tests/data/test1155
+++ b/tests/data/test1155
@@ -34,12 +34,10 @@ http://%HOSTIP:%HTTPPORT/1155 -c log/cookies1155.txt
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1155 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1157 b/tests/data/test1157
index b0bbf244..baf12edb 100644
--- a/tests/data/test1157
+++ b/tests/data/test1157
@@ -45,12 +45,10 @@ http://%HOSTIP:%HTTPPORT/1157 -H @log/heads1157.txt
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1157 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1158 b/tests/data/test1158
index 62adc579..f2b40e01 100644
--- a/tests/data/test1158
+++ b/tests/data/test1158
@@ -43,12 +43,12 @@ foo
# Verify data after the test has been "shot"
<verify>
<strip>
-^(User-Agent:|Content-Type: multipart/form-data;|Content-Type: multipart/mixed; boundary=|-------).*
+^(Content-Type: multipart/form-data;|Content-Type: multipart/mixed; boundary=|-------).*
</strip>
<protocol>
POST /we/want/1158 HTTP/1.1
-User-Agent: curl/7.10.4 (i686-pc-linux-gnu) libcurl/7.10.4 OpenSSL/0.9.7a ipv6 zlib/1.1.3
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 954
Content-Type: multipart/form-data; boundary=----------------------------24e78000bd32
diff --git a/tests/data/test1159 b/tests/data/test1159
index a5160165..ea07f238 100644
--- a/tests/data/test1159
+++ b/tests/data/test1159
@@ -36,12 +36,10 @@ http://%HOSTIP:%HTTPPORT/we/want/our/1159 -w '%{redirect_url}\n'
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/want/our/1159 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1160 b/tests/data/test1160
index 63dd0a7a..cc864b3d 100644
--- a/tests/data/test1160
+++ b/tests/data/test1160
@@ -35,12 +35,10 @@ http://%HOSTIP:%HTTPPORT/1160 -c log/cookies1160.txt
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1160 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1161 b/tests/data/test1161
index ee6f1d04..f7b610e3 100644
--- a/tests/data/test1161
+++ b/tests/data/test1161
@@ -34,12 +34,10 @@ http://%HOSTIP:%HTTPPORT/1161 -c log/cookies1161.txt
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1161 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1164 b/tests/data/test1164
index a5ce6d11..f62b0f66 100644
--- a/tests/data/test1164
+++ b/tests/data/test1164
@@ -36,12 +36,10 @@ http://%HOSTIP:%HTTPPORT/1164 -w '%{size_download}\n' --http0.9
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1164 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1166 b/tests/data/test1166
index 3cae80ec..292d09fc 100644
--- a/tests/data/test1166
+++ b/tests/data/test1166
@@ -36,16 +36,15 @@ http://%HOSTIP:%HTTPPORT/want/1166 http://%HOSTIP:%HTTPPORT/want/1166
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/1166 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /want/1166 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1168 b/tests/data/test1168
index 283e91e0..b2f08fb6 100644
--- a/tests/data/test1168
+++ b/tests/data/test1168
@@ -59,18 +59,17 @@ http://%HOSTIP:%HTTPPORT/want/1168 -L -u "catmai#d:#DZaRJYrixKE*gFY"
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/1168 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Basic Y2F0bWFpI2Q6I0RaYVJKWXJpeEtFKmdGWQ==
+User-Agent: curl/%VERSION
Accept: */*
GET /data/11680002.txt HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Basic Y2F0bWFpI2Q6I0RaYVJKWXJpeEtFKmdGWQ==
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1170 b/tests/data/test1170
index a4d9eb84..39ff3c8c 100644
--- a/tests/data/test1170
+++ b/tests/data/test1170
@@ -55,12 +55,10 @@ http://%HOSTIP:%HTTPPORT/1170 --tr-encoding -H "Connection:"
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1170 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Connection: TE
TE: gzip
diff --git a/tests/data/test1171 b/tests/data/test1171
index 0f7ee90d..bc98d312 100644
--- a/tests/data/test1171
+++ b/tests/data/test1171
@@ -55,12 +55,10 @@ http://%HOSTIP:%HTTPPORT/1171 --tr-encoding -H "Connection;"
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1171 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Connection: TE
TE: gzip
diff --git a/tests/data/test1172 b/tests/data/test1172
index 6e61720b..a099057f 100644
--- a/tests/data/test1172
+++ b/tests/data/test1172
@@ -33,12 +33,10 @@ http://%HOSTIP:%HTTPPORT/1172 --no-http0.9
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1172 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1174 b/tests/data/test1174
index b316fde8..7768696f 100644
--- a/tests/data/test1174
+++ b/tests/data/test1174
@@ -33,12 +33,10 @@ http://%HOSTIP:%HTTPPORT/1174
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1174 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1176 b/tests/data/test1176
index 491bee16..ce992e34 100644
--- a/tests/data/test1176
+++ b/tests/data/test1176
@@ -41,12 +41,10 @@ http://%HOSTIP:%HTTPPORT/1176 -o 'log/base-#0'
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1176 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1178 b/tests/data/test1178
index 6d1264c3..91ef78c8 100644
--- a/tests/data/test1178
+++ b/tests/data/test1178
@@ -40,13 +40,11 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://%HOSTIP:%HTTPPORT/we/want/that/page/1178 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Proxy-Authorization: Basic QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQTpCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkI=
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test118 b/tests/data/test118
index 6cd086ca..94985e31 100644
--- a/tests/data/test118
+++ b/tests/data/test118
@@ -12,6 +12,7 @@ FAILURE
<servercmd>
REPLY RETR 314 bluah you f00l!
REPLY EPSV 314 bluah you f00l!
+REPLY SIZE 500 command not understood
</servercmd>
</reply>
diff --git a/tests/data/test119 b/tests/data/test119
index 00a24287..95d1021c 100644
--- a/tests/data/test119
+++ b/tests/data/test119
@@ -11,6 +11,7 @@ FAILURE
<reply>
<servercmd>
REPLY RETR 314 bluah you f00l!
+REPLY SIZE 500 command not understood
</servercmd>
</reply>
diff --git a/tests/data/test1197 b/tests/data/test1197
index 96d368f8..1abd9aeb 100644
--- a/tests/data/test1197
+++ b/tests/data/test1197
@@ -50,18 +50,17 @@ http://%HOSTIP:%HTTPPORT/1197 -w "%{method}\n" -L -d "twinkle twinkle little sta
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
POST /1197 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 27
Content-Type: application/x-www-form-urlencoded
twinkle twinkle little starGET /11970001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test12 b/tests/data/test12
index 06dbdf56..8f93abba 100644
--- a/tests/data/test12
+++ b/tests/data/test12
@@ -42,13 +42,11 @@ http://%HOSTIP:%HTTPPORT/want/12 -r 100-200
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/12 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Range: bytes=100-200
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1204 b/tests/data/test1204
index d2f06b68..50738011 100644
--- a/tests/data/test1204
+++ b/tests/data/test1204
@@ -61,17 +61,16 @@ http://%HOSTIP:%HTTPPORT/1204 -u testuser:testpass --anyauth
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1204 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /1204 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Basic dGVzdHVzZXI6dGVzdHBhc3M=
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1205 b/tests/data/test1205
index 7e4a882c..8509d3fd 100644
--- a/tests/data/test1205
+++ b/tests/data/test1205
@@ -37,12 +37,10 @@ http://%HOSTIP:%HTTPPORT/1205
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1205 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1210 b/tests/data/test1210
index df931988..71053f21 100644
--- a/tests/data/test1210
+++ b/tests/data/test1210
@@ -46,12 +46,10 @@ http://%HOSTIP:%HTTPPORT/1210 -J -O
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1210 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1212 b/tests/data/test1212
index a50601f7..7c2af2e5 100644
--- a/tests/data/test1212
+++ b/tests/data/test1212
@@ -37,13 +37,11 @@ http://user:secret@%HOSTIP:%HTTPPORT/ulion/1212 --socks5 non-existing-host.haxx.
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /ulion/1212 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Basic dXNlcjpzZWNyZXQ=
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1213 b/tests/data/test1213
index 46a6938c..54a8f2d9 100644
--- a/tests/data/test1213
+++ b/tests/data/test1213
@@ -42,12 +42,10 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://we.want.that.site.com.1213/ HTTP/1.1
Host: we.want.that.site.com.1213
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test1214 b/tests/data/test1214
index 73c799a4..985fd383 100644
--- a/tests/data/test1214
+++ b/tests/data/test1214
@@ -42,12 +42,10 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://we.want.that.site.com.1214/?moo=foo HTTP/1.1
Host: we.want.that.site.com.1214
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test1215 b/tests/data/test1215
index ed50da0b..7aa1c423 100644
--- a/tests/data/test1215
+++ b/tests/data/test1215
@@ -85,21 +85,18 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://%HOSTIP:%HTTPPORT/1215 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-User-Agent: curl/7.30.0-DEV
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://%HOSTIP:%HTTPPORT/1215 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=
-User-Agent: curl/7.30.0-DEV
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test1216 b/tests/data/test1216
index c4f977b6..62271332 100644
--- a/tests/data/test1216
+++ b/tests/data/test1216
@@ -46,18 +46,17 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://example.fake/c/1216 HTTP/1.1
Host: example.fake
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Cookie: moo3=indeed; moo2=indeed
GET http://bexample.fake/c/1216 HTTP/1.1
Host: bexample.fake
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test1218 b/tests/data/test1218
index 37c8f4ef..b9914d25 100644
--- a/tests/data/test1218
+++ b/tests/data/test1218
@@ -39,23 +39,23 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://example.fake/c/1218 HTTP/1.1
Host: example.fake
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://example.fake/c/1218 HTTP/1.1
Host: example.fake
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Cookie: bug=fixed
GET http://bexample.fake/c/1218 HTTP/1.1
Host: bexample.fake
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test1223 b/tests/data/test1223
index 2885bc59..f448f5c1 100644
--- a/tests/data/test1223
+++ b/tests/data/test1223
@@ -37,12 +37,10 @@ http://%HOSTIP:%HTTPPORT/1223 -w 'IP %{remote_ip} and PORT %{remote_port}\n'
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1223 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1228 b/tests/data/test1228
index 50af6bc2..529c7e55 100644
--- a/tests/data/test1228
+++ b/tests/data/test1228
@@ -38,17 +38,16 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://example.fake/hoge/1228 HTTP/1.1
Host: example.fake
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://example.fake/hogege/ HTTP/1.1
Host: example.fake
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Cookie: path1=root
diff --git a/tests/data/test1229 b/tests/data/test1229
index 225ba3cc..0cb45358 100644
--- a/tests/data/test1229
+++ b/tests/data/test1229
@@ -65,17 +65,16 @@ http://%5cuser%22:password@%HOSTIP:%HTTPPORT/1229 --digest
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1229 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /1229 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="\\user\"", realm="testrealm", nonce="1053604145", uri="/1229", response="f2694d426040712584c156d3de72b8d6"
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1230 b/tests/data/test1230
index 860ce21a..a439b17e 100644
--- a/tests/data/test1230
+++ b/tests/data/test1230
@@ -62,16 +62,15 @@ http://[1234:1234:1234::4ce]:%HTTPPORT/wanted/page/1230 -p -x %HOSTIP:%HTTPPORT
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
CONNECT [1234:1234:1234::4ce]:%HTTPPORT HTTP/1.1
Host: [1234:1234:1234::4ce]:%HTTPPORT
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
GET /wanted/page/1230 HTTP/1.1
Host: [1234:1234:1234::4ce]:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1231 b/tests/data/test1231
index 61998d1c..7b085c52 100644
--- a/tests/data/test1231
+++ b/tests/data/test1231
@@ -44,16 +44,15 @@ http://%HOSTIP:%HTTPPORT/../../hej/but/who/../1231?stupid=me/../1231#soo/../1231
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /hej/but/1231?stupid=me/../1231 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /hej/but/12310001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1232 b/tests/data/test1232
index 7425d44d..7a74cb12 100644
--- a/tests/data/test1232
+++ b/tests/data/test1232
@@ -49,17 +49,16 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://test.remote.haxx.se.1232:8990/hej/but/1232?stupid=me/../1232 HTTP/1.1
Host: test.remote.haxx.se.1232:8990
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://test.remote.haxx.se.1232:8990/hej/but/12320001 HTTP/1.1
Host: test.remote.haxx.se.1232:8990
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test1235 b/tests/data/test1235
index 9e51219f..3fffb420 100644
--- a/tests/data/test1235
+++ b/tests/data/test1235
@@ -40,28 +40,25 @@ multiple requests using {}{} in the URL
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /12350001 HTTP/1.1
-User-Agent: curl/7.8.1-pre3 (sparc-sun-solaris2.7) libcurl 7.8.1-pre3 (OpenSSL 0.9.6a) (krb4 enabled)
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /12350002 HTTP/1.1
-User-Agent: curl/7.8.1-pre3 (sparc-sun-solaris2.7) libcurl 7.8.1-pre3 (OpenSSL 0.9.6a) (krb4 enabled)
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /12350001 HTTP/1.1
-User-Agent: curl/7.8.1-pre3 (sparc-sun-solaris2.7) libcurl 7.8.1-pre3 (OpenSSL 0.9.6a) (krb4 enabled)
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /12350002 HTTP/1.1
-User-Agent: curl/7.8.1-pre3 (sparc-sun-solaris2.7) libcurl 7.8.1-pre3 (OpenSSL 0.9.6a) (krb4 enabled)
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1237 b/tests/data/test1237
index 21da17dc..a016e5fb 100644
--- a/tests/data/test1237
+++ b/tests/data/test1237
@@ -33,13 +33,11 @@ URL with 1000+ letter user name + password
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1237 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Basic QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQTpCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkI=
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1239 b/tests/data/test1239
index b3503d9c..375d92b6 100644
--- a/tests/data/test1239
+++ b/tests/data/test1239
@@ -41,12 +41,10 @@ http://%HOSTIP:%HTTPPORT/1239 -z "-dec 12 12:00:00 1999 GMT" -w '%{response_code
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1239 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
If-Unmodified-Since: Sun, 12 Dec 1999 12:00:00 GMT
diff --git a/tests/data/test1240 b/tests/data/test1240
index 64359505..44ce1f69 100644
--- a/tests/data/test1240
+++ b/tests/data/test1240
@@ -31,16 +31,15 @@ glob [0-1] with stuff after range (7.33.0 regression)
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /00/1240 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /01/1240 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1241 b/tests/data/test1241
index bc6c6180..0089828f 100644
--- a/tests/data/test1241
+++ b/tests/data/test1241
@@ -48,17 +48,16 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://test.remote.haxx.se.1241:8990/../../hej/but/who/../1241?stupid=me/../1241 HTTP/1.1
Host: test.remote.haxx.se.1241:8990
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://test.remote.haxx.se.1241:8990/../../hej/but/who/../12410001 HTTP/1.1
Host: test.remote.haxx.se.1241:8990
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test1244 b/tests/data/test1244
index 0912c094..c2ac4a4d 100644
--- a/tests/data/test1244
+++ b/tests/data/test1244
@@ -50,12 +50,10 @@ http://%HOSTIP:%HTTPPORT/1244 -x %HOSTIP:%HTTPPORT --next http://%HOSTIP:%HTTPPO
<errorcode>
56
</errorcode>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://%HOSTIP:%HTTPPORT/1244 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test1245 b/tests/data/test1245
index 8924bff9..d60ff2bc 100644
--- a/tests/data/test1245
+++ b/tests/data/test1245
@@ -42,12 +42,10 @@ ftp
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1245 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1246 b/tests/data/test1246
index a35bc89c..bc3d2b00 100644
--- a/tests/data/test1246
+++ b/tests/data/test1246
@@ -48,17 +48,16 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://test.remote.haxx.se.1246:%HTTPPORT/ HTTP/1.1
Host: test.remote.haxx.se.1246:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://no-scheme-url.com.1246:%HTTPPORT/ HTTP/1.1
Host: no-scheme-url.com.1246:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test1248 b/tests/data/test1248
index 02dacfc8..7410483b 100644
--- a/tests/data/test1248
+++ b/tests/data/test1248
@@ -35,13 +35,11 @@ http://user:secret@%HOSTIP:%HTTPPORT/1248 --proxy http://dummy:%NOLISTENPORT/ --
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1248 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Basic dXNlcjpzZWNyZXQ=
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1249 b/tests/data/test1249
index 1bc3cfe5..13a14630 100644
--- a/tests/data/test1249
+++ b/tests/data/test1249
@@ -38,13 +38,11 @@ http://user:secret@%HOSTIP:%HTTPPORT/1249 --proxy http://dummy:%NOLISTENPORT/ --
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1249 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Basic dXNlcjpzZWNyZXQ=
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1250 b/tests/data/test1250
index bf67b7fe..acd670e5 100644
--- a/tests/data/test1250
+++ b/tests/data/test1250
@@ -39,13 +39,11 @@ http://user:secret@%HOSTIP:%HTTPPORT/1250 --noproxy %HOSTIP --max-time 5
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1250 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Basic dXNlcjpzZWNyZXQ=
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1251 b/tests/data/test1251
index f37a685e..f5cf5130 100644
--- a/tests/data/test1251
+++ b/tests/data/test1251
@@ -40,13 +40,11 @@ http://user:secret@%HOSTIP:%HTTPPORT/1251 --max-time 5
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1251 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Basic dXNlcjpzZWNyZXQ=
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1252 b/tests/data/test1252
index cbaef48b..e68fcb91 100644
--- a/tests/data/test1252
+++ b/tests/data/test1252
@@ -39,12 +39,10 @@ http://%HOSTIP:%HTTPPORT/1252 --proxy http://%HOSTIP:%HTTPPORT --noproxy %HOSTIP
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1252 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1253 b/tests/data/test1253
index 8f240b0a..7ad1f86f 100644
--- a/tests/data/test1253
+++ b/tests/data/test1253
@@ -42,12 +42,10 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://somewhere.example.com/1253 HTTP/1.1
Host: somewhere.example.com
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test1254 b/tests/data/test1254
index c0597548..b2f27f94 100644
--- a/tests/data/test1254
+++ b/tests/data/test1254
@@ -42,12 +42,10 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://somewhere.example.com/1254 HTTP/1.1
Host: somewhere.example.com
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test1255 b/tests/data/test1255
index d82310f6..9148a56c 100644
--- a/tests/data/test1255
+++ b/tests/data/test1255
@@ -40,12 +40,10 @@ http://%HOSTIP:%HTTPPORT/1255 --noproxy %HOSTIP
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1255 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1256 b/tests/data/test1256
index e86afbb5..1ba0a098 100644
--- a/tests/data/test1256
+++ b/tests/data/test1256
@@ -43,12 +43,10 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://somewhere.example.com/1256 HTTP/1.1
Host: somewhere.example.com
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test1257 b/tests/data/test1257
index 16a7c1af..b05c524b 100644
--- a/tests/data/test1257
+++ b/tests/data/test1257
@@ -43,12 +43,10 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://somewhere.example.com/1257 HTTP/1.1
Host: somewhere.example.com
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test1258 b/tests/data/test1258
index 6fa88e16..297460c8 100644
--- a/tests/data/test1258
+++ b/tests/data/test1258
@@ -36,16 +36,15 @@ http://%HOSTIP:%HTTPPORT/we/want/1258 http://%HOSTIP:%HTTPPORT/we/want?hoge=fuga
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/want/1258 HTTP/1.1
Host: localhost
+User-Agent: curl/%VERSION
Accept: */*
GET /we/want?hoge=fuga HTTP/1.1
Host: localhost
+User-Agent: curl/%VERSION
Accept: */*
Cookie: I-am=here
diff --git a/tests/data/test1259 b/tests/data/test1259
index bad4ee25..0bfa71cd 100644
--- a/tests/data/test1259
+++ b/tests/data/test1259
@@ -33,13 +33,11 @@ HTTP URL with semicolon in password
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/want/1259 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Basic dXNlcjpwYXNzO3dvcmQ=
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1261 b/tests/data/test1261
index 7f887994..ef3cded5 100644
--- a/tests/data/test1261
+++ b/tests/data/test1261
@@ -36,12 +36,10 @@ http://%HOSTIP:%HTTPPORT/we/want/our/1261 -w '%{redirect_url}\n' --location --ma
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/want/our/1261 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1265 b/tests/data/test1265
index 5d3ef6dc..12d52431 100644
--- a/tests/data/test1265
+++ b/tests/data/test1265
@@ -40,12 +40,10 @@ http://%HOST6IP:%HTTP6PORT/1265
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1265 HTTP/1.1
Host: %HOST6IP:%HTTP6PORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1266 b/tests/data/test1266
index cab11efa..1de936e0 100644
--- a/tests/data/test1266
+++ b/tests/data/test1266
@@ -33,12 +33,10 @@ http://%HOSTIP:%HTTPPORT/1266 --http0.9
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1266 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1267 b/tests/data/test1267
index 82d37445..06500e87 100644
--- a/tests/data/test1267
+++ b/tests/data/test1267
@@ -33,12 +33,10 @@ http://%HOSTIP:%HTTPPORT/1267 --http0.9
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1267 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1270 b/tests/data/test1270
index 25799818..680e1e47 100644
--- a/tests/data/test1270
+++ b/tests/data/test1270
@@ -41,12 +41,10 @@ http://%HOSTIP:%HTTPPORT/we/want/our/1270 -w '%{redirect_url}\n' -s
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/want/our/1270 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1271 b/tests/data/test1271
index 687a6a97..ce89c38f 100644
--- a/tests/data/test1271
+++ b/tests/data/test1271
@@ -35,12 +35,10 @@ http://%HOSTIP:%HTTPPORT/we/want/our/1271 -w @log/blank1271
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/want/our/1271 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1280 b/tests/data/test1280
index 15c1e2fd..0b7bc004 100644
--- a/tests/data/test1280
+++ b/tests/data/test1280
@@ -33,24 +33,25 @@ http://%HOSTIP:%HTTPPORT/[a-d]/1280
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /a/1280 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /b/1280 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /c/1280 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /d/1280 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1283 b/tests/data/test1283
index ac275e92..d4c0ad96 100644
--- a/tests/data/test1283
+++ b/tests/data/test1283
@@ -36,12 +36,10 @@ http://%HOSTIP:%HTTPPORT/[a-a][1-1][b-b:1][2-2:1]/1283 -o "log/outfile1283_#1#2#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /a1b2/1283 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1284 b/tests/data/test1284
index 8437a408..4509a9b9 100644
--- a/tests/data/test1284
+++ b/tests/data/test1284
@@ -66,12 +66,10 @@ HTTP POST --digest with user-specified Content-Length header
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol nonewline="yes">
POST /1284 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 0
Content-Type: application/x-www-form-urlencoded
@@ -79,6 +77,7 @@ Content-Type: application/x-www-form-urlencoded
POST /1284 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="auser", realm="testrealm", nonce="1053604144", uri="/1284", response="5763079608de439072861a59ac733515"
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 11
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test1285 b/tests/data/test1285
index 16c66238..62828ba4 100644
--- a/tests/data/test1285
+++ b/tests/data/test1285
@@ -72,18 +72,17 @@ four is the number of lines
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
PUT /1285 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 0
PUT /1285 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="auser", realm="testrealm", nonce="1053604144", uri="/1285", response="dc185587d5e8391b347eef194c2a3cd6"
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 85
Expect: 100-continue
diff --git a/tests/data/test1286 b/tests/data/test1286
index 41782cb0..c64a79b4 100644
--- a/tests/data/test1286
+++ b/tests/data/test1286
@@ -77,9 +77,7 @@ HTTP GET --digest increasing nonce-count
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
+
# Reorder the fields in 'Authorization: Digest' header.
# Since regular and SSPI digest auth header fields may not have the same order
# or whitespace we homogenize so that both may be tested. Also:
@@ -93,16 +91,19 @@ if(s/^(Authorization: Digest )([^\r\n]+)(\r?\n)$//) { $_ = $1 . join(', ', map {
<protocol>
GET /1286 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /1286 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest cnonce=REMOVED, nc=00000001, nonce="1053604144", qop=auth, realm="testrealm", response=REMOVED, uri="/1286", username="auser"
+User-Agent: curl/%VERSION
Accept: */*
GET /12860001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest cnonce=REMOVED, nc=00000002, nonce="1053604144", qop=auth, realm="testrealm", response=REMOVED, uri="/12860001", username="auser"
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1287 b/tests/data/test1287
index 976fd6ec..d53a72b8 100644
--- a/tests/data/test1287
+++ b/tests/data/test1287
@@ -68,18 +68,17 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<proxy>
CONNECT test.1287:%HTTPPORT HTTP/1.1
Host: test.1287:%HTTPPORT
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
</proxy>
<protocol>
GET /we/want/that/page/1287 HTTP/1.1
Host: test.1287:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1288 b/tests/data/test1288
index d8a1e524..a841709b 100644
--- a/tests/data/test1288
+++ b/tests/data/test1288
@@ -52,18 +52,17 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<proxy>
CONNECT %HOSTIP.1288:%HTTPPORT HTTP/1.1
Host: %HOSTIP.1288:%HTTPPORT
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
</proxy>
<protocol>
GET /we/want/that/page/1288 HTTP/1.1
Host: %HOSTIP.1288:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1290 b/tests/data/test1290
index e556303b..871dcd76 100644
--- a/tests/data/test1290
+++ b/tests/data/test1290
@@ -35,12 +35,10 @@ Verify URL globbing ignores []
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/want/[]/page/1290 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1292 b/tests/data/test1292
index 880a4b46..dee0def3 100644
--- a/tests/data/test1292
+++ b/tests/data/test1292
@@ -37,12 +37,10 @@ Replaced internal headers with a blank one
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1292 HTTP/1.1
Host:
+User-Agent: curl/%VERSION
Accept:
</protocol>
diff --git a/tests/data/test1293 b/tests/data/test1293
index e2143d10..df72b755 100644
--- a/tests/data/test1293
+++ b/tests/data/test1293
@@ -43,9 +43,6 @@ http://0 http://%HOSTIP:%HTTPPORT/1293 -F=
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<strippart>
s/^--------------------------[a-z0-9]*/------------------------------/
s/boundary=------------------------[a-z0-9]*/boundary=----------------------------/
@@ -53,6 +50,7 @@ s/boundary=------------------------[a-z0-9]*/boundary=--------------------------
<protocol>
POST /1293 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 126
Content-Type: multipart/form-data; boundary=----------------------------
diff --git a/tests/data/test1294 b/tests/data/test1294
index 1c2c0ef9..4fa1cb1d 100644
--- a/tests/data/test1294
+++ b/tests/data/test1294
@@ -51,12 +51,10 @@ http://%HOSTIP:%HTTPPORT/0123456790123456790123456790123456790123456790123456790
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679/1294 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Among other public buildings in a certain town, which for many reasons it will be prudent to refrain from mentioning, and to which I will assign no fictitious name, there is one anciently common to most towns, great or small to wit, a workhouse; and in this workhouse was born; on a day and date which I need not trouble myself to repeat, inasmuch as it can be of no possible consequence to the reader, in this stage of the business at all events; the item of mortality whose name is prefixed to the head of this chapter: 511
diff --git a/tests/data/test1295 b/tests/data/test1295
index b929e3c6..50e5fa2e 100644
--- a/tests/data/test1295
+++ b/tests/data/test1295
@@ -51,12 +51,10 @@ http://%HOSTIP:%HTTPPORT/0123456790123456790123456790123456790123456790123456790
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol nonewline="yes">
POST /012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679/1295 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679: 300
Content-Length: 165
diff --git a/tests/data/test1296 b/tests/data/test1296
index 386eb18f..55b01c4c 100644
--- a/tests/data/test1296
+++ b/tests/data/test1296
@@ -41,13 +41,11 @@ http://user%0aname:password@%HOSTIP:%HTTPPORT/1296
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1296 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Basic dXNlcgpuYW1lOnBhc3N3b3Jk
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1297 b/tests/data/test1297
new file mode 100644
index 00000000..6cffff85
--- /dev/null
+++ b/tests/data/test1297
@@ -0,0 +1,65 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+HTTP CONNECT
+HTTP proxy
+proxytunnel
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<connect>
+HTTP/1.1 200 Mighty fine indeed
+Server: test tunnel 2000
+
+</connect>
+
+<data nocheck="yes">
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+http-proxy
+</server>
+<name>
+CONNECT to peer that returns nothing
+</name>
+<command>
+--proxytunnel --proxy %HOSTIP:%PROXYPORT http://%HOSTIP.1297:%HTTPPORT/we/want/that/page/1297
+</command>
+<features>
+proxy
+</features>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<proxy>
+CONNECT %HOSTIP.1297:%HTTPPORT HTTP/1.1
+Host: %HOSTIP.1297:%HTTPPORT
+User-Agent: curl/%VERSION
+Proxy-Connection: Keep-Alive
+
+</proxy>
+<protocol>
+GET /we/want/that/page/1297 HTTP/1.1
+Host: %HOSTIP.1297:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+
+</protocol>
+# 52 - got nothing
+<errorcode>
+52
+</errorcode>
+</verify>
+</testcase>
diff --git a/tests/data/test1298 b/tests/data/test1298
index 061a4e1e..6a34aa32 100644
--- a/tests/data/test1298
+++ b/tests/data/test1298
@@ -42,12 +42,10 @@ HTTP GET special path with --request-target
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET XXX HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Testno: 1298
diff --git a/tests/data/test1299 b/tests/data/test1299
index 51e0e798..2cf293a4 100644
--- a/tests/data/test1299
+++ b/tests/data/test1299
@@ -41,12 +41,10 @@ Send "OPTIONS *" with --request-target
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
OPTIONS * HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Testno: 1299
diff --git a/tests/data/test13 b/tests/data/test13
index 18f7f811..12169794 100644
--- a/tests/data/test13
+++ b/tests/data/test13
@@ -31,12 +31,10 @@ http://%HOSTIP:%HTTPPORT/want/13 -X DELETE
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
DELETE /want/13 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1310 b/tests/data/test1310
index 9ffe0d58..cb9db828 100644
--- a/tests/data/test1310
+++ b/tests/data/test1310
@@ -86,20 +86,17 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1310 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAwAAAA
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
GET /1310 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAADAAAAGAAYAE8AAAAYABgAZwAAAAAAAABAAAAACAAIAEAAAAAHAAcASAAAAAAAAAAAAAAAggEAAHRlc3R1c2VyVU5LTk9XTlpkQwKRCZFMhjj0tw47wEjKHRHlvzfxQamFcheMuv8v+xeqphEO5V41xRd7R9deOQ==
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1311 b/tests/data/test1311
index e47647c3..4078d7bb 100644
--- a/tests/data/test1311
+++ b/tests/data/test1311
@@ -47,12 +47,10 @@ http://%HOSTIP:%HTTPPORT/1311 -J -O
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1311 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1312 b/tests/data/test1312
index bed492c1..54659b55 100644
--- a/tests/data/test1312
+++ b/tests/data/test1312
@@ -47,12 +47,10 @@ CURL_TESTDIR=%PWD/log
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1312 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1313 b/tests/data/test1313
index 2331ae9e..3d9c0940 100644
--- a/tests/data/test1313
+++ b/tests/data/test1313
@@ -47,12 +47,10 @@ http://%HOSTIP:%HTTPPORT/1313 -J -O
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1313 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1314 b/tests/data/test1314
index 3963bd93..55e3299e 100644
--- a/tests/data/test1314
+++ b/tests/data/test1314
@@ -63,17 +63,16 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
GET http://firstplace.example.com/want/1314 HTTP/1.1
Host: firstplace.example.com
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://somewhere.example.com/reply/1314 HTTP/1.1
Host: somewhere.example.com
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test1315 b/tests/data/test1315
index 888ddc5c..ffc7bdc7 100644
--- a/tests/data/test1315
+++ b/tests/data/test1315
@@ -40,12 +40,12 @@ dummy data
# Verify data after the test has been "shot"
<verify>
<strip>
-(^User-Agent:.*|-----+\w+)
+-----+\w+
</strip>
<protocol>
POST /we/want/1315 HTTP/1.1
-User-Agent: curl/7.18.2 (i686-pc-linux-gnu) libcurl/7.18.2 OpenSSL/0.9.7a ipv6 zlib/1.1.4
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 797
Content-Type: multipart/form-data; boundary=----------------------------9ef8d6205763
diff --git a/tests/data/test1317 b/tests/data/test1317
index d41886a5..7964b10b 100644
--- a/tests/data/test1317
+++ b/tests/data/test1317
@@ -43,12 +43,10 @@ HTTP with --resolve
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1317 HTTP/1.1
Host: example.com:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1318 b/tests/data/test1318
index dc182dcc..8ce468db 100644
--- a/tests/data/test1318
+++ b/tests/data/test1318
@@ -43,16 +43,15 @@ HTTP with --resolve and same host name using different cases
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1318 HTTP/1.1
Host: MiXeDcAsE.cOm:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /13180001 HTTP/1.1
Host: mixedcase.com:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1319 b/tests/data/test1319
index 8fc968c8..b37a9705 100644
--- a/tests/data/test1319
+++ b/tests/data/test1319
@@ -63,9 +63,6 @@ pop3://pop.1319:%POP3PORT/1319 -p -x %HOSTIP:%PROXYPORT -u user:secret
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:
-</strip>
<protocol>
CAPA
USER user
@@ -76,7 +73,7 @@ QUIT
<proxy>
CONNECT pop.1319:%POP3PORT HTTP/1.1
Host: pop.1319:%POP3PORT
-User-Agent: curl/7.24.0-DEV (i686-pc-linux-gnu) libcurl/7.24.0-DEV OpenSSL/1.0.0e zlib/1.2.3.4 c-ares/1.7.6-DEV libidn/1.23 libssh2/1.4.0_DEV librtmp/2.2e
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
</proxy>
diff --git a/tests/data/test1320 b/tests/data/test1320
index da4079e9..2db0e3de 100644
--- a/tests/data/test1320
+++ b/tests/data/test1320
@@ -46,9 +46,6 @@ smtp://smtp.1320:%SMTPPORT/1320 --mail-rcpt recipient@example.com --mail-from se
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
EHLO 1320
MAIL FROM:<sender@example.com>
@@ -66,7 +63,7 @@ body
<proxy>
CONNECT smtp.1320:%SMTPPORT HTTP/1.1
Host: smtp.1320:%SMTPPORT
-User-Agent: curl/7.24.0-DEV (i686-pc-linux-gnu) libcurl/7.24.0-DEV OpenSSL/1.0.0e zlib/1.2.3.4 c-ares/1.7.6-DEV libidn/1.23 libssh2/1.4.0_DEV librtmp/2.2e
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
</proxy>
diff --git a/tests/data/test1321 b/tests/data/test1321
index cc911777..46077978 100644
--- a/tests/data/test1321
+++ b/tests/data/test1321
@@ -59,9 +59,6 @@ IMAP FETCH tunneled through HTTP proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
A001 CAPABILITY
A002 LOGIN user secret
@@ -72,7 +69,7 @@ A005 LOGOUT
<proxy>
CONNECT imap.1321:%IMAPPORT HTTP/1.1
Host: imap.1321:%IMAPPORT
-User-Agent: curl/7.24.0-DEV (i686-pc-linux-gnu) libcurl/7.24.0-DEV OpenSSL/1.0.0e zlib/1.2.3.4 c-ares/1.7.6-DEV libidn/1.23 libssh2/1.4.0_DEV librtmp/2.2e
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
</proxy>
diff --git a/tests/data/test1322 b/tests/data/test1322
index 97498951..71b8cb20 100644
--- a/tests/data/test1322
+++ b/tests/data/test1322
@@ -44,12 +44,10 @@ HTTP with --resolve and hostname with trailing dot
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1322 HTTP/1.1
Host: example.com:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1324 b/tests/data/test1324
index d7e663a0..0c89edbd 100644
--- a/tests/data/test1324
+++ b/tests/data/test1324
@@ -43,12 +43,10 @@ HTTP with --resolve and [ipv6address]
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1324 HTTP/1.1
Host: example.com:%HTTP6PORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1325 b/tests/data/test1325
index 6da1cbc6..bbf679df 100644
--- a/tests/data/test1325
+++ b/tests/data/test1325
@@ -58,18 +58,17 @@ http://%HOSTIP:%HTTPPORT/we/1325 -L -d "moo"
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol nonewline="yes">
POST /we/1325 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 3
Content-Type: application/x-www-form-urlencoded
mooPOST /we/13250002 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 3
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test1328 b/tests/data/test1328
index 06088884..0fd0c38d 100644
--- a/tests/data/test1328
+++ b/tests/data/test1328
@@ -54,16 +54,15 @@ HTTP GET a globbed range with -f
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /13280000 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /13280001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1331 b/tests/data/test1331
index 865abd96..09aabf87 100644
--- a/tests/data/test1331
+++ b/tests/data/test1331
@@ -71,18 +71,17 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://z.x.com/1331 HTTP/1.1
Host: z.x.com
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://z.x.com/1331 HTTP/1.1
Host: z.x.com
Proxy-Authorization: Basic bXluYW1lOm15cGFzc3dvcmQ=
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Cookie: proxycookie=weirdo
diff --git a/tests/data/test1332 b/tests/data/test1332
index 3447b2dd..3271b570 100644
--- a/tests/data/test1332
+++ b/tests/data/test1332
@@ -57,19 +57,17 @@ http://%HOSTIP:%HTTPPORT/blah/1332 -L -d "moo" --post303
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol nonewline="yes">
POST /blah/1332 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 3
Content-Type: application/x-www-form-urlencoded
mooPOST /blah/moo.html&testcase=/13320002 HTTP/1.1
-User-Agent: curl/7.10 (i686-pc-linux-gnu) libcurl/7.10 OpenSSL/0.9.6c ipv6 zlib/1.1.3
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 3
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test1333 b/tests/data/test1333
index 50ca42a2..3ef8ed49 100644
--- a/tests/data/test1333
+++ b/tests/data/test1333
@@ -38,12 +38,10 @@ HTTP POST zero length, chunked-encoded
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
POST /1333 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Transfer-Encoding: chunked
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test1334 b/tests/data/test1334
index 59116e38..0885357f 100644
--- a/tests/data/test1334
+++ b/tests/data/test1334
@@ -45,12 +45,10 @@ http://%HOSTIP:%HTTPPORT/1334 -O -D log/heads1334
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1334 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1335 b/tests/data/test1335
index bb499e73..9cf1f3ef 100644
--- a/tests/data/test1335
+++ b/tests/data/test1335
@@ -45,12 +45,10 @@ http://%HOSTIP:%HTTPPORT/1335 -O -D -
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1335 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1336 b/tests/data/test1336
index ebe562b6..f6fcb943 100644
--- a/tests/data/test1336
+++ b/tests/data/test1336
@@ -49,12 +49,10 @@ perl %SRCDIR/libtest/notexists.pl log/name1336
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1336 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1337 b/tests/data/test1337
index 80a99fac..d7f556cd 100644
--- a/tests/data/test1337
+++ b/tests/data/test1337
@@ -49,12 +49,10 @@ perl %SRCDIR/libtest/notexists.pl log/name1337
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1337 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1338 b/tests/data/test1338
index d96f8046..8941a64a 100644
--- a/tests/data/test1338
+++ b/tests/data/test1338
@@ -46,12 +46,10 @@ http://%HOSTIP:%HTTPPORT/1338 -J -O -D log/heads1338
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1338 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1339 b/tests/data/test1339
index a3c1f0e5..f08e87cd 100644
--- a/tests/data/test1339
+++ b/tests/data/test1339
@@ -46,12 +46,10 @@ http://%HOSTIP:%HTTPPORT/1339 -J -O -D -
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1339 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1340 b/tests/data/test1340
index 644fb2b5..c2e065db 100644
--- a/tests/data/test1340
+++ b/tests/data/test1340
@@ -47,12 +47,10 @@ http://%HOSTIP:%HTTPPORT/1340 -J -O -D log/heads1340 -w "curl: Saved to filename
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1340 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1341 b/tests/data/test1341
index ae226744..060fc093 100644
--- a/tests/data/test1341
+++ b/tests/data/test1341
@@ -47,12 +47,10 @@ http://%HOSTIP:%HTTPPORT/1341 -J -O -D - -w "curl: Saved to filename %{filename_
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1341 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1342 b/tests/data/test1342
index 1d7889d1..012b6343 100644
--- a/tests/data/test1342
+++ b/tests/data/test1342
@@ -45,12 +45,10 @@ http://%HOSTIP:%HTTPPORT/1342 -i -O -D log/heads1342
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1342 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1343 b/tests/data/test1343
index a05cab04..636afab2 100644
--- a/tests/data/test1343
+++ b/tests/data/test1343
@@ -45,12 +45,10 @@ http://%HOSTIP:%HTTPPORT/1343 -i -O -D -
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1343 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1344 b/tests/data/test1344
index ac354f0d..4d8bd4af 100644
--- a/tests/data/test1344
+++ b/tests/data/test1344
@@ -49,12 +49,10 @@ perl %SRCDIR/libtest/notexists.pl log/name1344
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1344 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1345 b/tests/data/test1345
index 6d1201e1..f69a56ad 100644
--- a/tests/data/test1345
+++ b/tests/data/test1345
@@ -49,12 +49,10 @@ perl %SRCDIR/libtest/notexists.pl log/name1345
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1345 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1346 b/tests/data/test1346
index 347214e6..83cdaa8c 100644
--- a/tests/data/test1346
+++ b/tests/data/test1346
@@ -45,12 +45,10 @@ http://%HOSTIP:%HTTPPORT/1346 -i -O
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1346 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1347 b/tests/data/test1347
index 8eac42cb..f16abcd0 100644
--- a/tests/data/test1347
+++ b/tests/data/test1347
@@ -49,12 +49,10 @@ perl %SRCDIR/libtest/notexists.pl log/name1347
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1347 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1364 b/tests/data/test1364
index e8c981d7..777d9b24 100644
--- a/tests/data/test1364
+++ b/tests/data/test1364
@@ -40,12 +40,10 @@ perl %SRCDIR/libtest/notexists.pl log/1364
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1364 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1365 b/tests/data/test1365
index 4a09cfd6..c69ee4b7 100644
--- a/tests/data/test1365
+++ b/tests/data/test1365
@@ -40,12 +40,10 @@ perl %SRCDIR/libtest/notexists.pl log/1365
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1365 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1366 b/tests/data/test1366
index 62e3b0c4..c87455fc 100644
--- a/tests/data/test1366
+++ b/tests/data/test1366
@@ -41,12 +41,10 @@ perl %SRCDIR/libtest/notexists.pl log/1366 log/name1366
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1366 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1367 b/tests/data/test1367
index d4bd3d77..68bc3336 100644
--- a/tests/data/test1367
+++ b/tests/data/test1367
@@ -41,12 +41,10 @@ perl %SRCDIR/libtest/notexists.pl log/1367 log/name1367
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1367 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1368 b/tests/data/test1368
index 6a926ab6..37805176 100644
--- a/tests/data/test1368
+++ b/tests/data/test1368
@@ -41,12 +41,10 @@ perl %SRCDIR/libtest/notexists.pl log/1368
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1368 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1369 b/tests/data/test1369
index 5176ed0b..1a594463 100644
--- a/tests/data/test1369
+++ b/tests/data/test1369
@@ -41,12 +41,10 @@ perl %SRCDIR/libtest/notexists.pl log/1369
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1369 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1370 b/tests/data/test1370
index d0abbdd6..ec5e7b54 100644
--- a/tests/data/test1370
+++ b/tests/data/test1370
@@ -42,12 +42,10 @@ perl %SRCDIR/libtest/notexists.pl log/1370 log/name1370
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1370 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1371 b/tests/data/test1371
index fe3977fa..d3e187ad 100644
--- a/tests/data/test1371
+++ b/tests/data/test1371
@@ -42,12 +42,10 @@ perl %SRCDIR/libtest/notexists.pl log/1371 log/name1371
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1371 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1372 b/tests/data/test1372
index a2b8ec96..49c89f96 100644
--- a/tests/data/test1372
+++ b/tests/data/test1372
@@ -40,12 +40,10 @@ perl %SRCDIR/libtest/notexists.pl log/1372
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1372 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1373 b/tests/data/test1373
index ae906d7b..3ceaacaf 100644
--- a/tests/data/test1373
+++ b/tests/data/test1373
@@ -40,12 +40,10 @@ perl %SRCDIR/libtest/notexists.pl log/1373
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1373 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1374 b/tests/data/test1374
index f8d9d0dd..e143b41d 100644
--- a/tests/data/test1374
+++ b/tests/data/test1374
@@ -41,12 +41,10 @@ perl %SRCDIR/libtest/notexists.pl log/1374 log/name1374
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1374 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1375 b/tests/data/test1375
index 595f03ac..f6219a1e 100644
--- a/tests/data/test1375
+++ b/tests/data/test1375
@@ -41,12 +41,10 @@ perl %SRCDIR/libtest/notexists.pl log/1375 log/name1375
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1375 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1376 b/tests/data/test1376
index f34c2774..1d12c4c6 100644
--- a/tests/data/test1376
+++ b/tests/data/test1376
@@ -40,12 +40,10 @@ perl %SRCDIR/libtest/notexists.pl log/1376
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1376 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1377 b/tests/data/test1377
index f542b11c..f2456165 100644
--- a/tests/data/test1377
+++ b/tests/data/test1377
@@ -41,12 +41,10 @@ perl %SRCDIR/libtest/notexists.pl log/1377 log/name1377
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1377 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test138 b/tests/data/test138
index 4eb73e6c..87331384 100644
--- a/tests/data/test138
+++ b/tests/data/test138
@@ -15,6 +15,7 @@ this is file contents
</size>
<servercmd>
RETRNOSIZE
+REPLY SIZE 500 command not understood
</servercmd>
</reply>
diff --git a/tests/data/test14 b/tests/data/test14
index 21a4865b..f6c568ed 100644
--- a/tests/data/test14
+++ b/tests/data/test14
@@ -30,13 +30,10 @@ http://%HOSTIP:%HTTPPORT/want/14 -i --head
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
HEAD /want/14 HTTP/1.1
-User-Agent: curl/7.4.2-pre4 (sparc-sun-solaris2.7) libcurl 7.4.2-pre4
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1400 b/tests/data/test1400
index c0d409ba..eea8d3fb 100644
--- a/tests/data/test1400
+++ b/tests/data/test1400
@@ -37,13 +37,10 @@ http://%HOSTIP:%HTTPPORT/we/want/1400 --libcurl log/test1400.c
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/want/1400 HTTP/1.1
-User-Agent: curl/7.18.2 (i686-pc-linux-gnu) libcurl/7.18.2 OpenSSL/0.9.7a ipv6 zlib/1.1.4
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1401 b/tests/data/test1401
index ec3b25cc..b20607c3 100644
--- a/tests/data/test1401
+++ b/tests/data/test1401
@@ -41,14 +41,11 @@ http://%HOSTIP:%HTTPPORT/we/want/1401 --libcurl log/test1401.c --basic -u fake:u
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/want/1401 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-User-Agent: stripped
Authorization: Basic ZmFrZTp1c2Vy
+User-Agent: MyUA
Accept: */*
Cookie: chocolate=chip
X-Files: Mulder
diff --git a/tests/data/test1402 b/tests/data/test1402
index bf7eb7b8..29655479 100644
--- a/tests/data/test1402
+++ b/tests/data/test1402
@@ -38,13 +38,10 @@ http://%HOSTIP:%HTTPPORT/we/want/1402 --libcurl log/test1402.c -d "foo=bar" -d "
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol nonewline="yes">
POST /we/want/1402 HTTP/1.1
-User-Agent: curl/7.18.2 (i686-pc-linux-gnu) libcurl/7.18.2 OpenSSL/0.9.7a ipv6 zlib/1.1.4
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 16
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test1403 b/tests/data/test1403
index 731d274b..6d21ce85 100644
--- a/tests/data/test1403
+++ b/tests/data/test1403
@@ -38,13 +38,10 @@ http://%HOSTIP:%HTTPPORT/we/want/1403 --libcurl log/test1403.c -G -d "foo=bar" -
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/want/1403?foo=bar&baz=quux HTTP/1.1
-User-Agent: curl/7.18.2 (i686-pc-linux-gnu) libcurl/7.18.2 OpenSSL/0.9.7a ipv6 zlib/1.1.4
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1404 b/tests/data/test1404
index d3c66a9d..8f61ec00 100644
--- a/tests/data/test1404
+++ b/tests/data/test1404
@@ -44,12 +44,12 @@ dummy data
# Verify data after the test has been "shot"
<verify>
<strip>
-(^User-Agent:.*|-----+\w+)
+-----+\w+
</strip>
<protocol>
POST /we/want/1404 HTTP/1.1
-User-Agent: curl/7.18.2 (i686-pc-linux-gnu) libcurl/7.18.2 OpenSSL/0.9.7a ipv6 zlib/1.1.4
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 882
Content-Type: multipart/form-data; boundary=----------------------------9ef8d6205763
diff --git a/tests/data/test1408 b/tests/data/test1408
index bf775ed3..6d3131fb 100644
--- a/tests/data/test1408
+++ b/tests/data/test1408
@@ -55,16 +55,15 @@ HTTP receive cookies over IPV6
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /path/14080001 HTTP/1.1
Host: %HOST6IP:%HTTP6PORT
+User-Agent: curl/%VERSION
Accept: */*
GET /path/14080002 HTTP/1.1
Host: %HOST6IP:%HTTP6PORT
+User-Agent: curl/%VERSION
Accept: */*
Cookie: time=1
diff --git a/tests/data/test1411 b/tests/data/test1411
index 3ffd586d..93e3b4b8 100644
--- a/tests/data/test1411
+++ b/tests/data/test1411
@@ -46,12 +46,10 @@ http://%HOSTIP:%HTTPPORT/1411 -T log/empty1411
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
PUT /1411 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 0
diff --git a/tests/data/test1412 b/tests/data/test1412
index 36d3d1d9..808ed17f 100644
--- a/tests/data/test1412
+++ b/tests/data/test1412
@@ -106,29 +106,27 @@ four is the number of lines
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1412 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /1412 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="gimme all yer s3cr3ts", nonce="11223344", uri="/1412", response="0390dbe89e31adca0413d11f91f30e7f"
-User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
GET /14120001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
GET /14120001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="gimme all yer s3cr3ts", nonce="11223344", uri="/14120001", response="0085df91870374c8bf4e94415e7fbf8e"
-User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1413 b/tests/data/test1413
index 6e889a8a..96467f16 100644
--- a/tests/data/test1413
+++ b/tests/data/test1413
@@ -56,16 +56,15 @@ http://%HOSTIP:%HTTPPORT/this/1413 -L
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /this/1413 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /this/moo.html/14130002 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1415 b/tests/data/test1415
index 94ce02c5..7c9e389f 100644
--- a/tests/data/test1415
+++ b/tests/data/test1415
@@ -53,12 +53,10 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://example.com/we/want/1415 HTTP/1.1
Host: example.com
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test1416 b/tests/data/test1416
index 546575e5..f6e9bbfe 100644
--- a/tests/data/test1416
+++ b/tests/data/test1416
@@ -44,12 +44,10 @@ http://%HOSTIP:%HTTPPORT/1416
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1416 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1417 b/tests/data/test1417
index 4d3971ea..a141b11d 100644
--- a/tests/data/test1417
+++ b/tests/data/test1417
@@ -56,12 +56,10 @@ http://%HOSTIP:%HTTPPORT/1417 -D log/heads1417
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1417 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1418 b/tests/data/test1418
index c137b1c5..51d2e5f0 100644
--- a/tests/data/test1418
+++ b/tests/data/test1418
@@ -93,26 +93,27 @@ http://%HOSTIP:%HTTPPORT/1418 -u testuser:testpass --anyauth http://%HOSTIP:%HTT
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1418 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /1418 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="loonie", nonce="314156592", uri="/1418", response="986238b7e0077754944c966f56d9bc77"
+User-Agent: curl/%VERSION
Accept: */*
GET /14180003 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /14180003 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="loonie", nonce="314156592", uri="/14180003", response="1c6390a67bac3283a9b023402f3b3540"
+User-Agent: curl/%VERSION
Accept: */*
[DISCONNECT]
diff --git a/tests/data/test1419 b/tests/data/test1419
index f29ce444..6d05f0b5 100644
--- a/tests/data/test1419
+++ b/tests/data/test1419
@@ -51,16 +51,15 @@ http://%HOSTIP:%HTTPPORT/1419 --anyauth http://%HOSTIP:%HTTPPORT/14190003
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1419 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /14190003 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
[DISCONNECT]
diff --git a/tests/data/test1421 b/tests/data/test1421
index dea49e78..c219770e 100644
--- a/tests/data/test1421
+++ b/tests/data/test1421
@@ -55,17 +55,16 @@ Content-Length: 6
-foo-
</stdout>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://test.remote.haxx.se.1421:8990/ HTTP/1.1
Host: test.remote.haxx.se.1421:8990
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://different.remote.haxx.se.1421:8990/ HTTP/1.1
Host: different.remote.haxx.se.1421:8990
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test1422 b/tests/data/test1422
index cbb2d63b..4108091f 100644
--- a/tests/data/test1422
+++ b/tests/data/test1422
@@ -47,12 +47,10 @@ http://%HOSTIP:%HTTPPORT/1422 -J -O file://%PWD/log/name1422
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1422 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1423 b/tests/data/test1423
index 908ff8c2..b0fcef3b 100644
--- a/tests/data/test1423
+++ b/tests/data/test1423
@@ -40,12 +40,10 @@ perl %SRCDIR/libtest/notexists.pl log/1423
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1423 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1424 b/tests/data/test1424
index 17bc46a1..8f922e62 100644
--- a/tests/data/test1424
+++ b/tests/data/test1424
@@ -57,12 +57,10 @@ http://%HOSTIP:%HTTPPORT/1424 -z "dec 12 11:00:00 1999 GMT" -o log/outfile1424
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1424 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
If-Modified-Since: Sun, 12 Dec 1999 11:00:00 GMT
diff --git a/tests/data/test1425 b/tests/data/test1425
index ce9ba97f..7122cd63 100644
--- a/tests/data/test1425
+++ b/tests/data/test1425
Binary files differ
diff --git a/tests/data/test1426 b/tests/data/test1426
index 851d8c3f..1344b8eb 100644
--- a/tests/data/test1426
+++ b/tests/data/test1426
Binary files differ
diff --git a/tests/data/test1428 b/tests/data/test1428
index f09c02dd..0ff74d4b 100644
--- a/tests/data/test1428
+++ b/tests/data/test1428
@@ -60,13 +60,10 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<proxy>
CONNECT test.1428:%HTTPPORT HTTP/1.1
Host: test.1428:%HTTPPORT
-User-Agent: curl/7.10.7-pre2 (i686-pc-linux-gnu) libcurl/7.10.7-pre2 OpenSSL/0.9.7a zlib/1.1.3
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
header-type: proxy
@@ -75,7 +72,7 @@ header-type: proxy
GET /we/want/that/page/1428 HTTP/1.1
Host: test.1428:%HTTPPORT
Authorization: Basic aWFtOm15OjtzZWxm
-User-Agent: curl/7.10.7-pre2 (i686-pc-linux-gnu) libcurl/7.10.7-pre2 OpenSSL/0.9.7a zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
header-type: server
diff --git a/tests/data/test1429 b/tests/data/test1429
index b6a66c75..4f3989cf 100644
--- a/tests/data/test1429
+++ b/tests/data/test1429
@@ -57,12 +57,10 @@ Funny-head: yesyes
-foo-
234
</stdout>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1429 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1430 b/tests/data/test1430
index e3c9b1d6..5acc7f12 100644
--- a/tests/data/test1430
+++ b/tests/data/test1430
@@ -40,12 +40,10 @@ http://%HOSTIP:%HTTPPORT/1430
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1430 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1431 b/tests/data/test1431
index bec3ebbd..58500879 100644
--- a/tests/data/test1431
+++ b/tests/data/test1431
@@ -40,12 +40,10 @@ http://%HOSTIP:%HTTPPORT/1431
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1431 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1432 b/tests/data/test1432
index 7f41c65b..fadbe838 100644
--- a/tests/data/test1432
+++ b/tests/data/test1432
@@ -41,12 +41,10 @@ http://%HOSTIP:%HTTPPORT/1432
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1432 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1433 b/tests/data/test1433
index a159daff..6656114d 100644
--- a/tests/data/test1433
+++ b/tests/data/test1433
@@ -41,12 +41,10 @@ http://%HOSTIP:%HTTPPORT/1433
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1433 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1434 b/tests/data/test1434
index 0b33bb95..55031be7 100644
--- a/tests/data/test1434
+++ b/tests/data/test1434
@@ -76,13 +76,11 @@ http://%HOSTIP:%HTTPPORT/1434 -C 100
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1434 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Range: bytes=100-
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1435 b/tests/data/test1435
index bd171a45..73262498 100644
--- a/tests/data/test1435
+++ b/tests/data/test1435
@@ -33,12 +33,10 @@ simple HTTP GET over Unix socket
</client>
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1435 HTTP/1.1
Host: server-interpreted.example.com
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1436 b/tests/data/test1436
index e40a3bf4..040b3b38 100644
--- a/tests/data/test1436
+++ b/tests/data/test1436
@@ -47,20 +47,20 @@ HTTP requests with multiple connections over Unix socket
</client>
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /14360001 HTTP/1.1
Host: one.example.com
+User-Agent: curl/%VERSION
Accept: */*
GET /14360002 HTTP/1.1
Host: two.example.com
+User-Agent: curl/%VERSION
Accept: */*
GET /14360003 HTTP/1.1
Host: one.example.com
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1437 b/tests/data/test1437
index 6a48444f..07346a9e 100644
--- a/tests/data/test1437
+++ b/tests/data/test1437
@@ -65,18 +65,16 @@ http://%HOSTIP:%HTTPPORT/1437 -u testuser:testpass --digest
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1437 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /1437 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="testrealm", nonce="2", uri="/1437", response="4376eb639bf8e7343a6e7b56e1b89c4f", algorithm=MD5
-User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1438 b/tests/data/test1438
index 8aaedb71..14818829 100644
--- a/tests/data/test1438
+++ b/tests/data/test1438
@@ -48,11 +48,9 @@ HTTP
<protocol>
GET /1438 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
-<strip>
-^User-Agent:.*
-</strip>
</verify>
</testcase>
diff --git a/tests/data/test1439 b/tests/data/test1439
index cb906adb..a76ccf00 100644
--- a/tests/data/test1439
+++ b/tests/data/test1439
@@ -26,7 +26,7 @@ http
</server>
<name>
-Check if %{scheme} returns HTTP
+Check if %{http_version} returns 1.1
</name>
<command>
http://%HOSTIP:%HTTPPORT/1439 --write-out '%{http_version}'
@@ -48,11 +48,9 @@ testdata
<protocol>
GET /1439 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
-<strip>
-^User-Agent:.*
-</strip>
</verify>
</testcase>
diff --git a/tests/data/test1443 b/tests/data/test1443
index 69688670..7da739e5 100644
--- a/tests/data/test1443
+++ b/tests/data/test1443
@@ -52,12 +52,10 @@ perl -e 'exit((stat("log/1443"))[9] != 960898200)'
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1443 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1448 b/tests/data/test1448
index 87ffed60..38c02275 100644
--- a/tests/data/test1448
+++ b/tests/data/test1448
@@ -59,16 +59,15 @@ http://åäö.se:%HTTPPORT/1448 --resolve xn--4cab6c.se:%HTTPPORT:%HOSTIP -L --c
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1448 HTTP/1.1
Host: xn--4cab6c.se:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /14480001 HTTP/1.1
Host: xn--4cab6c.se:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1455 b/tests/data/test1455
index 8483d7bb..b8a864f8 100644
--- a/tests/data/test1455
+++ b/tests/data/test1455
@@ -47,9 +47,6 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<strippart>
s/^PROXY TCP4 %CLIENTIP %HOSTIP (\d*) %HTTPPORT/proxy-line/
</strippart>
@@ -57,6 +54,7 @@ s/^PROXY TCP4 %CLIENTIP %HOSTIP (\d*) %HTTPPORT/proxy-line/
proxy-line
GET /1455 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Testno: 1455
diff --git a/tests/data/test1456 b/tests/data/test1456
index 16a78b2a..59e07391 100644
--- a/tests/data/test1456
+++ b/tests/data/test1456
@@ -50,10 +50,6 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:
-</strip>
-
# Strip off the (random) local port number. This test used to use a fixed
# local port number that frequently causes the test to fail
<strippart>
@@ -63,6 +59,7 @@ s/PROXY TCP6 ::1 ::1 (\d+) (\d+)/PROXY TCP6 ::1 ::1 $2/
PROXY TCP6 ::1 ::1 %HTTP6PORT
GET /1456 HTTP/1.1
Host: %HOST6IP:%HTTP6PORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1457 b/tests/data/test1457
index 575748f4..ab447ac5 100644
--- a/tests/data/test1457
+++ b/tests/data/test1457
@@ -51,11 +51,9 @@ line2
<protocol>
GET /1457 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
-<strip>
-^User-Agent:.*
-</strip>
</verify>
</testcase>
diff --git a/tests/data/test1458 b/tests/data/test1458
index 072e43ce..c4f25f57 100644
--- a/tests/data/test1458
+++ b/tests/data/test1458
@@ -43,12 +43,10 @@ HTTP with wildcard --resolve
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1458 HTTP/1.1
Host: example.com:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1460 b/tests/data/test1460
index d7b30c5e..1cc13353 100644
--- a/tests/data/test1460
+++ b/tests/data/test1460
@@ -47,9 +47,6 @@ initial content
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
# Warning: --include and --remote-header-name cannot be combined.
<errorcode>
2
diff --git a/tests/data/test1461 b/tests/data/test1461
new file mode 100644
index 00000000..4b8f6c41
--- /dev/null
+++ b/tests/data/test1461
@@ -0,0 +1,53 @@
+<testcase>
+<info>
+<keywords>
+--help
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+none
+</server>
+ <name>
+curl important --help
+ </name>
+ <command>
+--help
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<errorcode>
+0
+</errorcode>
+<stdout mode="text">
+Usage: curl [options...] <url>
+ -d, --data <data> HTTP POST data
+ -f, --fail Fail silently (no output at all) on HTTP errors
+ -h, --help <category> Get help for commands
+ -i, --include Include protocol response headers in the output
+ -o, --output <file> Write to file instead of stdout
+ -O, --remote-name Write output to a file named as the remote file
+ -s, --silent Silent mode
+ -T, --upload-file <file> Transfer local FILE to destination
+ -u, --user <user:password> Server user and password
+ -A, --user-agent <name> Send User-Agent <name> to server
+ -v, --verbose Make the operation more talkative
+ -V, --version Show version number and quit
+
+This is not the full help, this menu is stripped into categories.
+Use "--help category" to get an overview of all categories.
+For all options use the manual or "--help all".
+</stdout>
+</verify>
+</testcase>
diff --git a/tests/data/test1462 b/tests/data/test1462
new file mode 100644
index 00000000..a9e7af0a
--- /dev/null
+++ b/tests/data/test1462
@@ -0,0 +1,61 @@
+<testcase>
+<info>
+<keywords>
+--help
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+none
+</server>
+ <name>
+curl invalid category --help
+ </name>
+ <command>
+--help sdfafdsfadsfsd
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<errorcode>
+0
+</errorcode>
+<stdout mode="text">
+Usage: curl [options...] <url>
+Invalid category provided, here is a list of all categories:
+
+ auth Different types of authentication methods
+ connection Low level networking operations
+ curl The command line tool itself
+ dns General DNS options
+ file FILE protocol options
+ ftp FTP protocol options
+ http HTTP and HTTPS protocol options
+ imap IMAP protocol options
+ misc Options that don't fit into any other category
+ output The output of curl
+ pop3 POP3 protocol options
+ post HTTP Post specific options
+ proxy All options related to proxies
+ scp SCP protocol options
+ sftp SFTP protocol options
+ smtp SMTP protocol options
+ ssh SSH protocol options
+ telnet TELNET protocol options
+ tftp TFTP protocol options
+ tls All TLS/SSL related options
+ upload All options for uploads
+ verbose Options related to any kind of command line output of curl
+</stdout>
+</verify>
+</testcase>
diff --git a/tests/data/test1463 b/tests/data/test1463
new file mode 100644
index 00000000..7e1fe9b8
--- /dev/null
+++ b/tests/data/test1463
@@ -0,0 +1,44 @@
+<testcase>
+<info>
+<keywords>
+FILE
+--help
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+none
+</server>
+<features>
+file
+</features>
+ <name>
+curl file category --help
+ </name>
+ <command>
+--help file
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<errorcode>
+0
+</errorcode>
+<stdout mode="text">
+Usage: curl [options...] <url>
+file: FILE protocol options
+ -I, --head Show document info only
+ -r, --range <range> Retrieve only the bytes within RANGE
+</stdout>
+</verify>
+</testcase>
diff --git a/tests/data/test1464 b/tests/data/test1464
new file mode 100644
index 00000000..167e80d6
--- /dev/null
+++ b/tests/data/test1464
@@ -0,0 +1,44 @@
+<testcase>
+<info>
+<keywords>
+FILE
+--help
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+none
+</server>
+<features>
+file
+</features>
+ <name>
+curl file category --help with lower/upper mix
+ </name>
+ <command>
+--help fIlE
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<errorcode>
+0
+</errorcode>
+<stdout mode="text">
+Usage: curl [options...] <url>
+file: FILE protocol options
+ -I, --head Show document info only
+ -r, --range <range> Retrieve only the bytes within RANGE
+</stdout>
+</verify>
+</testcase>
diff --git a/tests/data/test1465 b/tests/data/test1465
new file mode 100644
index 00000000..d1e55386
--- /dev/null
+++ b/tests/data/test1465
Binary files differ
diff --git a/tests/data/test15 b/tests/data/test15
index 3b1fa436..a82fa0cf 100644
--- a/tests/data/test15
+++ b/tests/data/test15
@@ -44,12 +44,10 @@ Content-Length: 26
Repeated nonsense-headers
http://%HOSTIP:%HTTPPORT/want/15 200 26
</stdout>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/15 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test150 b/tests/data/test150
index e9fde393..2179163d 100644
--- a/tests/data/test150
+++ b/tests/data/test150
@@ -83,20 +83,17 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /150 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
GET /150 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1502 b/tests/data/test1502
index 4c084d64..9e7bcf25 100644
--- a/tests/data/test1502
+++ b/tests/data/test1502
@@ -45,9 +45,6 @@ http://google.com:%HTTPPORT/1502 %HTTPPORT %HOSTIP
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1502 HTTP/1.1
Host: google.com:%HTTPPORT
diff --git a/tests/data/test1503 b/tests/data/test1503
index 8665de60..28863946 100644
--- a/tests/data/test1503
+++ b/tests/data/test1503
@@ -45,9 +45,6 @@ http://google.com:%HTTPPORT/1503 %HTTPPORT %HOSTIP
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1503 HTTP/1.1
Host: google.com:%HTTPPORT
diff --git a/tests/data/test1504 b/tests/data/test1504
index b8463c52..5ca66076 100644
--- a/tests/data/test1504
+++ b/tests/data/test1504
@@ -45,9 +45,6 @@ http://google.com:%HTTPPORT/1504 %HTTPPORT %HOSTIP
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1504 HTTP/1.1
Host: google.com:%HTTPPORT
diff --git a/tests/data/test1505 b/tests/data/test1505
index c6e5a7ca..14e1141d 100644
--- a/tests/data/test1505
+++ b/tests/data/test1505
@@ -45,9 +45,6 @@ http://google.com:%HTTPPORT/1505 %HTTPPORT %HOSTIP
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1505 HTTP/1.1
Host: google.com:%HTTPPORT
diff --git a/tests/data/test151 b/tests/data/test151
index 8f20d1d8..03a55b4d 100644
--- a/tests/data/test151
+++ b/tests/data/test151
@@ -34,13 +34,10 @@ http://%HOSTIP:%HTTPPORT/151
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
GET /151 HTTP/1.1
-User-Agent: curl/7.8.1-pre3 (sparc-sun-solaris2.7) libcurl 7.8.1-pre3 (OpenSSL 0.9.6a) (krb4 enabled)
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test152 b/tests/data/test152
index 2cc52161..2c48b037 100644
--- a/tests/data/test152
+++ b/tests/data/test152
@@ -35,13 +35,10 @@ http://%HOSTIP:%HTTPPORT/152 --fail
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
GET /152 HTTP/1.1
-User-Agent: curl/7.8.1-pre3 (sparc-sun-solaris2.7) libcurl 7.8.1-pre3 (OpenSSL 0.9.6a) (krb4 enabled)
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1524 b/tests/data/test1524
index ed0c0476..34905402 100644
--- a/tests/data/test1524
+++ b/tests/data/test1524
@@ -55,20 +55,18 @@ moo
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol nonewline="yes">
PUT /blah/1524 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 4
Expect: 100-continue
moo
GET /blah/moo.html&testcase=/15240002 HTTP/1.1
-User-Agent: this should be ignored
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
diff --git a/tests/data/test153 b/tests/data/test153
index 1f55f39b..a582595a 100644
--- a/tests/data/test153
+++ b/tests/data/test153
@@ -89,34 +89,34 @@ http://%HOSTIP:%HTTPPORT/1530001 -u testuser:testpass --digest http://%HOSTIP:%H
<verify>
<strip>
^Authorization.*cnonce
-^User-Agent:.*
</strip>
<protocol>
GET /1530001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /1530001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="testrealm", nonce="1053604145", uri="/1530001", response="f4f83139396995bac665f24a1f1055c7"
-User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
GET /1530002 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-User-Agent: curl/7.11.0-CVS (i686-pc-linux-gnu) libcurl/7.11.0-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS
+User-Agent: curl/%VERSION
Accept: */*
GET /1530002 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="testrealm", nonce="1053604145", uri="/1530002", response="f84511b014fdd0ba6494f42871079c32"
-User-Agent: curl/7.11.0-CVS (i686-pc-linux-gnu) libcurl/7.11.0-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS
+User-Agent: curl/%VERSION
Accept: */*
GET /1530002 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="testrealm", nonce="999999", uri="/1530002", cnonce="MTA4MzIy", nc="00000001", qop="auth", response="25291c357671604a16c0242f56721c07", algorithm=MD5
-User-Agent: curl/7.11.0-CVS (i686-pc-linux-gnu) libcurl/7.11.0-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1538 b/tests/data/test1538
index ea8eddbb..03481d56 100644
--- a/tests/data/test1538
+++ b/tests/data/test1538
@@ -129,7 +129,8 @@ e93: API function called from within callback
e94: An authentication function returned an error
e95: HTTP/3 error
e96: QUIC connection error
-e97: Unknown error
+e97: proxy handshake error
+e98: Unknown error
m-1: Please call curl_multi_perform() soon
m0: No error
m1: Invalid multi handle
diff --git a/tests/data/test154 b/tests/data/test154
index 3d693f4b..616051cb 100644
--- a/tests/data/test154
+++ b/tests/data/test154
@@ -82,12 +82,10 @@ four is the number of lines
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
PUT /154 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 85
Expect: 100-continue
@@ -95,7 +93,7 @@ Expect: 100-continue
PUT /154 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="gimme all yer s3cr3ts", nonce="11223344", uri="/154", response="b71551e12d1c456e47d8388ecb2edeca"
-User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 85
Expect: 100-continue
diff --git a/tests/data/test155 b/tests/data/test155
index 0cfd10ee..6e19a4f2 100644
--- a/tests/data/test155
+++ b/tests/data/test155
@@ -108,12 +108,10 @@ four is the number of lines
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
PUT /155 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 85
Expect: 100-continue
@@ -121,13 +119,14 @@ Expect: 100-continue
PUT /155 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 0
PUT /155 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=
-User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 85
Expect: 100-continue
diff --git a/tests/data/test1551 b/tests/data/test1551
index 507266a8..c41a1464 100644
--- a/tests/data/test1551
+++ b/tests/data/test1551
@@ -47,9 +47,6 @@ http://%HOSTIP:%HTTPPORT/1551
</client>
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1551 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test1556 b/tests/data/test1556
index 0f99abd8..f64e76e9 100644
--- a/tests/data/test1556
+++ b/tests/data/test1556
@@ -20,7 +20,7 @@ Content-Length: 6
Connection: close
Content-Type: text/html
Funny-head: yesyes
-Long: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+Long: %repeat[100001 x A]%
-foo-
</data>
@@ -46,9 +46,6 @@ http://%HOSTIP:%HTTPPORT/1556
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1556 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test156 b/tests/data/test156
index 098de218..fafedc29 100644
--- a/tests/data/test156
+++ b/tests/data/test156
@@ -40,13 +40,10 @@ four is the number of lines
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
PUT /156 HTTP/1.1
-User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 85
Expect: 100-continue
diff --git a/tests/data/test1561 b/tests/data/test1561
index 69352fda..bfdb439d 100644
--- a/tests/data/test1561
+++ b/tests/data/test1561
@@ -73,18 +73,15 @@ Cookies set over HTTP can't override secure ones
</command>
</client>
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /15610001 HTTP/1.1
Host: www.example.com
-User-Agent: curl/7.62.0-DEV
+User-Agent: curl/%VERSION
Accept: */*
GET /15610002 HTTP/1.1
Host: www.example.com
-User-Agent: curl/7.62.0-DEV
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1562 b/tests/data/test1562
index 59cb9ccb..af29f54b 100644
--- a/tests/data/test1562
+++ b/tests/data/test1562
@@ -48,21 +48,21 @@ Expire secure cookies over HTTPS
</command>
</client>
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /15620001 HTTP/1.1
Host: www.example.com
+User-Agent: curl/%VERSION
Accept: */*
GET /15620002 HTTP/1.1
Host: www.example.com
+User-Agent: curl/%VERSION
Accept: */*
Cookie: foo=123
GET /15620001 HTTP/1.1
Host: www.example.com
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1563 b/tests/data/test1563
index a3597b9b..7d88ddc6 100644
--- a/tests/data/test1563
+++ b/tests/data/test1563
@@ -33,15 +33,13 @@ http://%HOSTIP:%HTTPPORT/15630001 -L -H "Host: www.example.com"
</command>
</client>
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<errorcode>
1
</errorcode>
<protocol>
GET /15630001 HTTP/1.1
Host: www.example.com
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1566 b/tests/data/test1566
index e6f81711..90cb40a5 100644
--- a/tests/data/test1566
+++ b/tests/data/test1566
@@ -35,7 +35,7 @@ http
http://%HOSTIP:%HTTPPORT/1566 -o log/output1566 --etag-compare log/etag1566
</command>
<file name="log/etag1566">
-123456
+"123456"
</file>
<file1 name="log/output1566">
downloaded already
@@ -46,12 +46,10 @@ downloaded already
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1566 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
If-None-Match: "123456"
diff --git a/tests/data/test1567 b/tests/data/test1567
index 088ebf49..ff779df0 100644
--- a/tests/data/test1567
+++ b/tests/data/test1567
@@ -48,9 +48,6 @@ http://%HOSTIP:%HTTPPORT/1567
</client>
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1567 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test157 b/tests/data/test157
index 77700f6a..fee7a6a4 100644
--- a/tests/data/test157
+++ b/tests/data/test157
@@ -34,12 +34,10 @@ http://%HOSTIP:%HTTPPORT/157 -u testuser:testpass --anyauth
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /157 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test158 b/tests/data/test158
index dca51b16..238399a0 100644
--- a/tests/data/test158
+++ b/tests/data/test158
@@ -31,14 +31,13 @@ http://%HOSTIP:%HTTPPORT/158 -F name=daniel
# Verify data after the test has been "shot"
<verify>
<strip>
-^User-Agent:.*
^Content-Type: multipart/form-data.*
^-----------------------.*
</strip>
<protocol>
POST /158 HTTP/1.1
-User-Agent: curl/7.11.2-CVS (i686-pc-linux-gnu) libcurl/7.11.2-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 145
Content-Type: multipart/form-data; boundary=----------------------------4f12fcdaa3bc
diff --git a/tests/data/test159 b/tests/data/test159
index a56986fb..bb94583b 100644
--- a/tests/data/test159
+++ b/tests/data/test159
@@ -69,14 +69,11 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /159 HTTP/1.0
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1591 b/tests/data/test1591
index 526933a0..ce0c2687 100644
--- a/tests/data/test1591
+++ b/tests/data/test1591
@@ -40,9 +40,6 @@ more than one byte
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
PUT /bzz/1591 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test1593 b/tests/data/test1593
index 405aa84e..6719a326 100644
--- a/tests/data/test1593
+++ b/tests/data/test1593
@@ -35,9 +35,6 @@ http://%HOSTIP:%HTTPPORT/1593
</client>
<verify>
-<strip>
-^User-Agent:.*
-</strip>
# Note here the lack of If-Modified-Since
<protocol>
GET /1593 HTTP/1.1
diff --git a/tests/data/test1594 b/tests/data/test1594
index 4907ca2b..f29fdd68 100644
--- a/tests/data/test1594
+++ b/tests/data/test1594
@@ -36,9 +36,6 @@ http://%HOSTIP:%HTTPPORT/1594
</client>
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1594 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test1595 b/tests/data/test1595
index 29b2b865..0216788e 100644
--- a/tests/data/test1595
+++ b/tests/data/test1595
@@ -35,9 +35,6 @@ http://%HOSTIP:%HTTPPORT/1595
</client>
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1595 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test1596 b/tests/data/test1596
index 77a10f08..62ceab4b 100644
--- a/tests/data/test1596
+++ b/tests/data/test1596
@@ -36,9 +36,6 @@ http://%HOSTIP:%HTTPPORT/1596
</client>
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1596 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test16 b/tests/data/test16
index 399aa942..f8510adc 100644
--- a/tests/data/test16
+++ b/tests/data/test16
@@ -40,13 +40,11 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://we.want.that.site.com/16 HTTP/1.1
Host: we.want.that.site.com
Proxy-Authorization: Basic ZmFrZUB1c2VyOmxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZw==
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test160 b/tests/data/test160
index df80aef9..4b1c5edd 100644
--- a/tests/data/test160
+++ b/tests/data/test160
@@ -56,16 +56,15 @@ Connection: close
surprise2
</stdout>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/160 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /wantmore/1600001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test162 b/tests/data/test162
index 29791d9a..d1547458 100644
--- a/tests/data/test162
+++ b/tests/data/test162
@@ -44,14 +44,11 @@ http://%HOSTIP:%HTTPPORT/162 --proxy http://%HOSTIP:%HTTPPORT --proxy-user foo:b
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
GET http://%HOSTIP:%HTTPPORT/162 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Proxy-Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-User-Agent: curl/7.8.1-pre3 (sparc-sun-solaris2.7) libcurl 7.8.1-pre3 (OpenSSL 0.9.6a) (krb4 enabled)
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test163 b/tests/data/test163
index b4e2d260..e4f72061 100644
--- a/tests/data/test163
+++ b/tests/data/test163
@@ -46,12 +46,12 @@ yes please
# Verify data after the test has been "shot"
<verify>
<strip>
-^(User-Agent:|Content-Type: multipart/form-data;|------------).*
+^(Content-Type: multipart/form-data;|------------).*
</strip>
<protocol>
POST /we/want/163 HTTP/1.1
-User-Agent: curl/7.11.2-CVS (i686-pc-linux-gnu) libcurl/7.11.2-CVS OpenSSL/0.9.6b zlib/1.1.4 c-ares/1.0.0
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 304
Content-Type: multipart/form-data; boundary=----------------------------c2d1767eb6ac
diff --git a/tests/data/test1630 b/tests/data/test1630
index 1d381c7b..7bf40663 100644
--- a/tests/data/test1630
+++ b/tests/data/test1630
@@ -41,13 +41,11 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<proxy>
GET http://we.want.that.site.com/1630 HTTP/1.1
Host: we.want.that.site.com
Proxy-Authorization: Basic ZmFrZUB1c2VyOmxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZw==
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test1631 b/tests/data/test1631
index cd36b1d9..be4a24a3 100644
--- a/tests/data/test1631
+++ b/tests/data/test1631
@@ -46,6 +46,7 @@ FTP through HTTPS-proxy
-p -x https://%HOSTIP:%HTTPSPROXYPORT ftp://ftp.site.thru.https.proxy:%FTPPORT/1631 --proxy-insecure
</command>
<features>
+http
proxy
</features>
</client>
@@ -74,8 +75,6 @@ Proxy-Connection: Keep-Alive
<protocol>
USER anonymous
PASS ftp@example.com
-PBSZ 0
-PROT P
PWD
EPSV
TYPE I
diff --git a/tests/data/test1632 b/tests/data/test1632
index b10b2a68..296137bf 100644
--- a/tests/data/test1632
+++ b/tests/data/test1632
@@ -55,6 +55,7 @@ FTP through HTTPS-proxy, with connection re-use
-p -x https://%HOSTIP:%HTTPSPROXYPORT ftp://ftp.site.thru.https.proxy:%FTPPORT/1632 --proxy-insecure ftp://ftp.site.thru.https.proxy:%FTPPORT/16320002
</command>
<features>
+http
proxy
</features>
</client>
@@ -89,8 +90,6 @@ Proxy-Connection: Keep-Alive
<protocol>
USER anonymous
PASS ftp@example.com
-PBSZ 0
-PROT P
PWD
EPSV
TYPE I
diff --git a/tests/data/test1633 b/tests/data/test1633
index 5d29ef13..6b6e1eb9 100644
--- a/tests/data/test1633
+++ b/tests/data/test1633
@@ -68,28 +68,29 @@ http://%HOSTIP:%HTTPPORT/1633 -d moo --retry 1 -L
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
POST /1633 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 3
Content-Type: application/x-www-form-urlencoded
mooGET /16330002 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
POST /1633 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 3
Content-Type: application/x-www-form-urlencoded
mooGET /16330002 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test164 b/tests/data/test164
index 9240611d..97e2c5ea 100644
--- a/tests/data/test164
+++ b/tests/data/test164
@@ -54,13 +54,11 @@ http://%HOSTIP:%HTTPPORT/want/164 -r 0-10,12-15
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/164 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Range: bytes=0-10,12-15
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test165 b/tests/data/test165
index 47de3919..35539427 100644
--- a/tests/data/test165
+++ b/tests/data/test165
@@ -49,17 +49,16 @@ http://www.åäö.se/page/165 -x %HOSTIP:%HTTPPORT http://www.große.de/page/165
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://www.xn--4cab6c.se/page/165 HTTP/1.1
Host: www.xn--4cab6c.se
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://www.xn--groe-xna.de/page/165 HTTP/1.1
Host: www.xn--groe-xna.de
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test166 b/tests/data/test166
index f170752e..697a2452 100644
--- a/tests/data/test166
+++ b/tests/data/test166
@@ -38,12 +38,12 @@ data inside the file
# Verify data after the test has been "shot"
<verify>
<strip>
-^(User-Agent:|Content-Type: multipart/form-data;|------------).*
+^(Content-Type: multipart/form-data;|------------).*
</strip>
<protocol>
POST /we/want/166 HTTP/1.1
-User-Agent: curl/7.12.0-CVS (i686-pc-linux-gnu) libcurl/7.12.0-CVS OpenSSL/0.9.6b zlib/1.1.4 c-ares/1.2.0 libidn/0.4.3
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 223
Content-Type: multipart/form-data; boundary=----------------------------b0b3d6d23991
diff --git a/tests/data/test167 b/tests/data/test167
index e08555ec..5067e779 100644
--- a/tests/data/test167
+++ b/tests/data/test167
@@ -57,14 +57,11 @@ http://data.from.server.requiring.digest.hohoho.com/167 --proxy http://%HOSTIP:%
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
GET http://data.from.server.requiring.digest.hohoho.com/167 HTTP/1.1
Host: data.from.server.requiring.digest.hohoho.com
Proxy-Authorization: Basic Zm9vOmJhcg==
-User-Agent: curl/7.12.0-CVS (i686-pc-linux-gnu) libcurl/7.12.0-CVS OpenSSL/0.9.6b zlib/1.1.4 c-ares/1.2.0 libidn/0.4.3
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
@@ -72,7 +69,7 @@ GET http://data.from.server.requiring.digest.hohoho.com/167 HTTP/1.1
Host: data.from.server.requiring.digest.hohoho.com
Proxy-Authorization: Basic Zm9vOmJhcg==
Authorization: Digest username="digest", realm="weirdorealm", nonce="12345", uri="/167", response="13c7c02a252cbe1c46d8669898a3be26"
-User-Agent: curl/7.12.0-CVS (i686-pc-linux-gnu) libcurl/7.12.0-CVS OpenSSL/0.9.6b zlib/1.1.4 c-ares/1.2.0 libidn/0.4.3
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test168 b/tests/data/test168
index fb876204..ddad8bb7 100644
--- a/tests/data/test168
+++ b/tests/data/test168
@@ -71,20 +71,17 @@ http://data.from.server.requiring.digest.hohoho.com/168 --proxy http://%HOSTIP:%
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
GET http://data.from.server.requiring.digest.hohoho.com/168 HTTP/1.1
Host: data.from.server.requiring.digest.hohoho.com
-User-Agent: curl/7.12.0-CVS (i686-pc-linux-gnu) libcurl/7.12.0-CVS OpenSSL/0.9.6b zlib/1.1.4 c-ares/1.2.0 libidn/0.4.3
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://data.from.server.requiring.digest.hohoho.com/168 HTTP/1.1
Host: data.from.server.requiring.digest.hohoho.com
Proxy-Authorization: Digest username="foo", realm="weirdorealm", nonce="12345", uri="/168", response="fb8608e00ad9239a3dedb14bc8575976"
-User-Agent: curl/7.12.0-CVS (i686-pc-linux-gnu) libcurl/7.12.0-CVS OpenSSL/0.9.6b zlib/1.1.4 c-ares/1.2.0 libidn/0.4.3
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
@@ -92,7 +89,7 @@ GET http://data.from.server.requiring.digest.hohoho.com/168 HTTP/1.1
Host: data.from.server.requiring.digest.hohoho.com
Proxy-Authorization: Digest username="foo", realm="weirdorealm", nonce="12345", uri="/168", response="fb8608e00ad9239a3dedb14bc8575976"
Authorization: Digest username="digest", realm="realmweirdo", nonce="123456", uri="/168", response="ca87f2d768a231e2d637a55698d5c416"
-User-Agent: curl/7.12.0-CVS (i686-pc-linux-gnu) libcurl/7.12.0-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS libidn/0.4.3
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test169 b/tests/data/test169
index 209dd9d9..6d30b2ad 100644
--- a/tests/data/test169
+++ b/tests/data/test169
@@ -101,28 +101,25 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
GET http://data.from.server.requiring.digest.hohoho.com/169 HTTP/1.1
Host: data.from.server.requiring.digest.hohoho.com
Proxy-Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-User-Agent: curl/7.12.0-CVS (i686-pc-linux-gnu) libcurl/7.12.0-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS libidn/0.4.3
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://data.from.server.requiring.digest.hohoho.com/169 HTTP/1.1
Host: data.from.server.requiring.digest.hohoho.com
Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=
-User-Agent: curl/7.12.0-CVS (i686-pc-linux-gnu) libcurl/7.12.0-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS libidn/0.4.3
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://data.from.server.requiring.digest.hohoho.com/169 HTTP/1.1
Host: data.from.server.requiring.digest.hohoho.com
Authorization: Digest username="digest", realm="r e a l m", nonce="abcdef", uri="/169", response="95d48591985a03c4b49cb962aa7bd3e6"
-User-Agent: curl/7.12.0-CVS (i686-pc-linux-gnu) libcurl/7.12.0-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS libidn/0.4.3
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test170 b/tests/data/test170
index 9b41ddd7..58c2a3fe 100644
--- a/tests/data/test170
+++ b/tests/data/test170
@@ -33,14 +33,11 @@ http://a.galaxy.far.far.away/170 --proxy http://%HOSTIP:%HTTPPORT --proxy-user f
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
POST http://a.galaxy.far.far.away/170 HTTP/1.1
Host: a.galaxy.far.far.away
Proxy-Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-User-Agent: curl/7.12.0-CVS (i686-pc-linux-gnu) libcurl/7.12.0-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 libidn/0.4.3
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 0
diff --git a/tests/data/test1700 b/tests/data/test1700
index 9ab46c9c..ff1e2724 100644
--- a/tests/data/test1700
+++ b/tests/data/test1700
@@ -54,17 +54,18 @@ http://%HOSTIP:%HTTP2PORT/1700 --http2 http://%HOSTIP:%HTTP2PORT/17000001
# Verify data after the test has been "shot"
<verify>
<strip>
-^User-Agent:.*
^X-Forwarded-Proto:.*
^Via:.*
</strip>
<protocol>
GET /1700 HTTP/1.1
Host: %HOSTIP:%HTTP2PORT
+User-Agent: curl/%VERSION
Accept: */*
GET /17000001 HTTP/1.1
Host: %HOSTIP:%HTTP2PORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1701 b/tests/data/test1701
index 49432887..d8986173 100644
--- a/tests/data/test1701
+++ b/tests/data/test1701
@@ -45,13 +45,13 @@ http://%HOSTIP:%HTTP2PORT/1701 --http2 -d "datatosend"
# Verify data after the test has been "shot"
<verify>
<strip>
-^User-Agent:.*
^X-Forwarded-Proto:.*
^Via:.*
</strip>
<protocol nonewline="yes">
POST /1701 HTTP/1.1
Host: %HOSTIP:%HTTP2PORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 10
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test1702 b/tests/data/test1702
index 903a737c..15757674 100644
--- a/tests/data/test1702
+++ b/tests/data/test1702
@@ -44,13 +44,13 @@ http://%HOSTIP:%HTTP2PORT/1702 --http2 --head
# Verify data after the test has been "shot"
<verify>
<strip>
-^User-Agent:.*
^X-Forwarded-Proto:.*
^Via:.*
</strip>
<protocol>
HEAD /1702 HTTP/1.1
Host: %HOSTIP:%HTTP2PORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test171 b/tests/data/test171
index 482c0b7e..d6a82303 100644
--- a/tests/data/test171
+++ b/tests/data/test171
@@ -40,12 +40,10 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://z.x.com/171 HTTP/1.1
Host: z.x.com
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test172 b/tests/data/test172
index ad362842..dda8a38c 100644
--- a/tests/data/test172
+++ b/tests/data/test172
@@ -42,12 +42,10 @@ http://%HOSTIP:%HTTPPORT/we/want/172 -b log/jar172.txt -b "tool=curl; name=fool"
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/want/172 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Cookie: nodomain=value; partmatch=present; tool=curl; name=fool
diff --git a/tests/data/test173 b/tests/data/test173
index 865ef7ba..1484cbe0 100644
--- a/tests/data/test173
+++ b/tests/data/test173
@@ -46,12 +46,12 @@ line8
# Verify data after the test has been "shot"
<verify>
<strip>
-^(User-Agent:|Content-Type: multipart/form-data;|------------).*
+^(Content-Type: multipart/form-data;|------------).*
</strip>
<protocol>
POST /we/want/173 HTTP/1.1
-User-Agent: curl/7.12.1-CVS (i686-pc-linux-gnu) libcurl/7.12.1-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS libidn/0.4.6
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 360
Content-Type: multipart/form-data; boundary=----------------------------5dbea401cd8c
diff --git a/tests/data/test174 b/tests/data/test174
index 9767f2f5..e5a9d6fc 100644
--- a/tests/data/test174
+++ b/tests/data/test174
@@ -35,13 +35,10 @@ http://%HOSTIP:%HTTPPORT/174 -u testuser:testpass --anyauth -d "junkelijunk"
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol nonewline="yes">
POST /174 HTTP/1.1
-User-Agent: curl/7.12.1-CVS (i686-pc-linux-gnu) libcurl/7.12.1-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS libidn/0.4.6
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 11
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test175 b/tests/data/test175
index 9e005f1f..8b49a32b 100644
--- a/tests/data/test175
+++ b/tests/data/test175
@@ -62,20 +62,17 @@ http://%HOSTIP:%HTTPPORT/175 -u auser:apasswd --digest -d "junkelijunk"
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol nonewline="yes">
POST /175 HTTP/1.1
-User-Agent: curl/7.12.1-CVS (i686-pc-linux-gnu) libcurl/7.12.1-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS libidn/0.4.6
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 0
Content-Type: application/x-www-form-urlencoded
POST /175 HTTP/1.1
-User-Agent: curl/7.12.1-CVS (i686-pc-linux-gnu) libcurl/7.12.1-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS libidn/0.4.6
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 11
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test176 b/tests/data/test176
index e18837af..5fe310fa 100644
--- a/tests/data/test176
+++ b/tests/data/test176
@@ -64,21 +64,18 @@ http://%HOSTIP:%HTTPPORT/176 -u auser:apasswd --ntlm -d "junkelijunk"
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol nonewline="yes">
POST /176 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-User-Agent: curl/7.12.1-CVS (i686-pc-linux-gnu) libcurl/7.12.1-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS libidn/0.4.6
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 0
Content-Type: application/x-www-form-urlencoded
POST /176 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-User-Agent: curl/7.12.1-CVS (i686-pc-linux-gnu) libcurl/7.12.1-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS libidn/0.4.6
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 11
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test177 b/tests/data/test177
index 495dea9b..e31f1b7f 100644
--- a/tests/data/test177
+++ b/tests/data/test177
@@ -38,13 +38,10 @@ http://%HOSTIP:%HTTPPORT/177 -u auser:apasswd --digest -d "junkelijunk"
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
POST /177 HTTP/1.1
-User-Agent: curl/7.12.1-CVS (i686-pc-linux-gnu) libcurl/7.12.1-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS libidn/0.4.6
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 0
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test178 b/tests/data/test178
index d22d8149..b67e353a 100644
--- a/tests/data/test178
+++ b/tests/data/test178
@@ -41,12 +41,10 @@ http://%HOSTIP:%HTTPPORT/178
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /178 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test179 b/tests/data/test179
index 3a94c00b..9f7bdedc 100644
--- a/tests/data/test179
+++ b/tests/data/test179
@@ -45,12 +45,10 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://supertrooper.fake/c/179 HTTP/1.1
Host: supertrooper.fake
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Cookie: moo2=indeed
diff --git a/tests/data/test18 b/tests/data/test18
index e1d76398..0fe92f79 100644
--- a/tests/data/test18
+++ b/tests/data/test18
@@ -47,23 +47,20 @@ multiple requests using {} in URL
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /18 HTTP/1.1
-User-Agent: curl/7.8.1-pre3 (sparc-sun-solaris2.7) libcurl 7.8.1-pre3 (OpenSSL 0.9.6a) (krb4 enabled)
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /180002 HTTP/1.1
-User-Agent: curl/7.8.1-pre3 (sparc-sun-solaris2.7) libcurl 7.8.1-pre3 (OpenSSL 0.9.6a) (krb4 enabled)
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /180003 HTTP/1.1
-User-Agent: curl/7.8.1-pre3 (sparc-sun-solaris2.7) libcurl 7.8.1-pre3 (OpenSSL 0.9.6a) (krb4 enabled)
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test180 b/tests/data/test180
index 0b2ca037..1074e267 100644
--- a/tests/data/test180
+++ b/tests/data/test180
@@ -44,12 +44,10 @@ the
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
PUT /we/want/180 HTTP/1.0
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 78
diff --git a/tests/data/test1800 b/tests/data/test1800
index c308c99b..89f4292b 100644
--- a/tests/data/test1800
+++ b/tests/data/test1800
@@ -39,12 +39,10 @@ http://%HOSTIP:%HTTPPORT/1800 --http2
</client>
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1800 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Connection: Upgrade, HTTP2-Settings
Upgrade: %H2CVER
diff --git a/tests/data/test1801 b/tests/data/test1801
index b827ab51..15367d22 100644
--- a/tests/data/test1801
+++ b/tests/data/test1801
@@ -49,12 +49,10 @@ http://%HOSTIP:%HTTPPORT/1801 --http2
</client>
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1801 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Connection: Upgrade, HTTP2-Settings
Upgrade: %H2CVER
diff --git a/tests/data/test181 b/tests/data/test181
index b6b55cb9..c2f81357 100644
--- a/tests/data/test181
+++ b/tests/data/test181
@@ -44,12 +44,10 @@ the
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
POST /we/want/181 HTTP/1.0
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 79
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test183 b/tests/data/test183
index cf992a26..d72081c4 100644
--- a/tests/data/test183
+++ b/tests/data/test183
@@ -37,19 +37,16 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
GET http://deathstar.another.galaxy/183 HTTP/1.1
-User-Agent: curl/7.12.2-CVS (i686-pc-linux-gnu) libcurl/7.12.2-CVS OpenSSL/0.9.6b zlib/1.1.4 libidn/0.4.6
Host: deathstar.another.galaxy
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://a.galaxy.far.far.away/183 HTTP/1.1
-User-Agent: curl/7.12.2-CVS (i686-pc-linux-gnu) libcurl/7.12.2-CVS OpenSSL/0.9.6b zlib/1.1.4 libidn/0.4.6
Host: a.galaxy.far.far.away
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test184 b/tests/data/test184
index 42e652e3..1afb10df 100644
--- a/tests/data/test184
+++ b/tests/data/test184
@@ -57,18 +57,16 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
GET http://deathstar.another.galaxy/184 HTTP/1.1
Host: another.visitor.stay.a.while.stay.foreeeeeever
-User-Agent: curl/7.12.2-CVS (i686-pc-linux-gnu) libcurl/7.12.2-CVS OpenSSL/0.9.6b zlib/1.1.4 libidn/0.4.6
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://yet.another.host/184 HTTP/1.1
Host: yet.another.host
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test185 b/tests/data/test185
index 3bc58a04..ba48fd87 100644
--- a/tests/data/test185
+++ b/tests/data/test185
@@ -57,18 +57,16 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
GET http://deathstar.another.galaxy/185 HTTP/1.1
Host: another.visitor.stay.a.while.stay.foreeeeeever
-User-Agent: curl/7.12.2-CVS (i686-pc-linux-gnu) libcurl/7.12.2-CVS OpenSSL/0.9.6b zlib/1.1.4 libidn/0.4.6
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://deathstar.another.galaxy/go/west/185 HTTP/1.1
Host: another.visitor.stay.a.while.stay.foreeeeeever
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test186 b/tests/data/test186
index 4abc74a2..f5a75c6f 100644
--- a/tests/data/test186
+++ b/tests/data/test186
@@ -36,12 +36,12 @@ http://%HOSTIP:%HTTPPORT/we/want/186 -F "name=daniel;type=moo/foo" -F "html= <bo
# Verify data after the test has been "shot"
<verify>
<strip>
-^(User-Agent:|Content-Type: multipart/form-data;|------------).*
+^(Content-Type: multipart/form-data;|------------).*
</strip>
<protocol>
POST /we/want/186 HTTP/1.1
-User-Agent: curl/7.12.2-CVS (i686-pc-linux-gnu) libcurl/7.12.2-CVS OpenSSL/0.9.7d zlib/1.2.1.1 c-ares/1.2.0 libidn/0.5.2
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 320
Content-Type: multipart/form-data; boundary=----------------------------212d9006ceb5
diff --git a/tests/data/test187 b/tests/data/test187
index b82a6c60..a1865412 100644
--- a/tests/data/test187
+++ b/tests/data/test187
@@ -60,16 +60,15 @@ http://%HOSTIP:%HTTPPORT?oh=what-weird=test/187 -L
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /?oh=what-weird=test/187 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /root/1870002.txt?coolsite=yes HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test188 b/tests/data/test188
index d8ca1cd4..14e95c8e 100644
--- a/tests/data/test188
+++ b/tests/data/test188
@@ -57,20 +57,17 @@ http://%HOSTIP:%HTTPPORT/188 -C 50 -L
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /188 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Range: bytes=50-
-User-Agent: curl/7.6 (sparc-sun-solaris2.7) libcurl 7.6-pre4 (SSL 0.9.6) (krb4 enabled)
+User-Agent: curl/%VERSION
Accept: */*
GET /188 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Range: bytes=50-
-User-Agent: curl/7.12.2-CVS (i686-pc-linux-gnu) libcurl/7.12.2-CVS OpenSSL/0.9.7d zlib/1.2.1.2 libidn/0.5.2
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test189 b/tests/data/test189
index 65780f80..3435a52b 100644
--- a/tests/data/test189
+++ b/tests/data/test189
@@ -51,20 +51,17 @@ http://%HOSTIP:%HTTPPORT/189 -C 50 -L
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /189 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Range: bytes=50-
-User-Agent: curl/7.6 (sparc-sun-solaris2.7) libcurl 7.6-pre4 (SSL 0.9.6) (krb4 enabled)
+User-Agent: curl/%VERSION
Accept: */*
GET /189 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Range: bytes=50-
-User-Agent: curl/7.12.2-CVS (i686-pc-linux-gnu) libcurl/7.12.2-CVS OpenSSL/0.9.7d zlib/1.2.1.2 libidn/0.5.2
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1900 b/tests/data/test1900
deleted file mode 100644
index 2e3c93a0..00000000
--- a/tests/data/test1900
+++ /dev/null
@@ -1,61 +0,0 @@
-<testcase>
-<info>
-<keywords>
-HTTP
-pipelining
-multi
-</keywords>
-</info>
-
-# Server-side
-<reply>
-<data>
-Adding handle 0
-Handle 0 Completed with status 0
-Adding handle 1
-Adding handle 2
-Adding handle 3
-Adding handle 4
-Adding handle 5
-Adding handle 6
-Handle 4 Completed with status 0
-Handle 5 Completed with status 0
-Handle 6 Completed with status 0
-Handle 1 Completed with status 0
-Handle 2 Completed with status 0
-Handle 3 Completed with status 0
-</data>
-</reply>
-
-# Client-side
-<client>
-<server>
-http-pipe
-</server>
-<features>
-http
-</features>
-<tool>
-lib1900
-</tool>
- <name>
-HTTP GET using pipelining
- </name>
- <command>
-http://%HOSTIP:%HTTPPIPEPORT/ log/urls1900.txt
-</command>
-<file name="log/urls1900.txt">
-0 1k.txt
-1000 100k.txt
-0 1k.txt
-0 1k.txt
-0 1k.txt
-0 1k.txt
-0 1k.txt
-</file>
-</client>
-
-# Verify data after the test has been "shot"
-<verify>
-</verify>
-</testcase>
diff --git a/tests/data/test1901 b/tests/data/test1901
deleted file mode 100644
index 793bd667..00000000
--- a/tests/data/test1901
+++ /dev/null
@@ -1,63 +0,0 @@
-<testcase>
-<info>
-<keywords>
-HTTP
-pipelining
-multi
-flaky
-</keywords>
-</info>
-
-# Server-side
-<reply>
-<data>
-Adding handle 0
-Handle 0 Completed with status 0
-Adding handle 1
-Adding handle 2
-Adding handle 3
-Adding handle 4
-Adding handle 5
-Adding handle 6
-Handle 2 Completed with status 0
-Handle 3 Completed with status 0
-Handle 4 Completed with status 0
-Handle 1 Completed with status 0
-Handle 5 Completed with status 0
-Handle 6 Completed with status 0
-</data>
-</reply>
-
-# Client-side
-<client>
-<server>
-http-pipe
-</server>
-<features>
-http
-</features>
-<tool>
-lib1900
-</tool>
- <name>
-HTTP GET using pipelining, blocklisted site
- </name>
- <command>
-http://%HOSTIP:%HTTPPIPEPORT/ log/urls1901.txt
-</command>
-<file name="log/urls1901.txt">
-blocklist_site 127.0.0.1:%HTTPPIPEPORT
-0 1k.txt
-1000 100k.txt
-0 1k.txt
-0 1k.txt
-0 1k.txt
-0 1k.txt
-0 1k.txt
-</file>
-</client>
-
-# Verify data after the test has been "shot"
-<verify>
-</verify>
-</testcase>
diff --git a/tests/data/test1902 b/tests/data/test1902
deleted file mode 100644
index 3c999316..00000000
--- a/tests/data/test1902
+++ /dev/null
@@ -1,62 +0,0 @@
-<testcase>
-<info>
-<keywords>
-HTTP
-pipelining
-multi
-flaky
-</keywords>
-</info>
-
-# Server-side
-<reply>
-<data>
-Adding handle 0
-Handle 0 Completed with status 0
-Adding handle 1
-Adding handle 2
-Adding handle 3
-Adding handle 4
-Adding handle 5
-Adding handle 6
-Handle 1 Completed with status 0
-Handle 4 Completed with status 0
-Handle 5 Completed with status 0
-Handle 6 Completed with status 0
-Handle 2 Completed with status 0
-Handle 3 Completed with status 0
-</data>
-</reply>
-
-# Client-side
-<client>
-<server>
-http-pipe
-</server>
-<features>
-http
-</features>
-<tool>
-lib1900
-</tool>
- <name>
-HTTP GET using pipelining, broken pipe
- </name>
- <command>
-http://%HOSTIP:%HTTPPIPEPORT/ log/urls1902.txt
-</command>
-<file name="log/urls1902.txt">
-0 1k.txt
-1000 connection_close.txt
-1 1k.txt
-2 1k.txt
-3 1k.txt
-4 1k.txt
-5 1k.txt
-</file>
-</client>
-
-# Verify data after the test has been "shot"
-<verify>
-</verify>
-</testcase>
diff --git a/tests/data/test1903 b/tests/data/test1903
deleted file mode 100644
index 219ffe11..00000000
--- a/tests/data/test1903
+++ /dev/null
@@ -1,62 +0,0 @@
-<testcase>
-<info>
-<keywords>
-HTTP
-pipelining
-multi
-flaky
-</keywords>
-</info>
-
-# Server-side
-<reply>
-<data>
-Adding handle 0
-Handle 0 Completed with status 0
-Adding handle 1
-Adding handle 2
-Adding handle 3
-Adding handle 4
-Adding handle 5
-Adding handle 6
-Handle 2 Completed with status 0
-Handle 3 Completed with status 0
-Handle 4 Completed with status 0
-Handle 5 Completed with status 0
-Handle 6 Completed with status 0
-Handle 1 Completed with status 0
-</data>
-</reply>
-
-# Client-side
-<client>
-<server>
-http-pipe
-</server>
-<features>
-http
-</features>
-<tool>
-lib1900
-</tool>
- <name>
-HTTP GET using pipelining, penalized on content-length
- </name>
- <command>
-http://%HOSTIP:%HTTPPIPEPORT/ log/urls1903.txt
-</command>
-<file name="log/urls1903.txt">
-0 1k.txt
-1000 100k.txt
-550 alphabet.txt
-10 alphabet.txt
-10 alphabet.txt
-10 alphabet.txt
-10 alphabet.txt
-</file>
-</client>
-
-# Verify data after the test has been "shot"
-<verify>
-</verify>
-</testcase>
diff --git a/tests/data/test1904 b/tests/data/test1904
index 76028547..f75e87da 100644
--- a/tests/data/test1904
+++ b/tests/data/test1904
@@ -61,20 +61,17 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<proxy>
CONNECT test.1904:%HTTPPORT HTTP/1.1
Host: test.1904:%HTTPPORT
-User-Agent: curl/7.10.7-pre2 (i686-pc-linux-gnu) libcurl/7.10.7-pre2 OpenSSL/0.9.7a zlib/1.1.3
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
</proxy>
<protocol>
GET /we/want/that/page/1904 HTTP/1.1
Host: test.1904:%HTTPPORT
-User-Agent: curl/7.10.7-pre2 (i686-pc-linux-gnu) libcurl/7.10.7-pre2 OpenSSL/0.9.7a zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1905 b/tests/data/test1905
index 0459b10b..1fafddf6 100644
--- a/tests/data/test1905
+++ b/tests/data/test1905
@@ -39,9 +39,6 @@ http://%HOSTIP:%HTTPPORT/we/want/1905
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/want/1905 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test1906 b/tests/data/test1906
index 0ff2b2be..0c476a15 100644
--- a/tests/data/test1906
+++ b/tests/data/test1906
@@ -39,9 +39,6 @@ http://%HOSTIP:%HTTPPORT/1906
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1906 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test1907 b/tests/data/test1907
index 93f37051..85cabde1 100644
--- a/tests/data/test1907
+++ b/tests/data/test1907
@@ -37,9 +37,6 @@ lib1907
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1907 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test1908 b/tests/data/test1908
index bf23ef9f..b63e03ad 100644
--- a/tests/data/test1908
+++ b/tests/data/test1908
@@ -8,7 +8,7 @@ CURLINFO_EFFECTIVE_URL
# Server-side
<reply>
<data nocheck="yes">
-HTTP/1.1 200 OK
+HTTP/1.1 200 OK swsbounce
Date: Thu, 09 Nov 2010 14:49:00 GMT
Server: test-server/fake
Content-Type: text/html
@@ -17,6 +17,15 @@ Content-Length: 0
alt-svc: h2="3dbbdetxoyw4nsp6c3cc456oj2ays6s43ezxzsfxxri3h5xqd.example:443"; ma=315360000; persist=1
</data>
+
+# This is the second response
+<data1 nocheck="yes">
+HTTP/1.1 200 OK
+Connection: close
+Content-Length: 0
+alt-svc: h2="second.example:443"; ma=315360000;
+
+</data1>
</reply>
# Client-side
@@ -48,14 +57,15 @@ lib1908
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1908 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Accept: */*
+GET /1908 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+
</protocol>
<stripfile>
# strip out the (dynamic) expire date from the file so that the rest
diff --git a/tests/data/test1909 b/tests/data/test1909
index bde0e5e0..ba082529 100644
--- a/tests/data/test1909
+++ b/tests/data/test1909
@@ -43,16 +43,15 @@ HTTP GET --retry-all-errors to overcome partial transfer
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1909 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /1909 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1910 b/tests/data/test1910
index a1b3f575..cd44c026 100644
--- a/tests/data/test1910
+++ b/tests/data/test1910
@@ -26,7 +26,7 @@ Content-Type: text/html
Content-Length: 4
hej
-</data>
+</data2>
</reply>
# Client-side
@@ -49,9 +49,6 @@ lib1910
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1910 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test1541 b/tests/data/test1911
index e18bb47d..ec5f531a 100644
--- a/tests/data/test1541
+++ b/tests/data/test1911
@@ -1,10 +1,7 @@
<testcase>
<info>
<keywords>
-HTTP
-HTTP GET
-multi-threaded
-connection-sharing
+curl_easy_option
</keywords>
</info>
@@ -15,17 +12,15 @@ connection-sharing
# Client-side
<client>
<server>
-http
+none
</server>
+<name>
+verify that curl_easy_setopt() rejects too long string inputs
+</name>
<tool>
-lib1541
+lib1911
</tool>
- <name>
-connection sharing using 67 parallel threads for 7 seconds
- </name>
- <command>
-http://%HOSTIP:%HTTPPORT/1
-</command>
+
</client>
# Verify data after the test has been "shot"
diff --git a/tests/data/test1912 b/tests/data/test1912
new file mode 100644
index 00000000..ed6b27b5
--- /dev/null
+++ b/tests/data/test1912
@@ -0,0 +1,30 @@
+<testcase>
+<info>
+<keywords>
+curl_easy_option
+typecheck
+</keywords>
+</info>
+
+# Server-side
+<reply>
+</reply>
+
+# Client-side
+<client>
+<server>
+none
+</server>
+<name>
+Cross validate that gcc-typecheck macros match the option types.
+</name>
+<tool>
+lib1912
+</tool>
+
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+</verify>
+</testcase>
diff --git a/tests/data/test1913 b/tests/data/test1913
new file mode 100644
index 00000000..daf74902
--- /dev/null
+++ b/tests/data/test1913
@@ -0,0 +1,41 @@
+<testcase>
+<info>
+<keywords>
+FTP
+CURLOPT_NOBODY
+</keywords>
+</info>
+
+# Server-side
+<reply>
+<servercmd>
+REPLY SIZE 550 no such file
+</servercmd>
+</reply>
+
+# Client-side
+<client>
+<server>
+ftp
+</server>
+
+# require debug so that alt-svc can work over plain old HTTP
+<name>
+FTP with NOBODY set, getting a missing file
+</name>
+<tool>
+lib1913
+</tool>
+
+<command>
+ftp://%HOSTIP:%FTPPORT/not-there/1913
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<errorcode>
+78
+</errorcode>
+</verify>
+</testcase>
diff --git a/tests/data/test1914 b/tests/data/test1914
new file mode 100644
index 00000000..1aa3e48c
--- /dev/null
+++ b/tests/data/test1914
@@ -0,0 +1,42 @@
+<testcase>
+<info>
+<keywords>
+FTP
+CURLOPT_NOBODY
+CURLOPT_FILETIME
+</keywords>
+</info>
+
+# Server-side
+<reply>
+<servercmd>
+REPLY MDTM 550 no such file
+</servercmd>
+</reply>
+
+# Client-side
+<client>
+<server>
+ftp
+</server>
+
+# require debug so that alt-svc can work over plain old HTTP
+<name>
+FTP with NOBODY and FILETIME set, getting a missing file
+</name>
+<tool>
+lib1913
+</tool>
+
+<command>
+ftp://%HOSTIP:%FTPPORT/not-there/1913 1
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<errorcode>
+78
+</errorcode>
+</verify>
+</testcase>
diff --git a/tests/data/test192 b/tests/data/test192
index 42cebc03..9a54a1a0 100644
--- a/tests/data/test192
+++ b/tests/data/test192
@@ -36,12 +36,10 @@ http://%HOSTIP:%HTTPPORT/192 -w "%{num_connects}\n"
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /192 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test193 b/tests/data/test193
index c5425bb3..6a9c674e 100644
--- a/tests/data/test193
+++ b/tests/data/test193
@@ -48,16 +48,15 @@ http://%HOSTIP:%HTTPPORT/193 -w "%{num_connects}\n" -L
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /193 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /193 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test194 b/tests/data/test194
index 730446f7..323ac0f3 100644
--- a/tests/data/test194
+++ b/tests/data/test194
@@ -55,13 +55,11 @@ http://%HOSTIP:%HTTPPORT/want/194 -C 87 --fail
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/194 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Range: bytes=87-
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test197 b/tests/data/test197
index 4d06cc5d..052a0ad3 100644
--- a/tests/data/test197
+++ b/tests/data/test197
@@ -44,16 +44,15 @@ http://%HOSTIP:%HTTPPORT/197 --retry 1000
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /197 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /197 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test198 b/tests/data/test198
index 0200366c..56dd74b4 100644
--- a/tests/data/test198
+++ b/tests/data/test198
@@ -53,16 +53,15 @@ http://%HOSTIP:%HTTPPORT/198 --retry 1000
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /198 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /198 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test199 b/tests/data/test199
index 72675b53..69a3cecc 100644
--- a/tests/data/test199
+++ b/tests/data/test199
@@ -42,16 +42,15 @@ HTTP with -d, -G and {}
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /199?foo=moo&moo=poo HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /199?foo=moo&moo=poo HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2 b/tests/data/test2
index 9f9c5061..bd53ed58 100644
--- a/tests/data/test2
+++ b/tests/data/test2
@@ -36,13 +36,11 @@ HTTP GET with user and password
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /2 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Basic ZmFrZTp1c2Vy
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2001 b/tests/data/test2001
index 9232499f..4286f1d1 100644
--- a/tests/data/test2001
+++ b/tests/data/test2001
@@ -63,12 +63,10 @@ moo
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /20010001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
USER anonymous
diff --git a/tests/data/test2002 b/tests/data/test2002
index efe75fa3..cad7cdf8 100644
--- a/tests/data/test2002
+++ b/tests/data/test2002
@@ -72,12 +72,10 @@ moo
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /20020001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
USER anonymous
diff --git a/tests/data/test2003 b/tests/data/test2003
index 68ae7142..12b4722d 100644
--- a/tests/data/test2003
+++ b/tests/data/test2003
@@ -72,12 +72,10 @@ moo
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /20030001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
USER anonymous
@@ -104,6 +102,7 @@ SIZE 20030002
RETR 20030002
GET /20030001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
QUIT
diff --git a/tests/data/test2005 b/tests/data/test2005
index f78b4be5..f26bf239 100644
--- a/tests/data/test2005
+++ b/tests/data/test2005
@@ -64,12 +64,10 @@ perl %SRCDIR/libtest/notexists.pl log/2005 log/name2005
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /2005 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2006 b/tests/data/test2006
index 4cb61192..addf86f0 100644
--- a/tests/data/test2006
+++ b/tests/data/test2006
@@ -73,12 +73,10 @@ perl %SRCDIR/libtest/notexists.pl log/2006 log/name2006
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /2006 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2007 b/tests/data/test2007
index 738ac35f..4c456151 100644
--- a/tests/data/test2007
+++ b/tests/data/test2007
@@ -74,12 +74,10 @@ perl %SRCDIR/libtest/notexists.pl log/2007 log/name2007
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /2007 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2008 b/tests/data/test2008
index b29ba911..ec41adb3 100644
--- a/tests/data/test2008
+++ b/tests/data/test2008
@@ -66,12 +66,10 @@ perl %SRCDIR/libtest/notexists.pl log/2008 log/name2008 log/outfile2008
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /2008 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2009 b/tests/data/test2009
index 3cf4e4c4..aa71a0ac 100644
--- a/tests/data/test2009
+++ b/tests/data/test2009
@@ -67,12 +67,10 @@ perl %SRCDIR/libtest/notexists.pl log/2009 log/name2009 log/outfile2009
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /2009 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2010 b/tests/data/test2010
index 08f1bfaa..cd0c4835 100644
--- a/tests/data/test2010
+++ b/tests/data/test2010
@@ -66,12 +66,10 @@ perl %SRCDIR/libtest/notexists.pl log/2010 log/name2010 log/outfile2010
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /2010 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2011 b/tests/data/test2011
index a8450231..1d081afc 100644
--- a/tests/data/test2011
+++ b/tests/data/test2011
@@ -64,12 +64,10 @@ perl %SRCDIR/libtest/notexists.pl log/2011 log/name2011
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /2011 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2012 b/tests/data/test2012
index 6751269d..ae627a9a 100644
--- a/tests/data/test2012
+++ b/tests/data/test2012
@@ -63,12 +63,10 @@ perl %SRCDIR/libtest/notexists.pl log/2012 log/name2012
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /2012 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2023 b/tests/data/test2023
index 382b6cb8..0b155b2d 100644
--- a/tests/data/test2023
+++ b/tests/data/test2023
@@ -128,9 +128,6 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /20230100 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test2024 b/tests/data/test2024
index cd06b7c9..c062b4c0 100644
--- a/tests/data/test2024
+++ b/tests/data/test2024
@@ -142,9 +142,6 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /20240100 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test2025 b/tests/data/test2025
index 282c6985..7a8fff15 100644
--- a/tests/data/test2025
+++ b/tests/data/test2025
@@ -224,9 +224,6 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /20250100 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test2026 b/tests/data/test2026
index afbd4f31..a505737d 100644
--- a/tests/data/test2026
+++ b/tests/data/test2026
@@ -178,9 +178,6 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /20260100 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test2027 b/tests/data/test2027
index 3302a155..3983e885 100644
--- a/tests/data/test2027
+++ b/tests/data/test2027
@@ -201,9 +201,6 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /20270100 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test2028 b/tests/data/test2028
index 92a63716..c7b70c8f 100644
--- a/tests/data/test2028
+++ b/tests/data/test2028
@@ -260,9 +260,6 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /20280100 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test2029 b/tests/data/test2029
index 59a793eb..67313c41 100644
--- a/tests/data/test2029
+++ b/tests/data/test2029
@@ -197,9 +197,6 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /20290100 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test2030 b/tests/data/test2030
index a158a907..1d281ab9 100644
--- a/tests/data/test2030
+++ b/tests/data/test2030
@@ -249,9 +249,6 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /20300100 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test2031 b/tests/data/test2031
index 9acfeef7..dabba374 100644
--- a/tests/data/test2031
+++ b/tests/data/test2031
@@ -263,9 +263,6 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /20310100 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test2032 b/tests/data/test2032
index 8200b8de..52574fe7 100644
--- a/tests/data/test2032
+++ b/tests/data/test2032
@@ -95,9 +95,6 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /20320100 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test2033 b/tests/data/test2033
deleted file mode 100644
index 0b33ccaa..00000000
--- a/tests/data/test2033
+++ /dev/null
@@ -1,125 +0,0 @@
-<testcase>
-<info>
-<keywords>
-HTTP
-HTTP GET
-HTTP Basic auth
-HTTP NTLM auth
-pipelining
-flaky
-</keywords>
-</info>
-# Server-side
-<reply>
-
-<!-- Basic auth -->
-<data100>
-HTTP/1.1 401 Need Basic or NTLM auth
-Server: Microsoft-IIS/5.0
-Content-Type: text/html; charset=iso-8859-1
-Content-Length: 29
-WWW-Authenticate: NTLM
-WWW-Authenticate: Basic realm="testrealm"
-
-This is a bad password page!
-</data100>
-
-<!-- NTLM auth -->
-<data200>
-HTTP/1.1 401 Need Basic or NTLM auth (2)
-Server: Microsoft-IIS/5.0
-Content-Type: text/html; charset=iso-8859-1
-Content-Length: 27
-WWW-Authenticate: NTLM
-WWW-Authenticate: Basic realm="testrealm"
-
-This is not the real page!
-</data200>
-
-<data1201>
-HTTP/1.1 401 NTLM intermediate (2)
-Server: Microsoft-IIS/5.0
-Content-Type: text/html; charset=iso-8859-1
-Content-Length: 33
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAACGgAEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=
-
-This is still not the real page!
-</data1201>
-
-<data1202>
-HTTP/1.1 200 Things are fine in server land
-Server: Microsoft-IIS/5.0
-Content-Type: text/html; charset=iso-8859-1
-Content-Length: 32
-
-Finally, this is the real page!
-</data1202>
-
-<datacheck>
-Data connection 0: 228
-Data connection 1: 228
-Data connection 2: 402
-</datacheck>
-
-</reply>
-
-# Client-side
-<client>
-<features>
-NTLM
-SSL
-!SSPI
-</features>
-<server>
-http
-</server>
-<tool>
-lib2033
-</tool>
-
- <name>
-NTLM connection mapping, pipelining enabled
- </name>
- <setenv>
-# we force our own host name, in order to make the test machine independent
-CURL_GETHOSTNAME=curlhost
-# we try to use the LD_PRELOAD hack, if not a debug build
-LD_PRELOAD=%PWD/libtest/.libs/libhostname.so
- </setenv>
- <command>
-http://%HOSTIP:%HTTPPORT/2032
-</command>
-<precheck>
-chkhostname curlhost
-</precheck>
-</client>
-
-# Verify data after the test has been "shot"
-<verify>
-<strip>
-^User-Agent:.*
-</strip>
-<protocol>
-GET /20320100 HTTP/1.1
-Host: %HOSTIP:%HTTPPORT
-Authorization: Basic dGVzdHVzZXI6dGVzdHBhc3M=
-Accept: */*
-
-GET /20320100 HTTP/1.1
-Host: %HOSTIP:%HTTPPORT
-Authorization: Basic dGVzdHVzZXI6dGVzdHBhc3M=
-Accept: */*
-
-GET /20320200 HTTP/1.1
-Host: %HOSTIP:%HTTPPORT
-Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-Accept: */*
-
-GET /20320200 HTTP/1.1
-Host: %HOSTIP:%HTTPPORT
-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoABAI+/Fp9IERAQ74OsdNPbBpg7o8CVwLSO4DtFyIcZHUMKVktWIu92s2892OVpd2JzqnRlc3R1c2VyY3VybGhvc3Q=
-Accept: */*
-
-</protocol>
-</verify>
-</testcase>
diff --git a/tests/data/test2034 b/tests/data/test2034
index 9bf0a817..57e3d862 100644
--- a/tests/data/test2034
+++ b/tests/data/test2034
@@ -45,12 +45,10 @@ perl -e "print 'Test requires default test server host' if ( '%HOSTIP' ne '127.0
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /2034 HTTP/1.1
Host: localhost:%HTTPSPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2036 b/tests/data/test2036
index 4b2ec43a..f022d144 100644
--- a/tests/data/test2036
+++ b/tests/data/test2036
@@ -29,9 +29,6 @@ HTTP, -O with no slash at all in the URL
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<errorcode>
23
</errorcode>
diff --git a/tests/data/test2037 b/tests/data/test2037
index d630538e..84a6676c 100644
--- a/tests/data/test2037
+++ b/tests/data/test2037
@@ -45,12 +45,11 @@ perl -e "print 'Test requires default test server host' if ( '%HOSTIP' ne '127.0
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
</strip>
<protocol>
GET /2037 HTTP/1.1
Host: localhost:%HTTPSPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2040 b/tests/data/test2040
index ac600174..cec8a6bc 100644
--- a/tests/data/test2040
+++ b/tests/data/test2040
@@ -47,17 +47,16 @@ HTTP Basic authorization, then without authorization
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /20400100 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Basic dGVzdHVzZXI6dGVzdHBhc3M=
+User-Agent: curl/%VERSION
Accept: */*
GET /20400200 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2041 b/tests/data/test2041
index 50018e40..d10abaa0 100644
--- a/tests/data/test2041
+++ b/tests/data/test2041
@@ -45,12 +45,10 @@ perl -e "print 'Test requires default test server host' if ( '%HOSTIP' ne '127.0
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /2041 HTTP/1.1
Host: localhost:%HTTPSPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2046 b/tests/data/test2046
index ec49c863..e85c00f2 100644
--- a/tests/data/test2046
+++ b/tests/data/test2046
@@ -59,16 +59,15 @@ http://åäö.se:%HTTPPORT/2046 --resolve xn--4cab6c.se:%HTTPPORT:%HOSTIP -w "%{
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /2046 HTTP/1.1
Host: xn--4cab6c.se:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /20460001 HTTP/1.1
Host: xn--4cab6c.se:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2047 b/tests/data/test2047
index 1471d005..cda2f918 100644
--- a/tests/data/test2047
+++ b/tests/data/test2047
@@ -61,17 +61,16 @@ http://åäö.se/2047 -x %HOSTIP:%HTTPPORT -w "%{num_connects}\n%{num_redirects}
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://xn--4cab6c.se/2047 HTTP/1.1
Host: xn--4cab6c.se
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://xn--4cab6c.se/20470001 HTTP/1.1
Host: xn--4cab6c.se
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test2049 b/tests/data/test2049
index efa576e9..0653e590 100644
--- a/tests/data/test2049
+++ b/tests/data/test2049
@@ -38,24 +38,25 @@ http://www1.example.com:8081/2049 --connect-to ::%HOSTIP:%HTTPPORT --next http:/
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /2049 HTTP/1.1
Host: www1.example.com:8081
+User-Agent: curl/%VERSION
Accept: */*
GET /2049 HTTP/1.1
Host: www2.example.com:8082
+User-Agent: curl/%VERSION
Accept: */*
GET /2049 HTTP/1.1
Host: www3.example.com:8083
+User-Agent: curl/%VERSION
Accept: */*
GET /2049 HTTP/1.1
Host: www4.example.com:8084
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2050 b/tests/data/test2050
index 5eef3dae..d4b7e641 100644
--- a/tests/data/test2050
+++ b/tests/data/test2050
@@ -61,18 +61,17 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<proxy>
CONNECT connect.example.com.2050:%HTTPPORT HTTP/1.1
Host: connect.example.com.2050:%HTTPPORT
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
</proxy>
<protocol>
GET /2050 HTTP/1.1
Host: www.example.com.2050
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2051 b/tests/data/test2051
index e8c6bed1..97f11380 100644
--- a/tests/data/test2051
+++ b/tests/data/test2051
@@ -38,20 +38,20 @@ http://%HOSTIP:%HTTPPORT/2051 -w "%{num_connects}\n" --next --connect-to ::%HOST
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /2051 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /2051 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /2051 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2052 b/tests/data/test2052
index 082002f2..70549db6 100644
--- a/tests/data/test2052
+++ b/tests/data/test2052
@@ -38,16 +38,15 @@ http://www.example.com:%HTTPPORT/2052 --resolve www.example.com:%HTTPPORT:%HOSTI
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /2052 HTTP/1.1
Host: www.example.com:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /2052 HTTP/1.1
Host: www.example.com:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2053 b/tests/data/test2053
index 98e78454..abf1366c 100644
--- a/tests/data/test2053
+++ b/tests/data/test2053
@@ -38,16 +38,15 @@ http://10.0.0.1:8081/2053 --connect-to 10.0.0.1:8081:%HOSTIP:%HTTPPORT --next ht
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /2053 HTTP/1.1
Host: 10.0.0.1:8081
+User-Agent: curl/%VERSION
Accept: */*
GET /2053 HTTP/1.1
Host: [fc00::1]:8082
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2054 b/tests/data/test2054
index 2a0b54eb..a79c59ca 100644
--- a/tests/data/test2054
+++ b/tests/data/test2054
@@ -38,24 +38,25 @@ http://%HOSTIP:%HTTPPORT/2054 --connect-to foo::bar: --connect-to :123::456 --ne
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /2054 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /2054 HTTP/1.1
Host: www.example.com:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /2054 HTTP/1.1
Host: %HOSTIP:8083
+User-Agent: curl/%VERSION
Accept: */*
GET /2054 HTTP/1.1
Host: www.example.com:8084
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2055 b/tests/data/test2055
index a5fac62b..5608b81f 100644
--- a/tests/data/test2055
+++ b/tests/data/test2055
@@ -62,18 +62,17 @@ http://www.example.com.2055/2055 --connect-to ::connect.example.com.2055:%HTTPPO
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<proxy>
CONNECT connect.example.com.2055:%HTTPPORT HTTP/1.1
Host: connect.example.com.2055:%HTTPPORT
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
</proxy>
<protocol>
GET /2055 HTTP/1.1
Host: www.example.com.2055
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2056 b/tests/data/test2056
index 5d2584ee..fc3d1477 100644
--- a/tests/data/test2056
+++ b/tests/data/test2056
@@ -53,13 +53,11 @@ CURL_STUB_GSS_CREDS="KRB5_Alice"
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /2056 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Negotiate IktSQjVfQWxpY2UiOkhUVFBAMTI3LjAuMC4xOjE6QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQQ==
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2057 b/tests/data/test2057
index 92d7824c..f9c37907 100644
--- a/tests/data/test2057
+++ b/tests/data/test2057
@@ -69,18 +69,17 @@ CURL_STUB_GSS_CREDS="NTLM_Alice"
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /2057 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Negotiate Ik5UTE1fQWxpY2UiOkhUVFBAMTI3LjAuMC4xOjI6QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQQ==
+User-Agent: curl/%VERSION
Accept: */*
GET /2057 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Negotiate Ik5UTE1fQWxpY2UiOkhUVFBAMTI3LjAuMC4xOjM6QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQQ==
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2058 b/tests/data/test2058
index 613dff00..e1a80146 100644
--- a/tests/data/test2058
+++ b/tests/data/test2058
@@ -81,14 +81,11 @@ test
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://%HOSTIP:%HTTPPORT/2058 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Content-Range: bytes 2-4/5
-User-Agent: curl/7.12.1-CVS (i686-pc-linux-gnu) libcurl/7.12.1-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS libidn/0.4.6
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 0
@@ -97,6 +94,7 @@ GET http://%HOSTIP:%HTTPPORT/2058 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="auser", realm="testrealm", nonce="1053604144", uri="/2058", response="fbed69f9f3fd304c8f1acb1a43eb32688b933c0e28055c16b926cbcec070aeed", algorithm=SHA-256
Content-Range: bytes 2-4/5
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 3
diff --git a/tests/data/test2059 b/tests/data/test2059
index 15799ae0..4b3ed0f5 100644
--- a/tests/data/test2059
+++ b/tests/data/test2059
@@ -81,14 +81,11 @@ test
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://%HOSTIP:%HTTPPORT/2059 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Content-Range: bytes 2-4/5
-User-Agent: curl/7.12.1-CVS (i686-pc-linux-gnu) libcurl/7.12.1-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS libidn/0.4.6
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 0
@@ -97,6 +94,7 @@ GET http://%HOSTIP:%HTTPPORT/2059 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="fddc3bc7b753b73ab0848fd83cb20cbbca971258eb8d20c941dd5e0b010d66be", realm="testrealm", nonce="1053604144", uri="/2059", response="fc09be8192851e284e73e8b719b32a2f6f91cca0594e68713da8c49dc2c1656e", algorithm=SHA-512-256, userhash=true
Content-Range: bytes 2-4/5
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 3
diff --git a/tests/data/test206 b/tests/data/test206
index f99ac4c7..49432649 100644
--- a/tests/data/test206
+++ b/tests/data/test206
@@ -85,22 +85,21 @@ http://test.remote.haxx.se.206:8990/path/2060002 --proxy http://%HOSTIP:%HTTPPOR
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
CONNECT test.remote.haxx.se.206:8990 HTTP/1.1
Host: test.remote.haxx.se.206:8990
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
CONNECT test.remote.haxx.se.206:8990 HTTP/1.1
Host: test.remote.haxx.se.206:8990
Proxy-Authorization: Digest username="silly", realm="weirdorealm", nonce="12345", uri="test.remote.haxx.se.206:8990", response="003e36decb4dbf6366b3ecb9b87c24ec"
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
GET /path/2060002 HTTP/1.1
-User-Agent: curl/7.12.3-CVS (i686-pc-linux-gnu) libcurl/7.12.3-CVS OpenSSL/0.9.6b zlib/1.1.4
Host: test.remote.haxx.se.206:8990
+User-Agent: curl/%VERSION
Accept: */*
[DISCONNECT]
diff --git a/tests/data/test2060 b/tests/data/test2060
index 05ce3510..dfb4bd5b 100644
--- a/tests/data/test2060
+++ b/tests/data/test2060
@@ -81,14 +81,11 @@ test
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://%HOSTIP:%HTTPPORT/2060 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Content-Range: bytes 2-4/5
-User-Agent: curl/7.12.1-CVS (i686-pc-linux-gnu) libcurl/7.12.1-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS libidn/0.4.6
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 0
@@ -97,6 +94,7 @@ GET http://%HOSTIP:%HTTPPORT/2060 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="auser", realm="testrealm", nonce="1053604144", uri="/2060", response="3ce1e25ffa611bdbe90e2ab367b9602fa223db9f6de76ac667f0d6157e2178a6", algorithm=SHA-512-256
Content-Range: bytes 2-4/5
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 3
diff --git a/tests/data/test2061 b/tests/data/test2061
index bee88e34..6953423a 100644
--- a/tests/data/test2061
+++ b/tests/data/test2061
@@ -65,18 +65,16 @@ http://%HOSTIP:%HTTPPORT/2061 -u testuser:testpass --digest
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /2061 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /2061 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="testrealm", nonce="1053604145", uri="/2061", response="9dc55255f1a2537b838311674b621d45346b862a81631bb20e4ce356ef25062d", algorithm=SHA-256
-User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2062 b/tests/data/test2062
index f6d4aff2..6075263d 100644
--- a/tests/data/test2062
+++ b/tests/data/test2062
@@ -65,18 +65,16 @@ http://%HOSTIP:%HTTPPORT/2062 -u testuser:testpass --digest
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /2062 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /2062 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="testrealm", nonce="1053604145", uri="/2062", response="2af735ec3508f4dff99248ffbbe9de9002bfd7cc770cfa2b026cb334042a54e3", algorithm=SHA-512-256
-User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2063 b/tests/data/test2063
index af9a9f0a..557e5936 100644
--- a/tests/data/test2063
+++ b/tests/data/test2063
@@ -65,18 +65,16 @@ http://%HOSTIP:%HTTPPORT/2063 -u testuser:testpass --digest
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /2063 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /2063 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="75af8a3500f771e58a52093a25e7905d6e428a511285c12ea1420c73078dfd61", realm="testrealm", nonce="1053604145", uri="/2063", response="43f7ab531dff687b5dc75617daa59d1fd67d648341d6d2655ca65ef5064cfb51", algorithm=SHA-512-256, userhash=true
-User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2064 b/tests/data/test2064
index bfaaa05e..fc196f25 100644
--- a/tests/data/test2064
+++ b/tests/data/test2064
@@ -65,18 +65,16 @@ http://%HOSTIP:%HTTPPORT/2064 -u testuser:test2pass --digest
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /2064 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /2064 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="testrealm", nonce="2053604145", uri="/2064", response="a9c3ec1036068b336cbabefe9dfcad52ee8b89bc7c91ddbb5bb415c6acdf38a5", algorithm=SHA-256
-User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2065 b/tests/data/test2065
index d18b008a..f352e6bc 100644
--- a/tests/data/test2065
+++ b/tests/data/test2065
@@ -65,18 +65,16 @@ http://%HOSTIP:%HTTPPORT/2065 -u testuser:test2pass --digest
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /2065 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /2065 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="testrealm", nonce="2053604145", uri="/2065", response="5a5f20b0e601aeddc6f96422c2332d49ff431c49ab143b5f836ef76e9ac78f5e", algorithm=SHA-512-256
-User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2066 b/tests/data/test2066
index b6effee0..31a143d6 100644
--- a/tests/data/test2066
+++ b/tests/data/test2066
@@ -65,18 +65,16 @@ http://%HOSTIP:%HTTPPORT/2066 -u testuser:test2pass --digest
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /2066 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /2066 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="75af8a3500f771e58a52093a25e7905d6e428a511285c12ea1420c73078dfd61", realm="testrealm", nonce="2053604145", uri="/2066", response="a2e2ae589f575fb132991d6f550ef14bf7ef697d2fef1242d2498f07eafc77dc", algorithm=SHA-512-256, userhash=true
-User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2067 b/tests/data/test2067
index c203343e..0ae40760 100644
--- a/tests/data/test2067
+++ b/tests/data/test2067
@@ -66,12 +66,10 @@ HTTP POST --digest with SHA256 and user-specified Content-Length header
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol nonewline="yes">
POST /2067 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 0
Content-Type: application/x-www-form-urlencoded
@@ -79,6 +77,7 @@ Content-Type: application/x-www-form-urlencoded
POST /2067 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="auser", realm="testrealm", nonce="1053604144", uri="/2067", response="67b97af219c92fa7e8685e5bebb8e74892f6c6792e911c52bd2dfbf0b49272eb", algorithm=SHA-256
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 11
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test2068 b/tests/data/test2068
index 5a197ce2..21003bdb 100644
--- a/tests/data/test2068
+++ b/tests/data/test2068
@@ -66,12 +66,10 @@ HTTP POST --digest with SHA-512-256, userhash=false and user-specified Content-L
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol nonewline="yes">
POST /2068 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 0
Content-Type: application/x-www-form-urlencoded
@@ -79,6 +77,7 @@ Content-Type: application/x-www-form-urlencoded
POST /2068 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="auser", realm="testrealm", nonce="1053604144", uri="/2068", response="4bc9c97a72f1856bcec9b0e1518c6b7ee28773f91357d56840bdc30bd89ca68f", algorithm=SHA-512-256
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 11
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test2069 b/tests/data/test2069
index 99fd71d0..fb3d15dc 100644
--- a/tests/data/test2069
+++ b/tests/data/test2069
@@ -66,12 +66,10 @@ HTTP POST --digest with SHA-512-256, userhash=true and user-specified Content-Le
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol nonewline="yes">
POST /2069 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 0
Content-Type: application/x-www-form-urlencoded
@@ -79,6 +77,7 @@ Content-Type: application/x-www-form-urlencoded
POST /2069 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="fddc3bc7b753b73ab0848fd83cb20cbbca971258eb8d20c941dd5e0b010d66be", realm="testrealm", nonce="1053604144", uri="/2069", response="ff13d977110a471f30de75e747976e4de78d7a3d2425cd23ff46e67f4bc9ead7", algorithm=SHA-512-256, userhash=true
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 11
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test207 b/tests/data/test207
index caff8105..1ce2338a 100644
--- a/tests/data/test207
+++ b/tests/data/test207
@@ -48,12 +48,10 @@ http://%HOSTIP:%HTTPPORT/207
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /207 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2070 b/tests/data/test2070
index f03c87b4..1039e84a 100644
--- a/tests/data/test2070
+++ b/tests/data/test2070
@@ -49,12 +49,10 @@ perl -e "print 'Test requires default test server host' if ( '%HOSTIP' ne '127.0
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /2070 HTTP/1.1
Host: localhost:%HTTPSPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2073 b/tests/data/test2073
index ed942f01..160ddbbc 100644
--- a/tests/data/test2073
+++ b/tests/data/test2073
@@ -42,11 +42,12 @@ http://%HOSTIP:%HTTPPORT/2073 -F 'name=a;filename=a.pdf' --next http://%HOSTIP:%
# Verify data after the test has been "shot"
<verify>
<strip>
-^(User-Agent:|Content-Type: multipart/form-data;|------------).*
+^(Content-Type: multipart/form-data;|------------).*
</strip>
<protocol>
POST /2073 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 189
@@ -56,6 +57,7 @@ Content-Type: application/pdf
a
POST /2073 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 184
diff --git a/tests/data/test2074 b/tests/data/test2074
index ecff8fe7..e3e18126 100644
--- a/tests/data/test2074
+++ b/tests/data/test2074
@@ -43,13 +43,11 @@ http://%HOSTIP:%HTTPPORT/2074 --oauth2-bearer mF_9.B5f-4.1JqM
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /2074 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Bearer mF_9.B5f-4.1JqM
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2076 b/tests/data/test2076
index 2c477b1a..5974286f 100644
--- a/tests/data/test2076
+++ b/tests/data/test2076
@@ -57,17 +57,16 @@ HTTP with digest auth and URI contains query
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /2076?query HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /2076?query HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="testrealm", nonce="1", uri="/2076?query", response="5758bd3bbde7f33236e6ccd278eb59af"
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2078 b/tests/data/test2078
index 51ace296..c881b049 100644
--- a/tests/data/test2078
+++ b/tests/data/test2078
@@ -38,12 +38,10 @@ http://%HOSTIP:%HTTPPORT/2078 -u : --negotiate --data name=value
<errorcode>
0
</errorcode>
-<strip>
-^User-Agent:.*
-</strip>
<protocol nonewline="yes">
POST /2078 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 10
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test208 b/tests/data/test208
index 1c86558a..abb30df9 100644
--- a/tests/data/test208
+++ b/tests/data/test208
@@ -50,13 +50,11 @@ the
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
PUT ftp://daniel:mysecret@host.com/we/want/208 HTTP/1.1
Host: host.com:21
Authorization: Basic ZGFuaWVsOm15c2VjcmV0
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 78
diff --git a/tests/data/test209 b/tests/data/test209
index 67a7fc51..afe16bfa 100644
--- a/tests/data/test209
+++ b/tests/data/test209
@@ -101,23 +101,22 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
CONNECT test.remote.example.com.209:%HTTPPORT HTTP/1.1
Host: test.remote.example.com.209:%HTTPPORT
Proxy-Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
CONNECT test.remote.example.com.209:%HTTPPORT HTTP/1.1
Host: test.remote.example.com.209:%HTTPPORT
Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
GET /path/2090002 HTTP/1.1
-User-Agent: curl/7.12.3-CVS (i686-pc-linux-gnu) libcurl/7.12.3-CVS OpenSSL/0.9.6b zlib/1.1.4
Host: test.remote.example.com.209:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2100 b/tests/data/test2100
index 83aa7287..4352f61b 100644
--- a/tests/data/test2100
+++ b/tests/data/test2100
Binary files differ
diff --git a/tests/data/test213 b/tests/data/test213
index e6d7cd55..bb579971 100644
--- a/tests/data/test213
+++ b/tests/data/test213
@@ -101,23 +101,22 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol nonewline="yes">
CONNECT test.remote.example.com.213:%HTTPPORT HTTP/1.0
Host: test.remote.example.com.213:%HTTPPORT
Proxy-Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
CONNECT test.remote.example.com.213:%HTTPPORT HTTP/1.0
Host: test.remote.example.com.213:%HTTPPORT
Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
POST /path/2130002 HTTP/1.1
-User-Agent: curl/7.12.3-CVS (i686-pc-linux-gnu) libcurl/7.12.3-CVS OpenSSL/0.9.6b zlib/1.1.4
Host: test.remote.example.com.213:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 6
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test214 b/tests/data/test214
index 930182f5..3f305ee1 100644
--- a/tests/data/test214
+++ b/tests/data/test214
@@ -40,12 +40,10 @@ MSYS2_ARG_CONV_EXCL=http://
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /{}\/214 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test217 b/tests/data/test217
index 4ab51a2f..b0673447 100644
--- a/tests/data/test217
+++ b/tests/data/test217
@@ -41,12 +41,10 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
CONNECT test.remote.example.com.217:%HTTPPORT HTTP/1.1
Host: test.remote.example.com.217:%HTTPPORT
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
</protocol>
diff --git a/tests/data/test218 b/tests/data/test218
index 138c4b7b..4951c264 100644
--- a/tests/data/test218
+++ b/tests/data/test218
@@ -39,12 +39,10 @@ just some tiny teeny contents
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
PUT /218 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Transfer-Encoding: chunked
Expect: 100-continue
diff --git a/tests/data/test22 b/tests/data/test22
index f45f8627..57dd7dda 100644
--- a/tests/data/test22
+++ b/tests/data/test22
@@ -32,13 +32,10 @@ get HTTP with URL > 10000 bytes
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
GET /aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/22 HTTP/1.1
-User-Agent: curl/7.4.2 (sparc-sun-solaris2.7) libcurl 7.4.2 (SSL 0.9.6)
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test220 b/tests/data/test220
index 7fd26434..4b2e4167 100644
--- a/tests/data/test220
+++ b/tests/data/test220
@@ -54,15 +54,13 @@ http://%HOSTIP:%HTTPPORT/220 --compressed
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<strippart>
s/^Accept-Encoding: .*/Accept-Encoding: xxx/
</strippart>
<protocol>
GET /220 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Accept-Encoding: xxx
diff --git a/tests/data/test221 b/tests/data/test221
index 3a85439d..3fab37f5 100644
--- a/tests/data/test221
+++ b/tests/data/test221
@@ -54,15 +54,13 @@ http://%HOSTIP:%HTTPPORT/221 --compressed
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<strippart>
s/^Accept-Encoding: .*/Accept-Encoding: xxx/
</strippart>
<protocol>
GET /221 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Accept-Encoding: xxx
diff --git a/tests/data/test222 b/tests/data/test222
index 865266e0..27d169fe 100644
--- a/tests/data/test222
+++ b/tests/data/test222
@@ -185,15 +185,13 @@ http://%HOSTIP:%HTTPPORT/222 --compressed
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<strippart>
s/^Accept-Encoding: .*/Accept-Encoding: xxx/
</strippart>
<protocol>
GET /222 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Accept-Encoding: xxx
diff --git a/tests/data/test223 b/tests/data/test223
index 884967e3..52bbb7c6 100644
--- a/tests/data/test223
+++ b/tests/data/test223
@@ -75,15 +75,13 @@ http://%HOSTIP:%HTTPPORT/223 --compressed
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<strippart>
s/^Accept-Encoding: .*/Accept-Encoding: xxx/
</strippart>
<protocol>
GET /223 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Accept-Encoding: xxx
diff --git a/tests/data/test224 b/tests/data/test224
index a5604687..b632ffd2 100644
--- a/tests/data/test224
+++ b/tests/data/test224
@@ -90,15 +90,13 @@ http://%HOSTIP:%HTTPPORT/224 --compressed
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<strippart>
s/^Accept-Encoding: .*/Accept-Encoding: xxx/
</strippart>
<protocol>
GET /224 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Accept-Encoding: xxx
diff --git a/tests/data/test230 b/tests/data/test230
index 2174434b..eb696da0 100644
--- a/tests/data/test230
+++ b/tests/data/test230
@@ -186,15 +186,13 @@ http://%HOSTIP:%HTTPPORT/230 --compressed
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<strippart>
s/^Accept-Encoding: .*/Accept-Encoding: xxx/
</strippart>
<protocol>
GET /230 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Accept-Encoding: xxx
diff --git a/tests/data/test232 b/tests/data/test232
index d0860c61..e0e70342 100644
--- a/tests/data/test232
+++ b/tests/data/test232
@@ -185,15 +185,13 @@ http://%HOSTIP:%HTTPPORT/232 --compressed
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<strippart>
s/^Accept-Encoding: .*/Accept-Encoding: xxx/
</strippart>
<protocol>
GET /232 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Accept-Encoding: xxx
diff --git a/tests/data/test233 b/tests/data/test233
index a38d8c95..eb732eae 100644
--- a/tests/data/test233
+++ b/tests/data/test233
@@ -75,20 +75,19 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://first.host.it.is/we/want/that/page/233 HTTP/1.1
Host: first.host.it.is
Proxy-Authorization: Basic dGVzdGluZzp0aGlz
Authorization: Basic aWFtOm15c2VsZg==
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://goto.second.host.now/2330002 HTTP/1.1
Host: goto.second.host.now
Proxy-Authorization: Basic dGVzdGluZzp0aGlz
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test234 b/tests/data/test234
index 9e197cd1..3c5146a3 100644
--- a/tests/data/test234
+++ b/tests/data/test234
@@ -77,14 +77,12 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://first.host.it.is/we/want/that/page/234 HTTP/1.1
Host: first.host.it.is
Proxy-Authorization: Basic dGVzdGluZzp0aGlz
Authorization: Basic aWFtOm15c2VsZg==
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
@@ -92,6 +90,7 @@ GET http://goto.second.host.now/2340002 HTTP/1.1
Host: goto.second.host.now
Proxy-Authorization: Basic dGVzdGluZzp0aGlz
Authorization: Basic aWFtOm15c2VsZg==
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test235 b/tests/data/test235
index 62502322..94abb951 100644
--- a/tests/data/test235
+++ b/tests/data/test235
@@ -7,6 +7,9 @@ FTP
# Server-side
<reply>
+<servercmd>
+REPLY SIZE 500 command not understood
+</servercmd>
</reply>
# Client-side
diff --git a/tests/data/test236 b/tests/data/test236
index 9ba706f1..92e34bc3 100644
--- a/tests/data/test236
+++ b/tests/data/test236
@@ -11,6 +11,7 @@ FTP
REPLY SIZE 550 access to this file is very much denied
REPLY APPE 550 I said: access to this file is very much denied
REPLY STOR 550 I said: access to this file is very much denied
+REPLY SIZE 500 command not understood
</servercmd>
</reply>
diff --git a/tests/data/test239 b/tests/data/test239
index b6f38793..b9e18723 100644
--- a/tests/data/test239
+++ b/tests/data/test239
@@ -76,14 +76,11 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol nonewline="yes">
POST http://%HOSTIP:%HTTPPORT/239 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Proxy-Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-User-Agent: curl/7.13.2-CVS (i686-pc-linux-gnu) libcurl/7.13.2-CVS OpenSSL/0.9.7e zlib/1.2.2 libidn/0.5.13
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 0
@@ -92,7 +89,7 @@ Content-Type: application/x-www-form-urlencoded
POST http://%HOSTIP:%HTTPPORT/239 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=
-User-Agent: curl/7.13.2-CVS (i686-pc-linux-gnu) libcurl/7.13.2-CVS OpenSSL/0.9.7e zlib/1.2.2 libidn/0.5.13
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 6
diff --git a/tests/data/test24 b/tests/data/test24
index a2b28a9f..54147edd 100644
--- a/tests/data/test24
+++ b/tests/data/test24
@@ -30,13 +30,10 @@ http://%HOSTIP:%HTTPPORT/24 --fail --silent --show-error
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
GET /24 HTTP/1.1
-User-Agent: curl/7.8.1-pre3 (sparc-sun-solaris2.7) libcurl 7.8.1-pre3 (OpenSSL 0.9.6a) (krb4 enabled)
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test240 b/tests/data/test240
index cd8594d6..0d452ee2 100644
--- a/tests/data/test240
+++ b/tests/data/test240
@@ -45,12 +45,10 @@ HTTP-IPv6 GET
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:
-</strip>
<protocol>
GET /240 HTTP/1.1
Host: %HOST6IP:%HTTP6PORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test241 b/tests/data/test241
index 46eae1f7..e530aaff 100644
--- a/tests/data/test241
+++ b/tests/data/test241
@@ -43,12 +43,10 @@ HTTP-IPv6 GET (using ip6-localhost)
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:
-</strip>
<protocol>
GET /241 HTTP/1.1
Host: ip6-localhost:%HTTP6PORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test242 b/tests/data/test242
index 9457c58c..aee927ea 100644
--- a/tests/data/test242
+++ b/tests/data/test242
@@ -40,13 +40,11 @@ HTTP-IPv6 GET with username+password in URL
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:
-</strip>
<protocol>
GET /242 HTTP/1.1
Host: %HOST6IP:%HTTP6PORT
Authorization: Basic Zm9vYmFyOmJhcmZvbw==
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test243 b/tests/data/test243
index f7b2386b..87826a82 100644
--- a/tests/data/test243
+++ b/tests/data/test243
@@ -97,13 +97,10 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol nonewline="yes">
POST http://%HOSTIP:%HTTPPORT/243 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-User-Agent: curl/7.13.2-CVS (i686-pc-linux-gnu) libcurl/7.13.2-CVS OpenSSL/0.9.7e zlib/1.2.2 libidn/0.5.13
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 6
@@ -112,7 +109,7 @@ Content-Type: application/x-www-form-urlencoded
postitPOST http://%HOSTIP:%HTTPPORT/243 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Proxy-Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-User-Agent: curl/7.13.2-CVS (i686-pc-linux-gnu) libcurl/7.13.2-CVS OpenSSL/0.9.7e zlib/1.2.2 libidn/0.5.13
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 0
@@ -121,7 +118,7 @@ Content-Type: application/x-www-form-urlencoded
POST http://%HOSTIP:%HTTPPORT/243 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=
-User-Agent: curl/7.13.2-CVS (i686-pc-linux-gnu) libcurl/7.13.2-CVS OpenSSL/0.9.7e zlib/1.2.2 libidn/0.5.13
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 6
diff --git a/tests/data/test245 b/tests/data/test245
index cbb5ee31..5750b4fa 100644
--- a/tests/data/test245
+++ b/tests/data/test245
@@ -63,13 +63,10 @@ http://%HOSTIP:%HTTPPORT/245 -u auser:apasswd --digest -d "junkelijunk"
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol nonewline="yes">
POST /245 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-User-Agent: curl/7.12.1-CVS (i686-pc-linux-gnu) libcurl/7.12.1-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS libidn/0.4.6
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 0
Content-Type: application/x-www-form-urlencoded
@@ -77,7 +74,7 @@ Content-Type: application/x-www-form-urlencoded
POST /245 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="auser", realm="testrealm", nonce="1053604144", uri="/245", response="379a439b1737ba257c1d2f103914b18b"
-User-Agent: curl/7.13.2-CVS (i686-pc-linux-gnu) libcurl/7.13.2-CVS OpenSSL/0.9.7e zlib/1.2.2 libidn/0.5.13
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 11
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test246 b/tests/data/test246
index acf47da5..b5469f3e 100644
--- a/tests/data/test246
+++ b/tests/data/test246
@@ -73,13 +73,10 @@ http://%HOSTIP:%HTTPPORT/246 -u auser:apasswd --digest -d "junkelijunk"
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol nonewline="yes">
POST /246 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-User-Agent: curl/7.12.1-CVS (i686-pc-linux-gnu) libcurl/7.12.1-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS libidn/0.4.6
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 0
Content-Type: application/x-www-form-urlencoded
@@ -87,7 +84,7 @@ Content-Type: application/x-www-form-urlencoded
POST /246 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="auser", realm="testrealm", nonce="1053604144", uri="/246", response="761e6fc9a760c39d587092e8d840e740"
-User-Agent: curl/7.13.2-CVS (i686-pc-linux-gnu) libcurl/7.13.2-CVS OpenSSL/0.9.7e zlib/1.2.2 libidn/0.5.13
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 11
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test249 b/tests/data/test249
index 4f99c2af..6b3dc6ef 100644
--- a/tests/data/test249
+++ b/tests/data/test249
@@ -39,12 +39,10 @@ http://%HOSTIP:%HTTPPORT/249 -z "dec 12 12:00:00 1999 GMT"
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /249 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
If-Modified-Since: Sun, 12 Dec 1999 12:00:00 GMT
diff --git a/tests/data/test25 b/tests/data/test25
index 15030ae9..d694cdc7 100644
--- a/tests/data/test25
+++ b/tests/data/test25
@@ -73,38 +73,35 @@ http://%HOSTIP:%HTTPPORT/want/25 -L --max-redirs 5
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
GET /want/25 HTTP/1.1
-User-Agent: curl/7.8.1-pre3 (sparc-sun-solaris2.7) libcurl 7.8.1-pre3 (OpenSSL 0.9.6a) (krb4 enabled)
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /want/data/reply/25 HTTP/1.1
-User-Agent: curl/7.8.1-pre3 (sparc-sun-solaris2.7) libcurl 7.8.1-pre3 (OpenSSL 0.9.6a) (krb4 enabled)
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /want/data/reply/data/reply/25 HTTP/1.1
-User-Agent: curl/7.8.1-pre3 (sparc-sun-solaris2.7) libcurl 7.8.1-pre3 (OpenSSL 0.9.6a) (krb4 enabled)
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /want/data/reply/data/reply/data/reply/25 HTTP/1.1
-User-Agent: curl/7.8.1-pre3 (sparc-sun-solaris2.7) libcurl 7.8.1-pre3 (OpenSSL 0.9.6a) (krb4 enabled)
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /want/data/reply/data/reply/data/reply/data/reply/25 HTTP/1.1
-User-Agent: curl/7.8.1-pre3 (sparc-sun-solaris2.7) libcurl 7.8.1-pre3 (OpenSSL 0.9.6a) (krb4 enabled)
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /want/data/reply/data/reply/data/reply/data/reply/data/reply/25 HTTP/1.1
-User-Agent: curl/7.8.1-pre3 (sparc-sun-solaris2.7) libcurl 7.8.1-pre3 (OpenSSL 0.9.6a) (krb4 enabled)
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test256 b/tests/data/test256
index 1567c629..e873d579 100644
--- a/tests/data/test256
+++ b/tests/data/test256
@@ -45,14 +45,12 @@ proxy
<errorcode>
33
</errorcode>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://%HOSTIP:%HTTPPORT/want/256 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Proxy-Authorization: Basic ZGFuaWVsOnN0ZW5iZXJn
Range: bytes=78-
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test257 b/tests/data/test257
index 59a419bb..e43baf56 100644
--- a/tests/data/test257
+++ b/tests/data/test257
@@ -85,27 +85,24 @@ machine anotherone.com login user2 password passwd2
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://supersite.com/want/257 HTTP/1.1
Host: supersite.com
Authorization: Basic dXNlcjE6cGFzc3dkMQ==
-User-Agent: curl/7.14.0-CVS (i686-pc-linux-gnu) libcurl/7.14.0-CVS OpenSSL/0.9.7e zlib/1.2.2 libidn/0.5.13
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://anotherone.com/2570002 HTTP/1.1
Host: anotherone.com
Authorization: Basic dXNlcjI6cGFzc3dkMg==
-User-Agent: curl/7.14.0-CVS (i686-pc-linux-gnu) libcurl/7.14.0-CVS OpenSSL/0.9.7e zlib/1.2.2 libidn/0.5.13
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://athird.com/2570003 HTTP/1.1
Host: athird.com
-User-Agent: curl/7.14.0-CVS (i686-pc-linux-gnu) libcurl/7.14.0-CVS OpenSSL/0.9.7e zlib/1.2.2 libidn/0.5.13
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test258 b/tests/data/test258
index 6c10564b..c89d5f37 100644
--- a/tests/data/test258
+++ b/tests/data/test258
@@ -77,12 +77,12 @@ bar
# Verify data after the test has been "shot"
<verify>
<strip>
-^(User-Agent:|Content-Type: multipart/form-data;|------).*
+^(Content-Type: multipart/form-data;|------).*
</strip>
<protocol>
POST http://remotehost:54321/we/want/258 HTTP/1.1
Host: remotehost:54321
-User-Agent: curl/7.10.4 (i686-pc-linux-gnu) libcurl/7.10.4 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 409
@@ -107,8 +107,8 @@ bar
------------------------------7c633d5c27ce--
POST http://remotehost:54321/we/want/258 HTTP/1.1
Host: remotehost:54321
-User-Agent: curl/7.10.4 (i686-pc-linux-gnu) libcurl/7.10.4 OpenSSL/0.9.7a ipv6 zlib/1.1.3
Proxy-Authorization: Digest username="uuuser", realm="many secrets", nonce="911", uri="/we/want/258", response="2501654ca391f0b5c8c12a1da77e34cd"
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 409
diff --git a/tests/data/test259 b/tests/data/test259
index 58d25120..d1da0243 100644
--- a/tests/data/test259
+++ b/tests/data/test259
@@ -73,12 +73,12 @@ bar
# Verify data after the test has been "shot"
<verify>
<strip>
-^(User-Agent:|Content-Type: multipart/form-data;|------).*
+^(Content-Type: multipart/form-data;|------).*
</strip>
<protocol>
POST http://remotehost:54321/we/want/259 HTTP/1.1
Host: remotehost:54321
-User-Agent: curl/7.10.4 (i686-pc-linux-gnu) libcurl/7.10.4 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Expect: 100-continue
@@ -104,8 +104,8 @@ bar
------------------------------7c633d5c27ce--
POST http://remotehost:54321/we/want/259 HTTP/1.1
Host: remotehost:54321
-User-Agent: curl/7.10.4 (i686-pc-linux-gnu) libcurl/7.10.4 OpenSSL/0.9.7a ipv6 zlib/1.1.3
Proxy-Authorization: Digest username="uuuser", realm="many secrets", nonce="911", uri="/we/want/259", response="b479994d13e60f3aa192a67c5892ddc5"
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Expect: 100-continue
diff --git a/tests/data/test26 b/tests/data/test26
index 072dbf7d..073fed3d 100644
--- a/tests/data/test26
+++ b/tests/data/test26
@@ -31,13 +31,10 @@ http://%HOSTIP:%HTTPPORT/want/26 -o - -o -
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl.*
-</strip>
<protocol>
GET /want/26 HTTP/1.1
-User-Agent: curl/7.8.1-pre3 (sparc-sun-solaris2.7) libcurl 7.8.1-pre3 (OpenSSL 0.9.6a) (krb4 enabled)
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test260 b/tests/data/test260
index 589e86e8..1e6dbe2e 100644
--- a/tests/data/test260
+++ b/tests/data/test260
@@ -42,12 +42,10 @@ HTTP GET URL without slash but with questionmark
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /?260 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test262 b/tests/data/test262
index 4c28f22d..8f803cfb 100644
--- a/tests/data/test262
+++ b/tests/data/test262
Binary files differ
diff --git a/tests/data/test263 b/tests/data/test263
index e10c2074..6c054a11 100644
--- a/tests/data/test263
+++ b/tests/data/test263
@@ -41,12 +41,10 @@ HTTP-IPv6 GET with proxy specified using IPv6-numerical address
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:
-</strip>
<protocol>
GET http://veryveryremotesite.com/263 HTTP/1.1
Host: veryveryremotesite.com
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test264 b/tests/data/test264
index 5aca0e6c..836c979a 100644
--- a/tests/data/test264
+++ b/tests/data/test264
@@ -37,13 +37,11 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://we.want.that.site.com/264 HTTP/1.1
Host: we.want.that.site.com
Proxy-Authorization: Basic ZmFrZTp1c2Vy
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test265 b/tests/data/test265
index a27633af..c6204730 100644
--- a/tests/data/test265
+++ b/tests/data/test265
@@ -102,23 +102,22 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol nonewline="yes">
CONNECT test.remote.example.com.265:%HTTPPORT HTTP/1.1
Host: test.remote.example.com.265:%HTTPPORT
Proxy-Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
CONNECT test.remote.example.com.265:%HTTPPORT HTTP/1.1
Host: test.remote.example.com.265:%HTTPPORT
Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
POST /path/2650002 HTTP/1.1
-User-Agent: curl/7.12.3-CVS (i686-pc-linux-gnu) libcurl/7.12.3-CVS OpenSSL/0.9.6b zlib/1.1.4
Host: test.remote.example.com.265:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 6
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test266 b/tests/data/test266
index 6b07a782..0997ae7b 100644
--- a/tests/data/test266
+++ b/tests/data/test266
@@ -56,12 +56,10 @@ http://%HOSTIP:%HTTPPORT/266 -D log/heads266
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /266 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test267 b/tests/data/test267
index a0c3d33c..ed10b22a 100644
--- a/tests/data/test267
+++ b/tests/data/test267
@@ -82,14 +82,11 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol nonewline="yes">
POST /267 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
Header1: yes
Header2: no
@@ -99,7 +96,7 @@ Content-Type: application/x-www-form-urlencoded
POST /267 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
Header1: yes
Header2: no
diff --git a/tests/data/test268 b/tests/data/test268
index c9c7311a..70a5a73d 100644
--- a/tests/data/test268
+++ b/tests/data/test268
@@ -42,12 +42,10 @@ HTTP POST a non-existing file
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
POST /268 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 0
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test269 b/tests/data/test269
index 6b7159b0..ffecfedb 100644
--- a/tests/data/test269
+++ b/tests/data/test269
@@ -40,12 +40,10 @@ http://%HOSTIP:%HTTPPORT/269 --ignore-content-length
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /269 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test27 b/tests/data/test27
index 6fed3d99..54b4f8a6 100644
--- a/tests/data/test27
+++ b/tests/data/test27
@@ -33,21 +33,21 @@ Get same cookie page several times
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl.*
-</strip>
<protocol>
GET /want/27 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /want/27 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Cookie: thewinneris=nowayyouwin
GET /want/27 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Cookie: thewinneris=nowayyouwin
diff --git a/tests/data/test273 b/tests/data/test273
index ce0be331..45c29351 100644
--- a/tests/data/test273
+++ b/tests/data/test273
@@ -65,18 +65,16 @@ http://%HOSTIP:%HTTPPORT/273 -u testuser:testpass --digest
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /273 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /273 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="testrealm", nonce="1053604145", uri="/273", response="576ae57b1db0039f8c0de43ef58e49e3"
-User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test274 b/tests/data/test274
index 579341c8..dd1b816d 100644
--- a/tests/data/test274
+++ b/tests/data/test274
@@ -34,13 +34,10 @@ http://%HOSTIP:%HTTPPORT/want/274 -L --max-redirs 0
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
GET /want/274 HTTP/1.1
-User-Agent: curl/7.8.1-pre3 (sparc-sun-solaris2.7) libcurl 7.8.1-pre3 (OpenSSL 0.9.6a) (krb4 enabled)
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test275 b/tests/data/test275
index 6065b4d8..cff99d58 100644
--- a/tests/data/test275
+++ b/tests/data/test275
@@ -64,14 +64,11 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<proxy>
CONNECT remotesite.com.275:%HTTPPORT HTTP/1.1
Host: remotesite.com.275:%HTTPPORT
Proxy-Authorization: Basic eW91YXJlOnlvdXJzZWxm
-User-Agent: curl/7.10.7-pre2 (i686-pc-linux-gnu) libcurl/7.10.7-pre2 OpenSSL/0.9.7a zlib/1.1.3
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
</proxy>
@@ -79,11 +76,13 @@ Proxy-Connection: Keep-Alive
GET /we/want/that/page/275 HTTP/1.1
Host: remotesite.com.275:%HTTPPORT
Authorization: Basic aWFtOm15c2VsZg==
+User-Agent: curl/%VERSION
Accept: */*
GET /we/want/that/page/275 HTTP/1.1
Host: remotesite.com.275:%HTTPPORT
Authorization: Basic aWFtOm15c2VsZg==
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test276 b/tests/data/test276
index 34e2235e..2fa554d9 100644
--- a/tests/data/test276
+++ b/tests/data/test276
@@ -59,16 +59,15 @@ HTTP Location: following with multiple question marks in URLs
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want?uri=http://anything/276?secondq/276 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /data/2760002.txt?coolsite=http://anotherurl/?a_second/2760002 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test277 b/tests/data/test277
index d3e9d0fa..7b60d40e 100644
--- a/tests/data/test277
+++ b/tests/data/test277
@@ -33,17 +33,14 @@ http://%HOSTIP:%HTTPPORT/want/277 -F name=daniel -H "Content-Type: text/info"
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<strippart>
s/^--------------------------[a-z0-9]*/--------------------------/
s/boundary=------------------------[a-z0-9]*/boundary=------------------------/
</strippart>
<protocol>
POST /want/277 HTTP/1.1
-User-Agent: curl/7.10.4 (i686-pc-linux-gnu) libcurl/7.10.4 OpenSSL/0.9.7a ipv6 zlib/1.1.3
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 146
Content-Type: text/info; boundary=------------------------
diff --git a/tests/data/test278 b/tests/data/test278
index 620f56b1..d706c33c 100644
--- a/tests/data/test278
+++ b/tests/data/test278
@@ -37,13 +37,11 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://we.want.that.site.com/278 HTTP/1.1
Host: we.want.that.site.com
Proxy-Authorization: Basic ZmFrZTo=
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test279 b/tests/data/test279
index d5f4194f..d26ddd9d 100644
--- a/tests/data/test279
+++ b/tests/data/test279
@@ -38,13 +38,11 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://we.want.that.site.com/279 HTTP/1.1
Host: we.want.that.site.com
Proxy-Authorization: Basic ZmFrZTo=
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test28 b/tests/data/test28
index 1f80d5f4..703c6d35 100644
--- a/tests/data/test28
+++ b/tests/data/test28
@@ -58,16 +58,15 @@ http://%HOSTIP:%HTTPPORT/want/28 -L
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/28 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /online/1,1795,Welcome,00.html/280002.txt?logout=TRUE HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test281 b/tests/data/test281
index d399fc05..f78b0c14 100644
--- a/tests/data/test281
+++ b/tests/data/test281
@@ -46,12 +46,10 @@ Weird
<errorcode>
22
</errorcode>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
PUT /we/want/281 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 38
Expect: 100-continue
diff --git a/tests/data/test282 b/tests/data/test282
index aa8aba5a..578c102a 100644
--- a/tests/data/test282
+++ b/tests/data/test282
@@ -32,12 +32,10 @@ http://%HOSTIP:%HTTPPORT/282
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /282 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test29 b/tests/data/test29
index 9a7bd9ef..b8a59c34 100644
--- a/tests/data/test29
+++ b/tests/data/test29
@@ -36,12 +36,10 @@ http://%HOSTIP:%HTTPPORT/want/29 -m 2
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/29 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test292 b/tests/data/test292
index 800e8d17..12d131db 100644
--- a/tests/data/test292
+++ b/tests/data/test292
@@ -43,12 +43,10 @@ http://%HOSTIP:%HTTPPORT/292 --max-filesize 1000
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /292 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test293 b/tests/data/test293
index d75fc9a3..2181a821 100644
--- a/tests/data/test293
+++ b/tests/data/test293
@@ -47,12 +47,10 @@ http://%HOSTIP:%HTTPPORT/293 --max-filesize 2
<errorcode>
63
</errorcode>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /293 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test299 b/tests/data/test299
index cfa74302..b3fa4736 100644
--- a/tests/data/test299
+++ b/tests/data/test299
@@ -39,13 +39,11 @@ FTP over HTTP proxy with user:pass not in url
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET ftp://michal:aybabtu@host.com/we/want/299 HTTP/1.1
Host: host.com:21
Authorization: Basic bWljaGFsOmF5YmFidHU=
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test3 b/tests/data/test3
index 0fe27646..0dc3b461 100644
--- a/tests/data/test3
+++ b/tests/data/test3
@@ -43,13 +43,11 @@ HTTP POST with auth and contents but with content-length set to 0
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol nonewline="yes">
POST /3 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Basic ZmFrZTotdXNlcg==
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 37
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test30 b/tests/data/test30
index 70b8005f..ab4425db 100644
--- a/tests/data/test30
+++ b/tests/data/test30
@@ -27,12 +27,10 @@ http://%HOSTIP:%HTTPPORT/want/30
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/30 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test300 b/tests/data/test300
index 7b4222d1..63e308d6 100644
--- a/tests/data/test300
+++ b/tests/data/test300
@@ -39,12 +39,10 @@ simple HTTPS GET
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /300 HTTP/1.1
Host: %HOSTIP:%HTTPSPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test3000 b/tests/data/test3000
index e62e5316..1fc58f2f 100644
--- a/tests/data/test3000
+++ b/tests/data/test3000
@@ -44,12 +44,10 @@ perl -e "print 'Test requires default test server host' if ( '%HOSTIP' ne '127.0
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /3000 HTTP/1.1
Host: localhost:%HTTPSPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test3001 b/tests/data/test3001
index 706c3f75..a16bdb45 100644
--- a/tests/data/test3001
+++ b/tests/data/test3001
@@ -44,12 +44,10 @@ perl -e "print 'Test requires default test server host' if ( '%HOSTIP' ne '127.0
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /3001 HTTP/1.1
Host: localhost:%HTTPSPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test3008 b/tests/data/test3008
new file mode 100644
index 00000000..0010eeb8
--- /dev/null
+++ b/tests/data/test3008
@@ -0,0 +1,57 @@
+<testcase>
+<info>
+<keywords>
+-O
+</keywords>
+</info>
+#
+# Server-side
+<reply>
+<data nocheck="yes">
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
+ETag: "21025-dc7-39462498"
+Accept-Ranges: bytes
+Content-Length: 6
+Connection: close
+Content-Type: text/html
+Funny-head: yesyes
+
+-foo-
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+</server>
+<features>
+http
+</features>
+<name>
+--output-dir
+</name>
+<command option="no-output,no-include">
+http://%HOSTIP:%HTTPPORT/this/is/the/3008 -O --output-dir %PWD/log
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+GET /this/is/the/3008 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+
+</protocol>
+<file name="log/3008">
+-foo-
+</file>
+</verify>
+</testcase>
diff --git a/tests/data/test3009 b/tests/data/test3009
new file mode 100644
index 00000000..f9bf11b0
--- /dev/null
+++ b/tests/data/test3009
@@ -0,0 +1,57 @@
+<testcase>
+<info>
+<keywords>
+-O
+</keywords>
+</info>
+#
+# Server-side
+<reply>
+<data nocheck="yes">
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
+ETag: "21025-dc7-39462498"
+Accept-Ranges: bytes
+Content-Length: 6
+Connection: close
+Content-Type: text/html
+Funny-head: yesyes
+
+-foo-
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+</server>
+<features>
+http
+</features>
+<name>
+--output-dir a non-existing directory
+</name>
+<command option="no-output,no-include">
+http://%HOSTIP:%HTTPPORT/this/is/the/3009 -O --output-dir %PWD/not-there
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+GET /this/is/the/3009 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+
+</protocol>
+<errorcode>
+23
+</errorcode>
+</verify>
+</testcase>
diff --git a/tests/data/test301 b/tests/data/test301
index c4046957..760497a1 100644
--- a/tests/data/test301
+++ b/tests/data/test301
@@ -40,13 +40,11 @@ HTTPS GET with user and password
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /301 HTTP/1.1
Host: %HOSTIP:%HTTPSPORT
Authorization: Basic ZmFrZTp1c2Vy
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test3011 b/tests/data/test3011
new file mode 100644
index 00000000..267d6eee
--- /dev/null
+++ b/tests/data/test3011
@@ -0,0 +1,57 @@
+<testcase>
+<info>
+<keywords>
+-O
+</keywords>
+</info>
+#
+# Server-side
+<reply>
+<data nocheck="yes">
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
+ETag: "21025-dc7-39462498"
+Accept-Ranges: bytes
+Content-Length: 6
+Connection: close
+Content-Type: text/html
+Funny-head: yesyes
+
+-foo-
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+</server>
+<features>
+http
+</features>
+<name>
+--output-dir with --create-dirs
+</name>
+<command option="no-output,no-include">
+http://%HOSTIP:%HTTPPORT/this/is/the/3011 -O --output-dir %PWD/log/tmp --create-dirs
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+GET /this/is/the/3011 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+
+</protocol>
+<file name="log/tmp/3011">
+-foo-
+</file>
+</verify>
+</testcase>
diff --git a/tests/data/test3012 b/tests/data/test3012
new file mode 100644
index 00000000..b4441cb1
--- /dev/null
+++ b/tests/data/test3012
@@ -0,0 +1,60 @@
+<testcase>
+<info>
+<keywords>
+-O
+-J
+--output-dir
+</keywords>
+</info>
+#
+# Server-side
+<reply>
+<data nocheck="yes">
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
+ETag: "21025-dc7-39462498"
+Accept-Ranges: bytes
+Content-Length: 6
+Connection: close
+Content-Disposition: inline; filename="MMM3012MMM"
+Content-Type: text/html
+Funny-head: yesyes
+
+-foo-
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+</server>
+<features>
+http
+</features>
+<name>
+--output-dir with -J
+</name>
+<command option="no-output,no-include">
+http://%HOSTIP:%HTTPPORT/this/is/the/3012 -OJ --output-dir %PWD/log
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+GET /this/is/the/3012 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+
+</protocol>
+<file name="log/MMM3012MMM">
+-foo-
+</file>
+</verify>
+</testcase>
diff --git a/tests/data/test3013 b/tests/data/test3013
new file mode 100644
index 00000000..206b9e37
--- /dev/null
+++ b/tests/data/test3013
@@ -0,0 +1,68 @@
+<testcase>
+<info>
+<keywords>
+-O
+-J
+--output-dir
+</keywords>
+</info>
+#
+# Server-side
+<reply>
+<data nocheck="yes">
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
+ETag: "21025-dc7-39462498"
+Accept-Ranges: bytes
+Content-Length: 6
+Connection: close
+Content-Disposition: inline; filename="MMM3013MMM"
+Content-Type: text/html
+Funny-head: yesyes
+
+-foo-
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+</server>
+<features>
+http
+</features>
+<name>
+Two --output-dir with --next in between
+</name>
+<command option="no-output,no-include">
+http://%HOSTIP:%HTTPPORT/this/is/the/3013 -O --output-dir %PWD/log http://%HOSTIP:%HTTPPORT/another/3013 -o second3013 --output-dir %PWD/log
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+GET /this/is/the/3013 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+
+GET /another/3013 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+
+</protocol>
+<file name="log/3013">
+-foo-
+</file>
+<file2 name="log/second3013">
+-foo-
+</file2>
+</verify>
+</testcase>
diff --git a/tests/data/test3014 b/tests/data/test3014
new file mode 100644
index 00000000..e36a0e02
--- /dev/null
+++ b/tests/data/test3014
@@ -0,0 +1,56 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+--write-out
+</keywords>
+</info>
+# Server-side
+<reply>
+<data nocheck="yes">
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Content-Length: 9
+Connection: close
+Content-Type: text/plain
+
+testdata
+</data>
+
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+
+<name>
+Check if %{num_headers} returns correct number of headers
+</name>
+<command>
+http://%HOSTIP:%HTTPPORT/1439 --write-out '%{num_headers}'
+</command>
+</client>
+
+# Verify data
+<verify>
+<stdout nonewline="yes">
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Content-Length: 9
+Connection: close
+Content-Type: text/plain
+
+testdata
+4
+</stdout>
+<protocol>
+GET /1439 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test3015 b/tests/data/test3015
new file mode 100644
index 00000000..9c86d024
--- /dev/null
+++ b/tests/data/test3015
@@ -0,0 +1,78 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+followlocation
+chunked Transfer-Encoding
+--write-out
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data nocheck="yes">
+HTTP/1.1 302 OK
+Date: Sun, 13 Sep 2020 15:00 GMT
+Content-Length: 8
+Connection: close
+Content-Type: text/plain
+Location: ./30150001
+
+monster
+</data>
+<data1 nocheck="yes">
+HTTP/1.1 200 OK
+Date: Sun, 13 Sep 2020 15:00 GMT
+Transfer-Encoding: chunked
+Connection: close
+Content-Type: text/plain; charset=us-ascii
+
+0007
+bigger
+0008
+monster
+
+0
+
+</data1>
+
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+</server>
+ <name>
+HTTP GET -w num_headers with redirected fetch (2 connects)
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/3015 -w "%{num_headers}\n" -L -o/dev/null
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+GET /3015 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+
+GET /30150001 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+
+</protocol>
+
+<stdout mode="text">
+4
+</stdout>
+
+</verify>
+</testcase>
diff --git a/tests/data/test302 b/tests/data/test302
index 3eb9e7ae..bdef98ee 100644
--- a/tests/data/test302
+++ b/tests/data/test302
@@ -43,9 +43,6 @@ HTTPS GET over HTTP proxy fails
<errorcode>
56
</errorcode>
-<strip>
-^User-Agent:.*
-</strip>
<data>
</data>
</verify>
diff --git a/tests/data/test303 b/tests/data/test303
index 01dd9ebb..e05da5b2 100644
--- a/tests/data/test303
+++ b/tests/data/test303
@@ -39,12 +39,10 @@ HTTPS with 8 secs timeout
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/303 HTTP/1.1
Host: %HOSTIP:%HTTPSPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test304 b/tests/data/test304
index 01d3a2d6..50baf1ca 100644
--- a/tests/data/test304
+++ b/tests/data/test304
@@ -41,12 +41,12 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
# Verify data after the test has been "shot"
<verify>
<strip>
-^(User-Agent:|Content-Type: multipart/form-data;|------).*
+^(Content-Type: multipart/form-data;|------).*
</strip>
<protocol>
POST /we/want/304 HTTP/1.1
-User-Agent: curl/7.10.4 (i686-pc-linux-gnu) libcurl/7.10.4 OpenSSL/0.9.7a ipv6 zlib/1.1.3
Host: %HOSTIP:%HTTPSPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 1386
Content-Type: multipart/form-data; boundary=----------------------------c3b2ef7f0bb8
diff --git a/tests/data/test305 b/tests/data/test305
index 858a0040..f60226cb 100644
--- a/tests/data/test305
+++ b/tests/data/test305
@@ -25,9 +25,6 @@ https://%HOSTIP:%HTTPSPORT/want/305 --cacert moooo
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<errorcode>
77
</errorcode>
diff --git a/tests/data/test306 b/tests/data/test306
index 17306f94..b9150af8 100644
--- a/tests/data/test306
+++ b/tests/data/test306
@@ -52,12 +52,10 @@ HTTPS GET, receive no headers only data!
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /306 HTTP/1.1
Host: %HOSTIP:%HTTPSPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test307 b/tests/data/test307
index 03c2b3c2..5fb9faa4 100644
--- a/tests/data/test307
+++ b/tests/data/test307
@@ -43,12 +43,10 @@ simple HTTPS GET with openssl engine
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /307 HTTP/1.1
Host: %HOSTIP:%HTTPSPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test309 b/tests/data/test309
index 80246a9c..c766fca6 100644
--- a/tests/data/test309
+++ b/tests/data/test309
@@ -65,16 +65,15 @@ HTTP Location: redirect to HTTPS URL
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/309 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /data/3090002.txt?coolsite=yes HTTP/1.1
Host: %HOSTIP:%HTTPSPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test31 b/tests/data/test31
index 633b480a..0bf56335 100644
--- a/tests/data/test31
+++ b/tests/data/test31
@@ -86,12 +86,10 @@ perl -e "print 'Test requires default test server host' if ( '%HOSTIP' ne '127.0
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/want/31 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test310 b/tests/data/test310
index e7a9379a..128c9176 100644
--- a/tests/data/test310
+++ b/tests/data/test310
@@ -44,12 +44,10 @@ perl -e "print 'Test requires default test server host' if ( '%HOSTIP' ne '127.0
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /310 HTTP/1.1
Host: localhost:%HTTPSPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test314 b/tests/data/test314
index f4703cde..899200dc 100644
--- a/tests/data/test314
+++ b/tests/data/test314
@@ -181,15 +181,13 @@ http://%HOSTIP:%HTTPPORT/314 --compressed
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<strippart>
s/^Accept-Encoding: .*/Accept-Encoding: xxx/
</strippart>
<protocol>
GET /314 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Accept-Encoding: xxx
diff --git a/tests/data/test315 b/tests/data/test315
index c75d9ae7..605bb0f2 100644
--- a/tests/data/test315
+++ b/tests/data/test315
@@ -71,15 +71,13 @@ http://%HOSTIP:%HTTPPORT/315 --compressed
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<strippart>
s/^Accept-Encoding: .*/Accept-Encoding: xxx/
</strippart>
<protocol>
GET /315 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Accept-Encoding: xxx
diff --git a/tests/data/test316 b/tests/data/test316
index a293b46c..6b95b37f 100644
--- a/tests/data/test316
+++ b/tests/data/test316
@@ -181,15 +181,13 @@ http://%HOSTIP:%HTTPPORT/316 --compressed
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<strippart>
s/^Accept-Encoding: .*/Accept-Encoding: xxx/
</strippart>
<protocol>
GET /316 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Accept-Encoding: xxx
diff --git a/tests/data/test317 b/tests/data/test317
index 68a9b5c7..b7723c72 100644
--- a/tests/data/test317
+++ b/tests/data/test317
@@ -75,13 +75,11 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://first.host.it.is/we/want/that/page/317 HTTP/1.1
Host: first.host.it.is
Proxy-Authorization: Basic dGVzdGluZzp0aGlz
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Authorization: s3cr3t
@@ -89,6 +87,7 @@ Authorization: s3cr3t
GET http://goto.second.host.now/3170002 HTTP/1.1
Host: goto.second.host.now
Proxy-Authorization: Basic dGVzdGluZzp0aGlz
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test318 b/tests/data/test318
index fd82c7ae..6e3621e7 100644
--- a/tests/data/test318
+++ b/tests/data/test318
@@ -75,13 +75,11 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://first.host.it.is/we/want/that/page/318 HTTP/1.1
Host: first.host.it.is
Proxy-Authorization: Basic dGVzdGluZzp0aGlz
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Authorization: s3cr3t
@@ -89,6 +87,7 @@ Authorization: s3cr3t
GET http://goto.second.host.now/3180002 HTTP/1.1
Host: goto.second.host.now
Proxy-Authorization: Basic dGVzdGluZzp0aGlz
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Authorization: s3cr3t
diff --git a/tests/data/test319 b/tests/data/test319
index 6a61a143..855ea3e5 100644
--- a/tests/data/test319
+++ b/tests/data/test319
@@ -44,12 +44,10 @@ http://%HOSTIP:%HTTPPORT/319 --raw
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /319 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test32 b/tests/data/test32
index 992ffcbc..e2c5edfb 100644
--- a/tests/data/test32
+++ b/tests/data/test32
@@ -42,13 +42,10 @@ HTTP with -d and -G
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /32?foo=moo&moo=poo HTTP/1.1
-User-Agent: curl/7.9.5 (i686-pc-linux-gnu) libcurl 7.9.5-cvs (OpenSSL 0.9.5) (ipv6 enabled)
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test325 b/tests/data/test325
index 922f37ba..93d7e21a 100644
--- a/tests/data/test325
+++ b/tests/data/test325
@@ -49,12 +49,10 @@ HTTPS with attempted redirect to denied HTTP
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /325 HTTP/1.1
Host: %HOSTIP:%HTTPSPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test326 b/tests/data/test326
index 1a4aae5f..09ca9c0a 100644
--- a/tests/data/test326
+++ b/tests/data/test326
@@ -53,12 +53,10 @@ http://%HOSTIP:%HTTPPORT/326 --raw
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /326 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test327 b/tests/data/test327
index 3a1c0716..808a4e9d 100644
--- a/tests/data/test327
+++ b/tests/data/test327
@@ -49,16 +49,15 @@ http://%HOSTIP:%HTTPPORT/we/want/327 -b none -c log/cookies327 http://%HOSTIP:%H
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/want/327 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /we/want/3270002 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Cookie: foobar=name
diff --git a/tests/data/test328 b/tests/data/test328
index 93c00e18..bc353a57 100644
--- a/tests/data/test328
+++ b/tests/data/test328
@@ -42,12 +42,12 @@ http://%HOSTIP:%HTTPPORT/hello/328 --compressed
# Verify data after the test has been "shot"
<verify>
<strip>
-^User-Agent:.*
^Accept-Encoding:.*
</strip>
<protocol>
GET /hello/328 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test329 b/tests/data/test329
index 2274d475..e766c83e 100644
--- a/tests/data/test329
+++ b/tests/data/test329
@@ -52,17 +52,16 @@ http://%HOSTIP:%HTTPPORT/we/want/329 -b log/jar329.txt -H "Host: host.foo.com" h
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/want/329 HTTP/1.1
Host: host.foo.com
+User-Agent: curl/%VERSION
Accept: */*
Cookie: test=no
GET /we/want/3290002 HTTP/1.1
Host: host.foo.com
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test33 b/tests/data/test33
index 9f7c31fb..6b3c9d72 100644
--- a/tests/data/test33
+++ b/tests/data/test33
@@ -42,14 +42,11 @@ http://%HOSTIP:%HTTPPORT/33 -Tlog/test33.txt -C 50
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
PUT /33 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Content-Range: bytes 50-99/100
-User-Agent: curl/7.6 (sparc-sun-solaris2.7) libcurl 7.6-pre4 (SSL 0.9.6) (krb4 enabled)
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 50
Expect: 100-continue
diff --git a/tests/data/test330 b/tests/data/test330
index 6cda172f..40cc0974 100644
--- a/tests/data/test330
+++ b/tests/data/test330
@@ -73,18 +73,17 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://first.host.it.is/we/want/that/page/317 HTTP/1.1
Host: first.host.it.is
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Cookie: test=yes
GET http://goto.second.host.now/3170002 HTTP/1.1
Host: goto.second.host.now
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test331 b/tests/data/test331
index 2ffac81f..f6b00854 100644
--- a/tests/data/test331
+++ b/tests/data/test331
@@ -48,17 +48,16 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://moo/we/want/331 HTTP/1.1
Host: moo
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://moo/we/want/3310002 HTTP/1.1
Host: moo
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Cookie: moo=yes
diff --git a/tests/data/test334 b/tests/data/test334
index c02a65b8..f43af238 100644
--- a/tests/data/test334
+++ b/tests/data/test334
@@ -31,12 +31,10 @@ http://%HOSTIP:%HTTPPORT/want/334
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/334 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test335 b/tests/data/test335
index 91d98182..e3e1950f 100644
--- a/tests/data/test335
+++ b/tests/data/test335
@@ -73,20 +73,17 @@ http://digest:alot@data.from.server.requiring.digest.hohoho.com/335 --proxy http
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
GET http://data.from.server.requiring.digest.hohoho.com/335 HTTP/1.1
Host: data.from.server.requiring.digest.hohoho.com
-User-Agent: curl/7.12.0-CVS (i686-pc-linux-gnu) libcurl/7.12.0-CVS OpenSSL/0.9.6b zlib/1.1.4 c-ares/1.2.0 libidn/0.4.3
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://data.from.server.requiring.digest.hohoho.com/335 HTTP/1.1
Host: data.from.server.requiring.digest.hohoho.com
Proxy-Authorization: Digest username="foo", realm="weirdorealm", nonce="12345", uri="/335", response="f61609cd8f5bb205ef4e169b2c5626cb"
-User-Agent: curl/7.12.0-CVS (i686-pc-linux-gnu) libcurl/7.12.0-CVS OpenSSL/0.9.6b zlib/1.1.4 c-ares/1.2.0 libidn/0.4.3
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
@@ -94,7 +91,7 @@ GET http://data.from.server.requiring.digest.hohoho.com/335 HTTP/1.1
Host: data.from.server.requiring.digest.hohoho.com
Proxy-Authorization: Digest username="foo", realm="weirdorealm", nonce="12345", uri="/335", response="f61609cd8f5bb205ef4e169b2c5626cb"
Authorization: Digest username="digest", realm="realmweirdo", nonce="123456", uri="/335", response="08a2e2e684047f4219a38ddc189ac00c"
-User-Agent: curl/7.12.0-CVS (i686-pc-linux-gnu) libcurl/7.12.0-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS libidn/0.4.3
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test338 b/tests/data/test338
index 0c040c28..83fe7263 100644
--- a/tests/data/test338
+++ b/tests/data/test338
@@ -45,16 +45,15 @@ http://%HOSTIP:%HTTPPORT/338 --next http://%HOSTIP:%HTTPPORT/338 --anyauth -u fo
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /338 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /338 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
[DISCONNECT]
diff --git a/tests/data/test339 b/tests/data/test339
index cd6e4989..eca35947 100644
--- a/tests/data/test339
+++ b/tests/data/test339
@@ -14,7 +14,7 @@ Server: fakeit/0.9 fakeitbad/1.0
Transfer-Encoding: chunked
Trailer: chunky-trailer
Connection: mooo
-ETag: "asdf"
+ETag: W/"asdf"
40
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -46,17 +46,15 @@ http://%HOSTIP:%HTTPPORT/339 --etag-save log/etag339
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /339 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
<file name="log/etag339">
-asdf
+W/"asdf"
</file>
</verify>
diff --git a/tests/data/test34 b/tests/data/test34
index a332b8c4..fa4928d5 100644
--- a/tests/data/test34
+++ b/tests/data/test34
@@ -52,12 +52,10 @@ http://%HOSTIP:%HTTPPORT/34
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /34 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test341 b/tests/data/test341
index 5e952ad9..726000d1 100644
--- a/tests/data/test341
+++ b/tests/data/test341
@@ -46,9 +46,6 @@ http://%HOSTIP:%HTTPPORT/341 --etag-compare log/etag341
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<errorcode>
26
</errorcode>
diff --git a/tests/data/test342 b/tests/data/test342
index 95297ba5..5a1615f1 100644
--- a/tests/data/test342
+++ b/tests/data/test342
@@ -34,7 +34,7 @@ http
Check if --etag-compare set correct etag in header
</name>
<file name="log/etag342">
-21025-dc7-39462498
+"21025-dc7-39462498"
</file>
<command>
http://%HOSTIP:%HTTPPORT/342 --etag-compare log/etag342
@@ -44,12 +44,10 @@ http://%HOSTIP:%HTTPPORT/342 --etag-compare log/etag342
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /342 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
If-None-Match: "21025-dc7-39462498"
diff --git a/tests/data/test343 b/tests/data/test343
index e55a181d..6e807762 100644
--- a/tests/data/test343
+++ b/tests/data/test343
@@ -34,7 +34,7 @@ http
Both --etag-compare and --etag-save to save new Etag
</name>
<file name="log/etag343">
-21025-dc7-39462498
+"21025-dc7-39462498"
</file>
<command>
http://%HOSTIP:%HTTPPORT/343 --etag-compare log/etag343 --etag-save log/out343
@@ -44,18 +44,16 @@ http://%HOSTIP:%HTTPPORT/343 --etag-compare log/etag343 --etag-save log/out343
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /343 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
If-None-Match: "21025-dc7-39462498"
</protocol>
<file name="log/out343">
-21025-dc7-11111
+"21025-dc7-11111"
</file>
</verify>
</testcase>
diff --git a/tests/data/test344 b/tests/data/test344
index 054d0351..5672366e 100644
--- a/tests/data/test344
+++ b/tests/data/test344
@@ -41,18 +41,16 @@ http://%HOSTIP:%HTTPPORT/344 --etag-compare log/etag344 --etag-save log/etag344
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /344 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
If-None-Match: ""
</protocol>
<file name="log/etag344">
-21025-dc7-11111
+"21025-dc7-11111"
</file>
</verify>
</testcase>
diff --git a/tests/data/test345 b/tests/data/test345
index 135e0c26..87687324 100644
--- a/tests/data/test345
+++ b/tests/data/test345
@@ -34,7 +34,7 @@ http
Both --etag-compare and -save store new Etag using one pre-existing file
</name>
<file name="log/etag345">
-21025-dc7-39462498
+"21025-dc7-39462498"
</file>
<command>
http://%HOSTIP:%HTTPPORT/345 --etag-compare log/etag345 --etag-save log/etag345
@@ -44,18 +44,16 @@ http://%HOSTIP:%HTTPPORT/345 --etag-compare log/etag345 --etag-save log/etag345
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /345 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
If-None-Match: "21025-dc7-39462498"
</protocol>
<file name="log/etag345">
-21025-dc7-11111
+"21025-dc7-11111"
</file>
</verify>
</testcase>
diff --git a/tests/data/test346 b/tests/data/test346
index 64923117..3ec7a1a9 100644
--- a/tests/data/test346
+++ b/tests/data/test346
@@ -44,14 +44,12 @@ HTTP GET over proxy with credentials using blank passwords
#
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://remote.example/346 HTTP/1.1
Host: remote.example
Proxy-Authorization: Basic cHVzZXI6
Authorization: Basic c3VzZXI6
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test347 b/tests/data/test347
new file mode 100644
index 00000000..3d55a5bd
--- /dev/null
+++ b/tests/data/test347
@@ -0,0 +1,60 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+</keywords>
+</info>
+#
+# Server-side
+<reply>
+<data nocheck="yes">
+HTTP/1.1 200 funky chunky!
+Server: fakeit/0.9 fakeitbad/1.0
+Transfer-Encoding: chunked
+Trailer: chunky-trailer
+Connection: mooo
+ETag:
+
+40
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+30
+bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
+21;heresatest=moooo
+cccccccccccccccccccccccccccccccc
+
+0
+chunky-trailer: header data
+
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+</server>
+<name>
+--etag-save with blank incoming header
+</name>
+<command>
+http://%HOSTIP:%HTTPPORT/347 --etag-save log/etag347
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+GET /347 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+
+</protocol>
+<file name="log/etag347">
+</file>
+</verify>
+
+</testcase>
diff --git a/tests/data/test348 b/tests/data/test348
new file mode 100644
index 00000000..befd9fb8
--- /dev/null
+++ b/tests/data/test348
@@ -0,0 +1,61 @@
+<testcase>
+<info>
+<keywords>
+FTP
+EPSV
+STOR
+</keywords>
+</info>
+
+<reply>
+<servercmd>
+STOR 552 disk full
+</servercmd>
+</reply>
+
+# Client-side
+<client>
+<server>
+ftp
+</server>
+ <name>
+FTP upload file with 552 disk full response
+ </name>
+<file name="log/test348.txt">
+data
+ to
+ see
+that FTP
+works
+ so does it?
+</file>
+ <command>
+ftp://%HOSTIP:%FTPPORT/348 -T log/test348.txt
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<upload>
+data
+ to
+ see
+that FTP
+works
+ so does it?
+</upload>
+<protocol>
+USER anonymous
+PASS ftp@example.com
+PWD
+EPSV
+TYPE I
+STOR 348
+QUIT
+</protocol>
+# 70 - CURLE_REMOTE_DISK_FULL
+<errorcode>
+70
+</errorcode>
+</verify>
+</testcase>
diff --git a/tests/data/test35 b/tests/data/test35
index 85733a45..5b6aba0a 100644
--- a/tests/data/test35
+++ b/tests/data/test35
Binary files differ
diff --git a/tests/data/test355 b/tests/data/test355
index e9c4cb28..1cab2dd4 100644
--- a/tests/data/test355
+++ b/tests/data/test355
@@ -44,12 +44,10 @@ h1 example.com 80 h1 %HOSTIP %HTTPPORT "20290222 22:19:28" 0 0
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /355 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test356 b/tests/data/test356
index c1234b45..469ab0d1 100644
--- a/tests/data/test356
+++ b/tests/data/test356
@@ -47,12 +47,10 @@ http://%HOSTIP:%HTTPPORT/356 --alt-svc "log/altsvc-356"
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /356 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test357 b/tests/data/test357
index d0437c68..9e7ed86a 100644
--- a/tests/data/test357
+++ b/tests/data/test357
@@ -68,18 +68,17 @@ the
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
PUT /we/want/357 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 78
Expect: 100-continue
PUT /we/want/357 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 78
diff --git a/tests/data/test36 b/tests/data/test36
index 4e3fd8c8..91db26ec 100644
--- a/tests/data/test36
+++ b/tests/data/test36
@@ -52,12 +52,10 @@ http://%HOSTIP:%HTTPPORT/36
<errorcode>
56
</errorcode>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /36 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test37 b/tests/data/test37
index 76876230..1dedfde7 100644
--- a/tests/data/test37
+++ b/tests/data/test37
@@ -33,12 +33,10 @@ http://%HOSTIP:%HTTPPORT/37
<errorcode>
52
</errorcode>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /37 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test38 b/tests/data/test38
index db257f2f..518aae95 100644
--- a/tests/data/test38
+++ b/tests/data/test38
@@ -41,13 +41,11 @@ download on.
<errorcode>
33
</errorcode>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/38 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Range: bytes=78-
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test39 b/tests/data/test39
index 3c6c5732..de9a5163 100644
--- a/tests/data/test39
+++ b/tests/data/test39
@@ -40,12 +40,12 @@ foo
# Verify data after the test has been "shot"
<verify>
<strip>
-^(User-Agent:|Content-Type: multipart/form-data;|-------).*
+^(Content-Type: multipart/form-data;|-------).*
</strip>
<protocol>
POST /we/want/39 HTTP/1.1
-User-Agent: curl/7.10.4 (i686-pc-linux-gnu) libcurl/7.10.4 OpenSSL/0.9.7a ipv6 zlib/1.1.3
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 1184
Content-Type: multipart/form-data; boundary=----------------------------24e78000bd32
diff --git a/tests/data/test393 b/tests/data/test393
index f03e9a24..67ce1c10 100644
--- a/tests/data/test393
+++ b/tests/data/test393
@@ -47,12 +47,10 @@ http://%HOSTIP:%HTTPPORT/393 --max-filesize 2000000
<errorcode>
63
</errorcode>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /393 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test394 b/tests/data/test394
index b82039b4..ec7a06d9 100644
--- a/tests/data/test394
+++ b/tests/data/test394
@@ -46,12 +46,10 @@ http://%HOSTIP:%HTTPPORT/394
<errorcode>
8
</errorcode>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /394 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test395 b/tests/data/test395
index 2a569bf3..fae55dbf 100644
--- a/tests/data/test395
+++ b/tests/data/test395
@@ -42,12 +42,10 @@ http://%HOSTIP:%HTTPPORT/395
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /395 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test396 b/tests/data/test396
index 1dd03421..01be58ac 100644
--- a/tests/data/test396
+++ b/tests/data/test396
@@ -185,15 +185,13 @@ http://%HOSTIP:%HTTPPORT/396 --compressed
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<strippart>
s/^Accept-Encoding: .*/Accept-Encoding: xxx/
</strippart>
<protocol>
GET /396 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Accept-Encoding: xxx
diff --git a/tests/data/test397 b/tests/data/test397
index 6f872e2a..0afd21c6 100644
--- a/tests/data/test397
+++ b/tests/data/test397
@@ -181,15 +181,13 @@ http://%HOSTIP:%HTTPPORT/397 --compressed
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<strippart>
s/^Accept-Encoding: .*/Accept-Encoding: xxx/
</strippart>
<protocol>
GET /397 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Accept-Encoding: xxx
diff --git a/tests/data/test4 b/tests/data/test4
index 542347db..fe5789ad 100644
--- a/tests/data/test4
+++ b/tests/data/test4
@@ -37,12 +37,10 @@ Replaced internal and added custom HTTP headers
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /4 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
extra-header: here
Accept: replaced
X-Custom-Header:
@@ -51,6 +49,7 @@ X-Test2: foo;
GET /4 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
extra-header: here
Accept: replaced
X-Custom-Header:
diff --git a/tests/data/test40 b/tests/data/test40
index 6be0d161..42bd8e13 100644
--- a/tests/data/test40
+++ b/tests/data/test40
@@ -56,17 +56,15 @@ http://%HOSTIP:%HTTPPORT/we/are/all/twits/40 -L
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/are/all/twits/40 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /we/are/all/moo.html/?name=d+a+niel&testcase=/400002 HTTP/1.1
-User-Agent: curl/7.10 (i686-pc-linux-gnu) libcurl/7.10 OpenSSL/0.9.6c ipv6 zlib/1.1.3
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test42 b/tests/data/test42
index e303f3a2..abb3412e 100644
--- a/tests/data/test42
+++ b/tests/data/test42
@@ -56,17 +56,15 @@ http://%HOSTIP:%HTTPPORT/we/are/all/twits/42 -L
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/are/all/twits/42 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /we/are/all/m%20o%20o.html/420002 HTTP/1.1
-User-Agent: curl/7.10 (i686-pc-linux-gnu) libcurl/7.10 OpenSSL/0.9.6c ipv6 zlib/1.1.3
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test43 b/tests/data/test43
index 19601701..28035c89 100644
--- a/tests/data/test43
+++ b/tests/data/test43
@@ -63,17 +63,16 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://%HOSTIP:%HTTPPORT/want/43 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://%HOSTIP:%HTTPPORT/want/data/430002.txt?coolsite=yes HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test430 b/tests/data/test430
index d4dc530d..4a669ff7 100644
--- a/tests/data/test430
+++ b/tests/data/test430
@@ -70,12 +70,10 @@ Three -K uses with --next and --data in each
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol nonewline="yes">
POST /4300001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
a: a
Content-Length: 1
@@ -83,6 +81,7 @@ Content-Type: application/x-www-form-urlencoded
aPOST /4300002 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
b: b
Content-Length: 1
@@ -90,6 +89,7 @@ Content-Type: application/x-www-form-urlencoded
bPOST /4300003 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
c: c
Content-Length: 1
diff --git a/tests/data/test431 b/tests/data/test431
index 48a1b20a..8f045482 100644
--- a/tests/data/test431
+++ b/tests/data/test431
@@ -64,12 +64,10 @@ Two -K uses with --next and then one on cmdline
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol nonewline="yes">
POST /4310001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
a: a
Content-Length: 1
@@ -77,6 +75,7 @@ Content-Type: application/x-www-form-urlencoded
aPOST /4310002 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
b: b
Content-Length: 1
@@ -84,6 +83,7 @@ Content-Type: application/x-www-form-urlencoded
bPOST /4310003 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
c: c
Content-Length: 1
diff --git a/tests/data/test432 b/tests/data/test432
index b3401b68..a7bc3788 100644
--- a/tests/data/test432
+++ b/tests/data/test432
@@ -69,12 +69,10 @@ Use -K with --next and --config from within
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol nonewline="yes">
POST /4320001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
a: a
Content-Length: 1
@@ -82,6 +80,7 @@ Content-Type: application/x-www-form-urlencoded
aPOST /4320002 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
b: b
Content-Length: 1
@@ -89,6 +88,7 @@ Content-Type: application/x-www-form-urlencoded
bPOST /4320003 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
c: c
Content-Length: 1
diff --git a/tests/data/test433 b/tests/data/test433
new file mode 100644
index 00000000..e7cb4d22
--- /dev/null
+++ b/tests/data/test433
@@ -0,0 +1,57 @@
+<testcase>
+<info>
+<keywords>
+--config
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+HTTP/1.1 200 OK
+Content-Length: 6
+Content-Type: text/1
+
+-foo-
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<file1 name="log/.curlrc">
+--next
+header = "a: a"
+data = "curlrc read"
+</file1>
+<server>
+http
+</server>
+<setenv>
+XDG_CONFIG_HOME=%PWD/log
+</setenv>
+<name>
+Verify XDG_CONFIG_HOME use to find .curlrc
+</name>
+<command>
+%HOSTIP:%HTTPPORT/433
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol nonewline="yes">
+POST /433 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+a: a
+Content-Length: 11
+Content-Type: application/x-www-form-urlencoded
+
+curlrc read
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test434 b/tests/data/test434
new file mode 100644
index 00000000..a2bcc0cb
--- /dev/null
+++ b/tests/data/test434
@@ -0,0 +1,46 @@
+<testcase>
+
+<info>
+<keywords>
+--config
+</keywords>
+</info>
+
+#
+<reply>
+<data>
+HTTP/1.1 200 OK
+Content-Length: 6
+Content-Type: text/1
+
+-foo-
+</data>
+</reply>
+
+#
+<client>
+<file name="log/config434" nonewline="yes">
+url = %HOSTIP:%HTTPPORT/434
+</file>
+<server>
+http
+</server>
+<name>
+-K with a single line without newline
+</name>
+<command>
+-K log/config434
+</command>
+</client>
+
+#
+<verify>
+<protocol>
+GET /434 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test44 b/tests/data/test44
index 8220a1aa..4b1fa450 100644
--- a/tests/data/test44
+++ b/tests/data/test44
@@ -40,12 +40,12 @@ bar
# Verify data after the test has been "shot"
<verify>
<strip>
-^(User-Agent:|Content-Type: multipart/form-data;|------).*
+^(Content-Type: multipart/form-data;|------).*
</strip>
<protocol>
POST /we/want/44 HTTP/1.1
-User-Agent: curl/7.10.4 (i686-pc-linux-gnu) libcurl/7.10.4 OpenSSL/0.9.7a ipv6 zlib/1.1.3
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 408
Content-Type: multipart/form-data; boundary=----------------------------7c633d5c27ce
diff --git a/tests/data/test45 b/tests/data/test45
index 3eb9ba94..1381920d 100644
--- a/tests/data/test45
+++ b/tests/data/test45
@@ -59,16 +59,15 @@ simple HTTP Location: without protocol in initial URL
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/45 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /want/data.cgi?moo=http://&/450002 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test46 b/tests/data/test46
index 4ea25925..c54a7f1f 100644
--- a/tests/data/test46
+++ b/tests/data/test46
@@ -59,12 +59,10 @@ domain..tld FALSE /want FALSE 0 empty
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/46 HTTP/1.1
Host: domain..tld:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Cookie: empty=; mooo2=indeed2; mooo=indeed
diff --git a/tests/data/test47 b/tests/data/test47
index bd779d34..2048f522 100644
--- a/tests/data/test47
+++ b/tests/data/test47
@@ -35,12 +35,10 @@ http://%HOSTIP:%HTTPPORT/47 -0
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /47 HTTP/1.0
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test48 b/tests/data/test48
index 7ee05ad3..36bf6566 100644
--- a/tests/data/test48
+++ b/tests/data/test48
@@ -36,16 +36,15 @@ HTTP with -d and -G and -I
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
HEAD /48?foo=moo&moo=poo HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
HEAD /48?foo=moo&moo=poo HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
[DISCONNECT]
diff --git a/tests/data/test49 b/tests/data/test49
index 4a4175e3..9192f92a 100644
--- a/tests/data/test49
+++ b/tests/data/test49
@@ -56,17 +56,15 @@ http://%HOSTIP:%HTTPPORT/we/are/all/twits/49 -L
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/are/all/twits/49 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /we/are/all/moo.html/490002 HTTP/1.1
-User-Agent: curl/7.10 (i686-pc-linux-gnu) libcurl/7.10 OpenSSL/0.9.6c ipv6 zlib/1.1.3
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test490 b/tests/data/test490
index 86ebb011..6f77b711 100644
--- a/tests/data/test490
+++ b/tests/data/test490
@@ -45,12 +45,10 @@ surprise!
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
PUT /490 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 10
Expect: 100-continue
@@ -58,6 +56,7 @@ Expect: 100-continue
surprise!
PUT /490 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 10
Expect: 100-continue
diff --git a/tests/data/test491 b/tests/data/test491
index c230dfb7..87cebf1a 100644
--- a/tests/data/test491
+++ b/tests/data/test491
@@ -45,12 +45,10 @@ surprise!
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
PUT /491 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 10
Expect: 100-continue
diff --git a/tests/data/test492 b/tests/data/test492
index ddb0405e..ab3c01fc 100644
--- a/tests/data/test492
+++ b/tests/data/test492
@@ -48,12 +48,10 @@ second 492 contents
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
PUT /one/first492 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Testno: 492
Content-Length: 19
@@ -62,6 +60,7 @@ Expect: 100-continue
first 492 contents
PUT /two/first492 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Testno: 492
Content-Length: 19
@@ -70,6 +69,7 @@ Expect: 100-continue
first 492 contents
PUT /one/second492 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Testno: 492
Content-Length: 20
@@ -78,6 +78,7 @@ Expect: 100-continue
second 492 contents
PUT /two/second492 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Testno: 492
Content-Length: 20
diff --git a/tests/data/test5 b/tests/data/test5
index b98d27b3..61388202 100644
--- a/tests/data/test5
+++ b/tests/data/test5
@@ -39,12 +39,10 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://%HOSTIP:%HTTPPORT/we/want/that/page/5 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test50 b/tests/data/test50
index 84b05da7..777caa25 100644
--- a/tests/data/test50
+++ b/tests/data/test50
@@ -56,17 +56,15 @@ http://%HOSTIP:%HTTPPORT/we/are/all/twits/50 -L
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/are/all/twits/50 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /we/are/moo.html/500002 HTTP/1.1
-User-Agent: curl/7.10 (i686-pc-linux-gnu) libcurl/7.10 OpenSSL/0.9.6c ipv6 zlib/1.1.3
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test51 b/tests/data/test51
index b58c3570..7d9740ae 100644
--- a/tests/data/test51
+++ b/tests/data/test51
@@ -56,17 +56,15 @@ http://%HOSTIP:%HTTPPORT/we/are/all/twits/51 -L
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/are/all/twits/51 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /510002 HTTP/1.1
-User-Agent: curl/7.10 (i686-pc-linux-gnu) libcurl/7.10 OpenSSL/0.9.6c ipv6 zlib/1.1.3
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test511 b/tests/data/test511
index 72b79938..1a251fd8 100644
--- a/tests/data/test511
+++ b/tests/data/test511
@@ -35,9 +35,9 @@ ftp://%HOSTIP:%FTPPORT/511
#
# Verify data after the test has been "shot"
<verify>
-# CURLE_FTP_COULDNT_RETR_FILE
+# CURLE_REMOTE_FILE_NOT_FOUND
<errorcode>
-19
+78
</errorcode>
<protocol>
USER anonymous
diff --git a/tests/data/test512 b/tests/data/test512
index d259f40d..dd5cc0a0 100644
--- a/tests/data/test512
+++ b/tests/data/test512
@@ -40,9 +40,6 @@ http://%HOSTIP:%HTTPPORT/512
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /512 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test514 b/tests/data/test514
index ca37a5d6..82f8041f 100644
--- a/tests/data/test514
+++ b/tests/data/test514
@@ -44,9 +44,6 @@ http://%HOSTIP:%HTTPPORT/514
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
HEAD /514 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test515 b/tests/data/test515
index 526f1e13..bea2fe6f 100644
--- a/tests/data/test515
+++ b/tests/data/test515
@@ -39,9 +39,6 @@ http://%HOSTIP:%HTTPPORT/515
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
POST /515 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test516 b/tests/data/test516
index 9bc175bd..c41d15e7 100644
--- a/tests/data/test516
+++ b/tests/data/test516
@@ -40,9 +40,6 @@ http://%HOSTIP:%HTTPPORT/516
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
POST /516 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test52 b/tests/data/test52
index 14fa42bf..196ff041 100644
--- a/tests/data/test52
+++ b/tests/data/test52
@@ -56,17 +56,15 @@ http://%HOSTIP:%HTTPPORT/we/are/all/twits/52 -L
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/are/all/twits/52 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /we/are/all/twits/520002 HTTP/1.1
-User-Agent: curl/7.10 (i686-pc-linux-gnu) libcurl/7.10 OpenSSL/0.9.6c ipv6 zlib/1.1.3
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test522 b/tests/data/test522
index 89a0dbf5..8fc07c39 100644
--- a/tests/data/test522
+++ b/tests/data/test522
@@ -43,9 +43,6 @@ http://%HOSTIP/522 %HTTPPORT
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /522 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test523 b/tests/data/test523
index c00a0969..03d456b0 100644
--- a/tests/data/test523
+++ b/tests/data/test523
@@ -49,9 +49,6 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://www.example.com:19999/523 HTTP/1.1
Host: www.example.com:19999
diff --git a/tests/data/test53 b/tests/data/test53
index 679a4fa8..bffd063e 100644
--- a/tests/data/test53
+++ b/tests/data/test53
@@ -40,12 +40,10 @@ HTTP, junk session cookies
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/53 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Cookie: mooo=indeed
diff --git a/tests/data/test530 b/tests/data/test530
deleted file mode 100644
index 40182e29..00000000
--- a/tests/data/test530
+++ /dev/null
@@ -1,83 +0,0 @@
-<testcase>
-<info>
-<keywords>
-HTTP
-pipelining
-multi
-</keywords>
-</info>
-
-# Server-side
-<reply>
-<data1>
-HTTP/1.1 200 OK
-Date: Thu, 09 Nov 2010 14:49:00 GMT
-Server: test-server/fake
-Content-Length: 47
-
-file contents should appear once for each file
-</data1>
-<data2>
-HTTP/1.1 200 OK
-</data2>
-<data3>
-Date: Thu, 09 Nov 2010 14:49:00 GMT
-</data3>
-<data4>
-Server: test-server/fake
-Content-Length: 47
-
-file contents should appear once for each file
-HTTP/1.1 200 OK
-Date: Thu, 09 Nov 2010 14:49:00 GMT
-Server: test-server/fake
-Content-Length: 47
-
-file contents should appear once for each file
-HTTP/1.1 200 OK
-Date: Thu, 09 Nov 2010 14:49:00 GMT
-Server: test-server/fake
-Content-Length: 47
-
-file contents should appear once for each file
-</data4>
-</reply>
-
-# Client-side
-<client>
-<server>
-http
-</server>
-<tool>
-lib530
-</tool>
- <name>
-HTTP GET using pipelining
- </name>
- <command>
-http://%HOSTIP:%HTTPPORT/path/530
-</command>
-</client>
-
-# Verify data after the test has been "shot"
-<verify>
-<protocol>
-GET /path/5300001 HTTP/1.1
-Host: %HOSTIP:%HTTPPORT
-Accept: */*
-
-GET /path/5300002 HTTP/1.1
-Host: %HOSTIP:%HTTPPORT
-Accept: */*
-
-GET /path/5300003 HTTP/1.1
-Host: %HOSTIP:%HTTPPORT
-Accept: */*
-
-GET /path/5300004 HTTP/1.1
-Host: %HOSTIP:%HTTPPORT
-Accept: */*
-
-</protocol>
-</verify>
-</testcase>
diff --git a/tests/data/test533 b/tests/data/test533
index f4446cbe..a67c8c82 100644
--- a/tests/data/test533
+++ b/tests/data/test533
@@ -15,7 +15,7 @@ multi
<servercmd>
REPLY RETR 550 the file doesn't exist
-REPLY SIZE 550 Can't check for file existence
+REPLY SIZE 500 Can't check for file existence
</servercmd>
</reply>
diff --git a/tests/data/test534 b/tests/data/test534
index 6045dba6..ba3f721e 100644
--- a/tests/data/test534
+++ b/tests/data/test534
@@ -16,7 +16,7 @@ non-existing host
<servercmd>
REPLY RETR 550 the file doesn't exist
-REPLY SIZE 550 Can't check for file existence
+REPLY SIZE 500 Can't check for file existence
</servercmd>
</reply>
diff --git a/tests/data/test54 b/tests/data/test54
index 66dbe9dd..24f08195 100644
--- a/tests/data/test54
+++ b/tests/data/test54
@@ -32,12 +32,10 @@ http://%HOSTIP:%HTTPPORT/want/54 -L
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/54 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test540 b/tests/data/test540
index 871c558f..8f53b072 100644
--- a/tests/data/test540
+++ b/tests/data/test540
@@ -79,9 +79,6 @@ http://test.remote.example.com/path/540 http://%HOSTIP:%HTTPPORT silly:person cu
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
GET http://test.remote.example.com/path/540 HTTP/1.1
Host: custom.set.host.name
diff --git a/tests/data/test544 b/tests/data/test544
index 78cb5a45..4bf9a6cb 100644
--- a/tests/data/test544
+++ b/tests/data/test544
@@ -40,9 +40,6 @@ http://%HOSTIP:%HTTPPORT/544
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol nonewline="yes">
POST /544 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test546 b/tests/data/test546
index 12e604a0..00dca99f 100644
--- a/tests/data/test546
+++ b/tests/data/test546
@@ -21,7 +21,7 @@ works
<servercmd>
REPLY RETR 550 the file doesn't exist
COUNT RETR 1
-REPLY SIZE 550 Can't check for file existence
+REPLY SIZE 500 Can't check for file existence
COUNT SIZE 1
</servercmd>
</reply>
diff --git a/tests/data/test547 b/tests/data/test547
index e4ec3989..5401e06c 100644
--- a/tests/data/test547
+++ b/tests/data/test547
@@ -100,13 +100,9 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
POST http://test.remote.example.com/path/547 HTTP/1.1
Host: test.remote.example.com
-User-Agent: curl/7.13.2-CVS (i686-pc-linux-gnu) libcurl/7.13.2-CVS OpenSSL/0.9.7e zlib/1.2.2 libidn/0.5.13
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 36
@@ -116,7 +112,6 @@ this is the blurb we want to upload
POST http://test.remote.example.com/path/547 HTTP/1.1
Host: test.remote.example.com
Proxy-Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-User-Agent: curl/7.13.2-CVS (i686-pc-linux-gnu) libcurl/7.13.2-CVS OpenSSL/0.9.7e zlib/1.2.2 libidn/0.5.13
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 0
@@ -125,7 +120,6 @@ Content-Type: application/x-www-form-urlencoded
POST http://test.remote.example.com/path/547 HTTP/1.1
Host: test.remote.example.com
Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=
-User-Agent: curl/7.13.2-CVS (i686-pc-linux-gnu) libcurl/7.13.2-CVS OpenSSL/0.9.7e zlib/1.2.2 libidn/0.5.13
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 36
diff --git a/tests/data/test548 b/tests/data/test548
index d636ab1b..3ce5ae1e 100644
--- a/tests/data/test548
+++ b/tests/data/test548
@@ -100,13 +100,9 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
POST http://test.remote.example.com/path/548 HTTP/1.1
Host: test.remote.example.com
-User-Agent: curl/7.13.2-CVS (i686-pc-linux-gnu) libcurl/7.13.2-CVS OpenSSL/0.9.7e zlib/1.2.2 libidn/0.5.13
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 36
@@ -116,7 +112,6 @@ this is the blurb we want to upload
POST http://test.remote.example.com/path/548 HTTP/1.1
Host: test.remote.example.com
Proxy-Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-User-Agent: curl/7.13.2-CVS (i686-pc-linux-gnu) libcurl/7.13.2-CVS OpenSSL/0.9.7e zlib/1.2.2 libidn/0.5.13
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 0
@@ -125,7 +120,6 @@ Content-Type: application/x-www-form-urlencoded
POST http://test.remote.example.com/path/548 HTTP/1.1
Host: test.remote.example.com
Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=
-User-Agent: curl/7.13.2-CVS (i686-pc-linux-gnu) libcurl/7.13.2-CVS OpenSSL/0.9.7e zlib/1.2.2 libidn/0.5.13
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 36
diff --git a/tests/data/test549 b/tests/data/test549
index a9f1ca21..93c442aa 100644
--- a/tests/data/test549
+++ b/tests/data/test549
@@ -49,9 +49,6 @@ ftp://www.example.com/moo/549 http://%HOSTIP:%HTTPPORT
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET ftp://www.example.com/moo/549;type=i HTTP/1.1
Host: www.example.com:21
diff --git a/tests/data/test55 b/tests/data/test55
index 66238560..216f13ce 100644
--- a/tests/data/test55
+++ b/tests/data/test55
@@ -48,17 +48,15 @@ http://%HOSTIP:%HTTPPORT/55 -L
</client>
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /55 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /550002 HTTP/1.1
-User-Agent: curl/7.10 (i686-pc-linux-gnu) libcurl/7.10 OpenSSL/0.9.6c ipv6 zlib/1.1.3
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test550 b/tests/data/test550
index 1eff72a1..bd8f4223 100644
--- a/tests/data/test550
+++ b/tests/data/test550
@@ -49,9 +49,6 @@ ftp://www.example.com/moo/550 http://%HOSTIP:%HTTPPORT ascii
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET ftp://www.example.com/moo/550;type=a HTTP/1.1
Host: www.example.com:21
diff --git a/tests/data/test551 b/tests/data/test551
index bb31a36f..30c0ed94 100644
--- a/tests/data/test551
+++ b/tests/data/test551
@@ -75,9 +75,6 @@ http://test.remote.example.com/path/551 http://%HOSTIP:%HTTPPORT s1lly:pers0n
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
POST http://test.remote.example.com/path/551 HTTP/1.1
Host: test.remote.example.com
diff --git a/tests/data/test552 b/tests/data/test552
index a02023a5..9ad37bd7 100644
--- a/tests/data/test552
+++ b/tests/data/test552
Binary files differ
diff --git a/tests/data/test553 b/tests/data/test553
index bd937f01..3ddb5329 100644
--- a/tests/data/test553
+++ b/tests/data/test553
@@ -41,25 +41,22 @@ http://%HOSTIP:%HTTPPORT/path/553
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol nonewline="yes">
POST /path/553 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Accept: */*
-Header0: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-Header1: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-Header2: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-Header3: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-Header4: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-Header5: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-Header6: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-Header7: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+Header0: %repeat[5000 x A]%
+Header1: %repeat[5000 x A]%
+Header2: %repeat[5000 x A]%
+Header3: %repeat[5000 x A]%
+Header4: %repeat[5000 x A]%
+Header5: %repeat[5000 x A]%
+Header6: %repeat[5000 x A]%
+Header7: %repeat[5000 x A]%
Content-Length: 40960
Content-Type: application/x-www-form-urlencoded
-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+%repeat[40960 x A]%
</protocol>
</verify>
</testcase>
diff --git a/tests/data/test555 b/tests/data/test555
index ed8117f8..506cbb4a 100644
--- a/tests/data/test555
+++ b/tests/data/test555
@@ -105,13 +105,9 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
POST http://test.remote.example.com/path/555 HTTP/1.1
Host: test.remote.example.com
-User-Agent: curl/7.13.2-CVS (i686-pc-linux-gnu) libcurl/7.13.2-CVS OpenSSL/0.9.7e zlib/1.2.2 libidn/0.5.13
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 36
@@ -121,7 +117,6 @@ this is the blurb we want to upload
POST http://test.remote.example.com/path/555 HTTP/1.1
Host: test.remote.example.com
Proxy-Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-User-Agent: curl/7.13.2-CVS (i686-pc-linux-gnu) libcurl/7.13.2-CVS OpenSSL/0.9.7e zlib/1.2.2 libidn/0.5.13
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 0
@@ -130,7 +125,6 @@ Content-Type: application/x-www-form-urlencoded
POST http://test.remote.example.com/path/555 HTTP/1.1
Host: test.remote.example.com
Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=
-User-Agent: curl/7.13.2-CVS (i686-pc-linux-gnu) libcurl/7.13.2-CVS OpenSSL/0.9.7e zlib/1.2.2 libidn/0.5.13
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 36
diff --git a/tests/data/test556 b/tests/data/test556
index 549b9a4a..72a8b9e4 100644
--- a/tests/data/test556
+++ b/tests/data/test556
@@ -38,9 +38,6 @@ http://%HOSTIP:%HTTPPORT
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /556 HTTP/1.2
Host: ninja
diff --git a/tests/data/test558 b/tests/data/test558
index d5aa0e08..f313e813 100644
--- a/tests/data/test558
+++ b/tests/data/test558
@@ -38,8 +38,8 @@ nothing
<file name="log/memdump">
MEM lib558.c: malloc()
MEM lib558.c: free()
-MEM strdup.c: realloc()
-MEM strdup.c: realloc()
+MEM dynbuf.c: realloc()
+MEM dynbuf.c: realloc()
MEM escape.c: free()
</file>
<stripfile>
diff --git a/tests/data/test56 b/tests/data/test56
index f221981c..394ac357 100644
--- a/tests/data/test56
+++ b/tests/data/test56
@@ -34,7 +34,7 @@ data "we post this"
header "Transfer-Encoding: chunked"
#
# Set the user-agent using a short-option:
--A "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+-A "%repeat[99999 x a]%"
#
</stdin>
<command>
@@ -47,7 +47,7 @@ header "Transfer-Encoding: chunked"
<protocol>
POST /that.site.com/56 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-User-Agent: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+User-Agent: %repeat[99999 x a]%
Accept: */*
Transfer-Encoding: chunked
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test560 b/tests/data/test560
index 8d005541..72a35e4b 100644
--- a/tests/data/test560
+++ b/tests/data/test560
@@ -43,9 +43,6 @@ https://%HOSTIP:%HTTPSPORT/560
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /560 HTTP/1.1
Host: %HOSTIP:%HTTPSPORT
diff --git a/tests/data/test561 b/tests/data/test561
index 359e54cc..2f244617 100644
--- a/tests/data/test561
+++ b/tests/data/test561
@@ -50,9 +50,6 @@ FTP RETR with CURLOPT_PROXY_TRANSFER_MODE, ASCII transfer and type=i
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET ftp://www.example.com/moo/561;type=i HTTP/1.1
Host: www.example.com:21
diff --git a/tests/data/test57 b/tests/data/test57
index 0724eac8..5011e6eb 100644
--- a/tests/data/test57
+++ b/tests/data/test57
@@ -35,12 +35,10 @@ HTTP content-type with spaces in
<stdout mode="text">
text/html; charset=ISO-8859-4
</stdout>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /57 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test573 b/tests/data/test573
index e3299b82..b76f259c 100644
--- a/tests/data/test573
+++ b/tests/data/test573
@@ -45,9 +45,6 @@ http://%HOSTIP:%HTTPPORT/573
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /573 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test58 b/tests/data/test58
index 1bd53fa2..f2eafe23 100644
--- a/tests/data/test58
+++ b/tests/data/test58
@@ -35,12 +35,10 @@ a few bytes
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
PUT /we/want/58te%5B%5Dst.txt HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 12
Expect: 100-continue
diff --git a/tests/data/test580 b/tests/data/test580
index 13965598..b448ee33 100644
--- a/tests/data/test580
+++ b/tests/data/test580
@@ -45,9 +45,6 @@ http://%HOSTIP:%HTTPPORT/580
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /580 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test581 b/tests/data/test581
index 83d7b604..92871c3e 100644
--- a/tests/data/test581
+++ b/tests/data/test581
@@ -45,9 +45,6 @@ http://%HOSTIP:%HTTPPORT/581
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /581 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test584 b/tests/data/test584
deleted file mode 100644
index 309c7b65..00000000
--- a/tests/data/test584
+++ /dev/null
@@ -1,102 +0,0 @@
-<testcase>
-<info>
-<keywords>
-HTTP
-pipelining
-multi
-</keywords>
-</info>
-
-# Server-side
-# Silly division of the first request is solely to appease the server which expects n_data_items == n_requests
-<reply>
-<data1>
-HTTP/1.1 200 OK
-Server: test-server/fake
-Content-Length: 4
-
-584
-</data1>
-<data2>
-HTTP/1.1 200 OK
-</data2>
-<data3>
-Server: test-server/fake
-</data3>
-<data4>
-Content-Length: 0
-
-HTTP/1.1 200 OK
-Server: test-server/fake
-Content-Length: 5
-
-585
-
-HTTP/1.1 200 OK
-Server: test-server/fake
-Content-Length: 4
-
-586
-</data4>
-</reply>
-
-# Client-side
-<client>
-<server>
-http
-</server>
-<tool>
-lib530
-</tool>
- <name>
-HTTP GET using pipelining (nonzero length after zero length)
- </name>
- <command>
-http://%HOSTIP:%HTTPPORT/path/584
-</command>
-</client>
-
-# Verify data after the test has been "shot"
-<verify>
-<protocol>
-GET /path/5840001 HTTP/1.1
-Host: %HOSTIP:%HTTPPORT
-Accept: */*
-
-GET /path/5840002 HTTP/1.1
-Host: %HOSTIP:%HTTPPORT
-Accept: */*
-
-GET /path/5840003 HTTP/1.1
-Host: %HOSTIP:%HTTPPORT
-Accept: */*
-
-GET /path/5840004 HTTP/1.1
-Host: %HOSTIP:%HTTPPORT
-Accept: */*
-
-</protocol>
-<stdout>
-HTTP/1.1 200 OK
-Server: test-server/fake
-Content-Length: 4
-
-584
-HTTP/1.1 200 OK
-Server: test-server/fake
-Content-Length: 0
-
-HTTP/1.1 200 OK
-Server: test-server/fake
-Content-Length: 5
-
-585
-
-HTTP/1.1 200 OK
-Server: test-server/fake
-Content-Length: 4
-
-586
-</stdout>
-</verify>
-</testcase>
diff --git a/tests/data/test585 b/tests/data/test585
index 2096e81c..ecde4beb 100644
--- a/tests/data/test585
+++ b/tests/data/test585
@@ -56,9 +56,6 @@ http://%HOSTIP:%HTTPPORT/585
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /585 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test589 b/tests/data/test589
index 451bb15b..81f78810 100644
--- a/tests/data/test589
+++ b/tests/data/test589
@@ -41,9 +41,6 @@ http://%HOSTIP:%HTTPPORT/589
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
POST /589 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test59 b/tests/data/test59
index 9c960177..b93f99d6 100644
--- a/tests/data/test59
+++ b/tests/data/test59
@@ -34,12 +34,10 @@ HTTP URL with slash but with "parameter"
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /?mooo/59 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test590 b/tests/data/test590
index 5ddc823a..cb24cbb5 100644
--- a/tests/data/test590
+++ b/tests/data/test590
@@ -98,27 +98,22 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
+
<protocol>
GET http://test.remote.example.com/path/590 HTTP/1.1
Host: test.remote.example.com
-User-Agent: curl/7.13.2-CVS (i686-pc-linux-gnu) libcurl/7.13.2-CVS OpenSSL/0.9.7e zlib/1.2.2 libidn/0.5.13
Accept: */*
Proxy-Connection: Keep-Alive
GET http://test.remote.example.com/path/590 HTTP/1.1
Host: test.remote.example.com
Proxy-Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-User-Agent: curl/7.13.2-CVS (i686-pc-linux-gnu) libcurl/7.13.2-CVS OpenSSL/0.9.7e zlib/1.2.2 libidn/0.5.13
Accept: */*
Proxy-Connection: Keep-Alive
GET http://test.remote.example.com/path/590 HTTP/1.1
Host: test.remote.example.com
Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAAAgACAHAAAAAIAAgAcgAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAAIWYOdZV0iKA8ytf+dU+Bz9TpMJ4mBKu221lY3VybGhvc3Q=
-User-Agent: curl/7.13.2-CVS (i686-pc-linux-gnu) libcurl/7.13.2-CVS OpenSSL/0.9.7e zlib/1.2.2 libidn/0.5.13
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test6 b/tests/data/test6
index 0e7dc9b2..09664cdb 100644
--- a/tests/data/test6
+++ b/tests/data/test6
@@ -35,12 +35,10 @@ http://%HOSTIP:%HTTPPORT/we/want/that/page/6 -b "name=contents;name2=content2"
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/want/that/page/6 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Cookie: name=contents;name2=content2
diff --git a/tests/data/test60 b/tests/data/test60
index 0dd717f8..09cd54f8 100644
--- a/tests/data/test60
+++ b/tests/data/test60
@@ -37,12 +37,10 @@ more than one byte
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
PUT /bzz/60 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Transfer-Encoding: chunked
Content-Length: 1
diff --git a/tests/data/test61 b/tests/data/test61
index 2bf6490f..67bee52e 100644
--- a/tests/data/test61
+++ b/tests/data/test61
@@ -51,12 +51,10 @@ http://%HOSTIP:%HTTPPORT/we/want/61 -c log/jar61.txt -H "Host: www.host.foo.com"
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/want/61 HTTP/1.1
Host: www.host.foo.com
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test62 b/tests/data/test62
index 82bc0d78..03afba6c 100644
--- a/tests/data/test62
+++ b/tests/data/test62
@@ -46,17 +46,16 @@ http://%HOSTIP:%HTTPPORT/we/want/62 http://%HOSTIP:%HTTPPORT/we/want/62?hoge=fug
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/want/62 HTTP/1.1
Host: www.host.foo.com
+User-Agent: curl/%VERSION
Accept: */*
Cookie: test2=yes; test=yes
GET /we/want/62?hoge=fuga HTTP/1.1
Host: www.host.foo.com
+User-Agent: curl/%VERSION
Accept: */*
Cookie: test2=yes; test=yes
diff --git a/tests/data/test63 b/tests/data/test63
index e7d7a461..b330c6af 100644
--- a/tests/data/test63
+++ b/tests/data/test63
@@ -40,13 +40,11 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://we.want.that.site.com/63 HTTP/1.1
Host: we.want.that.site.com
Proxy-Authorization: Basic ZmFrZTp1c2Vy
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test64 b/tests/data/test64
index 804a6fa8..1e7a96ee 100644
--- a/tests/data/test64
+++ b/tests/data/test64
@@ -65,18 +65,16 @@ http://%HOSTIP:%HTTPPORT/64 -u testuser:testpass --digest
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /64 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /64 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="testrealm", nonce="1053604145", uri="/64", response="c55f7f30d83d774a3d2dcacf725abaca"
-User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test65 b/tests/data/test65
index f0b97421..60652318 100644
--- a/tests/data/test65
+++ b/tests/data/test65
@@ -65,18 +65,16 @@ http://%HOSTIP:%HTTPPORT/65 -u testuser:test2pass --digest
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /65 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /65 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="testrealm", nonce="2053604145", uri="/65", response="66d68d3251f1839576ba7c766cf9205b"
-User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test658 b/tests/data/test658
index 2ed6d642..acf1846a 100644
--- a/tests/data/test658
+++ b/tests/data/test658
@@ -38,9 +38,6 @@ http://%HOSTIP:%HTTPPORT/658
</client>
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /658 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test659 b/tests/data/test659
index 048c0d0f..f191a8e8 100644
--- a/tests/data/test659
+++ b/tests/data/test659
@@ -42,9 +42,6 @@ proxy
</client>
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://www.example.com:80/ HTTP/1.1
Host: www.example.com
diff --git a/tests/data/test66 b/tests/data/test66
index 7b9af295..23bb9e9c 100644
--- a/tests/data/test66
+++ b/tests/data/test66
@@ -29,12 +29,10 @@ http://%HOSTIP:%HTTPPORT/66 --http0.9
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /66 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test662 b/tests/data/test662
index 53d97c39..3140c61c 100644
--- a/tests/data/test662
+++ b/tests/data/test662
@@ -59,17 +59,16 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://example.com/please/gimme/662 HTTP/1.1
Host: example.com
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://example.net/tes%20t%20case=/6620002 HTTP/1.1
Host: example.net
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test663 b/tests/data/test663
index c9c05a02..487be250 100644
--- a/tests/data/test663
+++ b/tests/data/test663
@@ -63,17 +63,16 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://example.com/gimme/663?foobar HTTP/1.1
Host: example.com
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://example.net/there/tes%20t%20case=/6630002?+yes+no HTTP/1.1
Host: example.net
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test669 b/tests/data/test669
index aaae2c51..47b974ca 100644
--- a/tests/data/test669
+++ b/tests/data/test669
@@ -30,22 +30,18 @@ HTTP custom Content-Type with parameter
<command>
http://%HOSTIP:%HTTPPORT/we/want/669 -H 'Content-type: multipart/form-data; charset=utf-8' -F name=daniel -F tool=curl
</command>
-</file>
</client>
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<strippart>
s/^--------------------------[a-z0-9]*/------------------------------/
s/boundary=------------------------[a-z0-9]*/boundary=----------------------------/
</strippart>
<protocol>
POST /we/want/669 HTTP/1.1
-User-Agent: curl/7.10.4 (i686-pc-linux-gnu) libcurl/7.10.4 OpenSSL/0.9.7a ipv6 zlib/1.1.3
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 242
Content-Type: multipart/form-data; charset=utf-8; boundary=----------------------------
diff --git a/tests/data/test67 b/tests/data/test67
index c0ccaf8f..8138c741 100644
--- a/tests/data/test67
+++ b/tests/data/test67
@@ -82,20 +82,17 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /67 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
GET /67 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test674 b/tests/data/test674
index d1f1a865..38ed39ef 100644
--- a/tests/data/test674
+++ b/tests/data/test674
@@ -39,9 +39,6 @@ http://%HOSTIP:%HTTPPORT/674
</client>
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /674 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test68 b/tests/data/test68
index 1eaff6e7..57ab2580 100644
--- a/tests/data/test68
+++ b/tests/data/test68
@@ -81,20 +81,17 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /68 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
GET /68 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test69 b/tests/data/test69
index 309f0394..cc3178a6 100644
--- a/tests/data/test69
+++ b/tests/data/test69
@@ -98,25 +98,22 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /69 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
GET /69 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
GET /69 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test7 b/tests/data/test7
index 62731de1..317b235b 100644
--- a/tests/data/test7
+++ b/tests/data/test7
@@ -38,12 +38,10 @@ http://%HOSTIP:%HTTPPORT/we/want/7 -b none -D log/heads7.txt
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/want/7 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test70 b/tests/data/test70
index 9057d6a4..7057153e 100644
--- a/tests/data/test70
+++ b/tests/data/test70
@@ -68,19 +68,16 @@ http://%HOSTIP:%HTTPPORT/70 -u testuser:testpass --anyauth
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /70 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
GET /70 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="testrealm", nonce="1053604199", uri="/70", response="2c9a6f00af0d86497b177b90e90c688a"
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test700 b/tests/data/test700
index ac63fa59..f43590db 100644
--- a/tests/data/test700
+++ b/tests/data/test700
@@ -44,12 +44,10 @@ HTTP GET via SOCKS4 proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /700 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test701 b/tests/data/test701
index 799597f3..3b687ff0 100644
--- a/tests/data/test701
+++ b/tests/data/test701
@@ -44,12 +44,10 @@ HTTP GET via SOCKS5 proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /701 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test702 b/tests/data/test702
index 1c18d097..dd84ffe2 100644
--- a/tests/data/test702
+++ b/tests/data/test702
@@ -38,7 +38,7 @@ Attempt connect to non-listening HTTP server via SOCKS4 proxy
# Verify data after the test has been "shot"
<verify>
<errorcode>
-7
+97
</errorcode>
</verify>
</testcase>
diff --git a/tests/data/test703 b/tests/data/test703
index d7be7139..3c3487ae 100644
--- a/tests/data/test703
+++ b/tests/data/test703
@@ -38,7 +38,7 @@ Attempt connect to non-listening HTTP server via SOCKS5 proxy
# Verify data after the test has been "shot"
<verify>
<errorcode>
-7
+97
</errorcode>
</verify>
</testcase>
diff --git a/tests/data/test708 b/tests/data/test708
index e8bffc36..85aa95ed 100644
--- a/tests/data/test708
+++ b/tests/data/test708
@@ -47,12 +47,10 @@ http://%HOSTIP:%HTTPPORT/708
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /708 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test709 b/tests/data/test709
index fa7fbc01..a2631521 100644
--- a/tests/data/test709
+++ b/tests/data/test709
@@ -47,12 +47,10 @@ http://%HOSTIP:%HTTPPORT/709
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /709 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test710 b/tests/data/test710
index 884eb50a..92df2f35 100644
--- a/tests/data/test710
+++ b/tests/data/test710
@@ -44,12 +44,10 @@ http://%HOSTIP:%HTTPPORT/710 --proxy socks5://%HOSTIP:%SOCKSPORT
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /710 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test716 b/tests/data/test716
index 96167de5..531e272f 100644
--- a/tests/data/test716
+++ b/tests/data/test716
@@ -39,7 +39,7 @@ http://hohoho.example.com:99/716 -x socks5://AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
# Verify data after the test has been "shot"
<verify>
<errorcode>
-43
+97
</errorcode>
</verify>
</testcase>
diff --git a/tests/data/test717 b/tests/data/test717
index dae50d9f..5de8fcb6 100644
--- a/tests/data/test717
+++ b/tests/data/test717
@@ -55,12 +55,10 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /717 HTTP/1.1
Host: %HOSTIP:1
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test72 b/tests/data/test72
index 8e3adaa5..1160121b 100644
--- a/tests/data/test72
+++ b/tests/data/test72
@@ -67,19 +67,16 @@ http://%HOSTIP:%HTTPPORT/72 -u testuser:testpass --anyauth
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /72 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
GET /72 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="testrealm", nonce="1053604199", uri="/72", response="9fcd1330377365a09bbcb33b2cbb25bd"
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test73 b/tests/data/test73
index 70408a86..89337798 100644
--- a/tests/data/test73
+++ b/tests/data/test73
@@ -35,12 +35,10 @@ http://%HOSTIP:%HTTPPORT/we/want/73 -c log/jar73.txt -H "Host: host.NOT_DISCLOSE
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/want/73 HTTP/1.1
Host: host.NOT_DISCLOSED.se
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test74 b/tests/data/test74
index dbe0e9c1..1a7d73fc 100644
--- a/tests/data/test74
+++ b/tests/data/test74
@@ -50,16 +50,15 @@ HTTP, urlglob {}-retrieval and -o #[num] usage
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /74 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /740001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test75 b/tests/data/test75
index 62aeb119..7bee0444 100644
--- a/tests/data/test75
+++ b/tests/data/test75
@@ -32,9 +32,6 @@ HTTP, urlglob retrieval with bad range
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<errorcode>
3
</errorcode>
diff --git a/tests/data/test76 b/tests/data/test76
index b6c47cd8..fc4a30d0 100644
--- a/tests/data/test76
+++ b/tests/data/test76
@@ -29,9 +29,6 @@ http://%HOSTIP:%NOLISTENPORT/76/ -O
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<errorcode>
23
</errorcode>
diff --git a/tests/data/test77 b/tests/data/test77
index 6a92158c..81ea6372 100644
--- a/tests/data/test77
+++ b/tests/data/test77
@@ -42,12 +42,10 @@ http://%HOSTIP:%HTTPPORT/77 -z "dec 12 12:00:00 1999 GMT"
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /77 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
If-Modified-Since: Sun, 12 Dec 1999 12:00:00 GMT
diff --git a/tests/data/test78 b/tests/data/test78
index 6768000b..d7f7d0fb 100644
--- a/tests/data/test78
+++ b/tests/data/test78
@@ -54,12 +54,10 @@ http://%HOSTIP:%HTTPPORT/78 -z "dec 12 11:00:00 1999 GMT"
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /78 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
If-Modified-Since: Sun, 12 Dec 1999 11:00:00 GMT
diff --git a/tests/data/test79 b/tests/data/test79
index 9bc83668..e967bae0 100644
--- a/tests/data/test79
+++ b/tests/data/test79
@@ -42,12 +42,10 @@ ftp://%HOSTIP:%HTTPPORT/we/want/that/page/79 -x %HOSTIP:%HTTPPORT
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET ftp://%HOSTIP:%HTTPPORT/we/want/that/page/79 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test8 b/tests/data/test8
index 2fc19006..02c6c062 100644
--- a/tests/data/test8
+++ b/tests/data/test8
@@ -55,12 +55,10 @@ perl -e 'if ("%HOSTIP" !~ /\.0\.0\.1$/) {print "Test only works for HOSTIPs endi
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/want/8 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Cookie: name with space=is weird but; trailingspace=removed; cookie=perhaps; cookie=yes; foobar=name; blexp=yesyes
diff --git a/tests/data/test80 b/tests/data/test80
index 3e61eddd..26b74f78 100644
--- a/tests/data/test80
+++ b/tests/data/test80
@@ -63,14 +63,11 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<proxy>
CONNECT test.80:%HTTPPORT HTTP/1.0
Host: test.80:%HTTPPORT
Proxy-Authorization: Basic eW91YXJlOnlvdXJzZWxm
-User-Agent: curl/7.10.7-pre2 (i686-pc-linux-gnu) libcurl/7.10.7-pre2 OpenSSL/0.9.7a zlib/1.1.3
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
</proxy>
@@ -78,7 +75,7 @@ Proxy-Connection: Keep-Alive
GET /we/want/that/page/80 HTTP/1.1
Host: test.80:%HTTPPORT
Authorization: Basic aWFtOm15c2VsZg==
-User-Agent: curl/7.10.7-pre2 (i686-pc-linux-gnu) libcurl/7.10.7-pre2 OpenSSL/0.9.7a zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test81 b/tests/data/test81
index 29e558d9..6a491255 100644
--- a/tests/data/test81
+++ b/tests/data/test81
@@ -82,21 +82,18 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://%HOSTIP:%HTTPPORT/81 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Proxy-Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://%HOSTIP:%HTTPPORT/81 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test82 b/tests/data/test82
index 88d5da84..138c8ee4 100644
--- a/tests/data/test82
+++ b/tests/data/test82
@@ -41,14 +41,11 @@ http://%HOSTIP:%HTTPPORT/82 --proxy-user testuser:testpass -x http://%HOSTIP:%HT
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://%HOSTIP:%HTTPPORT/82 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Proxy-Authorization: Basic dGVzdHVzZXI6dGVzdHBhc3M=
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test83 b/tests/data/test83
index 400e0a0f..6d7446d1 100644
--- a/tests/data/test83
+++ b/tests/data/test83
@@ -60,13 +60,10 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<proxy>
CONNECT test.83:%HTTPPORT HTTP/1.1
Host: test.83:%HTTPPORT
-User-Agent: curl/7.10.7-pre2 (i686-pc-linux-gnu) libcurl/7.10.7-pre2 OpenSSL/0.9.7a zlib/1.1.3
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
</proxy>
@@ -74,7 +71,7 @@ Proxy-Connection: Keep-Alive
GET /we/want/that/page/83 HTTP/1.1
Host: test.83:%HTTPPORT
Authorization: Basic aWFtOm15OjtzZWxm
-User-Agent: curl/7.10.7-pre2 (i686-pc-linux-gnu) libcurl/7.10.7-pre2 OpenSSL/0.9.7a zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test84 b/tests/data/test84
index 4cfde6db..37533e00 100644
--- a/tests/data/test84
+++ b/tests/data/test84
@@ -41,14 +41,11 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://%HOSTIP:%HTTPPORT/we/want/that/page/84 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Basic aWFtOm15c2VsZg==
-User-Agent: curl/7.10.7-pre2 (i686-pc-linux-gnu) libcurl/7.10.7-pre2 OpenSSL/0.9.7a zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test85 b/tests/data/test85
index 8b4cd6ab..ebdc3705 100644
--- a/tests/data/test85
+++ b/tests/data/test85
@@ -44,15 +44,12 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://%HOSTIP:%HTTPPORT/we/want/that/page/85 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Proxy-Authorization: Basic dGVzdGluZzp0aGlz
Authorization: Basic aWFtOm15c2VsZg==
-User-Agent: curl/7.10.7-pre2 (i686-pc-linux-gnu) libcurl/7.10.7-pre2 OpenSSL/0.9.7a zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test86 b/tests/data/test86
index a69509ae..26b66c43 100644
--- a/tests/data/test86
+++ b/tests/data/test86
@@ -64,23 +64,20 @@ HTTP, urlglob []-retrieval and -o #[num] usage
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /860001 HTTP/1.1
-User-Agent: curl/7.10.7-pre4 (i686-pc-linux-gnu) libcurl/7.10.7-pre4 OpenSSL/0.9.7a ipv6 zlib/1.1.3 GSS
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /860002 HTTP/1.1
-User-Agent: curl/7.10.7-pre4 (i686-pc-linux-gnu) libcurl/7.10.7-pre4 OpenSSL/0.9.7a ipv6 zlib/1.1.3 GSS
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /860003 HTTP/1.1
-User-Agent: curl/7.10.7-pre4 (i686-pc-linux-gnu) libcurl/7.10.7-pre4 OpenSSL/0.9.7a ipv6 zlib/1.1.3 GSS
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test88 b/tests/data/test88
index e2d019c0..40b0e8f4 100644
--- a/tests/data/test88
+++ b/tests/data/test88
@@ -75,19 +75,17 @@ four is the number of lines
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
PUT /88 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 0
PUT /88 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="testrealm", nonce="1053604145", uri="/88", response="78a49fa53d0c228778297687d4168e71"
-User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 85
Expect: 100-continue
diff --git a/tests/data/test89 b/tests/data/test89
index fc620cb2..0537fa5d 100644
--- a/tests/data/test89
+++ b/tests/data/test89
@@ -115,32 +115,29 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /89 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
GET /89 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
GET /you/890010 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-User-Agent: curl/7.10.8-pre1 (i686-pc-linux-gnu) libcurl/7.10.8-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3 GSS
+User-Agent: curl/%VERSION
Accept: */*
GET /you/890010 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADYzMjE3MzIxAAAAAAAAAAAAAAAAAAAAAEcJ4YHOeb5ga2TCPwDhkyUIuHjBUHcLaHRlc3R1c2VyY3VybGhvc3Q=
-User-Agent: curl/7.10.8-pre1 (i686-pc-linux-gnu) libcurl/7.10.8-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3 GSS
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test9 b/tests/data/test9
index 53fe25ed..adef6941 100644
--- a/tests/data/test9
+++ b/tests/data/test9
@@ -40,12 +40,12 @@ bar
# Verify data after the test has been "shot"
<verify>
<strip>
-^(User-Agent:|Content-Type: multipart/form-data;|------------).*
+^(Content-Type: multipart/form-data;|------------).*
</strip>
<protocol>
POST /we/want/9 HTTP/1.1
-User-Agent: curl/7.10.4 (i686-pc-linux-gnu) libcurl/7.10.4 OpenSSL/0.9.7a ipv6 zlib/1.1.3
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 407
Content-Type: multipart/form-data; boundary=----------------------------9ef8d6205763
diff --git a/tests/data/test90 b/tests/data/test90
index d40b5a57..91d569d0 100644
--- a/tests/data/test90
+++ b/tests/data/test90
@@ -153,40 +153,39 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /90 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /90 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
GET /90 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
GET /you/900010 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /you/900010 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-User-Agent: curl/7.10.8-pre1 (i686-pc-linux-gnu) libcurl/7.10.8-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3 GSS
+User-Agent: curl/%VERSION
Accept: */*
GET /you/900010 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADYzMjE3MzIxAAAAAAAAAAAAAAAAAAAAAEcJ4YHOeb5ga2TCPwDhkyUIuHjBUHcLaHRlc3R1c2VyY3VybGhvc3Q=
-User-Agent: curl/7.10.8-pre1 (i686-pc-linux-gnu) libcurl/7.10.8-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3 GSS
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test91 b/tests/data/test91
index 4942bfdd..314a6551 100644
--- a/tests/data/test91
+++ b/tests/data/test91
@@ -99,25 +99,22 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /91 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
GET /91 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
GET /91 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAgACABwAAAABgAGAHgAAAAIAAgAfgAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAAKBS3rdGYZEGsqW8otYHWXWBxC5mCuFmYm15ZG9tYWlubXlzZWxmY3VybGhvc3Q=
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test92 b/tests/data/test92
index 728d271b..7e03f0a1 100644
--- a/tests/data/test92
+++ b/tests/data/test92
@@ -54,13 +54,11 @@ http://%HOSTIP:%HTTPPORT/want/92 -C 87
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/92 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Range: bytes=87-
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test93 b/tests/data/test93
index 58e47bc6..684e56cd 100644
--- a/tests/data/test93
+++ b/tests/data/test93
@@ -39,12 +39,10 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://%HOSTIP:%HTTPPORT/93 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test94 b/tests/data/test94
index 4ca53c63..6d54e787 100644
--- a/tests/data/test94
+++ b/tests/data/test94
@@ -45,13 +45,10 @@ https://test.anything.really.com:94 --proxy1.0 %HOSTIP:%HTTPPORT
<errorcode>
56
</errorcode>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
CONNECT test.anything.really.com:94 HTTP/1.0
-User-Agent: curl/7.11.0-CVS (i686-pc-linux-gnu) libcurl/7.11.0-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4
Host: test.anything.really.com:94
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
</protocol>
diff --git a/tests/data/test95 b/tests/data/test95
index afc00aed..0b16c3cd 100644
--- a/tests/data/test95
+++ b/tests/data/test95
@@ -60,20 +60,17 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<proxy>
CONNECT test.95:%HTTPPORT HTTP/1.1
-User-Agent: curl/7.10.7-pre2 (i686-pc-linux-gnu) libcurl/7.10.7-pre2 OpenSSL/0.9.7a zlib/1.1.3
Host: test.95:%HTTPPORT
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
</proxy>
<protocol nonewline="yes">
POST /we/want/that/page/95 HTTP/1.1
-User-Agent: curl/7.10.7-pre2 (i686-pc-linux-gnu) libcurl/7.10.7-pre2 OpenSSL/0.9.7a zlib/1.1.3
Host: test.95:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 27
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test97 b/tests/data/test97
index c1065bb1..d7694119 100644
--- a/tests/data/test97
+++ b/tests/data/test97
@@ -36,12 +36,10 @@ HTTP POST with custom content-type
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol nonewline="yes">
POST /97 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Type: silly/type
Content-Length: 14
diff --git a/tests/data/test970 b/tests/data/test970
index c0a88a79..ab1fc53a 100644
--- a/tests/data/test970
+++ b/tests/data/test970
@@ -51,17 +51,15 @@ http://%HOSTIP:%HTTPPORT/970 --write-out '%{json}' -o log/out970
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /970 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
<stdout nonewline="yes">
-{"url_effective":"http://%HOSTIP:%HTTPPORT/970","method":"GET","http_code":200,"response_code":200,"http_connect":0,"time_total":0.000013,"time_namelookup":0.000013,"time_connect":0.000013,"time_appconnect":0.000013,"time_pretransfer":0.000013,"time_starttransfer":0.000013,"size_header":4019,"size_request":4019,"size_download":445,"size_upload":0,"speed_download":13,"speed_upload":13,"content_type":"text/html","num_connects":1,"time_redirect":0.000013,"num_redirects":0,"ssl_verify_result":0,"proxy_ssl_verify_result":0,"filename_effective":"log/out970","remote_ip":"%HOSTIP","remote_port":%HTTPPORT,"local_ip":"127.0.0.1","local_port":13,"http_version":"1.1","scheme":"HTTP","curl_version":"curl-unit-test-fake-version"}
+{"url_effective":"http://%HOSTIP:%HTTPPORT/970","method":"GET","http_code":200,"response_code":200,"num_headers":9,"http_connect":0,"time_total":0.000013,"time_namelookup":0.000013,"time_connect":0.000013,"time_appconnect":0.000013,"time_pretransfer":0.000013,"time_starttransfer":0.000013,"size_header":4019,"size_request":4019,"size_download":445,"size_upload":0,"speed_download":13,"speed_upload":13,"content_type":"text/html","num_connects":1,"time_redirect":0.000013,"num_redirects":0,"ssl_verify_result":0,"proxy_ssl_verify_result":0,"filename_effective":"log/out970","remote_ip":"%HOSTIP","remote_port":%HTTPPORT,"local_ip":"127.0.0.1","local_port":13,"http_version":"1.1","scheme":"HTTP","curl_version":"curl-unit-test-fake-version"}
</stdout>
</verify>
</testcase>
diff --git a/tests/data/test971 b/tests/data/test971
index de134e8e..dada9200 100644
--- a/tests/data/test971
+++ b/tests/data/test971
@@ -22,4 +22,9 @@ Verify that options-in-versions and docs/cmdline-opts are in sync
</command>
</client>
+<verify>
+<stderr>
+ok
+</stderr>
+</verify>
</testcase>
diff --git a/tests/data/test98 b/tests/data/test98
index b6d1182c..ef0cded2 100644
--- a/tests/data/test98
+++ b/tests/data/test98
@@ -39,12 +39,10 @@ data on stdin
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
PUT /98 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 14
Expect: 100-continue
diff --git a/tests/data/test99 b/tests/data/test99
index 9797600c..2bbee780 100644
--- a/tests/data/test99
+++ b/tests/data/test99
@@ -55,13 +55,11 @@ http://%HOSTIP:%HTTPPORT/99 -C 9999999999
<errorcode>
33
</errorcode>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /99 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Range: bytes=9999999999-
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/ftpserver.pl b/tests/ftpserver.pl
index d587f453..198ccd79 100755
--- a/tests/ftpserver.pl
+++ b/tests/ftpserver.pl
@@ -145,6 +145,7 @@ my $nodataconn; # set if ftp srvr doesn't establish or accepts data channel
my $nodataconn425; # set if ftp srvr doesn't establish data ch and replies 425
my $nodataconn421; # set if ftp srvr doesn't establish data ch and replies 421
my $nodataconn150; # set if ftp srvr doesn't establish data ch and replies 150
+my $storeresp;
my @capabilities; # set if server supports capability commands
my @auth_mechs; # set if server supports authentication commands
my %fulltextreply; #
@@ -2413,6 +2414,10 @@ sub STOR_ftp {
logmsg "No support for: $line";
last;
}
+ if($storeresp) {
+ # abort early
+ last;
+ }
}
if($nosave) {
print FILE "$ulsize bytes would've been stored here\n";
@@ -2420,7 +2425,12 @@ sub STOR_ftp {
close(FILE);
close_dataconn($disc);
logmsg "received $ulsize bytes upload\n";
- sendcontrol "226 File transfer complete\r\n";
+ if($storeresp) {
+ sendcontrol "$storeresp\r\n";
+ }
+ else {
+ sendcontrol "226 File transfer complete\r\n";
+ }
return 0;
}
@@ -2784,6 +2794,7 @@ sub customize {
$nodataconn425 = 0; # default is to not send 425 without data channel
$nodataconn421 = 0; # default is to not send 421 without data channel
$nodataconn150 = 0; # default is to not send 150 without data channel
+ $storeresp = ""; # send as ultimate STOR response
@capabilities = (); # default is to not support capability commands
@auth_mechs = (); # default is to not support authentication commands
%fulltextreply = ();#
@@ -2866,6 +2877,10 @@ sub customize {
logmsg "FTPD: instructed to use NODATACONN\n";
$nodataconn=1;
}
+ elsif($_ =~ /^STOR (.*)/) {
+ $storeresp=$1;
+ logmsg "FTPD: instructed to use respond to STOR with '$storeresp'\n";
+ }
elsif($_ =~ /CAPA (.*)/) {
logmsg "FTPD: instructed to support CAPABILITY command\n";
@capabilities = split(/ (?!(?:[^" ]|[^"] [^"])+")/, $1);
diff --git a/tests/getpart.pm b/tests/getpart.pm
index 9519888e..2162129d 100644
--- a/tests/getpart.pm
+++ b/tests/getpart.pm
@@ -28,12 +28,7 @@ my $xmlfile;
my $warning=0;
my $trace=0;
-sub decode_base64 {
- tr:A-Za-z0-9+/::cd; # remove non-base64 chars
- tr:A-Za-z0-9+/: -_:; # convert to uuencoded format
- my $len = pack("c", 32 + 0.75*length); # compute length byte
- return unpack("u", $len . $_); # uudecode and print
-}
+use MIME::Base64;
sub decode_hex {
my $s = $_;
diff --git a/tests/libtest/Makefile.inc b/tests/libtest/Makefile.inc
index 2c9c6653..98fd2ee9 100644
--- a/tests/libtest/Makefile.inc
+++ b/tests/libtest/Makefile.inc
@@ -39,7 +39,7 @@ noinst_PROGRAMS = chkhostname libauthretry libntlmconnect \
chkdecimalpoint \
lib500 lib501 lib502 lib503 lib504 lib505 lib506 lib507 lib508 lib509 \
lib510 lib511 lib512 lib513 lib514 lib515 lib516 lib517 lib518 lib519 \
- lib520 lib521 lib523 lib524 lib525 lib526 lib527 lib529 lib530 lib532 \
+ lib520 lib521 lib523 lib524 lib525 lib526 lib527 lib529 lib532 \
lib533 lib537 lib539 lib540 lib541 lib542 lib543 lib544 lib545 \
lib547 lib548 lib549 lib552 lib553 lib554 lib555 lib556 lib557 lib558 \
lib559 lib560 lib562 lib564 lib565 lib566 lib567 lib568 lib569 lib570 \
@@ -54,18 +54,18 @@ noinst_PROGRAMS = chkhostname libauthretry libntlmconnect \
lib1518 lib1520 lib1521 lib1522 lib1523 \
lib1525 lib1526 lib1527 lib1528 lib1529 lib1530 lib1531 lib1532 lib1533 \
lib1534 lib1535 lib1536 lib1537 lib1538 lib1539 \
- lib1540 lib1541 \
+ lib1540 \
lib1550 lib1551 lib1552 lib1553 lib1554 lib1555 lib1556 lib1557 \
lib1558 lib1559 lib1560 lib1564 lib1565 lib1567 \
lib1591 lib1592 lib1593 lib1594 lib1596 \
- lib1900 lib1905 lib1906 lib1907 lib1908 lib1910 \
- lib2033 lib3010
+ lib1905 lib1906 lib1907 lib1908 lib1910 lib1911 lib1912 lib1913 \
+ lib3010
chkdecimalpoint_SOURCES = chkdecimalpoint.c ../../lib/mprintf.c \
../../lib/curl_ctype.c ../../lib/dynbuf.c ../../lib/strdup.c
chkdecimalpoint_LDADD =
chkdecimalpoint_CPPFLAGS = $(AM_CPPFLAGS) -DCURL_STATICLIB \
- -DCURLX_NO_MEMORY_CALLBACKS
+ -DCURLX_NO_MEMORY_CALLBACKS -DBUILDING_LIBCURL
chkhostname_SOURCES = chkhostname.c ../../lib/curl_gethostname.c
chkhostname_LDADD = @CURL_NETWORK_LIBS@
@@ -172,10 +172,6 @@ lib529_SOURCES = lib525.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS) $(MULTIBYTE)
lib529_LDADD = $(TESTUTIL_LIBS)
lib529_CPPFLAGS = $(AM_CPPFLAGS) -DLIB529
-lib530_SOURCES = lib530.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
-lib530_LDADD = $(TESTUTIL_LIBS)
-lib530_CPPFLAGS = $(AM_CPPFLAGS) -DLIB530
-
lib532_SOURCES = lib526.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib532_LDADD = $(TESTUTIL_LIBS)
lib532_CPPFLAGS = $(AM_CPPFLAGS) -DLIB532
@@ -554,10 +550,6 @@ lib1540_SOURCES = lib1540.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib1540_LDADD = $(TESTUTIL_LIBS)
lib1540_CPPFLAGS = $(AM_CPPFLAGS)
-lib1541_SOURCES = lib1541.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
-lib1541_LDADD = $(TESTUTIL_LIBS)
-lib1541_CPPFLAGS = $(AM_CPPFLAGS)
-
lib1550_SOURCES = lib1550.c $(SUPPORTFILES)
lib1550_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1517
@@ -625,10 +617,6 @@ lib1596_SOURCES = lib1594.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib1596_LDADD = $(TESTUTIL_LIBS)
lib1596_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1596
-lib1900_SOURCES = lib1900.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS) $(MULTIBYTE)
-lib1900_LDADD = $(TESTUTIL_LIBS)
-lib1900_CPPFLAGS = $(AM_CPPFLAGS)
-
lib1905_SOURCES = lib1905.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib1905_LDADD = $(TESTUTIL_LIBS)
lib1905_CPPFLAGS = $(AM_CPPFLAGS)
@@ -649,9 +637,17 @@ lib1910_SOURCES = lib1910.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib1910_LDADD = $(TESTUTIL_LIBS)
lib1910_CPPFLAGS = $(AM_CPPFLAGS)
-lib2033_SOURCES = libntlmconnect.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
-lib2033_LDADD = $(TESTUTIL_LIBS)
-lib2033_CPPFLAGS = $(AM_CPPFLAGS) -DUSE_PIPELINING
+lib1911_SOURCES = lib1911.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib1911_LDADD = $(TESTUTIL_LIBS)
+lib1911_CPPFLAGS = $(AM_CPPFLAGS)
+
+lib1912_SOURCES = lib1912.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib1912_LDADD = $(TESTUTIL_LIBS)
+lib1912_CPPFLAGS = $(AM_CPPFLAGS)
+
+lib1913_SOURCES = lib1913.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib1913_LDADD = $(TESTUTIL_LIBS)
+lib1913_CPPFLAGS = $(AM_CPPFLAGS)
lib3010_SOURCES = lib3010.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib3010_LDADD = $(TESTUTIL_LIBS)
diff --git a/tests/libtest/lib1538.c b/tests/libtest/lib1538.c
index 91481e88..0f91e2f0 100644
--- a/tests/libtest/lib1538.c
+++ b/tests/libtest/lib1538.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -31,12 +31,12 @@ int test(char *URL)
CURLSHcode shareret;
(void)URL;
- curl_easy_strerror(INT_MAX);
- curl_multi_strerror(INT_MAX);
- curl_share_strerror(INT_MAX);
- curl_easy_strerror(-INT_MAX);
- curl_multi_strerror(-INT_MAX);
- curl_share_strerror(-INT_MAX);
+ curl_easy_strerror((CURLcode)INT_MAX);
+ curl_multi_strerror((CURLMcode)INT_MAX);
+ curl_share_strerror((CURLSHcode)INT_MAX);
+ curl_easy_strerror((CURLcode)-INT_MAX);
+ curl_multi_strerror((CURLMcode)-INT_MAX);
+ curl_share_strerror((CURLSHcode)-INT_MAX);
for(easyret = CURLE_OK; easyret <= CURL_LAST; easyret++) {
printf("e%d: %s\n", (int)easyret, curl_easy_strerror(easyret));
}
diff --git a/tests/libtest/lib1541.c b/tests/libtest/lib1541.c
deleted file mode 100644
index f3b41f5b..00000000
--- a/tests/libtest/lib1541.c
+++ /dev/null
@@ -1,151 +0,0 @@
-/***************************************************************************
- * _ _ ____ _
- * Project ___| | | | _ \| |
- * / __| | | | |_) | |
- * | (__| |_| | _ <| |___
- * \___|\___/|_| \_\_____|
- *
- * Copyright (C) 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
- *
- * This software is licensed as described in the file COPYING, which
- * you should have received as part of this distribution. The terms
- * are also available at https://curl.haxx.se/docs/copyright.html.
- *
- * You may opt to use, copy, modify, merge, publish, distribute and/or sell
- * copies of the Software, and permit persons to whom the Software is
- * furnished to do so, under the terms of the COPYING file.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ***************************************************************************/
-#include "test.h"
-
-#include "testutil.h"
-#include "warnless.h"
-#include "memdebug.h"
-
-#ifdef HAVE_PTHREAD_H
-#include <pthread.h>
-#include <time.h>
-
-/* number of threads to fire up in parallel */
-#define NUM_THREADS 67
-
-/* for how many seconds each thread will loop */
-#define RUN_FOR_SECONDS 7
-
-static pthread_mutex_t connlock;
-
-static size_t write_db(void *ptr, size_t size, size_t nmemb, void *data)
-{
- /* not interested in the downloaded bytes, return the size */
- (void)ptr; /* unused */
- (void)data; /* unused */
- return (size_t)(size * nmemb);
-}
-
-static void lock_cb(CURL *handle, curl_lock_data data,
- curl_lock_access access, void *userptr)
-{
- (void)access; /* unused */
- (void)userptr; /* unused */
- (void)handle; /* unused */
- (void)data; /* unused */
- pthread_mutex_lock(&connlock);
-}
-
-static void unlock_cb(CURL *handle, curl_lock_data data,
- void *userptr)
-{
- (void)userptr; /* unused */
- (void)handle; /* unused */
- (void)data; /* unused */
- pthread_mutex_unlock(&connlock);
-}
-
-static void init_locks(void)
-{
- pthread_mutex_init(&connlock, NULL);
-}
-
-static void kill_locks(void)
-{
- pthread_mutex_destroy(&connlock);
-}
-
-struct initurl {
- const char *url;
- CURLSH *share;
- int threadno;
-};
-
-static void *run_thread(void *ptr)
-{
- struct initurl *u = (struct initurl *)ptr;
- int i;
- time_t end = time(NULL) + RUN_FOR_SECONDS;
-
- for(i = 0; time(NULL) < end; i++) {
- CURL *curl = curl_easy_init();
- curl_easy_setopt(curl, CURLOPT_URL, u->url);
- curl_easy_setopt(curl, CURLOPT_VERBOSE, 0L);
- curl_easy_setopt(curl, CURLOPT_SHARE, u->share);
- curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_db);
- curl_easy_perform(curl); /* ignores error */
- curl_easy_cleanup(curl);
- fprintf(stderr, "Thread %d transfer %d\n", u->threadno, i);
- }
-
- return NULL;
-}
-
-int test(char *URL)
-{
- pthread_t tid[NUM_THREADS];
- int i;
- CURLSH *share;
- struct initurl url[NUM_THREADS];
-
- /* Must initialize libcurl before any threads are started */
- curl_global_init(CURL_GLOBAL_ALL);
-
- share = curl_share_init();
- curl_share_setopt(share, CURLSHOPT_LOCKFUNC, lock_cb);
- curl_share_setopt(share, CURLSHOPT_UNLOCKFUNC, unlock_cb);
- curl_share_setopt(share, CURLSHOPT_SHARE, CURL_LOCK_DATA_CONNECT);
-
- init_locks();
-
- for(i = 0; i< NUM_THREADS; i++) {
- int error;
- url[i].url = URL;
- url[i].share = share;
- url[i].threadno = i;
- error = pthread_create(&tid[i], NULL, run_thread, &url[i]);
- if(0 != error)
- fprintf(stderr, "Couldn't run thread number %d, errno %d\n", i, error);
- else
- fprintf(stderr, "Thread %d, gets %s\n", i, URL);
- }
-
- /* now wait for all threads to terminate */
- for(i = 0; i< NUM_THREADS; i++) {
- pthread_join(tid[i], NULL);
- fprintf(stderr, "Thread %d terminated\n", i);
- }
-
- kill_locks();
-
- curl_share_cleanup(share);
- curl_global_cleanup();
- return 0;
-}
-
-#else /* without pthread, this test doesn't work */
-int test(char *URL)
-{
- (void)URL;
- return 0;
-}
-#endif
diff --git a/tests/libtest/lib1560.c b/tests/libtest/lib1560.c
index d158534d..cc61199e 100644
--- a/tests/libtest/lib1560.c
+++ b/tests/libtest/lib1560.c
@@ -638,7 +638,7 @@ static CURLUPart part2id(char *part)
return CURLUPART_FRAGMENT;
if(!strcmp("zoneid", part))
return CURLUPART_ZONEID;
- return 9999; /* bad input => bad output */
+ return (CURLUPart)9999; /* bad input => bad output */
}
static CURLUcode updateurl(CURLU *u, const char *cmd, unsigned int setflags)
@@ -686,6 +686,14 @@ static CURLUcode updateurl(CURLU *u, const char *cmd, unsigned int setflags)
}
static struct redircase set_url_list[] = {
+ {"http://example.org/static/favicon/wikipedia.ico",
+ "//fake.example.com/licenses/by-sa/3.0/",
+ "http://fake.example.com/licenses/by-sa/3.0/",
+ 0, 0, 0},
+ {"https://example.org/static/favicon/wikipedia.ico",
+ "//fake.example.com/licenses/by-sa/3.0/",
+ "https://fake.example.com/licenses/by-sa/3.0/",
+ 0, 0, 0},
{"file://localhost/path?query#frag",
"foo#another",
"file:///foo#another",
diff --git a/tests/libtest/lib1592.c b/tests/libtest/lib1592.c
index 5e6bf04e..34901d20 100644
--- a/tests/libtest/lib1592.c
+++ b/tests/libtest/lib1592.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -43,7 +43,8 @@ int test(char *URL)
int stillRunning;
CURLM *multiHandle = NULL;
CURL *curl = NULL;
- CURLMcode res = CURLM_OK;
+ CURLcode res = CURLE_OK;
+ CURLMcode mres;
int timeout;
global_init(CURL_GLOBAL_ALL);
@@ -97,10 +98,11 @@ int test(char *URL)
/* Start measuring how long it takes to remove the handle. */
fprintf(stderr, "curl_multi_remove_handle()...\n");
start_test_timing();
- res = curl_multi_remove_handle(multiHandle, curl);
- if(res) {
+ mres = curl_multi_remove_handle(multiHandle, curl);
+ if(mres) {
fprintf(stderr, "curl_multi_remove_handle() failed, "
"with code %d\n", (int)res);
+ res = TEST_ERR_MULTI;
goto test_cleanup;
}
fprintf(stderr, "curl_multi_remove_handle() succeeded\n");
diff --git a/tests/libtest/lib1900.c b/tests/libtest/lib1900.c
deleted file mode 100644
index fd7e5bc6..00000000
--- a/tests/libtest/lib1900.c
+++ /dev/null
@@ -1,248 +0,0 @@
-/***************************************************************************
- * _ _ ____ _
- * Project ___| | | | _ \| |
- * / __| | | | |_) | |
- * | (__| |_| | _ <| |___
- * \___|\___/|_| \_\_____|
- *
- * Copyright (C) 2013 - 2020, Linus Nielsen Feltzing, <linus@haxx.se>
- *
- * This software is licensed as described in the file COPYING, which
- * you should have received as part of this distribution. The terms
- * are also available at https://curl.haxx.se/docs/copyright.html.
- *
- * You may opt to use, copy, modify, merge, publish, distribute and/or sell
- * copies of the Software, and permit persons to whom the Software is
- * furnished to do so, under the terms of the COPYING file.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ***************************************************************************/
-#include "test.h"
-
-#include "testutil.h"
-#include "warnless.h"
-#include "memdebug.h"
-
-#define TEST_HANG_TIMEOUT 60 * 1000
-#define MAX_URLS 200
-#define MAX_BLOCKLIST 20
-
-static int urltime[MAX_URLS];
-static char *urlstring[MAX_URLS];
-static CURL *handles[MAX_URLS];
-static char *site_blocklist[MAX_BLOCKLIST];
-static char *server_blocklist[MAX_BLOCKLIST];
-static int num_handles;
-static int blocklist_num_servers;
-static int blocklist_num_sites;
-
-static size_t
-write_callback(void *contents, size_t size, size_t nmemb, void *userp)
-{
- size_t realsize = size * nmemb;
- (void)contents;
- (void)userp;
-
- return realsize;
-}
-
-static int parse_url_file(const char *filename)
-{
- FILE *f;
- int filetime;
- char buf[200];
-
- num_handles = 0;
- blocklist_num_sites = 0;
- blocklist_num_servers = 0;
-
- f = fopen(filename, "rb");
- if(!f)
- return 0;
-
- while(!feof(f)) {
- if(fscanf(f, "%d %199s\n", &filetime, buf)) {
- urltime[num_handles] = filetime;
- urlstring[num_handles] = strdup(buf);
- num_handles++;
- continue;
- }
-
- if(fscanf(f, "blocklist_site %199s\n", buf)) {
- site_blocklist[blocklist_num_sites] = strdup(buf);
- blocklist_num_sites++;
- continue;
- }
-
- break;
- }
- fclose(f);
-
- site_blocklist[blocklist_num_sites] = NULL;
- server_blocklist[blocklist_num_servers] = NULL;
- return num_handles;
-}
-
-static void free_urls(void)
-{
- int i;
- for(i = 0; i < num_handles; i++) {
- Curl_safefree(urlstring[i]);
- }
- for(i = 0; i < blocklist_num_servers; i++) {
- Curl_safefree(server_blocklist[i]);
- }
- for(i = 0; i < blocklist_num_sites; i++) {
- Curl_safefree(site_blocklist[i]);
- }
-}
-
-static int create_handles(void)
-{
- int i;
-
- for(i = 0; i < num_handles; i++) {
- handles[i] = curl_easy_init();
- }
- return 0;
-}
-
-static void setup_handle(char *base_url, CURLM *m, int handlenum)
-{
- char urlbuf[256];
-
- msnprintf(urlbuf, sizeof(urlbuf), "%s%s", base_url, urlstring[handlenum]);
- curl_easy_setopt(handles[handlenum], CURLOPT_URL, urlbuf);
- curl_easy_setopt(handles[handlenum], CURLOPT_VERBOSE, 1L);
- curl_easy_setopt(handles[handlenum], CURLOPT_FAILONERROR, 1L);
- curl_easy_setopt(handles[handlenum], CURLOPT_WRITEFUNCTION, write_callback);
- curl_easy_setopt(handles[handlenum], CURLOPT_WRITEDATA, NULL);
- curl_multi_add_handle(m, handles[handlenum]);
-}
-
-static void remove_handles(void)
-{
- int i;
-
- for(i = 0; i < num_handles; i++) {
- if(handles[i])
- curl_easy_cleanup(handles[i]);
- }
-}
-
-int test(char *URL)
-{
- int res = 0;
- CURLM *m = NULL;
- CURLMsg *msg; /* for picking up messages with the transfer status */
- int msgs_left; /* how many messages are left */
- int running = 0;
- int handlenum = 0;
- struct timeval last_handle_add;
-
- if(parse_url_file(libtest_arg2) <= 0)
- goto test_cleanup;
-
- start_test_timing();
-
- curl_global_init(CURL_GLOBAL_ALL);
-
- multi_init(m);
-
- create_handles();
-
- multi_setopt(m, CURLMOPT_PIPELINING, 1L);
- multi_setopt(m, CURLMOPT_MAX_HOST_CONNECTIONS, 2L);
- multi_setopt(m, CURLMOPT_MAX_PIPELINE_LENGTH, 3L);
- multi_setopt(m, CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE, 15000L);
- multi_setopt(m, CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE, 10000L);
-
- multi_setopt(m, CURLMOPT_PIPELINING_SITE_BL, site_blocklist);
- multi_setopt(m, CURLMOPT_PIPELINING_SERVER_BL, server_blocklist);
-
- last_handle_add = tutil_tvnow();
-
- for(;;) {
- struct timeval interval;
- struct timeval now;
- fd_set rd, wr, exc;
- int maxfd = -99;
- long timeout;
-
- interval.tv_sec = 1;
- interval.tv_usec = 0;
-
- if(handlenum < num_handles) {
- now = tutil_tvnow();
- if(tutil_tvdiff(now, last_handle_add) >= urltime[handlenum]) {
- fprintf(stdout, "Adding handle %d\n", handlenum);
- setup_handle(URL, m, handlenum);
- last_handle_add = now;
- handlenum++;
- }
- }
-
- curl_multi_perform(m, &running);
-
- abort_on_test_timeout();
-
- /* See how the transfers went */
- do {
- msg = curl_multi_info_read(m, &msgs_left);
- if(msg && msg->msg == CURLMSG_DONE) {
- int i;
-
- /* Find out which handle this message is about */
- for(i = 0; i < num_handles; i++) {
- int found = (msg->easy_handle == handles[i]);
- if(found)
- break;
- }
-
- printf("Handle %d Completed with status %d\n", i, msg->data.result);
- curl_multi_remove_handle(m, handles[i]);
- }
- } while(msg);
-
- if(handlenum == num_handles && !running) {
- break; /* done */
- }
-
- FD_ZERO(&rd);
- FD_ZERO(&wr);
- FD_ZERO(&exc);
-
- curl_multi_fdset(m, &rd, &wr, &exc, &maxfd);
-
- /* At this point, maxfd is guaranteed to be greater or equal than -1. */
-
- curl_multi_timeout(m, &timeout);
-
- if(timeout < 0)
- timeout = 1;
-
- interval.tv_sec = timeout / 1000;
- interval.tv_usec = (timeout % 1000) * 1000;
-
- interval.tv_sec = 0;
- interval.tv_usec = 1000;
-
- select_test(maxfd + 1, &rd, &wr, &exc, &interval);
-
- abort_on_test_timeout();
- }
-
-test_cleanup:
-
- remove_handles();
-
- /* undocumented cleanup sequence - type UB */
-
- curl_multi_cleanup(m);
- curl_global_cleanup();
-
- free_urls();
- return res;
-}
diff --git a/tests/libtest/lib1908.c b/tests/libtest/lib1908.c
index bacbc971..30e7d801 100644
--- a/tests/libtest/lib1908.c
+++ b/tests/libtest/lib1908.c
@@ -39,7 +39,22 @@ int test(char *URL)
curl_easy_setopt(hnd, CURLOPT_NOPROGRESS, 1L);
curl_easy_setopt(hnd, CURLOPT_ALTSVC, "log/altsvc-1908");
ret = curl_easy_perform(hnd);
+
+ if(!ret) {
+ /* make a copy and check that this also has alt-svc activated */
+ CURL *also = curl_easy_duphandle(hnd);
+ if(also) {
+ ret = curl_easy_perform(also);
+ /* we close the second handle first, which makes it store the alt-svc
+ file only to get overwritten when the next handle is closed! */
+ curl_easy_cleanup(also);
+ }
+ }
+
curl_easy_reset(hnd);
+
+ /* using the same file name for the alt-svc cache, this clobbers the
+ content just written from the 'also' handle */
curl_easy_cleanup(hnd);
}
curl_global_cleanup();
diff --git a/tests/libtest/lib1911.c b/tests/libtest/lib1911.c
new file mode 100644
index 00000000..3fafd286
--- /dev/null
+++ b/tests/libtest/lib1911.c
@@ -0,0 +1,87 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "test.h"
+
+#include "testutil.h"
+#include "warnless.h"
+#include "memdebug.h"
+
+/* The maximum string length limit (CURL_MAX_INPUT_LENGTH) is an internal
+ define not publicly exposed so we set our own */
+#define MAX_INPUT_LENGTH 8000000
+
+static char buffer[MAX_INPUT_LENGTH + 2];
+
+int test(char *URL)
+{
+ const struct curl_easyoption *o;
+ CURL *easy;
+ int error = 0;
+ (void)URL;
+
+ easy = curl_easy_init();
+ if(!easy)
+ return 1;
+
+ /* make it a zero terminated C string with just As */
+ memset(buffer, 'A', MAX_INPUT_LENGTH + 1);
+ buffer[MAX_INPUT_LENGTH + 1] = 0;
+
+ printf("string length: %d\n", (int)strlen(buffer));
+
+ for(o = curl_easy_option_next(NULL);
+ o;
+ o = curl_easy_option_next(o)) {
+ if(o->type == CURLOT_STRING) {
+ CURLcode result;
+ /*
+ * Whitelist string options that are safe for abuse
+ */
+ switch(o->id) {
+ case CURLOPT_PROXY_TLSAUTH_TYPE:
+ case CURLOPT_TLSAUTH_TYPE:
+ continue;
+ default:
+ /* check this */
+ break;
+ }
+
+ /* This is a string. Make sure that passing in a string longer
+ CURL_MAX_INPUT_LENGTH returns an error */
+ result = curl_easy_setopt(easy, o->id, buffer);
+ switch(result) {
+ case CURLE_BAD_FUNCTION_ARGUMENT: /* the most normal */
+ case CURLE_UNKNOWN_OPTION: /* left out from the build */
+ case CURLE_NOT_BUILT_IN: /* not supported */
+ break;
+ default:
+ /* all other return codes are unexpected */
+ fprintf(stderr, "curl_easy_setopt(%s...) returned %d\n",
+ o->name, (int)result);
+ error++;
+ break;
+ }
+ }
+ }
+ curl_easy_cleanup(easy);
+ return error;
+}
diff --git a/tests/libtest/lib1912.c b/tests/libtest/lib1912.c
new file mode 100644
index 00000000..44d09baa
--- /dev/null
+++ b/tests/libtest/lib1912.c
@@ -0,0 +1,80 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "test.h"
+
+#include "testutil.h"
+#include "warnless.h"
+#include "memdebug.h"
+
+#define print_err(name, exp) \
+ fprintf(stderr, "Type mismatch for CURLOPT_%s (expected %s)\n", name, exp);
+
+int test(char *URL)
+{
+/* Only test if GCC typechecking is available */
+ int error = 0;
+#ifdef CURLINC_TYPECHECK_GCC_H
+ const struct curl_easyoption *o;
+ for(o = curl_easy_option_next(NULL);
+ o;
+ o = curl_easy_option_next(o)) {
+ /* Test for mismatch OR missing typecheck macros */
+ if(curlcheck_long_option(o->id) !=
+ (o->type == CURLOT_LONG || o->type == CURLOT_VALUES)) {
+ print_err(o->name, "CURLOT_LONG or CURLOT_VALUES");
+ error++;
+ }
+ if(curlcheck_off_t_option(o->id) != (o->type == CURLOT_OFF_T)) {
+ print_err(o->name, "CURLOT_OFF_T");
+ error++;
+ }
+ if(curlcheck_string_option(o->id) != (o->type == CURLOT_STRING)) {
+ print_err(o->name, "CURLOT_STRING");
+ error++;
+ }
+ if(curlcheck_slist_option(o->id) != (o->type == CURLOT_SLIST)) {
+ print_err(o->name, "CURLOT_SLIST");
+ error++;
+ }
+ if(curlcheck_cb_data_option(o->id) != (o->type == CURLOT_CBPTR)) {
+ print_err(o->name, "CURLOT_CBPTR");
+ error++;
+ }
+ /* From here: only test that the type matches if macro is known */
+ if(curlcheck_write_cb_option(o->id) && (o->type != CURLOT_FUNCTION)) {
+ print_err(o->name, "CURLOT_FUNCTION");
+ error++;
+ }
+ if(curlcheck_conv_cb_option(o->id) && (o->type != CURLOT_FUNCTION)) {
+ print_err(o->name, "CURLOT_FUNCTION");
+ error++;
+ }
+ if(curlcheck_postfields_option(o->id) && (o->type != CURLOT_OBJECT)) {
+ print_err(o->name, "CURLOT_OBJECT");
+ error++;
+ }
+ /* Todo: no gcc typecheck for CURLOPTTYPE_BLOB types? */
+ }
+#endif
+ (void)URL;
+ return error;
+}
diff --git a/tests/libtest/lib1913.c b/tests/libtest/lib1913.c
new file mode 100644
index 00000000..b8ef96e3
--- /dev/null
+++ b/tests/libtest/lib1913.c
@@ -0,0 +1,48 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "test.h"
+
+#include "testutil.h"
+#include "warnless.h"
+#include "memdebug.h"
+
+int test(char *URL)
+{
+ CURLcode ret = CURLE_OK;
+ CURL *hnd;
+ start_test_timing();
+
+ curl_global_init(CURL_GLOBAL_ALL);
+
+ hnd = curl_easy_init();
+ if(hnd) {
+ curl_easy_setopt(hnd, CURLOPT_URL, URL);
+ curl_easy_setopt(hnd, CURLOPT_NOBODY, 1L);
+ if(libtest_arg2)
+ /* test1914 sets this extra arg */
+ curl_easy_setopt(hnd, CURLOPT_FILETIME, 1L);
+ ret = curl_easy_perform(hnd);
+ curl_easy_cleanup(hnd);
+ }
+ curl_global_cleanup();
+ return (int)ret;
+}
diff --git a/tests/libtest/lib505.c b/tests/libtest/lib505.c
index cc7463bd..42e0eec4 100644
--- a/tests/libtest/lib505.c
+++ b/tests/libtest/lib505.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -71,7 +71,7 @@ int test(char *URL)
return TEST_ERR_MAJOR_BAD;
}
- if(! file_info.st_size) {
+ if(!file_info.st_size) {
fprintf(stderr, "ERROR: file %s has zero size!\n", libtest_arg2);
fclose(hd_src);
return TEST_ERR_MAJOR_BAD;
diff --git a/tests/libtest/lib530.c b/tests/libtest/lib530.c
deleted file mode 100644
index 8581303a..00000000
--- a/tests/libtest/lib530.c
+++ /dev/null
@@ -1,122 +0,0 @@
-/***************************************************************************
- * _ _ ____ _
- * Project ___| | | | _ \| |
- * / __| | | | |_) | |
- * | (__| |_| | _ <| |___
- * \___|\___/|_| \_\_____|
- *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
- *
- * This software is licensed as described in the file COPYING, which
- * you should have received as part of this distribution. The terms
- * are also available at https://curl.haxx.se/docs/copyright.html.
- *
- * You may opt to use, copy, modify, merge, publish, distribute and/or sell
- * copies of the Software, and permit persons to whom the Software is
- * furnished to do so, under the terms of the COPYING file.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ***************************************************************************/
-#include "test.h"
-
-#include "testutil.h"
-#include "warnless.h"
-#include "memdebug.h"
-
-#define TEST_HANG_TIMEOUT 60 * 1000
-
-#define NUM_HANDLES 4
-
-int test(char *URL)
-{
- int res = 0;
- CURL *curl[NUM_HANDLES];
- int running;
- CURLM *m = NULL;
- int i;
- char target_url[256];
- int handles_added = 0;
-
- for(i = 0; i < NUM_HANDLES; i++)
- curl[i] = NULL;
-
- start_test_timing();
-
- global_init(CURL_GLOBAL_ALL);
-
- multi_init(m);
-
- /* get NUM_HANDLES easy handles */
- for(i = 0; i < NUM_HANDLES; i++) {
- /* get an easy handle */
- easy_init(curl[i]);
- /* specify target */
- msnprintf(target_url, sizeof(target_url), "%s%04i", URL, i + 1);
- target_url[sizeof(target_url) - 1] = '\0';
- easy_setopt(curl[i], CURLOPT_URL, target_url);
- /* go verbose */
- easy_setopt(curl[i], CURLOPT_VERBOSE, 1L);
- /* include headers */
- easy_setopt(curl[i], CURLOPT_HEADER, 1L);
- }
-
- /* Add the first handle to multi. We do this to let libcurl detect
- that the server can do pipelining. The rest of the handles will be
- added later. */
- multi_add_handle(m, curl[handles_added++]);
-
- multi_setopt(m, CURLMOPT_PIPELINING, 1L);
-
- fprintf(stderr, "Start at URL 0\n");
-
- for(;;) {
- struct timeval interval;
- fd_set rd, wr, exc;
- int maxfd = -99;
-
- interval.tv_sec = 1;
- interval.tv_usec = 0;
-
- multi_perform(m, &running);
-
- abort_on_test_timeout();
-
- if(!running) {
- if(handles_added >= NUM_HANDLES)
- break; /* done */
-
- /* Add the rest of the handles now that the first handle has completed
- its request. */
- while(handles_added < NUM_HANDLES)
- multi_add_handle(m, curl[handles_added++]);
- }
-
- FD_ZERO(&rd);
- FD_ZERO(&wr);
- FD_ZERO(&exc);
-
- multi_fdset(m, &rd, &wr, &exc, &maxfd);
-
- /* At this point, maxfd is guaranteed to be greater or equal than -1. */
-
- select_test(maxfd + 1, &rd, &wr, &exc, &interval);
-
- abort_on_test_timeout();
- }
-
-test_cleanup:
-
- /* proper cleanup sequence - type PB */
-
- for(i = 0; i < NUM_HANDLES; i++) {
- curl_multi_remove_handle(m, curl[i]);
- curl_easy_cleanup(curl[i]);
- }
-
- curl_multi_cleanup(m);
- curl_global_cleanup();
-
- return res;
-}
diff --git a/tests/libtest/lib541.c b/tests/libtest/lib541.c
index bcbaa481..57d72041 100644
--- a/tests/libtest/lib541.c
+++ b/tests/libtest/lib541.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -63,7 +63,7 @@ int test(char *URL)
return TEST_ERR_MAJOR_BAD;
}
- if(! file_info.st_size) {
+ if(!file_info.st_size) {
fprintf(stderr, "ERROR: file %s has zero size!\n", libtest_arg2);
fclose(hd_src);
return TEST_ERR_MAJOR_BAD;
diff --git a/tests/libtest/lib556.c b/tests/libtest/lib556.c
index 0595000c..82e8b71d 100644
--- a/tests/libtest/lib556.c
+++ b/tests/libtest/lib556.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -96,7 +96,7 @@ int test(char *URL)
}
if(iolen != 0)
- res = TEST_ERR_FAILURE;
+ res = (CURLcode)TEST_ERR_FAILURE;
}
test_cleanup:
diff --git a/tests/libtest/lib583.c b/tests/libtest/lib583.c
index 86dd8b55..9091533e 100644
--- a/tests/libtest/lib583.c
+++ b/tests/libtest/lib583.c
@@ -35,7 +35,8 @@ int test(char *URL)
int stillRunning;
CURLM *multiHandle = NULL;
CURL *curl = NULL;
- CURLMcode res = CURLM_OK;
+ CURLcode res = CURLE_OK;
+ CURLMcode mres;
global_init(CURL_GLOBAL_ALL);
@@ -65,10 +66,12 @@ int test(char *URL)
fprintf(stderr, "curl_multi_perform() succeeded\n");
fprintf(stderr, "curl_multi_remove_handle()...\n");
- res = curl_multi_remove_handle(multiHandle, curl);
- if(res)
+ mres = curl_multi_remove_handle(multiHandle, curl);
+ if(mres) {
fprintf(stderr, "curl_multi_remove_handle() failed, "
- "with code %d\n", (int)res);
+ "with code %d\n", (int)mres);
+ res = TEST_ERR_MULTI;
+ }
else
fprintf(stderr, "curl_multi_remove_handle() succeeded\n");
diff --git a/tests/libtest/lib661.c b/tests/libtest/lib661.c
index a4f2c8e5..454d8f33 100644
--- a/tests/libtest/lib661.c
+++ b/tests/libtest/lib661.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/tests/libtest/mk-lib1521.pl b/tests/libtest/mk-lib1521.pl
index f4ef19fe..9b57b64e 100755
--- a/tests/libtest/mk-lib1521.pl
+++ b/tests/libtest/mk-lib1521.pl
@@ -184,13 +184,15 @@ while(<STDIN>) {
print "${pref} \"string\");\n$check";
print "${pref} NULL);\n$check";
}
- elsif($type eq "CURLOPTTYPE_LONG") {
+ elsif(($type eq "CURLOPTTYPE_LONG") ||
+ ($type eq "CURLOPTTYPE_VALUES")) {
print "${pref} 0L);\n$check";
print "${pref} 22L);\n$check";
print "${pref} LO);\n$check";
print "${pref} HI);\n$check";
}
- elsif($type eq "CURLOPTTYPE_OBJECTPOINT") {
+ elsif(($type eq "CURLOPTTYPE_OBJECTPOINT") ||
+ ($type eq "CURLOPTTYPE_CBPOINT")) {
if($name =~ /DEPENDS/) {
print "${pref} dep);\n$check";
}
@@ -244,8 +246,8 @@ while(<STDIN>) {
print "${pref} &blob);\n$check";
}
else {
- print STDERR "\n---- $type\n";
- exit; # exit to make this noticed!
+ print STDERR "\nUnknown type: $type\n";
+ exit 22; # exit to make this noticed!
}
}
elsif($_ =~ /^ CURLINFO_NONE/) {
@@ -295,7 +297,7 @@ while(<STDIN>) {
print <<FOOTER
- curl_easy_setopt(curl, 1, 0);
+ curl_easy_setopt(curl, (CURLoption)1, 0);
res = CURLE_OK;
test_cleanup:
curl_easy_cleanup(curl);
diff --git a/tests/libtest/sethostname.h b/tests/libtest/sethostname.h
index 64624e84..c61e4100 100644
--- a/tests/libtest/sethostname.h
+++ b/tests/libtest/sethostname.h
@@ -22,7 +22,7 @@
#ifdef CURL_STATICLIB
# define LIBHOSTNAME_EXTERN
-#elif defined(WIN32) || defined(__SYMBIAN32__)
+#elif defined(WIN32)
# define LIBHOSTNAME_EXTERN __declspec(dllexport)
#elif defined(CURL_HIDDEN_SYMBOLS)
# define LIBHOSTNAME_EXTERN CURL_EXTERN_SYMBOL
diff --git a/tests/libtest/test.h b/tests/libtest/test.h
index 4806375a..3e92598b 100644
--- a/tests/libtest/test.h
+++ b/tests/libtest/test.h
@@ -86,18 +86,18 @@ extern int unitfail;
** For portability reasons TEST_ERR_* values should be less than 127.
*/
-#define TEST_ERR_MAJOR_BAD 126
-#define TEST_ERR_RUNS_FOREVER 125
-#define TEST_ERR_EASY_INIT 124
-#define TEST_ERR_MULTI_INIT 123
-#define TEST_ERR_NUM_HANDLES 122
-#define TEST_ERR_SELECT 121
-#define TEST_ERR_SUCCESS 120
-#define TEST_ERR_FAILURE 119
-#define TEST_ERR_USAGE 118
-#define TEST_ERR_FOPEN 117
-#define TEST_ERR_FSTAT 116
-#define TEST_ERR_BAD_TIMEOUT 115
+#define TEST_ERR_MAJOR_BAD (CURLcode) 126
+#define TEST_ERR_RUNS_FOREVER (CURLcode) 125
+#define TEST_ERR_EASY_INIT (CURLcode) 124
+#define TEST_ERR_MULTI (CURLcode) 123
+#define TEST_ERR_NUM_HANDLES (CURLcode) 122
+#define TEST_ERR_SELECT (CURLcode) 121
+#define TEST_ERR_SUCCESS (CURLcode) 120
+#define TEST_ERR_FAILURE (CURLcode) 119
+#define TEST_ERR_USAGE (CURLcode) 118
+#define TEST_ERR_FOPEN (CURLcode) 117
+#define TEST_ERR_FSTAT (CURLcode) 116
+#define TEST_ERR_BAD_TIMEOUT (CURLcode) 115
/*
** Macros for test source code readability/maintainability.
@@ -154,7 +154,7 @@ extern int unitfail;
#define exe_multi_init(A,Y,Z) do { \
if(((A) = curl_multi_init()) == NULL) { \
fprintf(stderr, "%s:%d curl_multi_init() failed\n", (Y), (Z)); \
- res = TEST_ERR_MULTI_INIT; \
+ res = TEST_ERR_MULTI; \
} \
} while(0)
@@ -178,7 +178,7 @@ extern int unitfail;
fprintf(stderr, "%s:%d curl_easy_setopt() failed, " \
"with code %d (%s)\n", \
(Y), (Z), (int)ec, curl_easy_strerror(ec)); \
- res = (int)ec; \
+ res = ec; \
} \
} while(0)
@@ -202,7 +202,7 @@ extern int unitfail;
fprintf(stderr, "%s:%d curl_multi_setopt() failed, " \
"with code %d (%s)\n", \
(Y), (Z), (int)ec, curl_multi_strerror(ec)); \
- res = (int)ec; \
+ res = TEST_ERR_MULTI; \
} \
} while(0)
@@ -226,7 +226,7 @@ extern int unitfail;
fprintf(stderr, "%s:%d curl_multi_add_handle() failed, " \
"with code %d (%s)\n", \
(Y), (Z), (int)ec, curl_multi_strerror(ec)); \
- res = (int)ec; \
+ res = TEST_ERR_MULTI; \
} \
} while(0)
@@ -250,7 +250,7 @@ extern int unitfail;
fprintf(stderr, "%s:%d curl_multi_remove_handle() failed, " \
"with code %d (%s)\n", \
(Y), (Z), (int)ec, curl_multi_strerror(ec)); \
- res = (int)ec; \
+ res = TEST_ERR_MULTI; \
} \
} while(0)
@@ -275,7 +275,7 @@ extern int unitfail;
fprintf(stderr, "%s:%d curl_multi_perform() failed, " \
"with code %d (%s)\n", \
(Y), (Z), (int)ec, curl_multi_strerror(ec)); \
- res = (int)ec; \
+ res = TEST_ERR_MULTI; \
} \
else if(*((B)) < 0) { \
fprintf(stderr, "%s:%d curl_multi_perform() succeeded, " \
@@ -305,7 +305,7 @@ extern int unitfail;
fprintf(stderr, "%s:%d curl_multi_fdset() failed, " \
"with code %d (%s)\n", \
(Y), (Z), (int)ec, curl_multi_strerror(ec)); \
- res = (int)ec; \
+ res = TEST_ERR_MULTI; \
} \
else if(*((E)) < -1) { \
fprintf(stderr, "%s:%d curl_multi_fdset() succeeded, " \
@@ -335,7 +335,7 @@ extern int unitfail;
fprintf(stderr, "%s:%d curl_multi_timeout() failed, " \
"with code %d (%s)\n", \
(Y), (Z), (int)ec, curl_multi_strerror(ec)); \
- res = (int)ec; \
+ res = TEST_ERR_BAD_TIMEOUT; \
} \
else if(*((B)) < -1L) { \
fprintf(stderr, "%s:%d curl_multi_timeout() succeeded, " \
@@ -365,7 +365,7 @@ extern int unitfail;
fprintf(stderr, "%s:%d curl_multi_poll() failed, " \
"with code %d (%s)\n", \
(Y), (Z), (int)ec, curl_multi_strerror(ec)); \
- res = (int)ec; \
+ res = TEST_ERR_MULTI; \
} \
else if(*((E)) < 0) { \
fprintf(stderr, "%s:%d curl_multi_poll() succeeded, " \
@@ -395,7 +395,7 @@ extern int unitfail;
fprintf(stderr, "%s:%d curl_multi_wakeup() failed, " \
"with code %d (%s)\n", \
(Y), (Z), (int)ec, curl_multi_strerror(ec)); \
- res = (int)ec; \
+ res = TEST_ERR_MULTI; \
} \
} while(0)
@@ -470,7 +470,7 @@ extern int unitfail;
fprintf(stderr, "%s:%d curl_global_init() failed, " \
"with code %d (%s)\n", \
(Y), (Z), (int)ec, curl_easy_strerror(ec)); \
- res = (int)ec; \
+ res = ec; \
} \
} while(0)
diff --git a/tests/options-scan.pl b/tests/options-scan.pl
index d49352b4..22cf454c 100644
--- a/tests/options-scan.pl
+++ b/tests/options-scan.pl
@@ -101,7 +101,7 @@ for my $c (sort @cmdopts) {
versioncheck($c, $oiv{$c});
}
else {
- print STDERR "$c is in the directory but not in file!\n";
+ print STDERR "--$c is in the option directory but not in $opts!\n";
$error++;
}
}
@@ -117,4 +117,6 @@ for my $v (sort @veropts) {
}
}
+print STDERR "ok\n" if(!$error);
+
exit $error;
diff --git a/tests/runtests.1 b/tests/runtests.1
index 27ce2734..cc06d283 100644
--- a/tests/runtests.1
+++ b/tests/runtests.1
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH runtests.pl 1 "August 05, 2020" "Curl 7.72.0" "runtests"
+.TH runtests.pl 1 "August 05, 2020" "Curl 7.73.0" "runtests"
.SH NAME
runtests.pl \- run one or more test cases
diff --git a/tests/runtests.pl b/tests/runtests.pl
index a409bcc7..84feb73e 100755
--- a/tests/runtests.pl
+++ b/tests/runtests.pl
@@ -163,10 +163,11 @@ my $TELNETPORT=$noport; # TELNET server port with negotiation
my $HTTPUNIXPATH; # HTTP server Unix domain socket path
my $SSHSRVMD5 = "[uninitialized]"; # MD5 of ssh server public key
+my $VERSION; # curl's reported version number
my $srcdir = $ENV{'srcdir'} || '.';
my $CURL="../src/curl".exe_ext('TOOL'); # what curl executable to run on the tests
-my $VCURL=$CURL; # what curl binary to use to verify the servers with
+my $VCURL="curl"; # what curl binary to use to verify the servers with
# VCURL is handy to set to the system one when the one you
# just built hangs or crashes and thus prevent verification
my $DBGCURL=$CURL; #"../src/.libs/curl"; # alternative for debugging
@@ -551,7 +552,7 @@ sub checkcmd {
my ($cmd)=@_;
my @paths=(split(":", $ENV{'PATH'}), "/usr/sbin", "/usr/local/sbin",
"/sbin", "/usr/bin", "/usr/local/bin",
- "./libtest/.libs", "./libtest");
+ "$LIBDIR/.libs", "$LIBDIR");
for(@paths) {
if( -x "$_/$cmd" && ! -d "$_/$cmd") {
# executable bit but not a directory!
@@ -1448,7 +1449,7 @@ sub runhttp2server {
# don't retry if the server doesn't work
if ($doesntrun{$pidfile}) {
- return (0,0);
+ return (0, 0, 0);
}
my $pid = processexists($pidfile);
@@ -1476,9 +1477,9 @@ sub runhttp2server {
if($http2pid <= 0 || !pidexists($http2pid)) {
# it is NOT alive
- logmsg "RUN: failed to start the $srvrname server\n";
stopserver($server, "$pid2");
$doesntrun{$pidfile} = 1;
+ $http2pid = $pid2 = 0;
next;
}
$doesntrun{$pidfile} = 0;
@@ -1489,6 +1490,8 @@ sub runhttp2server {
last;
}
+ logmsg "RUN: failed to start the $srvrname server\n" if(!$http2pid);
+
return ($http2pid, $pid2, $port);
}
@@ -1529,7 +1532,7 @@ sub runhttpserver {
# don't retry if the server doesn't work
if ($doesntrun{$pidfile}) {
- return (0,0);
+ return (0, 0, 0);
}
my $pid = processexists($pidfile);
@@ -1564,7 +1567,7 @@ sub runhttpserver {
stopserver($server, "$pid2");
displaylogs($testnumcheck);
$doesntrun{$pidfile} = 1;
- return (0,0);
+ return (0, 0, 0);
}
# where is it?
@@ -1581,7 +1584,7 @@ sub runhttpserver {
stopserver($server, "$httppid $pid2");
displaylogs($testnumcheck);
$doesntrun{$pidfile} = 1;
- return (0,0);
+ return (0, 0, 0);
}
$pid2 = $pid3;
@@ -1613,7 +1616,7 @@ sub runhttpsserver {
}
if(!$stunnel) {
- return (0,0);
+ return (0, 0, 0);
}
$server = servername_id($proto, $ipvnum, $idnum);
@@ -1622,7 +1625,7 @@ sub runhttpsserver {
# don't retry if the server doesn't work
if ($doesntrun{$pidfile}) {
- return (0,0);
+ return (0, 0, 0);
}
my $pid = processexists($pidfile);
@@ -1664,33 +1667,20 @@ sub runhttpsserver {
if($httpspid <= 0 || !pidexists($httpspid)) {
# it is NOT alive
- logmsg "RUN: failed to start the $srvrname server\n";
stopserver($server, "$pid2");
displaylogs($testnumcheck);
$doesntrun{$pidfile} = 1;
- next;
- }
-
- # Server is up. Verify that we can speak to it.
- $pid3 = verifyserver($proto, $ipvnum, $idnum, $ip, $port);
- if(!$pid3) {
- logmsg "RUN: $srvrname server failed verification\n";
- # failed to talk to it properly. Kill the server and return failure
- stopserver($server, "$httpspid $pid2");
- displaylogs($testnumcheck);
- $doesntrun{$pidfile} = 1;
+ $httpspid = $pid2 = 0;
next;
}
# we have a server!
+ if($verbose) {
+ logmsg "RUN: $srvrname server is PID $httpspid port $port\n";
+ }
last;
}
- # Here pid3 is actually the pid returned by the unsecure-http server.
-
$runcert{$server} = $certfile;
-
- if($verbose) {
- logmsg "RUN: $srvrname server is PID $httpspid port $port\n";
- }
+ logmsg "RUN: failed to start the $srvrname server\n" if(!$httpspid);
return ($httpspid, $pid2, $port);
}
@@ -1720,7 +1710,7 @@ sub runhttptlsserver {
# don't retry if the server doesn't work
if ($doesntrun{$pidfile}) {
- return (0,0);
+ return (0, 0, 0);
}
my $pid = processexists($pidfile);
@@ -1750,7 +1740,6 @@ sub runhttptlsserver {
if($httptlspid <= 0 || !pidexists($httptlspid)) {
# it is NOT alive
- logmsg "RUN: failed to start the $srvrname server\n";
stopserver($server, "$pid2");
displaylogs($testnumcheck);
$doesntrun{$pidfile} = 1;
@@ -1764,6 +1753,7 @@ sub runhttptlsserver {
}
last;
}
+ logmsg "RUN: failed to start the $srvrname server\n" if(!$httptlspid);
return ($httptlspid, $pid2, $port);
}
@@ -1877,7 +1867,7 @@ sub runpingpongserver {
}
else {
print STDERR "Unsupported protocol $proto!!\n";
- return 0;
+ return (0,0);
}
return ($pid2, $ftppid);
@@ -1908,7 +1898,7 @@ sub runftpsserver {
# don't retry if the server doesn't work
if ($doesntrun{$pidfile}) {
- return (0,0);
+ return (0, 0, 0);
}
my $pid = processexists($pidfile);
@@ -1943,24 +1933,14 @@ sub runftpsserver {
if($ftpspid <= 0 || !pidexists($ftpspid)) {
# it is NOT alive
- logmsg "RUN: failed to start the $srvrname server\n";
stopserver($server, "$pid2");
displaylogs($testnumcheck);
$doesntrun{$pidfile} = 1;
+ $ftpspid = $pid2 = 0;
next;
}
- $pid3 = verifyserver($proto, $ipvnum, $idnum, $ip, $port);
- if(!$pid3) {
- logmsg "RUN: $srvrname server failed verification\n";
- # failed to talk to it properly. Kill the server and return failure
- stopserver($server, "$ftpspid $pid2");
- displaylogs($testnumcheck);
- $doesntrun{$pidfile} = 1;
- next;
- }
- # Here pid3 is actually the pid returned by the unsecure-ftp server.
-
+ $doesntrun{$pidfile} = 0;
$runcert{$server} = $certfile;
if($verbose) {
@@ -1969,6 +1949,8 @@ sub runftpsserver {
last;
}
+ logmsg "RUN: failed to start the $srvrname server\n" if(!$ftpspid);
+
return ($ftpspid, $pid2, $port);
}
@@ -2000,7 +1982,7 @@ sub runtftpserver {
# don't retry if the server doesn't work
if ($doesntrun{$pidfile}) {
- return (0,0);
+ return (0, 0, 0);
}
my $pid = processexists($pidfile);
@@ -2029,7 +2011,7 @@ sub runtftpserver {
stopserver($server, "$pid2");
displaylogs($testnumcheck);
$doesntrun{$pidfile} = 1;
- return (0,0);
+ return (0, 0, 0);
}
my $port = pidfromfile($portfile);
@@ -2042,7 +2024,7 @@ sub runtftpserver {
stopserver($server, "$tftppid $pid2");
displaylogs($testnumcheck);
$doesntrun{$pidfile} = 1;
- return (0,0);
+ return (0, 0, 0);
}
$pid2 = $pid3;
@@ -2082,7 +2064,7 @@ sub runrtspserver {
# don't retry if the server doesn't work
if ($doesntrun{$pidfile}) {
- return (0,0);
+ return (0, 0, 0);
}
my $pid = processexists($pidfile);
@@ -2111,7 +2093,7 @@ sub runrtspserver {
stopserver($server, "$pid2");
displaylogs($testnumcheck);
$doesntrun{$pidfile} = 1;
- return (0,0);
+ return (0, 0, 0);
}
my $port = pidfromfile($portfile);
@@ -2124,7 +2106,7 @@ sub runrtspserver {
stopserver($server, "$rtsppid $pid2");
displaylogs($testnumcheck);
$doesntrun{$pidfile} = 1;
- return (0,0);
+ return (0, 0, 0);
}
$pid2 = $pid3;
@@ -2157,7 +2139,7 @@ sub runsshserver {
# don't retry if the server doesn't work
if ($doesntrun{$pidfile}) {
- return (0,0);
+ return (0, 0, 0);
}
my $sshd = find_sshd();
@@ -2207,27 +2189,12 @@ sub runsshserver {
# zero pid2 above.
if($sshpid <= 0 || !pidexists($sshpid)) {
# it is NOT alive
- logmsg "RUN: failed to start the $srvrname server on $port\n";
stopserver($server, "$pid2");
$doesntrun{$pidfile} = 1;
+ $sshpid = $pid2 = 0;
next;
}
- # ssh server verification allows some extra time for the server to
- # start up and gives us the opportunity of recovering the pid from the
- # pidfile, when this verification succeeds the recovered pid is
- # assigned to pid2.
-
- my $pid3 = verifyserver($proto, $ipvnum, $idnum, $ip, $port);
- if(!$pid3) {
- logmsg "RUN: $srvrname server failed verification\n";
- # failed to fetch server pid. Kill the server and return failure
- stopserver($server, "$sshpid $pid2");
- $doesntrun{$pidfile} = 1;
- next;
- }
- $pid2 = $pid3;
-
# once it is known that the ssh server is alive, sftp server
# verification is performed actually connecting to it, authenticating
# and performing a very simple remote command. This verification is
@@ -2245,12 +2212,15 @@ sub runsshserver {
display_sshdconfig();
stopserver($server, "$sshpid $pid2");
$doesntrun{$pidfile} = 1;
+ $sshpid = $pid2 = 0;
next;
}
# we're happy, no need to loop anymore!
+ $doesntrun{$pidfile} = 0;
$wport = $port;
last;
}
+ logmsg "RUN: failed to start the $srvrname server on $port\n" if(!$sshpid);
if(!$wport) {
logmsg "RUN: couldn't start $srvrname. Tried these ports:";
@@ -2358,7 +2328,7 @@ sub runsocksserver {
# don't retry if the server doesn't work
if ($doesntrun{$pidfile}) {
- return (0,0);
+ return (0, 0, 0);
}
my $pid = processexists($pidfile);
@@ -2385,7 +2355,7 @@ sub runsocksserver {
logmsg "RUN: failed to start the $srvrname server\n";
stopserver($server, "$pid2");
$doesntrun{$pidfile} = 1;
- return (0,0);
+ return (0, 0, 0);
}
my $port = pidfromfile($portfile);
@@ -2422,7 +2392,7 @@ sub rundictserver {
# don't retry if the server doesn't work
if ($doesntrun{$pidfile}) {
- return (0,0);
+ return (0, 0, 0);
}
my $pid = processexists($pidfile);
@@ -2451,7 +2421,6 @@ sub rundictserver {
if($dictpid <= 0 || !pidexists($dictpid)) {
# it is NOT alive
- logmsg "RUN: failed to start the $srvrname server\n";
stopserver($server, "$pid2");
displaylogs($testnumcheck);
$doesntrun{$pidfile} = 1;
@@ -2465,6 +2434,7 @@ sub rundictserver {
}
last;
}
+ logmsg "RUN: failed to start the $srvrname server\n" if(!$dictpid);
return ($dictpid, $pid2, $port);
}
@@ -2494,7 +2464,7 @@ sub runsmbserver {
# don't retry if the server doesn't work
if ($doesntrun{$pidfile}) {
- return (0,0);
+ return (0, 0, 0);
}
my $pid = processexists($pidfile);
@@ -2523,7 +2493,6 @@ sub runsmbserver {
if($smbpid <= 0 || !pidexists($smbpid)) {
# it is NOT alive
- logmsg "RUN: failed to start the $srvrname server\n";
stopserver($server, "$pid2");
displaylogs($testnumcheck);
$doesntrun{$pidfile} = 1;
@@ -2537,6 +2506,7 @@ sub runsmbserver {
}
last;
}
+ logmsg "RUN: failed to start the $srvrname server\n" if(!$smbpid);
return ($smbpid, $pid2, $port);
}
@@ -2566,7 +2536,7 @@ sub runnegtelnetserver {
# don't retry if the server doesn't work
if ($doesntrun{$pidfile}) {
- return (0,0);
+ return (0, 0, 0);
}
my $pid = processexists($pidfile);
@@ -2594,7 +2564,6 @@ sub runnegtelnetserver {
if($ntelpid <= 0 || !pidexists($ntelpid)) {
# it is NOT alive
- logmsg "RUN: failed to start the $srvrname server\n";
stopserver($server, "$pid2");
displaylogs($testnumcheck);
$doesntrun{$pidfile} = 1;
@@ -2608,6 +2577,7 @@ sub runnegtelnetserver {
}
last;
}
+ logmsg "RUN: failed to start the $srvrname server\n" if(!$ntelpid);
return ($ntelpid, $pid2, $port);
}
@@ -2744,15 +2714,21 @@ sub cleardir {
my $file;
# Get all files
- opendir(DIR, $dir) ||
+ opendir(my $dh, $dir) ||
return 0; # can't open dir
- while($file = readdir(DIR)) {
- if(($file !~ /^\./)) {
- unlink("$dir/$file");
+ while($file = readdir($dh)) {
+ if(($file !~ /^(\.|\.\.)\z/)) {
+ if(-d "$dir/$file") {
+ cleardir("$dir/$file");
+ rmdir("$dir/$file");
+ }
+ else {
+ unlink("$dir/$file");
+ }
$count++;
}
}
- closedir DIR;
+ closedir $dh;
return $count;
}
@@ -2888,8 +2864,9 @@ sub checksystem {
for(@version) {
chomp;
- if($_ =~ /^curl/) {
+ if($_ =~ /^curl ([^ ]*)/) {
$curl = $_;
+ $VERSION = $1;
$curl =~ s/^(.*)(libcurl.*)/$1/g;
$libcurl = $2;
@@ -3286,6 +3263,7 @@ sub subVariables {
$$thing =~ s/${prefix}CURL/$CURL/g;
$$thing =~ s/${prefix}PWD/$pwd/g;
$$thing =~ s/${prefix}POSIX_PWD/$posix_pwd/g;
+ $$thing =~ s/${prefix}VERSION/$VERSION/g;
my $file_pwd = $pwd;
if($file_pwd !~ /^\//) {
@@ -3329,6 +3307,20 @@ sub subBase64 {
# put the result into there
$$thing =~ s/%%B64%%/$enc/;
}
+ # hex decode
+ if($$thing =~ s/%hex\[(.*)\]hex%/%%HEX%%/i) {
+ # decode %NN characters
+ my $d = $1;
+ $d =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg;
+ $$thing =~ s/%%HEX%%/$d/;
+ }
+ if($$thing =~ s/%repeat\[(\d+) x (.*)\]%/%%REPEAT%%/i) {
+ # decode %NN characters
+ my ($d, $n) = ($2, $1);
+ $d =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg;
+ my $all = $d x $n;
+ $$thing =~ s/%%REPEAT%%/$all/;
+ }
}
sub fixarray {
@@ -3528,10 +3520,10 @@ sub singletest {
# create test result in CI services
if(azure_check_environment() && $AZURE_RUN_ID) {
- $AZURE_RESULT_ID = azure_create_test_result($AZURE_RUN_ID, $testnum, $testname);
+ $AZURE_RESULT_ID = azure_create_test_result($VCURL, $AZURE_RUN_ID, $testnum, $testname);
}
elsif(appveyor_check_environment()) {
- appveyor_create_test_result($testnum, $testname);
+ appveyor_create_test_result($VCURL, $testnum, $testname);
}
# remove test server commands file before servers are started/verified
@@ -3778,6 +3770,10 @@ sub singletest {
subVariables(\$fileContent);
open(OUTFILE, ">$filename");
binmode OUTFILE; # for crapage systems, use binary
+ if($fileattr{'nonewline'}) {
+ # cut off the final newline
+ chomp($fileContent);
+ }
print OUTFILE $fileContent;
close(OUTFILE);
}
@@ -3953,11 +3949,11 @@ sub singletest {
if ($torture) {
$cmdres = torture($CMDLINE,
$testnum,
- "$gdb --directory libtest $DBGCURL -x $LOGDIR/gdbcmd");
+ "$gdb --directory $LIBDIR $DBGCURL -x $LOGDIR/gdbcmd");
}
elsif($gdbthis) {
my $GDBW = ($gdbxwin) ? "-w" : "";
- runclient("$gdb --directory libtest $DBGCURL $GDBW -x $LOGDIR/gdbcmd");
+ runclient("$gdb --directory $LIBDIR $DBGCURL $GDBW -x $LOGDIR/gdbcmd");
$cmdres=0; # makes it always continue after a debugged run
}
else {
@@ -5184,9 +5180,9 @@ disabledtests("$TESTDIR/DISABLED.local");
# Check options to this test program
#
-# Special case for CMake: replace '${TFLAGS}' by the contents of the
+# Special case for CMake: replace '$TFLAGS' by the contents of the
# environment variable (if any).
-if(@ARGV && $ARGV[-1] eq '${TFLAGS}') {
+if(@ARGV && $ARGV[-1] eq '$TFLAGS') {
pop @ARGV;
push(@ARGV, split(' ', $ENV{'TFLAGS'})) if defined($ENV{'TFLAGS'});
}
@@ -5687,7 +5683,7 @@ sub displaylogs {
#
if(azure_check_environment()) {
- $AZURE_RUN_ID = azure_create_test_run();
+ $AZURE_RUN_ID = azure_create_test_run($VCURL);
logmsg "Azure Run ID: $AZURE_RUN_ID\n" if ($verbose);
}
@@ -5715,11 +5711,11 @@ foreach $testnum (@at) {
# update test result in CI services
if(azure_check_environment() && $AZURE_RUN_ID && $AZURE_RESULT_ID) {
- $AZURE_RESULT_ID = azure_update_test_result($AZURE_RUN_ID, $AZURE_RESULT_ID, $testnum, $error,
+ $AZURE_RESULT_ID = azure_update_test_result($VCURL, $AZURE_RUN_ID, $AZURE_RESULT_ID, $testnum, $error,
$timeprepini{$testnum}, $timevrfyend{$testnum});
}
elsif(appveyor_check_environment()) {
- appveyor_update_test_result($testnum, $error, $timeprepini{$testnum}, $timevrfyend{$testnum});
+ appveyor_update_test_result($VCURL, $testnum, $error, $timeprepini{$testnum}, $timevrfyend{$testnum});
}
if($error < 0) {
@@ -5764,7 +5760,7 @@ my $sofar = time() - $start;
#
if(azure_check_environment() && $AZURE_RUN_ID) {
- $AZURE_RUN_ID = azure_update_test_run($AZURE_RUN_ID);
+ $AZURE_RUN_ID = azure_update_test_run($VCURL, $AZURE_RUN_ID);
}
# Tests done, stop the servers
diff --git a/tests/server/sockfilt.c b/tests/server/sockfilt.c
index 6b3758c9..f5281817 100644
--- a/tests/server/sockfilt.c
+++ b/tests/server/sockfilt.c
@@ -705,7 +705,7 @@ static int select_ws(int nfds, fd_set *readfds, fd_set *writefds,
if(FD_ISSET(wsasock, writefds)) {
FD_SET(wsasock, &writesock);
- wsaevents.lNetworkEvents |= FD_WRITE|FD_CONNECT;
+ wsaevents.lNetworkEvents |= FD_WRITE|FD_CONNECT|FD_CLOSE;
}
if(FD_ISSET(wsasock, exceptfds)) {
@@ -835,11 +835,11 @@ static int select_ws(int nfds, fd_set *readfds, fd_set *writefds,
FD_CLR(wsasock, readfds);
/* remove from descriptor set if not ready for write/connect */
- if(!(wsaevents.lNetworkEvents & (FD_WRITE|FD_CONNECT)))
+ if(!(wsaevents.lNetworkEvents & (FD_WRITE|FD_CONNECT|FD_CLOSE)))
FD_CLR(wsasock, writefds);
/* remove from descriptor set if not exceptional */
- if(!(wsaevents.lNetworkEvents & (FD_OOB)))
+ if(!(wsaevents.lNetworkEvents & FD_OOB))
FD_CLR(wsasock, exceptfds);
}
}
diff --git a/tests/server/util.c b/tests/server/util.c
index dccce596..7dac532d 100644
--- a/tests/server/util.c
+++ b/tests/server/util.c
@@ -167,8 +167,8 @@ void win32_init(void)
WORD wVersionRequested;
WSADATA wsaData;
int err;
- wVersionRequested = MAKEWORD(USE_WINSOCK, USE_WINSOCK);
+ wVersionRequested = MAKEWORD(2, 2);
err = WSAStartup(wVersionRequested, &wsaData);
if(err != 0) {
@@ -177,8 +177,8 @@ void win32_init(void)
exit(1);
}
- if(LOBYTE(wsaData.wVersion) != USE_WINSOCK ||
- HIBYTE(wsaData.wVersion) != USE_WINSOCK) {
+ if(LOBYTE(wsaData.wVersion) != LOBYTE(wVersionRequested) ||
+ HIBYTE(wsaData.wVersion) != HIBYTE(wVersionRequested) ) {
WSACleanup();
perror("Winsock init failed");
logmsg("No suitable winsock.dll found -- aborting");
@@ -682,13 +682,14 @@ static DWORD WINAPI main_window_loop(LPVOID lpParameter)
ZeroMemory(&wc, sizeof(wc));
wc.lpfnWndProc = (WNDPROC)main_window_proc;
wc.hInstance = (HINSTANCE)lpParameter;
- wc.lpszClassName = "MainWClass";
+ wc.lpszClassName = TEXT("MainWClass");
if(!RegisterClass(&wc)) {
perror("RegisterClass failed");
return (DWORD)-1;
}
- hidden_main_window = CreateWindowEx(0, "MainWClass", "Recv WM_CLOSE msg",
+ hidden_main_window = CreateWindowEx(0, TEXT("MainWClass"),
+ TEXT("Recv WM_CLOSE msg"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
diff --git a/tests/symbol-scan.pl b/tests/symbol-scan.pl
index 7905ee77..2b2d6278 100755
--- a/tests/symbol-scan.pl
+++ b/tests/symbol-scan.pl
@@ -176,7 +176,7 @@ if($summary) {
}
if($misses) {
- exit 2; # there are stuff to attend to!
+ exit 0; # there are stuff to attend to!
}
else {
print "OK\n";
diff --git a/tests/testcurl.1 b/tests/testcurl.1
index fb8d4396..a15bc04b 100644
--- a/tests/testcurl.1
+++ b/tests/testcurl.1
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH testcurl.pl 1 "October 22, 2016" "Curl 7.72.0" "testcurl"
+.TH testcurl.pl 1 "October 22, 2016" "Curl 7.73.0" "testcurl"
.SH NAME
testcurl.pl \- (automatically) test curl
diff --git a/tests/testcurl.pl b/tests/testcurl.pl
index 2abed9ff..16068319 100755
--- a/tests/testcurl.pl
+++ b/tests/testcurl.pl
@@ -481,21 +481,13 @@ if ($git) {
open(LOG, ">$buildlog") or die;
while (<F>) {
my $ll = $_;
- # ignore messages pertaining to third party m4 files we don't care
- next if ($ll =~ /aclocal\/gtk\.m4/);
- next if ($ll =~ /aclocal\/gtkextra\.m4/);
print $ll;
print LOG $ll;
}
close(F);
close(LOG);
- if (grepfile("^buildconf: OK", $buildlog)) {
- logit "buildconf was successful";
- }
- else {
- mydie "buildconf was NOT successful";
- }
+ logit "buildconf was successful";
}
else {
logit "buildconf was successful (dummy message)";
diff --git a/tests/unit/Makefile.am b/tests/unit/Makefile.am
index 4bcd47d2..63e11b14 100644
--- a/tests/unit/Makefile.am
+++ b/tests/unit/Makefile.am
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -48,7 +48,7 @@ AM_CPPFLAGS = -I$(top_srcdir)/include \
-I$(top_srcdir)/tests/libtest
endif
-EXTRA_DIST = Makefile.inc CMakeLists.txt
+EXTRA_DIST = Makefile.inc CMakeLists.txt README.md
CFLAGS += @CURL_CFLAG_EXTRAS@
diff --git a/tests/unit/README b/tests/unit/README.md
index 060b670c..2880d197 100644
--- a/tests/unit/README
+++ b/tests/unit/README.md
@@ -1,50 +1,44 @@
-Unit tests
-==========
+# Unit tests
-The goal is to add tests for *ALL* functions in libcurl. If functions are too
+The goal is to add tests for *all* functions in libcurl. If functions are too
big and complicated, we should split them into smaller and testable ones.
-Build Unit Tests
-================
+## Build Unit Tests
-'./configure --enable-debug' is required for the unit tests to build. To
+`./configure --enable-debug` is required for the unit tests to build. To
enable unit tests, there will be a separate static libcurl built that will be
used exclusively for linking unit test programs. Just build everything as
normal, and then you can run the unit test cases as well.
-Run Unit Tests
-==============
+## Run Unit Tests
Unit tests are run as part of the regular test suite. If you have built
everything to run unit tests, to can do 'make test' at the root level. Or you
-can 'cd tests' and 'make' and then invoke individual unit tests with
-./runtests.pl NNNN where NNNN is the specific test number.
+can `cd tests` and `make` and then invoke individual unit tests with
+`./runtests.pl NNNN` where `NNNN` is the specific test number.
-Debug Unit Tests
-================
+## Debug Unit Tests
If a specific test fails you will get told. The test case then has output left
in the log/ subdirectory, but most importantly you can re-run the test again
-using gdb by doing ./runtests.pl -g NNNN. That is, add a -g to make it start
-up gdb and run the same case using that.
+using gdb by doing `./runtests.pl -g NNNN`. That is, add a `-g` to make it
+start up gdb and run the same case using that.
-Write Unit Tests
-================
+## Write Unit Tests
We put tests that focus on an area or a specific function into a single C
source file. The source file should be named 'unitNNNN.c' where NNNN is a
-number that starts with 1300 and you can pick the next free number.
+previously unused number.
-Add your test to tests/unit/Makefile.inc (if it is a unit test).
-Add your test data to tests/data/Makefile.inc
+Add your test to `tests/unit/Makefile.inc` (if it is a unit test). Add your
+test data file name to `tests/data/Makefile.inc`
-You also need a separate file called tests/data/testNNNN (using the same
+You also need a separate file called `tests/data/testNNNN` (using the same
number) that describes your test case. See the test1300 file for inspiration
-and the tests/FILEFORMAT documentation.
+and the `tests/FILEFORMAT.md` documentation.
For the actual C file, here's a very simple example:
-
------------------------ start -------------------------------
+~~~c
#include "curlcheck.h"
#include "a libcurl header.h" /* from the lib dir */
@@ -70,5 +64,3 @@ UNITTEST_START
/* you end the test code like this: */
UNITTEST_STOP
-
------------------------ end -------------------------------
diff --git a/tests/unit/unit1300.c b/tests/unit/unit1300.c
index 3e4c33cc..3c23ab8f 100644
--- a/tests/unit/unit1300.c
+++ b/tests/unit/unit1300.c
@@ -23,11 +23,11 @@
#include "llist.h"
-static struct curl_llist llist;
+static struct Curl_llist llist;
-static struct curl_llist llist_destination;
+static struct Curl_llist llist_destination;
-static void test_curl_llist_dtor(void *key, void *value)
+static void test_Curl_llist_dtor(void *key, void *value)
{
/* used by the llist API, does nothing here */
(void)key;
@@ -36,8 +36,8 @@ static void test_curl_llist_dtor(void *key, void *value)
static CURLcode unit_setup(void)
{
- Curl_llist_init(&llist, test_curl_llist_dtor);
- Curl_llist_init(&llist_destination, test_curl_llist_dtor);
+ Curl_llist_init(&llist, test_Curl_llist_dtor);
+ Curl_llist_init(&llist_destination, test_Curl_llist_dtor);
return CURLE_OK;
}
@@ -50,14 +50,14 @@ UNITTEST_START
int unusedData_case1 = 1;
int unusedData_case2 = 2;
int unusedData_case3 = 3;
- struct curl_llist_element case1_list;
- struct curl_llist_element case2_list;
- struct curl_llist_element case3_list;
- struct curl_llist_element case4_list;
- struct curl_llist_element *head;
- struct curl_llist_element *element_next;
- struct curl_llist_element *element_prev;
- struct curl_llist_element *to_remove;
+ struct Curl_llist_element case1_list;
+ struct Curl_llist_element case2_list;
+ struct Curl_llist_element case3_list;
+ struct Curl_llist_element case4_list;
+ struct Curl_llist_element *head;
+ struct Curl_llist_element *element_next;
+ struct Curl_llist_element *element_prev;
+ struct Curl_llist_element *to_remove;
size_t llist_size = Curl_llist_count(&llist);
/**
@@ -74,8 +74,8 @@ UNITTEST_START
fail_unless(llist.size == 0, "list initial size should be zero");
fail_unless(llist.head == NULL, "list head should initiate to NULL");
fail_unless(llist.tail == NULL, "list tail should intiate to NULL");
- fail_unless(llist.dtor == test_curl_llist_dtor,
- "list dtor should initiate to test_curl_llist_dtor");
+ fail_unless(llist.dtor == test_Curl_llist_dtor,
+ "list dtor should initiate to test_Curl_llist_dtor");
/**
* testing Curl_llist_insert_next
diff --git a/tests/unit/unit1305.c b/tests/unit/unit1305.c
index 50f6da8b..e53b8fdf 100644
--- a/tests/unit/unit1305.c
+++ b/tests/unit/unit1305.c
@@ -40,7 +40,7 @@
#include "memdebug.h" /* LAST include file */
static struct Curl_easy *data;
-static struct curl_hash hp;
+static struct Curl_hash hp;
static char *data_key;
static struct Curl_dns_entry *data_node;
diff --git a/tests/unit/unit1602.c b/tests/unit/unit1602.c
index 5f1ee9f4..1898b724 100644
--- a/tests/unit/unit1602.c
+++ b/tests/unit/unit1602.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -28,7 +28,7 @@
#include "memdebug.h" /* LAST include file */
-static struct curl_hash hash_static;
+static struct Curl_hash hash_static;
static void mydtor(void *p)
{
diff --git a/tests/unit/unit1603.c b/tests/unit/unit1603.c
index c20b20b0..771ffc0f 100644
--- a/tests/unit/unit1603.c
+++ b/tests/unit/unit1603.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2015 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2015 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -28,7 +28,7 @@
#include "memdebug.h" /* LAST include file */
-static struct curl_hash hash_static;
+static struct Curl_hash hash_static;
static const int slots = 3;
static void mydtor(void *p)
diff --git a/tests/unit/unit1654.c b/tests/unit/unit1654.c
index 79e97631..6274d0af 100644
--- a/tests/unit/unit1654.c
+++ b/tests/unit/unit1654.c
@@ -54,7 +54,7 @@ UNITTEST_START
return 1;
result = Curl_altsvc_load(asi, arg);
if(result) {
- Curl_altsvc_cleanup(asi);
+ Curl_altsvc_cleanup(&asi);
return result;
}
curl = curl_easy_init();
@@ -131,7 +131,7 @@ UNITTEST_START
curl_easy_cleanup(curl);
fail:
- Curl_altsvc_cleanup(asi);
+ Curl_altsvc_cleanup(&asi);
return unitfail;
}
UNITTEST_STOP
diff --git a/winbuild/BUILD.WINDOWS.txt b/winbuild/BUILD.WINDOWS.txt
deleted file mode 100644
index 5b63bdcd..00000000
--- a/winbuild/BUILD.WINDOWS.txt
+++ /dev/null
@@ -1,130 +0,0 @@
-Building with Visual C++, prerequisites
-=======================================
-
- This document describes how to compile, build and install curl and libcurl
- from sources using the Visual C++ build tool. To build with VC++, you will
- of course have to first install VC++. The minimum required version of
- VC is 6 (part of Visual Studio 6). However using a more recent version is
- strongly recommended.
-
- VC++ is also part of the Windows Platform SDK. You do not have to install
- the full Visual Studio or Visual C++ if all you want is to build curl.
-
- The latest Platform SDK can be downloaded freely from:
-
- https://developer.microsoft.com/en-us/windows/downloads/sdk-archive
-
- If you are building with VC6 then you will also need the February 2003
- Edition of the Platform SDK which can be downloaded from:
-
- https://www.microsoft.com/en-us/download/details.aspx?id=12261
-
- If you wish to support zlib, openssl, c-ares, ssh2, you will have to download
- them separately and copy them to the deps directory as shown below:
-
- somedirectory\
- |_curl-src
- | |_winbuild
- |
- |_deps
- |_ lib
- |_ include
- |_ bin
-
- It is also possible to create the deps directory in some other random
- places and tell the Makefile its location using the WITH_DEVEL option.
-
-Building straight from git
-==========================
-
- When you check out code git and build it, as opposed from a released source
- code archive, you need to first run the "buildconf.bat" batch file (present
- in the source code root directory) to set things up.
-
-Building with Visual C++
-========================
-
-Open a Visual Studio Command prompt:
-
- Using the 'Developer Command Prompt for VS <version>' menu entry:
- where version is the Visual Studio version. The developer prompt at default
- uses the x86 mode. It is required to call Vcvarsall.bat to setup the prompt
- for the machine type you want, using Vcvarsall.bat.
- This type of command prompt may not exist in all Visual Studio versions.
-
- For more information, check:
- https://docs.microsoft.com/en-us/dotnet/framework/tools/developer-command-prompt-for-vs
- https://docs.microsoft.com/en-us/cpp/build/how-to-enable-a-64-bit-visual-cpp-toolset-on-the-command-line
-
- Using the 'VS <version> <platform> <type> Command Prompt' menu entry:
- where version is the Visual Studio version, platform is e.g. x64
- and type Native of Cross platform build. This type of command prompt
- may not exist in all Visual Studio versions.
-
- See also:
- https://msdn.microsoft.com/en-us/library/f2ccy3wt.aspx
-
-Once you are in the console, go to the winbuild directory in the Curl
-sources:
- cd curl-src\winbuild
-
-Then you can call nmake /f Makefile.vc with the desired options (see below).
-The builds will be in the top src directory, builds\ directory, in
-a directory named using the options given to the nmake call.
-
-nmake /f Makefile.vc mode=<static or dll> <options>
-
-where <options> is one or many of:
- VC=<6,7,8,9,10,11,12,14,15> - VC versions
- WITH_DEVEL=<path> - Paths for the development files (SSL, zlib, etc.)
- Defaults to sibbling directory deps: ../deps
- Libraries can be fetched at https://windows.php.net/downloads/php-sdk/deps/
- Uncompress them into the deps folder.
- WITH_SSL=<dll or static> - Enable OpenSSL support, DLL or static
- WITH_NGHTTP2=<dll or static> - Enable HTTP/2 support, DLL or static
- WITH_MBEDTLS=<dll or static> - Enable mbedTLS support, DLL or static
- WITH_CARES=<dll or static> - Enable c-ares support, DLL or static
- WITH_ZLIB=<dll or static> - Enable zlib support, DLL or static
- WITH_SSH2=<dll or static> - Enable libSSH2 support, DLL or static
- WITH_PREFIX=<dir> - Where to install the build
- ENABLE_SSPI=<yes or no> - Enable SSPI support, defaults to yes
- ENABLE_IPV6=<yes or no> - Enable IPv6, defaults to yes
- ENABLE_IDN=<yes or no> - Enable use of Windows IDN APIs, defaults to yes
- Requires Windows Vista or later
- ENABLE_SCHANNEL=<yes or no> - Enable native Windows SSL support, defaults to yes
- GEN_PDB=<yes or no> - Generate Program Database (debug symbols for release build)
- DEBUG=<yes or no> - Debug builds
- MACHINE=<x86 or x64> - Target architecture (default is x86)
- CARES_PATH=<path to cares> - Custom path for c-ares
- MBEDTLS_PATH=<path to mbedTLS> - Custom path for mbedTLS
- NGHTTP2_PATH=<path to HTTP/2> - Custom path for nghttp2
- SSH2_PATH=<path to libSSH2> - Custom path for libSSH2
- SSL_PATH=<path to OpenSSL> - Custom path for OpenSSL
- ZLIB_PATH=<path to zlib> - Custom path for zlib
-
-
-Static linking of Microsoft's C RunTime (CRT):
-==============================================
-If you are using mode=static nmake will create and link to the static build of
-libcurl but *not* the static CRT. If you must you can force nmake to link in
-the static CRT by passing RTLIBCFG=static. Typically you shouldn't use that
-option, and nmake will default to the DLL CRT. RTLIBCFG is rarely used and
-therefore rarely tested. When passing RTLIBCFG for a configuration that was
-already built but not with that option, or if the option was specified
-differently, you must destroy the build directory containing the configuration
-so that nmake can build it from scratch.
-
-Building your own application with a static libcurl
-===================================================
-When building an application that uses the static libcurl library on Windows,
-you must define CURL_STATICLIB. Otherwise the linker will look for dynamic
-import symbols.
-
-Legacy Windows and SSL
-======================
-When you build curl using the build files in this directory the default SSL
-backend will be Schannel (Windows SSPI), the native SSL library that comes
-with the Windows OS. Schannel in Windows <= XP is not able to connect to
-servers that no longer support the legacy handshakes and algorithms used by
-those versions. If you will be using curl in one of those earlier versions of
-Windows you should choose another SSL backend like OpenSSL.
diff --git a/winbuild/MakefileBuild.vc b/winbuild/MakefileBuild.vc
index eefc091a..6460e18f 100644
--- a/winbuild/MakefileBuild.vc
+++ b/winbuild/MakefileBuild.vc
@@ -620,7 +620,8 @@ CURL_FROM_LIBCURL=$(CURL_DIROBJ)\tool_hugehelp.obj \
$(CURL_DIROBJ)\warnless.obj \
$(CURL_DIROBJ)\curl_ctype.obj \
$(CURL_DIROBJ)\curl_multibyte.obj \
- $(CURL_DIROBJ)\version_win32.obj
+ $(CURL_DIROBJ)\version_win32.obj \
+ $(CURL_DIROBJ)\dynbuf.obj
$(PROGRAM_NAME): $(CURL_DIROBJ) $(CURL_FROM_LIBCURL) $(EXE_OBJS)
$(CURL_LINK) $(CURL_LFLAGS) $(CURL_LIBCURL_LIBNAME) $(WIN_LIBS) $(CURL_FROM_LIBCURL) $(EXE_OBJS)
@@ -643,6 +644,8 @@ $(CURL_DIROBJ)\curl_multibyte.obj: ../lib/curl_multibyte.c
$(CURL_CC) $(CURL_CFLAGS) /Fo"$@" ../lib/curl_multibyte.c
$(CURL_DIROBJ)\version_win32.obj: ../lib/version_win32.c
$(CURL_CC) $(CURL_CFLAGS) /Fo"$@" ../lib/version_win32.c
+$(CURL_DIROBJ)\dynbuf.obj: ../lib/dynbuf.c
+ $(CURL_CC) $(CURL_CFLAGS) /Fo"$@" ../lib/dynbuf.c
$(CURL_DIROBJ)\curl.res: $(CURL_SRC_DIR)\curl.rc
rc $(CURL_RC_FLAGS)
diff --git a/winbuild/README.md b/winbuild/README.md
new file mode 100644
index 00000000..49b0b6cc
--- /dev/null
+++ b/winbuild/README.md
@@ -0,0 +1,127 @@
+# Building curl with Visual C++
+
+ This document describes how to compile, build and install curl and libcurl
+ from sources using the Visual C++ build tool. To build with VC++, you will of
+ course have to first install VC++. The minimum required version of VC is 6
+ (part of Visual Studio 6). However using a more recent version is strongly
+ recommended.
+
+ VC++ is also part of the Windows Platform SDK. You do not have to install the
+ full Visual Studio or Visual C++ if all you want is to build curl.
+
+ The latest Platform SDK can be downloaded freely from [Windows SDK and
+ emulator
+ archive](https://developer.microsoft.com/en-us/windows/downloads/sdk-archive)
+
+## Prerequisites
+
+ If you wish to support zlib, openssl, c-ares, ssh2, you will have to download
+ them separately and copy them to the deps directory as shown below:
+
+ somedirectory\
+ |_curl-src
+ | |_winbuild
+ |
+ |_deps
+ |_ lib
+ |_ include
+ |_ bin
+
+ It is also possible to create the deps directory in some other random places
+ and tell the Makefile its location using the WITH_DEVEL option.
+
+## Building straight from git
+
+ When you check out code git and build it, as opposed from a released source
+ code archive, you need to first run the `buildconf.bat` batch file (present
+ in the source code root directory) to set things up.
+
+## Open a command prompt
+
+Open a Visual Studio Command prompt:
+
+ Using the **'Developer Command Prompt for VS [version]'** menu entry: where
+ [version} is the Visual Studio version. The developer prompt at default uses
+ the x86 mode. It is required to call `Vcvarsall.bat` to setup the prompt for
+ the machine type you want. This type of command prompt may not exist in all
+ Visual Studio versions.
+
+ See also: [Developer Command Prompt for Visual
+ Studio](https://docs.microsoft.com/en-us/dotnet/framework/tools/developer-command-prompt-for-vs)
+ and [How to: Enable a 64-Bit, x64 hosted MSVC toolset on the command
+ line](https://docs.microsoft.com/en-us/cpp/build/how-to-enable-a-64-bit-visual-cpp-toolset-on-the-command-line)
+
+ Using the **'VS [version] [platform] [type] Command Prompt'** menu entry:
+ where [version] is the Visual Studio version, [platform] is e.g. x64 and
+ [type] Native of Cross platform build. This type of command prompt may not
+ exist in all Visual Studio versions.
+
+ See also: [Set the Path and Environment Variables for Command-Line Builds](https://msdn.microsoft.com/en-us/library/f2ccy3wt.aspx)
+
+## Build in the console
+
+ Once you are in the console, go to the winbuild directory in the Curl
+ sources:
+
+ cd curl-src\winbuild
+
+ Then you can call `nmake /f Makefile.vc` with the desired options (see
+ below). The builds will be in the top src directory, `builds\` directory, in
+ a directory named using the options given to the nmake call.
+
+ nmake /f Makefile.vc mode=<static or dll> <options>
+
+where `<options>` is one or many of:
+
+ - `VC=<6,7,8,9,10,11,12,14,15>` - VC version
+ - `WITH_DEVEL=<path>` - Paths for the development files (SSL, zlib, etc.)
+ Defaults to sibbling directory deps: ../deps
+ Libraries can be fetched at https://windows.php.net/downloads/php-sdk/deps/
+ Uncompress them into the deps folder.
+ - `WITH_SSL=<dll/static>` - Enable OpenSSL support, DLL or static
+ - `WITH_NGHTTP2=<dll/static>` - Enable HTTP/2 support, DLL or static
+ - `WITH_MBEDTLS=<dll/static>` - Enable mbedTLS support, DLL or static
+ - `WITH_CARES=<dll/static>` - Enable c-ares support, DLL or static
+ - `WITH_ZLIB=<dll/static>` - Enable zlib support, DLL or static
+ - `WITH_SSH2=<dll/static>` - Enable libSSH2 support, DLL or static
+ - `WITH_PREFIX=<dir>` - Where to install the build
+ - `ENABLE_SSPI=<yes/no>` - Enable SSPI support, defaults to yes
+ - `ENABLE_IPV6=<yes/no>` - Enable IPv6, defaults to yes
+ - `ENABLE_IDN=<yes or no>` - Enable use of Windows IDN APIs, defaults to yes
+ Requires Windows Vista or later
+ - `ENABLE_SCHANNEL=<yes/no>` - Enable native Windows SSL support, defaults to yes
+ - `GEN_PDB=<yes/no>` - Generate Program Database (debug symbols for release build)
+ - `DEBUG=<yes/no>` - Debug builds
+ - `MACHINE=<x86/x64>` - Target architecture (default is x86)
+ - `CARES_PATH=<path>` - Custom path for c-ares
+ - `MBEDTLS_PATH=<path>` - Custom path for mbedTLS
+ - `NGHTTP2_PATH=<path>` - Custom path for nghttp2
+ - `SSH2_PATH=<path>` - Custom path for libSSH2
+ - `SSL_PATH=<path>` - Custom path for OpenSSL
+ - `ZLIB_PATH=<path>` - Custom path for zlib
+
+## Static linking of Microsoft's C RunTime (CRT):
+
+ If you are using mode=static nmake will create and link to the static build
+ of libcurl but *not* the static CRT. If you must you can force nmake to link
+ in the static CRT by passing RTLIBCFG=static. Typically you shouldn't use
+ that option, and nmake will default to the DLL CRT. RTLIBCFG is rarely used
+ and therefore rarely tested. When passing RTLIBCFG for a configuration that
+ was already built but not with that option, or if the option was specified
+ differently, you must destroy the build directory containing the
+ configuration so that nmake can build it from scratch.
+
+## Building your own application with a static libcurl
+
+ When building an application that uses the static libcurl library on Windows,
+ you must define CURL_STATICLIB. Otherwise the linker will look for dynamic
+ import symbols.
+
+## Legacy Windows and SSL
+
+ When you build curl using the build files in this directory the default SSL
+ backend will be Schannel (Windows SSPI), the native SSL library that comes
+ with the Windows OS. Schannel in Windows <= XP is not able to connect to
+ servers that no longer support the legacy handshakes and algorithms used by
+ those versions. If you will be using curl in one of those earlier versions of
+ Windows you should choose another SSL backend like OpenSSL.