summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEd Maste <emaste@FreeBSD.org>2026-04-06 13:03:29 +0000
committerEd Maste <emaste@FreeBSD.org>2026-04-06 13:16:02 +0000
commit2c72d8219c5679490c3becad8118ea5c8950b893 (patch)
tree9745ca96f363514e3aa34b48c397016f4a241bc5
parent2137aa9d9fd3f2a3ebc1aa12c6e56ece99fa067c (diff)
-rw-r--r--.depend345
-rw-r--r--.github/ci-status.md5
-rwxr-xr-x.github/configs29
-rwxr-xr-x.github/run_test.sh5
-rwxr-xr-x.github/setup_ci.sh8
-rw-r--r--.github/workflows/c-cpp.yml1
-rw-r--r--.github/workflows/upstream.yml8
-rw-r--r--.github/workflows/vm.yml112
-rw-r--r--.gitignore3
-rw-r--r--.skipped-commit-ids1
-rw-r--r--ChangeLog4551
-rw-r--r--INSTALL9
-rw-r--r--Makefile.in16
-rw-r--r--PROTOCOL2
-rw-r--r--README2
-rw-r--r--README.md9
-rw-r--r--addr.c4
-rw-r--r--addr.h8
-rw-r--r--addrmatch.c7
-rw-r--r--audit-bsm.c6
-rw-r--r--auth-bsdauth.c10
-rw-r--r--auth-krb5.c2
-rw-r--r--auth-options.c3
-rw-r--r--auth-pam.c201
-rw-r--r--auth-pam.h2
-rw-r--r--auth.c36
-rw-r--r--auth.h4
-rw-r--r--auth2-chall.c38
-rw-r--r--auth2-gss.c21
-rw-r--r--auth2-hostbased.c13
-rw-r--r--auth2-none.c7
-rw-r--r--auth2-pubkey.c17
-rw-r--r--auth2-pubkeyfile.c28
-rw-r--r--auth2.c14
-rw-r--r--authfd.c73
-rw-r--r--authfd.h6
-rw-r--r--authfile.c8
-rw-r--r--canohost.c5
-rw-r--r--chacha.c4
-rw-r--r--channels.c429
-rw-r--r--channels.h26
-rw-r--r--cipher-aesctr.c6
-rw-r--r--cipher-chachapoly-libcrypto.c4
-rw-r--r--cipher.c3
-rw-r--r--clientloop.c58
-rw-r--r--clientloop.h6
-rw-r--r--compat.c6
-rw-r--r--config.h.in17
-rwxr-xr-xconfigure293
-rw-r--r--configure.ac117
-rw-r--r--contrib/redhat/openssh.spec2
-rw-r--r--contrib/suse/openssh.spec2
-rw-r--r--crypto_api.h32
-rw-r--r--defines.h15
-rw-r--r--dh.c5
-rw-r--r--digest-libc.c11
-rw-r--r--dispatch.c8
-rw-r--r--dispatch.h8
-rw-r--r--dns.c19
-rw-r--r--ed25519-openssl.c207
-rw-r--r--ed25519.c4
-rw-r--r--entropy.c24
-rw-r--r--entropy.h9
-rw-r--r--gss-genr.c2
-rw-r--r--gss-serv-krb5.c2
-rw-r--r--gss-serv.c12
-rw-r--r--hash.c43
-rw-r--r--hmac.c3
-rw-r--r--hostfile.c6
-rw-r--r--kex-names.c4
-rw-r--r--kex.c26
-rw-r--r--kex.h9
-rw-r--r--kexdh.c7
-rw-r--r--kexecdh.c4
-rw-r--r--kexgen.c10
-rw-r--r--kexgex.c2
-rw-r--r--kexgexc.c13
-rw-r--r--kexgexs.c12
-rw-r--r--krl.c41
-rw-r--r--krl.h8
-rw-r--r--libcrux_mlkem768_sha3.h13398
-rw-r--r--log.c7
-rw-r--r--loginrec.c9
-rw-r--r--loginrec.h1
-rw-r--r--mac.c8
-rw-r--r--mac.h6
-rw-r--r--mdoc2man.awk8
-rw-r--r--misc-agent.c2
-rw-r--r--misc.c228
-rw-r--r--misc.h37
-rw-r--r--mlkem768.sh124
-rw-r--r--moduli1011
-rw-r--r--moduli.02
-rw-r--r--moduli.c50
-rw-r--r--monitor.c66
-rw-r--r--monitor.h6
-rw-r--r--monitor_fdpass.c5
-rw-r--r--monitor_wrap.c30
-rw-r--r--monitor_wrap.h3
-rw-r--r--msg.c5
-rw-r--r--mux.c167
-rw-r--r--myproposal.h5
-rw-r--r--nchan.c4
-rw-r--r--openbsd-compat/bcrypt_pbkdf.c6
-rw-r--r--openbsd-compat/bsd-misc.c9
-rw-r--r--openbsd-compat/bsd-misc.h4
-rw-r--r--openbsd-compat/bsd-openpty.c1
-rw-r--r--openbsd-compat/bsd-sha2.h (renamed from openbsd-compat/sha2.h)0
-rw-r--r--openbsd-compat/fake-rfc2553.c6
-rw-r--r--openbsd-compat/openbsd-compat.h2
-rw-r--r--openbsd-compat/openssl-compat.c23
-rw-r--r--openbsd-compat/openssl-compat.h2
-rw-r--r--openbsd-compat/sha2.c2
-rw-r--r--packet.c304
-rw-r--r--packet.h30
-rw-r--r--pathnames.h11
-rw-r--r--progressmeter.c6
-rw-r--r--readconf.c181
-rw-r--r--readconf.h9
-rw-r--r--readpass.c3
-rw-r--r--regress/Makefile12
-rw-r--r--regress/cert-hostkey.sh47
-rw-r--r--regress/cert-userkey.sh12
-rw-r--r--regress/cfgmatch.sh23
-rw-r--r--regress/check-perm.c2
-rw-r--r--regress/gss-auth.sh196
-rw-r--r--regress/hostbased.sh27
-rw-r--r--regress/kbdint.sh86
-rw-r--r--regress/misc/sk-dummy/Makefile11
-rw-r--r--regress/misc/sk-dummy/fatal.c32
-rw-r--r--regress/misc/ssh-verify-attestation/Makefile11
-rw-r--r--regress/modpipe.c6
-rw-r--r--regress/multiplex.sh47
-rw-r--r--regress/percent.sh6
-rw-r--r--regress/proxyjump.sh102
-rw-r--r--regress/scp.sh15
-rw-r--r--regress/scp3.sh17
-rw-r--r--regress/sftp-cmds.sh187
-rw-r--r--regress/sftp-resume.sh4
-rw-r--r--regress/ssh-pkcs11.sh40
-rw-r--r--regress/ssh-tty.sh179
-rw-r--r--regress/test-exec.sh36
-rw-r--r--regress/unittests/Makefile.inc6
-rw-r--r--regress/unittests/authopt/Makefile8
-rw-r--r--regress/unittests/authopt/tests.c3
-rw-r--r--regress/unittests/bitmap/Makefile3
-rw-r--r--regress/unittests/conversion/Makefile4
-rw-r--r--regress/unittests/hostkeys/Makefile9
-rw-r--r--regress/unittests/hostkeys/test_iterate.c4
-rw-r--r--regress/unittests/kex/Makefile10
-rw-r--r--regress/unittests/kex/tests.c4
-rw-r--r--regress/unittests/match/Makefile4
-rw-r--r--regress/unittests/misc/Makefile4
-rw-r--r--regress/unittests/misc/test_convtime.c37
-rw-r--r--regress/unittests/misc/test_misc.c39
-rw-r--r--regress/unittests/sshbuf/Makefile6
-rw-r--r--regress/unittests/sshbuf/test_sshbuf.c39
-rw-r--r--regress/unittests/sshbuf/test_sshbuf_fuzz.c4
-rw-r--r--regress/unittests/sshbuf/test_sshbuf_getput_basic.c123
-rw-r--r--regress/unittests/sshbuf/test_sshbuf_getput_crypto.c6
-rw-r--r--regress/unittests/sshbuf/test_sshbuf_getput_fuzz.c10
-rw-r--r--regress/unittests/sshkey/Makefile10
-rw-r--r--regress/unittests/sshkey/test_sshkey.c4
-rw-r--r--regress/unittests/sshkey/tests.c2
-rw-r--r--regress/unittests/sshsig/Makefile9
-rw-r--r--regress/unittests/test_helper/test_helper.c53
-rw-r--r--regress/unittests/test_helper/test_helper.h26
-rw-r--r--regress/unittests/utf8/Makefile3
-rw-r--r--rijndael.c2
-rw-r--r--sandbox-seccomp-filter.c3
-rw-r--r--scp.02
-rw-r--r--scp.c37
-rw-r--r--servconf.c202
-rw-r--r--servconf.h59
-rw-r--r--serverloop.c19
-rw-r--r--session.c34
-rw-r--r--sftp-client.c61
-rw-r--r--sftp-client.h40
-rw-r--r--sftp-common.c6
-rw-r--r--sftp-common.h16
-rw-r--r--sftp-glob.c1
-rw-r--r--sftp-server.02
-rw-r--r--sftp-server.c176
-rw-r--r--sftp-usergroup.c3
-rw-r--r--sftp.02
-rw-r--r--sftp.c71
-rw-r--r--sntrup761.c22
-rw-r--r--sntrup761.sh24
-rw-r--r--srclimit.c42
-rw-r--r--srclimit.h2
-rw-r--r--ssh-add.08
-rw-r--r--ssh-add.19
-rw-r--r--ssh-add.c62
-rw-r--r--ssh-agent.010
-rw-r--r--ssh-agent.12
-rw-r--r--ssh-agent.c134
-rw-r--r--ssh-ecdsa-sk.c20
-rw-r--r--ssh-ecdsa.c6
-rw-r--r--ssh-ed25519-sk.c4
-rw-r--r--ssh-ed25519.c3
-rw-r--r--ssh-keygen.033
-rw-r--r--ssh-keygen.134
-rw-r--r--ssh-keygen.c55
-rw-r--r--ssh-keyscan.02
-rw-r--r--ssh-keyscan.c5
-rw-r--r--ssh-keysign.02
-rw-r--r--ssh-keysign.c8
-rw-r--r--ssh-pkcs11-client.c3
-rw-r--r--ssh-pkcs11-helper.02
-rw-r--r--ssh-pkcs11-helper.c4
-rw-r--r--ssh-pkcs11.c21
-rw-r--r--ssh-pkcs11.h8
-rw-r--r--ssh-rsa.c6
-rw-r--r--ssh-sk-client.c44
-rw-r--r--ssh-sk-helper.02
-rw-r--r--ssh-sk-helper.c1
-rw-r--r--ssh.025
-rw-r--r--ssh.110
-rw-r--r--ssh.c92
-rw-r--r--ssh_api.c4
-rw-r--r--ssh_api.h3
-rw-r--r--ssh_config.016
-rw-r--r--ssh_config.519
-rw-r--r--sshbuf-getput-basic.c72
-rw-r--r--sshbuf-getput-crypto.c2
-rw-r--r--sshbuf-misc.c4
-rw-r--r--sshbuf.c22
-rw-r--r--sshbuf.h83
-rw-r--r--sshconnect.c28
-rw-r--r--sshconnect.h3
-rw-r--r--sshconnect2.c113
-rw-r--r--sshd-auth.c26
-rw-r--r--sshd-session.c56
-rw-r--r--sshd.02
-rw-r--r--sshd.c27
-rw-r--r--sshd_config.078
-rw-r--r--sshd_config.569
-rw-r--r--ssherr-libcrypto.c59
-rw-r--r--ssherr-nolibcrypto.c26
-rw-r--r--ssherr.c7
-rw-r--r--ssherr.h4
-rw-r--r--sshkey.c155
-rw-r--r--sshkey.h16
-rw-r--r--sshlogin.c3
-rw-r--r--sshpty.c4
-rw-r--r--sshsig.c8
-rw-r--r--ttymodes.c3
-rw-r--r--uidswap.c5
-rw-r--r--umac.c15
-rw-r--r--version.h4
250 files changed, 15106 insertions, 11718 deletions
diff --git a/.depend b/.depend
index 660f515caf54..134a986596a0 100644
--- a/.depend
+++ b/.depend
@@ -2,177 +2,176 @@
# Run "make depend" to rebuild.
# DO NOT DELETE
-addr.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h addr.h
-addrmatch.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h addr.h match.h log.h ssherr.h
-atomicio.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h atomicio.h
-audit-bsm.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
-audit-linux.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
-audit.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
-auth-bsdauth.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
-auth-krb5.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h ssh.h packet.h openbsd-compat/sys-queue.h dispatch.h log.h ssherr.h sshbuf.h sshkey.h misc.h servconf.h uidswap.h hostfile.h auth.h auth-pam.h audit.h loginrec.h
-auth-options.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h openbsd-compat/sys-queue.h xmalloc.h ssherr.h log.h sshbuf.h misc.h sshkey.h match.h ssh2.h auth-options.h
-auth-pam.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
-auth-passwd.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h packet.h openbsd-compat/sys-queue.h dispatch.h sshbuf.h ssherr.h log.h misc.h servconf.h sshkey.h hostfile.h auth.h auth-pam.h audit.h loginrec.h auth-options.h
-auth-rhosts.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h packet.h openbsd-compat/sys-queue.h dispatch.h uidswap.h pathnames.h log.h ssherr.h misc.h xmalloc.h sshbuf.h sshkey.h servconf.h canohost.h hostfile.h auth.h auth-pam.h audit.h loginrec.h
-auth-shadow.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
-auth-sia.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
-auth.o: authfile.h monitor_wrap.h channels.h
-auth.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h match.h groupaccess.h log.h ssherr.h sshbuf.h misc.h servconf.h openbsd-compat/sys-queue.h sshkey.h hostfile.h auth.h auth-pam.h audit.h loginrec.h auth-options.h canohost.h uidswap.h packet.h dispatch.h
-auth2-chall.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h ssh2.h sshkey.h hostfile.h auth.h auth-pam.h audit.h loginrec.h sshbuf.h packet.h openbsd-compat/sys-queue.h dispatch.h ssherr.h log.h misc.h servconf.h
-auth2-gss.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
-auth2-hostbased.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h ssh2.h packet.h openbsd-compat/sys-queue.h dispatch.h kex.h mac.h crypto_api.h sshbuf.h log.h ssherr.h misc.h servconf.h sshkey.h hostfile.h auth.h auth-pam.h audit.h loginrec.h canohost.h
-auth2-hostbased.o: monitor_wrap.h pathnames.h match.h
-auth2-kbdint.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h packet.h openbsd-compat/sys-queue.h dispatch.h hostfile.h auth.h auth-pam.h audit.h loginrec.h log.h ssherr.h misc.h servconf.h
-auth2-methods.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h log.h ssherr.h misc.h servconf.h openbsd-compat/sys-queue.h xmalloc.h hostfile.h auth.h auth-pam.h audit.h loginrec.h
-auth2-none.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h atomicio.h xmalloc.h sshkey.h hostfile.h auth.h auth-pam.h audit.h loginrec.h packet.h openbsd-compat/sys-queue.h dispatch.h log.h ssherr.h misc.h servconf.h ssh2.h monitor_wrap.h
-auth2-passwd.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h packet.h openbsd-compat/sys-queue.h dispatch.h ssherr.h log.h sshkey.h hostfile.h auth.h auth-pam.h audit.h loginrec.h monitor_wrap.h misc.h servconf.h
-auth2-pubkey.o: audit.h loginrec.h pathnames.h uidswap.h auth-options.h canohost.h monitor_wrap.h authfile.h match.h channels.h session.h sk-api.h
-auth2-pubkey.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h openbsd-compat/glob.h xmalloc.h ssh.h ssh2.h packet.h openbsd-compat/sys-queue.h dispatch.h kex.h mac.h crypto_api.h sshbuf.h log.h ssherr.h misc.h servconf.h compat.h sshkey.h hostfile.h auth.h auth-pam.h
-auth2-pubkeyfile.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h ssh.h log.h ssherr.h misc.h sshkey.h digest.h hostfile.h auth.h auth-pam.h audit.h loginrec.h auth-options.h authfile.h match.h
-auth2.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h atomicio.h xmalloc.h ssh2.h packet.h openbsd-compat/sys-queue.h dispatch.h log.h ssherr.h sshbuf.h misc.h servconf.h sshkey.h hostfile.h auth.h auth-pam.h audit.h loginrec.h pathnames.h monitor_wrap.h digest.h kex.h
-auth2.o: mac.h crypto_api.h
-authfd.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h ssh.h sshbuf.h sshkey.h authfd.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h rijndael.h log.h ssherr.h atomicio.h misc.h
-authfile.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h rijndael.h ssh.h log.h ssherr.h authfile.h misc.h atomicio.h sshkey.h sshbuf.h krl.h
-bitmap.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h bitmap.h
-canohost.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h packet.h openbsd-compat/sys-queue.h dispatch.h log.h ssherr.h canohost.h misc.h
-chacha.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h chacha.h
-channels.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h openbsd-compat/sys-queue.h xmalloc.h ssh.h ssh2.h ssherr.h sshbuf.h packet.h dispatch.h log.h misc.h channels.h compat.h canohost.h sshkey.h authfd.h pathnames.h match.h
-cipher-aes.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h openbsd-compat/openssl-compat.h
-cipher-aesctr.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h cipher-aesctr.h rijndael.h
-cipher-chachapoly-libcrypto.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
-cipher-chachapoly.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h log.h ssherr.h sshbuf.h cipher-chachapoly.h chacha.h poly1305.h
-cipher.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h rijndael.h misc.h sshbuf.h ssherr.h digest.h openbsd-compat/openssl-compat.h
-cleanup.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h log.h ssherr.h
-clientloop.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h openbsd-compat/sys-queue.h xmalloc.h ssh.h ssh2.h packet.h dispatch.h sshbuf.h compat.h channels.h sshkey.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h rijndael.h kex.h mac.h crypto_api.h
-clientloop.o: myproposal.h log.h ssherr.h misc.h readconf.h clientloop.h sshconnect.h authfd.h atomicio.h sshpty.h match.h msg.h hostfile.h
-compat.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h packet.h openbsd-compat/sys-queue.h dispatch.h compat.h log.h ssherr.h match.h
-dh.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
-digest-libc.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h ssherr.h sshbuf.h digest.h
-digest-openssl.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
-dispatch.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h ssh2.h log.h ssherr.h dispatch.h packet.h openbsd-compat/sys-queue.h
-dns.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h sshkey.h ssherr.h dns.h log.h digest.h
-ed25519.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h crypto_api.h
-entropy.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
-fatal.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h log.h ssherr.h
-groupaccess.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h groupaccess.h match.h log.h ssherr.h
-gss-genr.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
-gss-serv-krb5.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
-gss-serv.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
-hash.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h crypto_api.h
-hmac.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h sshbuf.h digest.h hmac.h
-hostfile.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h match.h sshkey.h hostfile.h log.h ssherr.h misc.h pathnames.h digest.h hmac.h sshbuf.h
-kex-names.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h kex.h mac.h crypto_api.h log.h ssherr.h match.h digest.h misc.h xmalloc.h
-kex.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h ssh.h ssh2.h atomicio.h version.h packet.h openbsd-compat/sys-queue.h dispatch.h compat.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h rijndael.h sshkey.h kex.h mac.h crypto_api.h log.h ssherr.h
-kex.o: match.h misc.h monitor.h myproposal.h sshbuf.h digest.h xmalloc.h
-kexc25519.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h sshkey.h kex.h mac.h crypto_api.h sshbuf.h digest.h ssherr.h ssh2.h
-kexdh.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
-kexecdh.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h ssherr.h
-kexgen.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h sshkey.h kex.h mac.h crypto_api.h log.h ssherr.h packet.h openbsd-compat/sys-queue.h dispatch.h ssh2.h sshbuf.h digest.h
-kexgex.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
-kexgexc.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
-kexgexs.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
-kexmlkem768x25519.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h sshkey.h kex.h mac.h crypto_api.h sshbuf.h digest.h ssherr.h log.h
-kexsntrup761x25519.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h ssherr.h
-krl.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h ./openbsd-compat/sys-tree.h openbsd-compat/sys-queue.h sshbuf.h ssherr.h sshkey.h authfile.h misc.h log.h digest.h bitmap.h utf8.h krl.h
-log.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h log.h ssherr.h match.h
-loginrec.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h sshkey.h hostfile.h ssh.h loginrec.h log.h ssherr.h atomicio.h packet.h openbsd-compat/sys-queue.h dispatch.h canohost.h auth.h auth-pam.h audit.h sshbuf.h misc.h
-logintest.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h loginrec.h
-mac.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h digest.h hmac.h umac.h mac.h misc.h ssherr.h sshbuf.h openbsd-compat/openssl-compat.h
-match.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h match.h misc.h
-misc-agent.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h digest.h log.h ssherr.h misc.h pathnames.h ssh.h xmalloc.h
-misc.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h misc.h log.h ssherr.h ssh.h sshbuf.h
-moduli.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
-monitor.o: chacha.h poly1305.h cipher-aesctr.h rijndael.h kex.h mac.h crypto_api.h dh.h packet.h dispatch.h auth-options.h sshpty.h channels.h session.h sshlogin.h canohost.h log.h ssherr.h misc.h servconf.h monitor.h monitor_wrap.h monitor_fdpass.h compat.h ssh2.h authfd.h match.h sk-api.h srclimit.h
-monitor.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h ./openbsd-compat/sys-tree.h openbsd-compat/sys-queue.h openbsd-compat/openssl-compat.h atomicio.h xmalloc.h ssh.h sshkey.h sshbuf.h hostfile.h auth.h auth-pam.h audit.h loginrec.h cipher.h cipher-chachapoly.h
-monitor_fdpass.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h log.h ssherr.h monitor_fdpass.h
-monitor_wrap.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h openbsd-compat/sys-queue.h xmalloc.h ssh.h sshbuf.h sshkey.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h rijndael.h kex.h mac.h crypto_api.h hostfile.h auth.h auth-pam.h audit.h
-monitor_wrap.o: loginrec.h auth-options.h packet.h dispatch.h log.h ssherr.h monitor.h atomicio.h monitor_fdpass.h misc.h channels.h session.h servconf.h monitor_wrap.h srclimit.h
-msg.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h sshbuf.h ssherr.h log.h atomicio.h msg.h misc.h
-mux.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h openbsd-compat/sys-queue.h xmalloc.h log.h ssherr.h ssh.h ssh2.h pathnames.h misc.h match.h sshbuf.h channels.h msg.h packet.h dispatch.h monitor_fdpass.h sshpty.h sshkey.h readconf.h clientloop.h
-nchan.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h openbsd-compat/sys-queue.h ssh2.h sshbuf.h ssherr.h packet.h dispatch.h channels.h compat.h log.h
-packet.o: channels.h ssh.h packet.h dispatch.h sshbuf.h
-packet.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h openbsd-compat/sys-queue.h xmalloc.h compat.h ssh2.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h rijndael.h sshkey.h kex.h mac.h crypto_api.h digest.h log.h ssherr.h canohost.h misc.h
-platform-listen.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h log.h ssherr.h misc.h
-platform-misc.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
-platform-pledge.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
-platform-tracing.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h log.h ssherr.h
-platform.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h log.h ssherr.h misc.h servconf.h openbsd-compat/sys-queue.h sshkey.h hostfile.h auth.h auth-pam.h audit.h loginrec.h
-poly1305.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h poly1305.h
-progressmeter.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h progressmeter.h atomicio.h misc.h utf8.h
-readconf.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h openbsd-compat/glob.h xmalloc.h ssh.h ssherr.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h rijndael.h pathnames.h log.h sshkey.h misc.h readconf.h match.h kex.h mac.h crypto_api.h uidswap.h
-readconf.o: myproposal.h digest.h version.h
-readpass.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h misc.h pathnames.h log.h ssherr.h ssh.h uidswap.h
-rijndael.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h rijndael.h
-sandbox-capsicum.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
-sandbox-darwin.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
-sandbox-null.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
-sandbox-rlimit.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
-sandbox-seccomp-filter.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
-sandbox-solaris.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
-scp.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h openbsd-compat/glob.h xmalloc.h ssh.h atomicio.h pathnames.h log.h ssherr.h misc.h progressmeter.h utf8.h sftp.h sftp-common.h sftp-client.h
-servconf.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h openbsd-compat/glob.h openbsd-compat/sys-queue.h xmalloc.h ssh.h log.h ssherr.h sshbuf.h misc.h servconf.h pathnames.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h rijndael.h sshkey.h kex.h
-servconf.o: mac.h crypto_api.h match.h channels.h groupaccess.h canohost.h packet.h dispatch.h hostfile.h auth.h auth-pam.h audit.h loginrec.h myproposal.h digest.h version.h
-serverloop.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h openbsd-compat/sys-queue.h xmalloc.h packet.h dispatch.h sshbuf.h log.h ssherr.h misc.h servconf.h canohost.h sshpty.h channels.h ssh2.h sshkey.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h
-serverloop.o: rijndael.h kex.h mac.h crypto_api.h hostfile.h auth.h auth-pam.h audit.h loginrec.h session.h auth-options.h serverloop.h
-session.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h openbsd-compat/sys-queue.h xmalloc.h ssh.h ssh2.h sshpty.h packet.h dispatch.h sshbuf.h ssherr.h match.h uidswap.h channels.h sshkey.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h rijndael.h
-session.o: kex.h mac.h crypto_api.h hostfile.h auth.h auth-pam.h audit.h loginrec.h auth-options.h authfd.h pathnames.h log.h misc.h servconf.h sshlogin.h serverloop.h canohost.h session.h monitor_wrap.h sftp.h atomicio.h
-sftp-client.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h openbsd-compat/sys-queue.h xmalloc.h ssherr.h sshbuf.h log.h atomicio.h progressmeter.h misc.h utf8.h sftp.h sftp-common.h sftp-client.h openbsd-compat/glob.h
-sftp-common.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h ssherr.h sshbuf.h log.h misc.h sftp.h sftp-common.h
-sftp-glob.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h sftp.h sftp-common.h sftp-client.h openbsd-compat/glob.h
-sftp-realpath.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
-sftp-server-main.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h log.h ssherr.h sftp.h misc.h xmalloc.h
-sftp-server.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h atomicio.h xmalloc.h sshbuf.h ssherr.h log.h misc.h match.h uidswap.h sftp.h sftp-common.h
-sftp-usergroup.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h ./openbsd-compat/sys-tree.h log.h ssherr.h xmalloc.h sftp-common.h sftp-client.h openbsd-compat/glob.h sftp-usergroup.h
-sftp.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h log.h ssherr.h pathnames.h misc.h utf8.h sftp.h sshbuf.h sftp-common.h sftp-client.h openbsd-compat/glob.h sftp-usergroup.h
-sk-usbhid.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
-sntrup761.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
-srclimit.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h ./openbsd-compat/sys-tree.h addr.h canohost.h log.h ssherr.h misc.h srclimit.h xmalloc.h servconf.h openbsd-compat/sys-queue.h match.h
-ssh-add.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h ssh.h log.h ssherr.h sshkey.h sshbuf.h authfd.h authfile.h pathnames.h misc.h digest.h ssh-sk.h sk-api.h hostfile.h
-ssh-agent.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h openbsd-compat/sys-queue.h xmalloc.h ssh.h ssh2.h sshbuf.h sshkey.h authfd.h log.h ssherr.h misc.h digest.h match.h msg.h pathnames.h ssh-pkcs11.h sk-api.h myproposal.h
-ssh-ecdsa-sk.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h openbsd-compat/openssl-compat.h sshbuf.h ssherr.h digest.h sshkey.h
-ssh-ecdsa.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
-ssh-ed25519-sk.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h crypto_api.h log.h ssherr.h sshbuf.h sshkey.h ssh.h digest.h
-ssh-ed25519.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h crypto_api.h log.h ssherr.h sshbuf.h sshkey.h ssh.h
-ssh-keygen.o: chacha.h poly1305.h cipher-aesctr.h rijndael.h
-ssh-keygen.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h sshkey.h authfile.h sshbuf.h pathnames.h log.h ssherr.h misc.h match.h hostfile.h dns.h ssh.h ssh2.h atomicio.h krl.h digest.h utf8.h authfd.h sshsig.h ssh-sk.h sk-api.h cipher.h cipher-chachapoly.h
-ssh-keyscan.o: dispatch.h log.h ssherr.h atomicio.h misc.h hostfile.h ssh_api.h ssh2.h dns.h addr.h
-ssh-keyscan.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h openbsd-compat/sys-queue.h xmalloc.h ssh.h sshbuf.h sshkey.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h rijndael.h digest.h kex.h mac.h crypto_api.h compat.h myproposal.h packet.h
-ssh-keysign.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h log.h ssherr.h sshkey.h ssh.h ssh2.h misc.h sshbuf.h authfile.h msg.h canohost.h pathnames.h readconf.h uidswap.h
-ssh-pkcs11-client.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h pathnames.h xmalloc.h sshbuf.h log.h ssherr.h misc.h sshkey.h authfd.h atomicio.h ssh-pkcs11.h
-ssh-pkcs11-helper.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h sshbuf.h log.h ssherr.h misc.h sshkey.h authfd.h ssh-pkcs11.h
-ssh-pkcs11.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h log.h ssherr.h sshkey.h ssh-pkcs11.h
-ssh-rsa.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
-ssh-sk-client.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h log.h ssherr.h sshbuf.h sshkey.h msg.h digest.h pathnames.h ssh-sk.h misc.h
-ssh-sk-helper.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h log.h ssherr.h sshkey.h authfd.h misc.h sshbuf.h msg.h uidswap.h ssh-sk.h ssh-pkcs11.h
-ssh-sk.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
-ssh.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h openbsd-compat/openssl-compat.h openbsd-compat/sys-queue.h xmalloc.h ssh.h ssh2.h canohost.h compat.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h rijndael.h packet.h dispatch.h sshbuf.h channels.h
-ssh.o: sshkey.h authfd.h authfile.h pathnames.h clientloop.h log.h ssherr.h misc.h readconf.h sshconnect.h kex.h mac.h crypto_api.h sshpty.h match.h msg.h version.h myproposal.h utf8.h
-ssh_api.o: authfile.h dh.h misc.h version.h myproposal.h sshbuf.h openbsd-compat/openssl-compat.h
-ssh_api.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h ssh_api.h openbsd-compat/sys-queue.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h rijndael.h sshkey.h kex.h mac.h crypto_api.h ssh.h ssh2.h packet.h dispatch.h compat.h log.h ssherr.h
-sshbuf-getput-basic.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h ssherr.h sshbuf.h
-sshbuf-getput-crypto.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
-sshbuf-io.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h ssherr.h sshbuf.h atomicio.h
-sshbuf-misc.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h ssherr.h sshbuf.h
-sshbuf.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h ssherr.h sshbuf.h misc.h
-sshconnect.o: authfd.h kex.h mac.h crypto_api.h
-sshconnect.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h hostfile.h ssh.h sshbuf.h packet.h openbsd-compat/sys-queue.h dispatch.h sshkey.h sshconnect.h log.h ssherr.h match.h misc.h readconf.h atomicio.h dns.h monitor_fdpass.h ssh2.h version.h authfile.h
-sshconnect2.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h openbsd-compat/sys-queue.h xmalloc.h ssh.h ssh2.h sshbuf.h packet.h dispatch.h compat.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h rijndael.h sshkey.h kex.h mac.h crypto_api.h
-sshconnect2.o: sshconnect.h authfile.h dh.h authfd.h log.h ssherr.h misc.h readconf.h match.h canohost.h msg.h pathnames.h uidswap.h hostfile.h utf8.h ssh-sk.h sk-api.h
-sshd-auth.o: chacha.h poly1305.h cipher-aesctr.h rijndael.h digest.h sshkey.h kex.h mac.h crypto_api.h authfile.h pathnames.h atomicio.h canohost.h hostfile.h auth.h auth-pam.h audit.h loginrec.h authfd.h msg.h channels.h session.h monitor.h monitor_wrap.h auth-options.h version.h sk-api.h srclimit.h ssh-sandbox.h dh.h
-sshd-auth.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h ./openbsd-compat/sys-tree.h openbsd-compat/sys-queue.h xmalloc.h ssh.h ssh2.h sshpty.h packet.h dispatch.h log.h ssherr.h sshbuf.h misc.h match.h servconf.h uidswap.h compat.h cipher.h cipher-chachapoly.h
-sshd-session.o: chacha.h poly1305.h cipher-aesctr.h rijndael.h digest.h sshkey.h kex.h mac.h crypto_api.h authfile.h pathnames.h atomicio.h canohost.h hostfile.h auth.h auth-pam.h audit.h loginrec.h authfd.h msg.h channels.h session.h monitor.h monitor_wrap.h auth-options.h version.h sk-api.h srclimit.h dh.h
-sshd-session.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h ./openbsd-compat/sys-tree.h openbsd-compat/sys-queue.h xmalloc.h ssh.h ssh2.h sshpty.h packet.h dispatch.h log.h ssherr.h sshbuf.h misc.h match.h servconf.h uidswap.h compat.h cipher.h cipher-chachapoly.h
-sshd.o: audit.h loginrec.h authfd.h msg.h version.h sk-api.h addr.h srclimit.h atomicio.h monitor_wrap.h
-sshd.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h ./openbsd-compat/sys-tree.h openbsd-compat/sys-queue.h xmalloc.h ssh.h sshpty.h log.h ssherr.h sshbuf.h misc.h servconf.h compat.h digest.h sshkey.h authfile.h pathnames.h canohost.h hostfile.h auth.h auth-pam.h
+addr.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h addr.h
+addrmatch.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h addr.h match.h log.h ssherr.h
+atomicio.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h atomicio.h
+audit-bsm.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+audit-linux.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+audit.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+auth-bsdauth.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+auth-krb5.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h ssh.h packet.h dispatch.h log.h ssherr.h sshbuf.h sshkey.h misc.h servconf.h uidswap.h hostfile.h auth.h auth-pam.h audit.h loginrec.h
+auth-options.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h ssherr.h log.h sshbuf.h misc.h sshkey.h match.h ssh2.h auth-options.h
+auth-pam.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+auth-passwd.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h packet.h dispatch.h sshbuf.h ssherr.h log.h misc.h servconf.h sshkey.h hostfile.h auth.h auth-pam.h audit.h loginrec.h auth-options.h
+auth-rhosts.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h packet.h dispatch.h uidswap.h pathnames.h log.h ssherr.h misc.h xmalloc.h sshbuf.h sshkey.h servconf.h canohost.h hostfile.h auth.h auth-pam.h audit.h loginrec.h
+auth-shadow.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+auth-sia.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+auth.o: channels.h
+auth.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h match.h groupaccess.h log.h ssherr.h sshbuf.h misc.h servconf.h sshkey.h hostfile.h auth.h auth-pam.h audit.h loginrec.h auth-options.h canohost.h uidswap.h packet.h dispatch.h authfile.h monitor_wrap.h
+auth2-chall.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h ssh2.h sshkey.h hostfile.h auth.h auth-pam.h audit.h loginrec.h sshbuf.h packet.h dispatch.h ssherr.h log.h misc.h servconf.h
+auth2-gss.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+auth2-hostbased.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h ssh2.h packet.h dispatch.h kex.h mac.h crypto_api.h sshbuf.h log.h ssherr.h misc.h servconf.h sshkey.h hostfile.h auth.h auth-pam.h audit.h loginrec.h canohost.h monitor_wrap.h pathnames.h
+auth2-hostbased.o: match.h
+auth2-kbdint.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h packet.h dispatch.h hostfile.h auth.h auth-pam.h audit.h loginrec.h log.h ssherr.h misc.h servconf.h
+auth2-methods.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h log.h ssherr.h misc.h servconf.h xmalloc.h hostfile.h auth.h auth-pam.h audit.h loginrec.h
+auth2-none.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h sshkey.h hostfile.h auth.h auth-pam.h audit.h loginrec.h packet.h dispatch.h log.h ssherr.h misc.h servconf.h ssh2.h monitor_wrap.h
+auth2-passwd.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h packet.h dispatch.h ssherr.h log.h sshkey.h hostfile.h auth.h auth-pam.h audit.h loginrec.h monitor_wrap.h misc.h servconf.h
+auth2-pubkey.o: auth-options.h canohost.h monitor_wrap.h authfile.h match.h channels.h session.h sk-api.h
+auth2-pubkey.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h ssh.h ssh2.h packet.h dispatch.h kex.h mac.h crypto_api.h sshbuf.h log.h ssherr.h misc.h servconf.h compat.h sshkey.h hostfile.h auth.h auth-pam.h audit.h loginrec.h pathnames.h uidswap.h
+auth2-pubkeyfile.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h ssh.h log.h ssherr.h misc.h sshkey.h digest.h hostfile.h auth.h auth-pam.h audit.h loginrec.h auth-options.h authfile.h match.h xmalloc.h
+auth2.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h atomicio.h xmalloc.h ssh2.h packet.h dispatch.h log.h ssherr.h sshbuf.h misc.h servconf.h sshkey.h hostfile.h auth.h auth-pam.h audit.h loginrec.h pathnames.h monitor_wrap.h digest.h kex.h mac.h crypto_api.h
+authfd.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h ssh.h sshbuf.h sshkey.h authfd.h log.h ssherr.h misc.h atomicio.h xmalloc.h
+authfile.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h log.h ssherr.h authfile.h sshkey.h sshbuf.h krl.h
+bitmap.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h bitmap.h
+canohost.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h log.h ssherr.h canohost.h misc.h
+chacha.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h chacha.h
+channels.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h ssh.h ssh2.h ssherr.h sshbuf.h packet.h dispatch.h log.h misc.h channels.h compat.h canohost.h pathnames.h match.h
+cipher-aes.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h openbsd-compat/openssl-compat.h
+cipher-aesctr.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h cipher-aesctr.h rijndael.h
+cipher-chachapoly-libcrypto.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+cipher-chachapoly.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h log.h ssherr.h sshbuf.h cipher-chachapoly.h chacha.h poly1305.h
+cipher.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h rijndael.h misc.h sshbuf.h ssherr.h openbsd-compat/openssl-compat.h
+cleanup.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h log.h ssherr.h
+clientloop.o: hostfile.h
+clientloop.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h ssh.h ssh2.h packet.h dispatch.h sshbuf.h compat.h channels.h sshkey.h kex.h mac.h crypto_api.h log.h ssherr.h misc.h readconf.h clientloop.h sshconnect.h authfd.h atomicio.h sshpty.h match.h
+compat.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h packet.h dispatch.h compat.h log.h ssherr.h match.h
+dh.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+digest-libc.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h ssherr.h sshbuf.h digest.h
+digest-openssl.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+dispatch.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h ssh2.h log.h ssherr.h dispatch.h packet.h
+dns.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h sshkey.h dns.h log.h ssherr.h digest.h
+ed25519-openssl.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+ed25519.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h crypto_api.h
+entropy.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+fatal.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h log.h ssherr.h
+groupaccess.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h groupaccess.h match.h log.h ssherr.h
+gss-genr.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+gss-serv-krb5.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+gss-serv.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+hmac.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h digest.h hmac.h
+hostfile.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h match.h sshkey.h hostfile.h log.h ssherr.h misc.h pathnames.h digest.h hmac.h sshbuf.h
+kex-names.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h kex.h mac.h crypto_api.h log.h ssherr.h match.h digest.h misc.h
+kex.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h ssh.h ssh2.h atomicio.h version.h packet.h dispatch.h compat.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h rijndael.h sshkey.h kex.h mac.h crypto_api.h log.h ssherr.h match.h misc.h
+kex.o: myproposal.h sshbuf.h digest.h xmalloc.h
+kexc25519.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h sshkey.h kex.h mac.h crypto_api.h sshbuf.h digest.h ssherr.h ssh2.h
+kexdh.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+kexecdh.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h ssherr.h
+kexgen.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h sshkey.h kex.h mac.h crypto_api.h log.h ssherr.h packet.h dispatch.h ssh2.h sshbuf.h digest.h
+kexgex.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+kexgexc.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+kexgexs.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+kexmlkem768x25519.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h sshkey.h kex.h mac.h crypto_api.h sshbuf.h digest.h ssherr.h log.h
+kexsntrup761x25519.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h ssherr.h
+krl.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h sshbuf.h ssherr.h sshkey.h misc.h log.h digest.h bitmap.h utf8.h krl.h
+log.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h log.h ssherr.h match.h
+loginrec.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h sshkey.h hostfile.h ssh.h loginrec.h log.h ssherr.h atomicio.h packet.h dispatch.h canohost.h auth.h auth-pam.h audit.h sshbuf.h misc.h
+logintest.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h loginrec.h
+mac.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h digest.h hmac.h umac.h mac.h misc.h ssherr.h sshbuf.h openbsd-compat/openssl-compat.h
+match.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h match.h misc.h
+misc-agent.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h digest.h log.h ssherr.h misc.h pathnames.h ssh.h xmalloc.h
+misc.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h misc.h log.h ssherr.h ssh.h sshbuf.h
+moduli.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+monitor.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h openbsd-compat/openssl-compat.h atomicio.h xmalloc.h ssh.h sshkey.h sshbuf.h hostfile.h auth.h auth-pam.h audit.h loginrec.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h rijndael.h kex.h
+monitor.o: mac.h crypto_api.h dh.h packet.h dispatch.h auth-options.h sshpty.h channels.h session.h sshlogin.h canohost.h log.h ssherr.h misc.h servconf.h monitor.h monitor_wrap.h monitor_fdpass.h compat.h ssh2.h authfd.h match.h sk-api.h srclimit.h
+monitor_fdpass.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h log.h ssherr.h monitor_fdpass.h
+monitor_wrap.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h ssh.h sshbuf.h sshkey.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h rijndael.h kex.h mac.h crypto_api.h hostfile.h auth.h auth-pam.h audit.h loginrec.h auth-options.h
+monitor_wrap.o: packet.h dispatch.h log.h ssherr.h monitor.h atomicio.h monitor_fdpass.h misc.h channels.h session.h servconf.h monitor_wrap.h srclimit.h
+msg.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h sshbuf.h log.h ssherr.h atomicio.h msg.h misc.h
+mux.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h log.h ssherr.h ssh.h ssh2.h misc.h match.h sshbuf.h channels.h packet.h dispatch.h monitor_fdpass.h sshpty.h readconf.h clientloop.h
+nchan.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h ssh2.h sshbuf.h packet.h dispatch.h channels.h compat.h log.h ssherr.h
+packet.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h compat.h ssh2.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h rijndael.h kex.h mac.h crypto_api.h digest.h log.h ssherr.h canohost.h misc.h packet.h dispatch.h sshbuf.h
+platform-listen.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h log.h ssherr.h misc.h
+platform-misc.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+platform-pledge.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+platform-tracing.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h log.h ssherr.h
+platform.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h log.h ssherr.h misc.h servconf.h sshkey.h hostfile.h auth.h auth-pam.h audit.h loginrec.h
+poly1305.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h poly1305.h
+progressmeter.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h progressmeter.h atomicio.h misc.h utf8.h
+readconf.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h ssh.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h rijndael.h pathnames.h log.h ssherr.h sshkey.h misc.h readconf.h match.h kex.h mac.h crypto_api.h myproposal.h digest.h
+readconf.o: version.h
+readpass.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h misc.h pathnames.h log.h ssherr.h ssh.h
+rijndael.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h rijndael.h
+sandbox-capsicum.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+sandbox-darwin.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+sandbox-null.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+sandbox-rlimit.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+sandbox-seccomp-filter.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+sandbox-solaris.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+scp.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h ssh.h atomicio.h pathnames.h log.h ssherr.h misc.h progressmeter.h utf8.h sftp.h sftp-common.h sftp-client.h
+servconf.o: groupaccess.h canohost.h packet.h dispatch.h hostfile.h auth.h auth-pam.h audit.h loginrec.h myproposal.h digest.h version.h
+servconf.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h ssh.h log.h ssherr.h sshbuf.h misc.h servconf.h pathnames.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h rijndael.h sshkey.h kex.h mac.h crypto_api.h match.h channels.h
+serverloop.o: crypto_api.h hostfile.h auth.h auth-pam.h audit.h loginrec.h session.h auth-options.h serverloop.h
+serverloop.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h packet.h dispatch.h sshbuf.h log.h ssherr.h misc.h servconf.h canohost.h sshpty.h channels.h ssh2.h sshkey.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h rijndael.h kex.h mac.h
+session.o: hostfile.h auth.h auth-pam.h audit.h loginrec.h auth-options.h authfd.h pathnames.h log.h misc.h servconf.h sshlogin.h serverloop.h canohost.h session.h monitor_wrap.h sftp.h atomicio.h
+session.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h ssh.h ssh2.h sshpty.h packet.h dispatch.h sshbuf.h ssherr.h match.h uidswap.h channels.h sshkey.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h rijndael.h kex.h mac.h crypto_api.h
+sftp-client.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h ssherr.h sshbuf.h log.h atomicio.h progressmeter.h misc.h utf8.h sftp.h sftp-common.h sftp-client.h
+sftp-common.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h ssherr.h sshbuf.h log.h misc.h sftp.h sftp-common.h
+sftp-glob.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h sftp.h sftp-common.h sftp-client.h
+sftp-realpath.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+sftp-server-main.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h log.h ssherr.h sftp.h misc.h xmalloc.h
+sftp-server.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h atomicio.h xmalloc.h sshbuf.h ssherr.h log.h misc.h match.h uidswap.h sftp.h sftp-common.h
+sftp-usergroup.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h log.h ssherr.h xmalloc.h sftp-common.h sftp-client.h sftp-usergroup.h
+sftp.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h log.h ssherr.h pathnames.h misc.h utf8.h sftp.h sshbuf.h sftp-common.h sftp-client.h sftp-usergroup.h
+sk-usbhid.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+sntrup761.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+srclimit.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h addr.h canohost.h log.h ssherr.h misc.h srclimit.h xmalloc.h servconf.h match.h
+ssh-add.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h ssh.h log.h ssherr.h sshkey.h sshbuf.h authfd.h authfile.h pathnames.h misc.h digest.h ssh-sk.h sk-api.h hostfile.h
+ssh-agent.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h ssh.h ssh2.h sshbuf.h sshkey.h authfd.h log.h ssherr.h misc.h digest.h match.h msg.h pathnames.h ssh-pkcs11.h sk-api.h myproposal.h
+ssh-ecdsa-sk.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h openbsd-compat/openssl-compat.h sshbuf.h ssherr.h digest.h sshkey.h
+ssh-ecdsa.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+ssh-ed25519-sk.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h crypto_api.h log.h ssherr.h sshbuf.h sshkey.h digest.h
+ssh-ed25519.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h crypto_api.h log.h ssherr.h sshbuf.h sshkey.h
+ssh-keygen.o: cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h rijndael.h
+ssh-keygen.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h sshkey.h authfile.h sshbuf.h pathnames.h log.h ssherr.h misc.h match.h hostfile.h dns.h ssh.h ssh2.h atomicio.h krl.h digest.h utf8.h authfd.h sshsig.h ssh-sk.h sk-api.h cipher.h
+ssh-keyscan.o: atomicio.h misc.h hostfile.h ssh_api.h ssh2.h dns.h addr.h
+ssh-keyscan.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h ssh.h sshbuf.h sshkey.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h rijndael.h digest.h kex.h mac.h crypto_api.h compat.h myproposal.h packet.h dispatch.h log.h ssherr.h
+ssh-keysign.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h log.h ssherr.h sshkey.h ssh.h ssh2.h misc.h sshbuf.h authfile.h msg.h canohost.h pathnames.h readconf.h uidswap.h
+ssh-pkcs11-client.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h pathnames.h xmalloc.h sshbuf.h log.h ssherr.h misc.h sshkey.h authfd.h atomicio.h ssh-pkcs11.h
+ssh-pkcs11-helper.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h sshbuf.h log.h ssherr.h misc.h sshkey.h authfd.h ssh-pkcs11.h
+ssh-pkcs11.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h log.h ssherr.h sshkey.h ssh-pkcs11.h
+ssh-rsa.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+ssh-sk-client.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h log.h ssherr.h sshbuf.h sshkey.h msg.h pathnames.h ssh-sk.h misc.h
+ssh-sk-helper.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h log.h ssherr.h sshkey.h authfd.h misc.h sshbuf.h msg.h uidswap.h ssh-sk.h ssh-pkcs11.h
+ssh-sk.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+ssh.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h openbsd-compat/openssl-compat.h xmalloc.h ssh.h ssh2.h compat.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h rijndael.h packet.h dispatch.h sshbuf.h channels.h sshkey.h authfd.h authfile.h
+ssh.o: pathnames.h clientloop.h log.h ssherr.h misc.h readconf.h sshconnect.h kex.h mac.h crypto_api.h match.h version.h utf8.h
+ssh_api.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h ssh_api.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h rijndael.h sshkey.h kex.h mac.h crypto_api.h ssh.h ssh2.h packet.h dispatch.h compat.h log.h ssherr.h authfile.h dh.h misc.h version.h
+ssh_api.o: myproposal.h sshbuf.h openbsd-compat/openssl-compat.h
+sshbuf-getput-basic.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h ssherr.h sshbuf.h
+sshbuf-getput-crypto.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h
+sshbuf-io.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h ssherr.h sshbuf.h atomicio.h
+sshbuf-misc.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h ssherr.h sshbuf.h
+sshbuf.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h ssherr.h sshbuf.h misc.h
+sshconnect.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h hostfile.h ssh.h compat.h packet.h dispatch.h sshkey.h sshconnect.h log.h ssherr.h match.h misc.h readconf.h dns.h monitor_fdpass.h authfile.h authfd.h kex.h mac.h crypto_api.h
+sshconnect2.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h ssh.h ssh2.h sshbuf.h packet.h dispatch.h compat.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h rijndael.h sshkey.h kex.h mac.h crypto_api.h sshconnect.h authfile.h authfd.h
+sshconnect2.o: log.h ssherr.h misc.h readconf.h match.h canohost.h msg.h pathnames.h hostfile.h utf8.h ssh-sk.h sk-api.h
+sshd-auth.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h ssh.h ssh2.h sshpty.h packet.h dispatch.h log.h ssherr.h sshbuf.h misc.h match.h servconf.h uidswap.h compat.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h rijndael.h digest.h
+sshd-auth.o: sshkey.h kex.h mac.h crypto_api.h authfile.h pathnames.h atomicio.h canohost.h hostfile.h auth.h auth-pam.h audit.h loginrec.h authfd.h msg.h channels.h session.h monitor.h monitor_wrap.h auth-options.h version.h sk-api.h srclimit.h ssh-sandbox.h dh.h
+sshd-session.o: digest.h sshkey.h kex.h mac.h crypto_api.h authfile.h pathnames.h atomicio.h canohost.h hostfile.h auth.h auth-pam.h audit.h loginrec.h authfd.h msg.h channels.h session.h monitor.h monitor_wrap.h auth-options.h version.h sk-api.h srclimit.h dh.h
+sshd-session.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h ssh.h ssh2.h sshpty.h packet.h dispatch.h log.h ssherr.h sshbuf.h misc.h match.h servconf.h uidswap.h compat.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h rijndael.h
+sshd.o: addr.h srclimit.h atomicio.h monitor_wrap.h
+sshd.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h ssh.h sshpty.h log.h ssherr.h sshbuf.h misc.h servconf.h compat.h digest.h sshkey.h authfile.h pathnames.h canohost.h hostfile.h auth.h auth-pam.h audit.h loginrec.h authfd.h msg.h version.h sk-api.h
+ssherr-libcrypto.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h log.h ssherr.h
+ssherr-nolibcrypto.o: ssherr.h
ssherr.o: ssherr.h
-sshkey.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h crypto_api.h ssh2.h ssherr.h misc.h sshbuf.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h rijndael.h digest.h sshkey.h match.h ssh-sk.h ssh-pkcs11.h openbsd-compat/openssl-compat.h
-sshlogin.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h sshlogin.h ssherr.h loginrec.h log.h sshbuf.h misc.h servconf.h openbsd-compat/sys-queue.h
-sshpty.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h sshpty.h log.h ssherr.h misc.h
-sshsig.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h authfd.h authfile.h log.h ssherr.h misc.h sshbuf.h sshsig.h sshkey.h match.h digest.h
-sshtty.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h sshpty.h
-ttymodes.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h packet.h openbsd-compat/sys-queue.h dispatch.h log.h ssherr.h compat.h sshbuf.h ttymodes.h
-uidswap.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h log.h ssherr.h uidswap.h xmalloc.h
-umac.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h umac.h misc.h rijndael.h
-umac128.o: umac.c includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h umac.h misc.h rijndael.h
-utf8.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h utf8.h
-xmalloc.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h log.h ssherr.h
+sshkey.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h crypto_api.h ssh2.h ssherr.h misc.h sshbuf.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h rijndael.h digest.h sshkey.h match.h ssh-sk.h ssh-pkcs11.h openbsd-compat/openssl-compat.h
+sshlogin.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h sshlogin.h ssherr.h loginrec.h log.h sshbuf.h misc.h servconf.h
+sshpty.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h sshpty.h log.h ssherr.h misc.h
+sshsig.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h authfd.h authfile.h log.h ssherr.h misc.h sshbuf.h sshsig.h sshkey.h match.h digest.h
+sshtty.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h sshpty.h
+ttymodes.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h packet.h dispatch.h log.h ssherr.h compat.h sshbuf.h ttymodes.h
+uidswap.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h log.h ssherr.h uidswap.h xmalloc.h
+umac.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h umac.h misc.h rijndael.h
+umac128.o: umac.c includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h umac.h misc.h rijndael.h
+utf8.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h utf8.h
+xmalloc.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h log.h ssherr.h
diff --git a/.github/ci-status.md b/.github/ci-status.md
index 82ea40a840b4..00a1db0df76a 100644
--- a/.github/ci-status.md
+++ b/.github/ci-status.md
@@ -8,6 +8,11 @@ master :
[![Coverity Status](https://scan.coverity.com/projects/21341/badge.svg)](https://scan.coverity.com/projects/openssh-portable)
<br>
+10.2 :
+[![C/C++ CI](../../../actions/workflows/c-cpp.yml/badge.svg?branch=V_10_2)](../../../actions/workflows/c-cpp.yml?query=branch:V_10_2)
+[![VM CI](../../../actions/workflows/vm.yml/badge.svg?branch=V_10_2)](../../../actions/workflows/vm.yml?query=branch:V_10_2)
+[![C/C++ CI self-hosted](https://github.com/openssh/openssh-portable-selfhosted/actions/workflows/selfhosted.yml/badge.svg?branch=V_10_2)](https://github.com/openssh/openssh-portable-selfhosted/actions/workflows/selfhosted.yml?query=branch:V_10_2)
+
10.1 :
[![C/C++ CI](../../../actions/workflows/c-cpp.yml/badge.svg?branch=V_10_1)](../../../actions/workflows/c-cpp.yml?query=branch:V_10_1)
[![VM CI](../../../actions/workflows/vm.yml/badge.svg?branch=V_10_1)](../../../actions/workflows/vm.yml?query=branch:V_10_1)
diff --git a/.github/configs b/.github/configs
index 230258f93f24..9ad2439df493 100755
--- a/.github/configs
+++ b/.github/configs
@@ -52,7 +52,7 @@ case "$config" in
CONFIGFLAGS="--with-xauth=/usr/bin/xauth --with-security-key-builtin"
CONFIGFLAGS="$CONFIGFLAGS --with-kerberos5=/usr --with-libedit --disable-strip"
;;
- clang-12-Werror)
+ clang-12-Werror)
CC="clang-12"
# clang's implicit-fallthrough requires that the code be annotated with
# __attribute__((fallthrough)) and does not understand /* FALLTHROUGH */
@@ -134,7 +134,9 @@ case "$config" in
CONFIGFLAGS="--with-kerberos5 --with-libedit --with-pam"
CONFIGFLAGS="${CONFIGFLAGS} --with-security-key-builtin --with-selinux"
CONFIGFLAGS="${CONFIGFLAGS} --with-linux-memlock-onfault"
+ CONFIGFLAGS="${CONFIGFLAGS} --with-audit=debug"
CFLAGS="-DSK_DEBUG -DSANDBOX_SECCOMP_FILTER_DEBUG"
+ EXTRA_TESTS="gss-auth"
;;
hardenedmalloc)
CONFIGFLAGS="--with-ldflags=-lhardened_malloc"
@@ -153,6 +155,7 @@ case "$config" in
;;
krb5|heimdal)
CONFIGFLAGS="--with-kerberos5"
+ EXTRA_TESTS="gss-auth"
;;
libedit)
CONFIGFLAGS="--with-libedit"
@@ -166,6 +169,7 @@ case "$config" in
pam-krb5)
CONFIGFLAGS="--with-pam --with-kerberos5"
SSHD_CONFOPTS="UsePam yes"
+ EXTRA_TESTS="gss-auth"
;;
*pam)
CONFIGFLAGS="--with-pam"
@@ -173,7 +177,7 @@ case "$config" in
;;
boringssl)
CONFIGFLAGS="--disable-pkcs11"
- LIBCRYPTOFLAGS="--with-ssl-dir=/opt/boringssl --with-rpath=-Wl,-rpath,"
+ LIBCRYPTOFLAGS="--with-ssl-dir=/opt/boringssl"
;;
aws-lc)
LIBCRYPTOFLAGS="--with-ssl-dir=/opt/aws-lc --with-rpath=-Wl,-rpath,"
@@ -195,7 +199,7 @@ case "$config" in
fi
;;
selinux)
- CONFIGFLAGS="--with-selinux"
+ CONFIGFLAGS="--with-selinux --with-audit=linux"
;;
sk)
CONFIGFLAGS="--with-security-key-builtin --with-security-key-standalone"
@@ -204,10 +208,14 @@ case "$config" in
LIBCRYPTOFLAGS="--without-openssl"
TEST_TARGET=t-exec
;;
- valgrind-[1-4]|valgrind-unit)
+ valgrind-[1-4]|valgrind-unit|valgrind-pam-1)
# rlimit sandbox and FORTIFY_SOURCE confuse Valgrind.
CONFIGFLAGS="--without-sandbox --without-hardening"
CONFIGFLAGS="$CONFIGFLAGS --with-cppflags=-D_FORTIFY_SOURCE=0"
+ if [ "${config}" = "valgrind-pam-1" ]; then
+ CONFIGFLAGS="$CONFIGFLAGS --with-pam"
+ SSHD_CONFOPTS="UsePam yes"
+ fi
TEST_TARGET="t-exec USE_VALGRIND=1"
TEST_SSH_ELAPSED_TIMES=1
export TEST_SSH_ELAPSED_TIMES
@@ -218,7 +226,7 @@ case "$config" in
tests3="krl forward-control sshsig agent-restrict kextype sftp"
tests4="cert-userkey cert-hostkey kextype sftp-perm keygen-comment percent"
case "$config" in
- valgrind-1)
+ valgrind-1|valgrind-pam)
# All tests except agent-timeout (which is flaky under valgrind),
# connection-timeout (which doesn't work since it's so slow)
# and hostbased (since valgrind won't let ssh exec keysign).
@@ -271,10 +279,6 @@ case "${TARGET_HOST}" in
TEST_TARGET="t-exec unit TEST_SHELL=bash"
SKIP_LTESTS="rekey sftp"
;;
- debian-riscv64)
- # This machine is fairly slow, so skip the unit tests.
- TEST_TARGET="t-exec"
- ;;
dfly58*|dfly60*)
# scp 3-way connection hangs on these so skip until sorted.
SKIP_LTESTS=scp3
@@ -367,6 +371,13 @@ case "$host" in
SKIP_LTESTS="agent-getpeereid" ;;
esac
;;
+*-solaris2.10)
+ # Only the sol10 VM has BSM libraries installed, so add that to
+ # the PAM test config.
+ if [ "${config}" = "pam" ]; then
+ CONFIGFLAGS="${CONFIGFLAGS} --with-audit=bsm"
+ fi
+ ;;
esac
# Unless specifically configured, search for a suitable version of OpenSSL,
diff --git a/.github/run_test.sh b/.github/run_test.sh
index 33c90ac291c2..c67d00700f23 100755
--- a/.github/run_test.sh
+++ b/.github/run_test.sh
@@ -51,6 +51,11 @@ else
${env} make ${TEST_TARGET} SKIP_LTESTS="${SKIP_LTESTS}" LTESTS="${LTESTS}"
fi
+# Activate kbdint regression test for PAM
+if echo "${SSHD_CONFOPTS}" | grep -i usepam >/dev/null && [ -f regress/password ]; then
+ cp regress/password regress/kbdintpw
+fi
+
if [ ! -z "${SSHD_CONFOPTS}" ]; then
echo "rerunning t-exec with TEST_SSH_SSHD_CONFOPTS='${SSHD_CONFOPTS}'"
if [ -z "${LTESTS}" ]; then
diff --git a/.github/setup_ci.sh b/.github/setup_ci.sh
index c90969627022..e1b3dcf04a84 100755
--- a/.github/setup_ci.sh
+++ b/.github/setup_ci.sh
@@ -3,7 +3,7 @@
config="$1"
target="$2"
-PACKAGES=""
+PACKAGES="tmux"
echo Running as:
id
@@ -102,10 +102,10 @@ for TARGET in $TARGETS; do
PACKAGES="$PACKAGES $compiler"
;;
krb5)
- PACKAGES="$PACKAGES libkrb5-dev"
+ PACKAGES="$PACKAGES libkrb5-dev libnss-wrapper krb5-admin-server"
;;
heimdal)
- PACKAGES="$PACKAGES heimdal-dev"
+ PACKAGES="$PACKAGES heimdal-dev libnss-wrapper krb5-admin-server"
;;
libedit)
case "$PACKAGER" in
@@ -123,7 +123,7 @@ for TARGET in $TARGETS; do
PACKAGES="$PACKAGES libfido2-dev libu2f-host-dev libcbor-dev"
;;
selinux)
- PACKAGES="$PACKAGES libselinux1-dev selinux-policy-dev"
+ PACKAGES="$PACKAGES libselinux1-dev selinux-policy-dev libaudit-dev"
;;
hardenedmalloc)
INSTALL_HARDENED_MALLOC=yes
diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml
index a132ed87f65f..02cd10bfbb6e 100644
--- a/.github/workflows/c-cpp.yml
+++ b/.github/workflows/c-cpp.yml
@@ -63,6 +63,7 @@ jobs:
- { target: ubuntu-22.04, config: valgrind-2 }
- { target: ubuntu-22.04, config: valgrind-3 }
- { target: ubuntu-22.04, config: valgrind-4 }
+ - { target: ubuntu-22.04, config: valgrind-pam-1 }
- { target: ubuntu-22.04, config: valgrind-unit }
- { target: ubuntu-22.04, config: without-openssl }
- { target: ubuntu-latest, config: gcc-14 }
diff --git a/.github/workflows/upstream.yml b/.github/workflows/upstream.yml
index 420b2439b009..a190a490ecbb 100644
--- a/.github/workflows/upstream.yml
+++ b/.github/workflows/upstream.yml
@@ -3,7 +3,7 @@ name: OpenBSD
on:
push:
branches: [ master ]
- paths: [ '**.c', '**.h', '**.sh', '.github/configs', '.github/workflows/upstream.yml' ]
+ paths: [ '**.c', '**.h', '**.sh', '.github/workflows/upstream.yml' ]
jobs:
selfhosted:
@@ -22,9 +22,11 @@ jobs:
host:
- libvirt
target: [ obsdsnap, obsdsnap-i386 ]
- config: [ default, without-openssl ] # TODO: restore 'ubsan' once fixed
+ # TODO: restore 'ubsan' once fixed
+ config: [ default, kerberos5, without-openssl ]
include:
- { host: libvirt-arm64, target: obsdsnap-arm64, config: default }
+ - { host: libvirt-arm64, target: obsdsnap-arm64, config: kerberos5 }
- { host: libvirt-arm64, target: obsdsnap-arm64, config: without-openssl }
# - { host: libvirt-arm64, target: obsdsnap-arm64, config: ubsan }
steps:
@@ -48,7 +50,7 @@ jobs:
- name: make clean
run: vmrun "cd /usr/src/usr.bin/ssh && make obj && make clean && cd /usr/src/regress/usr.bin/ssh && make obj && make clean && sudo chmod -R g-w /usr/src /usr/obj"
- name: make
- run: vmrun "cd /usr/src/usr.bin/ssh && case ${{ matrix.config }} in without-openssl) make OPENSSL=no;; ubsan) make DEBUG='-fsanitize-minimal-runtime -fsanitize=undefined';; *) make; esac"
+ run: vmrun "cd /usr/src/usr.bin/ssh && case ${{ matrix.config }} in without-openssl) make OPENSSL=no;; kerberos5) make KERBEROS5=yes;; ubsan) make DEBUG='-fsanitize-minimal-runtime -fsanitize=undefined';; *) make; esac"
- name: make install
run: vmrun "cd /usr/src/usr.bin/ssh && sudo make install && sudo /etc/rc.d/sshd -f restart"
- name: make tests`
diff --git a/.github/workflows/vm.yml b/.github/workflows/vm.yml
index 759de69cbe33..dbfd6c186c33 100644
--- a/.github/workflows/vm.yml
+++ b/.github/workflows/vm.yml
@@ -22,7 +22,6 @@ jobs:
strategy:
fail-fast: false
matrix:
- # First we test all OSes in the default configuration.
target:
- "6.4.2"
config: [default]
@@ -83,7 +82,6 @@ jobs:
strategy:
fail-fast: false
matrix:
- # First we test all OSes in the default configuration.
target:
- "13.5"
- "14.3"
@@ -127,7 +125,7 @@ jobs:
- name: "PAM: configure"
shell: freebsd {0}
- run: cd $GITHUB_WORKSPACE && sudo -u builder ./configure --with-pam
+ run: cd $GITHUB_WORKSPACE && sudo -u builder ./configure --with-pam --with-audit=bsm
- name: "PAM: make clean"
shell: freebsd {0}
run: cd $GITHUB_WORKSPACE && sudo -u builder make clean
@@ -147,7 +145,6 @@ jobs:
strategy:
fail-fast: false
matrix:
- # First we test all OSes in the default configuration.
target:
- "9.0"
- "9.4"
@@ -206,15 +203,15 @@ jobs:
sudo -u builder env SUDO=sudo SSHD_CONFOPTS="UsePam yes" make tests
- ominios:
+ omnios:
name: "omnios-${{ matrix.target }}"
if: github.repository != 'openssh/openssh-portable-selfhosted'
strategy:
fail-fast: false
matrix:
- # First we test all OSes in the default configuration.
target:
- "r151054"
+ - "r151046"
config: [default]
runs-on: ubuntu-latest
steps:
@@ -263,12 +260,12 @@ jobs:
strategy:
fail-fast: false
matrix:
- # First we test all OSes in the default configuration.
target:
- "7.3"
- "7.5"
- "7.6"
- "7.7"
+ - "7.8"
config: [default]
runs-on: ubuntu-latest
steps:
@@ -310,13 +307,111 @@ jobs:
doas -u builder env SUDO=doas make tests
+ openbsd-current-upstream:
+ # This job is special, and tests OpenBSD -current, both the underlying
+ # plaform (the latest snapshot) and most recent upstream code (or at least
+ # the most recent code in the github mirror) instead of OpenSSH Portable.
+ name: "openbsd-current-upstream"
+ if: github.repository != 'openssh/openssh-portable-selfhosted'
+ strategy:
+ fail-fast: false
+ runs-on: ubuntu-latest
+ steps:
+ - name: start OpenBSD VM
+ uses: vmactions/openbsd-vm@v1
+ with:
+ copyback: false
+ nat: |
+ "20022": "22"
+ usesh: true
+ prepare: |
+ useradd -g wobj -m builder
+ echo "permit nopass keepenv root" >/etc/doas.conf
+ echo "permit nopass keepenv builder" >>/etc/doas.conf
+ ls -l /etc/doas.conf
+ chown root:wheel /etc/doas.conf
+ chmod 644 /etc/doas.conf
+ touch /etc/ssh/ssh_known_hosts
+ pkg_add git
+
+ - name: Fetch sysupgrade version
+ run: |
+ ver=$(curl -s https://cdn.openbsd.org/pub/OpenBSD/snapshots/amd64/BUILDINFO)
+ echo "SNAPSHOT_VERSION=${ver}" >> $GITHUB_ENV
+ - name: check for cached sysupgrade
+ id: cache-sysupgrade
+ uses: actions/cache@v4
+ with:
+ key: openbsd-sysupgrade ${{ env.SNAPSHOT_VERSION }}
+ path: /tmp/_sysupgrade/
+ - name: push sysupgrade from cache to VM
+ if: steps.cache-sysupgrade.outputs.cache-hit == 'true'
+ run: rsync -av /tmp/_sysupgrade/ openbsd:/home/_sysupgrade/
+ - name: upgrade to latest snapshot
+ run: ssh -q openbsd sysupgrade -s -k || true
+ - name: wait for upgrade
+ run: |
+ SECONDS=0; sleep 10; while ! ssh -q -oConnectTimeout=1 openbsd true; do sleep 10; echo waited ${SECONDS}s; done
+ ssh -q openbsd uname -a
+ - name: retrieve sysupgrade from VM to cache
+ if: steps.cache-sysupgrade.outputs.cache-hit != 'true'
+ run: |
+ mkdir -p /tmp/_sysupgrade/
+ rsync -av openbsd:/home/_sysupgrade/ /tmp/_sysupgrade/
+ - name: save sysupgrade to cache
+ if: steps.cache-sysupgrade.outputs.cache-hit != 'true'
+ uses: actions/cache/save@v4
+ with:
+ key: openbsd-sysupgrade ${{ env.SNAPSHOT_VERSION }}
+ path: /tmp/_sysupgrade/
+
+ - name: checkout upstream source
+ shell: openbsd {0}
+ run: |
+ umask 022
+ cd /usr
+ rm -rf src/*
+ git clone --no-checkout --depth=1 --filter=tree:0 https://github.com/openbsd/src.git
+ cd /usr/src
+ git sparse-checkout set --no-cone Makefile usr.bin/Makefile usr.bin/Makefile.inc usr.bin/ssh usr.bin/nc regress/usr.bin/ssh
+ git checkout
+ git log -n1
+ chown -R builder /usr/src
+ chmod -R go-w /usr/src/ /usr/obj/
+ - name: make ssh
+ shell: openbsd {0}
+ run: |
+ cd /usr/src/usr.bin/ssh && make -j4 || make
+ make install
+ /etc/rc.d/sshd restart
+ - name: make nc
+ shell: openbsd {0}
+ run: cd /usr/src/usr.bin/nc && make && make install
+ - name: make tests
+ shell: openbsd {0}
+ run: |
+ cd /usr/src/regress/usr.bin/ssh
+ make obj
+ doas -u builder env SUDO=doas TEST_SSH_UNSAFE_PERMISSIONS=yes TEST_SSH_FAIL_FATAL=yes TEST_SSH_HOSTBASED_AUTH=setupandrun make
+ - name: retrieve logs
+ if: failure()
+ run: |
+ rsync -a openbsd:/usr/obj/regress/usr.bin/ssh/ regress-logs/
+ for i in regress-logs/failed*.log; do echo ===; echo LOGFILE: $i; echo ===; cat $i; echo; done
+ - name: save logs
+ if: failure()
+ uses: actions/upload-artifact@main
+ with:
+ name: openbsd-current-upstream-logs
+ path: regress-logs/*.log
+
+
solaris:
name: "solaris-${{ matrix.target }}"
if: github.repository != 'openssh/openssh-portable-selfhosted'
strategy:
fail-fast: false
matrix:
- # First we test all OSes in the default configuration.
target:
- "11.4-gcc"
config: [default]
@@ -372,3 +467,4 @@ jobs:
run: |
cd $GITHUB_WORKSPACE
sudo -u builder make tests
+
diff --git a/.gitignore b/.gitignore
index df0f2ce0464e..907533067c8b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,7 @@
+*~
Makefile
buildpkg.sh
config.h
-config.h.in~
config.log
config.status
openbsd-compat/Makefile
@@ -17,7 +17,6 @@ survey.sh
**/*.dll
**/*.out
**/*.a
-**/*.un~
**/.*.swp
autom4te.cache/
scp
diff --git a/.skipped-commit-ids b/.skipped-commit-ids
index 138ca3d019f9..f4b7ee22e092 100644
--- a/.skipped-commit-ids
+++ b/.skipped-commit-ids
@@ -46,6 +46,7 @@ ef7ecdb6dd2542f42fa7236d17ac0b144851f0b5 ssh-keygen, fixup'ed into 21682417
da414a364c25b187fc686da7aacec2c35d29238a ssh-keygen, fixup'ed into 21682417
a05e13a7e2c0b65bb4b47184fef731243431c6ff Makefile.inc
7e8178786157e863f6ff63c5d55200d7b6b04f9e remove old sandbox files
+98eefed432ff8253b307002e20d28da14b93e7e3 Makefile.inc
Old upstream tree:
diff --git a/ChangeLog b/ChangeLog
index 83b4cece2f34..65e75a5a529f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,45 +1,2854 @@
-commit 2d8a388de215d9959d72bb11f03e07a6eb2e4614
+commit 4168c905943f7f715182180b9f7c8cda54af2514
Author: Damien Miller <djm@mindrot.org>
-Date: Fri Oct 10 13:37:07 2025 +1100
+Date: Thu Apr 2 18:56:48 2026 +1100
depend
-commit 1d2676f4ffae35e2db37a35c385efaf2932cd639
+commit f8b9d694fc20349b6c48a4af03a0499dea00f5f9
Author: Damien Miller <djm@mindrot.org>
-Date: Thu Oct 9 14:53:04 2025 +1100
+Date: Thu Apr 2 18:55:50 2026 +1100
- update versions
+ Update versions in RPM spec files
-commit ecd65a492bd0ed3a44a1c07428107b2e148bfee4
+commit 5aa09926fbf050d484a79717fadec8360c5c5645
Author: djm@openbsd.org <djm@openbsd.org>
-Date: Wed Oct 8 00:32:52 2025 +0000
+Date: Thu Apr 2 07:52:15 2026 +0000
- upstream: openssh-10.2
+ upstream: adapt to username validity check change
- The only change since 10.1 is the channels.c fix
+ OpenBSD-Regress-ID: d22c66ca60f0d934a75e6ca752c4c11b9f4a5324
+
+commit eb3a5bb2abd4798ff546564eb2210d188efaf0f1
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Thu Apr 2 07:51:12 2026 +0000
+
+ upstream: openssh-10.3
- OpenBSD-Commit-ID: 5eebeb0db14c694efd4ee96b5f16112e3e5d5ba9
+ OpenBSD-Commit-ID: 05e22de74e090e5a174998fa5799317d70ad19c4
-commit ea9af2921cb6af8e65341531db3a7351917f0a92
+commit 76685c9b09a66435cd2ad8373246adf1c53976d3
Author: djm@openbsd.org <djm@openbsd.org>
-Date: Wed Oct 8 21:02:16 2025 +0000
+Date: Thu Apr 2 07:50:55 2026 +0000
- upstream: fix crash at exit (visible via ssh-keygen -D) when
+ upstream: move username validity check for usernames specified on
- multiple keys loaded. ok markus deraadt dtucker
+ the commandline to earlier in main(), specifically before some contexts where
+ a username with shell characters might be expanded by a %u directive in
+ ssh_config.
+ MIME-Version: 1.0
+ Content-Type: text/plain; charset=UTF-8
+ Content-Transfer-Encoding: 8bit
- OpenBSD-Commit-ID: baa9763ec69d162108dafd962792ec5610ff45c9
+ We continue to recommend against using untrusted input on
+ the SSH commandline. Mitigations like this are not 100%
+ guarantees of safety because we can't control every
+ combination of user shell and configuration where they are
+ used.
+
+ Reported by Florian Kohnhäuser
+
+ OpenBSD-Commit-ID: 25ef72223f5ccf1c38d307ae77c23c03f59acc55
-commit e49013576074ccd2d7ae75fb824170c739ce97a1
+commit fd1c7e131f331942d20f42f31e79912d570081fa
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Thu Apr 2 07:48:13 2026 +0000
+
+ upstream: correctly match ECDSA signature algorithms against
+
+ algorithm allowlists: HostKeyAlgorithms, PubkeyAcceptedAlgorithms and
+ HostbasedAcceptedAlgorithms.
+
+ Previously, if any ECDSA type (say "ecdsa-sha2-nistp521") was
+ present in one of these lists, then all ECDSA algorithms would
+ be permitted.
+
+ Reported by Christos Papakonstantinou of Cantina and Spearbit.
+
+ OpenBSD-Commit-ID: c790e2687c35989ae34a00e709be935c55b16a86
+
+commit 487e8ac146f7d6616f65c125d5edb210519b833a
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Thu Apr 2 07:42:16 2026 +0000
+
+ upstream: when downloading files as root in legacy (-O) mode and
+
+ without the -p (preserve modes) flag set, clear setuid/setgid bits from
+ downloaded files as one might expect.
+
+ AFAIK this bug dates back to the original Berkeley rcp program.
+
+ Reported by Christos Papakonstantinou of Cantina and Spearbit.
+
+ OpenBSD-Commit-ID: 49e902fca8dd933a92a9b547ab31f63e86729fa1
+
+commit c805b97b67c774e0bf922ffb29dfbcda9d7b5add
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Thu Apr 2 07:39:57 2026 +0000
+
+ upstream: add missing askpass check when using
+
+ ControlMaster=ask/autoask and "ssh -O proxy ..."; reported by Michalis
+ Vasileiadis
+
+ OpenBSD-Commit-ID: 8dd7b9b96534e9a8726916b96d36bed466d3836a
+
+commit 78d549857e0cc480c3cbb0a3571078920e3b79c5
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Thu Apr 2 07:38:14 2026 +0000
+
+ upstream: Fix possible sshd crash when sshd_config set MaxStartups
+
+ to a value <10 using the single-argument form of MaxStartups (e.g.
+ MaxStartups=3). This doesn't affect the three-argument form of the directive
+ (e.g. MaxStartups 3:20:5).
+
+ Patch from Peter Kaestle via bz3941
+
+ OpenBSD-Commit-ID: 1ad093cae69f55ebfdea1ab24318aefd593d63b8
+
+commit 5d72f1865b95ebfd99ea7baa8f6f2a4b721d151e
Author: Damien Miller <djm@mindrot.org>
-Date: Thu Oct 9 10:07:40 2025 +1100
+Date: Thu Apr 2 18:32:00 2026 +1100
- link ssh-keygen directly against ssh-pkcs11.c
+ properly bail out when PAM changes username
- Matches what OpenBSD does and fixes ssh-keygen regression in
- certifying keys using a CA key hosted via ssh-agent (bz3877)
+ OpenSSH doesn't support PAM changing its conception of the
+ username via a module calling pam_set_item(h, PAM_USER, ...).
+ We were supposed to bail out here, but I messed up while "fixing"
+ this last time and dropped a return statement.
+
+ Reported by Mike Damm
+
+commit fe86c39751d38eb9e9b03ace1e31aa4586ea6660
+Author: Michael Forney <mforney@mforney.org>
+Date: Wed Apr 1 12:09:00 2026 +1100
+
+ avoid k suffix in dd count operand in sftp-resume test
+
+ Not all dd implementations support this. POSIX only specifies
+ suffixes for block size operands.
+
+ Instead, just use 1024k to avoid the special case. This also removes
+ an incorrect redirection operator that appeared in the 1m case.
+
+commit 52c01f2a8019002c70cfd93be87ff9adee1d0e73
+Author: Michael Forney <mforney@mforney.org>
+Date: Tue Mar 31 12:54:22 2026 +1100
+
+ add missing <stdio.h> include to unit tests for printf
+
+ This fixes the build with --without-openssl on musl. glibc worked
+ previously because it got stdio.h implicitly through resolv.h.
+
+commit 1340d3fa8e4bb122906a82159c4c9b91584d65ce
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Mon Mar 30 21:58:44 2026 +1100
+
+ Add proxyjump.sh omitted from previous commit.
+
+commit 607bd871ec029e9aa22e632a22547250f3cae223
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Mon Mar 30 07:19:02 2026 +0000
+
+ upstream: add a regression test for ProxyJump/-J; ok dtucker
+
+ OpenBSD-Regress-ID: 400dc1b5fb7f2437d0dfbd2eb9a3583dafb412b3
+
+commit 55fc7bfd1d3a46f4856fd68f09da60d901fac626
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Tue Mar 24 12:31:35 2026 +0000
+
+ upstream: Use ~/.shosts for Hostbased test.
+
+ OpenBSD-Regress-ID: ab64fd0a86422df1eadacde56c0a2cff5d93425d
+
+commit 445db5cb620d73c9af1f1791c523aaf3d2236854
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Tue Mar 24 10:21:14 2026 +0000
+
+ upstream: Ensure known_hosts file exists when setting up.
+
+ OpenBSD-Regress-ID: 92721cad4c219fe62b7b795a73505c22e56f09e0
+
+commit 2ecfcc0aae651621535e345a1c23ff6d2a9593c9
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Mon Mar 23 09:53:52 2026 +0000
+
+ upstream: Check if host keys exist before adding them, and expand
+
+ on the warning about modifying the system config.
+
+ OpenBSD-Regress-ID: 68038da909f9c992375b7665dab0331d6af426b7
+
+commit 5576e260a0f9836ca55c8279e342c63d1a0851d1
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Mon Mar 23 09:09:36 2026 +0000
+
+ upstream: Add special handling of
+
+ TEST_SSH_HOSTBASED_AUTH=setupandrun.
+
+ This will MODIFY THE CONFIG OF THE SYSTEM IT IS RUNNING ON to enable
+ hostbased authentication to/from itself and run the hostbased tests. It
+ won't undo these changes, so don't do this on a system where this matters.
+
+ OpenBSD-Regress-ID: ae5a86db1791a2b8f999b07b5c8cc756d40bf645
+
+commit 0a0ef4515361143cad21afa072319823854c1cf6
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Mon Mar 30 07:18:24 2026 +0000
+
+ upstream: apply the same validity rules to usernames and hostnames
+
+ set for ProxyJump/-J on the commandline as we do for destination user/host
+ names.
+
+ Specifically, they are no longer allowed to contain most characters
+ that have special meaning for common shells. Special characters are
+ still allowed in ProxyJump commands that are specified in the config
+ files.
+
+ This _reduces_ the chance that shell characters from a hostile -J
+ option from ending up in a shell execution context.
+
+ Don't pass untrusted stuff to the ssh commandline, it's not intended
+ to be a security boundary. We try to make it safe where we can, but
+ we can't make guarantees, because we can't know the parsing rules
+ and special characters for all the shells in the world, nor can we
+ know what the user does with this data in their ssh_config wrt
+ percent expansion, LocalCommand, match exec, etc.
+
+ While I'm in there, make ProxyJump and ProxyCommand first-match-wins
+ between each other.
+
+ reported by rabbit; ok dtucker@
+
+ OpenBSD-Commit-ID: f05ad8a1eb5f6735f9a935a71a90580226759263
+
+commit b62a6cfbed3481dac8bff35fab22cf489bb0b77f
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Sun Mar 29 01:08:13 2026 +0000
+
+ upstream: switch from int to long long for bandwidth calculations;
+
+ fixes rate display when rate > 2GB/s; based on patch from Cyril Servant
+ feedback/ok deraadt@
+
+ OpenBSD-Commit-ID: 071eb48c4cba598d70ea3854bef7c49ddfabf8d3
+
+commit 54443b8665c9c29ea0e3f5a5176d8f3c3403ad7c
+Author: Damien Miller <djm@mindrot.org>
+Date: Sun Mar 29 16:43:59 2026 +1100
+
+ depend
+
+commit c90f46b6230826cdadacd6c32b62b0f8106a09da
+Author: Damien Miller <djm@mindrot.org>
+Date: Sun Mar 29 16:42:33 2026 +1100
+
+ use nonnull attribute when available
+
+ Set this attribute on a few string to avoid compiler warnings from
+ -Wunterminated-string-initialization warnings in recent gcc.
+
+commit bdaf65ae51d62c6cb676bd341cc34217c1b24920
+Author: Damien Miller <djm@mindrot.org>
+Date: Sun Mar 29 16:24:59 2026 +1100
+
+ fix state confusion between PAM and privsep code
+
+ Commits b9a6dd4d6 and df2b28163 introduced a potential desynchronisation
+ between the PAM code and the sshd-session monitor that could result in
+ authentication bypass if the unprivileged sshd-auth process had been
+ compromised.
+
+ Reported by Ben Edelman of NIST. Only git HEAD is affected, these
+ changes have not yet been included in an OpenSSH release.
+
+commit 6eb5a68c42a587df802d3d9a19088671269ffca8
+Author: Laurent Chardon <laurent.chardon@gmail.com>
+Date: Sat Mar 28 04:22:54 2026 -0400
+
+ openbsd-compat: reword EAI_NONAME error string
+
+ Reword the EAI_NONAME message in fake-rfc2553.c to make it
+ clearer and grammatically correct.
+
+ While there, remove a couple of stray periods from other error
+ strings to keep the messages consistent.
+
+ No functional change.
+
+commit fd7d4b2b52deaf296b06d78b85c97fdae31912e8
+Author: Icenowy Zheng <uwu@icenowy.me>
+Date: Sun Mar 22 15:13:31 2026 +0800
+
+ seccomp sandbox: allow riscv_hwprobe syscall if present
+
+ The development branch of zlib-ng now contains code for utilizing
+ riscv_hwprobe syscall to retrieve availability information for several
+ RISC-V extensions (and accelerate deflate algorithm with them).
+
+ As the seccomp sandbox of OpenSSH will raise SIGSYS for filtered out
+ syscalls, this will abruptly terminate the process when the
+ riscv_hwprobe syscall is tried.
+
+ Put it into the allowlist to prevent process termination. As all
+ syscalls here are guarded by #ifdef's, the same will be done for
+ riscv_hwprobe, and thus on non-RISC-V builds nothing will happen.
+
+ Signed-off-by: Icenowy Zheng <uwu@icenowy.me>
+
+commit fd5018fbeb6e91ae4321490c2825ecc632b83748
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Sat Mar 28 05:16:18 2026 +0000
+
+ upstream: ensure c->local_window doesn't underflow during updates;
+
+ similar to checks performed elsewhere. From Renaud Allard
+
+ OpenBSD-Commit-ID: 4827c10807936e9ab9af2cf1c7379e1f56dbdeac
+
+commit 8331cb9daafd23391de4379e9977ff159bb8242e
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Sat Mar 28 05:10:25 2026 +0000
+
+ upstream: fix base16 parsing; currently unused. From Renaud Allard
+
+ OpenBSD-Commit-ID: 3f6e5d4c6a2550d5a7e3c33bcd895b7f8e42196b
+
+commit 21ecb5fd72ee442a8b1eb5011c7f929ba8ce02f9
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Sat Mar 28 05:07:12 2026 +0000
+
+ upstream: mention that RevokedKeys is read by the server at each
+
+ authentication time and should only ever be replaced atomically.
+
+ OpenBSD-Commit-ID: eeedf5a10331ac4e39fbd2fc41e4a11c38b2ef9b
+
+commit c5182e3f06f9f1fd86d62b9dcd0397408dd698da
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Sat Mar 28 05:06:16 2026 +0000
+
+ upstream: fix potential hang if /etc/moduli doesn't contain the
+
+ requested DH group values; from 77c9ca, ok dtucker@, markus@
+
+ OpenBSD-Commit-ID: 1bf402cdb8876237c280ac77fbf7fafd2c16c5ae
+
+commit d3efbba14fda78ed7b15fbc34cf34c1cf27d1716
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Thu Mar 19 17:57:26 2026 +1100
+
+ Add a VM-based test for OpenBSD-current.
+
+commit 4bb4f1601e0776e71cfca50aae3680eb0771e2d0
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Mon Mar 23 17:50:40 2026 +1100
+
+ Add a Valgrind test of the PAM config.
+
+commit 12da685dfc98b14dddb5977a1fc52d06474f3308
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Thu Mar 19 17:52:54 2026 +1100
+
+ Upstream tests don't use the config file.
+
+commit 2ca6eef69d7dbecfd67cede25ea6a9aa1074ba3e
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Mon Mar 23 01:33:46 2026 +0000
+
+ upstream: clarify that Authorized(Keys|Principals)(File|Command)
+
+ are only consulted for valid users.
+
+ clarify that TOKENS are expanded without sanitisation or escaping
+ and that it's the user's reponsibility to ensure their usage is
+ safe.
+
+ prompted by bz3936; feedback/ok deraadt@
+
+ OpenBSD-Commit-ID: cd58abad1137346ba2dee55fa9ebb975f5fa7a06
+
+commit 443616ce9070d370c97271347e91fcfd24b5df84
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Thu Mar 19 02:36:28 2026 +0000
-commit 684f2ceff8c0eeb775e8653cf32609f8fbfe07b1
+ upstream: repair ssh-keysign after pledge changes; spotted/tested
+
+ by naddy@ ok deraadt@
+
+ OpenBSD-Commit-ID: fccc6c7994c8f45c4417efe490d23154d9caaa6d
+
+commit 552a5c786b60a9cfe0d2c157dd18f78950529513
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Wed Mar 11 09:10:59 2026 +0000
+
+ upstream: Check return values of fcntl(... O_CLOEXEC)
+
+ calls by reusing the macro in monitor.c. Flagged by Coverity CID
+ 901297 in ssh-sk-client.c, a few other instances added for good measure.
+ begrudging ok deraadt@
+
+ OpenBSD-Commit-ID: b9de92e17ac0b04348770e5a25cb15a02b416926
+
+commit 24168275e6d0b29cf2233c3f2c1d4a4614feb582
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Wed Mar 11 09:04:17 2026 +0000
+
+ upstream: Fix potential 1-byte array overrun
+
+ in the case where read() returns exactly 100 bytes. Flagged by Coverity
+ CID 901296, ok djm@
+
+ OpenBSD-Commit-ID: 66a96b08166e63dcbeed00297c33f09c4f22c1f7
+
+commit 70a41262839a2d65ca8ef9e8ea34ad471c52afa1
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Tue Mar 10 07:27:14 2026 +0000
+
+ upstream: whitespace
+
+ OpenBSD-Commit-ID: b16d2b4a96406538fa181053926cba44abca7f29
+
+commit ef98b6014bc3268e904092894ffcb63022172a97
+Author: deraadt@openbsd.org <deraadt@openbsd.org>
+Date: Tue Mar 10 06:35:29 2026 +0000
+
+ upstream: when unveils error our, use correct variable
+
+ OpenBSD-Commit-ID: 6b496c10965e70413a9916a8823839c553c6b2c4
+
+commit beba5884dfe8cc30aadef439af5e5d784b5788b1
+Author: deraadt@openbsd.org <deraadt@openbsd.org>
+Date: Tue Mar 10 03:45:01 2026 +0000
+
+ upstream: When execve() failure is indicated on the pipe, replicate
+
+ the same error conditions as the previous access() check did ok djm
+
+ OpenBSD-Commit-ID: 875a77dddf0809a3501de2b913cb3bfd4b64f3f7
+
+commit 2a9e1aadaa20a05430bddc30853fbd3449083a4d
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Tue Mar 10 03:40:26 2026 +0000
+
+ upstream: unveil ssh-pkcs11-helper too; fixes breakage spotted by
+
+ anton@
+
+ If SK/P11/askpass is overridden by environment, only unveil the requested
+ path and not both the requested one and the default.
+
+ feedback/ok deraadt@
+
+ OpenBSD-Commit-ID: 84356c6a44f35e66fe73fc1524a7c8e908521eb2
+
+commit 46eb7dc5a6f312f99437ebdcf04f0f2c03aa570b
+Author: deraadt@openbsd.org <deraadt@openbsd.org>
+Date: Sat Mar 7 18:35:43 2026 +0000
+
+ upstream: With it's own daemonization / fd cleaning code, ssh-agent
+
+ opens /dev/null O_RDWR after a pledge without "wpath". This is allowed in
+ current pledge because "/dev/null" is implicitly allowed to be opened even
+ with the most restrictive pledges or unveils. This is a design decision in
+ pledge made at the very beginning, to satisfy libc requirements. We've
+ finally had enough experience and know how to fix that in the near-future,
+ but need to review and fix all code which opens these implicit paths. The fix
+ is to add "wpath", so that "/dev/null" can be opened O_RDWR. But that is
+ uncomfortable, so we add unveil() allowing "/" with "r", 4 unveil "x" for the
+ potential askpass and helpers to be execve'd, and "/dev/null" with "wr". As
+ a result filesystem access is substantially more restricted than before, and
+ ssh-agent is ready for the future pledge change. ok djm dtucker
+
+ OpenBSD-Commit-ID: f223b11d2db3c0b14e53c1de59966dd5f372a977
+
+commit b75bf339eae6115c544bdcefa0d67a6dcc971ec5
+Author: deraadt@openbsd.org <deraadt@openbsd.org>
+Date: Sat Mar 7 18:27:52 2026 +0000
+
+ upstream: Stop doing access() before execve(). It is a TOCTOU, but
+
+ also it forces use of unveil "rx" instead of "x". This is done by using a
+ pipe() through the fork+execve attempt to expose execve failure and create
+ the same error return as the access() used to do. ok djm dtucker
+
+ OpenBSD-Commit-ID: f9ee96e20352f35dc6f39127e0cc6b804700200a
+
+commit 73888af650f0ce27cd93797f3e351b2d1b670550
+Author: Damien Miller <djm@mindrot.org>
+Date: Tue Mar 10 14:43:30 2026 +1100
+
+ stubs for OpenBSD unveil(2)
+
+commit 4e15f7fc0c0ba897c227350eee1462d635ab32a6
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Fri Mar 6 07:06:45 2026 +0000
+
+ upstream: Move OpenBSD CVS ID marker to top of file to avoid conflicts
+
+ when syncing changes to portable.
+
+ OpenBSD-Regress-ID: 6b7a9ef354e13e26ed474e98d04ec1d74e56e54e
+
+commit 2df416dff1a1d5fb31598b7ce8fb5cb6b0f64fd3
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Fri Mar 6 06:57:33 2026 +0000
+
+ upstream: Replace u_intXX_t types with the equivalent C99 uintXX_t
+
+ types to match similar change to the main ssh code.
+
+ OpenBSD-Regress-ID: a62b6499f784f75a4fcb865aebb83f5936917a91
+
+commit e067ccd6b4306ca6422d94ff7ddd231cbddd43cb
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Thu Mar 5 05:44:15 2026 +0000
+
+ upstream: ssh-agent supports a "query" extension that allows a
+
+ client to request a list of extensions it support. This makes this capability
+ available to ssh-add via the -Q flag.
+
+ ok markus@
+
+ OpenBSD-Commit-ID: f211630568ff1a7d6bb4983a94f05ddac1c2d4eb
+
+commit 4fe278629c3f792628ea71132ba4fcbb9ceaa6b7
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Thu Mar 5 05:40:35 2026 +0000
+
+ upstream: With IANA codepoints for draft-ietf-sshm-ssh-agent now
+
+ allocated, it's safe to start using the standard names for requesting agent
+ forwarding over the @openssh.com extension names we've used to date.
+
+ Support for the standard names is advertised via EXT_INFO. When the
+ client sees such support it will use the new names preferentially,
+ but the existing names remain supported unconditionally.
+
+ ok markus@
+
+ OpenBSD-Commit-ID: 1ab4a0b4de01e81a432875c2b7e5f7357e231af3
+
+commit 511f5bc41aeca7f6ee6611e9b24d48e4dd6ae3d5
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Thu Mar 5 05:35:44 2026 +0000
+
+ upstream: correctness wrt draft-ietf-sshm-ssh-agent:
+
+ extension requests should indicate failure using
+ SSH_AGENT_EXTENSION_FAILURE rather than the generic SSH_AGENT_FAILURE
+ error code. This allows the client to discern between "the request
+ failed" and "the agent doesn't support this extension".
+
+ ok markus@
+
+ OpenBSD-Commit-ID: d15d89f210cc973271d68147f09550163df731c9
+
+commit 2a387ba37452971747d2f00db7d4c18b4f2c45ed
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Tue Mar 3 09:57:25 2026 +0000
+
+ upstream: Replace all remaining instances of u_intXX_t types with the
+
+ C99 equivalent uintXX_t types. ok djm@
+
+ OpenBSD-Commit-ID: d9b81151266adb129574ce268af49f14ac23e65b
+
+commit bb781f02d4efd178e329a62a838962bee16e3e9b
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Mon Mar 2 02:40:15 2026 +0000
+
+ upstream: Move banner exchange to sshd-auth process
+
+ Previously, exchange of the initial SSH- banners was performed
+ by the privileged sshd-session monitor. This moves it to the
+ unprivileged sshd-auth subprocess, removing ~200 LoC from the
+ monitor's privileged attack surface.
+
+ The monitor gains a new "setcompat" RPC to allow sshd-auth to
+ inform it of bug compat flags picked up from the client's banner.
+
+ feedback dtucker@, ok markus@ deraadt@
+
+ OpenBSD-Commit-ID: d767eb1183630d754d521d9f0d84a6c72fbe7fc8
+
+commit b50b881b17ab15e34b5e57b159b65f2a02725798
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Sun Mar 1 09:46:39 2026 +1100
+
+ Try -lstdc++ for libcrypto before giving up.
+
+ BoringSSL recently added destructors to libcrypto, which requires
+ linking against libstdc++, so when checking for a working libcrypto if
+ at first the link fails, try again with -lstdc++ before giving up.
+
+commit c26d90e5ad05372b63dbb8727cb6c23a6505a2fb
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Sun Mar 1 09:41:39 2026 +1100
+
+ Remove BoringSSL rpath as it's statically linked.
+
+commit c65f4d2586416274e92720c9e1e745422e182488
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Tue Feb 24 01:50:51 2026 +0000
+
+ upstream: Use fmprintf instead of logit for challenge-response name and
+
+ info to preserve UTF-8 characters where appropriate. Prompted by github
+ PR#452, with & ok djm@.
+
+ OpenBSD-Commit-ID: e6361242329ec6925571478f60f4739726aad308
+
+commit acf749756872d7555eca48514e5aca6962116fb2
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Tue Feb 24 11:28:11 2026 -0500
+
+ Add AWS-LC and BoringSSL as potential libcryptos.
+
+commit c25254d1516df5e57affc0e391ed6ead8267b637
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Tue Feb 24 11:16:11 2026 -0500
+
+ Add self-hosted status to main README now it's public.
+
+commit 5da0ccec2b5806f104913465b62fea475b2e15bb
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Tue Feb 24 11:10:16 2026 -0500
+
+ Remove anchor to specific release notes version.
+
+commit d7a9cd696a316c71e4c16f4158dc516b94abd863
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Mon Feb 23 21:34:48 2026 -0500
+
+ Remove potentially leftover include compat shims.
+
+ If we don't need a specific shim, ensure it does not exist. Prevents
+ confusion if configurations change or the directory is reused across
+ different platforms.
+
+commit c940e709ae2155a4614bc3709e393d88fdddabde
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Mon Feb 23 20:54:55 2026 -0500
+
+ Check regress passwd is set before enabling kbdint.
+
+commit 4ed5f9ecca9ed867c9f1040a3425af35f0703675
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Tue Feb 24 00:39:59 2026 +0000
+
+ upstream: Remove leftover debugging.
+
+ OpenBSD-Regress-ID: e778d76b21696a14db80f31b9e79601f2d7a9abf
+
+commit a07a53b00e9aeadb420336783d219be012d88ba1
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Mon Feb 23 15:22:10 2026 -0500
+
+ Activate kbdint test on PAM configs.
+
+commit 5f98660c51e673f521e0216c7ed20205c4af10ed
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Wed Feb 18 12:39:31 2026 -0500
+
+ Install libaudit-dev for --with-audit=linux test.
+
+commit c9fcea8865b255d4b7566b28dce4af348d2bfbd6
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Wed Feb 18 11:22:37 2026 -0500
+
+ Enable BSM audit test on FreeBSD VMs.
+
+commit f1a9628cd7e415ce14e157d80c10b61514a22d13
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Wed Feb 18 10:59:02 2026 -0500
+
+ Move BSM audit test to selfhosted runner.
+
+ The vmactions VM on Github does not have the required libraries
+ installed.
+
+commit 97e8e66219d036404ae656060f0e0179b61f0614
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Wed Feb 18 10:51:09 2026 -0500
+
+ Increase riscv64 test coverage.
+
+ The machine running the tests has been replaced with a faster one.
+
+commit e5e18432a27b909aa2194ef0b28a5d49f0e6b3a6
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Wed Feb 18 10:49:35 2026 -0500
+
+ Whitespace fix.
+
+commit b0463306174941274a1f96eb705618e036832920
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Wed Feb 18 09:48:55 2026 -0500
+
+ Add test coverage for all of the --audit= configs.
+
+commit 84206bde8adbef2dfe4f5b97dd23399827015333
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Wed Feb 18 03:04:12 2026 +0000
+
+ upstream: same treatment for remote/remote copies (i.e. scp -3):
+
+ adjust permissions on destination directory only if we created it or -p was
+ requested. bz3925
+
+ OpenBSD-Commit-ID: d977006df7b8330e06ceaa319383b347f1aca3ef
+
+commit c3631567d9f77c2d073764e4b40f249687f4083e
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Wed Feb 18 02:59:27 2026 +0000
+
+ upstream: when uploading a directory using sftp/sftp (e.g. during a
+
+ recursive transfer), don't clobber the remote directory permissions unless
+ either we created the directory during the transfer or the -p flag was set.
+ bz3925 ok dtucker@
+
+ OpenBSD-Commit-ID: d66f40d01de05c9ec4029fab5413325301039b3a
+
+commit 2b0f4a72bd87bef7cc9f0a1889cfc98545cbb158
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Tue Feb 17 21:45:07 2026 +0000
+
+ upstream: make IPQoS first-match-wins in sshd_config as it's
+
+ intended to be bz3924
+
+ OpenBSD-Commit-ID: 42753eb8400ab09713c69ace6fa8bfdde133f942
+
+commit 0e35095babe04ba1159e8029133e7f71e53d8fdb
+Author: jsg@openbsd.org <jsg@openbsd.org>
+Date: Mon Feb 16 23:47:06 2026 +0000
+
+ upstream: remove duplicate includes; ok dtucker@
+
+ OpenBSD-Commit-ID: 6b9191bc1a0f4320c926d5ccd9f36b09f0f3bcaf
+
+commit 9eb778cfde5bca1d84bbad74d8664256301bb13b
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Mon Feb 16 18:58:04 2026 -0500
+
+ Restore utf8.h removed earlier as it's needed.
+
+ ... for msetlocale prototype.
+
+commit 723b76c8a358875cd53376c9a169887ba7a4b088
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Mon Feb 16 18:32:41 2026 -0500
+
+ Removed duplicate includes; spotted by jsg@.
+
+commit df2b28163ac75e023837de445d6492dc57359105
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Sun Feb 15 14:16:56 2026 -0500
+
+ Remove "draining" of PAM prompts.
+
+ With the previous commit, both prompts and info/error error messages are
+ returned to keyboard-interactive immedately and none are accumulated, so
+ there will never be any un-drained prompts. ok djm@
+
+commit b9a6dd4d66ee14577494d550b396d0452bf05e1e
+Author: Marco Trevisan (Treviño) <mail@3v1n0.net>
+Date: Tue Oct 17 04:27:32 2023 +0200
+
+ auth-pam: Immediately report interactive instructions to clients
+
+ SSH keyboard-interactive authentication method supports instructions but
+ sshd didn't show them until an user prompt was requested.
+
+ This is quite inconvenient for various PAM modules that need to notify
+ an user without requiring for their explicit input.
+
+ So, properly implement RFC4256 making instructions to be shown to users
+ when they are requested from PAM.
+
+ Closes: https://bugzilla.mindrot.org/show_bug.cgi?id=2876
+
+commit a1158bba43e00240c00c530596de2d4e1d405b50
+Author: Matthew Heller <hellermf@accre.vanderbilt.edu>
+Date: Mon Oct 14 09:25:41 2024 -0500
+
+ fix duplicate PAM msgs, missing loginmsg reset
+
+ without this change in mm_answer_pam_account all messages added in
+ auth-pam.c sshpam_query(...) case PAM_SUCCESS end up sent here, then are
+ still sitting in the loginmsg buffer and printed a second time in
+ session.c do_login(...)
+
+commit 7a59f55e621c841aab187c96e0f3271c5c799709
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Mon Feb 16 00:45:41 2026 +0000
+
+ upstream: Reorder headers to match KNF and Portable.
+
+ ID sync only.
+
+ OpenBSD-Commit-ID: b7f9700d07b532eb3720f7bd722b952e31b1752f
+
+commit c5cee49a0c5721532716365f32977fc02eeea1d5
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Sun Feb 15 22:29:30 2026 +0000
+
+ upstream: Add basic test for keyboard-interactive auth.
+
+ Not enabled by default since it requires some setup on the host.
+
+ OpenBSD-Regress-ID: aa8a9608a2ea2e5aaa094c5a5cc453e4797cd902
+
+commit 07c6413e7bf08b7bfc6fd543eded9da68898e230
+Author: jsg@openbsd.org <jsg@openbsd.org>
+Date: Sat Feb 14 00:18:34 2026 +0000
+
+ upstream: remove unneeded includes; ok dtucker@
+
+ OpenBSD-Commit-ID: bba6e85492276c30c7a9d27dfd3c4c55fa033335
+
+commit d8b806a2e6cd50c729e5d2bad569955a1df33f63
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Sun Feb 15 13:31:52 2026 -0500
+
+ Remove obsolete comment referencing auth-chall.c.
+
+ It was removed in commit 6cb6dcff along with the rest of the SSH1 server
+ support.
+
+commit 3e8a45e0eeb5c84f12ac04ea7cc2f831c91c263b
+Author: Marco Trevisan (Treviño) <mail@3v1n0.net>
+Date: Mon Oct 16 21:15:45 2023 +0200
+
+ auth-pam: Add an enum to define the PAM done status
+
+ Makes things more readable and easier to extend
+
+commit 9b0e50b4132679f0c09c0f1272bf1c45959103ea
+Author: Marco Trevisan (Treviño) <mail@3v1n0.net>
+Date: Tue Oct 17 04:35:17 2023 +0200
+
+ auth-pam: Add debugging information when we receive PAM messages
+
+commit c2447697aaecae11d164f1ba30e06d14b5cabcdd
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Fri Feb 13 15:34:44 2026 -0500
+
+ Remove DragonFlyBSD workaround for sys/mount.h.
+
+ ... since we're not not including it at all any more.
+
+commit 8b3a0552054106feb036c632fc844f878568799f
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Fri Feb 13 19:06:18 2026 +0000
+
+ upstream: Replace <sys/mount.h> with <limits.h>
+
+ The former is a portability hassle, but it turns out the only thing we
+ need from it is PATH_MAX which we can get directly from limits.h.
+
+ OpenBSD-Commit-ID: ccfbbd678bef3a3930ae89da456645c3ee5f83c0
+
+commit db475199639667197b12b3aa5205de71ef102e23
+Author: jsg@openbsd.org <jsg@openbsd.org>
+Date: Fri Feb 13 01:04:47 2026 +0000
+
+ upstream: remove unneeded forward struct declaration ok djm@
+
+ OpenBSD-Commit-ID: a0c97e919667394bef8dbf31df72af3ba07542e9
+
+commit ae51e05dbd840ad674fee754f33c0e2fd141074e
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Wed Feb 11 22:58:23 2026 +0000
+
+ upstream: very basic testing of multiple files in RevokedKeys and
+
+ RevokedHostkeys
+
+ OpenBSD-Regress-ID: 6cee76bcc4bd6840bc8d39dd0d32d724e1427aa7
+
+commit 2f51e29b9a0ffd7acb9dc70d90defa466b5695d4
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Wed Feb 11 22:57:55 2026 +0000
+
+ upstream: support multiple files in a ssh_config RevokedHostKeys
+
+ directive bz3918; ok dtucker
+
+ OpenBSD-Commit-ID: 0ad2eacf836f912f347846ab84760799033dd348
+
+commit 135a62238a479c7369f2b2d5dafb921ddc1c2b74
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Wed Feb 11 22:57:16 2026 +0000
+
+ upstream: support multiple files in a sshd_config RevokedKeys
+
+ directive bz3918; ok dtucker
+
+ OpenBSD-Commit-ID: 9fc58c4e676f8e9ed2e3a0da666242a17b8a55b2
+
+commit 3160f2a97e875bfa9454f98899cbccad48c96ff4
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Wed Feb 11 17:05:32 2026 +0000
+
+ upstream: Add includes used in Portable to reduce diffs.
+
+ OpenBSD-Commit-ID: 186c60cf2da0ddb075d5bc4879e87bbd8779b7e4
+
+commit 6a756f3f7b9f87f24e948ec1de0266f5c1587811
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Wed Feb 11 17:03:17 2026 +0000
+
+ upstream: Remove unused sys/queue.h include.
+
+ OpenBSD-Commit-ID: 564f75672e27f1006f280614934eb304abe69167
+
+commit c169300df12b9aa7005ff6e61880a7e007e83bc5
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Wed Feb 11 17:01:34 2026 +0000
+
+ upstream: Reorder includes and defines to match both KNF and
+
+ Portable.
+
+ OpenBSD-Commit-ID: f3f179c095f8e4787ded5f450e2842881f6b8ab2
+
+commit 1a4eb511abaf3522b84fa5697524b81b4865279b
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Wed Feb 11 17:36:42 2026 -0500
+
+ Factor out RNG reseeding in to a single function.
+
+ sshd and sshd-session both reseed the RNG after a fork. Move the
+ existing reseed_prngs() function into entropy.c and use for both.
+ Clean up entropy.h too. ok djm@
+
+commit 81746188e9333b166b4c31f9654d8eb249ddd897
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Wed Feb 11 16:47:27 2026 -0500
+
+ Remove do_pam_chauthtok since it's no longer used.
+
+commit f1b9e0f7f1f1ed5be2bd1c39bda03fc99a1cf5d8
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Wed Feb 11 16:57:38 2026 +0000
+
+ upstream: Pass actual size of the buffer to hostname() instead of a
+
+ define that's probably the same. ok millert@ djm@
+
+ OpenBSD-Commit-ID: 7c97b22439100b4193404ccfa1e5f539c5a8d039
+
+commit 4ef24496b7c4c918d4d3a049f83739fbe2e36e9f
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Mon Feb 9 22:15:45 2026 +0000
+
+ upstream: De-underscore __inline__ to match -portable
+
+ (and every other use of it in ssh). ID sync only.
+
+ OpenBSD-Commit-ID: 83c913d5e2345635bc5434167ed67cec5409d494
+
+commit c8972792e5ce599e584bbe1aa084cc4056f1afe5
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Mon Feb 9 22:12:48 2026 +0000
+
+ upstream: Remove references to skey auth which is long gone.
+
+ ID sync only.
+
+ OpenBSD-Commit-ID: 0c2340566c399f7f74fe4c5366394974cd6fd122
+
+commit db779679839d2798de7cda196a3fe750a12845e8
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Mon Feb 9 22:11:39 2026 +0000
+
+ upstream: Remove unused OpenSSL includes,
+
+ that are no longer used, even when building with OPENSSL=yes.
+
+ OpenBSD-Commit-ID: e97e3e551ade9aee994b80a1d5851be6f32288e3
+
+commit 8ec21f6274108e93601173ec4e6f7528b90b0003
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Mon Feb 9 22:09:48 2026 +0000
+
+ upstream: Use https for URLs.
+
+ ID sync only.
+
+ OpenBSD-Commit-ID: 85b2919e95e6d2bfdeddf5e3b0709fb5b6b4c438
+
+commit c3eaa953ae78e581d7ba2327beea35206a14bc1e
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Mon Feb 9 21:38:14 2026 +0000
+
+ upstream: Remove unused OpenSSL includes,
+
+ which are no longer used even when building with OPENSSL=yes.
+
+ OpenBSD-Commit-ID: 31adb21bf3f8f5c13cde59229f1b85c20f19a858
+
+commit 280cf58afe71bf34141e732d30676367f0150bbe
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Mon Feb 9 21:23:35 2026 +0000
+
+ upstream: Remove now-unused SKEYQUERY enums from monitor_reqtype.
+
+ ID sync only.
+
+ OpenBSD-Commit-ID: dab93b58e69c754887507e5557a81a0b5b84d734
+
+commit bb2703365ede3b4e13fdfa1c250ac88408e75f38
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Mon Feb 9 21:21:39 2026 +0000
+
+ upstream: Remove now-unused openssl includes since sshd.c no longer
+
+ needs them, even when built with OpenSSL.
+
+ OpenBSD-Commit-ID: ceaa0394db1520e92d75c37eea58130d44ba93c9
+
+commit 8a5d591c9f42933c49ece95e49c116d684d6cca0
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Wed Feb 11 11:38:58 2026 -0500
+
+ Don't create sys/mount.h shim except on DragonFly.
+
+ Fixes build on Mac OS X.
+
+commit 957cb0fbe87b6ab76045e8dc99426db6afb54057
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Tue Feb 10 08:55:53 2026 +1100
+
+ Minor resync with upstream
+
+ Reorder definitions add whitespace to eliminate diffs vs upstream.
+
+commit 4922635d3e66f9107c5b68a0a3fa57ddf0d820ae
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Tue Feb 10 07:22:30 2026 +1100
+
+ Factor out COMPATINCLUDES into its own variable.
+
+commit 3e9c4ed3b0e5d3890fcd2cbc9c3b595f17ea1946
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Tue Feb 10 05:34:46 2026 +1100
+
+ Provide compat shims for sys/{mount.h,statvfs.h).
+
+ In addition to shimming on platforms that don't have them, we also need to
+ shim sys/mount.h on DragonFlyBSD since it uses its native STAILQ_ENTRYs
+ which our compat queues.h does not have, which causes sftp-server.o to
+ not build. This is a little icky, but it limits the blast radius to
+ just one source file on only DragonFly. ok djm@
+
+commit eeb671fa2f0fd7dda4c6b726098fe28016dc185b
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Tue Feb 10 03:39:45 2026 +1100
+
+ Shim <sys/queue.h> and <sys/tree.h>.
+
+ This significantly reduces the diff vs upstream making future syncs
+ less painful. ok djm@
+
+commit 47828dbd95c095d0cad327e12bb6859a510833c8
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Sun Feb 8 19:54:31 2026 +0000
+
+ upstream: Reorder headers according to KNF,
+
+ and pull in a few we don't have from Portable.
+
+ OpenBSD-Commit-ID: d83f6c75da7bfb16bbff40fd2133d6eba4aba272
+
+commit c73b8b09bf43be3dfe14bc0da349b352b280a74a
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Sun Feb 8 17:51:43 2026 +0000
+
+ upstream: Include sys/socket.h to match -portable,
+
+ eliminating one diff.
+
+ OpenBSD-Commit-ID: 7670fdf35b0c7aee41cd0d6ded86b4792e261f36
+
+commit 9385d72dd36ba6050b5f7728c14e3edc8329fe95
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Sun Feb 8 17:50:49 2026 +0000
+
+ upstream: Reorder headers as per KNF.
+
+ OpenBSD-Commit-ID: 3e29fabe20422454fd5d77f85c853e1e557f2181
+
+commit 62439369181b9b1dabf1ec3c2de6a7fbfcfb45eb
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Mon Feb 9 06:56:35 2026 +1100
+
+ Remove openindiana VM test.
+
+ When it works it's by far the slowest (>1h to install packages) and the
+ package installation is flaky. We can bring it back if their infra ever
+ improves.
+
+commit 43d0bf02d84a20a3f7c9992dabf8c109d9c25bed
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Mon Feb 9 06:42:27 2026 +1100
+
+ Sync header order with upstream and KNF.
+
+commit a3742cc38a6aa48a653a1a6300bc825f083955af
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Mon Feb 9 06:41:07 2026 +1100
+
+ Sync whitespace with upstream.
+
+commit b62198a19a53227ca166c62825ac72a7696c42ed
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Mon Feb 9 05:02:36 2026 +1100
+
+ Sync header order with upstream.
+
+commit 98fdb05f0c0d7a89a066225a94eafd7fce10163d
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Mon Feb 9 04:09:26 2026 +1100
+
+ Remove generic check for getpagesize.
+
+ We have a more specific check later.
+
+commit 249476f45dba9a92056bd2935aae7429f0f3b17c
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Mon Feb 9 03:47:25 2026 +1100
+
+ Test KERBEROS5=yes builds on OpenBSD.
+
+commit 6adb65508efc2def558f50a56c5eada09ca500c9
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Sun Feb 8 15:28:01 2026 +0000
+
+ upstream: Make ssh optionally build with Kerberos 5 against the
+
+ Heimdal port. This updates the Makefiles and repairs some bitrot in headers,
+ resyncing them against Portable. To do this, "pkg_add heimdal" then "make
+ KERBEROS5=yes". ok djm@
+
+ (ID sync only)
+
+ OpenBSD-Commit-ID: 31f95c9ba58aa7ba89264f1d80c79106042b1095
+
+commit d6c672a8c16c8962e6b3022e279441fa6630cb86
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Sun Feb 8 03:30:15 2026 +0000
+
+ upstream: Remove sys/poll.h since we also have poll.h.
+
+ Also removes one line of diff vs portable.
+ (ID sync only).
+
+ OpenBSD-Commit-ID: 461bd0cd35bfad82bd06892ccb0ff0fac15d1d27
+
+commit 8605ed26334b9ae704b8abe51940b61bdfe1e974
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Sun Feb 8 00:16:34 2026 +0000
+
+ upstream: Move setting of user, service and style earlier since
+
+ -portable needs to use these when setting up PAM. Removes two diffs vs
+ portable.
+
+ OpenBSD-Commit-ID: 8db130d42a3581b7a1eaed65917673d4474fc4fe
+
+commit ecaaa4f9e44764e55c152a84af3d7efb63c50ce7
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Sun Feb 8 11:30:21 2026 +1100
+
+ Move USE_SYSTEM_GLOB into a glob.h compat shim.
+
+ This moves the logic for selecting whether or not we can use the system
+ glob into configure, and if either don't have glob or can't use it, we
+ create the shim. Removes several diffs vs upstream.
+
+commit 2a1a257612b7c6bcacd934149146a3da7411c485
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Sat Feb 7 18:04:53 2026 +0000
+
+ upstream: misc.h is needed for ForwardOptions in servconf.h.
+
+ OpenBSD-Commit-ID: b241d81c499e273fc2d81c82d5b7c7b280827416
+
+commit ad632364fb06f3bd1e9177e587d0040cf7958676
+Author: Jonas 'Sortie' Termansen <sortie@maxsi.org>
+Date: Sat Nov 2 22:30:07 2024 +0100
+
+ Remove unused <netinet/in_systm.h> includes.
+
+ netinet/in_systm.h is no longer in upstream and anything that actually
+ needs it will get it from includes.h.
+
+commit 9ebce88be9d88605e02551fe7f65ef6a16f72667
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Sat Feb 7 17:10:34 2026 +0000
+
+ upstream: Also check for EWOULDBLOCK on system error. This is the
+
+ same as EAGAIN on OpenBSD so is a no-op but removes a diff making portable
+ syncs easier. (ID sync only).
+
+ OpenBSD-Commit-ID: 68a5dcc5e2a506208c40396c6366f67bbf3b1dbe
+
+commit ccc1faf67df795d5cd757df754703823d0874028
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Sat Feb 7 17:04:22 2026 +0000
+
+ upstream: Move ssherr.h to where portable needs it.
+
+ (ID sync only)
+
+ OpenBSD-Commit-ID: 0488ce85f24864186678dcac7c9973ca44bd2cd5
+
+commit 6decbb90413c67c10ac2fd5b17a9c161196641ea
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Sun Feb 8 04:30:40 2026 +1100
+
+ Move paths.h and poll.h includes to resync with upstream.
+
+commit 4fe79e3deb5457af588ab67ee5db642afedd935f
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Sun Feb 8 04:28:28 2026 +1100
+
+ Move poll.h include to resync with upstream.
+
+commit 9e585f11bb71115fb0376b2b6118892ab600aa4f
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Sun Feb 8 04:25:42 2026 +1100
+
+ Resync minor format diffs with upstream.
+
+commit 3fd88caa36a94d85ae66bff297142606d08decde
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Sun Feb 8 03:56:15 2026 +1100
+
+ Resync headers with upstream.
+
+commit 77e41d0c1c8801c553b43eef5974268425395667
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Sun Feb 8 03:52:31 2026 +1100
+
+ Resync with upstream (unused header and whitespace).
+
+commit a393759f9693a08a7fba18d4824b74f2dda1fe3d
+Author: Artem Savkov <artem.savkov@gmail.com>
+Date: Tue Nov 18 16:26:11 2025 +0100
+
+ Fix ut_type for btmp records
+
+ According to man utmp ut_type is supposed to be only switched from
+ LOGIN_PROCESS to USER_PROCESS after succesfull authentication and this
+ is how sshd behaved before 671c44078.
+
+ Fixes: 671c44078 ("use construct_utmp to construct btmp records")
+ Signed-off-by: Artem Savkov <artem.savkov@gmail.com>
+
+commit 15fe1ceb29760d72398c6ac7df5a403416cba207
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Sat Feb 7 02:02:00 2026 +0000
+
+ upstream: bit of webauthn support missed in previous commit
+
+ OpenBSD-Commit-ID: 9768454543ded01b7c61567fc5b3e78664346be2
+
+commit 670f7d210ceae59db73b16b67e52d8fd8def3012
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Fri Feb 6 23:39:14 2026 +0000
+
+ upstream: Adjust Makefiles to include just-added
+
+ ssherr_libcrypto where necessary.
+
+ OpenBSD-Regress-ID: 53d179a2db3ab931f2aa0e5447cf20cb9787a8bb
+
+commit 9c4949c11d8da1a5422e2174afb1a4f5b3dc8914
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Fri Feb 6 23:31:29 2026 +0000
+
+ upstream: Fetch the error reason from libcrypto
+
+ if available, append it to the corresponding ssh error message and
+ optionall print the libcrypto full error stack (at debug1). with &
+ ok tb@ djm@ millert@ schwarze@
+
+ Note that the quality of errors obtainable from libcrypto is somewhat
+ variable, so these may be any of: useful, misleading, incomplete
+ or missing entirely. As a result we reserve the right to change
+ what is returned or even stop returning it if it does more harm than
+ good.
+
+ OpenBSD-Commit-ID: 1ad599ac3eeddbe254fec6b9c1cf658fa70d572e
+
+commit 5b12d836e7c42c146ac1a69a9600db05282dbbb8
+Author: THE-Spellchecker <The.Spellchecker@outlook.com>
+Date: Sat Jan 3 22:11:39 2026 -0600
+
+ Typographical Fixes
+
+commit 11600929832e04aa6ad20a57af7187c3feb973d4
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Fri Feb 6 22:59:18 2026 +0000
+
+ upstream: Typo fixes, mostly in comments.
+
+ From THE-Spellchecker via github PR#620.
+
+ OpenBSD-Commit-ID: 64929fafa3caae5a162f23257917ecf33f8a3764
+
+commit b83c0bb5109eb245dd4f06e4af4a960f96a0c193
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Sat Feb 7 06:58:59 2026 +1100
+
+ Enable gss-auth tests on Kerberos test configs.
+
+commit d84dbccee4371ce395d28543f146e7b62d8c0d36
+Author: Pavol Žáčik <zacik.pa@gmail.com>
+Date: Thu Jan 29 11:01:19 2026 +0100
+
+ Add a GSSAPI authentication test
+
+commit 86e0f4aa2c72d5e96618f0c7214109f5a46ca70d
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Thu Jan 1 21:41:10 2026 +1100
+
+ Split sudo out to its own install line.
+
+commit dfbb8526b5006cfe368193fb15e16f58cce6e1d1
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Wed Dec 31 16:35:29 2025 +1100
+
+ Remove obsolete comments.
+
+commit f0b7ecf7f5976c11f8c89ee9b0ca19383b573764
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Wed Dec 31 16:26:23 2025 +1100
+
+ Run tests on older OmniOS version too.
+
+commit 01bddc0663e5239df9342fcf7b373e5f58ff1b49
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Wed Dec 31 16:25:16 2025 +1100
+
+ Add OpenIndiana VM test target.
+
+commit 91c4d422cc0af2ae592f5e6c0cc505a5d8d7a6d2
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Fri Feb 6 01:24:36 2026 +0000
+
+ upstream: remove vestige of when we supported running without privsep
+
+ OpenBSD-Commit-ID: 5342c24d2330ef5ce357c294056f72b8123122c0
+
+commit 6463960c58cd0adcb26bfbddceb9d4efcfbd9dd0
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Thu Feb 5 22:05:49 2026 +0000
+
+ upstream: Implement missing pieces of FIDO/webauthn signature support,
+
+ mostly related to certificate handling and enable acceptance of this
+ signature format by default. bz3748 GHPR624 GHPR625
+
+ Feedback tb / James Zhang; ok tb
+
+ OpenBSD-Commit-ID: ce3327b508086b24a3f7a6507aa5c49d8e9505e6
+
+commit 832a77000abe61f61bddb9e595f45c7131c0269d
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Tue Jan 27 06:48:29 2026 +0000
+
+ upstream: Implement "query" extension from
+
+ draft-ietf-sshm-ssh-agent
+
+ feedback jsg@, tb@; ok tb@
+
+ OpenBSD-Commit-ID: adb2b79473ff86ba781ed5ab2735c1437b590f07
+
+commit 409dc952ab88b5232e809e34fd55662c6f75ad81
+Author: millert@openbsd.org <millert@openbsd.org>
+Date: Thu Jan 22 15:30:07 2026 +0000
+
+ upstream: Make it clear that DenyUsers/DenyGroups overrides
+
+ AllowUsers/AllowGroups. Previously we specified the order in which the
+ directives are processed but it was ambiguous as to what happened if both
+ matched. OK djm@
+
+ OpenBSD-Commit-ID: 6ae0ab52ff796b78486b92a45cd7ec9310e20f4e
+
+commit d7950aca8eacae8b889d92c669e913111af75984
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Wed Jan 21 23:58:20 2026 +0000
+
+ upstream: In ssh(1), don't try to match certificates held in an
+
+ agent to private keys.
+
+ This matching is done to support certificates that were
+ loaded without their private key material, but is unnecessary for
+ agent-hosted certificate which always have private key material
+ loaded in the agent. Worse, this matching would mess up the
+ request sent to the agent in such a way as to break usage of these
+ keys when the key usage was restricted in the agent.
+
+ Patch from Thibault Cools via bz3752, ok dtucker@
+
+ OpenBSD-Commit-ID: ebfe37817dad4841c53339930565242ec683d726
+
+commit b0d0b71651b5a19d0dbd27b623ebb4fc43145560
+Author: sthen@openbsd.org <sthen@openbsd.org>
+Date: Wed Jan 21 15:44:51 2026 +0000
+
+ upstream: If editline has been switched to vi mode (i.e. via "bind
+
+ -v" in .editrc), setup a keybinding so that command mode can be entered. Diff
+ originally from Walter Alejandro Iglesias with tweaks. Feedback from Crystal
+ Kolipe. ok djm
+
+ OpenBSD-Commit-ID: 5786e17ccd83573e2d86418023f9bc768223336a
+
+commit 1cc936b2fabffeac7fff14ca1070d7d7a317ab7b
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Tue Jan 20 22:56:11 2026 +0000
+
+ upstream: Fill entropy in a single operation instead of hundreds.
+
+ The sntrup761 code we use from SUPERCOP fills entropy arrays 4 bytes at
+ a time. On some platforms each of these operations has a significant
+ overhead, so instead fill it in a single operation and as a precaution
+ zero that array after it's used.
+
+ Analysis and code change is from Mike Frysinger via Github PR#621 with
+ feedback from djm@ and sed-ification from me. ok djm@ beck@.
+
+ This change was submitted by Mike to SUPERCOP upstream so hopefully
+ future versions will already have it.
+
+ OpenBSD-Commit-ID: 0e85c82f79b1b396facac59e05b288c08048f15c
+
+commit a6f8f793d427a831be1b350741faa4f34066d55f
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Sun Jan 4 09:52:58 2026 +0000
+
+ upstream: rewrite SOCKS4/4A/5 parsing code to use sshbuf functions
+
+ instead of manual pointer fiddling. Should make the code safer and easier to
+ read. feedback/ok markus@
+
+ OpenBSD-Commit-ID: 5ebd841fbd78d8395774f002a19c1ddcf91ad047
+
+commit ea367b4bbc3fd49f84683763723425adfdce35c0
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Tue Dec 30 04:28:42 2025 +0000
+
+ upstream: test the right thing, doofus
+
+ OpenBSD-Commit-ID: 31b2ec6e0b3dbd08c60ba2d969dd687cd80c25fd
+
+commit 5f2bc9cb8625d1fd582e0e4b562200f9856f1f7d
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Tue Dec 30 04:23:53 2025 +0000
+
+ upstream: avoid possible NULL deref if
+
+ ssh_packet_check_rekey_blocklimit() called before the encrypted transport is
+ brought up.
+
+ OpenBSD-Commit-ID: fb998ccbe59865e33a8ab6a6577f254d39bdc72f
+
+commit b9c318777eb40db66fb92df87666c3642467d0e7
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Tue Dec 30 00:12:58 2025 +0000
+
+ upstream: unit tests for sshbuf_consume_upto_child()
+
+ OpenBSD-Regress-ID: 13cbd0370ebca7c61c35346b3e0356517719a447
+
+commit dd49a87bf4e4a219978bf20f03e2a72041f57b2f
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Tue Dec 30 00:35:37 2025 +0000
+
+ upstream: Remove bug compatibility for implementations that don't
+
+ support rekeying. AFAIK this is only an ancient Sun SSH version.
+
+ If such an implementation tries to interoperate with OpenSSH, it
+ will eventually fail when the transport needs rekeying.
+
+ This is probably long enough to use it to download a modern SSH
+ implementation that lacks this problem :)
+
+ ok markus@ deraadt@
+
+ OpenBSD-Commit-ID: 228a502fee808cf8b7caee23169eb6a1ab1c331a
+
+commit ca313fef2deed90668fe0706da8529310092d1dd
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Tue Dec 30 00:22:58 2025 +0000
+
+ upstream: Enforce maximum packet/block limit during
+
+ pre-authentication phase
+
+ OpenSSH doesn't support rekeying before authentication completes to
+ minimise pre-auth attack surface.
+
+ Given LoginGraceTime, MaxAuthTries and strict KEX, it would be
+ difficult to send enough data or packets before authentication
+ completes to reach a point where rekeying is required, but we'd
+ prefer it to be completely impossible.
+
+ So this applies the default volume/packet rekeying limits to the
+ pre-auth phase. If these limits are exceeded the connection will
+ simply be closed.
+
+ ok dtucker markus
+
+ OpenBSD-Commit-ID: 70415098db739058006e4ebd1630b6bae8cc8bf6
+
+commit 55b6b1697433eca98052f5c45281133ca793a9c8
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Mon Dec 29 23:52:09 2025 +0000
+
+ upstream: Add sshbuf_consume_upto_child(), to similify particular
+
+ parsing patterns using parent/child buffer; ok markus@
+
+ OpenBSD-Commit-ID: c11ed27907751f2a16c1283313e77f88617e4852
+
+commit 6eafc52a4185ba6d765047146cd645152baaeb58
+Author: Ludovic Rousseau <ludovic.rousseau+github@gmail.com>
+Date: Sat Dec 27 10:07:22 2025 +0100
+
+ Update ssh-agent.1
+
+ Add a missing "/" in the default allowed providers list.
+
+commit 09daf2ac5f248dc5d60a6f3a703b479d67da14b4
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Mon Dec 22 03:36:43 2025 +0000
+
+ upstream: correctly quote wildcard host certificate principal name,
+
+ lest it expand to an unrelated filename in the working directory
+
+ OpenBSD-Regress-ID: 8a9eb716d3ea7986d26c1a931758b996aa93c58e
+
+commit dfd710e4e2928201743e32027e2d6cf0e2eafc61
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Mon Dec 22 03:12:05 2025 +0000
+
+ upstream: return 0 in void function; spotted by clang -Wextra
+
+ OpenBSD-Commit-ID: fe7461c93dfaef98a007a246af837a8275a1e539
+
+commit ecdf9b9f8e89aae65d4a12fe5a25c560eea08393
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Mon Dec 22 01:50:46 2025 +0000
+
+ upstream: regression tests for certificates with empty principals
+
+ sections (which are now unconditionally refused) and for certificates with
+ wildcard principals (which should only be accepted in host certs)
+
+ OpenBSD-Regress-ID: fdca88845a68424060547b4f9f32f90a7cf82e73
+
+commit adca2f439827eb829652805f36e288b5b260ce1b
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Mon Dec 22 01:31:07 2025 +0000
+
+ upstream: don't try to test webauthn signatures. Nothing in OpenSSH
+
+ generates these (yet)
+
+ OpenBSD-Regress-ID: 48d59b7c4768c2a22ce3d8cf3b455e6ada9fc7b0
+
+commit 5166b6cbf2b6103117a79f90a68068e89e02bf66
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Mon Dec 22 01:49:03 2025 +0000
+
+ upstream: When certificate support was added to OpenSSH,
+
+ certificates were originally specified to represent any principal if the
+ principals list was empty.
+
+ This was, in retrospect, a mistake as it created a fail-open
+ situation if a CA could be convinced to accidentally sign a
+ certificate with no principals. This actually happened in a 3rd-
+ party CA product (CVE-2024-7594).
+
+ Somewhat fortunately, the main pathway for using certificates in
+ sshd (TrustedUserCAKeys) never supported empty-principals
+ certificates, so the blast radius of such mistakes was
+ substantially reduced.
+
+ This change removes this footcannon and requires all certificates
+ include principals sections. It also fixes interpretation of
+ wildcard principals, and properly enables them for host
+ certificates only.
+
+ This is a behaviour change that will permanently break uses of
+ certificates with empty principals sections.
+
+ ok markus@
+
+ OpenBSD-Commit-ID: 0a901f03c567c100724a492cf91e02939904712e
+
+commit aaac8c61c18124eb5fb8a2cff1e85dea2db6c147
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Mon Dec 22 01:20:39 2025 +0000
+
+ upstream: Don't misuse the sftp limits extension's open-handles
+
+ field. This value is supposed to be the number of handles a server will allow
+ to be opened and not a number of outstanding read/write requests that can be
+ sent during an upload/download.
+
+ ok markus@
+
+ OpenBSD-Commit-ID: 14ebb6690acbd488e748ce8ce3302bd7e1e8a5b0
+
+commit daf6bdd34b59f640d2af0fd230da69f1cbad33b4
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Mon Dec 22 01:17:31 2025 +0000
+
+ upstream: add a "ssh -O channels user@host" multiplexing command to
+
+ get a running mux process to show information about what channels are
+ currently open; ok dtucker@ markus@
+
+ OpenBSD-Commit-ID: 80bb3953b306a50839f9a4bc5679faebc32e5bb8
+
+commit b652322cdc5e94f059b37a8fb87e44ccb1cdff33
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Fri Dec 19 01:27:19 2025 +0000
+
+ upstream: typo in comment
+
+ OpenBSD-Commit-ID: f72306b86953e74f358096db141b4f9c00d33ed7
+
+commit 0b98be75dbb2ccb1c3146429c0077416c113b57d
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Fri Dec 19 01:26:39 2025 +0000
+
+ upstream: correctly check subsystem command is not the empty string
+
+ (was repeatedly checking the subsystem name) spotted by Coverity (CID 898836)
+
+ OpenBSD-Commit-ID: dabea2b499de8280f76f7291dd52086df6831cb0
+
+commit 345892ba2e8efea4be03675c866395bee251c117
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Fri Dec 19 00:57:42 2025 +0000
+
+ upstream: regression test for bz3906: sshd crashing at connection
+
+ time if the config lacks a subsystem directive but one is defined in a match
+ block.
+
+ OpenBSD-Regress-ID: 5290553665307ccddaec2499ec1eb196bb2efc84
+
+commit 81e5bb8d93f2d8361bd7f4b034044ad8ee4ded0e
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Fri Dec 19 00:48:47 2025 +0000
+
+ upstream: check that invalid subsystem directives inside Match
+
+ blocks are noticed at startup; bz#3906
+
+ OpenBSD-Regress-ID: b9171bde4cc24757a826b3da0e9eadc33995a453
+
+commit 831e6db69ff8625b6e81c2809aa082abbab6c0b1
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Fri Dec 19 00:56:34 2025 +0000
+
+ upstream: don't crash at connection time if the main sshd_config
+
+ lacks any subsystem directive but one is defined in a Match block
+
+ bz#3906; ok dtucker
+
+ OpenBSD-Commit-ID: 2eb9024726d6f10eaa41958faeca9c9ba5ca7d8a
+
+commit 4e0f2dee54d210dc44f72f73e703c6dc5348a406
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Fri Dec 19 00:48:04 2025 +0000
+
+ upstream: detect invalid sshd_config Subsystem directives inside
+
+ Match blocks at startup rather than failing later at runtime;
+
+ noticed via bz#3906; ok dtucker
+
+ OpenBSD-Commit-ID: e6035ff0baa375de6c9f22c883ed530a8649dfed
+
+commit 4c9de155ce1d35c9e3c05223cc093580f9efff9a
+Author: jsg@openbsd.org <jsg@openbsd.org>
+Date: Thu Dec 18 23:54:10 2025 +0000
+
+ upstream: new sentence, new line
+
+ OpenBSD-Commit-ID: 23974d7c98b2ba4fea7f5143676c34e04ffd4128
+
+commit 3ab346aa6d9030379df3ec1ed0b0ce608f952c5f
+Author: jsg@openbsd.org <jsg@openbsd.org>
+Date: Thu Dec 18 23:51:56 2025 +0000
+
+ upstream: fix markup, .CM -> .Cm
+
+ OpenBSD-Commit-ID: 4db8cb254792df8a4dce11825852e089ae3d053a
+
+commit f878d7ccc25b02a39e6766f5dd405d5de6fb106c
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Tue Dec 16 08:36:43 2025 +0000
+
+ upstream: Plug leak in ssh_digest_memory on error path.
+
+ Bonehead mistake spotted by otto@, ok djm@
+
+ OpenBSD-Commit-ID: 4ad67ac402e0b4c013f4f4e386d22b88969a5dd7
+
+commit 49480f1934f8cf994afa646d4bcbd22ac08bb6af
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Tue Dec 16 08:32:50 2025 +0000
+
+ upstream: Add 'invaliduser' penalty to PerSourcePenalties, which is
+
+ applied to login attempts for usernames that do not match real accounts.
+ Defaults to 5s to match 'authfail' but allows administrators to block such
+ sources for longer if desired. with & ok djm@
+
+ OpenBSD-Commit-ID: bb62797bcf2adceb96f608ce86d0bb042aff5834
+
+commit 94bf1154b4132727114f222a587daeac101f1f5b
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Mon Dec 8 03:55:22 2025 +0000
+
+ upstream: add a GssDelegateCreds option for the server, controlling
+
+ whether it accepts delgated credentials offered by the client. This option
+ mirrors GssDelegateCreds in ssh_config.
+
+ From Dmitry Belyavskiy via GHPR614; ok dtucker@
+
+ OpenBSD-Commit-ID: ac419354edb26cef9ad15692e0bed17a03997786
+
+commit 24f32f7755801b16368375b8e27fb1a48d250fc5
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Mon Dec 8 00:45:00 2025 +0000
+
+ upstream: errant line
+
+ OpenBSD-Commit-ID: 8542d59f5ba48a67c3ebd5de17f9fa408ec54ca5
+
+commit a1e37f0998ed5027f6c8dd30befb379ea2cac95b
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Mon Dec 8 00:44:16 2025 +0000
+
+ upstream: There is a warning next to the authorized_keys command=""
+
+ flag that forcing a command doesn't automatically disable forwarding. Add one
+ next to the sshd_config(5) ForceCommand directive too.
+
+ feedback deraadt@
+
+ OpenBSD-Commit-ID: bfe38b4d3cfbadbb8bafe38bc256f5a17a0ee75c
+
+commit 70ad2e9a2b3aa6f856200464078c2750bfba0e3d
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Mon Dec 8 00:41:46 2025 +0000
+
+ upstream: increment correct variable when counting group
+
+ memberships. Reported by Kevin Day via bz3903
+
+ OpenBSD-Commit-ID: 772b9aafd5165a7c407f08cb95f8b94cc5a4c1c0
+
+commit d05b704086d53c02f4ad7de921435f7e7e3ad60a
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Sun Dec 7 20:10:42 2025 +1100
+
+ Add OpenBSD 7.8 VM test target.
+
+commit f086fafa0486012df6ba095664be75ecbf68e8e1
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Sun Dec 7 13:43:02 2025 +1100
+
+ Remove generated compat includes during distclean.
+
+commit 185459dd87c4f7580a2591fbbbb1d800ec249b78
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Sun Dec 7 14:17:20 2025 +1100
+
+ Define IPTOS_DSCP_VA if not already defined.
+
+commit f701869185915b9a324dcc23c12d0035251ef93f
+Author: phessler@openbsd.org <phessler@openbsd.org>
+Date: Fri Dec 5 17:48:47 2025 +0000
+
+ upstream: allow network programs select DSCP_VA for network ToS
+
+ OK stsp@
+
+ OpenBSD-Commit-ID: 8019fd6e8c522b4b5f291a2c0e3bf2437cc70dc1
+
+commit f62868e03e51785c521c4d20d60662c0bbdd695e
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Sun Dec 7 02:59:53 2025 +0000
+
+ upstream: Avoid "if ! thing || ! otherthing; then" constructs since
+
+ they seem to cause portability problems.
+
+ OpenBSD-Regress-ID: ff001be683de43bf396cd5f9f6a54e0c7a99c3cf
+
+commit 45aca67d79c194660342a64a9175d814d4e8ba56
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Sun Dec 7 02:49:41 2025 +0000
+
+ upstream: spaces->tab
+
+ OpenBSD-Regress-ID: c78eb430da0ec2c4b6919ff4d27ef8e565ef52ff
+
+commit ab164f671609a3a25cd0efcd967aff29144081bb
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Sat Dec 6 07:10:24 2025 +0000
+
+ upstream: Append a newline, otherwise some sed's won't output anything.
+
+ OpenBSD-Regress-ID: 507cb8c36bb7fc338f60a55bf7040f479536b3f7
+
+commit c99a30d30a5d2af6fec30b9b0d85aa9b252760c9
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Sat Dec 6 03:23:27 2025 +0000
+
+ upstream: Don't check compressions stats when ssh does not support
+
+ compression.
+
+ OpenBSD-Regress-ID: 026db51b2654a949e9a10b908443dab83b64c74a
+
+commit 5f5d1af478d4b9daf61fab1e4298973980d4c348
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Fri Dec 5 11:13:35 2025 +0000
+
+ upstream: ASSERT_DOUBLE_* test helpers
+
+ OpenBSD-Regress-ID: cdb5c4e95c0f00efb773ddba4056a49e33702cf9
+
+commit 70a01a7e66075047329e3aeccc942678f512ebdd
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Fri Dec 5 20:02:39 2025 +1100
+
+ Set SSH_REGRESS_TMP after making tmpdir.
+
+ Put both of these later in the script so the cvsids don't cause
+ conflicts on every synced patch.
+
+commit 89a67a04e581423cdc443f2597cb1e2c7d8cc50f
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Fri Dec 5 08:09:34 2025 +0000
+
+ upstream: Shell compatibility fix.
+
+ OpenBSD-Regress-ID: bceaeb267d49c13e4a797c42e93b8f0cdb14dbd7
+
+commit f4e79a4ba91cf0fd7397846424d1b261f3648708
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Fri Dec 5 07:43:24 2025 +0000
+
+ upstream: unit tests for convtime_double()
+
+ OpenBSD-Regress-ID: d3ba7b894019b4128845d638c78fca37b3b6eecf
+
+commit c48de35bea389308428cb47b5ee55b1b1fb4567c
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Fri Dec 5 07:49:45 2025 +0000
+
+ upstream: convert PerSourcePenalties to using floating point time,
+
+ allowing penalties to be less than a second. This is useful if you need to
+ penalise things you expect to occur at >=1 QPS.
+
+ feedback dtucker / deraadt; ok deraadt@
+
+ OpenBSD-Commit-ID: 89198be755722131b45a52d22d548e4c602201f0
+
+commit f45cd249e45a15c84bf1316ac719039d04a74e84
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Fri Dec 5 07:43:12 2025 +0000
+
+ upstream: Add convtime_double() that converts a string interval,
+
+ such as "3w2d4h5m10.5s", into a floating point number of seconds.
+
+ Reimplement the existing convtime() function using convtime_double()
+ (it just drops the fractional seconds)
+
+ lots of feedback deraadt@ / dtucker@; ok deraadt@
+
+ OpenBSD-Commit-ID: 053cdd0c72325a20efc6613caa847473fb89e36f
+
+commit b7dc1d95ee838c86a93df59663dad32e9b555520
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Fri Dec 5 06:55:22 2025 +0000
+
+ upstream: Add test for ssh -Oconninfo mux command.
+
+ OpenBSD-Regress-ID: e939edc41caad8b6ad00ff294f33b61ed32a1edd
+
+commit eb97fc2b5e7c85a37fdb3f8a6ee1d665ef086c3f
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Fri Dec 5 06:16:27 2025 +0000
+
+ upstream: Add an ssh -Oconninfo command
+
+ that shows connection information, similar to the ~I escapechar.
+ This is the first use of the mux extension mechanism, so it should be
+ both forward and backward compatible: a new client talking to an old
+ server will not allow the "conninfo" request to be sent, but everything
+ else should work seamlessly. feedback and ok djm@
+
+ OpenBSD-Commit-ID: 50f047a85da277360558cabdfed59cb66f754341
+
+commit 66622394fd3a51e9a6c99c39a068f8ba709542fa
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Wed Dec 3 06:29:50 2025 +0000
+
+ upstream: correctly quote filenames in verbose output for local->local
+
+ copies; from Colin Watson via bz3900; ok dtucker@
+
+ OpenBSD-Commit-ID: 5c09b030e2024651ebc8c1f9af6a8a2d37912150
+
+commit 8fce5520a1c9c2cf3fc6c6974dd158f4b3ce9c4e
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Sat Nov 29 06:49:56 2025 +0000
+
+ upstream: Add local hostname and pid to ~I escape connection info,
+
+ only display peer information for TCP connections including source address
+ and port This provides enough information to uniquely identify a connection
+ on the host or network.
+
+ OpenBSD-Commit-ID: aa18a4af2de41c298d1195d2566808585f8ce964
+
+commit 2e8b5de4a79fb393482465531be1e347b81699f3
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Sat Nov 29 05:00:50 2025 +0000
+
+ upstream: Add compression stats to ~I connection info escape
+
+ option.
+
+ OpenBSD-Commit-ID: 83424b71fc226ea6b3dc8dda39f993475fdbd775
+
+commit 52037ed910a9dcb669b9c9f612ccac711ac586f2
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Thu Nov 27 02:18:48 2025 +0000
+
+ upstream: Add Escape option ~I that shows information about the current
+
+ SSH connection. ok djm@, "I like/want" sthen@ florian@
+
+ OpenBSD-Commit-ID: 0483fc0188ec899077e4bc8e1e353f7dfa9f5c1d
+
+commit 0fb1f3c9955d78fb0959842202b9ecfc36e37486
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Tue Nov 25 01:14:33 2025 +0000
+
+ upstream: move mention of default MaxStartups (which uses the
+
+ form.
+
+ GHPR568 from Santiago Vila
+
+ OpenBSD-Commit-ID: 7e68771f3cad61ec67303607afb3b85639288b29
+
+commit 2d0d26602f739b4a3ddde6c4dbc8f3ddab38ac0d
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Tue Nov 25 01:08:35 2025 +0000
+
+ upstream: Support writing ED25519 keys in PKCS8 format. GHPR570 from
+
+ Josh Brobst
+
+ OpenBSD-Commit-ID: 4f36019a38074b2929335fbe9cb8d9801e3177af
+
+commit c23122c5ea7348b7b6daa2982e53c201a5354007
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Tue Nov 25 00:57:04 2025 +0000
+
+ upstream: avoid leak of fingerprint on error path; from Lidong Yan via
+
+ GHPR611
+
+ OpenBSD-Commit-ID: 253f6f7d729d8636da23ac9925b60b494e85a810
+
+commit 6157e1c41071fb0f5621868c38861934284268b1
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Tue Nov 25 00:52:00 2025 +0000
+
+ upstream: don't set the PerSourceNetBlockSize IPv6 mask if sscanf
+
+ didn't decode it. From Mingjie Shen via GHPR598
+
+ OpenBSD-Commit-ID: c722014e735cbd87adb2fa968ce4c47b43cf98b0
+
+commit 1fdc3c61194819c16063dc430eeb84b81bf42dcf
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Mon Nov 24 23:56:58 2025 +0000
+
+ upstream: give ssh-agent more time to start in tests; requested in
+
+ GHPR602
+
+ OpenBSD-Regress-ID: 7d771db2c1d4a422e83c3f632ba1e96f72a262b8
+
+commit 5e7c3f33b2693b668ecfbac84b85f2c0c84410c2
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Mon Nov 24 23:54:15 2025 +0000
+
+ upstream: When testing PKCS11, explicitly allow the module path in
+
+ ssh-agent.
+
+ Allows testing of PKCS11 modules outside system directories.
+
+ From Morgan Jones via GHPR602
+
+ OpenBSD-Regress-ID: 548d6e0362a8d9f7d1cc01444b697a00811ff488
+
+commit 69965aefe3355488e0462291be13a233b8405091
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Mon Nov 24 23:43:10 2025 +0000
+
+ upstream: When loading FIDO2 resident keys, set the comment to the
+
+ FIDO application string. This matches the behaviour of ssh-keygen -K
+
+ From Arian van Putten via GHPR608
+
+ OpenBSD-Commit-ID: 3fda54b44ed6a8a6f94cd3e39e69c1e672095712
+
+commit 2238c48dc90dc56af1d86b298d2cb25fa0c7ef14
+Author: tb@openbsd.org <tb@openbsd.org>
+Date: Sun Nov 23 07:04:18 2025 +0000
+
+ upstream: pkcs11_fetch_ecdsa_pubkey: use ASN1_STRING accessors
+
+ In anticipation of davidben and beck making ASN1_STRING opaque in
+ OpenSSL 4 with the aim of enabling surgery to make the X509 data
+ structure less bad [1], we need to use dumb accessors to avoid build
+ breakage. Fortunately only in one spot.
+
+ This is OpenSSL 1.1 API and available in all members of the fork family.
+
+ ok beck djm
+
+ [1]: https://github.com/openssl/openssl/issues/29117
+
+ OpenBSD-Commit-ID: 0bcaf691d20624ef43f3515c983cd5aa69547d4f
+
+commit 643222df689c95efff9e9506b76de458f69dd9c7
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Fri Nov 21 14:28:20 2025 +1100
+
+ Update OSSFuzz link to current bug tracker.
+
+commit 2efdfbb4d78b9bbb73f55af150e8f985d4fe4c0f
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Fri Nov 21 14:21:07 2025 +1100
+
+ Add VM CI and CIFuzz status badges.
+
+commit 71e8779113965d60d91ba2d15cdeeb43ecf230a7
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Fri Nov 21 01:29:27 2025 +0000
+
+ upstream: unit tests for sshbuf_get_nulterminated_string()
+
+ OpenBSD-Regress-ID: cb0af1e4d6dcc94e263942bc4dcf5f4466d1f086
+
+commit dec6334aaf6f542f34a0aca27dc2f535e9161a67
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Fri Nov 21 01:29:06 2025 +0000
+
+ upstream: add a sshbuf_get_nulterminated_string() function to pull a
+
+ \0- terminated string from a sshbuf. Intended to be used to improve parsing
+ of SOCKS headers for dynamic forwarding.
+
+ ok deraadt; feedback Tim van der Molen
+
+ OpenBSD-Commit-ID: cf93d6db4730f7518d5269c279e16b172b484b36
+
+commit a8718c3fc52511e5237f1cbe10c210948c5616ea
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Thu Nov 20 05:07:57 2025 +0000
+
+ upstream: Free opts in FAIL_TEST. It should always be NULL anyway so
+
+ this is a no-op, but it should placate Coverity CID 405064.
+
+ OpenBSD-Regress-ID: 06789754de0741f26432c668fad8b9881c14c153
+
+commit d68d528fefeca1e331696296ef5db7c4db246f9a
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Thu Nov 20 05:10:56 2025 +0000
+
+ upstream: Plug leaks while parsing Match blocks. Coverity CID
+
+ 469304, ok djm@
+
+ OpenBSD-Commit-ID: f9b79b86879a953ad034e6b92a398265b251bea7
+
+commit e3f1fbb427df898d70083b42caab72baaa715400
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Thu Nov 20 05:10:11 2025 +0000
+
+ upstream: Plug leaks while parsing Match blocks. Coverity CID
+
+ 515634, ok miod@ djm@
+
+ OpenBSD-Commit-ID: c7932eddecd47e5122e945246a40c56ffa42a546
+
+commit ccad76e9e1e4f06889ee023893cea98bc165858b
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Tue Nov 18 20:14:44 2025 +1100
+
+ Pull in rev 1.17 for spelling fix.
+
+ Prompted by github PR#609 from Edge-Seven.
+
+commit 58533bbdf7aa0548de8e2abd3cb2de0593fa9fdc
+Author: jca@openbsd.org <jca@openbsd.org>
+Date: Mon Nov 17 12:59:29 2025 +0000
+
+ upstream: Export XDG_RUNTIME_DIR to child ssh sessions
+
+ Currently setusercontext(LOGIN_SETALL) does create the directory in
+ /tmp/run/user, since LOGIN_SETXDGENV is part of LOGIN_SETALL, but the
+ env variable wasn't exported.
+
+ ok djm@
+
+ OpenBSD-Commit-ID: 02b8433f72759b3a07b55cbc5a7cdb84391b0017
+
+commit e4cc5ab0efd85f01c0e1ae46825ffc0c7a8f44ce
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Mon Nov 17 05:24:42 2025 +0000
+
+ upstream: don't strnvis() log messages that are going to be logged
+
+ by sshd-auth via its parent sshd-session process, as the parent will also run
+ them though strnvis().
+
+ Prevents double-escaping of non-printing characters in some log
+ messages. bz3896 ok dtucker@
+
+ OpenBSD-Commit-ID: d78faad96a98af5269d66ddceee553cf7d396dfe
+
+commit bad220decb95d3b5cc6e30f843c4fc9d9b0b7a67
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Mon Nov 17 21:36:45 2025 +1100
+
+ Remove obsolete CVSID.
+
+commit 2fe6e406b496b54351dab923f9be95579d39d071
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Mon Nov 17 09:59:13 2025 +0000
+
+ upstream: Ensure both sides of the test are non-NULL instead of just
+
+ either. Coverity CID 443285.
+
+ OpenBSD-Regress-ID: aa90e57b1bc8efce9e50734a07a8ffec0680059a
+
+commit e2b93e16232834c61c9dcff5b20e4c55a26b324d
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Thu Nov 13 23:30:48 2025 +1100
+
+ Move libcrypto init check into entropy.c.
+
+ This prevents link errors with the openbsd-compat tests when the linker
+ tries to bring in all the logging bits.
+
+commit ec41739bd68d639b0847b366697706e7dab3498d
+Author: Icenowy Zheng <uwu@icenowy.me>
+Date: Fri Nov 7 14:27:35 2025 +0800
+
+ seccomp sandbox: allow uname(3)
+
+ The uname(3) syscall is utilized by zlib-ng on RISC-V to decide whether
+ the kernel handles VILL bit of V extension properly (by checking the
+ kernel version against 6.5).
+
+ Allow it in the seccomp sandbox.
+
+ Signed-off-by: Icenowy Zheng <uwu@icenowy.me>
+
+commit 90501bc30ca94fa5443e2b7e2072d5d454587ef8
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Thu Nov 13 22:04:19 2025 +1100
+
+ Remove remaining OpenSSL_add_all_algorithms() calls.
+
+ We already have OPENSSL_init_crypto() in the compat layer (now with a
+ check of its return code, prompted by tb@). Prompted by github PR#606
+ from Dimitri John Ledkov. ok beck@
+
+commit d9955e4571ec356ba4f2e99d01f7fa88f6e20a63
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Thu Nov 13 10:35:14 2025 +0000
+
+ upstream: Remove calls to OpenSSL_add_all_algorithms()
+
+ and ERR_load_crypto_strings(). These are no-ops in LibreSSL, and in
+ Portable have been mostly replaced by a call to OPENSSL_init_crypto()
+ in the compat layer. ok tb@
+
+ OpenBSD-Commit-ID: 4c3e0af10fe276766054eda34428a37a5606d3ea
+
+commit 6aba7008e6451ae3f9298214b13b8eded5fd9ff0
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Thu Nov 13 05:13:06 2025 +0000
+
+ upstream: sync support for systems that lack __builtin_popcount() from
+
+ portable
+
+ unused on OpenBSD (nothing sets MISSING_BUILTIN_POPCOUNT), but it
+ makes syncing much easier.
+
+ OpenBSD-Commit-ID: 496446300d82615b24f83eca886b8fabdbee445b
+
+commit 84347d67ad2d5ee0db43f32bca91bacccecdb647
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Thu Nov 13 04:56:23 2025 +0000
+
+ upstream: update our ML-KEM implementation to upstream libcrux
+
+ v0.0.4
+
+ tested/ok tb@
+
+ OpenBSD-Commit-ID: 525a62549efbf53492adcb2c57e4872cdbaeed62
+
+commit c09eeba78ad622b988ab7f8d96e75b7edd434598
+Author: tb@openbsd.org <tb@openbsd.org>
+Date: Fri Nov 7 06:29:45 2025 +0000
+
+ upstream: sshkey_ec_validate_public: zap trailing blank I missed on
+
+ review
+
+ OpenBSD-Commit-ID: b296bd6056f33fd567ca0d5e9123dac1ec00f037
+
+commit 7cb3ea4dcc7d73b2fad6782a119901cfa2b022aa
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Thu Nov 13 10:23:45 2025 +1100
+
+ Simplify git command to avoid yaml syntax error.
+
+commit 08786bbe7eebff316efb0b4ccb882f93f33a16b8
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Thu Nov 13 09:53:17 2025 +1100
+
+ Don't use OpenSSL's ed25519 if built without EC.
+
+ Explicitly check for OPENSSL_NO_EC, since otherwise the test will link
+ but then fail at runtime.
+
+commit d12813314452173b1709f7fdbae74add84c0056f
+Author: Damien Miller <djm@mindrot.org>
+Date: Fri Nov 7 15:49:55 2025 +1100
+
+ octal-escape the colon character
+
+ Apparently these are YAML magic when followed by whitespace
+
+commit 5a104d81a2a916a6b9a42e28a7fa11bb781dfdf4
+Author: Damien Miller <djm@mindrot.org>
+Date: Fri Nov 7 15:44:18 2025 +1100
+
+ try single quotes instead of escaped quotes
+
+commit 48d8293956b9801b870a56782e19f29793ca04ba
+Author: Damien Miller <djm@mindrot.org>
+Date: Fri Nov 7 15:42:57 2025 +1100
+
+ escape quotes in yaml
+
+commit 1f1d63e16b5ce67f6f2f1170ec7221f1e6bff530
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Fri Nov 7 04:33:52 2025 +0000
+
+ upstream: Escape SSH_AUTH_SOCK paths that are sent to the shell as
+
+ setenv commands.
+
+ Unbreaks ssh-agent for home directory paths that contain whitespace.
+
+ Based on fix from Beat Bolli via bz3884; feedback/ok dtucker@
+
+ OpenBSD-Commit-ID: aaf06594e299940df8b4c4b9f0a1d14bef427e02
+
+commit 5794f2a186ee8ea7db0002bf7470b817572aaef0
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Thu Nov 6 17:24:28 2025 +0000
+
+ upstream: sk-dummy.so needs sshlog() stub after ed25519-openssl.c
+
+ change
+
+ OpenBSD-Regress-ID: 50b7f49021b8085728d0544275e141fb1bf4a2b5
+
+commit a1c526f29b47147046f77a0f74097008256396f6
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Thu Nov 6 01:33:26 2025 +0000
+
+ upstream: unit test for stringlist_append() and stringlist_free()
+
+ OpenBSD-Regress-ID: a3a4dae538c831b3810f69abc34ad8504dc3c460
+
+commit 9d8c686981834bc1dde09f5067ff925d8fc158f5
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Thu Nov 6 01:33:03 2025 +0000
+
+ upstream: link against ed25519-openssl.c instead of ed25519.c
+
+ OpenBSD-Regress-ID: f789d46e99d2598929e3c2d00b45c47cc3102501
+
+commit e57ef43c3ecb69aa237e2d88b793f18ee8a25817
+Author: anton@openbsd.org <anton@openbsd.org>
+Date: Sat Nov 1 05:39:25 2025 +0000
+
+ upstream: Cope with recent changes and don't link hash.c.
+
+ OpenBSD-Regress-ID: 577ef2f36ee592528448e8c0f33499e2e3512054
+
+commit 9bea081888fa659b964e6bfa41caca2b5def98c2
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Fri Nov 7 04:11:59 2025 +0000
+
+ upstream: Remove some unnecessary checks in
+
+ sshkey_ec_validate_public()
+ MIME-Version: 1.0
+ Content-Type: text/plain; charset=UTF-8
+ Content-Transfer-Encoding: 8bit
+
+ Checking nQ == infinity is not needed for cofactor 1 curves.
+ Checking x and y coordinates against order is not needed either.
+
+ patch from Szilárd Pfeiffer, with further refinement by tb@
+ ok tb@
+
+ OpenBSD-Commit-ID: ef985e2be7c64e215d064757d3fc65eb181e8ede
+
+commit 1399419f0b2d024bde968ffe769a3808611917e4
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Thu Nov 6 01:31:11 2025 +0000
+
+ upstream: move stringlist_append() and stringlist_free() to misc.c
+
+ OpenBSD-Commit-ID: 7d047bbff6964b9abbc04e9b3e2e1b4cc1db0aea
+
+commit f2ff1d9c1687be313dd491fcd136c682ef51bea8
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Fri Oct 31 01:50:43 2025 +0000
+
+ upstream: cleanup file descriptors across PKCS#11 client/helper
+
+ execution; ok markus
+
+ OpenBSD-Commit-ID: 993628a5b361e30aa48bbb4c07667a280f3f23ab
+
+commit 7e5d404cf73b6762715eec69b67cce2c4801f9e9
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Sat Nov 1 08:34:15 2025 +1100
+
+ Support using git for OpenBSD src tree tests.
+
+commit d87e7f0bed66fc9f76fe4a2f43390fdc9a664132
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Sat Nov 1 08:33:07 2025 +1100
+
+ Add OpenBSD 7.8 test target.
+
+commit 2425d7faf4154b32b5f836596023cf2432b81eaf
+Author: Damien Miller <djm@mindrot.org>
+Date: Fri Oct 31 13:47:49 2025 +1100
+
+ check PAM user against previous user, not pw_name
+
+ Avoids early fatal() if the user doesn't exist.
+
+ Reported by Viswesh Narayanan; ok dtucker@
+
+commit 7e2f89b0fb72141abbce098e2682ba8e090cabfc
+Author: Damien Miller <djm@mindrot.org>
+Date: Fri Oct 31 12:19:47 2025 +1100
+
+ skip pkcs11 tests when built --without-openssl
+
+commit 590a260f0bedc895688bb38b1cf6f0f72d8013e3
+Author: Damien Miller <djm@mindrot.org>
+Date: Fri Oct 31 12:19:34 2025 +1100
+
+ add sshlog() replacement to sk-dummy.so
+
+commit 57e347bae04cf214795fdeae3579991f0cc2e090
+Author: Damien Miller <djm@mindrot.org>
+Date: Fri Oct 31 11:16:29 2025 +1100
+
+ rename openbsd-compat sha2.h -> bsd-sha2.h
+
+ avoids confusion with system header when included from files under
+ openbsd-compat/
+
+commit a5f638585152863dc64ee9436a08e1d84735d740
+Author: Damien Miller <djm@mindrot.org>
+Date: Fri Oct 31 11:07:17 2025 +1100
+
+ fix linking for sk-dummy.so, used in tests
+
+commit c2a178959b03472c1b1677fea4bb263ed9fee2bd
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Thu Oct 30 23:55:09 2025 +0000
+
+ upstream: don't link hash.c
+
+ OpenBSD-Regress-ID: a145f09c1efb1fcd3924544463f1f94f5d4805c0
+
+commit 249224a0d43fdd2a536d7476c2bb15f4006dbbdd
+Author: miod@openbsd.org <miod@openbsd.org>
+Date: Thu Oct 23 19:06:10 2025 +0000
+
+ upstream: Prepare for gcc 3 leaving the building, COMPILER_VERSION
+
+ can no longer get set to "gcc3".
+
+ OpenBSD-Regress-ID: 02351ea947975b80be60b9a8c6e4dbb57789e890
+
+commit 9dcd640d44b8270c75783ef662c340187250d6e4
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Thu Oct 23 06:15:26 2025 +0000
+
+ upstream: Check tmux version and skip if too old. ok djm@
+
+ OpenBSD-Regress-ID: fb62024eb753c61b4d78402ec8378af839fad26c
+
+commit 94a78254a1c953c2a55eb54f65a5d99873b54bdf
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Thu Oct 30 23:19:33 2025 +0000
+
+ upstream: move crypto_hash_sha512() to be inline in crypto_api.h, saves
+
+ about 0.5kb per binary and makes life easier for portable; with/ok dtucker@
+
+ OpenBSD-Commit-ID: 672d7390f78bb6581c12661d7f5adc8a9c6be564
+
+commit 266647c5f2075d397bd5ed5316450183eda73388
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Thu Oct 30 20:49:10 2025 +0000
+
+ upstream: support ed25519 signatures via libcrypto. Mostly by Jeremy
+
+ Allison Feedback tb@, ok tb@ markus@
+
+ OpenBSD-Commit-ID: e8edf8adffd5975d05769dde897df882d7933526
+
+commit 4f3e65bda22b65dc5fff82df1e97af07456fed42
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Thu Oct 30 03:19:54 2025 +0000
+
+ upstream: Activate UnusedConnectionTimeout only after last channel
+
+ has closed. Previously UnusedConnectionTimeout could fire early after a
+ ChannelTimeout.
+
+ This was not a problem for the OpenSSH client because it terminates
+ once all channels have closed but could cause problems for other
+ clients (e.g. API clients) that do things differently.
+
+ bz3827; ok dtucker
+
+ OpenBSD-Commit-ID: ff2e4607cbd4e600de3c8a5ece3b0e4bb641ed8f
+
+commit e7f5928ef1c8e8c725bdca9cdd6b80e77fe774ac
+Author: miod@openbsd.org <miod@openbsd.org>
+Date: Thu Oct 23 19:06:10 2025 +0000
+
+ upstream: Prepare for gcc 3 leaving the building, COMPILER_VERSION
+
+ can no longer get set to "gcc3".
+
+ OpenBSD-Commit-ID: 98eefed432ff8253b307002e20d28da14b93e7e3
+
+commit 0ffb76c6590800958777cd0f7b1aaae19c74fa3f
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Wed Oct 22 06:22:58 2025 +0000
+
+ upstream: more explicit synchronisation around killing tmux sessions
+
+ between runs.
+
+ OpenBSD-Regress-ID: 1735f5cb13ad281e869ab998c7d49b692ee3ed47
+
+commit ffd086b69886e8cfeb74f9b2bcb18764bf7d9a52
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Wed Oct 22 05:22:31 2025 +0000
+
+ upstream: remove debugging junk
+
+ OpenBSD-Regress-ID: 3247e0ac98ae4cfe4eede871ef424d166e29e828
+
+commit 52712d5f11172ca98ffb0b2ac93007f74cb67134
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Tue Oct 21 23:30:01 2025 +0000
+
+ upstream: just skip the test if $PATH or $HOME has whitespace in it
+
+ OpenBSD-Regress-ID: ccf75a29d1a300a35f63be0e4f11ad5276756275
+
+commit a8eac05a85e31b11513a6a8dc5d662b14cbc2f4b
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Tue Oct 21 22:13:27 2025 +0000
+
+ upstream: quote paths; avoids test failure when run from a path with a
+
+ space in it
+
+ OpenBSD-Regress-ID: e4b7bffc289f10d47c50c02dd70b0323078a83b4
+
+commit 425e5b6bd765efbfc7691f43bfc08c86dc8a615e
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Tue Oct 21 08:35:22 2025 +0000
+
+ upstream: fix test for executability of tmux
+
+ OpenBSD-Regress-ID: a18119876ecfd95edb78225b086ac668eb0977ab
+
+commit d1d8144ea682adae5c3bb2994322fa524584ce8b
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Tue Oct 21 08:34:52 2025 +0000
+
+ upstream: add some more synchronisation to avoid a race between
+
+ command entry and ^C that showed up on the portable regress tests.
+
+ OpenBSD-Regress-ID: 5527e74aed1b008aa7e5223ca5a84aedecd973d4
+
+commit 8704c141bf6ded67ab466f5e987c49329ebbd968
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Tue Oct 21 07:18:27 2025 +0000
+
+ upstream: Always create logfiles. Should prevent "can't operate on
+
+ symlink" warnings during test runs.
+
+ OpenBSD-Regress-ID: 65cf5ce3c8b87b5609f1f3ea142b4f381128dc33
+
+commit dc9af8fb0436013afb544248e0afc2fd02a1a8fa
+Author: Mike Frysinger <vapier@gentoo.org>
+Date: Sun Oct 19 09:33:23 2025 -0400
+
+ bsd-openpty: include stdio.h for snprintf
+
+commit afe83537e0c0c159c7c3b6ef859424f6da18169c
+Author: Damien Miller <djm@mindrot.org>
+Date: Tue Oct 21 09:14:35 2025 +1100
+
+ include tmux in CI package list
+
+commit a750ec60782d21db69383344dda478342d40ffa1
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Mon Oct 20 18:31:08 2025 +1100
+
+ Detect tmux at configure time and pass to tests.
+
+ ok djm@
+
+commit 75faa8a167b5cd4453937387b15216aa3cbc52ce
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Mon Oct 20 18:29:24 2025 +1100
+
+ Update LibreSSL versions and add 4.2.0.
+
+commit 74369b2b7c366887211ef5c092b0aaa60f31ef11
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Mon Oct 20 00:45:10 2025 +0000
+
+ upstream: regression test for "interactive" ssh with a PTY attached,
+
+ using tmux
+
+ would have likely caught the ControlPersist regression in 10.1.
+
+ feedback nicm@
+
+ OpenBSD-Regress-ID: d4d709c08657769cb5691893cc98f34b6f537e76
+
+commit a204650386124df8035b8c8613dccbe9b3158cdf
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Fri Oct 17 16:26:22 2025 +1100
+
+ Retire macos-13 runners, add Intel-specific ones.
+
+commit a6503f1e22aa34ac08d5b4d2b6730954ffd30116
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Fri Oct 17 16:23:43 2025 +1100
+
+ If we have nfds_t, check if it's int or long.
+
+ Should fix build on very old Mac OS X, eg 10.3. Spotted and patch tested
+ by Sevan Janiyan.
+
+commit ce49aceba9f4b5f34a1041145782914aa35ca880
+Author: Damien Miller <djm@mindrot.org>
+Date: Thu Oct 16 11:15:16 2025 +1100
+
+ link ssh against ssh-pkcs11.o
+
+ Should fix PIN entry for direct use of PKCS11Provider in ssh(1)
+ bz3879
+
+commit 946574b97ceae126e0f0af2db43abb454937defe
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Thu Oct 16 00:01:54 2025 +0000
+
+ upstream: regress test for PKCS#11 directly in ssh (not via ssh-agent)
+
+ would have caught bz3879
+
+ OpenBSD-Regress-ID: ceafb1e9a6c07185cc0cb0589f3170489a516123
+
+commit e3fdb82fb02723dbe139f9d4be274d7fddfb7983
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Thu Oct 16 00:00:36 2025 +0000
+
+ upstream: missed a case in previous
+
+ OpenBSD-Commit-ID: 271c5602b5e719ee3def19dbd9a33328b4fa7edc
+
+commit d926a84d17fb28bc94219e68575cb4847af02e9a
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Wed Oct 15 23:55:01 2025 +0000
+
+ upstream: don't try to pledge() the client if a PKCS11Provider is
+
+ in use
+
+ OpenBSD-Commit-ID: 445b2bf4b1e36e515f4d888f35244fd2dcfbb566
+
+commit 9c8572a357c071923569a62bd9cfb68b1f788e09
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Wed Oct 15 23:54:20 2025 +0000
+
+ upstream: mention this is for both ssh-pkcs11.c and
+
+ ssh-pkcs11-client.c
+
+ OpenBSD-Commit-ID: 26eff4b9a328fa056e98b997cb57254639e48fda
+
+commit a4e404a64b117a15453075ee26eb061d416e58cd
+Author: Arnout Engelen <arnout@bzzt.net>
+Date: Sat Jun 21 09:47:28 2025 +0200
+
+ mdoc2man: process `Dl` macros
+
+ `Dl` marks a single line as 'literal'. Since we don't output single
+ lines differently in literal vs regular mode (we only insert line
+ breaks for multi-line blocks in literal mode), we can just skip it.
+
+commit 45e2d8861bb724cfced1bf0693a6418a0cba6ab2
+Author: Arnout Engelen <arnout@bzzt.net>
+Date: Fri Jun 20 21:36:44 2025 +0200
+
+ mdoc2man: support `Ns` inside `Ic`
+
+ When encountering an `Ns` mdoc macro ('no space') inside an `Ic` block
+ ('command'), such as for 'lines=number' in ssh-keygen.1, `mdoc2man`
+ just output the macro instead of processing it.
+
+ This adds processing for `Ns` when seen inside an `Ic` block.
+
+commit 2b1761dea36c120417d8b73db8310dc09a781e6f
+Author: Mike Frysinger <vapier@gentoo.org>
+Date: Mon Oct 13 11:29:36 2025 -0400
+
+ gitignore: ignore all *~ files
+
+ This is a common backup style.
+
+commit 3ccdd9841f48e7d660f8b60c996965e9dde0a3a9
+Author: Mike Frysinger <vapier@gentoo.org>
+Date: Mon Oct 13 12:49:24 2025 -0400
+
+ bsd-misc: include sys/ioctl.h
+
+ This file uses ioctl() to implement some fallback functions, but
+ doesn't include sys/ioctl.h for it.
+
+commit 3adc47e161901001816045c032fa61e94b0c9426
+Author: Damien Miller <djm@mindrot.org>
+Date: Tue Oct 14 14:52:50 2025 +1100
+
+ don't leak PAM handle on repeat invocations
+
+ Reported by Casper Dik via bz3882; ok dtucker@
+
+commit a6ee0eb8cd951d0a00b2f06687c77f8f573b5985
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Mon Oct 13 19:02:45 2025 +1100
+
+ Switch OpenBSD VMs to use doas instead of sudo.
+
+ OpenBSD 7.3 packages have been removed from the mirrors so we can't
+ install sudo for it any more, so switch to the native doas utility.
+
+commit da2f945f62e5a462381103803ee72e924bd1f137
+Author: Damien Miller <djm@mindrot.org>
+Date: Mon Oct 13 14:33:04 2025 +1100
+
+ check whether diff accepts -N
+
+commit cd8c96f283dbad90991edc09ade962bcfd96adc9
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Mon Oct 13 00:56:15 2025 +0000
+
+ upstream: test remote/remote recursive transfers where the source
+
+ path ends in ".."
+
+ OpenBSD-Regress-ID: 2f42078cfcee986d08b5d135968b8de6186c0003
+
+commit be0777ae3ef6d9deacb0e3c494674c84feac34bd
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Mon Oct 13 00:55:45 2025 +0000
+
+ upstream: test recursive transfers, including cases where the
+
+ source path ends in ".."
+
+ OpenBSD-Regress-ID: a38e3dbc86f6b7a95605784dcc601f17ede9c3f0
+
+commit 36a98fccaacbbf07eaf67855a8057cba724c5e91
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Mon Oct 13 00:55:09 2025 +0000
+
+ upstream: test implicit destination path selection when source path
+
+ ends with ".."
+
+ OpenBSD-Regress-ID: 42a88e7cdceee8a83879f5730199084ee4a95902
+
+commit 4f14ca8633a2c8c0a1a19165663421f0ab32f6ab
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Mon Oct 13 00:54:29 2025 +0000
+
+ upstream: similar to scp, fix implicit destination path selection
+
+ when source path ends with ".."; ok deraadt@
+
+ OpenBSD-Commit-ID: 9b8d2a662d96b241293a88b3ea21f2419bfc4812
+
+commit 6432b9f6a216d0f5fb43df500e9bc30bebb3f58b
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Mon Oct 13 00:53:51 2025 +0000
+
+ upstream: when using the SFTP protocol for transfers, fix implicit
+
+ destination path selection when source path ends with ".."; ok deraadt@
+ bz3871
+
+ OpenBSD-Commit-ID: d75b3b006386c5302ed4f67c4add18464ab36a0b
+
+commit 30c20c901d8f665fb28edd006f6f8c1e46413051
+Author: dtucker@openbsd.org <dtucker@openbsd.org>
+Date: Sat Oct 11 23:39:14 2025 +0000
+
+ upstream: Import regenerate moduli.
+
+ OpenBSD-Commit-ID: 8512e01cf917dca6455be561d66db8eeb49f3f0b
+
+commit b6fd0e6d085ef519982c968b57fbaa9e509e1a3a
+Author: Damien Miller <djm@mindrot.org>
+Date: Fri Oct 10 15:23:59 2025 +1100
+
+ depend
+
+commit d6212b0b89241e96d2fea9619b2d66ea668bceaa
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Fri Oct 10 00:31:53 2025 +0000
+
+ upstream: clean up more thoroughly between tests
+
+ OpenBSD-Regress-ID: c8394eae7547374a8fc43d03d865539e2917ea50
+
+commit 9525aa3ecc6b27643fb83d8be4d61e831e357134
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Thu Oct 9 23:58:27 2025 +0000
+
+ upstream: simplify
+
+ OpenBSD-Regress-ID: 8e91a2a5c1eb50128de3be72118b544d73a86673
+
+commit e7b4b3f153713c15e3888aa50df039b2445492dd
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Thu Oct 9 23:26:47 2025 +0000
+
+ upstream: don't abuse SSHKEY_FLAG_EXT to signal that a key is in
+
+ the agent, as that triggers special handling on sshkey_free()
+
+ OpenBSD-Commit-ID: 2ae2247babd2db167a30cf7a4f7eae4f26c000a8
+
+commit 59a336cfd1283f512f067e01bc91bda5af253f80
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Thu Oct 9 23:25:23 2025 +0000
+
+ upstream: downgrade a useless error() -> debug()
+
+ OpenBSD-Commit-ID: 5b0c9bcddb324f8bed2c8e8ffe9c92d263adc2d9
+
+commit 649c9994e7d1995a03d8621f1412cfee90a430af
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Thu Oct 9 03:23:33 2025 +0000
+
+ upstream: silence "mm_log_handler: write: Broken pipe" logspam
+
+ OpenBSD-Commit-ID: bcf7c6ea509e755bd5a7cd567ff7cad725111a14
+
+commit fb0bf236b0237aa83a0c5b666af7bdc0423ac457
+Author: Darren Tucker <dtucker@dtucker.net>
+Date: Thu Oct 9 17:57:17 2025 +1100
+
+ Add tracking for 10.2 branch.
+
+commit 081b8dbbe90d81a43b5e0f1995fe59a0e319aa15
+Author: Damien Miller <djm@mindrot.org>
+Date: Thu Oct 9 13:12:15 2025 +1100
+
+ complete PKCS#11 stubs and move to ssh-pkcs11.c
+
+ Should unbreak --disable-pkcs11 builds
+
+commit ac4457787900c99ada9cc3768249291b002fa16e
Author: Damien Miller <djm@mindrot.org>
Date: Thu Oct 9 13:10:27 2025 +1100
@@ -52,13 +2861,48 @@ Date: Thu Oct 9 13:10:27 2025 +1100
Previously, it was possible for p11_setup to return success on
configurations with PKCS#11 support disabled.
-commit af17ae64a5cfee42334883d2802f40f779131740
+commit 3470f465c6f5c7c371e73927ebb403dd7ba05893
Author: Damien Miller <djm@mindrot.org>
-Date: Thu Oct 9 13:12:15 2025 +1100
+Date: Thu Oct 9 10:07:40 2025 +1100
- complete PKCS#11 stubs and move to ssh-pkcs11.c
+ link ssh-keygen directly against ssh-pkcs11.c
- Should unbreak --disable-pkcs11 builds
+ Matches what OpenBSD does and fixes ssh-keygen regression in
+ certifying keys using a CA key hosted via ssh-agent (bz3877)
+
+commit 0f3b8fd68a29766697d7a709bae8b0a61da6cff2
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Wed Oct 8 21:48:40 2025 +0000
+
+ upstream: When tab-completing a filename, ensure that the completed
+
+ string does not end up mid-way through a multibyte character, as this will
+ cause a fatal() later on.
+
+ based on GHPR#587 from @TaoistBrickscarrier; feedback tb@ kevlo@
+ ok dtucker@
+
+ OpenBSD-Commit-ID: efb977164b4e20d61204a66201a7592ba8291362
+
+commit 0118c30acaff308deb089fc25fe98ef59a149ca5
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Wed Oct 8 21:02:16 2025 +0000
+
+ upstream: fix crash at exit (visible via ssh-keygen -D) when
+
+ multiple keys loaded. ok markus deraadt dtucker
+
+ OpenBSD-Commit-ID: baa9763ec69d162108dafd962792ec5610ff45c9
+
+commit 64ea9e95256203f30f98a6896f4721fd223106aa
+Author: djm@openbsd.org <djm@openbsd.org>
+Date: Wed Oct 8 00:32:52 2025 +0000
+
+ upstream: openssh-10.2
+
+ The only change since 10.1 is the channels.c fix
+
+ OpenBSD-Commit-ID: 5eebeb0db14c694efd4ee96b5f16112e3e5d5ba9
commit bcf7c05a473f92a35f4f3b561fd7a1e339e0a30f
Author: Darren Tucker <dtucker@dtucker.net>
@@ -7781,1660 +10625,3 @@ Date: Wed Apr 3 14:40:32 2024 +1100
Standalone implementation that does not depend on libsystemd.
With assistance from Luca Boccassi, and feedback/testing from Colin
Watson. bz2641
-
-commit 43e7c1c07cf6aae7f4394ca8ae91a3efc46514e2
-Author: Darren Tucker <dtucker@dtucker.net>
-Date: Sun Mar 31 21:51:57 2024 +1100
-
- Port changes from selfhosted to upstream tests.
-
- Should get them working again.
-
-commit 281ea25a44bff53eefb4af7bab7aa670b1f8b6b2
-Author: Darren Tucker <dtucker@dtucker.net>
-Date: Sat Mar 30 18:20:16 2024 +1100
-
- Check if OpenSSL implementation supports DSA.
-
- If --enable/disable-dsa-keys is not specified, set based on what OpenSSL
- supports. If specified as enabled, but not supported by OpenSSL error
- out. ok djm@
-
-commit 2d2c068de8d696fe3246f390b146197f51ea1e83
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Sat Mar 30 05:56:22 2024 +0000
-
- upstream: in OpenSSH private key format, correct type for subsequent
-
- private keys in blob. From Jakub Jelen via GHPR430
-
- OpenBSD-Commit-ID: d17dbf47554de2d752061592f95b5d772baab50b
-
-commit c2c0bdd3e96b3ef66d77fccb85ff4962dc76caf0
-Author: Eero Häkkinen <Eero+git@xn--Hkkinen-5wa.fi>
-Date: Sat Sep 16 00:55:08 2023 +0300
-
- Expose SSH_AUTH_INFO_0 always to PAM auth modules.
-
- This changes SSH_AUTH_INFO_0 to be exposed to PAM auth modules also
- when a password authentication method is in use and not only
- when a keyboard-interactive authentication method is in use.
-
-commit 02c5ad23124ae801cf248d99ea5068fc4331ca01
-Author: Darren Tucker <dtucker@dtucker.net>
-Date: Wed Mar 27 17:42:58 2024 +1100
-
- Rearrange selfhosted VM scheduling.
-
- Instead of trying to infer the type of the self hosted tests in each of
- the driver scripts (inconsistently...), set one of the following
- variables to "true" in the workflow:
-
- VM: tests run in a virtual machine.
- EPHEMERAL: tests run on an ephemeral virtual machine.
- PERSISTENT: tests run on a persistent virtual machine
- REMOTE: tests run on a physical remote host.
-
- EPHEMERAL VMs can have multiple instances of any given VM can exist
- simultaneously and are run by a runner pool. The other types have a
- dedicated runner instance and can only run a single test at a time.
-
- Other settings:
- SSHFS: We need to sshfs mount over the repo so the workflow can collect
- build artifacts. This also implies the tests must be run over ssh.
- DEBUG_ACTIONS: enable "set -x" in scripts for debugging.
-
-commit cd8a72707c02615365d0851ac51063ab6bfe258f
-Author: Damien Miller <djm@mindrot.org>
-Date: Sat Mar 30 16:05:59 2024 +1100
-
- add new token-based signing key for dtucker@
-
- Verified in person and via signature with old key.
- Will remove old key in a bit.
-
-commit 8d0e46c1ddb5b7f0992591b0dc5d8aaa77cc9dba
-Author: Alkaid <zgf574564920@gmail.com>
-Date: Tue Mar 12 03:59:12 2024 -0700
-
- Fix OpenSSL ED25519 support detection
-
- Wrong function signature in configure.ac prevents openssh from enabling
- the recently new support for ED25519 priv keys in PEM PKCS8 format.
-
-commit 697359be9c23ee43618243cdbcc9c7981e766752
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Sat Mar 30 04:27:44 2024 +0000
-
- upstream: allow WAYLAND_DISPLAY to enable SSH_ASKPASS
-
- From dkg via GHPR479; ok dtucker@
-
- OpenBSD-Commit-ID: 1ac1f9c45da44eabbae89375393c662349239257
-
-commit 7844705b0364574cc70b941be72036c2c2966363
-Author: dtucker@openbsd.org <dtucker@openbsd.org>
-Date: Fri Mar 29 10:40:07 2024 +0000
-
- upstream: Use egrep instead of grep -E.
-
- Some plaforms don't have the latter so this makes things easier
- in -portable.
-
- OpenBSD-Regress-ID: ff82260eb0db1f11130200b25d820cf73753bbe3
-
-commit 22b2b6c555334bffdf357a2e4aa74308b03b83c3
-Author: dtucker@openbsd.org <dtucker@openbsd.org>
-Date: Tue Mar 26 08:09:16 2024 +0000
-
- upstream: test -h is the POSIXly way of testing for a symlink. Reduces
-
- diff vs Portable.
-
- OpenBSD-Regress-ID: 6f31cd6e231e3b8c5c2ca0307573ccb7484bff7d
-
-commit edcff77f82c2bb2b5653b36f1e47274c5ef3e8be
-Author: Darren Tucker <dtucker@dtucker.net>
-Date: Tue Mar 26 18:58:58 2024 +1100
-
- Fix name of OpenBSD upstream CI jobs.
-
-commit 861b084429940e024f1b6e9c2779eac95d7a45db
-Author: Darren Tucker <dtucker@dtucker.net>
-Date: Tue Mar 26 18:55:33 2024 +1100
-
- Resync with upstream: ${} around DATAFILE.
-
-commit 63f248c7693e7f0a3b9a13d2980ac9a7e37f2aea
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Mon Mar 25 19:28:09 2024 +0000
-
- upstream: optional debugging
-
- OpenBSD-Regress-ID: b4852bf97ac8fb2e3530f2d5f999edd66058d7bc
-
-commit 16e2ebe06a62f09d4877b769876d92d6008a896f
-Author: dtucker@openbsd.org <dtucker@openbsd.org>
-Date: Mon Mar 25 06:05:42 2024 +0000
-
- upstream: Verify string returned from local shell command.
-
- OpenBSD-Regress-ID: 5039bde24d33d809aebfa8d3ad7fe9053224e6f8
-
-commit b326f7a1f39ff31324cc3fe2735178fb474c04a4
-Author: dtucker@openbsd.org <dtucker@openbsd.org>
-Date: Mon Mar 25 03:30:31 2024 +0000
-
- upstream: Improve shell portability: grep -q is not portable so
-
- redirect stdout, and use printf instead of relying on echo to do \n
- substitution. Reduces diff vs Portable.
-
- Also resync somewhat with upstream.
-
- OpenBSD-Regress-ID: 9ae876a8ec4c4725f1e9820a0667360ee2398337
-
-commit dbf2e319f0c582613fa45a735ea3c242ce56946b
-Author: dtucker@openbsd.org <dtucker@openbsd.org>
-Date: Mon Mar 25 02:07:08 2024 +0000
-
- upstream: Save error code from SSH for use inside case statement,
-
- from portable. In some shells, "case" will reset the value of $?, so save it
- first.
-
- OpenBSD-Regress-ID: da32e5be19299cb4f0f7de7f29c11257a62d6949
-
-commit d2c8c4fa7def4fb057ed05b3db57b62c810a26f6
-Author: dtucker@openbsd.org <dtucker@openbsd.org>
-Date: Mon Mar 25 01:40:47 2024 +0000
-
- upstream: Increase timeout. Resyncs with portable where some of
-
- the test VMs are slow enough for this to matter.
-
- OpenBSD-Regress-ID: 6a83a693602eb0312f06a4ad2cd6f40d99d24b26
-
-commit 83621b63514a84791623db3efb59d38bc4bf9563
-Author: dtucker@openbsd.org <dtucker@openbsd.org>
-Date: Mon Mar 25 01:28:29 2024 +0000
-
- upstream: In PuTTY interop test, don't assume the PuTTY major
-
- version is 0. Patch from cjwatson at debian.org via bz#3671.
-
- OpenBSD-Regress-ID: 835ed03c1b04ad46be82e674495521f11b840191
-
-commit 8a421b927700f3834b4d985778e252b8e3299f83
-Author: Darren Tucker <dtucker@dtucker.net>
-Date: Tue Mar 26 18:38:14 2024 +1100
-
- Really mkdir /usr/local/etc in CI tests.
-
-commit 2946ed522c47ce045314533d426b4e379f745e59
-Author: Darren Tucker <dtucker@dtucker.net>
-Date: Tue Mar 26 17:19:09 2024 +1100
-
- Better short name for OpenBSD upstream CI jobs too.
-
-commit 18dbe8eff647aacb82d7e86b4ce63d5beee11f25
-Author: Darren Tucker <dtucker@dtucker.net>
-Date: Tue Mar 26 17:13:52 2024 +1100
-
- Ensure /usr/local/etc exists before using in tests.
-
-commit 5fc1085128e3348bb1b5ee4d955cc767b019b3ad
-Author: Darren Tucker <dtucker@dtucker.net>
-Date: Tue Mar 26 16:50:46 2024 +1100
-
- Be more specific about when to rerun workflows.
-
-commit 5516923e8ae3da0823fea0d7d28aa813627142c0
-Author: Darren Tucker <dtucker@dtucker.net>
-Date: Tue Mar 26 16:35:27 2024 +1100
-
- Add short names for test jobs on github CI.
-
-commit dc37d2d2470b4a9cedcee9ac926b7362214e3305
-Author: Darren Tucker <dtucker@dtucker.net>
-Date: Tue Mar 26 16:26:14 2024 +1100
-
- If we're using xpg4's id, remember to pass args.
-
-commit fe169487937780392b23d3ff3c00e5898c10f784
-Author: dtucker@openbsd.org <dtucker@openbsd.org>
-Date: Tue Mar 26 01:23:11 2024 +0000
-
- upstream: Import regenerated moduli.
-
- OpenBSD-Commit-ID: ad3d1486d105b008c93e952d158e5af4d9d4c531
-
-commit 151146f03b490d19145cd421763aa7d42f5c50e2
-Author: job@openbsd.org <job@openbsd.org>
-Date: Thu Mar 14 06:23:14 2024 +0000
-
- upstream: Clarify how literal IPv6 addresses can be used in -J mode
-
- OK djm@
-
- OpenBSD-Commit-ID: 524ddae97746b3563ad4a887dfd0a6e6ba114c50
-
-commit 0d5bdc87a675271862b67eb6a9fb13a202fb4894
-Author: Darren Tucker <dtucker@dtucker.net>
-Date: Mon Mar 25 16:14:21 2024 +1100
-
- Add Mac OS X 14 test targets.
-
-commit 2d7964a03e1f50a48040ec6912c0a956df909d21
-Author: Darren Tucker <dtucker@dtucker.net>
-Date: Mon Mar 25 14:05:40 2024 +1100
-
- Move xpg4 'id' handling into test-exec.sh.
-
- Handle replacement of 'id' the same way as we do other Portable specific
- replacements in test-exec.sh. This brings percent.sh back into sync
- with upstream.
-
-commit 75d1d49ed10d978171cdafad28bdbffdbd48f41e
-Author: Darren Tucker <dtucker@dtucker.net>
-Date: Mon Mar 25 10:38:03 2024 +1100
-
- Update branches shown on ci-status to 9.7 and 9.6.
-
-commit f9193f03db0029fc9c31fbdb5c66a2737446bd8f
-Author: Darren Tucker <dtucker@dtucker.net>
-Date: Mon Mar 25 09:28:02 2024 +1100
-
- Improve detection of -fzero-call-used-regs=used.
-
- Should better detect problems with gcc 13 on m68k. bz#3673 from Colin
- Watson via bz#3673 and https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110934
-
- Signed-off-by: Darren Tucker <dtucker@dtucker.net>
-
-commit 86bdd3853f4d32c85e295e6216a2fe0953ad93f0
-Author: Damien Miller <djm@mindrot.org>
-Date: Mon Mar 11 16:20:49 2024 +1100
-
- version number in README
-
-commit 282721418e6465bc39ccfd39bb0133e670ee4423
-Author: Damien Miller <djm@mindrot.org>
-Date: Mon Mar 11 16:20:08 2024 +1100
-
- crank RPM spec versions
-
-commit 3876a3bbd2ca84d23ba20f8b69ba83270c04ce3a
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Mon Mar 11 04:59:47 2024 +0000
-
- upstream: openssh-9.7
-
- OpenBSD-Commit-ID: 618ececf58b8cdae016b149787af06240f7b0cbc
-
-commit 8fc109cc614954a8eb2738c48c0db36a62af9a06
-Author: Darren Tucker <dtucker@dtucker.net>
-Date: Mon Mar 11 12:59:26 2024 +1100
-
- Test against current OpenSSL and LibreSSL releases.
-
- Add LibreSSL 3.9.0, bump older branches to their respective current
- releases.
-
-commit 26b09b45fec7b88ba09042c09be4157e58e231e2
-Author: Damien Miller <djm@mindrot.org>
-Date: Sun Mar 10 16:24:57 2024 +1100
-
- quote regexes used to test for algorithm support
-
- Fixes test failures on Solaris 8 reported by Tom G. Christensen
-
-commit a6a740a4948d10a622b505135bb485c10f21db5e
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Sat Mar 9 05:12:13 2024 +0000
-
- upstream: avoid logging in signal handler by converting mainloop to
-
- ppoll() bz3670, reported by Ben Hamilton; ok dtucker@
-
- OpenBSD-Commit-ID: e58f18042b86425405ca09e6e9d7dfa1df9f5f7f
-
-commit cd82f7526e0481720567ae41db7849ab1c27e27b
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Fri Mar 8 22:16:32 2024 +0000
-
- upstream: skip more whitespace, fixes find-principals on
-
- allowed_signers files with blank lines; reported by Wiktor Kwapisiewicz
-
- OpenBSD-Commit-ID: b3a22a2afd753d70766f34bc7f309c03706b5298
-
-commit 2f9d2af5cb19905d87f37d1e11c9f035ac5daf3b
-Author: dtucker@openbsd.org <dtucker@openbsd.org>
-Date: Fri Mar 8 11:34:10 2024 +0000
-
- upstream: Invoke ProxyCommand that uses stderr redirection via
-
- $TEST_SHELL. Fixes test when run by a user whose login shell is tcsh.
- Found by vinschen at redhat.com.
-
- OpenBSD-Regress-ID: f68d79e7f00caa8d216ebe00ee5f0adbb944062a
-
-commit 9b3f0beb4007a7e01dfedabb429097fb593deae6
-Author: Darren Tucker <dtucker@dtucker.net>
-Date: Thu Mar 7 17:18:14 2024 +1100
-
- Prefer openssl binary from --with-ssl-dir directory.
-
- Use openssl in the directory specified by --with-ssl-dir as long
- as it's functional. Reported by The Doctor.
-
-commit c47e1c9c7911f38b2fc2fb01b1f6ae3a3121a838
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Wed Mar 6 02:59:59 2024 +0000
-
- upstream: fix memory leak in mux proxy mode when requesting forwarding.
-
- found by RASU JSC, reported by Maks Mishin in GHPR#467
-
- OpenBSD-Commit-ID: 97d96a166b1ad4b8d229864a553e3e56d3116860
-
-commit 242742827fea4508e68097c128e802edc79addb5
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Wed Mar 6 00:31:04 2024 +0000
-
- upstream: wrap a few PKCS#11-specific bits in ENABLE_PKCS11
-
- OpenBSD-Commit-ID: 463e4a69eef3426a43a2b922c4e7b2011885d923
-
-commit d52b6509210e2043f33e5a1de58dd4a0d5d48c2a
-Author: Damien Miller <djm@mindrot.org>
-Date: Wed Mar 6 11:31:36 2024 +1100
-
- disable RSA tests when algorithm is not supported
-
- Unbreaks "make test" when compiled --without-openssl.
-
- Similar treatment to how we do DSA and ECDSA.
-
-commit 668d270a6c77e8b5a1da26ecad2e6de9f62c8fe4
-Author: Damien Miller <djm@mindrot.org>
-Date: Wed Mar 6 10:33:20 2024 +1100
-
- add a --without-retpoline configure option
-
- discussed with deraadt and dtucker a while ago
-
-commit 3deb501f86fc47e175ef6a3eaba9b9846a80d444
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Mon Mar 4 04:13:18 2024 +0000
-
- upstream: fix leak of CanonicalizePermittedCNAMEs on error path;
-
- spotted by Coverity (CID 438039)
-
- OpenBSD-Commit-ID: 208839699939721f452a4418afc028a9f9d3d8af
-
-commit 65a44a8a4f7d902a64d4e60eda84384b2e2a24a2
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Mon Mar 4 02:16:11 2024 +0000
-
- upstream: Separate parsing of string array options from applying them
-
- to the active configuration. This fixes the config parser from erroneously
- rejecting cases like:
-
- AuthenticationMethods password
- Match User ivy
- AuthenticationMethods any
-
- bz3657 ok markus@
-
- OpenBSD-Commit-ID: 7f196cba634c2a3dba115f3fac3c4635a2199491
-
-commit 6886e1b1f55c90942e4e6deed930f8ac32e0f938
-Author: Darren Tucker <dtucker@dtucker.net>
-Date: Thu Feb 22 17:59:35 2024 +1100
-
- Add nbsd10 test target.
-
-commit d86bf8a3f6ea4fa7887406c2aa9959db71fa41be
-Author: Damien Miller <djm@mindrot.org>
-Date: Thu Feb 22 12:06:10 2024 +1100
-
- more descriptive configure test name
-
-commit 9ee335aacc9f5bdc4cc2c19fafb45e27be7d234e
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Wed Feb 21 06:17:29 2024 +0000
-
- upstream: explain arguments of internal-sftp GHPR#454 from Niklas
-
- Hambüchen
- MIME-Version: 1.0
- Content-Type: text/plain; charset=UTF-8
- Content-Transfer-Encoding: 8bit
-
- OpenBSD-Commit-ID: 0335d641ae6b5b6201b9ffd5dd06345ebbd0a3f3
-
-commit d1164cb1001dd208fee88aaa9b43d5e6fd917274
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Wed Feb 21 06:06:43 2024 +0000
-
- upstream: clarify permissions requirements for ChrootDirectory Part
-
- of GHPR#454 from Niklas Hambüchen
- MIME-Version: 1.0
- Content-Type: text/plain; charset=UTF-8
- Content-Transfer-Encoding: 8bit
-
- OpenBSD-Commit-ID: d37bc8786317a11649c62ff5e2936441186ef7a0
-
-commit d410e17d186552d0717f18217d0d049486754365
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Wed Feb 21 06:05:06 2024 +0000
-
- upstream: .Cm for a keyword. Part of GHPR#454 from Niklas Hambüchen
-
- OpenBSD-Commit-ID: d59c52559f926fa82859035d79749fbb4a3ce18a
-
-commit ab73f9678ebf06b32d6361b88b50b42775e0565b
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Wed Feb 21 06:01:13 2024 +0000
-
- upstream: fix typo in match directive predicate (s/tagged/tag) GHPR#462
-
- from Tobias Manske
-
- OpenBSD-Commit-ID: 05b23b772677d48aa82eefd7ebebd369ae758908
-
-commit 9844aa2521ccfb1a2d73745680327b79e0574445
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Wed Feb 21 05:57:34 2024 +0000
-
- upstream: fix proxy multiplexing mode, broken when keystroke timing
-
- obfuscation was added. GHPR#463 from montag451
-
- OpenBSD-Commit-ID: 4e412d59b3f557d431f1d81c715a3bc0491cc677
-
-commit ee6d932acb532f80b11bb7cf161668c70ec8a117
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Tue Feb 20 04:10:03 2024 +0000
-
- upstream: don't append a gratuitous space to the end of subsystem
-
- arguments; bz3667
-
- OpenBSD-Commit-ID: e11023aeb3f30b77a674e37b8292c862926d5dc6
-
-commit e27f032aa8fcbae9b2e7c451baaf4b8ac6fa3d45
-Author: dtucker@openbsd.org <dtucker@openbsd.org>
-Date: Mon Feb 19 09:25:52 2024 +0000
-
- upstream: Always define puttysetup function.
-
- OpenBSD-Regress-ID: b4c0ccfa4006a1bc5dfd99ccf21c854d3ce2aee0
-
-commit 84046f9991abef5f46b040b10cf3d494f933a17b
-Author: dtucker@openbsd.org <dtucker@openbsd.org>
-Date: Fri Feb 9 08:56:59 2024 +0000
-
- upstream: Exapnd PuTTY test coverage.
-
- Expand the set of ciphers, MACs and KEX methods in the PuTTY interop
- tests.
-
- OpenBSD-Regress-ID: dd28d97d48efe7329a396d0d505ee2907bf7fc57
-
-commit bbf541ee2afe07b08a8b56fa0dc6f38fcfceef2a
-Author: dtucker@openbsd.org <dtucker@openbsd.org>
-Date: Fri Feb 9 08:47:42 2024 +0000
-
- upstream: Factor out PuTTY setup.
-
- Factor out PuTTY and call only when needed.
-
- This allows us to avoid PuTTY key setup when it's not needed, which
- speeds up the overall test run by a couple of percent.
-
- OpenBSD-Regress-ID: c25eaccc3c91bc874400f7c85ce40e9032358c1c
-
-commit d31c21c57fb4245271680a1e5043cf6470a96766
-Author: naddy@openbsd.org <naddy@openbsd.org>
-Date: Sat Feb 10 11:28:52 2024 +0000
-
- upstream: clean sshd random relinking kit; ok miod@
-
- OpenBSD-Commit-ID: 509bb19bb9762a4b3b589af98bac2e730541b6d4
-
-commit 4dbc5a363ff53a2fcecf6bc3bcc038badc12f118
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Fri Feb 2 00:13:34 2024 +0000
-
- upstream: whitespace
-
- OpenBSD-Commit-ID: b24680bc755b621ea801ff8edf6f0f02b68edae1
-
-commit efde85dda2130272af24cc346f6c3cd326182ff1
-Author: Darren Tucker <dtucker@dtucker.net>
-Date: Mon Feb 19 17:29:31 2024 +1100
-
- Improve error message for OpenSSL header check.
-
- bz#3668, ok djm@
-
-commit cbbdf868bce431a59e2fa36ca244d5739429408d
-Author: Darren Tucker <dtucker@dtucker.net>
-Date: Wed Feb 7 13:45:02 2024 +1100
-
- Interop test against PuTTY snapshot and releases.
-
-commit 91898bf786b0f149f962c4c96c08a46f29888c10
-Author: Darren Tucker <dtucker@dtucker.net>
-Date: Tue Feb 6 16:21:05 2024 +1100
-
- Put privsep dir on OS X on /usr/local.
-
- On some runners we can't create /var/empty, so put it some place we can
- write. Should fix test breakage on Max OS X 11.
-
-commit be5ed8ebed8388c5056bfde4688308cc873c18b9
-Author: Darren Tucker <dtucker@dtucker.net>
-Date: Tue Feb 6 11:19:42 2024 +1100
-
- Add --disable-fd-passing option.
-
- .. and enable for the minix3 test VM. This will cause it to more reliably
- skip tests that need FD passing and should fix the current test breakage.
-
-commit 0f6a8a0d0a518fd78c4cbebfdac990a57a1c4e41
-Author: Darren Tucker <dtucker@dtucker.net>
-Date: Tue Feb 6 11:18:44 2024 +1100
-
- Use "skip" function instead doing it ourselves.
-
-commit 3ad669f81aabbd2ba9fbd472903f680f598e1e99
-Author: Damien Miller <djm@mindrot.org>
-Date: Thu Feb 1 14:01:18 2024 +1100
-
- ignore some vim droppings
-
-commit c283f29d23611a06bbee06bcf458f2fffad721d9
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Thu Feb 1 02:37:33 2024 +0000
-
- upstream: whitespace
-
- OpenBSD-Commit-ID: bf9e4a1049562ee4322684fbdce07142f04fdbb7
-
-commit 0d96b1506b2f4757fefa5d1f884d49e96a6fd4c3
-Author: Damien Miller <djm@mindrot.org>
-Date: Tue Jan 16 14:40:18 2024 +1100
-
- skip tests that use multiplexing on Windows
-
- Some tests here use multiplexing, skip these if DISABLE_FD_PASSING
- is set. Should unbreak tests on Windows.
-
-commit 50080fa42f5f744b798ee29400c0710f1b59f50e
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Thu Jan 11 04:50:28 2024 +0000
-
- upstream: don't disable RSA test when DSA is disabled; bug introduced
-
- in last commit
-
- OpenBSD-Regress-ID: 8780a7250bf742b33010e9336359a1c516f2d7b5
-
-commit 415c94ce17288e0cdcb9e58cc91fba78d33c8457
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Thu Jan 11 01:45:58 2024 +0000
-
- upstream: make DSA testing optional, defaulting to on
-
- ok markus
-
- OpenBSD-Regress-ID: dfc27b5574e3f19dc4043395594cea5f90b8572a
-
-commit f9311e8921d92c5efca767227a497ab63280ac39
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Thu Jan 11 01:51:16 2024 +0000
-
- upstream: ensure key_fd is filled when DSA is disabled; spotted by
-
- tb@
-
- OpenBSD-Commit-ID: 9dd417b6eec3cf67e870f147464a8d93f076dce7
-
-commit 4e838120a759d187b036036610402cbda33f3203
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Thu Jan 11 01:45:36 2024 +0000
-
- upstream: make DSA key support compile-time optional, defaulting to
-
- on
-
- ok markus@
-
- OpenBSD-Commit-ID: 4f8e98fc1fd6de399d0921d5b31b3127a03f581d
-
-commit afcc9028bfc411bc26d20bba803b83f90cb84e26
-Author: jmc@openbsd.org <jmc@openbsd.org>
-Date: Wed Jan 10 06:33:13 2024 +0000
-
- upstream: fix incorrect capitalisation;
-
- OpenBSD-Commit-ID: cb07eb06e15fa2334660ac73e98f29b6a1931984
-
-commit 9707c8170c0c1baeb1e06e5a53f604498193885f
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Tue Jan 9 22:19:36 2024 +0000
-
- upstream: extend ChannelTimeout regression test to exercise multiplexed
-
- connections and the new "global" timeout type. ok dtucker@
-
- OpenBSD-Regress-ID: f10d19f697024e9941acad7c2057f73d6eacb8a2
-
-commit b31b12d28de96e1d43581d32f34da8db27e11c03
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Tue Jan 9 22:19:00 2024 +0000
-
- upstream: add a "global" ChannelTimeout type to ssh(1) and sshd(8)
-
- that watches all open channels and will close all open channels if there is
- no traffic on any of them for the specified interval. This is in addition to
- the existing per-channel timeouts added a few releases ago.
-
- This supports use-cases like having a session + x11 forwarding channel
- open where one may be idle for an extended period but the other is
- actively used. The global timeout would allow closing both channels when
- both have been idle for too long.
-
- ok dtucker@
-
- OpenBSD-Commit-ID: 0054157d24d2eaa5dc1a9a9859afefc13d1d7eb3
-
-commit 602f4beeeda5bb0eca181f8753d923a2997d0a51
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Tue Jan 9 21:39:14 2024 +0000
-
- upstream: adapt ssh_api.c code for kex-strict
-
- from markus@ ok me
-
- OpenBSD-Commit-ID: 4d9f256852af2a5b882b12cae9447f8f00f933ac
-
-commit 42ba34aba8708cf96583ff52975d95a8b47d990d
-Author: Damien Miller <djm@mindrot.org>
-Date: Mon Jan 8 16:26:37 2024 +1100
-
- nite that recent OSX tun/tap is unsupported
-
-commit 690bc125f9a3b20e47745fa8f5b5e1fd5820247f
-Author: Sevan Janiyan <venture37@geeklan.co.uk>
-Date: Wed Dec 27 04:57:49 2023 +0000
-
- README.platform: update tuntap url
-
-commit 6b8be2ccd7dd091808f86af52066b0c2ec30483a
-Author: Rose <83477269+AtariDreams@users.noreply.github.com>
-Date: Tue Dec 19 11:48:20 2023 -0500
-
- Fix compilation error in ssh-pcks11-client.c
-
- Compilation fails becaus of an undefined reference to helper_by_ec,
- because we forgot the preprocessor conditional that excludes that function
- from being called in unsupported configurations.
-
-commit 219c8134157744886ee6ac5b8c1650abcd981f4c
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Mon Jan 8 05:11:18 2024 +0000
-
- upstream: Remove outdated note from PROTOCOL.mux
-
- Port forward close by control master is already implemented
- by `mux_master_process_close_fwd` in `mux.c`
-
- GHPR442 from bigb4ng
-
- OpenBSD-Commit-ID: ad0734fe5916d2dc7dd02b588906cea4df0482fb
-
-commit 4c3cf362631ccc4ffd422e572f075d5d594feace
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Mon Jan 8 05:05:15 2024 +0000
-
- upstream: fix missing field in users-groups-by-id@openssh.com reply
-
- documentation
-
- GHPR441 from TJ Saunders
-
- OpenBSD-Commit-ID: ff5733ff6ef4cd24e0758ebeed557aa91184c674
-
-commit f64cede2a3c298b50a2659a8b53eb3ab2c0b8d23
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Mon Jan 8 04:10:03 2024 +0000
-
- upstream: make kex-strict section more explicit about its intent:
-
- banning all messages not strictly required in KEX
-
- OpenBSD-Commit-ID: fc33a2d7f3b7013a7fb7500bdbaa8254ebc88116
-
-commit 698fe6fd61cbcb8e3e0e874a561d4335a49fbde5
-Author: Damien Miller <djm@mindrot.org>
-Date: Mon Jan 8 14:46:19 2024 +1100
-
- update fuzzer example makefile to clang16
-
-commit fc332cb2d602c60983a8ec9f89412754ace06425
-Author: Damien Miller <djm@mindrot.org>
-Date: Mon Jan 8 14:45:49 2024 +1100
-
- unbreak fuzzers - missing pkcs11_make_cert()
-
- provide stub for use in fuzzer harness
-
-commit 9ea0a4524ae3276546248a926b6641b2fbc8421b
-Author: Damien Miller <djm@mindrot.org>
-Date: Mon Jan 8 14:45:14 2024 +1100
-
- unbreak fuzzers for clang16
-
- getopt() needs a throw() attribute to compile, so supply one when compiling
- things with C++
-
-commit a72833d00788ef91100c643536ac08ada46440e1
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Mon Jan 8 00:34:33 2024 +0000
-
- upstream: remove ext-info-* in the kex.c code, not in callers;
-
- with/ok markus@
-
- OpenBSD-Commit-ID: c06fe2d3a0605c517ff7d65e38ec7b2d1b0b2799
-
-commit 86f9e96d9bcfd1f5cd4bf8fb57a9b4c242df67df
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Mon Jan 8 00:30:39 2024 +0000
-
- upstream: fix typo; spotted by Albert Chin
-
- OpenBSD-Commit-ID: 77140b520a43375b886e535eb8bd842a268f9368
-
-commit f0cbd26ec91bd49719fb3eea7ca44d2380318b9a
-Author: dtucker@openbsd.org <dtucker@openbsd.org>
-Date: Thu Jan 4 09:51:49 2024 +0000
-
- upstream: Import regenerated moduli.
-
- OpenBSD-Commit-ID: 5a636f6ca7f25bfe775df4952f7aac90a7fcbbee
-
-commit 64ddf776531ca4933832beecc8b7ebe1b937e081
-Author: jsg@openbsd.org <jsg@openbsd.org>
-Date: Wed Dec 20 00:06:25 2023 +0000
-
- upstream: spelling; ok markus@
-
- OpenBSD-Commit-ID: 9d01f2e9d59a999d5d42fc3b3efcf8dfb892e31b
-
-commit 503fbe9ea238a4637e8778208bde8c09bcf78475
-Author: jmc@openbsd.org <jmc@openbsd.org>
-Date: Tue Dec 19 06:57:34 2023 +0000
-
- upstream: sort -C, and add to usage(); ok djm
-
- OpenBSD-Commit-ID: 80141b2a5d60c8593e3c65ca3c53c431262c812f
-
-commit 5413b1c7ff5a19c6a7d44bd98c5a83eb47819ba6
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Tue Dec 19 06:41:14 2023 +0000
-
- upstream: correct section numbers; from Ed Maste
-
- OpenBSD-Commit-ID: e289576ee5651528404cb2fb68945556052cf83f
-
-commit 430ef864645cff83a4022f5b050174c840e275da
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Mon Dec 18 15:58:56 2023 +0000
-
- upstream: match flag type (s/int/u_int)
-
- OpenBSD-Commit-ID: 9422289747c35ccb7b31d0e1888ccd5e74ad566a
-
-commit 1036d77b34a5fa15e56f516b81b9928006848cbd
-Author: Damien Miller <djm@mindrot.org>
-Date: Fri Dec 22 17:56:26 2023 +1100
-
- better detection of broken -fzero-call-used-regs
-
- gcc 13.2.0 on ppc64le refuses to compile some function, including
- cipher.c:compression_alg_list() with an error:
-
- > sorry, unimplemented: argument ‘used’ is not supportedcw
- > for ‘-fzero-call-used-regs’ on this target
-
- This extends the autoconf will-it-work test with a similarly-
- structured function that seems to catch this.
-
- Spotted/tested by Colin Watson; bz3645
-
-commit 8241b9c0529228b4b86d88b1a6076fb9f97e4a99
-Author: Damien Miller <djm@mindrot.org>
-Date: Tue Dec 19 01:59:50 2023 +1100
-
- crank versions
-
-commit 2f2c65cb5f1518a9c556d3e8efa27ea0ca305c6b
-Author: Damien Miller <djm@mindrot.org>
-Date: Tue Dec 19 01:59:06 2023 +1100
-
- depend
-
-commit e48cdee8e19059203b1aeeabec2350b8375fa61f
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Mon Dec 18 14:50:08 2023 +0000
-
- upstream: regress test for agent PKCS#11-backed certificates
-
- OpenBSD-Regress-ID: 38f681777cb944a8cc3bf9d0ad62959a16764df9
-
-commit 2f512f862df1d5f456f82a0334c9e8cc7208a2a1
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Mon Dec 18 14:49:39 2023 +0000
-
- upstream: regress test for constrained PKCS#11 keys
-
- OpenBSD-Regress-ID: b2f26ae95d609d12257b43aef7cd7714c82618ff
-
-commit cdddd66412ca5920ed4d3ebbfa6ace12dbd9b82f
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Mon Dec 18 14:48:44 2023 +0000
-
- upstream: openssh-9.6
-
- OpenBSD-Commit-ID: 21759837cf0e0092d9a2079f8fb562071c11016b
-
-commit 6d51feab157cedf1e7ef5b3f8781ca8ff9c4ab1b
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Mon Dec 18 14:48:08 2023 +0000
-
- upstream: ssh-agent: record failed session-bind attempts
-
- Record failed attempts to session-bind a connection and refuse signing
- operations on that connection henceforth.
-
- Prevents a future situation where we add a new hostkey type that is not
- recognised by an older ssh-agent, that consequently causes session-bind
- to fail (this situation is only likely to arise when people mix ssh(1)
- and ssh-agent(1) of different versions on the same host). Previously,
- after such a failure the agent socket would be considered unbound and
- not subject to restriction.
-
- Spotted by Jann Horn
-
- OpenBSD-Commit-ID: b0fdd023e920aa4831413f640de4c5307b53552e
-
-commit 7ef3787c84b6b524501211b11a26c742f829af1a
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Mon Dec 18 14:47:44 2023 +0000
-
- upstream: ban user/hostnames with most shell metacharacters
-
- This makes ssh(1) refuse user or host names provided on the
- commandline that contain most shell metacharacters.
-
- Some programs that invoke ssh(1) using untrusted data do not filter
- metacharacters in arguments they supply. This could create
- interactions with user-specified ProxyCommand and other directives
- that allow shell injection attacks to occur.
-
- It's a mistake to invoke ssh(1) with arbitrary untrusted arguments,
- but getting this stuff right can be tricky, so this should prevent
- most obvious ways of creating risky situations. It however is not
- and cannot be perfect: ssh(1) has no practical way of interpreting
- what shell quoting rules are in use and how they interact with the
- user's specified ProxyCommand.
-
- To allow configurations that use strange user or hostnames to
- continue to work, this strictness is applied only to names coming
- from the commandline. Names specified using User or Hostname
- directives in ssh_config(5) are not affected.
-
- feedback/ok millert@ markus@ dtucker@ deraadt@
-
- OpenBSD-Commit-ID: 3b487348b5964f3e77b6b4d3da4c3b439e94b2d9
-
-commit 0cb50eefdd29f0fec31d0e71cc4b004a5f704e67
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Mon Dec 18 14:47:20 2023 +0000
-
- upstream: stricter handling of channel window limits
-
- This makes ssh/sshd more strict in handling non-compliant peers that
- send more data than the advertised channel window allows. Previously
- the additional data would be silently discarded. This change will
- cause ssh/sshd to terminate the connection if the channel window is
- exceeded by more than a small grace allowance.
-
- ok markus@
-
- OpenBSD-Commit-ID: 811e21b41831eba3dd7f67b3d409a438f20d3037
-
-commit 4448a2938abc76e6bd33ba09b2ec17a216dfb491
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Mon Dec 18 14:46:56 2023 +0000
-
- upstream: Make it possible to load certs from PKCS#11 tokens
-
- Adds a protocol extension to allow grafting certificates supplied by
- ssh-add to keys loaded from PKCS#11 tokens in the agent.
-
- feedback/ok markus@
-
- OpenBSD-Commit-ID: bb5433cd28ede2bc910996eb3c0b53e20f86037f
-
-commit 881d9c6af9da4257c69c327c4e2f1508b2fa754b
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Mon Dec 18 14:46:12 2023 +0000
-
- upstream: apply destination constraints to all p11 keys
-
- Previously applied only to the first key returned from each token.
-
- ok markus@
-
- OpenBSD-Commit-ID: 36df3afb8eb94eec6b2541f063d0d164ef8b488d
-
-commit a7ed931caeb68947d30af8a795f4108b6efad761
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Mon Dec 18 14:45:49 2023 +0000
-
- upstream: add "ext-info-in-auth@openssh.com" extension
-
- This adds another transport protocol extension to allow a sshd to send
- SSH2_MSG_EXT_INFO during user authentication, after the server has
- learned the username that is being logged in to.
-
- This lets sshd to update the acceptable signature algoritms for public
- key authentication, and allows these to be varied via sshd_config(5)
- "Match" directives, which are evaluated after the server learns the
- username being authenticated.
-
- Full details in the PROTOCOL file
-
- OpenBSD-Commit-ID: 1de7da7f2b6c32a46043d75fcd49b0cbb7db7779
-
-commit 1edb00c58f8a6875fad6a497aa2bacf37f9e6cd5
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Mon Dec 18 14:45:17 2023 +0000
-
- upstream: implement "strict key exchange" in ssh and sshd
-
- This adds a protocol extension to improve the integrity of the SSH
- transport protocol, particular in and around the initial key exchange
- (KEX) phase.
-
- Full details of the extension are in the PROTOCOL file.
-
- with markus@
-
- OpenBSD-Commit-ID: 2a66ac962f0a630d7945fee54004ed9e9c439f14
-
-commit 59d691b886c79e70b1d1c4ab744e81fd176222fd
-Author: Damien Miller <djm@mindrot.org>
-Date: Mon Dec 18 14:49:11 2023 +1100
-
- better detection of broken -fzero-call-used-regs
-
- Use OSSH_CHECK_CFLAG_LINK() for detection of these flags and extend
- test program to exercise varargs, which seems to catch more stuff.
-
- ok dtucker@
-
-commit aa7b21708511a6d4aed3839fc9f6e82e849dd4a1
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Wed Dec 13 03:28:19 2023 +0000
-
- upstream: when invoking KnownHostsCommand to determine the order of
-
- host key algorithms to request, ensure that the hostname passed to the
- command is decorated with the port number for ports other than 22.
-
- This matches the behaviour of KnownHostsCommand when invoked to look
- up the actual host key.
-
- bz3643, ok dtucker@
-
- OpenBSD-Commit-ID: 5cfabc0b7c6c7ab473666df314f377b1f15420b1
-
-commit 4086bd6652c0badccc020218a62190a7798fb72c
-Author: markus@openbsd.org <markus@openbsd.org>
-Date: Fri Dec 8 09:18:39 2023 +0000
-
- upstream: prevent leak in sshsig_match_principals; ok djm@
-
- OpenBSD-Commit-ID: 594f61ad4819ff5c72dfe99ba666a17f0e1030ae
-
-commit 19d3ee2f3adf7d9a606ff015c1e153744702c4c9
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Wed Dec 6 21:06:48 2023 +0000
-
- upstream: short circuit debug log processing early if we're not going
-
- to log anything. From Kobe Housen
-
- OpenBSD-Commit-ID: 2bcddd695872a1bef137cfff7823044dcded90ea
-
-commit 947affad4831df015c498c00c6351ea6f13895d5
-Author: Darren Tucker <dtucker@dtucker.net>
-Date: Mon Nov 27 09:37:28 2023 +1100
-
- Add tests for OpenSSL 3.2.0 and 3.2 stable branch.
-
-commit 747dce36206675ca6b885010a835733df469351b
-Author: Darren Tucker <dtucker@dtucker.net>
-Date: Sat Nov 25 09:03:38 2023 +1100
-
- Use non-zero arg in compiler test program.
-
- Now that we're running the test program, passing zero to the test function
- can cause divide-by-zero exceptions which might show up in logs.
-
-commit 3d44a5c56585d1c351dbc006240a591b6da502b1
-Author: dtucker@openbsd.org <dtucker@openbsd.org>
-Date: Fri Nov 24 00:31:30 2023 +0000
-
- upstream: Plug mem leak of msg when processing a quit message.
-
- Coverity CID#427852, ok djm@
-
- OpenBSD-Commit-ID: bf85362addbe2134c3d8c4b80f16601fbff823b7
-
-commit 1d7f9b6e297877bd00973e6dc5c0642dbefc3b5f
-Author: dtucker@openbsd.org <dtucker@openbsd.org>
-Date: Thu Nov 23 03:37:05 2023 +0000
-
- upstream: Include existing mux path in debug message.
-
- OpenBSD-Commit-ID: 1c3641be10c2f4fbad2a1b088a441d072e18bf16
-
-commit f29934066bd0e561a2e516b7e584fb92d2eedee0
-Author: Darren Tucker <dtucker@dtucker.net>
-Date: Thu Nov 23 19:41:27 2023 +1100
-
- Add an Ubuntu 22.04 test VM.
-
- This is the same version as Github's runners so most of the testing on
- it is over there, but having a local VM makes debugging much easier.
-
-commit a93284a780cd3972afe5f89086b75d564ba157f3
-Author: Darren Tucker <dtucker@dtucker.net>
-Date: Thu Nov 23 19:36:22 2023 +1100
-
- Add gcc-12 -Werror test on Ubuntu 22.04.
-
- Explictly specify gcc-11 on Ubuntu 22.04 (it's the system compiler).
-
-commit 670f5a647e98b6fd95ad64f789f87ee3274b481b
-Author: Darren Tucker <dtucker@dtucker.net>
-Date: Thu Nov 23 19:34:57 2023 +1100
-
- Check return value from write to prevent warning.
-
- ... and since we're testing for flags with -Werror, this caused
- configure to mis-detect compiler flags.
-
-commit cea007d691cfedfa07a5b8599f97ce0511f53fc9
-Author: Darren Tucker <dtucker@dtucker.net>
-Date: Wed Nov 22 21:18:55 2023 +1100
-
- Run compiler test program when compiling natively.
-
- ok djm@
-
-commit ee0d305828f13536c0a416bbf9c3e81039d9ea55
-Author: Darren Tucker <dtucker@dtucker.net>
-Date: Wed Nov 22 21:18:07 2023 +1100
-
- Factor out compiler test program into a macro.
-
- ok djm@
-
-commit de304c76316b029df460673725a9104224b9959b
-Author: Darren Tucker <dtucker@dtucker.net>
-Date: Wed Nov 22 08:55:36 2023 +1100
-
- Add fbsd14 VM to test pool.
-
-commit 99a2df5e1994cdcb44ba2187b5f34d0e9190be91
-Author: Darren Tucker <dtucker@dtucker.net>
-Date: Tue Nov 21 16:19:29 2023 +1100
-
- Expand -fzero-call-used-regs test to cover gcc 11.
-
- It turns out that gcc also has some problems with -fzero-call-used-regs,
- at least v11 on mips. Previously the test in OSSH_CHECK_CFLAG_COMPILE
- was sufficient to catch it with "=all", but not sufficient for "=used".
- Expand the testcase and include it in the other tests for good measure.
- See bz#3629. ok djm@.
-
-commit ff220d4010717f7bfbbc02a2400666fb9d24f250
-Author: Darren Tucker <dtucker@dtucker.net>
-Date: Tue Nov 21 14:04:34 2023 +1100
-
- Stop using -fzero-call-used-regs=all
-
- ... since it seems to be problematic with several different versions of
- clang. Only use -fzero-call-used-regs=used which is less
- problematic, except with Apple's clang where we don't use it at all.
- bz#3629, ok djm@
-
-commit 2a19e02f36b16f0f6cc915f7d1e60ead5e36303b
-Author: Darren Tucker <dtucker@dtucker.net>
-Date: Tue Nov 21 14:02:18 2023 +1100
-
- Allow for vendor prefix on clang version numbers.
-
- Correctly detects the version of OpenBSD's native clang, as well as
- Apple's. Spotted tb@, ok djm@.
-
-commit c52db0114826d73eff6cdbf205e9c1fa4f7ca6c6
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Mon Nov 20 02:50:00 2023 +0000
-
- upstream: set errno=EAFNOSUPPORT when filtering addresses that don't
-
- match AddressFamily; yields slightly better error message if no address
- matches. bz#3526
-
- OpenBSD-Commit-ID: 29cea900ddd8b04a4d1968da5c4a893be2ebd9e6
-
-commit 26f3f3bbc69196d908cad6558c8c7dc5beb8d74a
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Wed Nov 15 23:03:38 2023 +0000
-
- upstream: when connecting via socket (the default case), filter
-
- addresses by AddressFamily if one was specified. Fixes the case where, if
- CanonicalizeHostname is enabled, ssh may ignore AddressFamily. bz5326; ok
- dtucker
-
- OpenBSD-Commit-ID: 6c7d7751f6cd055126b2b268a7b64dcafa447439
-
-commit 050c335c8da43741ed0df2570ebfbd5d1dfd0a31
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Wed Nov 15 22:51:49 2023 +0000
-
- upstream: when deciding whether to enable keystroke timing
-
- obfuscation, only consider enabling it when a channel with a tty is open.
-
- Avoids turning on the obfucation when X11 forwarding only is in use,
- which slows it right down. Reported by Roger Marsh
-
- OpenBSD-Commit-ID: c292f738db410f729190f92de100c39ec931a4f1
-
-commit 676377ce67807a24e08a54cd60ec832946cc6cae
-Author: tobhe@openbsd.org <tobhe@openbsd.org>
-Date: Mon Nov 13 09:18:19 2023 +0000
-
- upstream: Make sure sftp_get_limits() only returns 0 if 'limits'
-
- was initialized. This fixes a potential uninitialized use of 'limits' in
- sftp_init() if sftp_get_limits() returned early because of an unexpected
- message type.
-
- ok djm@
-
- OpenBSD-Commit-ID: 1c177d7c3becc1d71bc8763eecf61873a1d3884c
-
-commit 64e0600f23c6dec36c3875392ac95b8a9100c2d6
-Author: Darren Tucker <dtucker@dtucker.net>
-Date: Mon Nov 13 20:03:31 2023 +1100
-
- Test current releases of LibreSSL and OpenSSL.
-
- Retire some of the older releases.
-
-commit c8ed7cc545879ac15f6ce428be4b29c35598bb2a
-Author: dtucker@openbsd.org <dtucker@openbsd.org>
-Date: Wed Nov 1 02:08:38 2023 +0000
-
- upstream: Specify ssh binary to use
-
- ... instead of relying on installed one. Fixes test failures in -portable
- when running tests prior to installation.
-
- OpenBSD-Regress-ID: b6d6ba71c23209c616efc805a60d9a445d53a685
-
-commit e9fc2c48121cada1b4dcc5dadea5d447fe0093c3
-Author: Darren Tucker <dtucker@dtucker.net>
-Date: Wed Nov 1 13:11:31 2023 +1100
-
- Put long-running test targets on hipri runners.
-
- Some of the selfhosted test targets take a long time to run for various
- reasons, so label them for "libvirt-hipri" runners so that they can
- start immediately. This should reduce the time to complete all tests.
-
-commit 7ddf27668f0e21233f08c0ab2fe9ee3fdd6ab1e2
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Wed Nov 1 00:29:46 2023 +0000
-
- upstream: add some tests of forced commands overriding Subsystem
-
- directives
-
- OpenBSD-Regress-ID: eb48610282f6371672bdf2a8b5d2aa33cfbd322b
-
-commit fb06f9b5a065dfbbef5916fc4accc03c0bf026dd
-Author: dtucker@openbsd.org <dtucker@openbsd.org>
-Date: Tue Oct 31 04:15:40 2023 +0000
-
- upstream: Don't try to use sudo inside sshd log wrapper.
-
- We still need to check if we're using sudo since we don't want to chown
- unecessarily, as on some platforms this causes an error which pollutes
- stderr. We also don't want to unnecessarily invoke sudo, since it's
- running in the context of the proxycommand, on *other* platforms it
- may not be able to authenticate, and if we're using SUDO then it should
- already be privileged.
-
- OpenBSD-Regress-ID: 70d58df7503db699de579a9479300e5f3735f4ee
-
-commit fc3cc33e88c242c704781c6c48087838f1dcfa2a
-Author: dtucker@openbsd.org <dtucker@openbsd.org>
-Date: Tue Oct 31 02:58:45 2023 +0000
-
- upstream: Only try to chmod logfile if we have sudo. If we don't have
-
- sudo then we won't need to chmod.
-
- OpenBSD-Regress-ID: dbad2f5ece839658ef8af3376cb1fb1cabe2e324
-
-commit 3a506598fddd3f18f9095af3fe917f24cbdd32e0
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Mon Oct 30 23:00:25 2023 +0000
-
- upstream: move PKCS#11 setup code to test-exec.sh so it can be reused
-
- elsewhere
-
- OpenBSD-Regress-ID: 1d29e6be40f994419795d9e660a8d07f538f0acb
-
-commit f82fa227a52661c37404a6d33bbabf14fed05db0
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Mon Oct 30 17:32:00 2023 +0000
-
- upstream: tidy and refactor PKCS#11 setup code
-
- Replace the use of a perl script to delete the controlling TTY with a
- SSH_ASKPASS script to directly load the PIN.
-
- Move PKCS#11 setup code to functions in anticipation of it being used
- elsewhere in additional tests.
-
- Reduce stdout spam
-
- OpenBSD-Regress-ID: 07705c31de30bab9601a95daf1ee6bef821dd262
-
-commit 3cf698c6d4ffa9be1da55672a3519e2135a6366a
-Author: Darren Tucker <dtucker@dtucker.net>
-Date: Mon Oct 30 21:35:03 2023 +1100
-
- Add obsd74 test VM and retire obsd69 and obsd70.
-
-commit 3e21d58a09894acb38dc69ed615d101131f473d0
-Author: Darren Tucker <dtucker@dtucker.net>
-Date: Mon Oct 30 18:34:12 2023 +1100
-
- Add OpenSSL 3.3.0 as a known dev version.
-
-commit 917ba181c2cbdb250a443589ec732aa36fd51ffa
-Author: Darren Tucker <dtucker@dtucker.net>
-Date: Mon Oct 30 13:32:03 2023 +1100
-
- Restore nopasswd sudo rule on Mac OS X.
-
- This seems to be missing from some (but not all) github runners, so
- restore it if it seems to be missing.
-
-commit c5698abad6d4ec98ca20bcaaabaeacd5e1ec3f4f
-Author: Darren Tucker <dtucker@dtucker.net>
-Date: Mon Oct 30 13:26:52 2023 +1100
-
- Don't exit early when setting up on Mac OS X.
-
- We probably need some of the other bits in there (specifically, setting
- the perms on the home directory) so make it less of a special snowflake.
-
-commit 1d6a878ceba60b9dc14037dddc8f036070c0065f
-Author: dtucker@openbsd.org <dtucker@openbsd.org>
-Date: Sun Oct 29 06:22:07 2023 +0000
-
- upstream: Only try to chown logfiles that exist to prevent spurious
-
- errors.
-
- OpenBSD-Regress-ID: f1b20a476734e885078c481f1324c9ea03af991e
-
-commit e612376427a66f835e284f6b426d16d7c85301bc
-Author: anton@openbsd.org <anton@openbsd.org>
-Date: Thu Oct 26 18:52:45 2023 +0000
-
- upstream: make use of bsd.regress.mk in extra and interop targets; ok
-
- dtucker@
-
- OpenBSD-Regress-ID: 7ea21b5f6fc4506165093b2123d88d20ff13a4f0
-
-commit ea0039173957d0edcd6469b9614dcedb44dcb4f9
-Author: dtucker@openbsd.org <dtucker@openbsd.org>
-Date: Thu Oct 26 12:44:07 2023 +0000
-
- upstream: Skip conch interop tests when not enabled instead of fatal.
-
- OpenBSD-Regress-ID: b0abf81c24ac6c21f367233663228ba16fa96a46
-
-commit d220b9ed5494252b26b95f05be118472bc3ab5c0
-Author: dtucker@openbsd.org <dtucker@openbsd.org>
-Date: Wed Oct 25 05:38:08 2023 +0000
-
- upstream: Import regenerated moduli.
-
- OpenBSD-Commit-ID: 95f5dd6107e8902b87dc5b005ef2b53f1ff378b8
-
-commit a611e4db4009447a0151f31a44e235ca32ed4429
-Author: anton@openbsd.org <anton@openbsd.org>
-Date: Wed Oct 25 08:01:59 2023 +0000
-
- upstream: ssh conch interop tests requires a controlling terminal;
-
- ok dtucker@
-
- OpenBSD-Regress-ID: cbf2701bc347c2f19d907f113779c666f1ecae4a
-
-commit da951b5e08c167acb5d6e2eec6f146502f5d6ed8
-Author: anton@openbsd.org <anton@openbsd.org>
-Date: Mon Oct 23 11:30:49 2023 +0000
-
- upstream: Use private key that is allowed by sshd defaults in conch
-
- interop tests.
-
- ok dtucker@
-
- OpenBSD-Regress-ID: 3b7f65c8f409c328bcd4b704f60cb3d31746f045
-
-commit 1ca166dbb3c0ce632b98869cd955f69320aa6fe8
-Author: Darren Tucker <dtucker@dtucker.net>
-Date: Fri Oct 20 20:43:00 2023 +1100
-
- Install Dropbear for interop testing.
-
-commit f993bb58351c5cb71e61aede63805a34a6d4daea
-Author: Darren Tucker <dtucker@dtucker.net>
-Date: Fri Oct 20 20:39:03 2023 +1100
-
- Resync PuTTY and Conch path handling with upstream.
-
- Now that configure finds these for us we can remove these -portable
- specific changes.
-
-commit ff85becd5f5f06a76efa45d30fb204a3c5e5215c
-Author: Darren Tucker <dtucker@dtucker.net>
-Date: Fri Oct 20 20:35:46 2023 +1100
-
- Have configure find PuTTY and Conch binaries.
-
- This will let us remove some -portable specific changes from
- test-exec.sh.
-
-commit c54a50359b9cecddbf3ffcdc26efcb3cd6071ec1
-Author: dtucker@openbsd.org <dtucker@openbsd.org>
-Date: Fri Oct 20 07:37:07 2023 +0000
-
- upstream: Allow overriding the locations of the Dropbear binaries
-
- similar to what we do for the PuTTY ones.
-
- OpenBSD-Regress-ID: 7de0e00518fb0c8fdc5f243b7f82f523c936049c
-
-commit fbaa707d455a61d0aef8ae65e02a25bac5351e5c
-Author: dtucker@openbsd.org <dtucker@openbsd.org>
-Date: Fri Oct 20 06:56:45 2023 +0000
-
- upstream: Add interop test with Dropbear.
-
- Right now this is only dbclient not the Dropbear server since it won't
- currently run as a ProxyCommand.
-
- OpenBSD-Regress-ID: 8cb898c414fcdb252ca6328896b0687acdaee496
-
-commit c2003d0dbdcdb61ca336c3f90c5c2b4a09c8e73f
-Author: Fabio Pedretti <pedretti.fabio@gmail.com>
-Date: Mon Oct 16 11:59:53 2023 +0200
-
- Update openssl-devel dependency in RPM spec.
-
- Since openssh 9.4p1, openssl >= 1.1.1 is required, so
- build with --without-openssl elsewhere.
- According to https://repology.org/project/openssl/versions
- openssl 1.1.1 is available on fedora >= 29 and rhel >= 8.
- Successfully build tested, installed and run on rhel 6
-
-commit 064e09cd632721c7e6889904e07767443ee23821
-Author: Fabio Pedretti <pedretti.fabio@gmail.com>
-Date: Mon Oct 16 10:13:06 2023 +0200
-
- Remove reference of dropped sshd.pam.old file
-
- The file was removed in openssh 8.8
-
-commit 62db354b696b378a164b6e478cb6b0171dcb0c3d
-Author: dtucker@openbsd.org <dtucker@openbsd.org>
-Date: Mon Oct 16 08:40:00 2023 +0000
-
- upstream: Move declaration of "len" into the block where it's used.
-
- This lets us compile Portable with -Werror with when OpenSSL doesn't have
- Ed25519 support.
-
- OpenBSD-Commit-ID: e02e4b4af351946562a7caee905da60eff16ba29
-
-commit 6eee8c972d5901d10e80634a006b4e346b2c8c19
-Author: Damien Miller <djm@mindrot.org>
-Date: Fri Oct 13 15:15:05 2023 +1100
-
- run t-extra regress tests
-
- This exposes the t-extra regress tests (including agent-pkcs11.sh) as
- a new extra-tests target in the top level Makefile and runs them by
- default. ok dtucker@
-
-commit 637624dbbac13f2bc3c8ec5b15c9d627d07f2935
-Author: Darren Tucker <dtucker@dtucker.net>
-Date: Thu Oct 12 22:01:23 2023 +1100
-
- Don't use make -j2.
-
- While we have 2 cores available on github runners, not using it means
- that the most recent log message is the actual failure, rather than
- having to search back through the log for it.
-
-commit 971e0cfcfd52ef1d73cf5244074c306a60006e89
-Author: Darren Tucker <dtucker@dtucker.net>
-Date: Thu Oct 12 16:23:05 2023 +1100
-
- Correct arg order for ED255519 AC_LINK_IFELSE test.
-
-commit c616e64688b2a0c1b4daad69b056099be998d121
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Thu Oct 12 03:51:08 2023 +0000
-
- upstream: typos and extra debug trace calls
-
- OpenBSD-Regress-ID: 98a2a6b9333743274359e3c0f0e65cf919a591d1
-
-commit c49a3fbf10162128c67c59562348de2041188974
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Thu Oct 12 03:48:53 2023 +0000
-
- upstream: ensure logs are owned by correct user; feedback/ok
-
- dtucker@
-
- OpenBSD-Regress-ID: c3297af8f07717f1d400a5d34529962f1a76b5a3
-
-commit 5ec0ed79ac074c3437b25f6cba8b8cf21c8d4587
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Thu Oct 12 03:36:32 2023 +0000
-
- upstream: 64 %-expansion keys ought to be enough for anybody; ok
-
- dtucker (we just hit the previous limit in some cases)
-
- OpenBSD-Commit-ID: 84070f8001ec22ff5d669f836b62f206e08c5787
-
-commit f59a94e22e46db2c23eddeb871aa9e8d93ab0016
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Thu Oct 12 02:48:43 2023 +0000
-
- upstream: don't dereference NULL pointer when hashing jumphost
-
- OpenBSD-Commit-ID: 251c0263e1759a921341c7efe7f1d4c73e1c70f4
-
-commit 281c79168edcc303abfd5bca983616eaa24c5f32
-Author: Damien Miller <djm@mindrot.org>
-Date: Thu Oct 12 13:20:01 2023 +1100
-
- Solaris: prefer PRIV_XPOLICY to PRIV_LIMIT
-
- If the system support PRIV_XPOLICY and one is set, then don't
- modify PRIV_LIMIT. bz2833, patch from Ron Jordan, ok dtucker@
-
-commit 98fc34df837f3a3b79d2a111b96fe8a39adcab55
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Thu Oct 12 02:18:18 2023 +0000
-
- upstream: add %j token that expands to the configured ProxyJump
-
- hostname (or the empty string if this option is not being used). bz3610, ok
- dtucker
-
- OpenBSD-Commit-ID: ce9983f7efe6a178db90dc5c1698df025df5e339
-
-commit 7f3180be8a85320b5d3221714b40c16e66881249
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Thu Oct 12 02:15:53 2023 +0000
-
- upstream: release GSS OIDs only at end of authentication; bz2982,
-
- ok dtucker@
-
- OpenBSD-Commit-ID: 0daa41e0525ae63cae4483519ecaa37ac485d94c
-
-commit a612b93de5d86e955bfb6e24278f621118eea500
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Thu Oct 12 02:12:53 2023 +0000
-
- upstream: mask SIGINT/TERM/QUIT/HUP before checking quit_pending
-
- and use ppoll() to unmask them in the mainloop. Avoids race condition between
- signaling ssh to exit and polling. bz3531; ok dtucker
-
- OpenBSD-Commit-ID: 5c14e1aabcddedb95cdf972283d9c0d5083229e7
-
-commit 531b27a006116fe7aff325510aaa576f24844452
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Wed Oct 11 23:23:58 2023 +0000
-
- upstream: sync usage() with ssh.1; spotted by kn@
-
- OpenBSD-Commit-ID: 191a85639477dcb5fa1616d270d93b7c8d5c1dfd
-
-commit 64f7ca881b19be754425dca60d1590d306c9d1d0
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Wed Oct 11 23:14:33 2023 +0000
-
- upstream: ssh -Q does not make sense with other command-line options,
-
- so give it its own line in the manpage
-
- OpenBSD-Commit-ID: 00a747f0655c12122bbb77c2796be0013c105361
-
-commit a752a6c0e1001f93696d7025f0c867f0376e2ecf
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Wed Oct 11 22:42:26 2023 +0000
-
- upstream: add ChannelTimeout support to the client, mirroring the
-
- same option in the server. ok markus@
-
- OpenBSD-Commit-ID: 55630b26f390ac063980cfe7ad8c54b03284ef02
-
-commit 76e91e7238cdc5662bc818e2a48d466283840d23
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Wed Oct 11 22:41:05 2023 +0000
-
- upstream: add support for reading ED25519 private keys in PEM PKCS8
-
- format; ok markus@ tb@
-
- OpenBSD-Commit-ID: 01b85c91757e6b057e9b23b8a23f96415c3c7174
-
-commit fc77c8e352c0f44125425c05265e3a00c183d78a
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Wed Oct 11 06:40:54 2023 +0000
-
- upstream: mention "none" is a valid argument to IdentityFile; bz3080
-
- OpenBSD-Commit-ID: 1b4fb590ef731099349a7d468b77f02b240ac926
-
-commit c97520d23d1fe53d30725a2af25d2dddd6f2faff
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Wed Oct 11 05:42:08 2023 +0000
-
- upstream: in olde rcp/scp protocol mode, when rejecting a path from the
-
- server as not matching the glob that the client sent, log (at debug level)
- the received pathname as well as the list of possible expected paths expanded
- from the glob. bz2966
-
- OpenBSD-Commit-ID: 0bd8db8a595334ca86bca8f36e23fc0395315765
-
-commit 208c2b719879805983398160791d6a1ef9c2c3fc
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Wed Oct 11 04:46:29 2023 +0000
-
- upstream: s/%.100s/%s/ in SSH- banner construction as there's no
-
- reason to limit its size: the version string bring included is a compile time
- constant going into an allocated banner string.
-
- OpenBSD-Commit-ID: 0ef73304b9bf3e534c60900cd84ab699f859ebcd
-
-commit 0354790826b97c41bbd171a965574e159b58d83e
-Author: tb@openbsd.org <tb@openbsd.org>
-Date: Tue Oct 10 06:49:54 2023 +0000
-
- upstream: Garbage collect cipher_get_keyiv_len()
-
- This is a compat20 leftover, unused since 2017.
-
- ok djm
-
- OpenBSD-Commit-ID: 91fa5497c9dc6883064624ac27813a567883fdce
-
-commit 8d29ee4115001a02641386ae394992c65ed279e0
-Author: djm@openbsd.org <djm@openbsd.org>
-Date: Tue Oct 10 03:57:45 2023 +0000
-
- upstream: Reserve a range of "local extension" message numbers that
-
- OpenSSH promises not to use (comment change only)
-
- OpenBSD-Commit-ID: e61795b453d4892d2c99ce1039112c4a00250e03
diff --git a/INSTALL b/INSTALL
index 56e351af60e1..96b299477a78 100644
--- a/INSTALL
+++ b/INSTALL
@@ -19,12 +19,15 @@ A working installation of zlib:
Zlib 1.1.4 or 1.2.1.2 or greater (earlier 1.2.x versions have problems):
https://zlib.net/
-libcrypto from either of LibreSSL or OpenSSL. Building without libcrypto
-is supported but severely restricts the available ciphers and algorithms.
+libcrypto from one of LibreSSL, OpenSSL, AWS-LC or BoringSSL. Building
+without libcrypto is supported but severely restricts the available
+ciphers and algorithms.
- LibreSSL (https://www.libressl.org/) 3.1.0 or greater
- OpenSSL (https://www.openssl.org) 1.1.1 or greater
+ - AWS-LC (https://github.com/aws/aws-lc)
+ - BoringSSL (https://github.com/google/boringssl)
-LibreSSL/OpenSSL should be compiled as a position-independent library
+libcrypto should be compiled as a position-independent library
(i.e. -fPIC, eg by configuring OpenSSL as "./config [options] -fPIC"
or LibreSSL as "CFLAGS=-fPIC ./configure") otherwise OpenSSH will not
be able to link with it. If you must use a non-position-independent
diff --git a/Makefile.in b/Makefile.in
index ba17a79f0d3d..2aac879c1eaf 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -102,19 +102,19 @@ LIBSSH_OBJS=${LIBOPENSSH_OBJS} \
smult_curve25519_ref.o \
poly1305.o chacha.o cipher-chachapoly.o cipher-chachapoly-libcrypto.o \
ssh-ed25519.o digest-openssl.o digest-libc.o \
- hmac.o ed25519.o hash.o \
+ hmac.o ed25519.o ed25519-openssl.o \
kex.o kex-names.o kexdh.o kexgex.o kexecdh.o kexc25519.o \
kexgexc.o kexgexs.o \
kexsntrup761x25519.o kexmlkem768x25519.o sntrup761.o kexgen.o \
sftp-realpath.o platform-pledge.o platform-tracing.o platform-misc.o \
- sshbuf-io.o misc-agent.o
+ sshbuf-io.o misc-agent.o ssherr-libcrypto.o
P11OBJS= ssh-pkcs11-client.o
SKOBJS= ssh-sk-client.o
SSHOBJS= ssh.o readconf.o clientloop.o sshtty.o \
- sshconnect.o sshconnect2.o mux.o $(P11OBJS) $(SKOBJS)
+ sshconnect.o sshconnect2.o mux.o ssh-pkcs11.o $(SKOBJS)
SSHDOBJS=sshd.o \
platform-listen.o \
@@ -150,7 +150,7 @@ SSHD_AUTH_OBJS=sshd-auth.o \
sftp-server.o sftp-common.o \
uidswap.o $(P11OBJS) $(SKOBJS)
-SFTP_CLIENT_OBJS=sftp-common.o sftp-client.o sftp-glob.o
+SFTP_CLIENT_OBJS=sftp-common.o sftp-client.o sftp-glob.o ssherr-nolibcrypto.o
SCP_OBJS= scp.o progressmeter.o $(SFTP_CLIENT_OBJS)
@@ -164,11 +164,11 @@ SSHKEYSIGN_OBJS=ssh-keysign.o readconf.o uidswap.o $(P11OBJS) $(SKOBJS)
P11HELPER_OBJS= ssh-pkcs11-helper.o ssh-pkcs11.o $(SKOBJS)
-SKHELPER_OBJS= ssh-sk-helper.o ssh-sk.o sk-usbhid.o
+SKHELPER_OBJS= ssh-sk-helper.o ssh-sk.o sk-usbhid.o ssherr-nolibcrypto.o
SSHKEYSCAN_OBJS=ssh-keyscan.o $(P11OBJS) $(SKOBJS)
-SFTPSERVER_OBJS=sftp-common.o sftp-server.o sftp-server-main.o
+SFTPSERVER_OBJS=sftp-common.o sftp-server.o sftp-server-main.o ssherr-nolibcrypto.o
SFTP_OBJS= sftp.o sftp-usergroup.o progressmeter.o $(SFTP_CLIENT_OBJS)
@@ -336,6 +336,7 @@ distclean: regressclean
rm -f *.out core opensshd.init openssh.xml
rm -f Makefile buildpkg.sh config.h config.status
rm -f survey.sh openbsd-compat/regress/Makefile *~
+ rm -rf openbsd-compat/include
rm -rf autom4te.cache
rm -f regress/check-perm
rm -f regress/mkdtemp
@@ -721,7 +722,7 @@ regress/unittests/utf8/test_utf8$(EXEEXT): \
SK_DUMMY_OBJS=\
regress/misc/sk-dummy/sk-dummy.lo \
regress/misc/sk-dummy/fatal.lo \
- ed25519.lo hash.lo
+ ed25519.lo ed25519-openssl.lo
SK_DUMMY_LIBRARY=@SK_DUMMY_LIBRARY@
@@ -818,6 +819,7 @@ interop-tests t-exec file-tests extra-tests: regress-prep regress-binaries $(TAR
TEST_SSH_DROPBEARKEY="@DROPBEARKEY@" \
TEST_SSH_DROPBEARCONVERT="@DROPBEARCONVERT@" \
TEST_SSH_DBCLIENT="@DBCLIENT@" \
+ TEST_SSH_TMUX="@TMUX@" \
TEST_SSH_IPV6="@TEST_SSH_IPV6@" \
TEST_SSH_UTF8="@TEST_SSH_UTF8@" \
TEST_SHELL="$(TEST_SHELL)" \
diff --git a/PROTOCOL b/PROTOCOL
index a94b36ba6c7e..06081f82a9c9 100644
--- a/PROTOCOL
+++ b/PROTOCOL
@@ -718,4 +718,4 @@ master instance and later clients.
OpenSSH extends the usual agent protocol. These changes are documented
in the PROTOCOL.agent file.
-$OpenBSD: PROTOCOL,v 1.59 2025/08/06 11:22:53 dtucker Exp $
+$OpenBSD: PROTOCOL,v 1.60 2026/02/09 22:09:48 dtucker Exp $
diff --git a/README b/README
index 41ecba193597..e15b3915f238 100644
--- a/README
+++ b/README
@@ -1,4 +1,4 @@
-See https://www.openssh.com/releasenotes.html#10.2p1 for the release
+See https://www.openssh.com/releasenotes.html#10.3p1 for the release
notes.
Please read https://www.openssh.com/report.html for bug reporting
diff --git a/README.md b/README.md
index 2ad6471386e2..1cfcd7bb9feb 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,10 @@
# Portable OpenSSH
-[![C/C++ CI](https://github.com/openssh/openssh-portable/actions/workflows/c-cpp.yml/badge.svg)](https://github.com/openssh/openssh-portable/actions/workflows/c-cpp.yml)
-[![Fuzzing Status](https://oss-fuzz-build-logs.storage.googleapis.com/badges/openssh.svg)](https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:openssh)
+[![C/C++ CI](../../actions/workflows/c-cpp.yml/badge.svg)](../../actions/workflows/c-cpp.yml)
+[![VM CI](../../actions/workflows/vm.yml/badge.svg)](../../actions/workflows/vm.yml)
+[![C/C++ CI self-hosted](https://github.com/openssh/openssh-portable-selfhosted/actions/workflows/selfhosted.yml/badge.svg)](https://github.com/openssh/openssh-portable-selfhosted/actions/workflows/selfhosted.yml)
+[![CIFuzz](../../actions/workflows/cifuzz.yml/badge.svg)](../../actions/workflows/cifuzz.yml)
+[![Fuzzing Status](https://oss-fuzz-build-logs.storage.googleapis.com/badges/openssh.svg)](https://issues.oss-fuzz.com/issues?q="Project:+openssh"+is:open)
[![Coverity Status](https://scan.coverity.com/projects/21341/badge.svg)](https://scan.coverity.com/projects/openssh-portable)
OpenSSH is a complete implementation of the SSH protocol (version 2) for secure remote login, command execution and file transfer. It includes a client ``ssh`` and server ``sshd``, file transfer utilities ``scp`` and ``sftp`` as well as tools for key generation (``ssh-keygen``), run-time key storage (``ssh-agent``) and a number of supporting programs.
@@ -31,7 +34,7 @@ Stable release tarballs are available from a number of [download mirrors](https:
Portable OpenSSH is built using autoconf and make. It requires a working C compiler, standard library and headers.
-``libcrypto`` from either [LibreSSL](https://www.libressl.org/) or [OpenSSL](https://www.openssl.org) may also be used. OpenSSH may be built without either of these, but the resulting binaries will have only a subset of the cryptographic algorithms normally available.
+``libcrypto`` from one of [LibreSSL](https://www.libressl.org/), [OpenSSL](https://www.openssl.org), [AWS-LC](https://github.com/aws/aws-lc) or [BoringSSL](https://github.com/google/boringssl) may also be used. OpenSSH may be built without either of these, but the resulting binaries will have only a subset of the cryptographic algorithms normally available.
[zlib](https://www.zlib.net/) is optional; without it transport compression is not supported.
diff --git a/addr.c b/addr.c
index e207287c1f5f..20762329caf1 100644
--- a/addr.c
+++ b/addr.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: addr.c,v 1.9 2024/10/18 04:30:09 djm Exp $ */
+/* $OpenBSD: addr.c,v 1.10 2026/03/03 09:57:25 dtucker Exp $ */
/*
* Copyright (c) 2004-2008 Damien Miller <djm@mindrot.org>
@@ -61,7 +61,7 @@ masklen_valid(int af, u_int masklen)
static int
addr_xaddr_to_sa(const struct xaddr *xa, struct sockaddr *sa, socklen_t *len,
- u_int16_t port)
+ uint16_t port)
{
struct sockaddr_in *in4 = (struct sockaddr_in *)sa;
struct sockaddr_in6 *in6 = (struct sockaddr_in6 *)sa;
diff --git a/addr.h b/addr.h
index 29438dfecf25..a90763727e17 100644
--- a/addr.h
+++ b/addr.h
@@ -27,11 +27,11 @@ struct xaddr {
union {
struct in_addr v4;
struct in6_addr v6;
- u_int8_t addr8[16];
- u_int16_t addr16[8];
- u_int32_t addr32[4];
+ uint8_t addr8[16];
+ uint16_t addr16[8];
+ uint32_t addr32[4];
} xa; /* 128-bit address */
- u_int32_t scope_id; /* iface scope id for v6 */
+ uint32_t scope_id; /* iface scope id for v6 */
#define v4 xa.v4
#define v6 xa.v6
#define addr8 xa.addr8
diff --git a/addrmatch.c b/addrmatch.c
index b0dc096804db..53a19f71beb5 100644
--- a/addrmatch.c
+++ b/addrmatch.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: addrmatch.c,v 1.17 2021/04/03 06:18:40 djm Exp $ */
+/* $OpenBSD: addrmatch.c,v 1.19 2026/02/14 00:18:34 jsg Exp $ */
/*
* Copyright (c) 2004-2008 Damien Miller <djm@mindrot.org>
@@ -19,11 +19,8 @@
#include "includes.h"
#include <sys/types.h>
-#include <sys/socket.h>
#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <netdb.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
@@ -128,7 +125,7 @@ addr_match_cidr_list(const char *addr, const char *_list)
/*
* NB. This function is called in pre-auth with untrusted data,
- * so be extra paranoid about junk reaching getaddrino (via
+ * so be extra paranoid about junk reaching getaddrinfo (via
* addr_pton_cidr).
*/
diff --git a/audit-bsm.c b/audit-bsm.c
index 4bce22c37ed5..b602913f4236 100644
--- a/audit-bsm.c
+++ b/audit-bsm.c
@@ -90,7 +90,7 @@ extern void aug_save_egid(gid_t);
extern void aug_save_pid(pid_t);
extern void aug_save_asid(au_asid_t);
extern void aug_save_tid(dev_t, unsigned int);
-extern void aug_save_tid_ex(dev_t, u_int32_t *, u_int32_t);
+extern void aug_save_tid_ex(dev_t, uint32_t *, uint32_t);
extern int aug_save_me(void);
extern int aug_save_namask(void);
extern void aug_save_event(au_event_t);
@@ -129,10 +129,10 @@ static AuditInfoTermID ssh_bsm_tid;
* getaudit_addr() is only present on IPv6 capable machines.
*/
#if defined(HAVE_AUG_GET_MACHINE) || !defined(HAVE_GETAUDIT_ADDR)
-extern int aug_get_machine(char *, u_int32_t *, u_int32_t *);
+extern int aug_get_machine(char *, uint32_t *, uint32_t *);
#else
static int
-aug_get_machine(char *host, u_int32_t *addr, u_int32_t *type)
+aug_get_machine(char *host, uint32_t *addr, uint32_t *type)
{
struct addrinfo *ai;
struct sockaddr_in *in4;
diff --git a/auth-bsdauth.c b/auth-bsdauth.c
index d124e994e776..d2fe51ae2c72 100644
--- a/auth-bsdauth.c
+++ b/auth-bsdauth.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: auth-bsdauth.c,v 1.15 2018/07/09 21:35:50 markus Exp $ */
+/* $OpenBSD: auth-bsdauth.c,v 1.16 2026/02/06 01:24:36 djm Exp $ */
/*
* Copyright (c) 2001 Markus Friedl. All rights reserved.
*
@@ -125,14 +125,6 @@ bsdauth_free_ctx(void *ctx)
}
}
-KbdintDevice bsdauth_device = {
- "bsdauth",
- bsdauth_init_ctx,
- bsdauth_query,
- bsdauth_respond,
- bsdauth_free_ctx
-};
-
KbdintDevice mm_bsdauth_device = {
"bsdauth",
bsdauth_init_ctx,
diff --git a/auth-krb5.c b/auth-krb5.c
index 9d2f1f0ea2a0..3c6dc0622826 100644
--- a/auth-krb5.c
+++ b/auth-krb5.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: auth-krb5.c,v 1.25 2025/09/29 21:29:22 dtucker Exp $ */
+/* $OpenBSD: auth-krb5.c,v 1.26 2026/02/08 19:54:31 dtucker Exp $ */
/*
* Kerberos v5 authentication and ticket-passing routines.
*
diff --git a/auth-options.c b/auth-options.c
index 90be7b02d49d..e15f600abbf6 100644
--- a/auth-options.c
+++ b/auth-options.c
@@ -18,6 +18,7 @@
#include "includes.h"
#include <sys/types.h>
+#include <sys/queue.h>
#include <stdlib.h>
#include <netdb.h>
@@ -29,8 +30,6 @@
#include <ctype.h>
#include <limits.h>
-#include "openbsd-compat/sys-queue.h"
-
#include "xmalloc.h"
#include "ssherr.h"
#include "log.h"
diff --git a/auth-pam.c b/auth-pam.c
index 1bb813277f63..29607e04134f 100644
--- a/auth-pam.c
+++ b/auth-pam.c
@@ -95,7 +95,6 @@
#include "servconf.h"
#include "ssh2.h"
#include "auth-options.h"
-#include "misc.h"
#ifdef GSSAPI
#include "ssh-gss.h"
#endif
@@ -132,11 +131,17 @@ typedef pid_t sp_pthread_t;
#define pthread_join fake_pthread_join
#endif
+typedef int SshPamDone;
+#define SshPamError -1
+#define SshPamNone 0
+#define SshPamAuthenticated 1
+#define SshPamAgain 2
+
struct pam_ctxt {
sp_pthread_t pam_thread;
int pam_psock;
int pam_csock;
- int pam_done;
+ SshPamDone pam_done;
};
static void sshpam_free_ctx(void *);
@@ -158,7 +163,7 @@ sshpam_sigchld_handler(int sig)
return; /* handler called after PAM cleanup, shouldn't happen */
if (waitpid(cleanup_ctxt->pam_thread, &sshpam_thread_status, WNOHANG)
<= 0) {
- /* PAM thread has not exitted, privsep slave must have */
+ /* PAM thread has not exited, privsep slave must have */
kill(cleanup_ctxt->pam_thread, SIGTERM);
while (waitpid(cleanup_ctxt->pam_thread,
&sshpam_thread_status, 0) == -1) {
@@ -272,31 +277,6 @@ pam_putenv(pam_handle_t *pamh, const char *name_value)
}
#endif /* HAVE_PAM_PUTENV */
-/*
- * Some platforms, notably Solaris, do not enforce password complexity
- * rules during pam_chauthtok() if the real uid of the calling process
- * is 0, on the assumption that it's being called by "passwd" run by root.
- * This wraps pam_chauthtok and sets/restore the real uid so PAM will do
- * the right thing.
- */
-#ifdef SSHPAM_CHAUTHTOK_NEEDS_RUID
-static int
-sshpam_chauthtok_ruid(pam_handle_t *pamh, int flags)
-{
- int result;
-
- if (sshpam_authctxt == NULL)
- fatal("PAM: sshpam_authctxt not initialized");
- if (setreuid(sshpam_authctxt->pw->pw_uid, -1) == -1)
- fatal_f("setreuid failed: %s", strerror(errno));
- result = pam_chauthtok(pamh, flags);
- if (setreuid(0, -1) == -1)
- fatal_f("setreuid failed: %s", strerror(errno));
- return result;
-}
-# define pam_chauthtok(a,b) (sshpam_chauthtok_ruid((a), (b)))
-#endif
-
static void
sshpam_password_change_required(int reqd)
{
@@ -442,6 +422,9 @@ sshpam_thread_conv(int n, sshpam_const struct pam_message **msg,
break;
case PAM_ERROR_MSG:
case PAM_TEXT_INFO:
+ debug3("PAM: Got message of type %d: %s",
+ PAM_MSG_MEMBER(msg, i, msg_style),
+ PAM_MSG_MEMBER(msg, i, msg));
if ((r = sshbuf_put_cstring(buffer,
PAM_MSG_MEMBER(msg, i, msg))) != 0)
fatal("%s: buffer error: %s",
@@ -491,6 +474,7 @@ check_pam_user(Authctxt *authctxt)
if (strcmp(sshpam_initial_user, pam_user) != 0) {
error_f("PAM user \"%s\" does not match previous \"%s\"",
pam_user, sshpam_initial_user);
+ return PAM_USER_UNKNOWN;
}
return PAM_SUCCESS;
}
@@ -735,6 +719,7 @@ sshpam_init(struct ssh *ssh, Authctxt *authctxt)
/* We already have a PAM context; check if the user matches */
if ((sshpam_err = check_pam_user(authctxt)) != PAM_SUCCESS)
fatal("PAM user mismatch");
+ return 0;
}
debug("PAM: initializing for \"%s\" with service \"%s\"", user,
options.pam_service_name);
@@ -869,10 +854,9 @@ sshpam_query(void *ctx, char **name, char **info,
{
struct sshbuf *buffer;
struct pam_ctxt *ctxt = ctx;
- size_t plen;
u_char type;
char *msg;
- size_t len, mlen, nmesg = 0;
+ size_t mlen, nmesg = 0;
int r;
debug3_f("entering");
@@ -880,10 +864,10 @@ sshpam_query(void *ctx, char **name, char **info,
fatal_f("sshbuf_new failed");
*name = xstrdup("");
*info = xstrdup("");
- *prompts = xmalloc(sizeof(char *));
- **prompts = NULL;
- plen = 0;
- *echo_on = xmalloc(sizeof(u_int));
+ *prompts = NULL;
+ *num = 0;
+ ctxt->pam_done = SshPamNone;
+
while (ssh_msg_recv(ctxt->pam_psock, buffer) == 0) {
if (++nmesg > PAM_MAX_NUM_MSG)
fatal_f("too many query messages");
@@ -893,26 +877,21 @@ sshpam_query(void *ctx, char **name, char **info,
switch (type) {
case PAM_PROMPT_ECHO_ON:
case PAM_PROMPT_ECHO_OFF:
+ *prompts = xcalloc(1, sizeof(char *));
+ *echo_on = xcalloc(1, sizeof(u_int));
+ (*prompts)[0] = msg; /* transfer ownership */
+ (*echo_on)[0] = (type == PAM_PROMPT_ECHO_ON);
*num = 1;
- len = plen + mlen + 1;
- **prompts = xreallocarray(**prompts, 1, len);
- strlcpy(**prompts + plen, msg, len - plen);
- plen += mlen;
- **echo_on = (type == PAM_PROMPT_ECHO_ON);
- free(msg);
sshbuf_free(buffer);
return (0);
case PAM_ERROR_MSG:
case PAM_TEXT_INFO:
- /* accumulate messages */
- len = plen + mlen + 2;
- **prompts = xreallocarray(**prompts, 1, len);
- strlcpy(**prompts + plen, msg, len - plen);
- plen += mlen;
- strlcat(**prompts + plen, "\n", len - plen);
- plen++;
- free(msg);
- break;
+ free(*info);
+ *info = msg; /* transfer ownership */
+ msg = NULL;
+ ctxt->pam_done = SshPamAgain;
+ sshbuf_free(buffer);
+ return (0);
case PAM_ACCT_EXPIRED:
case PAM_MAXTRIES:
if (type == PAM_ACCT_EXPIRED)
@@ -922,29 +901,8 @@ sshpam_query(void *ctx, char **name, char **info,
/* FALLTHROUGH */
case PAM_AUTH_ERR:
debug3("PAM: %s", pam_strerror(sshpam_handle, type));
- if (**prompts != NULL && strlen(**prompts) != 0) {
- free(*info);
- *info = **prompts;
- **prompts = NULL;
- *num = 0;
- **echo_on = 0;
- ctxt->pam_done = -1;
- free(msg);
- sshbuf_free(buffer);
- return 0;
- }
/* FALLTHROUGH */
case PAM_SUCCESS:
- if (**prompts != NULL) {
- /* drain any accumulated messages */
- debug("PAM: %s", **prompts);
- if ((r = sshbuf_put(loginmsg, **prompts,
- strlen(**prompts))) != 0)
- fatal("%s: buffer error: %s",
- __func__, ssh_err(r));
- free(**prompts);
- **prompts = NULL;
- }
if (type == PAM_SUCCESS) {
if (!sshpam_authctxt->valid ||
(sshpam_authctxt->pw->pw_uid == 0 &&
@@ -953,9 +911,7 @@ sshpam_query(void *ctx, char **name, char **info,
"succeeded when it should have "
"failed");
import_environments(buffer);
- *num = 0;
- **echo_on = 0;
- ctxt->pam_done = 1;
+ ctxt->pam_done = SshPamAuthenticated;
free(msg);
sshbuf_free(buffer);
return (0);
@@ -965,10 +921,8 @@ sshpam_query(void *ctx, char **name, char **info,
sshpam_authctxt->user, sshpam_rhost);
/* FALLTHROUGH */
default:
- *num = 0;
- **echo_on = 0;
free(msg);
- ctxt->pam_done = -1;
+ ctxt->pam_done = SshPamError;
sshbuf_free(buffer);
return (-1);
}
@@ -1001,7 +955,6 @@ fake_password(const char *wire_password)
return ret;
}
-/* XXX - see also comment in auth-chall.c:verify_response */
static int
sshpam_respond(void *ctx, u_int num, char **resp)
{
@@ -1012,11 +965,13 @@ sshpam_respond(void *ctx, u_int num, char **resp)
debug2_f("PAM: entering, %u responses", num);
switch (ctxt->pam_done) {
- case 1:
+ case SshPamAuthenticated:
sshpam_authenticated = 1;
return (0);
- case 0:
+ case SshPamNone:
break;
+ case SshPamAgain:
+ return 1; /* KbdintResultAgain */
default:
return (-1);
}
@@ -1061,6 +1016,14 @@ sshpam_free_ctx(void *ctxtp)
*/
}
+int
+sshpam_priv_kbdint_authdone(void *ctxtp)
+{
+ struct pam_ctxt *ctxt = ctxtp;
+
+ return ctxt->pam_done == SshPamAuthenticated;
+}
+
KbdintDevice sshpam_device = {
"pam",
sshpam_init_ctx,
@@ -1146,86 +1109,6 @@ do_pam_setcred(void)
pam_strerror(sshpam_handle, sshpam_err));
}
-#if 0
-static int
-sshpam_tty_conv(int n, sshpam_const struct pam_message **msg,
- struct pam_response **resp, void *data)
-{
- char input[PAM_MAX_MSG_SIZE];
- struct pam_response *reply;
- int i;
-
- debug3_f("PAM: called with %d messages", n);
-
- *resp = NULL;
-
- if (n <= 0 || n > PAM_MAX_NUM_MSG || !isatty(STDIN_FILENO))
- return (PAM_CONV_ERR);
-
- if ((reply = calloc(n, sizeof(*reply))) == NULL)
- return (PAM_CONV_ERR);
-
- for (i = 0; i < n; ++i) {
- switch (PAM_MSG_MEMBER(msg, i, msg_style)) {
- case PAM_PROMPT_ECHO_OFF:
- reply[i].resp =
- read_passphrase(PAM_MSG_MEMBER(msg, i, msg),
- RP_ALLOW_STDIN);
- reply[i].resp_retcode = PAM_SUCCESS;
- break;
- case PAM_PROMPT_ECHO_ON:
- fprintf(stderr, "%s\n", PAM_MSG_MEMBER(msg, i, msg));
- if (fgets(input, sizeof input, stdin) == NULL)
- input[0] = '\0';
- if ((reply[i].resp = strdup(input)) == NULL)
- goto fail;
- reply[i].resp_retcode = PAM_SUCCESS;
- break;
- case PAM_ERROR_MSG:
- case PAM_TEXT_INFO:
- fprintf(stderr, "%s\n", PAM_MSG_MEMBER(msg, i, msg));
- reply[i].resp_retcode = PAM_SUCCESS;
- break;
- default:
- goto fail;
- }
- }
- *resp = reply;
- return (PAM_SUCCESS);
-
- fail:
- for(i = 0; i < n; i++) {
- free(reply[i].resp);
- }
- free(reply);
- return (PAM_CONV_ERR);
-}
-
-static struct pam_conv tty_conv = { sshpam_tty_conv, NULL };
-#endif
-
-/*
- * XXX this should be done in the authentication phase, but ssh1 doesn't
- * support that
- */
-void
-do_pam_chauthtok(void)
-{
- fatal("Password expired");
-#if 0
- sshpam_err = pam_set_item(sshpam_handle, PAM_CONV,
- (const void *)&tty_conv);
- if (sshpam_err != PAM_SUCCESS)
- fatal("PAM: failed to set PAM_CONV: %s",
- pam_strerror(sshpam_handle, sshpam_err));
- debug("PAM: changing password");
- sshpam_err = pam_chauthtok(sshpam_handle, PAM_CHANGE_EXPIRED_AUTHTOK);
- if (sshpam_err != PAM_SUCCESS)
- fatal("PAM: pam_chauthtok(): %s",
- pam_strerror(sshpam_handle, sshpam_err));
-#endif
-}
-
void
do_pam_session(struct ssh *ssh)
{
diff --git a/auth-pam.h b/auth-pam.h
index 8d801c689aa6..49133670107a 100644
--- a/auth-pam.h
+++ b/auth-pam.h
@@ -32,7 +32,6 @@ void finish_pam(void);
u_int do_pam_account(void);
void do_pam_session(struct ssh *);
void do_pam_setcred(void);
-void do_pam_chauthtok(void);
int do_pam_putenv(char *, char *);
char ** fetch_pam_environment(void);
char ** fetch_pam_child_environment(void);
@@ -43,5 +42,6 @@ int sshpam_auth_passwd(Authctxt *, const char *);
int sshpam_get_maxtries_reached(void);
void sshpam_set_maxtries_reached(int);
int is_pam_session_open(void);
+int sshpam_priv_kbdint_authdone(void *ctxtp);
#endif /* USE_PAM */
diff --git a/auth.c b/auth.c
index 8d94047439be..a0217a81180c 100644
--- a/auth.c
+++ b/auth.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: auth.c,v 1.163 2025/09/15 04:39:15 djm Exp $ */
+/* $OpenBSD: auth.c,v 1.164 2026/02/11 22:57:16 djm Exp $ */
/*
* Copyright (c) 2000 Markus Friedl. All rights reserved.
*
@@ -98,8 +98,8 @@ allowed_user(struct ssh *ssh, struct passwd * pw)
{
struct stat st;
const char *hostname = NULL, *ipaddr = NULL;
- u_int i;
int r;
+ u_int i;
/* Shouldn't be called if pw is NULL, but better safe than sorry... */
if (!pw || !pw->pw_name)
@@ -545,9 +545,10 @@ int
auth_key_is_revoked(struct sshkey *key)
{
char *fp = NULL;
+ u_int i;
int r;
- if (options.revoked_keys_file == NULL)
+ if (options.num_revoked_keys_files == 0)
return 0;
if ((fp = sshkey_fingerprint(key, options.fingerprint_hash,
SSH_FP_DEFAULT)) == NULL) {
@@ -556,19 +557,22 @@ auth_key_is_revoked(struct sshkey *key)
goto out;
}
- r = sshkey_check_revoked(key, options.revoked_keys_file);
- switch (r) {
- case 0:
- break; /* not revoked */
- case SSH_ERR_KEY_REVOKED:
- error("Authentication key %s %s revoked by file %s",
- sshkey_type(key), fp, options.revoked_keys_file);
- goto out;
- default:
- error_r(r, "Error checking authentication key %s %s in "
- "revoked keys file %s", sshkey_type(key), fp,
- options.revoked_keys_file);
- goto out;
+ for (i = 0; i < options.num_revoked_keys_files; i++) {
+ r = sshkey_check_revoked(key, options.revoked_keys_files[i]);
+ switch (r) {
+ case 0:
+ break; /* not revoked */
+ case SSH_ERR_KEY_REVOKED:
+ error("Authentication key %s %s revoked by file %s",
+ sshkey_type(key), fp,
+ options.revoked_keys_files[i]);
+ goto out;
+ default:
+ error_r(r, "Error checking authentication key %s %s in "
+ "revoked keys file %s", sshkey_type(key), fp,
+ options.revoked_keys_files[i]);
+ goto out;
+ }
}
/* Success */
diff --git a/auth.h b/auth.h
index 98bb23d4c5ce..634a84aa85f7 100644
--- a/auth.h
+++ b/auth.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: auth.h,v 1.108 2024/05/17 06:42:04 jsg Exp $ */
+/* $OpenBSD: auth.h,v 1.109 2026/02/06 01:24:36 djm Exp $ */
/*
* Copyright (c) 2000 Markus Friedl. All rights reserved.
@@ -182,8 +182,6 @@ int auth2_update_methods_lists(Authctxt *, const char *, const char *);
int auth2_setup_methods_lists(Authctxt *);
int auth2_method_allowed(Authctxt *, const char *, const char *);
-void privsep_challenge_enable(void);
-
int auth2_challenge(struct ssh *, char *);
void auth2_challenge_stop(struct ssh *);
int bsdauth_query(void *, char **, char **, u_int *, char ***, u_int **);
diff --git a/auth2-chall.c b/auth2-chall.c
index a6d916598263..f3889079b64f 100644
--- a/auth2-chall.c
+++ b/auth2-chall.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: auth2-chall.c,v 1.57 2025/10/02 08:38:43 dtucker Exp $ */
+/* $OpenBSD: auth2-chall.c,v 1.60 2026/03/03 09:57:25 dtucker Exp $ */
/*
* Copyright (c) 2001 Markus Friedl. All rights reserved.
* Copyright (c) 2001 Per Allansson. All rights reserved.
@@ -51,22 +51,22 @@ extern ServerOptions options;
static int auth2_challenge_start(struct ssh *);
static int send_userauth_info_request(struct ssh *);
-static int input_userauth_info_response(int, u_int32_t, struct ssh *);
+static int input_userauth_info_response(int, uint32_t, struct ssh *);
#ifdef BSD_AUTH
-extern KbdintDevice bsdauth_device;
+extern KbdintDevice mm_bsdauth_device;
#else
#ifdef USE_PAM
-extern KbdintDevice sshpam_device;
+extern KbdintDevice mm_sshpam_device;
#endif
#endif
KbdintDevice *devices[] = {
#ifdef BSD_AUTH
- &bsdauth_device,
+ &mm_bsdauth_device,
#else
#ifdef USE_PAM
- &sshpam_device,
+ &mm_sshpam_device,
#endif
#endif
NULL
@@ -167,7 +167,7 @@ kbdint_next_device(Authctxt *authctxt, KbdintAuthctxt *kbdintctxt)
for (i = 0; devices[i]; i++) {
if (i >= sizeof(kbdintctxt->devices_done) * 8 ||
i >= sizeof(devices) / sizeof(devices[0]))
- fatal_f("internal error: too may devices");
+ fatal_f("internal error: too many devices");
if ((kbdintctxt->devices_done & (1 << i)) != 0 ||
!auth2_method_allowed(authctxt,
"keyboard-interactive", devices[i]->name))
@@ -291,7 +291,7 @@ send_userauth_info_request(struct ssh *ssh)
}
static int
-input_userauth_info_response(int type, u_int32_t seq, struct ssh *ssh)
+input_userauth_info_response(int type, uint32_t seq, struct ssh *ssh)
{
Authctxt *authctxt = ssh->authctxt;
KbdintAuthctxt *kbdintctxt;
@@ -362,25 +362,3 @@ input_userauth_info_response(int type, u_int32_t seq, struct ssh *ssh)
devicename);
return 0;
}
-
-void
-privsep_challenge_enable(void)
-{
-#if defined(BSD_AUTH) || defined(USE_PAM)
- int n = 0;
-#endif
-#ifdef BSD_AUTH
- extern KbdintDevice mm_bsdauth_device;
-#endif
-#ifdef USE_PAM
- extern KbdintDevice mm_sshpam_device;
-#endif
-
-#ifdef BSD_AUTH
- devices[n++] = &mm_bsdauth_device;
-#else
-#ifdef USE_PAM
- devices[n++] = &mm_sshpam_device;
-#endif
-#endif
-}
diff --git a/auth2-gss.c b/auth2-gss.c
index 75eb4e3a357b..0535485277a6 100644
--- a/auth2-gss.c
+++ b/auth2-gss.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: auth2-gss.c,v 1.36 2024/05/17 04:42:13 djm Exp $ */
+/* $OpenBSD: auth2-gss.c,v 1.39 2026/03/03 09:57:25 dtucker Exp $ */
/*
* Copyright (c) 2001-2003 Simon Wilkinson. All rights reserved.
@@ -53,10 +53,10 @@
extern ServerOptions options;
extern struct authmethod_cfg methodcfg_gssapi;
-static int input_gssapi_token(int type, u_int32_t plen, struct ssh *ssh);
-static int input_gssapi_mic(int type, u_int32_t plen, struct ssh *ssh);
-static int input_gssapi_exchange_complete(int type, u_int32_t plen, struct ssh *ssh);
-static int input_gssapi_errtok(int, u_int32_t, struct ssh *);
+static int input_gssapi_token(int type, uint32_t plen, struct ssh *ssh);
+static int input_gssapi_mic(int type, uint32_t plen, struct ssh *ssh);
+static int input_gssapi_exchange_complete(int type, uint32_t plen, struct ssh *ssh);
+static int input_gssapi_errtok(int, uint32_t, struct ssh *);
/*
* We only support those mechanisms that we know about (ie ones that we know
@@ -143,7 +143,7 @@ userauth_gssapi(struct ssh *ssh, const char *method)
}
static int
-input_gssapi_token(int type, u_int32_t plen, struct ssh *ssh)
+input_gssapi_token(int type, uint32_t plen, struct ssh *ssh)
{
Authctxt *authctxt = ssh->authctxt;
Gssctxt *gssctxt;
@@ -207,7 +207,7 @@ input_gssapi_token(int type, u_int32_t plen, struct ssh *ssh)
}
static int
-input_gssapi_errtok(int type, u_int32_t plen, struct ssh *ssh)
+input_gssapi_errtok(int type, uint32_t plen, struct ssh *ssh)
{
Authctxt *authctxt = ssh->authctxt;
Gssctxt *gssctxt;
@@ -251,7 +251,7 @@ input_gssapi_errtok(int type, u_int32_t plen, struct ssh *ssh)
*/
static int
-input_gssapi_exchange_complete(int type, u_int32_t plen, struct ssh *ssh)
+input_gssapi_exchange_complete(int type, uint32_t plen, struct ssh *ssh)
{
Authctxt *authctxt = ssh->authctxt;
int r, authenticated;
@@ -279,7 +279,7 @@ input_gssapi_exchange_complete(int type, u_int32_t plen, struct ssh *ssh)
}
static int
-input_gssapi_mic(int type, u_int32_t plen, struct ssh *ssh)
+input_gssapi_mic(int type, uint32_t plen, struct ssh *ssh)
{
Authctxt *authctxt = ssh->authctxt;
Gssctxt *gssctxt;
@@ -328,5 +328,4 @@ Authmethod method_gssapi = {
&methodcfg_gssapi,
userauth_gssapi,
};
-
-#endif /* GSSAPI */
+#endif
diff --git a/auth2-hostbased.c b/auth2-hostbased.c
index 9d8b860eb14e..8a1acdec3f7c 100644
--- a/auth2-hostbased.c
+++ b/auth2-hostbased.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: auth2-hostbased.c,v 1.55 2025/08/14 09:26:53 dtucker Exp $ */
+/* $OpenBSD: auth2-hostbased.c,v 1.57 2026/04/02 07:48:13 djm Exp $ */
/*
* Copyright (c) 2000 Markus Friedl. All rights reserved.
*
@@ -96,9 +96,10 @@ userauth_hostbased(struct ssh *ssh, const char *method)
error_f("cannot decode key: %s", pkalg);
goto done;
}
- if (key->type != pktype) {
- error_f("type mismatch for decoded key "
- "(received %d, expected %d)", key->type, pktype);
+ if (key->type != pktype || (sshkey_type_plain(pktype) == KEY_ECDSA &&
+ sshkey_ecdsa_nid_from_name(pkalg) != key->ecdsa_nid)) {
+ error_f("key type mismatch for decoded key "
+ "(received %s, expected %s)", sshkey_ssh_name(key), pkalg);
goto done;
}
if (match_pattern_list(pkalg, options.hostbased_accepted_algos, 0) != 1) {
@@ -211,8 +212,8 @@ hostbased_key_allowed(struct ssh *ssh, struct passwd *pw,
}
debug2_f("access allowed by auth_rhosts2");
- if (sshkey_is_cert(key) &&
- sshkey_cert_check_authority_now(key, 1, 0, 0, lookup, &reason)) {
+ if (sshkey_is_cert(key) && sshkey_cert_check_host(key, lookup,
+ options.ca_sign_algorithms, &reason) != 0) {
if ((fp = sshkey_fingerprint(key->cert->signature_key,
options.fingerprint_hash, SSH_FP_DEFAULT)) == NULL)
fatal_f("sshkey_fingerprint fail");
diff --git a/auth2-none.c b/auth2-none.c
index c3ed53ff144a..900cae98fbbf 100644
--- a/auth2-none.c
+++ b/auth2-none.c
@@ -26,16 +26,9 @@
#include "includes.h"
#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/uio.h>
-
-#include <fcntl.h>
-#include <string.h>
-#include <unistd.h>
#include <stdarg.h>
#include <stdio.h>
-#include "atomicio.h"
#include "xmalloc.h"
#include "sshkey.h"
#include "hostfile.h"
diff --git a/auth2-pubkey.c b/auth2-pubkey.c
index 15ad3000c6cd..e446ef4122b2 100644
--- a/auth2-pubkey.c
+++ b/auth2-pubkey.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: auth2-pubkey.c,v 1.124 2025/08/14 09:44:39 dtucker Exp $ */
+/* $OpenBSD: auth2-pubkey.c,v 1.126 2026/04/02 07:48:13 djm Exp $ */
/*
* Copyright (c) 2000 Markus Friedl. All rights reserved.
* Copyright (c) 2010 Damien Miller. All rights reserved.
@@ -32,6 +32,7 @@
#include <errno.h>
#include <paths.h>
#include <pwd.h>
+#include <glob.h>
#include <signal.h>
#include <stdio.h>
#include <stdarg.h>
@@ -39,11 +40,6 @@
#include <time.h>
#include <unistd.h>
#include <limits.h>
-#ifdef USE_SYSTEM_GLOB
-# include <glob.h>
-#else
-# include "openbsd-compat/glob.h"
-#endif
#include "xmalloc.h"
#include "ssh.h"
@@ -152,9 +148,10 @@ userauth_pubkey(struct ssh *ssh, const char *method)
error_f("cannot decode key: %s", pkalg);
goto done;
}
- if (key->type != pktype) {
- error_f("type mismatch for decoded key "
- "(received %d, expected %d)", key->type, pktype);
+ if (key->type != pktype || (sshkey_type_plain(pktype) == KEY_ECDSA &&
+ sshkey_ecdsa_nid_from_name(pkalg) != key->ecdsa_nid)) {
+ error_f("key type mismatch for decoded key "
+ "(received %s, expected %s)", sshkey_ssh_name(key), pkalg);
goto done;
}
if (auth2_key_already_used(authctxt, key)) {
@@ -562,7 +559,7 @@ user_cert_trusted_ca(struct passwd *pw, struct sshkey *key,
}
if (use_authorized_principals && principals_opts == NULL)
fatal_f("internal error: missing principals_opts");
- if (sshkey_cert_check_authority_now(key, 0, 1, 0,
+ if (sshkey_cert_check_authority_now(key, 0, 0,
use_authorized_principals ? NULL : pw->pw_name, &reason) != 0)
goto fail_reason;
diff --git a/auth2-pubkeyfile.c b/auth2-pubkeyfile.c
index 9d59e566658e..e729cc50a6d4 100644
--- a/auth2-pubkeyfile.c
+++ b/auth2-pubkeyfile.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: auth2-pubkeyfile.c,v 1.6 2025/08/14 10:03:44 dtucker Exp $ */
+/* $OpenBSD: auth2-pubkeyfile.c,v 1.8 2026/04/02 07:48:13 djm Exp $ */
/*
* Copyright (c) 2000 Markus Friedl. All rights reserved.
* Copyright (c) 2010 Damien Miller. All rights reserved.
@@ -50,6 +50,7 @@
#include "authfile.h"
#include "match.h"
#include "ssherr.h"
+#include "xmalloc.h"
int
auth_authorise_keyopts(struct passwd *pw, struct sshauthopt *opts,
@@ -146,20 +147,23 @@ auth_authorise_keyopts(struct passwd *pw, struct sshauthopt *opts,
static int
match_principals_option(const char *principal_list, struct sshkey_cert *cert)
{
- char *result;
+ char *list, *olist, *entry;
u_int i;
- /* XXX percent_expand() sequences for authorized_principals? */
-
- for (i = 0; i < cert->nprincipals; i++) {
- if ((result = match_list(cert->principals[i],
- principal_list, NULL)) != NULL) {
- debug3("matched principal from key options \"%.100s\"",
- result);
- free(result);
- return 1;
+ olist = list = xstrdup(principal_list);
+ for (;;) {
+ if ((entry = strsep(&list, ",")) == NULL || *entry == '\0')
+ break;
+ for (i = 0; i < cert->nprincipals; i++) {
+ if (strcmp(entry, cert->principals[i]) == 0) {
+ debug3("matched principal from key i"
+ "options \"%.100s\"", entry);
+ free(olist);
+ return 1;
+ }
}
}
+ free(olist);
return 0;
}
@@ -364,7 +368,7 @@ auth_check_authkey_line(struct passwd *pw, struct sshkey *key,
reason = "Certificate does not contain an authorized principal";
goto cert_fail_reason;
}
- if (sshkey_cert_check_authority_now(key, 0, 0, 0,
+ if (sshkey_cert_check_authority_now(key, 0, 0,
keyopts->cert_principals == NULL ? pw->pw_name : NULL,
&reason) != 0)
goto cert_fail_reason;
diff --git a/auth2.c b/auth2.c
index b9bb46f5943d..3a168274631e 100644
--- a/auth2.c
+++ b/auth2.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: auth2.c,v 1.170 2025/01/17 00:09:41 dtucker Exp $ */
+/* $OpenBSD: auth2.c,v 1.173 2026/03/03 09:57:25 dtucker Exp $ */
/*
* Copyright (c) 2000 Markus Friedl. All rights reserved.
*
@@ -88,8 +88,8 @@ Authmethod *authmethods[] = {
/* protocol */
-static int input_service_request(int, u_int32_t, struct ssh *);
-static int input_userauth_request(int, u_int32_t, struct ssh *);
+static int input_service_request(int, uint32_t, struct ssh *);
+static int input_userauth_request(int, uint32_t, struct ssh *);
/* helper */
static Authmethod *authmethod_byname(const char *);
@@ -181,7 +181,7 @@ do_authentication2(struct ssh *ssh)
}
static int
-input_service_request(int type, u_int32_t seq, struct ssh *ssh)
+input_service_request(int type, uint32_t seq, struct ssh *ssh)
{
Authctxt *authctxt = ssh->authctxt;
char *service = NULL;
@@ -266,7 +266,7 @@ ensure_minimum_time_since(double start, double seconds)
}
static int
-input_userauth_request(int type, u_int32_t seq, struct ssh *ssh)
+input_userauth_request(int type, uint32_t seq, struct ssh *ssh)
{
Authctxt *authctxt = ssh->authctxt;
Authmethod *m = NULL;
@@ -293,6 +293,8 @@ input_userauth_request(int type, u_int32_t seq, struct ssh *ssh)
/* setup auth context */
authctxt->pw = mm_getpwnamallow(ssh, user);
authctxt->user = xstrdup(user);
+ authctxt->service = xstrdup(service);
+ authctxt->style = style ? xstrdup(style) : NULL;
if (authctxt->pw && strcmp(service, "ssh-connection")==0) {
authctxt->valid = 1;
debug2_f("setting up authctxt for %s", user);
@@ -311,8 +313,6 @@ input_userauth_request(int type, u_int32_t seq, struct ssh *ssh)
ssh_packet_set_log_preamble(ssh, "%suser %s",
authctxt->valid ? "authenticating " : "invalid ", user);
setproctitle("%s [net]", authctxt->valid ? user : "unknown");
- authctxt->service = xstrdup(service);
- authctxt->style = style ? xstrdup(style) : NULL;
mm_inform_authserv(service, style);
userauth_banner(ssh);
if ((r = kex_server_update_ext_info(ssh)) != 0)
diff --git a/authfd.c b/authfd.c
index 2bbe646e304a..fe3226140c01 100644
--- a/authfd.c
+++ b/authfd.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: authfd.c,v 1.136 2025/08/29 03:50:38 djm Exp $ */
+/* $OpenBSD: authfd.c,v 1.141 2026/03/05 05:44:15 djm Exp $ */
/*
* Author: Tatu Ylonen <ylo@cs.hut.fi>
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -43,22 +43,20 @@
#include <fcntl.h>
#include <stdlib.h>
-#include <signal.h>
#include <string.h>
#include <stdarg.h>
#include <unistd.h>
#include <errno.h>
-#include "xmalloc.h"
#include "ssh.h"
#include "sshbuf.h"
#include "sshkey.h"
#include "authfd.h"
-#include "cipher.h"
#include "log.h"
-#include "atomicio.h"
#include "misc.h"
+#include "atomicio.h"
#include "ssherr.h"
+#include "xmalloc.h"
#define MAX_AGENT_IDENTITIES 2048 /* Max keys in agent reply */
#define MAX_AGENT_REPLY_LEN (256 * 1024) /* Max bytes in agent reply */
@@ -66,6 +64,7 @@
/* macro to check for "agent failure" message */
#define agent_failed(x) \
((x == SSH_AGENT_FAILURE) || \
+ (x == SSH_AGENT_EXTENSION_FAILURE) || \
(x == SSH_COM_AGENT2_FAILURE) || \
(x == SSH2_AGENT_FAILURE))
@@ -262,7 +261,7 @@ int
ssh_fetch_identitylist(int sock, struct ssh_identitylist **idlp)
{
u_char type;
- u_int32_t num, i;
+ uint32_t num, i;
struct sshbuf *msg;
struct ssh_identitylist *idl = NULL;
int r;
@@ -437,8 +436,15 @@ ssh_agent_sign(int sock, const struct sshkey *key,
}
if ((r = sshbuf_get_string(msg, &sig, &len)) != 0)
goto out;
- /* Check what we actually got back from the agent. */
- if ((r = sshkey_check_sigtype(sig, len, alg)) != 0)
+ /*
+ * Check what we actually got back from the agent, in case it returned
+ * an incorrect RSA signature algorithm (e.g. "ssh-rsa" (RSA/SHA1) vs.
+ * "rsa-sha2-256").
+ * We don't do this for FIDO signatures as webauthn vs plain are just
+ * different signature formats and not entirely different algorithms.
+ */
+ if (!sshkey_is_sk(key) &&
+ (r = sshkey_check_sigtype(sig, len, alg)) != 0)
goto out;
/* success */
*sigp = sig;
@@ -765,3 +771,54 @@ ssh_agent_bind_hostkey(int sock, const struct sshkey *key,
sshbuf_free(msg);
return r;
}
+
+/* Queries supported extension request types */
+int
+ssh_agent_query_extensions(int sock, char ***exts)
+{
+ struct sshbuf *msg;
+ int r;
+ u_char type;
+ char *cp = NULL, **ret = NULL;
+ size_t i = 0;
+
+ *exts = NULL;
+ if ((msg = sshbuf_new()) == NULL)
+ return SSH_ERR_ALLOC_FAIL;
+ if ((r = sshbuf_put_u8(msg, SSH_AGENTC_EXTENSION)) != 0 ||
+ (r = sshbuf_put_cstring(msg, "query")) != 0)
+ goto out;
+ if ((r = ssh_request_reply(sock, msg, msg)) != 0)
+ goto out;
+ if ((r = sshbuf_get_u8(msg, &type)) != 0)
+ goto out;
+ if (agent_failed(type)) {
+ r = SSH_ERR_AGENT_FAILURE;
+ goto out;
+ }
+ /* Reply should start with "query" */
+ if (type != SSH_AGENT_EXTENSION_RESPONSE ||
+ (r = sshbuf_get_cstring(msg, &cp, NULL)) != 0 ||
+ strcmp(cp, "query") != 0) {
+ r = SSH_ERR_INVALID_FORMAT;
+ goto out;
+ }
+ ret = calloc(1, sizeof(*ret));
+ while (sshbuf_len(msg)) {
+ ret = xrecallocarray(ret, i + 1, i + 2, sizeof(*ret));
+ if ((r = sshbuf_get_cstring(msg, ret + i, NULL)) != 0) {
+ r = SSH_ERR_INVALID_FORMAT;
+ goto out;
+ }
+ i++;
+ }
+ /* success */
+ r = 0;
+ *exts = ret;
+ ret = NULL; /* transferred */
+ out:
+ free(cp);
+ stringlist_free(ret);
+ sshbuf_free(msg);
+ return r;
+}
diff --git a/authfd.h b/authfd.h
index 958d480de6c7..b2e07bcf285f 100644
--- a/authfd.h
+++ b/authfd.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: authfd.h,v 1.53 2025/08/29 03:50:38 djm Exp $ */
+/* $OpenBSD: authfd.h,v 1.55 2026/03/05 05:44:15 djm Exp $ */
/*
* Author: Tatu Ylonen <ylo@cs.hut.fi>
@@ -67,6 +67,8 @@ int ssh_agent_bind_hostkey(int sock, const struct sshkey *key,
const struct sshbuf *session_id, const struct sshbuf *signature,
int forwarding);
+int ssh_agent_query_extensions(int sock, char ***exts);
+
/* Messages for the authentication agent connection. */
#define SSH_AGENTC_REQUEST_RSA_IDENTITIES 1
#define SSH_AGENT_RSA_IDENTITIES_ANSWER 2
@@ -102,6 +104,8 @@ int ssh_agent_bind_hostkey(int sock, const struct sshkey *key,
/* generic extension mechanism */
#define SSH_AGENTC_EXTENSION 27
+#define SSH_AGENT_EXTENSION_FAILURE 28
+#define SSH_AGENT_EXTENSION_RESPONSE 29
#define SSH_AGENT_CONSTRAIN_LIFETIME 1
#define SSH_AGENT_CONSTRAIN_CONFIRM 2
diff --git a/authfile.c b/authfile.c
index 16e02d9d0580..5fc2ec470057 100644
--- a/authfile.c
+++ b/authfile.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: authfile.c,v 1.147 2025/08/29 03:50:38 djm Exp $ */
+/* $OpenBSD: authfile.c,v 1.149 2026/02/14 00:18:34 jsg Exp $ */
/*
* Copyright (c) 2000, 2013 Markus Friedl. All rights reserved.
*
@@ -27,7 +27,6 @@
#include <sys/types.h>
#include <sys/stat.h>
-#include <sys/uio.h>
#include <errno.h>
#include <fcntl.h>
@@ -36,14 +35,9 @@
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
-#include <limits.h>
-#include "cipher.h"
-#include "ssh.h"
#include "log.h"
#include "authfile.h"
-#include "misc.h"
-#include "atomicio.h"
#include "sshkey.h"
#include "sshbuf.h"
#include "ssherr.h"
diff --git a/canohost.c b/canohost.c
index 28f086e5a694..40725620cd3c 100644
--- a/canohost.c
+++ b/canohost.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: canohost.c,v 1.77 2023/03/31 04:42:29 dtucker Exp $ */
+/* $OpenBSD: canohost.c,v 1.78 2026/02/14 00:18:34 jsg Exp $ */
/*
* Author: Tatu Ylonen <ylo@cs.hut.fi>
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -30,7 +30,6 @@
#include <unistd.h>
#include "xmalloc.h"
-#include "packet.h"
#include "log.h"
#include "canohost.h"
#include "misc.h"
@@ -41,7 +40,7 @@ ipv64_normalise_mapped(struct sockaddr_storage *addr, socklen_t *len)
struct sockaddr_in6 *a6 = (struct sockaddr_in6 *)addr;
struct sockaddr_in *a4 = (struct sockaddr_in *)addr;
struct in_addr inaddr;
- u_int16_t port;
+ uint16_t port;
if (addr->ss_family != AF_INET6 ||
!IN6_IS_ADDR_V4MAPPED(&a6->sin6_addr))
diff --git a/chacha.c b/chacha.c
index 729aa03db07f..9d79b661c159 100644
--- a/chacha.c
+++ b/chacha.c
@@ -48,8 +48,8 @@ typedef struct chacha_ctx chacha_ctx;
a = PLUS(a,b); d = ROTATE(XOR(d,a), 8); \
c = PLUS(c,d); b = ROTATE(XOR(b,c), 7);
-static const char sigma[16] = "expand 32-byte k";
-static const char tau[16] = "expand 16-byte k";
+static const char __attribute__ ((__nonstring__)) sigma[16] = "expand 32-byte k";
+static const char __attribute__ ((__nonstring__)) tau[16] = "expand 16-byte k";
void
chacha_keysetup(chacha_ctx *x,const u8 *k,u32 kbits)
diff --git a/channels.c b/channels.c
index 80014ff341fa..d7c55fc899d4 100644
--- a/channels.c
+++ b/channels.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: channels.c,v 1.452 2025/10/07 08:02:32 djm Exp $ */
+/* $OpenBSD: channels.c,v 1.458 2026/03/28 05:16:18 djm Exp $ */
/*
* Author: Tatu Ylonen <ylo@cs.hut.fi>
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -46,7 +46,7 @@
#include <sys/ioctl.h>
#include <sys/un.h>
#include <sys/socket.h>
-#include <sys/time.h>
+#include <sys/queue.h>
#include <netinet/in.h>
#include <arpa/inet.h>
@@ -64,7 +64,6 @@
#include <termios.h>
#include <unistd.h>
-#include "openbsd-compat/sys-queue.h"
#include "xmalloc.h"
#include "ssh.h"
#include "ssh2.h"
@@ -76,8 +75,6 @@
#include "channels.h"
#include "compat.h"
#include "canohost.h"
-#include "sshkey.h"
-#include "authfd.h"
#include "pathnames.h"
#include "match.h"
@@ -1193,7 +1190,8 @@ channel_send_open(struct ssh *ssh, int id)
}
void
-channel_request_start(struct ssh *ssh, int id, char *service, int wantconfirm)
+channel_request_start(struct ssh *ssh, int id, const char *service,
+ int wantconfirm)
{
Channel *c = channel_lookup(ssh, id);
int r;
@@ -1507,115 +1505,93 @@ channel_pre_mux_client(struct ssh *ssh, Channel *c)
}
}
+static inline int
+socks_decode_error(Channel *c, int status, const char *func, const char *msg)
+{
+ if (status == SSH_ERR_MESSAGE_INCOMPLETE)
+ return 0;
+ else {
+ debug_r(status, "%s: channel %d: decode %s",
+ func, c->self, msg);
+ return -1;
+ }
+}
+
/* try to decode a socks4 header */
static int
channel_decode_socks4(Channel *c, struct sshbuf *input, struct sshbuf *output)
{
- const u_char *p;
- char *host;
- u_int len, have, i, found, need;
- char username[256];
- struct {
- u_int8_t version;
- u_int8_t command;
- u_int16_t dest_port;
- struct in_addr dest_addr;
- } s4_req, s4_rsp;
- int r;
-
- debug2("channel %d: decode socks4", c->self);
+ uint8_t socks_ver, socks_cmd, dest_addr[4];
+ uint16_t dest_port;
+ char *user = NULL, *host = NULL;
+ int success = -1, socks4a = 0, r;
+ struct sshbuf *b = NULL;
- have = sshbuf_len(input);
- len = sizeof(s4_req);
- if (have < len)
+ if (sshbuf_len(input) < 9)
return 0;
- p = sshbuf_ptr(input);
- need = 1;
- /* SOCKS4A uses an invalid IP address 0.0.0.x */
- if (p[4] == 0 && p[5] == 0 && p[6] == 0 && p[7] != 0) {
- debug2("channel %d: socks4a request", c->self);
- /* ... and needs an extra string (the hostname) */
- need = 2;
+ /* We may not have a complete message, so work on a dup of the buffer */
+ if ((b = sshbuf_fromb(input)) == NULL)
+ fatal_f("sshbuf_fromb failed");
+
+ debug2("channel %d: decode socks4", c->self);
+ if ((r = sshbuf_get_u8(b, &socks_ver)) != 0 ||
+ (r = sshbuf_get_u8(b, &socks_cmd)) != 0 ||
+ (r = sshbuf_get_u16(b, &dest_port)) != 0 ||
+ (r = sshbuf_get(b, &dest_addr, sizeof(dest_addr))) != 0 ||
+ (r = sshbuf_get_nulterminated_string(b, 1024, &user, NULL)) != 0) {
+ success = socks_decode_error(c, r, __func__, "header");
+ goto out;
}
- /* Check for terminating NUL on the string(s) */
- for (found = 0, i = len; i < have; i++) {
- if (p[i] == '\0') {
- found++;
- if (found == need)
- break;
- }
- if (i > 1024) {
- /* the peer is probably sending garbage */
- debug("channel %d: decode socks4: too long",
- c->self);
- return -1;
+
+ /* Is this a SOCKS4A request? (indicated by an address of 0.0.0.x) */
+ if (dest_addr[0] == 0 && dest_addr[1] == 0 &&
+ dest_addr[2] == 0 && dest_addr[3] != 0) {
+ /* If so, then the hostname follows, also nul-terminated */
+ if ((r = sshbuf_get_nulterminated_string(b, 1024,
+ &host, NULL)) != 0) {
+ success = socks_decode_error(c, r, __func__, "host");
+ goto out;
}
+ socks4a = 1;
+ } else {
+ /* Plain SOCKS4 passes an IPv4 binary address; reconstruct */
+ xasprintf(&host, "%d.%d.%d.%d",
+ dest_addr[0], dest_addr[1], dest_addr[2], dest_addr[3]);
}
- if (found < need)
- return 0;
- if ((r = sshbuf_get(input, &s4_req.version, 1)) != 0 ||
- (r = sshbuf_get(input, &s4_req.command, 1)) != 0 ||
- (r = sshbuf_get(input, &s4_req.dest_port, 2)) != 0 ||
- (r = sshbuf_get(input, &s4_req.dest_addr, 4)) != 0) {
- debug_r(r, "channels %d: decode socks4", c->self);
- return -1;
- }
- have = sshbuf_len(input);
- p = sshbuf_ptr(input);
- if (memchr(p, '\0', have) == NULL) {
- error("channel %d: decode socks4: unterminated user", c->self);
- return -1;
- }
- len = strlen(p);
- debug2("channel %d: decode socks4: user %s/%d", c->self, p, len);
- len++; /* trailing '\0' */
- strlcpy(username, p, sizeof(username));
- if ((r = sshbuf_consume(input, len)) != 0)
+
+ /* We have a complete SOCKS4 message; consume it from input */
+ if ((r = sshbuf_consume_upto_child(input, b)) != 0)
fatal_fr(r, "channel %d: consume", c->self);
- free(c->path);
- c->path = NULL;
- if (need == 1) { /* SOCKS4: one string */
- host = inet_ntoa(s4_req.dest_addr);
- c->path = xstrdup(host);
- } else { /* SOCKS4A: two strings */
- have = sshbuf_len(input);
- p = sshbuf_ptr(input);
- if (memchr(p, '\0', have) == NULL) {
- error("channel %d: decode socks4a: host not nul "
- "terminated", c->self);
- return -1;
- }
- len = strlen(p);
- debug2("channel %d: decode socks4a: host %s/%d",
- c->self, p, len);
- len++; /* trailing '\0' */
- if (len > NI_MAXHOST) {
- error("channel %d: hostname \"%.100s\" too long",
- c->self, p);
- return -1;
- }
- c->path = xstrdup(p);
- if ((r = sshbuf_consume(input, len)) != 0)
- fatal_fr(r, "channel %d: consume", c->self);
+
+ /* Handle the request */
+ debug2("channel %d: %s: user=\"%s\" command=%d destination=[%s]:%d",
+ c->self, socks4a ? "SOCKS4A" : "SOCKS4", user, (int)socks_cmd,
+ host, dest_port);
+ if (socks_cmd != 1) {
+ debug("channel %d: cannot handle %s command 0x%02x",
+ c->self, socks4a ? "SOCKS4A" : "SOCKS4", socks_cmd);
+ goto out;
}
- c->host_port = ntohs(s4_req.dest_port);
+ free(c->path);
+ c->path = host;
+ host = NULL; /* transferred */
+ c->host_port = dest_port;
- debug2("channel %d: dynamic request: socks4 host %s port %u command %u",
- c->self, c->path, c->host_port, s4_req.command);
+ /* Reply to the SOCKS4 client */
+ if ((r = sshbuf_put_u8(output, 0)) != 0 || /* vn: 0 for reply */
+ (r = sshbuf_put_u8(output, 90)) != 0 || /* cd: req granted */
+ (r = sshbuf_put_u16(output, 0)) != 0 || /* port: ignored */
+ (r = sshbuf_put_u32(output, ntohl(INADDR_ANY))) != 0) /* ignored */
+ fatal_fr(r, "channel %d: compose reply", c->self);
- if (s4_req.command != 1) {
- debug("channel %d: cannot handle: %s cn %d",
- c->self, need == 1 ? "SOCKS4" : "SOCKS4A", s4_req.command);
- return -1;
- }
- s4_rsp.version = 0; /* vn: 0 for reply */
- s4_rsp.command = 90; /* cd: req granted */
- s4_rsp.dest_port = 0; /* ignored */
- s4_rsp.dest_addr.s_addr = INADDR_ANY; /* ignored */
- if ((r = sshbuf_put(output, &s4_rsp, sizeof(s4_rsp))) != 0)
- fatal_fr(r, "channel %d: append reply", c->self);
- return 1;
+ /* success */
+ success = 1;
+ out:
+ sshbuf_free(b);
+ free(user);
+ free(host);
+ return success;
}
/* try to decode a socks5 header */
@@ -1627,73 +1603,110 @@ channel_decode_socks4(Channel *c, struct sshbuf *input, struct sshbuf *output)
#define SSH_SOCKS5_CONNECT 0x01
#define SSH_SOCKS5_SUCCESS 0x00
+/*
+ * Handles SOCKS5 authentication. Note 'b' must be a dup of 'input'
+ * Returns 0 on insufficient queued date, 1 on authentication success or
+ * -1 on error.
+ */
static int
-channel_decode_socks5(Channel *c, struct sshbuf *input, struct sshbuf *output)
+channel_socks5_check_auth(Channel *c, struct sshbuf *b, struct sshbuf *input,
+ struct sshbuf *output)
{
- /* XXX use get/put_u8 instead of trusting struct padding */
- struct {
- u_int8_t version;
- u_int8_t command;
- u_int8_t reserved;
- u_int8_t atyp;
- } s5_req, s5_rsp;
- u_int16_t dest_port;
- char dest_addr[255+1], ntop[INET6_ADDRSTRLEN];
- const u_char *p;
- u_int have, need, i, found, nmethods, addrlen, af;
+ uint8_t socks_ver;
+ uint8_t nmethods, method;
int r;
+ u_int i, found;
- debug2("channel %d: decode socks5", c->self);
- p = sshbuf_ptr(input);
- if (p[0] != 0x05)
+ /* format: ver | nmethods | methods */
+ if ((r = sshbuf_get_u8(b, &socks_ver)) != 0)
+ return socks_decode_error(c, r, __func__, "version");
+ if (socks_ver != 5) /* shouldn't happen; checked by caller^2 */
+ fatal_fr(r, "channel %d: internal error: not socks5", c->self);
+ if ((r = sshbuf_get_u8(b, &nmethods)) != 0)
+ return socks_decode_error(c, r, __func__, "methods");
+ for (found = i = 0; i < nmethods; i++) {
+ if ((r = sshbuf_get_u8(b, &method)) != 0)
+ return socks_decode_error(c, r, __func__, "method");
+ if (method == SSH_SOCKS5_NOAUTH)
+ found = 1;
+ }
+ if (!found) {
+ debug("channel %d: didn't request SSH_SOCKS5_NOAUTH", c->self);
return -1;
- have = sshbuf_len(input);
+ }
+ /* Consume completed request */
+ if ((r = sshbuf_consume_upto_child(input, b)) != 0)
+ fatal_fr(r, "channel %d: consume", c->self);
+
+ /* Compose reply: version, method */
+ if ((r = sshbuf_put_u8(output, 0x05)) != 0 ||
+ (r = sshbuf_put_u8(output, SSH_SOCKS5_NOAUTH)) != 0)
+ fatal_fr(r, "channel %d: append reply", c->self);
+ /* success */
+ debug2("channel %d: socks5 auth done", c->self);
+ return 1;
+}
+
+static int
+channel_decode_socks5(Channel *c, struct sshbuf *input, struct sshbuf *output)
+{
+ uint8_t socks_ver, socks_cmd, socks_reserved, socks_atyp, addrlen;
+ uint16_t dest_port;
+ char dest_addr[255+1], ntop[INET6_ADDRSTRLEN];
+ u_int af;
+ int r, success = -1;;
+ struct sshbuf *b = NULL;
+
+ debug2("channel %d: decode socks5 %s", c->self,
+ (c->flags & SSH_SOCKS5_AUTHDONE) ? "request" : "auth");
+
+ /* We may not have a complete message, so work on a dup of the buffer */
+ if ((b = sshbuf_fromb(input)) == NULL)
+ fatal_f("sshbuf_fromb failed");
+
if (!(c->flags & SSH_SOCKS5_AUTHDONE)) {
- /* format: ver | nmethods | methods */
- if (have < 2)
- return 0;
- nmethods = p[1];
- if (have < nmethods + 2)
- return 0;
- /* look for method: "NO AUTHENTICATION REQUIRED" */
- for (found = 0, i = 2; i < nmethods + 2; i++) {
- if (p[i] == SSH_SOCKS5_NOAUTH) {
- found = 1;
- break;
- }
- }
- if (!found) {
- debug("channel %d: method SSH_SOCKS5_NOAUTH not found",
- c->self);
- return -1;
+ if ((r = channel_socks5_check_auth(c, b, input, output)) != 1) {
+ success = r;
+ goto out;
}
- if ((r = sshbuf_consume(input, nmethods + 2)) != 0)
- fatal_fr(r, "channel %d: consume", c->self);
- /* version, method */
- if ((r = sshbuf_put_u8(output, 0x05)) != 0 ||
- (r = sshbuf_put_u8(output, SSH_SOCKS5_NOAUTH)) != 0)
- fatal_fr(r, "channel %d: append reply", c->self);
c->flags |= SSH_SOCKS5_AUTHDONE;
- debug2("channel %d: socks5 auth done", c->self);
- return 0; /* need more */
+ /* Continue to parse request in case client speculated ahead */
}
+
+ /* Request messages (auth or connect) always start with the version */
+ if ((r = sshbuf_get_u8(b, &socks_ver)) != 0) {
+ success = socks_decode_error(c, r, __func__, "version");
+ goto out;
+ }
+ if (socks_ver != 5) /* shouldn't happen */
+ fatal_fr(r, "channel %d: internal error: not socks5", c->self);
+
+ /* Parse SOCKS5 request header */
debug2("channel %d: socks5 post auth", c->self);
- if (have < sizeof(s5_req)+1)
- return 0; /* need more */
- memcpy(&s5_req, p, sizeof(s5_req));
- if (s5_req.version != 0x05 ||
- s5_req.command != SSH_SOCKS5_CONNECT ||
- s5_req.reserved != 0x00) {
+ if ((r = sshbuf_get_u8(b, &socks_cmd)) != 0 ||
+ (r = sshbuf_get_u8(b, &socks_reserved)) != 0 ||
+ (r = sshbuf_get_u8(b, &socks_atyp)) != 0) {
+ success = socks_decode_error(c, r, __func__, "request header");
+ goto out;
+ }
+
+ if (socks_ver != 0x05 ||
+ socks_cmd != SSH_SOCKS5_CONNECT ||
+ socks_reserved != 0x00) {
debug2("channel %d: only socks5 connect supported", c->self);
- return -1;
+ goto out;
}
- switch (s5_req.atyp){
+
+ switch (socks_atyp) {
case SSH_SOCKS5_IPV4:
addrlen = 4;
af = AF_INET;
break;
case SSH_SOCKS5_DOMAIN:
- addrlen = p[sizeof(s5_req)];
+ if ((r = sshbuf_get_u8(b, &addrlen)) != 0) {
+ success = socks_decode_error(c, r, __func__, "addrlen");
+ goto out;
+ }
af = -1;
break;
case SSH_SOCKS5_IPV6:
@@ -1701,57 +1714,48 @@ channel_decode_socks5(Channel *c, struct sshbuf *input, struct sshbuf *output)
af = AF_INET6;
break;
default:
- debug2("channel %d: bad socks5 atyp %d", c->self, s5_req.atyp);
- return -1;
- }
- need = sizeof(s5_req) + addrlen + 2;
- if (s5_req.atyp == SSH_SOCKS5_DOMAIN)
- need++;
- if (have < need)
- return 0;
- if ((r = sshbuf_consume(input, sizeof(s5_req))) != 0)
- fatal_fr(r, "channel %d: consume", c->self);
- if (s5_req.atyp == SSH_SOCKS5_DOMAIN) {
- /* host string length */
- if ((r = sshbuf_consume(input, 1)) != 0)
- fatal_fr(r, "channel %d: consume", c->self);
+ debug2("channel %d: bad socks5 atyp %d", c->self, socks_atyp);
+ goto out;
}
- if ((r = sshbuf_get(input, &dest_addr, addrlen)) != 0 ||
- (r = sshbuf_get(input, &dest_port, 2)) != 0) {
- debug_r(r, "channel %d: parse addr/port", c->self);
- return -1;
+ if ((r = sshbuf_get(b, &dest_addr, addrlen)) != 0 ||
+ (r = sshbuf_get_u16(b, &dest_port)) != 0) {
+ success = socks_decode_error(c, r, __func__, "addr/port");
+ goto out;
}
dest_addr[addrlen] = '\0';
+
+ /* We have a complete SOCKS5 request; consume it from input */
+ if ((r = sshbuf_consume_upto_child(input, b)) != 0)
+ fatal_fr(r, "channel %d: consume", c->self);
+
free(c->path);
c->path = NULL;
- if (s5_req.atyp == SSH_SOCKS5_DOMAIN) {
- if (addrlen >= NI_MAXHOST) {
- error("channel %d: dynamic request: socks5 hostname "
- "\"%.100s\" too long", c->self, dest_addr);
- return -1;
- }
+ if (socks_atyp == SSH_SOCKS5_DOMAIN)
c->path = xstrdup(dest_addr);
- } else {
+ else {
if (inet_ntop(af, dest_addr, ntop, sizeof(ntop)) == NULL)
return -1;
c->path = xstrdup(ntop);
}
- c->host_port = ntohs(dest_port);
+ c->host_port = dest_port;
debug2("channel %d: dynamic request: socks5 host %s port %u command %u",
- c->self, c->path, c->host_port, s5_req.command);
-
- s5_rsp.version = 0x05;
- s5_rsp.command = SSH_SOCKS5_SUCCESS;
- s5_rsp.reserved = 0; /* ignored */
- s5_rsp.atyp = SSH_SOCKS5_IPV4;
- dest_port = 0; /* ignored */
+ c->self, c->path, c->host_port, socks_cmd);
- if ((r = sshbuf_put(output, &s5_rsp, sizeof(s5_rsp))) != 0 ||
- (r = sshbuf_put_u32(output, ntohl(INADDR_ANY))) != 0 ||
- (r = sshbuf_put(output, &dest_port, sizeof(dest_port))) != 0)
+ /* Reply */
+ if ((r = sshbuf_put_u8(output, 0x05)) != 0 || /* version */
+ (r = sshbuf_put_u8(output, SSH_SOCKS5_SUCCESS)) != 0 || /* cmd */
+ (r = sshbuf_put_u8(output, 0)) != 0 || /* reserved, ignored */
+ (r = sshbuf_put_u8(output, SSH_SOCKS5_IPV4)) != 0 || /* addrtype */
+ (r = sshbuf_put_u32(output, ntohl(INADDR_ANY))) != 0 || /* addr */
+ (r = sshbuf_put_u16(output, dest_port)) != 0) /* port */
fatal_fr(r, "channel %d: append reply", c->self);
- return 1;
+
+ /* success */
+ success = 1;
+ out:
+ sshbuf_free(b);
+ return success;
}
Channel *
@@ -1783,9 +1787,9 @@ channel_connect_stdio_fwd(struct ssh *ssh,
static void
channel_pre_dynamic(struct ssh *ssh, Channel *c)
{
- const u_char *p;
u_int have;
- int ret;
+ u_char ver;
+ int r, ret;
c->io_want = 0;
have = sshbuf_len(c->input);
@@ -1798,9 +1802,9 @@ channel_pre_dynamic(struct ssh *ssh, Channel *c)
return;
}
/* try to guess the protocol */
- p = sshbuf_ptr(c->input);
- /* XXX sshbuf_peek_u8? */
- switch (p[0]) {
+ if ((r = sshbuf_peek_u8(c->input, 0, &ver)) != 0)
+ fatal_fr(r, "sshbuf_peek_u8");
+ switch (ver) {
case 0x04:
ret = channel_decode_socks4(c, c->input, c->output);
break;
@@ -1808,6 +1812,7 @@ channel_pre_dynamic(struct ssh *ssh, Channel *c)
ret = channel_decode_socks5(c, c->input, c->output);
break;
default:
+ debug2_f("channel %d: unknown SOCKS version %u", c->self, ver);
ret = -1;
break;
}
@@ -2092,7 +2097,8 @@ channel_post_auth_listener(struct ssh *ssh, Channel *c)
SSH_CHANNEL_OPENING, newsock, newsock, -1,
c->local_window_max, c->local_maxpacket,
0, "accepted auth socket", 1);
- open_preamble(ssh, __func__, nc, "auth-agent@openssh.com");
+ open_preamble(ssh, __func__, nc,
+ c->agent_new ? "agent-connect" : "auth-agent@openssh.com");
if ((r = sshpkt_send(ssh)) != 0)
fatal_fr(r, "channel %i", c->self);
}
@@ -3357,7 +3363,7 @@ channel_proxy_downstream(struct ssh *ssh, Channel *downstream)
* replaces local (proxy) channel ID with downstream channel ID.
*/
int
-channel_proxy_upstream(Channel *c, int type, u_int32_t seq, struct ssh *ssh)
+channel_proxy_upstream(Channel *c, int type, uint32_t seq, struct ssh *ssh)
{
struct sshbuf *b = NULL;
Channel *downstream;
@@ -3440,7 +3446,7 @@ channel_proxy_upstream(Channel *c, int type, u_int32_t seq, struct ssh *ssh)
static int
channel_parse_id(struct ssh *ssh, const char *where, const char *what)
{
- u_int32_t id;
+ uint32_t id;
int r;
if ((r = sshpkt_get_u32(ssh, &id)) != 0) {
@@ -3469,7 +3475,7 @@ channel_from_packet_id(struct ssh *ssh, const char *where, const char *what)
}
int
-channel_input_data(int type, u_int32_t seq, struct ssh *ssh)
+channel_input_data(int type, uint32_t seq, struct ssh *ssh)
{
const u_char *data;
size_t data_len, win_len;
@@ -3501,7 +3507,10 @@ channel_input_data(int type, u_int32_t seq, struct ssh *ssh)
* updates are sent back. Otherwise the connection might deadlock.
*/
if (c->ostate != CHAN_OUTPUT_OPEN) {
- c->local_window -= win_len;
+ if (win_len > c->local_window)
+ c->local_window = 0;
+ else
+ c->local_window -= win_len;
c->local_consumed += win_len;
return 0;
}
@@ -3537,11 +3546,11 @@ channel_input_data(int type, u_int32_t seq, struct ssh *ssh)
}
int
-channel_input_extended_data(int type, u_int32_t seq, struct ssh *ssh)
+channel_input_extended_data(int type, uint32_t seq, struct ssh *ssh)
{
const u_char *data;
size_t data_len;
- u_int32_t tcode;
+ uint32_t tcode;
Channel *c = channel_from_packet_id(ssh, __func__, "extended data");
int r;
@@ -3590,7 +3599,7 @@ channel_input_extended_data(int type, u_int32_t seq, struct ssh *ssh)
}
int
-channel_input_ieof(int type, u_int32_t seq, struct ssh *ssh)
+channel_input_ieof(int type, uint32_t seq, struct ssh *ssh)
{
Channel *c = channel_from_packet_id(ssh, __func__, "ieof");
int r;
@@ -3615,7 +3624,7 @@ channel_input_ieof(int type, u_int32_t seq, struct ssh *ssh)
}
int
-channel_input_oclose(int type, u_int32_t seq, struct ssh *ssh)
+channel_input_oclose(int type, uint32_t seq, struct ssh *ssh)
{
Channel *c = channel_from_packet_id(ssh, __func__, "oclose");
int r;
@@ -3631,10 +3640,10 @@ channel_input_oclose(int type, u_int32_t seq, struct ssh *ssh)
}
int
-channel_input_open_confirmation(int type, u_int32_t seq, struct ssh *ssh)
+channel_input_open_confirmation(int type, uint32_t seq, struct ssh *ssh)
{
Channel *c = channel_from_packet_id(ssh, __func__, "open confirmation");
- u_int32_t remote_window, remote_maxpacket;
+ uint32_t remote_window, remote_maxpacket;
int r;
if (channel_proxy_upstream(c, type, seq, ssh))
@@ -3686,10 +3695,10 @@ reason2txt(int reason)
}
int
-channel_input_open_failure(int type, u_int32_t seq, struct ssh *ssh)
+channel_input_open_failure(int type, uint32_t seq, struct ssh *ssh)
{
Channel *c = channel_from_packet_id(ssh, __func__, "open failure");
- u_int32_t reason;
+ uint32_t reason;
char *msg = NULL;
int r;
@@ -3723,11 +3732,11 @@ channel_input_open_failure(int type, u_int32_t seq, struct ssh *ssh)
}
int
-channel_input_window_adjust(int type, u_int32_t seq, struct ssh *ssh)
+channel_input_window_adjust(int type, uint32_t seq, struct ssh *ssh)
{
int id = channel_parse_id(ssh, __func__, "window adjust");
Channel *c;
- u_int32_t adjust;
+ uint32_t adjust;
u_int new_rwin;
int r;
@@ -3753,7 +3762,7 @@ channel_input_window_adjust(int type, u_int32_t seq, struct ssh *ssh)
}
int
-channel_input_status_confirm(int type, u_int32_t seq, struct ssh *ssh)
+channel_input_status_confirm(int type, uint32_t seq, struct ssh *ssh)
{
int id = channel_parse_id(ssh, __func__, "status confirm");
Channel *c;
@@ -4747,7 +4756,7 @@ connect_to_helper(struct ssh *ssh, const char *name, int port, int socktype,
/*
* Fake up a struct addrinfo for AF_UNIX connections.
* channel_connect_ctx_free() must check ai_family
- * and use free() not freeaddirinfo() for AF_UNIX.
+ * and use free() not freeaddrinfo() for AF_UNIX.
*/
ai = xcalloc(1, sizeof(*ai) + sizeof(*sunaddr));
ai->ai_addr = (struct sockaddr *)(ai + 1);
diff --git a/channels.h b/channels.h
index 7456541f8ce3..2fcf9f8cb72b 100644
--- a/channels.h
+++ b/channels.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: channels.h,v 1.162 2025/10/07 08:02:32 djm Exp $ */
+/* $OpenBSD: channels.h,v 1.164 2026/03/05 05:40:35 djm Exp $ */
/*
* Author: Tatu Ylonen <ylo@cs.hut.fi>
@@ -181,6 +181,7 @@ struct Channel {
u_int local_consumed;
u_int local_maxpacket;
int extended_usage;
+ int agent_new; /* For agent listeners, use RFC XXX reqests */
int single_connection;
char *ctype; /* const type - NB. not freed on channel_free */
@@ -304,7 +305,7 @@ void channel_force_close(struct ssh *, Channel *, int);
void channel_set_xtype(struct ssh *, int, const char *);
void channel_send_open(struct ssh *, int);
-void channel_request_start(struct ssh *, int, char *, int);
+void channel_request_start(struct ssh *, int, const char *, int);
void channel_register_cleanup(struct ssh *, int,
channel_callback_fn *, int);
void channel_register_open_confirm(struct ssh *, int,
@@ -325,18 +326,18 @@ void channel_clear_timeouts(struct ssh *);
/* mux proxy support */
int channel_proxy_downstream(struct ssh *, Channel *mc);
-int channel_proxy_upstream(Channel *, int, u_int32_t, struct ssh *);
+int channel_proxy_upstream(Channel *, int, uint32_t, struct ssh *);
/* protocol handler */
-int channel_input_data(int, u_int32_t, struct ssh *);
-int channel_input_extended_data(int, u_int32_t, struct ssh *);
-int channel_input_ieof(int, u_int32_t, struct ssh *);
-int channel_input_oclose(int, u_int32_t, struct ssh *);
-int channel_input_open_confirmation(int, u_int32_t, struct ssh *);
-int channel_input_open_failure(int, u_int32_t, struct ssh *);
-int channel_input_window_adjust(int, u_int32_t, struct ssh *);
-int channel_input_status_confirm(int, u_int32_t, struct ssh *);
+int channel_input_data(int, uint32_t, struct ssh *);
+int channel_input_extended_data(int, uint32_t, struct ssh *);
+int channel_input_ieof(int, uint32_t, struct ssh *);
+int channel_input_oclose(int, uint32_t, struct ssh *);
+int channel_input_open_confirmation(int, uint32_t, struct ssh *);
+int channel_input_open_failure(int, uint32_t, struct ssh *);
+int channel_input_window_adjust(int, uint32_t, struct ssh *);
+int channel_input_status_confirm(int, uint32_t, struct ssh *);
/* file descriptor handling (read/write) */
struct pollfd;
@@ -399,6 +400,9 @@ int x11_channel_used_recently(struct ssh *ssh);
int chan_is_dead(struct ssh *, Channel *, int);
void chan_mark_dead(struct ssh *, Channel *);
+/* agent forwarding */
+void client_channel_reqest_agent_forwarding(struct ssh *, int);
+
/* channel events */
void chan_rcvd_oclose(struct ssh *, Channel *);
diff --git a/cipher-aesctr.c b/cipher-aesctr.c
index eed95c3e6e3c..2a8d446f15d3 100644
--- a/cipher-aesctr.c
+++ b/cipher-aesctr.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cipher-aesctr.c,v 1.2 2015/01/14 10:24:42 markus Exp $ */
+/* $OpenBSD: cipher-aesctr.c,v 1.3 2026/02/09 22:15:45 dtucker Exp $ */
/*
* Copyright (c) 2003 Markus Friedl. All rights reserved.
*
@@ -17,11 +17,11 @@
#include "includes.h"
+#ifndef WITH_OPENSSL
+
#include <sys/types.h>
#include <string.h>
-#ifndef WITH_OPENSSL
-
#include "cipher-aesctr.h"
/*
diff --git a/cipher-chachapoly-libcrypto.c b/cipher-chachapoly-libcrypto.c
index e8d20c288097..73214e6a75b1 100644
--- a/cipher-chachapoly-libcrypto.c
+++ b/cipher-chachapoly-libcrypto.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cipher-chachapoly-libcrypto.c,v 1.2 2023/07/17 05:26:38 djm Exp $ */
+/* $OpenBSD: cipher-chachapoly-libcrypto.c,v 1.3 2026/02/14 00:18:34 jsg Exp $ */
/*
* Copyright (c) 2013 Damien Miller <djm@mindrot.org>
*
@@ -23,13 +23,11 @@
#if defined(HAVE_EVP_CHACHA20) && !defined(HAVE_BROKEN_CHACHA20)
#include <sys/types.h>
-#include <stdarg.h> /* needed for log.h */
#include <string.h>
#include <stdio.h> /* needed for misc.h */
#include <openssl/evp.h>
-#include "log.h"
#include "sshbuf.h"
#include "ssherr.h"
#include "cipher-chachapoly.h"
diff --git a/cipher.c b/cipher.c
index 5e096cebfefa..f770e666cf16 100644
--- a/cipher.c
+++ b/cipher.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cipher.c,v 1.125 2025/09/02 11:08:34 djm Exp $ */
+/* $OpenBSD: cipher.c,v 1.126 2026/02/14 00:18:34 jsg Exp $ */
/*
* Author: Tatu Ylonen <ylo@cs.hut.fi>
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -47,7 +47,6 @@
#include "misc.h"
#include "sshbuf.h"
#include "ssherr.h"
-#include "digest.h"
#include "openbsd-compat/openssl-compat.h"
diff --git a/clientloop.c b/clientloop.c
index 49d048d85a4f..6a0e7b6b8234 100644
--- a/clientloop.c
+++ b/clientloop.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: clientloop.c,v 1.415 2025/09/25 06:23:19 jsg Exp $ */
+/* $OpenBSD: clientloop.c,v 1.422 2026/03/05 05:40:35 djm Exp $ */
/*
* Author: Tatu Ylonen <ylo@cs.hut.fi>
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -64,8 +64,8 @@
#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
-#include <sys/socket.h>
#include <sys/time.h>
+#include <sys/queue.h>
#include <ctype.h>
#include <errno.h>
@@ -76,12 +76,9 @@
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
-#include <termios.h>
-#include <pwd.h>
#include <unistd.h>
#include <limits.h>
-#include "openbsd-compat/sys-queue.h"
#include "xmalloc.h"
#include "ssh.h"
#include "ssh2.h"
@@ -91,9 +88,7 @@
#include "channels.h"
#include "dispatch.h"
#include "sshkey.h"
-#include "cipher.h"
#include "kex.h"
-#include "myproposal.h"
#include "log.h"
#include "misc.h"
#include "readconf.h"
@@ -103,7 +98,6 @@
#include "atomicio.h"
#include "sshpty.h"
#include "match.h"
-#include "msg.h"
#include "ssherr.h"
#include "hostfile.h"
@@ -435,7 +429,7 @@ client_x11_get_proto(struct ssh *ssh, const char *display,
* for the local connection.
*/
if (!got_data) {
- u_int8_t rnd[16];
+ uint8_t rnd[16];
u_int i;
logit("Warning: No xauth data; "
@@ -469,7 +463,7 @@ client_check_window_change(struct ssh *ssh)
}
static int
-client_global_request_reply(int type, u_int32_t seq, struct ssh *ssh)
+client_global_request_reply(int type, uint32_t seq, struct ssh *ssh)
{
struct global_confirm *gc;
@@ -942,7 +936,7 @@ client_repledge(void)
/* Might be able to tighten pledge now that session is established */
if (options.control_master || options.control_path != NULL ||
options.forward_x11 || options.fork_after_authentication ||
- can_update_hostkeys() ||
+ options.pkcs11_provider != NULL || can_update_hostkeys() ||
(session_ident != -1 && !session_setup_complete)) {
/* Can't tighten */
return;
@@ -1125,6 +1119,7 @@ static struct escape_help_text esc_txt[] = {
SUPPRESS_MUXCLIENT},
{"B", "send a BREAK to the remote system", SUPPRESS_NEVER},
{"C", "open a command line", SUPPRESS_MUXCLIENT|SUPPRESS_NOCMDLINE},
+ {"I", "show connection information", SUPPRESS_NEVER},
{"R", "request rekey", SUPPRESS_NEVER},
{"V/v", "decrease/increase verbosity (LogLevel)", SUPPRESS_MUXCLIENT},
{"^Z", "suspend ssh", SUPPRESS_MUXCLIENT},
@@ -1247,6 +1242,16 @@ process_escapes(struct ssh *ssh, Channel *c,
fatal_fr(r, "send packet");
continue;
+ case 'I':
+ if ((r = sshbuf_putf(berr, "%cI\r\n",
+ efc->escape_char)) != 0)
+ fatal_fr(r, "sshbuf_putf");
+ s = connection_info_message(ssh);
+ if ((r = sshbuf_put(berr, s, strlen(s))) != 0)
+ fatal_fr(r, "sshbuf_put");
+ free(s);
+ continue;
+
case 'R':
if (ssh->compat & SSH_BUG_NOREKEY)
logit("Server does not "
@@ -1450,14 +1455,16 @@ client_loop(struct ssh *ssh, int have_pty, int escape_char_arg,
u_int npfd_alloc = 0, npfd_active = 0;
double start_time, total_time;
int interactive = -1, channel_did_enqueue = 0, r;
- u_int64_t ibytes, obytes;
+ uint64_t ibytes, obytes;
int conn_in_ready, conn_out_ready;
sigset_t bsigset, osigset;
debug("Entering interactive session.");
session_ident = ssh2_chan_id;
- if (options.control_master &&
+ if (options.pkcs11_provider != NULL)
+ debug("pledge: disabled (PKCS11Provider active)");
+ else if (options.control_master &&
!option_clear_or_none(options.control_path)) {
debug("pledge: id");
if (pledge("stdio rpath wpath cpath unix inet dns recvfd sendfd proc exec id tty",
@@ -1907,7 +1914,7 @@ client_request_tun_fwd(struct ssh *ssh, int tun_mode,
/* XXXX move to generic input handler */
static int
-client_input_channel_open(int type, u_int32_t seq, struct ssh *ssh)
+client_input_channel_open(int type, uint32_t seq, struct ssh *ssh)
{
Channel *c = NULL;
char *ctype = NULL;
@@ -1932,7 +1939,8 @@ client_input_channel_open(int type, u_int32_t seq, struct ssh *ssh)
c = client_request_forwarded_streamlocal(ssh, ctype, rchan);
} else if (strcmp(ctype, "x11") == 0) {
c = client_request_x11(ssh, ctype, rchan);
- } else if (strcmp(ctype, "auth-agent@openssh.com") == 0) {
+ } else if (strcmp(ctype, "auth-agent@openssh.com") == 0 ||
+ strcmp(ctype, "agent-connect") == 0) {
c = client_request_agent(ssh, ctype, rchan);
}
if (c != NULL && c->type == SSH_CHANNEL_MUX_CLIENT) {
@@ -1969,7 +1977,7 @@ client_input_channel_open(int type, u_int32_t seq, struct ssh *ssh)
}
static int
-client_input_channel_req(int type, u_int32_t seq, struct ssh *ssh)
+client_input_channel_req(int type, uint32_t seq, struct ssh *ssh)
{
Channel *c = NULL;
char *rtype = NULL;
@@ -2347,7 +2355,7 @@ update_known_hosts(struct hostkeys_update_ctx *ctx)
static void
client_global_hostkeys_prove_confirm(struct ssh *ssh, int type,
- u_int32_t seq, void *_ctx)
+ uint32_t seq, void *_ctx)
{
struct hostkeys_update_ctx *ctx = (struct hostkeys_update_ctx *)_ctx;
size_t i, ndone;
@@ -2657,7 +2665,7 @@ client_input_hostkeys(struct ssh *ssh)
}
static int
-client_input_global_request(int type, u_int32_t seq, struct ssh *ssh)
+client_input_global_request(int type, uint32_t seq, struct ssh *ssh)
{
char *rtype;
u_char want_reply;
@@ -2806,6 +2814,20 @@ client_session2_setup(struct ssh *ssh, int id, int want_tty, int want_subsystem,
client_repledge();
}
+void
+client_channel_reqest_agent_forwarding(struct ssh *ssh, int id)
+{
+ const char *req = "auth-agent-req@openssh.com";
+ int r;
+
+ if (ssh->kex != NULL && (ssh->kex->flags & KEX_HAS_NEWAGENT) != 0)
+ req = "agent-req"; /* XXX RFC XXX */
+ debug("Requesting agent forwarding on channel %d via %s", id, req);
+ channel_request_start(ssh, id, req, 0);
+ if ((r = sshpkt_send(ssh)) != 0)
+ fatal_fr(r, "send");
+}
+
static void
client_init_dispatch(struct ssh *ssh)
{
diff --git a/clientloop.h b/clientloop.h
index 4bc7bcd7c4f2..ed3c54fa7239 100644
--- a/clientloop.h
+++ b/clientloop.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: clientloop.h,v 1.38 2024/05/17 06:42:04 jsg Exp $ */
+/* $OpenBSD: clientloop.h,v 1.41 2026/03/03 09:57:25 dtucker Exp $ */
/*
* Author: Tatu Ylonen <ylo@cs.hut.fi>
@@ -55,7 +55,7 @@ void client_filter_cleanup(struct ssh *, int, void *);
int client_simple_escape_filter(struct ssh *, Channel *, char *, int);
/* Global request confirmation callbacks */
-typedef void global_confirm_cb(struct ssh *, int, u_int32_t, void *);
+typedef void global_confirm_cb(struct ssh *, int, uint32_t, void *);
void client_register_global_confirm(global_confirm_cb *, void *);
/* Channel request confirmation callbacks */
@@ -75,6 +75,8 @@ void client_expect_confirm(struct ssh *, int, const char *,
#define SSHMUX_COMMAND_STOP 6 /* Disable mux but not conn */
#define SSHMUX_COMMAND_CANCEL_FWD 7 /* Cancel forwarding(s) */
#define SSHMUX_COMMAND_PROXY 8 /* Open new connection */
+#define SSHMUX_COMMAND_CONNINFO 9 /* Show connection information */
+#define SSHMUX_COMMAND_CHANINFO 10 /* Show channels information */
void muxserver_listen(struct ssh *);
int muxclient(const char *);
diff --git a/compat.c b/compat.c
index b59f0bfc0630..4cc7ca61ae43 100644
--- a/compat.c
+++ b/compat.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: compat.c,v 1.126 2023/03/06 12:14:48 dtucker Exp $ */
+/* $OpenBSD: compat.c,v 1.128 2026/03/02 02:40:15 djm Exp $ */
/*
* Copyright (c) 1999, 2000, 2001, 2002 Markus Friedl. All rights reserved.
*
@@ -27,8 +27,8 @@
#include <sys/types.h>
+#include <stdint.h>
#include <stdlib.h>
-#include <string.h>
#include <stdarg.h>
#include "xmalloc.h"
@@ -44,7 +44,7 @@ compat_banner(struct ssh *ssh, const char *version)
int i;
static struct {
char *pat;
- int bugs;
+ uint32_t bugs;
} check[] = {
{ "OpenSSH_2.*,"
"OpenSSH_3.0*,"
diff --git a/config.h.in b/config.h.in
index eeb1466ffd8b..4c12a6c0dc59 100644
--- a/config.h.in
+++ b/config.h.in
@@ -34,7 +34,7 @@
/* getline is not what we expect */
#undef BROKEN_GETLINE
-/* FreeBSD glob does not do what we need */
+/* Do not use system glob */
#undef BROKEN_GLOB
/* Define if you system's inet_ntoa is busted (e.g. Irix gcc issue) */
@@ -216,6 +216,9 @@
/* Have attribute nonnull */
#undef HAVE_ATTRIBUTE__NONNULL__
+/* compiler supports nonstring attribute */
+#undef HAVE_ATTRIBUTE__NONSTRING__
+
/* OpenBSD's gcc has sentinel */
#undef HAVE_ATTRIBUTE__SENTINEL__
@@ -1052,9 +1055,6 @@
/* Define to 1 if you have the `openpty' function. */
#undef HAVE_OPENPTY
-/* as a macro */
-#undef HAVE_OPENSSL_ADD_ALL_ALGORITHMS
-
/* Define to 1 if you have the `OpenSSL_version' function. */
#undef HAVE_OPENSSL_VERSION
@@ -1623,6 +1623,9 @@
/* Define to 1 if the system has the type `unsigned long long'. */
#undef HAVE_UNSIGNED_LONG_LONG
+/* Define to 1 if you have the `unveil' function. */
+#undef HAVE_UNVEIL
+
/* Define to 1 if you have the `updwtmp' function. */
#undef HAVE_UPDWTMP
@@ -1859,6 +1862,9 @@
/* need inet in pledge for setsockopt IP_TOS */
#undef PLEDGE_EXTRA_INET
+/* Define if poll 2nd arg is ulong */
+#undef POLL_NFDS_T_ULONG
+
/* Port number of PRNGD/EGD random number socket */
#undef PRNGD_PORT
@@ -1929,9 +1935,6 @@
/* sshd PAM service name */
#undef SSHD_PAM_SERVICE
-/* Define if pam_chauthtok wants real uid set to the unpriv'ed user */
-#undef SSHPAM_CHAUTHTOK_NEEDS_RUID
-
/* Use audit debugging module */
#undef SSH_AUDIT_EVENTS
diff --git a/configure b/configure
index 652d7e137570..e2174fc0ff1f 100755
--- a/configure
+++ b/configure
@@ -650,8 +650,10 @@ ac_includes_default="\
ac_header_c_list=
ac_subst_vars='LTLIBOBJS
+COMPATINCLUDES
CFLAGS_NOPIE
LDFLAGS_NOPIE
+TMUX
DROPBEARCONVERT
DROPBEARKEY
DBCLIENT
@@ -689,7 +691,6 @@ LIBEDIT
LDNSCONFIG
LIBOBJS
TESTLIBS
-COMPATINCLUDES
LD
PATH_PASSWD_PROG
STARTUP_SCRIPT_SHELL
@@ -10897,6 +10898,36 @@ printf "%s\n" "no" >&6; }
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+saved_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS -Werror"
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if compiler supports __nonstring__ attribute on char arrays" >&5
+printf %s "checking if compiler supports __nonstring__ attribute on char arrays... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+int
+main (void)
+{
+ char __attribute__ ((__nonstring__)) h[5] = "hello"; return h[0]!='h';
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+
+printf "%s\n" "#define HAVE_ATTRIBUTE__NONSTRING__ 1" >>confdefs.h
+
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+CFLAGS="$saved_CFLAGS"
+
if test "x$no_attrib_nonnull" != "x1" ; then
printf "%s\n" "#define HAVE_ATTRIBUTE__NONNULL__ 1" >>confdefs.h
@@ -11099,12 +11130,6 @@ then :
printf "%s\n" "#define HAVE_GETOPT_H 1" >>confdefs.h
fi
-ac_fn_c_check_header_compile "$LINENO" "glob.h" "ac_cv_header_glob_h" "$ac_includes_default"
-if test "x$ac_cv_header_glob_h" = xyes
-then :
- printf "%s\n" "#define HAVE_GLOB_H 1" >>confdefs.h
-
-fi
ac_fn_c_check_header_compile "$LINENO" "ia.h" "ac_cv_header_ia_h" "$ac_includes_default"
if test "x$ac_cv_header_ia_h" = xyes
then :
@@ -11441,8 +11466,9 @@ fi
# platform. Usually these are just empty, but in some cases they'll include
# the equivalent file. This avoids having to wrap those includes in
# '#ifdef HAVE_FOO_H'. If we create any such headers, add the path to includes.
+COMPATINCLUDESDIR="openbsd-compat/include"
COMPATINCLUDES=""
- for ac_header in endian.h ifaddrs.h libgen.h paths.h netgroup.h nlist.h poll.h stdint.h sys/mman.h sys/stat.h sys/time.h sys/un.h time.h util.h
+ for ac_header in endian.h ifaddrs.h libgen.h paths.h netgroup.h nlist.h poll.h stdint.h sys/mman.h sys/stat.h sys/statvfs.h sys/time.h sys/un.h time.h util.h
do :
as_ac_Header=`printf "%s\n" "ac_cv_header_$ac_header" | $as_tr_sh`
ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
@@ -11452,9 +11478,12 @@ then :
#define `printf "%s\n" "HAVE_$ac_header" | $as_tr_cpp` 1
_ACEOF
+ # Remove any old shims.
+ rm -f "$COMPATINCLUDESDIR/$ac_header"
+
else $as_nop
- COMPATINCLUDES="openbsd-compat/include"
+ COMPATINCLUDES="$COMPATINCLUDESDIR"
header="$COMPATINCLUDES/$ac_header"
dir=`dirname "$header"`
mkdir -p "$dir"
@@ -11469,6 +11498,20 @@ fi
done
+for include in sys/queue.h sys/tree.h; do
+ COMPATINCLUDES="$COMPATINCLUDESDIR"
+ header="$COMPATINCLUDES/$include"
+ dir=`dirname "$header"`
+ mkdir -p "$dir"
+ case "$include" in
+ sys/queue.h)
+ echo '#include "openbsd-compat/sys-queue.h"'
+ ;;
+ sys/tree.h)
+ echo '#include "openbsd-compat/sys-tree.h"'
+ ;;
+ esac >"$header"
+done
ac_fn_check_decl "$LINENO" "le32toh" "ac_cv_have_decl_le32toh" "
#ifdef HAVE_SYS_TYPES_H
@@ -11979,9 +12022,6 @@ printf "%s\n" "#define LOGIN_NEEDS_UTMPX 1" >>confdefs.h
printf "%s\n" "#define SPT_TYPE SPT_REUSEARGV" >>confdefs.h
-printf "%s\n" "#define SSHPAM_CHAUTHTOK_NEEDS_RUID 1" >>confdefs.h
-
-
printf "%s\n" "#define PTY_ZEROREAD 1" >>confdefs.h
@@ -12247,9 +12287,7 @@ fi
printf "%s\n" "#define BROKEN_SETREGID 1" >>confdefs.h
-
-printf "%s\n" "#define BROKEN_GLOB 1" >>confdefs.h
-
+ broken_glob=yes # OS X glob does not do what we expect
printf "%s\n" "#define BIND_8_COMPAT 1" >>confdefs.h
@@ -12917,9 +12955,7 @@ printf "%s\n" "#define SSH_TUN_NO_L2 1" >>confdefs.h
fi
-
-printf "%s\n" "#define BROKEN_GLOB 1" >>confdefs.h
-
+ broken_glob=yes # FreeBSD glob does not do what we need
TEST_MALLOC_OPTIONS="AJRX"
# Preauth crypto occasionally uses file descriptors for crypto offload
# and will crash if they cannot be opened.
@@ -13027,9 +13063,6 @@ fi
printf "%s\n" "#define PAM_TTY_KLUDGE 1" >>confdefs.h
-
-printf "%s\n" "#define SSHPAM_CHAUTHTOK_NEEDS_RUID 1" >>confdefs.h
-
printf "%s\n" "#define LOCKED_PASSWD_STRING \"*LK*\"" >>confdefs.h
# Pushing STREAMS modules will cause sshd to acquire a controlling tty.
@@ -15216,6 +15249,33 @@ printf "%s\n" "#define calloc rpl_calloc" >>confdefs.h
fi
+
+ for ac_func in glob
+do :
+ ac_fn_c_check_func "$LINENO" "glob" "ac_cv_func_glob"
+if test "x$ac_cv_func_glob" = xyes
+then :
+ printf "%s\n" "#define HAVE_GLOB 1" >>confdefs.h
+ for ac_header in glob.h
+do :
+ ac_fn_c_check_header_compile "$LINENO" "glob.h" "ac_cv_header_glob_h" "$ac_includes_default"
+if test "x$ac_cv_header_glob_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_GLOB_H 1" >>confdefs.h
+ use_system_glob=yes
+else $as_nop
+ use_system_glob=no
+fi
+
+done
+
+else $as_nop
+ use_system_glob=no
+
+fi
+
+done
+
# Check for ALTDIRFUNC glob() extension
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GLOB_ALTDIRFUNC support" >&5
printf %s "checking for GLOB_ALTDIRFUNC support... " >&6; }
@@ -15243,6 +15303,7 @@ else $as_nop
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
+ use_system_glob=no
fi
@@ -15276,6 +15337,8 @@ else $as_nop
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
+ use_system_glob=no
+
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
@@ -15313,6 +15376,7 @@ else $as_nop
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
+ use_system_glob=no
fi
@@ -15327,7 +15391,35 @@ else $as_nop
ac_have_decl=0
fi
printf "%s\n" "#define HAVE_DECL_GLOB_NOMATCH $ac_have_decl" >>confdefs.h
+if test $ac_have_decl = 1
+then :
+
+else $as_nop
+ use_system_glob=no
+fi
+
+
+if test "x$broken_glob" = "xyes"; then
+
+printf "%s\n" "#define BROKEN_GLOB 1" >>confdefs.h
+ use_system_glob=no
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can use the system glob" >&5
+printf %s "checking if we can use the system glob... " >&6; }
+if test "x$use_system_glob" = "xyes" ; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ # Remove any old shims.
+ rm -f "$COMPATINCLUDESDIR/glob.h"
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ COMPATINCLUDES="$COMPATINCLUDESDIR"
+ mkdir -p "$COMPATINCLUDES"
+ echo '#include "openbsd-compat/glob.h"' >$COMPATINCLUDES/glob.h
+fi
ac_fn_check_decl "$LINENO" "VIS_ALL" "ac_cv_have_decl_VIS_ALL" "#include <vis.h>
" "$ac_c_undeclared_builtin_options" "CFLAGS"
@@ -16649,12 +16741,6 @@ then :
printf "%s\n" "#define HAVE_GETOPT 1" >>confdefs.h
fi
-ac_fn_c_check_func "$LINENO" "getpagesize" "ac_cv_func_getpagesize"
-if test "x$ac_cv_func_getpagesize" = xyes
-then :
- printf "%s\n" "#define HAVE_GETPAGESIZE 1" >>confdefs.h
-
-fi
ac_fn_c_check_func "$LINENO" "getpeereid" "ac_cv_func_getpeereid"
if test "x$ac_cv_func_getpeereid" = xyes
then :
@@ -16703,12 +16789,6 @@ then :
printf "%s\n" "#define HAVE_GETTTYENT 1" >>confdefs.h
fi
-ac_fn_c_check_func "$LINENO" "glob" "ac_cv_func_glob"
-if test "x$ac_cv_func_glob" = xyes
-then :
- printf "%s\n" "#define HAVE_GLOB 1" >>confdefs.h
-
-fi
ac_fn_c_check_func "$LINENO" "group_from_gid" "ac_cv_func_group_from_gid"
if test "x$ac_cv_func_group_from_gid" = xyes
then :
@@ -17183,6 +17263,12 @@ then :
printf "%s\n" "#define HAVE_UNSETENV 1" >>confdefs.h
fi
+ac_fn_c_check_func "$LINENO" "unveil" "ac_cv_func_unveil"
+if test "x$ac_cv_func_unveil" = xyes
+then :
+ printf "%s\n" "#define HAVE_UNVEIL 1" >>confdefs.h
+
+fi
ac_fn_c_check_func "$LINENO" "updwtmpx" "ac_cv_func_updwtmpx"
if test "x$ac_cv_func_updwtmpx" = xyes
then :
@@ -19187,7 +19273,37 @@ if ac_fn_c_try_link "$LINENO"
then :
else $as_nop
- as_fn_error $? "*** working libcrypto not found, check config.log" "$LINENO" 5
+
+ # As of early 2026, BoringSSL libcrypto needs -lstdc++ for
+ # destructors so try that before giving up.
+ LIBS="$LIBS -lstdc++"
+ CHANNELLIBS="$CHANNELLIBS -lstdc++"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char RAND_add ();
+int
+main (void)
+{
+return RAND_add ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+
+else $as_nop
+
+ as_fn_error $? "*** working libcrypto not found, check config.log" "$LINENO" 5
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
@@ -19577,27 +19693,6 @@ then :
fi
- # OpenSSL_add_all_algorithms may be a macro.
- ac_fn_c_check_func "$LINENO" "OpenSSL_add_all_algorithms" "ac_cv_func_OpenSSL_add_all_algorithms"
-if test "x$ac_cv_func_OpenSSL_add_all_algorithms" = xyes
-then :
-
-printf "%s\n" "#define HAVE_OPENSSL_ADD_ALL_ALGORITHMS 1" >>confdefs.h
-
-else $as_nop
- ac_fn_check_decl "$LINENO" "OpenSSL_add_all_algorithms" "ac_cv_have_decl_OpenSSL_add_all_algorithms" "#include <openssl/evp.h>
-
-" "$ac_c_undeclared_builtin_options" "CFLAGS"
-if test "x$ac_cv_have_decl_OpenSSL_add_all_algorithms" = xyes
-then :
-
-printf "%s\n" "#define HAVE_OPENSSL_ADD_ALL_ALGORITHMS 1" >>confdefs.h
-
-fi
-
-fi
-
-
# LibreSSL/OpenSSL API differences
ac_fn_c_check_func "$LINENO" "EC_POINT_get_affine_coordinates" "ac_cv_func_EC_POINT_get_affine_coordinates"
if test "x$ac_cv_func_EC_POINT_get_affine_coordinates" = xyes
@@ -20016,6 +20111,10 @@ printf %s "checking whether OpenSSL has ED25519 support... " >&6; }
#include <string.h>
#include <openssl/evp.h>
+ #include <openssl/opensslconf.h>
+ #ifdef OPENSSL_NO_EC
+ # error "OpenSSL has no EC support."
+ #endif
int
main (void)
@@ -20894,6 +20993,44 @@ printf "%s\n" "#define HAVE_NFDS_T 1" >>confdefs.h
fi
+if test "x$ac_cv_type_nfds_t" != "xyes"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if poll nfds_t is unsigned long" >&5
+printf %s "checking if poll nfds_t is unsigned long... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <sys/types.h>
+#ifdef HAVE_POLL_H
+#include <poll.h>
+#endif
+#ifdef HAVE_SYS_POLL_H
+#include <sys/poll.h>
+#endif
+ int poll(struct pollfd *, unsigned long, int timeout);
+
+int
+main (void)
+{
+return poll(0, 0, 0);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+
+printf "%s\n" "#define POLL_NFDS_T_ULONG 1" >>confdefs.h
+
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
# Decide which sandbox style to use
sandbox_arg=""
@@ -26850,6 +26987,51 @@ printf "%s\n" "no" >&6; }
fi
+# Extract the first word of "tmux", so it can be a program name with args.
+set dummy tmux; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_TMUX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ case $TMUX in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_TMUX="$TMUX" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_path_TMUX="$as_dir$ac_word$ac_exec_ext"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+TMUX=$ac_cv_path_TMUX
+if test -n "$TMUX"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $TMUX" >&5
+printf "%s\n" "$TMUX" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
CFLAGS="${CFLAGS} ${CFLAGS_AFTER}"
LDFLAGS="${LDFLAGS} ${LDFLAGS_AFTER}"
@@ -26861,6 +27043,7 @@ CFLAGS_NOPIE=`echo "$CFLAGS" | sed 's/^-fPIE //;s/ -fPIE//g'`
+
ac_config_files="$ac_config_files Makefile buildpkg.sh opensshd.init openssh.xml openbsd-compat/Makefile openbsd-compat/regress/Makefile survey.sh"
cat >confcache <<\_ACEOF
diff --git a/configure.ac b/configure.ac
index 916ba032e36d..a8e9df66bddc 100644
--- a/configure.ac
+++ b/configure.ac
@@ -358,6 +358,19 @@ AC_COMPILE_IFELSE(
[ AC_MSG_RESULT([no]) ]
)
+saved_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS -Werror"
+AC_MSG_CHECKING([if compiler supports __nonstring__ attribute on char arrays])
+AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[#include <stdlib.h>]],
+ [[ char __attribute__ ((__nonstring__)) h[5] = "hello"; return h[0]!='h'; ]])],
+ [ AC_MSG_RESULT([yes])
+ AC_DEFINE(HAVE_ATTRIBUTE__NONSTRING__, [1],
+ [compiler supports nonstring attribute]) ],
+ [ AC_MSG_RESULT([no]) ]
+)
+CFLAGS="$saved_CFLAGS"
+
if test "x$no_attrib_nonnull" != "x1" ; then
AC_DEFINE([HAVE_ATTRIBUTE__NONNULL__], [1], [Have attribute nonnull])
fi
@@ -464,7 +477,6 @@ AC_CHECK_HEADERS([ \
floatingpoint.h \
fnmatch.h \
getopt.h \
- glob.h \
ia.h \
iaf.h \
inttypes.h \
@@ -526,6 +538,7 @@ AC_CHECK_HEADERS([ \
# platform. Usually these are just empty, but in some cases they'll include
# the equivalent file. This avoids having to wrap those includes in
# '#ifdef HAVE_FOO_H'. If we create any such headers, add the path to includes.
+COMPATINCLUDESDIR="openbsd-compat/include"
COMPATINCLUDES=""
AC_CHECK_HEADERS([ \
endian.h \
@@ -538,11 +551,16 @@ AC_CHECK_HEADERS([ \
stdint.h \
sys/mman.h \
sys/stat.h \
+ sys/statvfs.h \
sys/time.h \
sys/un.h \
time.h \
- util.h], [], [
- COMPATINCLUDES="openbsd-compat/include"
+ util.h \
+ ], [
+ # Remove any old shims.
+ rm -f "$COMPATINCLUDESDIR/$ac_header"
+ ], [
+ COMPATINCLUDES="$COMPATINCLUDESDIR"
header="$COMPATINCLUDES/$ac_header"
dir=`dirname "$header"`
mkdir -p "$dir"
@@ -553,7 +571,22 @@ AC_CHECK_HEADERS([ \
*) ;;
esac >"$header"
])
-AC_SUBST([COMPATINCLUDES])
+
+dnl Now create replacement headers for those that we always want to shim.
+for include in sys/queue.h sys/tree.h; do
+ COMPATINCLUDES="$COMPATINCLUDESDIR"
+ header="$COMPATINCLUDES/$include"
+ dir=`dirname "$header"`
+ mkdir -p "$dir"
+ case "$include" in
+ sys/queue.h)
+ echo '#include "openbsd-compat/sys-queue.h"'
+ ;;
+ sys/tree.h)
+ echo '#include "openbsd-compat/sys-tree.h"'
+ ;;
+ esac >"$header"
+done
AC_CHECK_DECLS([le32toh, le64toh, htole64], [], [], [
#ifdef HAVE_SYS_TYPES_H
@@ -746,8 +779,6 @@ case "$host" in
AC_DEFINE([SPT_TYPE], [SPT_REUSEARGV],
[Define to a Set Process Title type if your system is
supported by bsd-setproctitle.c])
- AC_DEFINE([SSHPAM_CHAUTHTOK_NEEDS_RUID], [1],
- [AIX 5.2 and 5.3 (and presumably newer) require this])
AC_DEFINE([PTY_ZEROREAD], [1], [read(1) can return 0 for a non-closed fd])
AC_DEFINE([PLATFORM_SYS_DIR_UID], 2, [System dirs owned by bin (uid 2)])
AC_DEFINE([BROKEN_STRNDUP], 1, [strndup broken, see APAR IY61211])
@@ -805,7 +836,7 @@ int main(void) { if (NSVersionOfRunTimeLibrary("System") >= (60 << 16))
AC_DEFINE([SETEUID_BREAKS_SETUID])
AC_DEFINE([BROKEN_SETREUID])
AC_DEFINE([BROKEN_SETREGID])
- AC_DEFINE([BROKEN_GLOB], [1], [OS X glob does not do what we expect])
+ broken_glob=yes # OS X glob does not do what we expect
AC_DEFINE_UNQUOTED([BIND_8_COMPAT], [1],
[Define if your resolver libs need this for getrrsetbyname])
AC_DEFINE([SSH_TUN_FREEBSD], [1], [Open tunnel devices the FreeBSD way])
@@ -1123,7 +1154,7 @@ mips-sony-bsd|mips-sony-newsos4)
[Use tunnel device compatibility to OpenBSD])
AC_CHECK_HEADER([net/if_tap.h], ,
AC_DEFINE([SSH_TUN_NO_L2], [1], [No layer 2 tunnel support]))
- AC_DEFINE([BROKEN_GLOB], [1], [FreeBSD glob does not do what we need])
+ broken_glob=yes # FreeBSD glob does not do what we need
TEST_MALLOC_OPTIONS="AJRX"
# Preauth crypto occasionally uses file descriptors for crypto offload
# and will crash if they cannot be opened.
@@ -1187,9 +1218,6 @@ if (setsockopt(s, IPPROTO_IP, IP_TOS, &one, sizeof(one)) == -1)
AC_DEFINE([PAM_SUN_CODEBASE])
AC_DEFINE([LOGIN_NEEDS_UTMPX])
AC_DEFINE([PAM_TTY_KLUDGE])
- AC_DEFINE([SSHPAM_CHAUTHTOK_NEEDS_RUID], [1],
- [Define if pam_chauthtok wants real uid set
- to the unpriv'ed user])
AC_DEFINE([LOCKED_PASSWD_STRING], ["*LK*"])
# Pushing STREAMS modules will cause sshd to acquire a controlling tty.
AC_DEFINE([SSHD_ACQUIRES_CTTY], [1],
@@ -1678,6 +1706,15 @@ else
[Define to rpl_calloc if the replacement function should be used.])
fi
+dnl Figure out if we have a system glob, and if so if we can use it.
+AC_CHECK_FUNCS([glob],
+ [ AC_CHECK_HEADERS([glob.h],
+ [use_system_glob=yes],
+ [use_system_glob=no])
+ ],
+ use_system_glob=no
+)
+
# Check for ALTDIRFUNC glob() extension
AC_MSG_CHECKING([for GLOB_ALTDIRFUNC support])
AC_EGREP_CPP([FOUNDIT],
@@ -1695,6 +1732,7 @@ AC_EGREP_CPP([FOUNDIT],
],
[
AC_MSG_RESULT([no])
+ use_system_glob=no
]
)
@@ -1709,7 +1747,9 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include <glob.h> ]],
AC_MSG_RESULT([yes])
], [
AC_MSG_RESULT([no])
-])
+ use_system_glob=no
+ ]
+)
# Check for g.gl_statv glob() extension
AC_MSG_CHECKING([for gl_statv and GLOB_KEEPSTAT extensions for glob])
@@ -1727,10 +1767,30 @@ g.gl_statv = NULL;
AC_MSG_RESULT([yes])
], [
AC_MSG_RESULT([no])
+ use_system_glob=no
+ ]
+)
-])
+AC_CHECK_DECLS([GLOB_NOMATCH], , [use_system_glob=no], [#include <glob.h>])
-AC_CHECK_DECLS([GLOB_NOMATCH], , , [#include <glob.h>])
+if test "x$broken_glob" = "xyes"; then
+ AC_DEFINE([BROKEN_GLOB], [1], [Do not use system glob])
+ use_system_glob=no
+fi
+
+dnl If we don't have a system glob, or we do but we're not using it, then
+dnl create a glob.h shim so we don't have to sprinkle ifdefs everywhere.
+AC_MSG_CHECKING([if we can use the system glob])
+if test "x$use_system_glob" = "xyes" ; then
+ AC_MSG_RESULT([yes])
+ # Remove any old shims.
+ rm -f "$COMPATINCLUDESDIR/glob.h"
+else
+ AC_MSG_RESULT([no])
+ COMPATINCLUDES="$COMPATINCLUDESDIR"
+ mkdir -p "$COMPATINCLUDES"
+ echo '#include "openbsd-compat/glob.h"' >$COMPATINCLUDES/glob.h
+fi
AC_CHECK_DECL([VIS_ALL], ,
AC_DEFINE(BROKEN_STRNVIS, 1, [missing VIS_ALL]), [#include <vis.h>])
@@ -2080,7 +2140,6 @@ AC_CHECK_FUNCS([ \
getline \
getnameinfo \
getopt \
- getpagesize \
getpeereid \
getpeerucred \
getpgid \
@@ -2089,7 +2148,6 @@ AC_CHECK_FUNCS([ \
getrandom \
getsid \
getttyent \
- glob \
group_from_gid \
inet_aton \
inet_ntoa \
@@ -2169,6 +2227,7 @@ AC_CHECK_FUNCS([ \
truncate \
unlinkat \
unsetenv \
+ unveil \
updwtmpx \
utimensat \
user_from_uid \
@@ -2958,8 +3017,15 @@ nocrypto_saved_LIBS="$LIBS"
if test "x$openssl" = "xyes" ; then
LIBS="-lcrypto $LIBS"
CHANNELLIBS="-lcrypto $CHANNELLIBS"
- AC_TRY_LINK_FUNC([RAND_add], ,
- [AC_MSG_ERROR([*** working libcrypto not found, check config.log])])
+ AC_TRY_LINK_FUNC([RAND_add], , [
+ # As of early 2026, BoringSSL libcrypto needs -lstdc++ for
+ # destructors so try that before giving up.
+ LIBS="$LIBS -lstdc++"
+ CHANNELLIBS="$CHANNELLIBS -lstdc++"
+ AC_TRY_LINK_FUNC([RAND_add], , [
+ AC_MSG_ERROR([*** working libcrypto not found, check config.log])
+ ])
+ ])
AC_CHECK_HEADER([openssl/opensslv.h], ,
[AC_MSG_ERROR([*** OpenSSL headers missing - please install first or check config.log ***])])
@@ -3160,15 +3226,6 @@ if test "x$openssl" = "xyes" ; then
RSA_get_default_method \
])
- # OpenSSL_add_all_algorithms may be a macro.
- AC_CHECK_FUNC(OpenSSL_add_all_algorithms,
- AC_DEFINE(HAVE_OPENSSL_ADD_ALL_ALGORITHMS, 1, [as a function]),
- AC_CHECK_DECL(OpenSSL_add_all_algorithms,
- AC_DEFINE(HAVE_OPENSSL_ADD_ALL_ALGORITHMS, 1, [as a macro]), ,
- [[#include <openssl/evp.h>]]
- )
- )
-
# LibreSSL/OpenSSL API differences
AC_CHECK_FUNCS([ \
EC_POINT_get_affine_coordinates \
@@ -3357,6 +3414,10 @@ if test "x$openssl" = "xyes" ; then
[AC_LANG_PROGRAM([[
#include <string.h>
#include <openssl/evp.h>
+ #include <openssl/opensslconf.h>
+ #ifdef OPENSSL_NO_EC
+ # error "OpenSSL has no EC support."
+ #endif
]], [[
unsigned char buf[64];
memset(buf, 0, sizeof(buf));
@@ -5825,6 +5886,7 @@ AC_PATH_PROG([DROPBEAR], [dropbear])
AC_PATH_PROG([DBCLIENT], [dbclient])
AC_PATH_PROG([DROPBEARKEY], [dropbearkey])
AC_PATH_PROG([DROPBEARCONVERT], [dropbearconvert])
+AC_PATH_PROG([TMUX], [tmux])
CFLAGS="${CFLAGS} ${CFLAGS_AFTER}"
LDFLAGS="${LDFLAGS} ${LDFLAGS_AFTER}"
@@ -5834,6 +5896,7 @@ LDFLAGS_NOPIE=`echo "$LDFLAGS" | sed 's/^-pie //;s/ -pie//g'`
CFLAGS_NOPIE=`echo "$CFLAGS" | sed 's/^-fPIE //;s/ -fPIE//g'`
AC_SUBST([LDFLAGS_NOPIE])
AC_SUBST([CFLAGS_NOPIE])
+AC_SUBST([COMPATINCLUDES])
AC_EXEEXT
AC_CONFIG_FILES([Makefile buildpkg.sh opensshd.init openssh.xml \
diff --git a/contrib/redhat/openssh.spec b/contrib/redhat/openssh.spec
index 9a84728556de..735d532d04aa 100644
--- a/contrib/redhat/openssh.spec
+++ b/contrib/redhat/openssh.spec
@@ -1,4 +1,4 @@
-%global ver 10.2p1
+%global ver 10.3p1
%global rel 1%{?dist}
# OpenSSH privilege separation requires a user & group ID
diff --git a/contrib/suse/openssh.spec b/contrib/suse/openssh.spec
index 46514234dedb..1ca2db16a14d 100644
--- a/contrib/suse/openssh.spec
+++ b/contrib/suse/openssh.spec
@@ -13,7 +13,7 @@
Summary: OpenSSH, a free Secure Shell (SSH) protocol implementation
Name: openssh
-Version: 10.2p1
+Version: 10.3p1
URL: https://www.openssh.com/
Release: 1
Source0: openssh-%{version}.tar.gz
diff --git a/crypto_api.h b/crypto_api.h
index 693b67bbc0e7..f5e38b547ff3 100644
--- a/crypto_api.h
+++ b/crypto_api.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: crypto_api.h,v 1.9 2024/09/02 12:13:56 djm Exp $ */
+/* $OpenBSD: crypto_api.h,v 1.10 2025/10/30 23:19:33 djm Exp $ */
/*
* Assembled from generated headers and source files by Markus Friedl.
@@ -27,8 +27,34 @@ typedef uint64_t crypto_uint64;
#define crypto_hash_sha512_BYTES 64U
-int crypto_hash_sha512(unsigned char *, const unsigned char *,
- unsigned long long);
+#ifdef WITH_OPENSSL
+#include <openssl/evp.h>
+static inline int
+crypto_hash_sha512(unsigned char *out, const unsigned char *in,
+ unsigned long long inlen)
+{
+
+ if (!EVP_Digest(in, inlen, out, NULL, EVP_sha512(), NULL))
+ return -1;
+ return 0;
+}
+#else /* WITH_OPENSSL */
+# ifdef HAVE_SHA2_H
+# include <sha2.h>
+# endif
+static inline int
+crypto_hash_sha512(unsigned char *out, const unsigned char *in,
+ unsigned long long inlen)
+{
+
+ SHA2_CTX ctx;
+
+ SHA512Init(&ctx);
+ SHA512Update(&ctx, in, inlen);
+ SHA512Final(out, &ctx);
+ return 0;
+}
+#endif /* WITH_OPENSSL */
#define crypto_sign_ed25519_SECRETKEYBYTES 64U
#define crypto_sign_ed25519_PUBLICKEYBYTES 32U
diff --git a/defines.h b/defines.h
index a1bd6fad345e..1d5bc049863e 100644
--- a/defines.h
+++ b/defines.h
@@ -55,7 +55,6 @@ enum
/*
* Definitions for IP type of service (ip_tos)
*/
-#include <netinet/in_systm.h>
#include <netinet/ip.h>
#ifndef IPTOS_LOWDELAY
# define IPTOS_LOWDELAY 0x10
@@ -95,6 +94,9 @@ enum
# define IPTOS_DSCP_CS6 0xc0
# define IPTOS_DSCP_CS7 0xe0
#endif /* IPTOS_DSCP_CS0 */
+#ifndef IPTOS_DSCP_VA
+# define IPTOS_DSCP_VA 0x2c
+#endif /* IPTOS_DSCP_VA */
#ifndef IPTOS_DSCP_EF
# define IPTOS_DSCP_EF 0xb8
#endif /* IPTOS_DSCP_EF */
@@ -602,6 +604,10 @@ struct winsize {
# define __nonnull__(x)
#endif
+#if !defined(HAVE_ATTRIBUTE__NONSTRING__) && !defined(__nonstring__)
+# define __nonstring__
+#endif
+
#ifndef OSSH_ALIGNBYTES
#define OSSH_ALIGNBYTES (sizeof(int) - 1)
#endif
@@ -977,13 +983,6 @@ struct winsize {
# endif /* gcc version */
#endif /* __predict_true */
-#if defined(HAVE_GLOB_H) && defined(GLOB_HAS_ALTDIRFUNC) && \
- defined(GLOB_HAS_GL_MATCHC) && defined(GLOB_HAS_GL_STATV) && \
- defined(HAVE_DECL_GLOB_NOMATCH) && HAVE_DECL_GLOB_NOMATCH != 0 && \
- !defined(BROKEN_GLOB)
-# define USE_SYSTEM_GLOB
-#endif
-
/*
* sntrup761 uses variable length arrays and c99-style declarations after code,
* so only enable if the compiler supports them.
diff --git a/dh.c b/dh.c
index 168dea1dd648..b291750d89ec 100644
--- a/dh.c
+++ b/dh.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: dh.c,v 1.75 2024/12/03 16:27:53 dtucker Exp $ */
+/* $OpenBSD: dh.c,v 1.76 2026/02/08 19:54:31 dtucker Exp $ */
/*
* Copyright (c) 2000 Niels Provos. All rights reserved.
*
@@ -26,6 +26,7 @@
#include "includes.h"
#ifdef WITH_OPENSSL
+#include "openbsd-compat/openssl-compat.h"
#include <errno.h>
#include <stdarg.h>
@@ -43,8 +44,6 @@
#include "misc.h"
#include "ssherr.h"
-#include "openbsd-compat/openssl-compat.h"
-
static const char *moduli_filename;
void dh_set_moduli_file(const char *filename)
diff --git a/digest-libc.c b/digest-libc.c
index b187bc9faf2c..b26ed27d10d7 100644
--- a/digest-libc.c
+++ b/digest-libc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: digest-libc.c,v 1.8 2025/09/05 09:31:31 dtucker Exp $ */
+/* $OpenBSD: digest-libc.c,v 1.10 2026/03/03 09:57:25 dtucker Exp $ */
/*
* Copyright (c) 2013 Damien Miller <djm@mindrot.org>
* Copyright (c) 2014 Markus Friedl. All rights reserved.
@@ -50,8 +50,8 @@
#include "digest.h"
typedef void md_init_fn(void *mdctx);
-typedef void md_update_fn(void *mdctx, const u_int8_t *m, size_t mlen);
-typedef void md_final_fn(u_int8_t[], void *mdctx);
+typedef void md_update_fn(void *mdctx, const uint8_t *m, size_t mlen);
+typedef void md_final_fn(uint8_t[], void *mdctx);
struct ssh_digest_ctx {
int alg;
@@ -248,14 +248,15 @@ int
ssh_digest_memory(int alg, const void *m, size_t mlen, u_char *d, size_t dlen)
{
struct ssh_digest_ctx *ctx = ssh_digest_start(alg);
+ int ret = 0;
if (ctx == NULL)
return SSH_ERR_INVALID_ARGUMENT;
if (ssh_digest_update(ctx, m, mlen) != 0 ||
ssh_digest_final(ctx, d, dlen) != 0)
- return SSH_ERR_INVALID_ARGUMENT;
+ ret = SSH_ERR_INVALID_ARGUMENT;
ssh_digest_free(ctx);
- return 0;
+ return ret;
}
int
diff --git a/dispatch.c b/dispatch.c
index 430b6afda1d3..dd962a1b48f5 100644
--- a/dispatch.c
+++ b/dispatch.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: dispatch.c,v 1.34 2025/05/21 06:44:24 djm Exp $ */
+/* $OpenBSD: dispatch.c,v 1.35 2026/03/03 09:57:25 dtucker Exp $ */
/*
* Copyright (c) 2000 Markus Friedl. All rights reserved.
*
@@ -37,7 +37,7 @@
#include "ssherr.h"
int
-dispatch_protocol_error(int type, u_int32_t seq, struct ssh *ssh)
+dispatch_protocol_error(int type, uint32_t seq, struct ssh *ssh)
{
int r;
@@ -51,7 +51,7 @@ dispatch_protocol_error(int type, u_int32_t seq, struct ssh *ssh)
}
int
-dispatch_protocol_ignore(int type, u_int32_t seq, struct ssh *ssh)
+dispatch_protocol_ignore(int type, uint32_t seq, struct ssh *ssh)
{
logit_f("type %d seq %u", type, seq);
return 0;
@@ -88,7 +88,7 @@ ssh_dispatch_run(struct ssh *ssh, int mode, volatile sig_atomic_t *done)
{
int r;
u_char type;
- u_int32_t seqnr;
+ uint32_t seqnr;
for (;;) {
if (mode == DISPATCH_BLOCK) {
diff --git a/dispatch.h b/dispatch.h
index a22d7749febb..594804c0f24f 100644
--- a/dispatch.h
+++ b/dispatch.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: dispatch.h,v 1.15 2019/01/19 21:45:31 djm Exp $ */
+/* $OpenBSD: dispatch.h,v 1.16 2026/03/03 09:57:25 dtucker Exp $ */
/*
* Copyright (c) 2000 Markus Friedl. All rights reserved.
@@ -36,10 +36,10 @@ enum {
struct ssh;
-typedef int dispatch_fn(int, u_int32_t, struct ssh *);
+typedef int dispatch_fn(int, uint32_t, struct ssh *);
-int dispatch_protocol_error(int, u_int32_t, struct ssh *);
-int dispatch_protocol_ignore(int, u_int32_t, struct ssh *);
+int dispatch_protocol_error(int, uint32_t, struct ssh *);
+int dispatch_protocol_ignore(int, uint32_t, struct ssh *);
void ssh_dispatch_init(struct ssh *, dispatch_fn *);
void ssh_dispatch_set(struct ssh *, int, dispatch_fn *);
void ssh_dispatch_range(struct ssh *, u_int, u_int, dispatch_fn *);
diff --git a/dns.c b/dns.c
index e8693cee8313..0731254620c2 100644
--- a/dns.c
+++ b/dns.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: dns.c,v 1.46 2025/08/29 03:50:38 djm Exp $ */
+/* $OpenBSD: dns.c,v 1.48 2026/03/03 09:57:25 dtucker Exp $ */
/*
* Copyright (c) 2003 Wesley Griffin. All rights reserved.
@@ -38,7 +38,6 @@
#include "xmalloc.h"
#include "sshkey.h"
-#include "ssherr.h"
#include "dns.h"
#include "log.h"
#include "digest.h"
@@ -78,7 +77,7 @@ dns_result_totext(unsigned int res)
* Caller must free digest which is allocated by sshkey_fingerprint_raw().
*/
static int
-dns_read_key(u_int8_t *algorithm, u_int8_t *digest_type,
+dns_read_key(uint8_t *algorithm, uint8_t *digest_type,
u_char **digest, size_t *digest_len, struct sshkey *key)
{
int r, success = 0;
@@ -126,7 +125,7 @@ dns_read_key(u_int8_t *algorithm, u_int8_t *digest_type,
* Read SSHFP parameters from rdata buffer.
*/
static int
-dns_read_rdata(u_int8_t *algorithm, u_int8_t *digest_type,
+dns_read_rdata(uint8_t *algorithm, uint8_t *digest_type,
u_char **digest, size_t *digest_len, u_char *rdata, int rdata_len)
{
int success = 0;
@@ -194,12 +193,12 @@ verify_host_key_dns(const char *hostname, struct sockaddr *address,
int result;
struct rrsetinfo *fingerprints = NULL;
- u_int8_t hostkey_algorithm;
+ uint8_t hostkey_algorithm;
u_char *hostkey_digest;
size_t hostkey_digest_len;
- u_int8_t dnskey_algorithm;
- u_int8_t dnskey_digest_type;
+ uint8_t dnskey_algorithm;
+ uint8_t dnskey_digest_type;
u_char *dnskey_digest;
size_t dnskey_digest_len;
@@ -299,9 +298,9 @@ int
export_dns_rr(const char *hostname, struct sshkey *key, FILE *f, int generic,
int alg)
{
- u_int8_t rdata_pubkey_algorithm = 0;
- u_int8_t rdata_digest_type = SSHFP_HASH_RESERVED;
- u_int8_t dtype;
+ uint8_t rdata_pubkey_algorithm = 0;
+ uint8_t rdata_digest_type = SSHFP_HASH_RESERVED;
+ uint8_t dtype;
u_char *rdata_digest;
size_t i, rdata_digest_len;
int success = 0;
diff --git a/ed25519-openssl.c b/ed25519-openssl.c
new file mode 100644
index 000000000000..5d1e343d2e69
--- /dev/null
+++ b/ed25519-openssl.c
@@ -0,0 +1,207 @@
+/* $OpenBSD: ed25519-openssl.c,v 1.1 2025/10/30 20:49:10 djm Exp $ */
+/*
+ * Copyright (c) 2025 OpenSSH
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/*
+ * OpenSSL-based implementation of Ed25519 crypto_sign API
+ * Alternative to the internal SUPERCOP-based implementation in ed25519.c
+ */
+
+#include "includes.h"
+
+#ifdef OPENSSL_HAS_ED25519
+
+#include <sys/types.h>
+
+#include <string.h>
+#include <stdint.h>
+#include <limits.h>
+
+#include <openssl/evp.h>
+
+#include "crypto_api.h"
+#include "log.h"
+
+#if crypto_sign_ed25519_SECRETKEYBYTES <= crypto_sign_ed25519_PUBLICKEYBYTES
+#error "crypto_sign_ed25519_SECRETKEYBYTES < crypto_sign_ed25519_PUBLICKEYBYTES"
+#endif
+
+#define SSH_ED25519_RAW_SECRET_KEY_LEN \
+ (crypto_sign_ed25519_SECRETKEYBYTES - crypto_sign_ed25519_PUBLICKEYBYTES)
+
+int
+crypto_sign_ed25519_keypair(unsigned char *pk, unsigned char *sk)
+{
+ EVP_PKEY_CTX *ctx = NULL;
+ EVP_PKEY *pkey = NULL;
+ size_t pklen, sklen;
+ int ret = -1;
+
+ if ((ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_ED25519, NULL)) == NULL) {
+ debug3_f("EVP_PKEY_CTX_new_id failed");
+ goto out;
+ }
+ if (EVP_PKEY_keygen_init(ctx) <= 0) {
+ debug3_f("EVP_PKEY_keygen_init failed");
+ goto out;
+ }
+ if (EVP_PKEY_keygen(ctx, &pkey) <= 0) {
+ debug3_f("EVP_PKEY_keygen failed");
+ goto out;
+ }
+
+ /* Extract public key */
+ pklen = crypto_sign_ed25519_PUBLICKEYBYTES;
+ if (!EVP_PKEY_get_raw_public_key(pkey, pk, &pklen)) {
+ debug3_f("EVP_PKEY_get_raw_public_key failed");
+ goto out;
+ }
+ if (pklen != crypto_sign_ed25519_PUBLICKEYBYTES) {
+ debug3_f("public key length mismatch: %zu", pklen);
+ goto out;
+ }
+
+ sklen = SSH_ED25519_RAW_SECRET_KEY_LEN;
+ /* Extract private key (32 bytes seed) */
+ if (!EVP_PKEY_get_raw_private_key(pkey, sk, &sklen)) {
+ debug3_f("EVP_PKEY_get_raw_private_key failed");
+ goto out;
+ }
+ if (sklen != SSH_ED25519_RAW_SECRET_KEY_LEN) {
+ debug3_f("private key length mismatch: %zu", sklen);
+ goto out;
+ }
+
+ /* Append public key to secret key (SUPERCOP format compatibility) */
+ memcpy(sk + sklen, pk, crypto_sign_ed25519_PUBLICKEYBYTES);
+
+ ret = 0;
+out:
+ EVP_PKEY_free(pkey);
+ EVP_PKEY_CTX_free(ctx);
+ return ret;
+}
+
+int
+crypto_sign_ed25519(unsigned char *sm, unsigned long long *smlen,
+ const unsigned char *m, unsigned long long mlen,
+ const unsigned char *sk)
+{
+ EVP_PKEY *pkey = NULL;
+ EVP_MD_CTX *mdctx = NULL;
+ size_t siglen;
+ int ret = -1;
+
+ /* Create EVP_PKEY from secret key (first 32 bytes are the seed) */
+ if ((pkey = EVP_PKEY_new_raw_private_key(EVP_PKEY_ED25519, NULL,
+ sk, SSH_ED25519_RAW_SECRET_KEY_LEN)) == NULL) {
+ debug3_f("EVP_PKEY_new_raw_private_key failed");
+ goto out;
+ }
+
+ /* Sign the message */
+ if ((mdctx = EVP_MD_CTX_new()) == NULL) {
+ debug3_f("EVP_MD_CTX_new failed");
+ goto out;
+ }
+ if (EVP_DigestSignInit(mdctx, NULL, NULL, NULL, pkey) != 1) {
+ debug3_f("EVP_DigestSignInit failed");
+ goto out;
+ }
+ siglen = crypto_sign_ed25519_BYTES;
+ if (EVP_DigestSign(mdctx, sm, &siglen, m, mlen) != 1) {
+ debug3_f("EVP_DigestSign failed");
+ goto out;
+ }
+ if (siglen != crypto_sign_ed25519_BYTES) {
+ debug3_f("signature length mismatch: %zu", siglen);
+ goto out;
+ }
+
+ /* Append message after signature (SUPERCOP format) */
+ if (mlen > ULLONG_MAX - siglen) {
+ debug3_f("message length overflow: siglen=%zu mlen=%llu",
+ siglen, mlen);
+ goto out;
+ }
+ memmove(sm + siglen, m, mlen);
+ *smlen = siglen + mlen;
+
+ ret = 0;
+out:
+ EVP_MD_CTX_free(mdctx);
+ EVP_PKEY_free(pkey);
+ return ret;
+}
+
+int
+crypto_sign_ed25519_open(unsigned char *m, unsigned long long *mlen,
+ const unsigned char *sm, unsigned long long smlen,
+ const unsigned char *pk)
+{
+ EVP_PKEY *pkey = NULL;
+ EVP_MD_CTX *mdctx = NULL;
+ int ret = -1;
+ const unsigned char *msg;
+ size_t msglen;
+
+ if (smlen < crypto_sign_ed25519_BYTES) {
+ debug3_f("signed message bad length: %llu", smlen);
+ return -1;
+ }
+ /* Signature is first crypto_sign_ed25519_BYTES, message follows */
+ msg = sm + crypto_sign_ed25519_BYTES;
+ msglen = smlen - crypto_sign_ed25519_BYTES;
+
+ /* Make sure the message buffer is big enough. */
+ if (*mlen < msglen) {
+ debug_f("message bad length: %llu", *mlen);
+ return -1;
+ }
+
+ /* Create EVP_PKEY from public key */
+ if ((pkey = EVP_PKEY_new_raw_public_key(EVP_PKEY_ED25519, NULL,
+ pk, crypto_sign_ed25519_PUBLICKEYBYTES)) == NULL) {
+ debug3_f("EVP_PKEY_new_raw_public_key failed");
+ goto out;
+ }
+
+ if ((mdctx = EVP_MD_CTX_new()) == NULL) {
+ debug3_f("EVP_MD_CTX_new failed");
+ goto out;
+ }
+ if (EVP_DigestVerifyInit(mdctx, NULL, NULL, NULL, pkey) <= 0) {
+ debug3_f("EVP_DigestVerifyInit failed");
+ goto out;
+ }
+ if (EVP_DigestVerify(mdctx, sm, crypto_sign_ed25519_BYTES,
+ msg, msglen) != 1) {
+ debug3_f("EVP_DigestVerify failed");
+ goto out;
+ }
+
+ /* Copy message out */
+ *mlen = msglen;
+ memmove(m, msg, msglen);
+
+ ret = 0;
+out:
+ EVP_MD_CTX_free(mdctx);
+ EVP_PKEY_free(pkey);
+ return ret;
+}
+
+#endif /* OPENSSL_HAS_ED25519 */
diff --git a/ed25519.c b/ed25519.c
index 0e167ae1f6bc..2452dff0f62d 100644
--- a/ed25519.c
+++ b/ed25519.c
@@ -11,6 +11,8 @@
#include "includes.h"
+#ifndef OPENSSL_HAS_ED25519
+
#include <string.h>
#include "crypto_api.h"
@@ -2028,3 +2030,5 @@ badsig:
memset(m,0,smlen);
return -1;
}
+
+#endif /* OPENSSL_HAS_ED25519 */
diff --git a/entropy.c b/entropy.c
index 842c66fd6d0f..4e946ea3b987 100644
--- a/entropy.c
+++ b/entropy.c
@@ -64,7 +64,8 @@ seed_rng(void)
unsigned char buf[RANDOM_SEED_SIZE];
/* Initialise libcrypto */
- ssh_libcrypto_init();
+ if (ssh_libcrypto_init() != 1)
+ fatal("libcrypto failed to initialize.");
if (!ssh_compatible_openssl(OPENSSL_VERSION_NUMBER,
OpenSSL_version_num()))
@@ -107,3 +108,24 @@ seed_rng(void)
}
#endif /* WITH_OPENSSL */
+
+void
+reseed_prngs(void)
+{
+ uint32_t rnd[256];
+
+#ifdef WITH_OPENSSL
+ RAND_poll();
+#endif
+ arc4random_stir(); /* noop on recent arc4random() implementations */
+ arc4random_buf(rnd, sizeof(rnd)); /* let arc4random notice PID change */
+
+#ifdef WITH_OPENSSL
+ RAND_seed(rnd, sizeof(rnd));
+ /* give libcrypto a chance to notice the PID change */
+ if ((RAND_bytes((u_char *)rnd, 1)) != 1)
+ fatal_f("RAND_bytes failed");
+#endif
+
+ explicit_bzero(rnd, sizeof(rnd));
+}
diff --git a/entropy.h b/entropy.h
index 870164d30e90..45d56a339363 100644
--- a/entropy.h
+++ b/entropy.h
@@ -22,13 +22,12 @@
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef _RANDOMS_H
-#define _RANDOMS_H
+#ifndef _ENTROPY_H
+#define _ENTROPY_H
struct sshbuf;
void seed_rng(void);
-void rexec_send_rng_seed(struct sshbuf *);
-void rexec_recv_rng_seed(struct sshbuf *);
+void reseed_prngs(void);
-#endif /* _RANDOMS_H */
+#endif /* _ENTROPY_H */
diff --git a/gss-genr.c b/gss-genr.c
index 8f1f54afb4be..7088d93b43eb 100644
--- a/gss-genr.c
+++ b/gss-genr.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: gss-genr.c,v 1.30 2025/09/29 21:28:33 dtucker Exp $ */
+/* $OpenBSD: gss-genr.c,v 1.31 2026/02/08 19:54:31 dtucker Exp $ */
/*
* Copyright (c) 2001-2007 Simon Wilkinson. All rights reserved.
diff --git a/gss-serv-krb5.c b/gss-serv-krb5.c
index a151bc1e4ad2..4caac337c1d2 100644
--- a/gss-serv-krb5.c
+++ b/gss-serv-krb5.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: gss-serv-krb5.c,v 1.9 2018/07/09 21:37:55 markus Exp $ */
+/* $OpenBSD: gss-serv-krb5.c,v 1.10 2026/02/08 15:28:01 dtucker Exp $ */
/*
* Copyright (c) 2001-2003 Simon Wilkinson. All rights reserved.
diff --git a/gss-serv.c b/gss-serv.c
index b0e9c3b49fe0..f9ae303b5b14 100644
--- a/gss-serv.c
+++ b/gss-serv.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: gss-serv.c,v 1.33 2025/09/29 21:30:15 dtucker Exp $ */
+/* $OpenBSD: gss-serv.c,v 1.37 2026/02/11 16:57:38 dtucker Exp $ */
/*
* Copyright (c) 2001-2003 Simon Wilkinson. All rights reserved.
@@ -30,12 +30,13 @@
#include <sys/types.h>
#include <sys/param.h>
+#include <sys/queue.h>
+#include <netdb.h>
#include <stdarg.h>
#include <string.h>
#include <unistd.h>
-#include "openbsd-compat/sys-queue.h"
#include "xmalloc.h"
#include "sshkey.h"
#include "hostfile.h"
@@ -106,7 +107,7 @@ ssh_gssapi_acquire_cred(Gssctxt *ctx)
gss_create_empty_oid_set(&status, &oidset);
gss_add_oid_set_member(&status, ctx->oid, &oidset);
- if (gethostname(lname, HOST_NAME_MAX)) {
+ if (gethostname(lname, sizeof(lname))) {
gss_release_oid_set(&status, &oidset);
return (-1);
}
@@ -332,6 +333,11 @@ ssh_gssapi_cleanup_creds(void)
void
ssh_gssapi_storecreds(void)
{
+ if (options.gss_deleg_creds == 0) {
+ debug_f("delegate credential is disabled, doing nothing");
+ return;
+ }
+
if (gssapi_client.mech && gssapi_client.mech->storecreds) {
(*gssapi_client.mech->storecreds)(&gssapi_client);
} else
diff --git a/hash.c b/hash.c
deleted file mode 100644
index b4f8f6c50d5e..000000000000
--- a/hash.c
+++ /dev/null
@@ -1,43 +0,0 @@
-/* $OpenBSD: hash.c,v 1.6 2019/11/29 00:11:21 djm Exp $ */
-/*
- * Public domain. Author: Christian Weisgerber <naddy@openbsd.org>
- * API compatible reimplementation of function from nacl
- */
-
-#include "includes.h"
-
-#include "crypto_api.h"
-
-#include <stdarg.h>
-
-#ifdef WITH_OPENSSL
-#include <openssl/evp.h>
-
-int
-crypto_hash_sha512(unsigned char *out, const unsigned char *in,
- unsigned long long inlen)
-{
-
- if (!EVP_Digest(in, inlen, out, NULL, EVP_sha512(), NULL))
- return -1;
- return 0;
-}
-
-#else
-# ifdef HAVE_SHA2_H
-# include <sha2.h>
-# endif
-
-int
-crypto_hash_sha512(unsigned char *out, const unsigned char *in,
- unsigned long long inlen)
-{
-
- SHA2_CTX ctx;
-
- SHA512Init(&ctx);
- SHA512Update(&ctx, in, inlen);
- SHA512Final(out, &ctx);
- return 0;
-}
-#endif /* WITH_OPENSSL */
diff --git a/hmac.c b/hmac.c
index 8641edf4a6b3..155e534c645e 100644
--- a/hmac.c
+++ b/hmac.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: hmac.c,v 1.15 2025/09/05 09:49:26 dtucker Exp $ */
+/* $OpenBSD: hmac.c,v 1.16 2026/02/14 00:18:34 jsg Exp $ */
/*
* Copyright (c) 2014 Markus Friedl. All rights reserved.
*
@@ -22,7 +22,6 @@
#include <stdlib.h>
#include <string.h>
-#include "sshbuf.h"
#include "digest.h"
#include "hmac.h"
diff --git a/hostfile.c b/hostfile.c
index 4cec57da50c6..033b29104879 100644
--- a/hostfile.c
+++ b/hostfile.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: hostfile.c,v 1.99 2025/05/06 05:40:56 djm Exp $ */
+/* $OpenBSD: hostfile.c,v 1.100 2025/11/25 00:57:04 djm Exp $ */
/*
* Author: Tatu Ylonen <ylo@cs.hut.fi>
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -626,7 +626,7 @@ hostfile_replace_entries(const char *filename, const char *host, const char *ip,
int r, fd, oerrno = 0;
int loglevel = quiet ? SYSLOG_LEVEL_DEBUG1 : SYSLOG_LEVEL_VERBOSE;
struct host_delete_ctx ctx;
- char *fp, *temp = NULL, *back = NULL;
+ char *fp = NULL, *temp = NULL, *back = NULL;
const char *what;
mode_t omask;
size_t i;
@@ -715,6 +715,7 @@ hostfile_replace_entries(const char *filename, const char *host, const char *ip,
host, ip == NULL ? "" : ",", ip == NULL ? "" : ip, filename,
sshkey_ssh_name(keys[i]), fp);
free(fp);
+ fp = NULL;
ctx.modified = 1;
}
fclose(ctx.out);
@@ -755,6 +756,7 @@ hostfile_replace_entries(const char *filename, const char *host, const char *ip,
unlink(temp);
free(temp);
free(back);
+ free(fp);
if (ctx.out != NULL)
fclose(ctx.out);
free(ctx.match_keys);
diff --git a/kex-names.c b/kex-names.c
index a20ce602ab51..751f06cea204 100644
--- a/kex-names.c
+++ b/kex-names.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kex-names.c,v 1.6 2025/09/02 11:08:34 djm Exp $ */
+/* $OpenBSD: kex-names.c,v 1.7 2026/02/14 00:18:34 jsg Exp $ */
/*
* Copyright (c) 2000, 2001 Markus Friedl. All rights reserved.
*
@@ -28,7 +28,6 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <unistd.h>
#include <signal.h>
#ifdef WITH_OPENSSL
@@ -43,7 +42,6 @@
#include "misc.h"
#include "ssherr.h"
-#include "xmalloc.h"
struct kexalg {
char *name;
diff --git a/kex.c b/kex.c
index 814fad9476c2..85b112c75f21 100644
--- a/kex.c
+++ b/kex.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kex.c,v 1.189 2025/09/15 04:40:34 djm Exp $ */
+/* $OpenBSD: kex.c,v 1.193 2026/03/05 05:40:35 djm Exp $ */
/*
* Copyright (c) 2000, 2001 Markus Friedl. All rights reserved.
*
@@ -33,7 +33,6 @@
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
-#include <poll.h>
#ifdef WITH_OPENSSL
#include <openssl/crypto.h>
@@ -54,7 +53,6 @@
#include "match.h"
#include "misc.h"
#include "dispatch.h"
-#include "monitor.h"
#include "myproposal.h"
#include "ssherr.h"
@@ -64,7 +62,7 @@
/* prototype */
static int kex_choose_conf(struct ssh *, uint32_t seq);
-static int kex_input_newkeys(int, u_int32_t, struct ssh *);
+static int kex_input_newkeys(int, uint32_t, struct ssh *);
static const char * const proposal_names[PROPOSAL_MAX] = {
"KEX algorithms",
@@ -231,7 +229,7 @@ kex_prop_free(char **proposal)
}
int
-kex_protocol_error(int type, u_int32_t seq, struct ssh *ssh)
+kex_protocol_error(int type, uint32_t seq, struct ssh *ssh)
{
int r;
@@ -299,13 +297,15 @@ kex_compose_ext_info_server(struct ssh *ssh, struct sshbuf *m)
if (ssh->kex->server_sig_algs == NULL &&
(ssh->kex->server_sig_algs = sshkey_alg_list(0, 1, 1, ',')) == NULL)
return SSH_ERR_ALLOC_FAIL;
- if ((r = sshbuf_put_u32(m, 3)) != 0 ||
+ if ((r = sshbuf_put_u32(m, 4)) != 0 ||
(r = sshbuf_put_cstring(m, "server-sig-algs")) != 0 ||
(r = sshbuf_put_cstring(m, ssh->kex->server_sig_algs)) != 0 ||
(r = sshbuf_put_cstring(m,
"publickey-hostbound@openssh.com")) != 0 ||
(r = sshbuf_put_cstring(m, "0")) != 0 ||
(r = sshbuf_put_cstring(m, "ping@openssh.com")) != 0 ||
+ (r = sshbuf_put_cstring(m, "0")) != 0 ||
+ (r = sshbuf_put_cstring(m, "agent-forward")) != 0 ||
(r = sshbuf_put_cstring(m, "0")) != 0) {
error_fr(r, "compose");
return r;
@@ -449,6 +449,12 @@ kex_ext_info_client_parse(struct ssh *ssh, const char *name,
"0", KEX_HAS_PING)) != 0) {
return r;
}
+ } else if (ssh->kex->ext_info_received == 1 &&
+ strcmp(name, "agent-forward") == 0) {
+ if ((r = kex_ext_info_check_ver(ssh->kex, name, value, vlen,
+ "0", KEX_HAS_NEWAGENT)) != 0) {
+ return r;
+ }
} else
debug_f("%s (unrecognised)", name);
@@ -472,11 +478,11 @@ kex_ext_info_server_parse(struct ssh *ssh, const char *name,
}
int
-kex_input_ext_info(int type, u_int32_t seq, struct ssh *ssh)
+kex_input_ext_info(int type, uint32_t seq, struct ssh *ssh)
{
struct kex *kex = ssh->kex;
const int max_ext_info = kex->server ? 1 : 2;
- u_int32_t i, ninfo;
+ uint32_t i, ninfo;
char *name;
u_char *val;
size_t vlen;
@@ -519,7 +525,7 @@ kex_input_ext_info(int type, u_int32_t seq, struct ssh *ssh)
}
static int
-kex_input_newkeys(int type, u_int32_t seq, struct ssh *ssh)
+kex_input_newkeys(int type, uint32_t seq, struct ssh *ssh)
{
struct kex *kex = ssh->kex;
int r, initial = (kex->flags & KEX_INITIAL) != 0;
@@ -603,7 +609,7 @@ kex_send_kexinit(struct ssh *ssh)
}
int
-kex_input_kexinit(int type, u_int32_t seq, struct ssh *ssh)
+kex_input_kexinit(int type, uint32_t seq, struct ssh *ssh)
{
struct kex *kex = ssh->kex;
const u_char *ptr;
diff --git a/kex.h b/kex.h
index 55baa6a1e641..4f6d92164c7e 100644
--- a/kex.h
+++ b/kex.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: kex.h,v 1.127 2025/08/11 10:55:38 djm Exp $ */
+/* $OpenBSD: kex.h,v 1.129 2026/03/05 05:40:36 djm Exp $ */
/*
* Copyright (c) 2000, 2001 Markus Friedl. All rights reserved.
@@ -114,6 +114,7 @@ enum kex_exchange {
#define KEX_RSA_SHA2_512_SUPPORTED 0x0010 /* only set in server for now */
#define KEX_HAS_PING 0x0020
#define KEX_HAS_EXT_INFO_IN_AUTH 0x0040
+#define KEX_HAS_NEWAGENT 0x0080 /* only set in client */
/* kex->pq */
#define KEX_NOT_PQ 0
@@ -218,9 +219,9 @@ int kex_load_hostkey(struct ssh *, struct sshkey **, struct sshkey **);
int kex_verify_host_key(struct ssh *, struct sshkey *);
int kex_send_kexinit(struct ssh *);
-int kex_input_kexinit(int, u_int32_t, struct ssh *);
-int kex_input_ext_info(int, u_int32_t, struct ssh *);
-int kex_protocol_error(int, u_int32_t, struct ssh *);
+int kex_input_kexinit(int, uint32_t, struct ssh *);
+int kex_input_ext_info(int, uint32_t, struct ssh *);
+int kex_protocol_error(int, uint32_t, struct ssh *);
int kex_derive_keys(struct ssh *, u_char *, u_int, const struct sshbuf *);
int kex_send_newkeys(struct ssh *);
int kex_start_rekex(struct ssh *);
diff --git a/kexdh.c b/kexdh.c
index 191bdced09c7..cbcb2d836771 100644
--- a/kexdh.c
+++ b/kexdh.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kexdh.c,v 1.35 2025/10/03 00:08:02 djm Exp $ */
+/* $OpenBSD: kexdh.c,v 1.36 2026/02/14 00:18:34 jsg Exp $ */
/*
* Copyright (c) 2019 Markus Friedl. All rights reserved.
*
@@ -26,21 +26,18 @@
#include "includes.h"
#ifdef WITH_OPENSSL
+#include "openbsd-compat/openssl-compat.h"
#include <sys/types.h>
#include <stdio.h>
-#include <string.h>
#include <signal.h>
-#include "openbsd-compat/openssl-compat.h"
#include <openssl/bn.h>
#include <openssl/dh.h>
-#include "sshkey.h"
#include "kex.h"
#include "sshbuf.h"
-#include "digest.h"
#include "ssherr.h"
#include "dh.h"
#include "log.h"
diff --git a/kexecdh.c b/kexecdh.c
index 500ec5725edd..6a9058cdc140 100644
--- a/kexecdh.c
+++ b/kexecdh.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kexecdh.c,v 1.11 2025/10/03 00:08:02 djm Exp $ */
+/* $OpenBSD: kexecdh.c,v 1.12 2026/02/14 00:18:34 jsg Exp $ */
/*
* Copyright (c) 2010 Damien Miller. All rights reserved.
* Copyright (c) 2019 Markus Friedl. All rights reserved.
@@ -31,7 +31,6 @@
#include <sys/types.h>
#include <stdio.h>
-#include <string.h>
#include <signal.h>
#include <openssl/bn.h>
@@ -40,7 +39,6 @@
#include "sshkey.h"
#include "kex.h"
#include "sshbuf.h"
-#include "digest.h"
#include "ssherr.h"
static int
diff --git a/kexgen.c b/kexgen.c
index 494d4b233561..5643bc83187f 100644
--- a/kexgen.c
+++ b/kexgen.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kexgen.c,v 1.10 2024/09/09 02:39:57 djm Exp $ */
+/* $OpenBSD: kexgen.c,v 1.12 2026/03/03 09:57:25 dtucker Exp $ */
/*
* Copyright (c) 2019 Markus Friedl. All rights reserved.
*
@@ -41,8 +41,8 @@
#include "digest.h"
#include "ssherr.h"
-static int input_kex_gen_init(int, u_int32_t, struct ssh *);
-static int input_kex_gen_reply(int type, u_int32_t seq, struct ssh *ssh);
+static int input_kex_gen_init(int, uint32_t, struct ssh *);
+static int input_kex_gen_reply(int type, uint32_t seq, struct ssh *ssh);
static int
kex_gen_hash(
@@ -139,7 +139,7 @@ kex_gen_client(struct ssh *ssh)
}
static int
-input_kex_gen_reply(int type, u_int32_t seq, struct ssh *ssh)
+input_kex_gen_reply(int type, uint32_t seq, struct ssh *ssh)
{
struct kex *kex = ssh->kex;
struct sshkey *server_host_key = NULL;
@@ -272,7 +272,7 @@ kex_gen_server(struct ssh *ssh)
}
static int
-input_kex_gen_init(int type, u_int32_t seq, struct ssh *ssh)
+input_kex_gen_init(int type, uint32_t seq, struct ssh *ssh)
{
struct kex *kex = ssh->kex;
struct sshkey *server_host_private, *server_host_public;
diff --git a/kexgex.c b/kexgex.c
index 8040a13202fc..daa5a292daf7 100644
--- a/kexgex.c
+++ b/kexgex.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kexgex.c,v 1.32 2019/01/23 00:30:41 djm Exp $ */
+/* $OpenBSD: kexgex.c,v 1.33 2026/02/14 00:18:34 jsg Exp $ */
/*
* Copyright (c) 2000 Niels Provos. All rights reserved.
* Copyright (c) 2001 Markus Friedl. All rights reserved.
diff --git a/kexgexc.c b/kexgexc.c
index 097d83f3072a..1c2194a8fe30 100644
--- a/kexgexc.c
+++ b/kexgexc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kexgexc.c,v 1.39 2025/10/03 00:08:02 djm Exp $ */
+/* $OpenBSD: kexgexc.c,v 1.42 2026/03/03 09:57:25 dtucker Exp $ */
/*
* Copyright (c) 2000 Niels Provos. All rights reserved.
* Copyright (c) 2001 Markus Friedl. All rights reserved.
@@ -27,10 +27,10 @@
#include "includes.h"
#ifdef WITH_OPENSSL
+#include "openbsd-compat/openssl-compat.h"
#include <sys/types.h>
-#include "openbsd-compat/openssl-compat.h"
#include <openssl/bn.h>
#include <openssl/dh.h>
@@ -40,7 +40,6 @@
#include <signal.h>
#include "sshkey.h"
-#include "cipher.h"
#include "digest.h"
#include "kex.h"
#include "log.h"
@@ -53,8 +52,8 @@
#include "sshbuf.h"
#include "misc.h"
-static int input_kex_dh_gex_group(int, u_int32_t, struct ssh *);
-static int input_kex_dh_gex_reply(int, u_int32_t, struct ssh *);
+static int input_kex_dh_gex_group(int, uint32_t, struct ssh *);
+static int input_kex_dh_gex_reply(int, uint32_t, struct ssh *);
int
kexgex_client(struct ssh *ssh)
@@ -92,7 +91,7 @@ kexgex_client(struct ssh *ssh)
}
static int
-input_kex_dh_gex_group(int type, u_int32_t seq, struct ssh *ssh)
+input_kex_dh_gex_group(int type, uint32_t seq, struct ssh *ssh)
{
struct kex *kex = ssh->kex;
BIGNUM *p = NULL, *g = NULL;
@@ -142,7 +141,7 @@ out:
}
static int
-input_kex_dh_gex_reply(int type, u_int32_t seq, struct ssh *ssh)
+input_kex_dh_gex_reply(int type, uint32_t seq, struct ssh *ssh)
{
struct kex *kex = ssh->kex;
BIGNUM *dh_server_pub = NULL;
diff --git a/kexgexs.c b/kexgexs.c
index d02cca6dcf82..791afc2a3f9f 100644
--- a/kexgexs.c
+++ b/kexgexs.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kexgexs.c,v 1.49 2025/10/03 00:09:26 djm Exp $ */
+/* $OpenBSD: kexgexs.c,v 1.51 2026/03/03 09:57:25 dtucker Exp $ */
/*
* Copyright (c) 2000 Niels Provos. All rights reserved.
* Copyright (c) 2001 Markus Friedl. All rights reserved.
@@ -27,13 +27,13 @@
#include "includes.h"
#ifdef WITH_OPENSSL
+#include "openbsd-compat/openssl-compat.h"
#include <stdarg.h>
#include <stdio.h>
#include <string.h>
#include <signal.h>
-#include "openbsd-compat/openssl-compat.h"
#include <openssl/bn.h>
#include <openssl/dh.h>
@@ -54,8 +54,8 @@
#include "sshbuf.h"
#include "misc.h"
-static int input_kex_dh_gex_request(int, u_int32_t, struct ssh *);
-static int input_kex_dh_gex_init(int, u_int32_t, struct ssh *);
+static int input_kex_dh_gex_request(int, uint32_t, struct ssh *);
+static int input_kex_dh_gex_init(int, uint32_t, struct ssh *);
int
kexgex_server(struct ssh *ssh)
@@ -67,7 +67,7 @@ kexgex_server(struct ssh *ssh)
}
static int
-input_kex_dh_gex_request(int type, u_int32_t seq, struct ssh *ssh)
+input_kex_dh_gex_request(int type, uint32_t seq, struct ssh *ssh)
{
struct kex *kex = ssh->kex;
int r;
@@ -123,7 +123,7 @@ input_kex_dh_gex_request(int type, u_int32_t seq, struct ssh *ssh)
}
static int
-input_kex_dh_gex_init(int type, u_int32_t seq, struct ssh *ssh)
+input_kex_dh_gex_init(int type, uint32_t seq, struct ssh *ssh)
{
struct kex *kex = ssh->kex;
BIGNUM *dh_client_pub = NULL;
diff --git a/krl.c b/krl.c
index bea5b1b98c43..0e2b5f155b79 100644
--- a/krl.c
+++ b/krl.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: krl.c,v 1.62 2025/09/15 04:41:20 djm Exp $ */
+/* $OpenBSD: krl.c,v 1.64 2026/03/03 09:57:25 dtucker Exp $ */
/*
* Copyright (c) 2012 Damien Miller <djm@mindrot.org>
*
@@ -18,21 +18,18 @@
#include "includes.h"
#include <sys/types.h>
-#include <openbsd-compat/sys-tree.h>
-#include <openbsd-compat/sys-queue.h>
+#include <sys/tree.h>
+#include <sys/queue.h>
#include <errno.h>
-#include <fcntl.h>
#include <limits.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
-#include <unistd.h>
#include "sshbuf.h"
#include "ssherr.h"
#include "sshkey.h"
-#include "authfile.h"
#include "misc.h"
#include "log.h"
#include "digest.h"
@@ -55,7 +52,7 @@
/* Tree of serial numbers. XXX make smarter: really need a real sparse bitmap */
struct revoked_serial {
- u_int64_t lo, hi;
+ uint64_t lo, hi;
RB_ENTRY(revoked_serial) tree_entry;
};
static int serial_cmp(struct revoked_serial *a, struct revoked_serial *b);
@@ -91,9 +88,9 @@ struct revoked_certs {
TAILQ_HEAD(revoked_certs_list, revoked_certs);
struct ssh_krl {
- u_int64_t krl_version;
- u_int64_t generated_date;
- u_int64_t flags;
+ uint64_t krl_version;
+ uint64_t generated_date;
+ uint64_t flags;
char *comment;
struct revoked_blob_tree revoked_keys;
struct revoked_blob_tree revoked_sha1s;
@@ -197,7 +194,7 @@ ssh_krl_free(struct ssh_krl *krl)
}
void
-ssh_krl_set_version(struct ssh_krl *krl, u_int64_t version)
+ssh_krl_set_version(struct ssh_krl *krl, uint64_t version)
{
krl->krl_version = version;
}
@@ -250,7 +247,7 @@ revoked_certs_for_ca_key(struct ssh_krl *krl, const struct sshkey *ca_key,
}
static int
-insert_serial_range(struct revoked_serial_tree *rt, u_int64_t lo, u_int64_t hi)
+insert_serial_range(struct revoked_serial_tree *rt, uint64_t lo, uint64_t hi)
{
struct revoked_serial rs, *ers, *crs, *irs;
@@ -305,7 +302,7 @@ insert_serial_range(struct revoked_serial_tree *rt, u_int64_t lo, u_int64_t hi)
/* Check successors */
while ((crs = RB_NEXT(revoked_serial_tree, rt, ers)) != NULL) {
KRL_DBG(("succ %llu:%llu", crs->lo, crs->hi));
- if (ers->hi != (u_int64_t)-1 && crs->lo > ers->hi + 1)
+ if (ers->hi != (uint64_t)-1 && crs->lo > ers->hi + 1)
break;
/* This entry overlaps. */
if (crs->hi > ers->hi) {
@@ -321,14 +318,14 @@ insert_serial_range(struct revoked_serial_tree *rt, u_int64_t lo, u_int64_t hi)
int
ssh_krl_revoke_cert_by_serial(struct ssh_krl *krl, const struct sshkey *ca_key,
- u_int64_t serial)
+ uint64_t serial)
{
return ssh_krl_revoke_cert_by_serial_range(krl, ca_key, serial, serial);
}
int
ssh_krl_revoke_cert_by_serial_range(struct ssh_krl *krl,
- const struct sshkey *ca_key, u_int64_t lo, u_int64_t hi)
+ const struct sshkey *ca_key, uint64_t lo, uint64_t hi)
{
struct revoked_certs *rc;
int r;
@@ -477,11 +474,11 @@ ssh_krl_revoke_key(struct ssh_krl *krl, const struct sshkey *key)
* that will minimise the size of the resultant KRL.
*/
static int
-choose_next_state(int current_state, u_int64_t contig, int final,
- u_int64_t last_gap, u_int64_t next_gap, int *force_new_section)
+choose_next_state(int current_state, uint64_t contig, int final,
+ uint64_t last_gap, uint64_t next_gap, int *force_new_section)
{
int new_state;
- u_int64_t cost, cost_list, cost_range, cost_bitmap, cost_bitmap_restart;
+ uint64_t cost, cost_list, cost_range, cost_bitmap, cost_bitmap_restart;
/*
* Avoid unsigned overflows.
@@ -576,7 +573,7 @@ static int
revoked_certs_generate(struct revoked_certs *rc, struct sshbuf *buf)
{
int final, force_new_sect, r = SSH_ERR_INTERNAL_ERROR;
- u_int64_t i, contig, gap, last = 0, bitmap_start = 0;
+ uint64_t i, contig, gap, last = 0, bitmap_start = 0;
struct revoked_serial *rs, *nrs;
struct revoked_key_id *rki;
int next_state, state = 0;
@@ -811,7 +808,7 @@ ssh_krl_to_blob(struct ssh_krl *krl, struct sshbuf *buf)
}
static void
-format_timestamp(u_int64_t timestamp, char *ts, size_t nts)
+format_timestamp(uint64_t timestamp, char *ts, size_t nts)
{
time_t t;
struct tm *tm;
@@ -873,7 +870,7 @@ parse_revoked_certs(struct sshbuf *buf, struct ssh_krl *krl)
const u_char *blob;
size_t blen, nbits;
struct sshbuf *subsect = NULL;
- u_int64_t serial, serial_lo, serial_hi;
+ uint64_t serial, serial_lo, serial_hi;
struct bitmap *bitmap = NULL;
char *key_id = NULL;
struct sshkey *ca_key = NULL;
@@ -929,7 +926,7 @@ parse_revoked_certs(struct sshbuf *buf, struct ssh_krl *krl)
goto out;
}
nbits = bitmap_nbits(bitmap);
- for (serial = 0; serial < (u_int64_t)nbits; serial++) {
+ for (serial = 0; serial < (uint64_t)nbits; serial++) {
if (serial > 0 && serial_lo + serial == 0) {
error_f("bitmap wraps u64");
r = SSH_ERR_INVALID_FORMAT;
diff --git a/krl.h b/krl.h
index eb244767b107..5e101673c217 100644
--- a/krl.h
+++ b/krl.h
@@ -14,7 +14,7 @@
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-/* $OpenBSD: krl.h,v 1.10 2023/07/17 04:01:10 djm Exp $ */
+/* $OpenBSD: krl.h,v 1.11 2026/03/03 09:57:25 dtucker Exp $ */
#ifndef _KRL_H
#define _KRL_H
@@ -45,12 +45,12 @@ struct ssh_krl;
struct ssh_krl *ssh_krl_init(void);
void ssh_krl_free(struct ssh_krl *krl);
-void ssh_krl_set_version(struct ssh_krl *krl, u_int64_t version);
+void ssh_krl_set_version(struct ssh_krl *krl, uint64_t version);
int ssh_krl_set_comment(struct ssh_krl *krl, const char *comment);
int ssh_krl_revoke_cert_by_serial(struct ssh_krl *krl,
- const struct sshkey *ca_key, u_int64_t serial);
+ const struct sshkey *ca_key, uint64_t serial);
int ssh_krl_revoke_cert_by_serial_range(struct ssh_krl *krl,
- const struct sshkey *ca_key, u_int64_t lo, u_int64_t hi);
+ const struct sshkey *ca_key, uint64_t lo, uint64_t hi);
int ssh_krl_revoke_cert_by_key_id(struct ssh_krl *krl,
const struct sshkey *ca_key, const char *key_id);
int ssh_krl_revoke_key_explicit(struct ssh_krl *krl, const struct sshkey *key);
diff --git a/libcrux_mlkem768_sha3.h b/libcrux_mlkem768_sha3.h
index 885e82bafa06..1e3dc45744d2 100644
--- a/libcrux_mlkem768_sha3.h
+++ b/libcrux_mlkem768_sha3.h
@@ -1,6 +1,6 @@
-/* $OpenBSD: libcrux_mlkem768_sha3.h,v 1.2 2024/10/27 02:06:01 djm Exp $ */
+/* $OpenBSD: libcrux_mlkem768_sha3.h,v 1.4 2025/11/13 05:13:06 djm Exp $ */
-/* Extracted from libcrux revision 84c5d87b3092c59294345aa269ceefe0eb97cc35 */
+/* Extracted from libcrux revision 026a87ab6d88ad3626b9fbbf3710d1e0483c1849 */
/*
* MIT License
@@ -34,100 +34,234 @@
#define KRML_HOST_EPRINTF(...)
#define KRML_HOST_EXIT(x) fatal_f("internal error")
-/* from libcrux/libcrux-ml-kem/cg/eurydice_glue.h */
-/*
- * SPDX-FileCopyrightText: 2024 Eurydice Contributors
- * SPDX-FileCopyrightText: 2024 Cryspen Sarl <info@cryspen.com>
- *
- * SPDX-License-Identifier: MIT or Apache-2.0
- */
+static inline void
+store64_le(uint8_t dst[8], uint64_t src)
+{
+ dst[0] = src & 0xff;
+ dst[1] = (src >> 8) & 0xff;
+ dst[2] = (src >> 16) & 0xff;
+ dst[3] = (src >> 24) & 0xff;
+ dst[4] = (src >> 32) & 0xff;
+ dst[5] = (src >> 40) & 0xff;
+ dst[6] = (src >> 48) & 0xff;
+ dst[7] = (src >> 56) & 0xff;
+}
-#pragma once
+static inline void
+store32_le(uint8_t dst[4], uint32_t src)
+{
+ dst[0] = src & 0xff;
+ dst[1] = (src >> 8) & 0xff;
+ dst[2] = (src >> 16) & 0xff;
+ dst[3] = (src >> 24) & 0xff;
+}
-#if defined(__cplusplus)
-extern "C" {
+static inline void
+store32_be(uint8_t dst[4], uint32_t src)
+{
+ dst[0] = (src >> 24) & 0xff;
+ dst[1] = (src >> 16) & 0xff;
+ dst[2] = (src >> 8) & 0xff;
+ dst[3] = src & 0xff;
+}
+
+static inline uint64_t
+load64_le(uint8_t src[8])
+{
+ return (uint64_t)(src[0]) |
+ ((uint64_t)(src[1]) << 8) |
+ ((uint64_t)(src[2]) << 16) |
+ ((uint64_t)(src[3]) << 24) |
+ ((uint64_t)(src[4]) << 32) |
+ ((uint64_t)(src[5]) << 40) |
+ ((uint64_t)(src[6]) << 48) |
+ ((uint64_t)(src[7]) << 56);
+}
+
+static inline uint32_t
+load32_le(uint8_t src[4])
+{
+ return (uint32_t)(src[0]) |
+ ((uint32_t)(src[1]) << 8) |
+ ((uint32_t)(src[2]) << 16) |
+ ((uint32_t)(src[3]) << 24);
+}
+
+#ifdef MISSING_BUILTIN_POPCOUNT
+static inline unsigned int
+__builtin_popcount(unsigned int num)
+{
+ const int v[16] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4 };
+ return v[num & 0xf] + v[(num >> 4) & 0xf];
+}
#endif
+/* from libcrux/libcrux-ml-kem/extracts/c_header_only/generated/eurydice_glue.h */
+#pragma once
-// SLICES, ARRAYS, ETC.
+#ifdef _MSC_VER
+// For __popcnt
+#endif
+
+
+// C++ HELPERS
-// The MSVC C++ compiler does not support compound literals.
-// This CLITERAL is used to turn `(type){...}` into `type{...}` when using a C++
-// compiler.
#if defined(__cplusplus)
-#define CLITERAL(type) type
+
+#ifndef KRML_HOST_EPRINTF
+#define KRML_HOST_EPRINTF(...) fprintf(stderr, __VA_ARGS__)
+#endif
+
+
+#ifndef __cpp_lib_type_identity
+template <class T>
+struct type_identity {
+ using type = T;
+};
+
+template <class T>
+using type_identity_t = typename type_identity<T>::type;
#else
-#define CLITERAL(type) (type)
+using std::type_identity_t;
+#endif
+
+#define KRML_UNION_CONSTRUCTOR(T) \
+ template <typename V> \
+ constexpr T(int t, V U::*m, type_identity_t<V> v) : tag(t) { \
+ val.*m = std::move(v); \
+ } \
+ T() = default;
+
#endif
+// GENERAL-PURPOSE STUFF
+
+#define LowStar_Ignore_ignore(e, t, _ret_t) ((void)e)
+
+#define EURYDICE_ASSERT(test, msg) \
+ do { \
+ if (!(test)) { \
+ fprintf(stderr, "assertion \"%s\" failed: file \"%s\", line %d\n", msg, \
+ __FILE__, __LINE__); \
+ exit(255); \
+ } \
+ } while (0)
+
+// SLICES, ARRAYS, ETC.
+
// We represent a slice as a pair of an (untyped) pointer, along with the length
// of the slice, i.e. the number of elements in the slice (this is NOT the
// number of bytes). This design choice has two important consequences.
// - if you need to use `ptr`, you MUST cast it to a proper type *before*
-// performing pointer
-// arithmetic on it (remember that C desugars pointer arithmetic based on the
-// type of the address)
+// performing pointer arithmetic on it (remember that C desugars pointer
+// arithmetic based on the type of the address)
// - if you need to use `len` for a C style function (e.g. memcpy, memcmp), you
-// need to multiply it
-// by sizeof t, where t is the type of the elements.
+// need to multiply it by sizeof t, where t is the type of the elements.
//
-// Empty slices have `len == 0` and `ptr` always needs to be valid pointer that
-// is not NULL (otherwise the construction in EURYDICE_SLICE computes `NULL +
-// start`).
+// Empty slices have `len == 0` and `ptr` always needs to be a valid pointer
+// that is not NULL (otherwise the construction in EURYDICE_SLICE computes `NULL
+// + start`).
typedef struct {
void *ptr;
size_t len;
} Eurydice_slice;
+#if defined(__cplusplus)
+#define KRML_CLITERAL(type) type
+#else
+#define KRML_CLITERAL(type) (type)
+#endif
+
+#if defined(__cplusplus) && defined(__cpp_designated_initializers) || \
+ !(defined(__cplusplus))
+#define EURYDICE_CFIELD(X) X
+#else
+#define EURYDICE_CFIELD(X)
+#endif
+
// Helper macro to create a slice out of a pointer x, a start index in x
// (included), and an end index in x (excluded). The argument x must be suitably
// cast to something that can decay (see remark above about how pointer
// arithmetic works in C), meaning either pointer or array type.
#define EURYDICE_SLICE(x, start, end) \
- (CLITERAL(Eurydice_slice){.ptr = (void *)(x + start), .len = end - start})
-#define EURYDICE_SLICE_LEN(s, _) s.len
+ (KRML_CLITERAL(Eurydice_slice){(void *)(x + start), end - start})
+
+// Slice length
+#define EURYDICE_SLICE_LEN(s, _) (s).len
+#define Eurydice_slice_len(s, _) (s).len
+
// This macro is a pain because in case the dereferenced element type is an
// array, you cannot simply write `t x` as it would yield `int[4] x` instead,
// which is NOT correct C syntax, so we add a dedicated phase in Eurydice that
// adds an extra argument to this macro at the last minute so that we have the
// correct type of *pointers* to elements.
#define Eurydice_slice_index(s, i, t, t_ptr_t) (((t_ptr_t)s.ptr)[i])
-#define Eurydice_slice_subslice(s, r, t, _) \
+
+// The following functions get sub slices from a slice.
+
+#define Eurydice_slice_subslice(s, r, t, _0, _1) \
EURYDICE_SLICE((t *)s.ptr, r.start, r.end)
+
// Variant for when the start and end indices are statically known (i.e., the
// range argument `r` is a literal).
#define Eurydice_slice_subslice2(s, start, end, t) \
- EURYDICE_SLICE((t *)s.ptr, start, end)
-#define Eurydice_slice_subslice_to(s, subslice_end_pos, t, _) \
+ EURYDICE_SLICE((t *)s.ptr, (start), (end))
+
+// Previous version above does not work when t is an array type (as usual). Will
+// be deprecated soon.
+#define Eurydice_slice_subslice3(s, start, end, t_ptr) \
+ EURYDICE_SLICE((t_ptr)s.ptr, (start), (end))
+
+#define Eurydice_slice_subslice_to(s, subslice_end_pos, t, _0, _1) \
EURYDICE_SLICE((t *)s.ptr, 0, subslice_end_pos)
-#define Eurydice_slice_subslice_from(s, subslice_start_pos, t, _) \
+
+#define Eurydice_slice_subslice_from(s, subslice_start_pos, t, _0, _1) \
EURYDICE_SLICE((t *)s.ptr, subslice_start_pos, s.len)
+
#define Eurydice_array_to_slice(end, x, t) \
EURYDICE_SLICE(x, 0, \
end) /* x is already at an array type, no need for cast */
-#define Eurydice_array_to_subslice(_arraylen, x, r, t, _) \
+#define Eurydice_array_to_subslice(_arraylen, x, r, t, _0, _1) \
EURYDICE_SLICE((t *)x, r.start, r.end)
+
// Same as above, variant for when start and end are statically known
#define Eurydice_array_to_subslice2(x, start, end, t) \
- EURYDICE_SLICE((t *)x, start, end)
-#define Eurydice_array_to_subslice_to(_size, x, r, t, _range_t) \
+ EURYDICE_SLICE((t *)x, (start), (end))
+
+// Same as above, variant for when start and end are statically known
+#define Eurydice_array_to_subslice3(x, start, end, t_ptr) \
+ EURYDICE_SLICE((t_ptr)x, (start), (end))
+
+#define Eurydice_array_repeat(dst, len, init, t) \
+ ERROR "should've been desugared"
+
+// The following functions convert an array into a slice.
+
+#define Eurydice_array_to_subslice_to(_size, x, r, t, _range_t, _0) \
EURYDICE_SLICE((t *)x, 0, r)
-#define Eurydice_array_to_subslice_from(size, x, r, t, _range_t) \
+#define Eurydice_array_to_subslice_from(size, x, r, t, _range_t, _0) \
EURYDICE_SLICE((t *)x, r, size)
-#define Eurydice_slice_len(s, t) EURYDICE_SLICE_LEN(s, t)
+
+// Copy a slice with memcopy
#define Eurydice_slice_copy(dst, src, t) \
memcpy(dst.ptr, src.ptr, dst.len * sizeof(t))
-#define core_array___Array_T__N__23__as_slice(len_, ptr_, t, _ret_t) \
- ((Eurydice_slice){.ptr = ptr_, .len = len_})
-#define core_array___core__clone__Clone_for__Array_T__N___20__clone( \
- len, src, dst, elem_type, _ret_t) \
+#define core_array___Array_T__N___as_slice(len_, ptr_, t, _ret_t) \
+ KRML_CLITERAL(Eurydice_slice) { ptr_, len_ }
+
+#define core_array__core__clone__Clone_for__Array_T__N___clone( \
+ len, src, dst, elem_type, _ret_t) \
(memcpy(dst, src, len * sizeof(elem_type)))
#define TryFromSliceError uint8_t
+#define core_array_TryFromSliceError uint8_t
+
+#define Eurydice_array_eq(sz, a1, a2, t) (memcmp(a1, a2, sz * sizeof(t)) == 0)
+
+// core::cmp::PartialEq<&0 (@Slice<U>)> for @Array<T, N>
+#define Eurydice_array_eq_slice(sz, a1, s2, t, _) \
+ (memcmp(a1, (s2)->ptr, sz * sizeof(t)) == 0)
-#define Eurydice_array_eq(sz, a1, a2, t, _) \
- (memcmp(a1, a2, sz * sizeof(t)) == 0)
#define core_array_equality___core__cmp__PartialEq__Array_U__N___for__Array_T__N____eq( \
sz, a1, a2, t, _, _ret_t) \
Eurydice_array_eq(sz, a1, a2, t, _)
@@ -135,20 +269,30 @@ typedef struct {
sz, a1, a2, t, _, _ret_t) \
Eurydice_array_eq(sz, a1, ((a2)->ptr), t, _)
-#define Eurydice_slice_split_at(slice, mid, element_type, ret_t) \
- (CLITERAL(ret_t){ \
- .fst = EURYDICE_SLICE((element_type *)slice.ptr, 0, mid), \
- .snd = EURYDICE_SLICE((element_type *)slice.ptr, mid, slice.len)})
-#define Eurydice_slice_split_at_mut(slice, mid, element_type, ret_t) \
- (CLITERAL(ret_t){ \
- .fst = {.ptr = slice.ptr, .len = mid}, \
- .snd = {.ptr = (char *)slice.ptr + mid * sizeof(element_type), \
- .len = slice.len - mid}})
+#define Eurydice_slice_split_at(slice, mid, element_type, ret_t) \
+ KRML_CLITERAL(ret_t) { \
+ EURYDICE_CFIELD(.fst =) \
+ EURYDICE_SLICE((element_type *)(slice).ptr, 0, mid), \
+ EURYDICE_CFIELD(.snd =) \
+ EURYDICE_SLICE((element_type *)(slice).ptr, mid, (slice).len) \
+ }
+
+#define Eurydice_slice_split_at_mut(slice, mid, element_type, ret_t) \
+ KRML_CLITERAL(ret_t) { \
+ EURYDICE_CFIELD(.fst =) \
+ KRML_CLITERAL(Eurydice_slice){EURYDICE_CFIELD(.ptr =)(slice.ptr), \
+ EURYDICE_CFIELD(.len =) mid}, \
+ EURYDICE_CFIELD(.snd =) KRML_CLITERAL(Eurydice_slice) { \
+ EURYDICE_CFIELD(.ptr =) \
+ ((char *)slice.ptr + mid * sizeof(element_type)), \
+ EURYDICE_CFIELD(.len =)(slice.len - mid) \
+ } \
+ }
// Conversion of slice to an array, rewritten (by Eurydice) to name the
// destination array, since arrays are not values in C.
// N.B.: see note in karamel/lib/Inlining.ml if you change this.
-#define Eurydice_slice_to_array2(dst, src, _, t_arr) \
+#define Eurydice_slice_to_array2(dst, src, _0, t_arr, _1) \
Eurydice_slice_to_array3(&(dst)->tag, (char *)&(dst)->val.case_Ok, src, \
sizeof(t_arr))
@@ -158,126 +302,309 @@ static inline void Eurydice_slice_to_array3(uint8_t *dst_tag, char *dst_ok,
memcpy(dst_ok, src.ptr, sz);
}
+// SUPPORT FOR DSTs (Dynamically-Sized Types)
+
+// A DST is a fat pointer that keeps tracks of the size of it flexible array
+// member. Slices are a specific case of DSTs, where [T; N] implements
+// Unsize<[T]>, meaning an array of statically known size can be converted to a
+// fat pointer, i.e. a slice.
+//
+// Unlike slices, DSTs have a built-in definition that gets monomorphized, of
+// the form:
+//
+// typedef struct {
+// T *ptr;
+// size_t len; // number of elements
+// } Eurydice_dst;
+//
+// Furthermore, T = T0<[U0]> where `struct T0<U: ?Sized>`, where the `U` is the
+// last field. This means that there are two monomorphizations of T0 in the
+// program. One is `T0<[V; N]>`
+// -- this is directly converted to a Eurydice_dst via suitable codegen (no
+// macro). The other is `T = T0<[U]>`, where `[U]` gets emitted to
+// `Eurydice_derefed_slice`, a type that only appears in that precise situation
+// and is thus defined to give rise to a flexible array member.
+
+typedef char Eurydice_derefed_slice[];
+
+#define Eurydice_slice_of_dst(fam_ptr, len_, t, _) \
+ ((Eurydice_slice){.ptr = (void *)(fam_ptr), .len = len_})
+
+#define Eurydice_slice_of_boxed_array(ptr_, len_, t, _) \
+ ((Eurydice_slice){.ptr = (void *)(ptr_), .len = len_})
+
// CORE STUFF (conversions, endianness, ...)
-static inline void core_num__u64_9__to_le_bytes(uint64_t v, uint8_t buf[8]) {
- v = htole64(v);
- memcpy(buf, &v, sizeof(v));
+// We slap extern "C" on declarations that intend to implement a prototype
+// generated by Eurydice, because Eurydice prototypes are always emitted within
+// an extern "C" block, UNLESS you use -fcxx17-compat, in which case, you must
+// pass -DKRML_CXX17_COMPAT="" to your C++ compiler.
+#if defined(__cplusplus) && !defined(KRML_CXX17_COMPAT)
+extern "C" {
+#endif
+
+static inline void core_num__u32__to_be_bytes(uint32_t src, uint8_t dst[4]) {
+ store32_be(dst, src);
+}
+
+static inline void core_num__u32__to_le_bytes(uint32_t src, uint8_t dst[4]) {
+ store32_le(dst, src);
+}
+
+static inline uint32_t core_num__u32__from_le_bytes(uint8_t buf[4]) {
+ return load32_le(buf);
+}
+
+static inline void core_num__u64__to_le_bytes(uint64_t v, uint8_t buf[8]) {
+ store64_le(buf, v);
+}
+
+static inline uint64_t core_num__u64__from_le_bytes(uint8_t buf[8]) {
+ return load64_le(buf);
+}
+
+static inline int64_t core_convert_num___core__convert__From_i32__for_i64__from(
+ int32_t x) {
+ return x;
}
-static inline uint64_t core_num__u64_9__from_le_bytes(uint8_t buf[8]) {
- uint64_t v;
- memcpy(&v, buf, sizeof(v));
- return le64toh(v);
+
+static inline uint64_t core_convert_num___core__convert__From_u8__for_u64__from(
+ uint8_t x) {
+ return x;
+}
+
+static inline uint64_t
+core_convert_num___core__convert__From_u16__for_u64__from(uint16_t x) {
+ return x;
}
-static inline uint32_t core_num__u32_8__from_le_bytes(uint8_t buf[4]) {
- uint32_t v;
- memcpy(&v, buf, sizeof(v));
- return le32toh(v);
+static inline size_t
+core_convert_num___core__convert__From_u16__for_usize__from(uint16_t x) {
+ return x;
}
-static inline uint32_t core_num__u8_6__count_ones(uint8_t x0) {
-#if defined(_MSC_VER)
+static inline uint32_t core_num__u8__count_ones(uint8_t x0) {
+#ifdef _MSC_VER
return __popcnt(x0);
-#elif !defined(MISSING_BUILTIN_POPCOUNT)
- return __builtin_popcount(x0);
#else
- const uint8_t v[16] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4 };
- return v[x0 & 0xf] + v[(x0 >> 4) & 0xf];
+ return __builtin_popcount(x0);
+#endif
+}
+static inline uint32_t core_num__i32__count_ones(int32_t x0) {
+#ifdef _MSC_VER
+ return __popcnt(x0);
+#else
+ return __builtin_popcount(x0);
#endif
}
+static inline size_t core_cmp_impls___core__cmp__Ord_for_usize__min(size_t a,
+ size_t b) {
+ if (a <= b)
+ return a;
+ else
+ return b;
+}
+
// unsigned overflow wraparound semantics in C
-static inline uint16_t core_num__u16_7__wrapping_add(uint16_t x, uint16_t y) {
+static inline uint16_t core_num__u16__wrapping_add(uint16_t x, uint16_t y) {
return x + y;
}
-static inline uint8_t core_num__u8_6__wrapping_sub(uint8_t x, uint8_t y) {
+static inline uint8_t core_num__u8__wrapping_sub(uint8_t x, uint8_t y) {
return x - y;
}
+static inline uint64_t core_num__u64__rotate_left(uint64_t x0, uint32_t x1) {
+ return (x0 << x1 | x0 >> (64 - x1));
+}
+
+static inline void core_ops_arith__i32__add_assign(int32_t *x0, int32_t *x1) {
+ *x0 = *x0 + *x1;
+}
+
+static inline uint8_t Eurydice_bitand_pv_u8(uint8_t *p, uint8_t v) {
+ return (*p) & v;
+}
+static inline uint8_t Eurydice_shr_pv_u8(uint8_t *p, int32_t v) {
+ return (*p) >> v;
+}
+static inline uint32_t Eurydice_min_u32(uint32_t x, uint32_t y) {
+ return x < y ? x : y;
+}
+
+static inline uint8_t
+core_ops_bit___core__ops__bit__BitAnd_u8__u8__for___a__u8___46__bitand(
+ uint8_t *x0, uint8_t x1) {
+ return Eurydice_bitand_pv_u8(x0, x1);
+}
+
+static inline uint8_t
+core_ops_bit___core__ops__bit__Shr_i32__u8__for___a__u8___792__shr(uint8_t *x0,
+ int32_t x1) {
+ return Eurydice_shr_pv_u8(x0, x1);
+}
+
+#define core_num_nonzero_private_NonZeroUsizeInner size_t
+static inline core_num_nonzero_private_NonZeroUsizeInner
+core_num_nonzero_private___core__clone__Clone_for_core__num__nonzero__private__NonZeroUsizeInner__26__clone(
+ core_num_nonzero_private_NonZeroUsizeInner *x0) {
+ return *x0;
+}
+
+#if defined(__cplusplus) && !defined(KRML_CXX17_COMPAT)
+}
+#endif
// ITERATORS
-#define Eurydice_range_iter_next(iter_ptr, t, ret_t) \
- (((iter_ptr)->start == (iter_ptr)->end) \
- ? (CLITERAL(ret_t){.tag = None}) \
- : (CLITERAL(ret_t){.tag = Some, .f0 = (iter_ptr)->start++}))
+#define Eurydice_range_iter_next(iter_ptr, t, ret_t) \
+ (((iter_ptr)->start >= (iter_ptr)->end) \
+ ? (KRML_CLITERAL(ret_t){EURYDICE_CFIELD(.tag =) 0, \
+ EURYDICE_CFIELD(.f0 =) 0}) \
+ : (KRML_CLITERAL(ret_t){EURYDICE_CFIELD(.tag =) 1, \
+ EURYDICE_CFIELD(.f0 =)(iter_ptr)->start++}))
-#define core_iter_range___core__iter__traits__iterator__Iterator_for_core__ops__range__Range_A___6__next \
+#define core_iter_range___core__iter__traits__iterator__Iterator_A__for_core__ops__range__Range_A__TraitClause_0___6__next \
Eurydice_range_iter_next
// See note in karamel/lib/Inlining.ml if you change this
-#define Eurydice_into_iter(x, t, _ret_t) (x)
-#define core_iter_traits_collect___core__iter__traits__collect__IntoIterator_for_I__1__into_iter \
+#define Eurydice_into_iter(x, t, _ret_t, _) (x)
+#define core_iter_traits_collect___core__iter__traits__collect__IntoIterator_Clause1_Item__I__for_I__1__into_iter \
Eurydice_into_iter
-#if defined(__cplusplus)
+typedef struct {
+ Eurydice_slice slice;
+ size_t chunk_size;
+} Eurydice_chunks;
+
+// Can't use macros Eurydice_slice_subslice_{to,from} because they require a
+// type, and this static inline function cannot receive a type as an argument.
+// Instead, we receive the element size and use it to peform manual offset
+// computations rather than going through the macros.
+static inline Eurydice_slice chunk_next(Eurydice_chunks *chunks,
+ size_t element_size) {
+ size_t chunk_size = chunks->slice.len >= chunks->chunk_size
+ ? chunks->chunk_size
+ : chunks->slice.len;
+ Eurydice_slice curr_chunk;
+ curr_chunk.ptr = chunks->slice.ptr;
+ curr_chunk.len = chunk_size;
+ chunks->slice.ptr = (char *)(chunks->slice.ptr) + chunk_size * element_size;
+ chunks->slice.len = chunks->slice.len - chunk_size;
+ return curr_chunk;
}
-#endif
-/* from libcrux/libcrux-ml-kem/cg/libcrux_core.h */
+#define core_slice___Slice_T___chunks(slice_, sz_, t, _ret_t) \
+ ((Eurydice_chunks){.slice = slice_, .chunk_size = sz_})
+#define core_slice___Slice_T___chunks_exact(slice_, sz_, t, _ret_t) \
+ ((Eurydice_chunks){ \
+ .slice = {.ptr = slice_.ptr, .len = slice_.len - (slice_.len % sz_)}, \
+ .chunk_size = sz_})
+#define core_slice_iter_Chunks Eurydice_chunks
+#define core_slice_iter_ChunksExact Eurydice_chunks
+#define Eurydice_chunks_next(iter, t, ret_t) \
+ (((iter)->slice.len == 0) ? ((ret_t){.tag = core_option_None}) \
+ : ((ret_t){.tag = core_option_Some, \
+ .f0 = chunk_next(iter, sizeof(t))}))
+#define core_slice_iter___core__iter__traits__iterator__Iterator_for_core__slice__iter__Chunks__a__T___70__next \
+ Eurydice_chunks_next
+// This name changed on 20240627
+#define core_slice_iter___core__iter__traits__iterator__Iterator_for_core__slice__iter__Chunks__a__T___71__next \
+ Eurydice_chunks_next
+#define core_slice_iter__core__slice__iter__ChunksExact__a__T__89__next( \
+ iter, t, _ret_t) \
+ core_slice_iter__core__slice__iter__Chunks__a__T__70__next(iter, t)
+
+typedef struct {
+ Eurydice_slice s;
+ size_t index;
+} Eurydice_slice_iterator;
+
+#define core_slice___Slice_T___iter(x, t, _ret_t) \
+ ((Eurydice_slice_iterator){.s = x, .index = 0})
+#define core_slice_iter_Iter Eurydice_slice_iterator
+#define core_slice_iter__core__slice__iter__Iter__a__T__181__next(iter, t, \
+ ret_t) \
+ (((iter)->index == (iter)->s.len) \
+ ? (KRML_CLITERAL(ret_t){.tag = core_option_None}) \
+ : (KRML_CLITERAL(ret_t){ \
+ .tag = core_option_Some, \
+ .f0 = ((iter)->index++, \
+ &((t *)((iter)->s.ptr))[(iter)->index - 1])}))
+#define core_option__core__option__Option_T__TraitClause_0___is_some(X, _0, \
+ _1) \
+ ((X)->tag == 1)
+// STRINGS
+
+typedef const char *Prims_string;
+
+// MISC (UNTESTED)
+
+typedef void *core_fmt_Formatter;
+typedef void *core_fmt_Arguments;
+typedef void *core_fmt_rt_Argument;
+#define core_fmt_rt__core__fmt__rt__Argument__a__1__new_display(x1, x2, x3, \
+ x4) \
+ NULL
+
+// BOXES
+
+// Crimes.
+static inline char *malloc_and_init(size_t sz, char *init) {
+ char *ptr = (char *)malloc(sz);
+ memcpy(ptr, init, sz);
+ return ptr;
+}
+
+#define Eurydice_box_new(init, t, t_dst) \
+ ((t_dst)(malloc_and_init(sizeof(t), (char *)(&init))))
+
+#define Eurydice_box_new_array(len, ptr, t, t_dst) \
+ ((t_dst)(malloc_and_init(len * sizeof(t), (char *)(ptr))))
+
+/* from libcrux/libcrux-ml-kem/extracts/c_header_only/generated/libcrux_mlkem_core.h */
/*
- * SPDX-FileCopyrightText: 2024 Cryspen Sarl <info@cryspen.com>
+ * SPDX-FileCopyrightText: 2025 Cryspen Sarl <info@cryspen.com>
*
* SPDX-License-Identifier: MIT or Apache-2.0
*
* This code was generated with the following revisions:
- * Charon: 6b5e110342a771a3e1c739b10294b1778e4be8b4
- * Eurydice: 31be7d65ca5d6acdacfb33652e478d24dd85c1cb
- * Karamel: 3205d3365ea2790b02368f79fcee38e38d0b5908
- * F*: a32b316e521fa4f239b610ec8f1d15e78d62cbe8-dirty
- * Libcrux: 4ad532b206174114dd4140b718e7794a28fc59ee
+ * Charon: 667d2fc98984ff7f3df989c2367e6c1fa4a000e7
+ * Eurydice: 2381cbc416ef2ad0b561c362c500bc84f36b6785
+ * Karamel: 80f5435f2fc505973c469a4afcc8d875cddd0d8b
+ * F*: 71d8221589d4d438af3706d89cb653cf53e18aab
+ * Libcrux: 68dfed5a4a9e40277f62828471c029afed1ecdcc
*/
-#ifndef __libcrux_core_H
-#define __libcrux_core_H
+#ifndef libcrux_mlkem_core_H
+#define libcrux_mlkem_core_H
+
#if defined(__cplusplus)
extern "C" {
#endif
-
/**
A monomorphic instance of core.ops.range.Range
with types size_t
*/
-typedef struct core_ops_range_Range_b3_s {
+typedef struct core_ops_range_Range_08_s {
size_t start;
size_t end;
-} core_ops_range_Range_b3;
-
-#define Ok 0
-#define Err 1
-
-typedef uint8_t Result_86_tags;
-
-#define None 0
-#define Some 1
-
-typedef uint8_t Option_ef_tags;
-
-/**
-A monomorphic instance of core.option.Option
-with types size_t
+} core_ops_range_Range_08;
-*/
-typedef struct Option_b3_s {
- Option_ef_tags tag;
- size_t f0;
-} Option_b3;
-
-static inline uint16_t core_num__u16_7__wrapping_add(uint16_t x0, uint16_t x1);
+static inline uint16_t core_num__u16__wrapping_add(uint16_t x0, uint16_t x1);
-#define CORE_NUM__U32_8__BITS (32U)
+static inline uint64_t core_num__u64__from_le_bytes(uint8_t x0[8U]);
-static inline uint64_t core_num__u64_9__from_le_bytes(uint8_t x0[8U]);
+static inline uint64_t core_num__u64__rotate_left(uint64_t x0, uint32_t x1);
-static inline void core_num__u64_9__to_le_bytes(uint64_t x0, uint8_t x1[8U]);
+static inline void core_num__u64__to_le_bytes(uint64_t x0, uint8_t x1[8U]);
-static inline uint32_t core_num__u8_6__count_ones(uint8_t x0);
+static inline uint32_t core_num__u8__count_ones(uint8_t x0);
-static inline uint8_t core_num__u8_6__wrapping_sub(uint8_t x0, uint8_t x1);
+static inline uint8_t core_num__u8__wrapping_sub(uint8_t x0, uint8_t x1);
#define LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE ((size_t)32U)
@@ -293,35 +620,298 @@ static inline uint8_t core_num__u8_6__wrapping_sub(uint8_t x0, uint8_t x1);
#define LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE ((size_t)32U)
+#define LIBCRUX_ML_KEM_CONSTANTS_G_DIGEST_SIZE ((size_t)64U)
+
#define LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE ((size_t)32U)
+/**
+ K * BITS_PER_RING_ELEMENT / 8
+
+ [eurydice] Note that we can't use const generics here because that breaks
+ C extraction with eurydice.
+*/
+static inline size_t libcrux_ml_kem_constants_ranked_bytes_per_ring_element(
+ size_t rank) {
+ return rank * LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_RING_ELEMENT / (size_t)8U;
+}
+
+/**
+This function found in impl {libcrux_secrets::traits::Classify<T> for T}
+*/
+/**
+A monomorphic instance of libcrux_secrets.int.public_integers.classify_27
+with types uint8_t
+
+*/
+static KRML_MUSTINLINE uint8_t
+libcrux_secrets_int_public_integers_classify_27_90(uint8_t self) {
+ return self;
+}
+
+/**
+This function found in impl {libcrux_secrets::traits::Declassify<T> for T}
+*/
+/**
+A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8
+with types int16_t
+
+*/
+static KRML_MUSTINLINE int16_t
+libcrux_secrets_int_public_integers_declassify_d8_39(int16_t self) {
+ return self;
+}
+
+/**
+This function found in impl {libcrux_secrets::int::CastOps for i16}
+*/
+static KRML_MUSTINLINE uint8_t libcrux_secrets_int_as_u8_f5(int16_t self) {
+ return libcrux_secrets_int_public_integers_classify_27_90(
+ (uint8_t)libcrux_secrets_int_public_integers_declassify_d8_39(self));
+}
+
+/**
+This function found in impl {libcrux_secrets::traits::Classify<T> for T}
+*/
+/**
+A monomorphic instance of libcrux_secrets.int.public_integers.classify_27
+with types int16_t
+
+*/
+static KRML_MUSTINLINE int16_t
+libcrux_secrets_int_public_integers_classify_27_39(int16_t self) {
+ return self;
+}
+
+/**
+This function found in impl {libcrux_secrets::traits::Declassify<T> for T}
+*/
+/**
+A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8
+with types uint8_t
+
+*/
+static KRML_MUSTINLINE uint8_t
+libcrux_secrets_int_public_integers_declassify_d8_90(uint8_t self) {
+ return self;
+}
+
+/**
+This function found in impl {libcrux_secrets::int::CastOps for u8}
+*/
+static KRML_MUSTINLINE int16_t libcrux_secrets_int_as_i16_59(uint8_t self) {
+ return libcrux_secrets_int_public_integers_classify_27_39(
+ (int16_t)libcrux_secrets_int_public_integers_declassify_d8_90(self));
+}
+
+/**
+This function found in impl {libcrux_secrets::traits::Classify<T> for T}
+*/
+/**
+A monomorphic instance of libcrux_secrets.int.public_integers.classify_27
+with types int32_t
+
+*/
+static KRML_MUSTINLINE int32_t
+libcrux_secrets_int_public_integers_classify_27_a8(int32_t self) {
+ return self;
+}
+
+/**
+This function found in impl {libcrux_secrets::int::CastOps for i16}
+*/
+static KRML_MUSTINLINE int32_t libcrux_secrets_int_as_i32_f5(int16_t self) {
+ return libcrux_secrets_int_public_integers_classify_27_a8(
+ (int32_t)libcrux_secrets_int_public_integers_declassify_d8_39(self));
+}
+
+/**
+This function found in impl {libcrux_secrets::traits::Declassify<T> for T}
+*/
+/**
+A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8
+with types int32_t
+
+*/
+static KRML_MUSTINLINE int32_t
+libcrux_secrets_int_public_integers_declassify_d8_a8(int32_t self) {
+ return self;
+}
+
+/**
+This function found in impl {libcrux_secrets::int::CastOps for i32}
+*/
+static KRML_MUSTINLINE int16_t libcrux_secrets_int_as_i16_36(int32_t self) {
+ return libcrux_secrets_int_public_integers_classify_27_39(
+ (int16_t)libcrux_secrets_int_public_integers_declassify_d8_a8(self));
+}
+
+/**
+This function found in impl {libcrux_secrets::traits::Declassify<T> for T}
+*/
+/**
+A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8
+with types uint32_t
+
+*/
+static KRML_MUSTINLINE uint32_t
+libcrux_secrets_int_public_integers_declassify_d8_df(uint32_t self) {
+ return self;
+}
+
+/**
+This function found in impl {libcrux_secrets::int::CastOps for u32}
+*/
+static KRML_MUSTINLINE int32_t libcrux_secrets_int_as_i32_b8(uint32_t self) {
+ return libcrux_secrets_int_public_integers_classify_27_a8(
+ (int32_t)libcrux_secrets_int_public_integers_declassify_d8_df(self));
+}
+
+/**
+This function found in impl {libcrux_secrets::traits::Classify<T> for T}
+*/
+/**
+A monomorphic instance of libcrux_secrets.int.public_integers.classify_27
+with types uint16_t
+
+*/
+static KRML_MUSTINLINE uint16_t
+libcrux_secrets_int_public_integers_classify_27_de(uint16_t self) {
+ return self;
+}
+
+/**
+This function found in impl {libcrux_secrets::int::CastOps for i16}
+*/
+static KRML_MUSTINLINE uint16_t libcrux_secrets_int_as_u16_f5(int16_t self) {
+ return libcrux_secrets_int_public_integers_classify_27_de(
+ (uint16_t)libcrux_secrets_int_public_integers_declassify_d8_39(self));
+}
+
+/**
+This function found in impl {libcrux_secrets::traits::Declassify<T> for T}
+*/
+/**
+A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8
+with types uint16_t
+
+*/
+static KRML_MUSTINLINE uint16_t
+libcrux_secrets_int_public_integers_declassify_d8_de(uint16_t self) {
+ return self;
+}
+
+/**
+This function found in impl {libcrux_secrets::int::CastOps for u16}
+*/
+static KRML_MUSTINLINE int16_t libcrux_secrets_int_as_i16_ca(uint16_t self) {
+ return libcrux_secrets_int_public_integers_classify_27_39(
+ (int16_t)libcrux_secrets_int_public_integers_declassify_d8_de(self));
+}
+
+/**
+This function found in impl {libcrux_secrets::traits::Classify<T> for T}
+*/
+/**
+A monomorphic instance of libcrux_secrets.int.public_integers.classify_27
+with types uint64_t
+
+*/
+static KRML_MUSTINLINE uint64_t
+libcrux_secrets_int_public_integers_classify_27_49(uint64_t self) {
+ return self;
+}
+
+/**
+This function found in impl {libcrux_secrets::int::CastOps for u16}
+*/
+static KRML_MUSTINLINE uint64_t libcrux_secrets_int_as_u64_ca(uint16_t self) {
+ return libcrux_secrets_int_public_integers_classify_27_49(
+ (uint64_t)libcrux_secrets_int_public_integers_declassify_d8_de(self));
+}
+
+/**
+This function found in impl {libcrux_secrets::traits::Classify<T> for T}
+*/
+/**
+A monomorphic instance of libcrux_secrets.int.public_integers.classify_27
+with types uint32_t
+
+*/
+static KRML_MUSTINLINE uint32_t
+libcrux_secrets_int_public_integers_classify_27_df(uint32_t self) {
+ return self;
+}
+
+/**
+This function found in impl {libcrux_secrets::traits::Declassify<T> for T}
+*/
+/**
+A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8
+with types uint64_t
+
+*/
+static KRML_MUSTINLINE uint64_t
+libcrux_secrets_int_public_integers_declassify_d8_49(uint64_t self) {
+ return self;
+}
+
+/**
+This function found in impl {libcrux_secrets::int::CastOps for u64}
+*/
+static KRML_MUSTINLINE uint32_t libcrux_secrets_int_as_u32_a3(uint64_t self) {
+ return libcrux_secrets_int_public_integers_classify_27_df(
+ (uint32_t)libcrux_secrets_int_public_integers_declassify_d8_49(self));
+}
+
+/**
+This function found in impl {libcrux_secrets::int::CastOps for u32}
+*/
+static KRML_MUSTINLINE int16_t libcrux_secrets_int_as_i16_b8(uint32_t self) {
+ return libcrux_secrets_int_public_integers_classify_27_39(
+ (int16_t)libcrux_secrets_int_public_integers_declassify_d8_df(self));
+}
+
+/**
+This function found in impl {libcrux_secrets::int::CastOps for i16}
+*/
+static KRML_MUSTINLINE int16_t libcrux_secrets_int_as_i16_f5(int16_t self) {
+ return libcrux_secrets_int_public_integers_classify_27_39(
+ libcrux_secrets_int_public_integers_declassify_d8_39(self));
+}
+
typedef struct libcrux_ml_kem_utils_extraction_helper_Keypair768_s {
uint8_t fst[1152U];
uint8_t snd[1184U];
} libcrux_ml_kem_utils_extraction_helper_Keypair768;
+#define Ok 0
+#define Err 1
+
+typedef uint8_t Result_b2_tags;
+
/**
A monomorphic instance of core.result.Result
with types uint8_t[24size_t], core_array_TryFromSliceError
*/
-typedef struct Result_6f_s {
- Result_86_tags tag;
+typedef struct Result_b2_s {
+ Result_b2_tags tag;
union {
uint8_t case_Ok[24U];
TryFromSliceError case_Err;
} val;
-} Result_6f;
+} Result_b2;
/**
-This function found in impl {core::result::Result<T, E>}
+This function found in impl {core::result::Result<T, E>[TraitClause@0,
+TraitClause@1]}
*/
/**
-A monomorphic instance of core.result.unwrap_41
+A monomorphic instance of core.result.unwrap_26
with types uint8_t[24size_t], core_array_TryFromSliceError
*/
-static inline void unwrap_41_1c(Result_6f self, uint8_t ret[24U]) {
+static inline void unwrap_26_70(Result_b2 self, uint8_t ret[24U]) {
if (self.tag == Ok) {
uint8_t f0[24U];
memcpy(f0, self.val.case_Ok, (size_t)24U * sizeof(uint8_t));
@@ -338,23 +928,24 @@ A monomorphic instance of core.result.Result
with types uint8_t[20size_t], core_array_TryFromSliceError
*/
-typedef struct Result_7a_s {
- Result_86_tags tag;
+typedef struct Result_e1_s {
+ Result_b2_tags tag;
union {
uint8_t case_Ok[20U];
TryFromSliceError case_Err;
} val;
-} Result_7a;
+} Result_e1;
/**
-This function found in impl {core::result::Result<T, E>}
+This function found in impl {core::result::Result<T, E>[TraitClause@0,
+TraitClause@1]}
*/
/**
-A monomorphic instance of core.result.unwrap_41
+A monomorphic instance of core.result.unwrap_26
with types uint8_t[20size_t], core_array_TryFromSliceError
*/
-static inline void unwrap_41_34(Result_7a self, uint8_t ret[20U]) {
+static inline void unwrap_26_20(Result_e1 self, uint8_t ret[20U]) {
if (self.tag == Ok) {
uint8_t f0[20U];
memcpy(f0, self.val.case_Ok, (size_t)20U * sizeof(uint8_t));
@@ -367,61 +958,46 @@ static inline void unwrap_41_34(Result_7a self, uint8_t ret[20U]) {
}
/**
-A monomorphic instance of core.result.Result
-with types uint8_t[10size_t], core_array_TryFromSliceError
-
-*/
-typedef struct Result_cd_s {
- Result_86_tags tag;
- union {
- uint8_t case_Ok[10U];
- TryFromSliceError case_Err;
- } val;
-} Result_cd;
-
-/**
-This function found in impl {core::result::Result<T, E>}
+ Pad the `slice` with `0`s at the end.
*/
/**
-A monomorphic instance of core.result.unwrap_41
-with types uint8_t[10size_t], core_array_TryFromSliceError
-
+A monomorphic instance of libcrux_ml_kem.utils.into_padded_array
+with const generics
+- LEN= 32
*/
-static inline void unwrap_41_e8(Result_cd self, uint8_t ret[10U]) {
- if (self.tag == Ok) {
- uint8_t f0[10U];
- memcpy(f0, self.val.case_Ok, (size_t)10U * sizeof(uint8_t));
- memcpy(ret, f0, (size_t)10U * sizeof(uint8_t));
- } else {
- KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__,
- "unwrap not Ok");
- KRML_HOST_EXIT(255U);
- }
+static KRML_MUSTINLINE void libcrux_ml_kem_utils_into_padded_array_9e(
+ Eurydice_slice slice, uint8_t ret[32U]) {
+ uint8_t out[32U] = {0U};
+ uint8_t *uu____0 = out;
+ Eurydice_slice_copy(
+ Eurydice_array_to_subslice3(
+ uu____0, (size_t)0U, Eurydice_slice_len(slice, uint8_t), uint8_t *),
+ slice, uint8_t);
+ memcpy(ret, out, (size_t)32U * sizeof(uint8_t));
}
-typedef struct Eurydice_slice_uint8_t_4size_t__x2_s {
- Eurydice_slice fst[4U];
- Eurydice_slice snd[4U];
-} Eurydice_slice_uint8_t_4size_t__x2;
-
-typedef struct libcrux_ml_kem_mlkem768_MlKem768Ciphertext_s {
- uint8_t value[1088U];
-} libcrux_ml_kem_mlkem768_MlKem768Ciphertext;
-
/**
- A reference to the raw byte slice.
+A monomorphic instance of libcrux_ml_kem.types.MlKemPrivateKey
+with const generics
+- $2400size_t
*/
+typedef struct libcrux_ml_kem_types_MlKemPrivateKey_d9_s {
+ uint8_t value[2400U];
+} libcrux_ml_kem_types_MlKemPrivateKey_d9;
+
/**
-This function found in impl {libcrux_ml_kem::types::MlKemCiphertext<SIZE>#6}
+This function found in impl {core::default::Default for
+libcrux_ml_kem::types::MlKemPrivateKey<SIZE>}
*/
/**
-A monomorphic instance of libcrux_ml_kem.types.as_slice_d4
+A monomorphic instance of libcrux_ml_kem.types.default_d3
with const generics
-- SIZE= 1088
+- SIZE= 2400
*/
-static inline uint8_t *libcrux_ml_kem_types_as_slice_d4_1d(
- libcrux_ml_kem_mlkem768_MlKem768Ciphertext *self) {
- return self->value;
+static inline libcrux_ml_kem_types_MlKemPrivateKey_d9
+libcrux_ml_kem_types_default_d3_28(void) {
+ return (
+ KRML_CLITERAL(libcrux_ml_kem_types_MlKemPrivateKey_d9){.value = {0U}});
}
/**
@@ -429,47 +1005,35 @@ A monomorphic instance of libcrux_ml_kem.types.MlKemPublicKey
with const generics
- $1184size_t
*/
-typedef struct libcrux_ml_kem_types_MlKemPublicKey_15_s {
+typedef struct libcrux_ml_kem_types_MlKemPublicKey_30_s {
uint8_t value[1184U];
-} libcrux_ml_kem_types_MlKemPublicKey_15;
+} libcrux_ml_kem_types_MlKemPublicKey_30;
/**
-This function found in impl {(core::convert::From<@Array<u8, SIZE>> for
-libcrux_ml_kem::types::MlKemPublicKey<SIZE>)#14}
+This function found in impl {core::convert::From<@Array<u8, SIZE>> for
+libcrux_ml_kem::types::MlKemPublicKey<SIZE>}
*/
/**
-A monomorphic instance of libcrux_ml_kem.types.from_b6
+A monomorphic instance of libcrux_ml_kem.types.from_fd
with const generics
- SIZE= 1184
*/
-static inline libcrux_ml_kem_types_MlKemPublicKey_15
-libcrux_ml_kem_types_from_b6_da(uint8_t value[1184U]) {
+static inline libcrux_ml_kem_types_MlKemPublicKey_30
+libcrux_ml_kem_types_from_fd_d0(uint8_t value[1184U]) {
/* Passing arrays by value in Rust generates a copy in C */
uint8_t copy_of_value[1184U];
memcpy(copy_of_value, value, (size_t)1184U * sizeof(uint8_t));
- libcrux_ml_kem_types_MlKemPublicKey_15 lit;
+ libcrux_ml_kem_types_MlKemPublicKey_30 lit;
memcpy(lit.value, copy_of_value, (size_t)1184U * sizeof(uint8_t));
return lit;
}
-/**
-A monomorphic instance of libcrux_ml_kem.types.MlKemPrivateKey
-with const generics
-- $2400size_t
-*/
-typedef struct libcrux_ml_kem_types_MlKemPrivateKey_55_s {
- uint8_t value[2400U];
-} libcrux_ml_kem_types_MlKemPrivateKey_55;
-
typedef struct libcrux_ml_kem_mlkem768_MlKem768KeyPair_s {
- libcrux_ml_kem_types_MlKemPrivateKey_55 sk;
- libcrux_ml_kem_types_MlKemPublicKey_15 pk;
+ libcrux_ml_kem_types_MlKemPrivateKey_d9 sk;
+ libcrux_ml_kem_types_MlKemPublicKey_30 pk;
} libcrux_ml_kem_mlkem768_MlKem768KeyPair;
/**
- Create a new [`MlKemKeyPair`] from the secret and public key.
-*/
-/**
This function found in impl
{libcrux_ml_kem::types::MlKemKeyPair<PRIVATE_KEY_SIZE, PUBLIC_KEY_SIZE>}
*/
@@ -480,27 +1044,27 @@ with const generics
- PUBLIC_KEY_SIZE= 1184
*/
static inline libcrux_ml_kem_mlkem768_MlKem768KeyPair
-libcrux_ml_kem_types_from_17_35(libcrux_ml_kem_types_MlKemPrivateKey_55 sk,
- libcrux_ml_kem_types_MlKemPublicKey_15 pk) {
- return (
- CLITERAL(libcrux_ml_kem_mlkem768_MlKem768KeyPair){.sk = sk, .pk = pk});
+libcrux_ml_kem_types_from_17_74(libcrux_ml_kem_types_MlKemPrivateKey_d9 sk,
+ libcrux_ml_kem_types_MlKemPublicKey_30 pk) {
+ return (KRML_CLITERAL(libcrux_ml_kem_mlkem768_MlKem768KeyPair){.sk = sk,
+ .pk = pk});
}
/**
-This function found in impl {(core::convert::From<@Array<u8, SIZE>> for
-libcrux_ml_kem::types::MlKemPrivateKey<SIZE>)#8}
+This function found in impl {core::convert::From<@Array<u8, SIZE>> for
+libcrux_ml_kem::types::MlKemPrivateKey<SIZE>}
*/
/**
-A monomorphic instance of libcrux_ml_kem.types.from_05
+A monomorphic instance of libcrux_ml_kem.types.from_77
with const generics
- SIZE= 2400
*/
-static inline libcrux_ml_kem_types_MlKemPrivateKey_55
-libcrux_ml_kem_types_from_05_f2(uint8_t value[2400U]) {
+static inline libcrux_ml_kem_types_MlKemPrivateKey_d9
+libcrux_ml_kem_types_from_77_28(uint8_t value[2400U]) {
/* Passing arrays by value in Rust generates a copy in C */
uint8_t copy_of_value[2400U];
memcpy(copy_of_value, value, (size_t)2400U * sizeof(uint8_t));
- libcrux_ml_kem_types_MlKemPrivateKey_55 lit;
+ libcrux_ml_kem_types_MlKemPrivateKey_d9 lit;
memcpy(lit.value, copy_of_value, (size_t)2400U * sizeof(uint8_t));
return lit;
}
@@ -510,23 +1074,24 @@ A monomorphic instance of core.result.Result
with types uint8_t[32size_t], core_array_TryFromSliceError
*/
-typedef struct Result_00_s {
- Result_86_tags tag;
+typedef struct Result_fb_s {
+ Result_b2_tags tag;
union {
uint8_t case_Ok[32U];
TryFromSliceError case_Err;
} val;
-} Result_00;
+} Result_fb;
/**
-This function found in impl {core::result::Result<T, E>}
+This function found in impl {core::result::Result<T, E>[TraitClause@0,
+TraitClause@1]}
*/
/**
-A monomorphic instance of core.result.unwrap_41
+A monomorphic instance of core.result.unwrap_26
with types uint8_t[32size_t], core_array_TryFromSliceError
*/
-static inline void unwrap_41_83(Result_00 self, uint8_t ret[32U]) {
+static inline void unwrap_26_b3(Result_fb self, uint8_t ret[32U]) {
if (self.tag == Ok) {
uint8_t f0[32U];
memcpy(f0, self.val.case_Ok, (size_t)32U * sizeof(uint8_t));
@@ -538,28 +1103,32 @@ static inline void unwrap_41_83(Result_00 self, uint8_t ret[32U]) {
}
}
+typedef struct libcrux_ml_kem_mlkem768_MlKem768Ciphertext_s {
+ uint8_t value[1088U];
+} libcrux_ml_kem_mlkem768_MlKem768Ciphertext;
+
/**
A monomorphic instance of K.
with types libcrux_ml_kem_types_MlKemCiphertext[[$1088size_t]],
uint8_t[32size_t]
*/
-typedef struct tuple_3c_s {
+typedef struct tuple_c2_s {
libcrux_ml_kem_mlkem768_MlKem768Ciphertext fst;
uint8_t snd[32U];
-} tuple_3c;
+} tuple_c2;
/**
-This function found in impl {(core::convert::From<@Array<u8, SIZE>> for
-libcrux_ml_kem::types::MlKemCiphertext<SIZE>)#2}
+This function found in impl {core::convert::From<@Array<u8, SIZE>> for
+libcrux_ml_kem::types::MlKemCiphertext<SIZE>}
*/
/**
-A monomorphic instance of libcrux_ml_kem.types.from_01
+A monomorphic instance of libcrux_ml_kem.types.from_e0
with const generics
- SIZE= 1088
*/
static inline libcrux_ml_kem_mlkem768_MlKem768Ciphertext
-libcrux_ml_kem_types_from_01_9f(uint8_t value[1088U]) {
+libcrux_ml_kem_types_from_e0_80(uint8_t value[1088U]) {
/* Passing arrays by value in Rust generates a copy in C */
uint8_t copy_of_value[1088U];
memcpy(copy_of_value, value, (size_t)1088U * sizeof(uint8_t));
@@ -569,22 +1138,47 @@ libcrux_ml_kem_types_from_01_9f(uint8_t value[1088U]) {
}
/**
- A reference to the raw byte slice.
+This function found in impl {libcrux_ml_kem::types::MlKemPublicKey<SIZE>}
*/
/**
-This function found in impl {libcrux_ml_kem::types::MlKemPublicKey<SIZE>#18}
+A monomorphic instance of libcrux_ml_kem.types.as_slice_e6
+with const generics
+- SIZE= 1184
+*/
+static inline uint8_t *libcrux_ml_kem_types_as_slice_e6_d0(
+ libcrux_ml_kem_types_MlKemPublicKey_30 *self) {
+ return self->value;
+}
+
+/**
+This function found in impl {libcrux_ml_kem::types::MlKemCiphertext<SIZE>}
*/
/**
-A monomorphic instance of libcrux_ml_kem.types.as_slice_cb
+A monomorphic instance of libcrux_ml_kem.types.as_slice_a9
with const generics
-- SIZE= 1184
+- SIZE= 1088
*/
-static inline uint8_t *libcrux_ml_kem_types_as_slice_cb_50(
- libcrux_ml_kem_types_MlKemPublicKey_15 *self) {
+static inline uint8_t *libcrux_ml_kem_types_as_slice_a9_80(
+ libcrux_ml_kem_mlkem768_MlKem768Ciphertext *self) {
return self->value;
}
/**
+A monomorphic instance of libcrux_ml_kem.utils.prf_input_inc
+with const generics
+- K= 3
+*/
+static KRML_MUSTINLINE uint8_t libcrux_ml_kem_utils_prf_input_inc_e0(
+ uint8_t (*prf_inputs)[33U], uint8_t domain_separator) {
+ for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
+ size_t i0 = i;
+ prf_inputs[i0][32U] = domain_separator;
+ domain_separator = (uint32_t)domain_separator + 1U;
+ }
+ return domain_separator;
+}
+
+/**
Pad the `slice` with `0`s at the end.
*/
/**
@@ -592,13 +1186,13 @@ A monomorphic instance of libcrux_ml_kem.utils.into_padded_array
with const generics
- LEN= 33
*/
-static KRML_MUSTINLINE void libcrux_ml_kem_utils_into_padded_array_ea2(
+static KRML_MUSTINLINE void libcrux_ml_kem_utils_into_padded_array_c8(
Eurydice_slice slice, uint8_t ret[33U]) {
uint8_t out[33U] = {0U};
uint8_t *uu____0 = out;
Eurydice_slice_copy(
- Eurydice_array_to_subslice2(uu____0, (size_t)0U,
- Eurydice_slice_len(slice, uint8_t), uint8_t),
+ Eurydice_array_to_subslice3(
+ uu____0, (size_t)0U, Eurydice_slice_len(slice, uint8_t), uint8_t *),
slice, uint8_t);
memcpy(ret, out, (size_t)33U * sizeof(uint8_t));
}
@@ -611,27 +1205,27 @@ A monomorphic instance of libcrux_ml_kem.utils.into_padded_array
with const generics
- LEN= 34
*/
-static KRML_MUSTINLINE void libcrux_ml_kem_utils_into_padded_array_ea1(
+static KRML_MUSTINLINE void libcrux_ml_kem_utils_into_padded_array_b6(
Eurydice_slice slice, uint8_t ret[34U]) {
uint8_t out[34U] = {0U};
uint8_t *uu____0 = out;
Eurydice_slice_copy(
- Eurydice_array_to_subslice2(uu____0, (size_t)0U,
- Eurydice_slice_len(slice, uint8_t), uint8_t),
+ Eurydice_array_to_subslice3(
+ uu____0, (size_t)0U, Eurydice_slice_len(slice, uint8_t), uint8_t *),
slice, uint8_t);
memcpy(ret, out, (size_t)34U * sizeof(uint8_t));
}
/**
-This function found in impl {(core::convert::AsRef<@Slice<u8>> for
-libcrux_ml_kem::types::MlKemCiphertext<SIZE>)#1}
+This function found in impl {core::convert::AsRef<@Slice<u8>> for
+libcrux_ml_kem::types::MlKemCiphertext<SIZE>}
*/
/**
-A monomorphic instance of libcrux_ml_kem.types.as_ref_00
+A monomorphic instance of libcrux_ml_kem.types.as_ref_d3
with const generics
- SIZE= 1088
*/
-static inline Eurydice_slice libcrux_ml_kem_types_as_ref_00_24(
+static inline Eurydice_slice libcrux_ml_kem_types_as_ref_d3_80(
libcrux_ml_kem_mlkem768_MlKem768Ciphertext *self) {
return Eurydice_array_to_slice((size_t)1088U, self->value, uint8_t);
}
@@ -644,13 +1238,13 @@ A monomorphic instance of libcrux_ml_kem.utils.into_padded_array
with const generics
- LEN= 1120
*/
-static KRML_MUSTINLINE void libcrux_ml_kem_utils_into_padded_array_ea0(
+static KRML_MUSTINLINE void libcrux_ml_kem_utils_into_padded_array_15(
Eurydice_slice slice, uint8_t ret[1120U]) {
uint8_t out[1120U] = {0U};
uint8_t *uu____0 = out;
Eurydice_slice_copy(
- Eurydice_array_to_subslice2(uu____0, (size_t)0U,
- Eurydice_slice_len(slice, uint8_t), uint8_t),
+ Eurydice_array_to_subslice3(
+ uu____0, (size_t)0U, Eurydice_slice_len(slice, uint8_t), uint8_t *),
slice, uint8_t);
memcpy(ret, out, (size_t)1120U * sizeof(uint8_t));
}
@@ -663,39 +1257,182 @@ A monomorphic instance of libcrux_ml_kem.utils.into_padded_array
with const generics
- LEN= 64
*/
-static KRML_MUSTINLINE void libcrux_ml_kem_utils_into_padded_array_ea(
+static KRML_MUSTINLINE void libcrux_ml_kem_utils_into_padded_array_24(
Eurydice_slice slice, uint8_t ret[64U]) {
uint8_t out[64U] = {0U};
uint8_t *uu____0 = out;
Eurydice_slice_copy(
- Eurydice_array_to_subslice2(uu____0, (size_t)0U,
- Eurydice_slice_len(slice, uint8_t), uint8_t),
+ Eurydice_array_to_subslice3(
+ uu____0, (size_t)0U, Eurydice_slice_len(slice, uint8_t), uint8_t *),
slice, uint8_t);
memcpy(ret, out, (size_t)64U * sizeof(uint8_t));
}
+typedef struct Eurydice_slice_uint8_t_x4_s {
+ Eurydice_slice fst;
+ Eurydice_slice snd;
+ Eurydice_slice thd;
+ Eurydice_slice f3;
+} Eurydice_slice_uint8_t_x4;
+
+typedef struct Eurydice_slice_uint8_t_x2_s {
+ Eurydice_slice fst;
+ Eurydice_slice snd;
+} Eurydice_slice_uint8_t_x2;
+
+/**
+ Unpack an incoming private key into it's different parts.
+
+ We have this here in types to extract into a common core for C.
+*/
+/**
+A monomorphic instance of libcrux_ml_kem.types.unpack_private_key
+with const generics
+- CPA_SECRET_KEY_SIZE= 1152
+- PUBLIC_KEY_SIZE= 1184
+*/
+static inline Eurydice_slice_uint8_t_x4
+libcrux_ml_kem_types_unpack_private_key_b4(Eurydice_slice private_key) {
+ Eurydice_slice_uint8_t_x2 uu____0 = Eurydice_slice_split_at(
+ private_key, (size_t)1152U, uint8_t, Eurydice_slice_uint8_t_x2);
+ Eurydice_slice ind_cpa_secret_key = uu____0.fst;
+ Eurydice_slice secret_key0 = uu____0.snd;
+ Eurydice_slice_uint8_t_x2 uu____1 = Eurydice_slice_split_at(
+ secret_key0, (size_t)1184U, uint8_t, Eurydice_slice_uint8_t_x2);
+ Eurydice_slice ind_cpa_public_key = uu____1.fst;
+ Eurydice_slice secret_key = uu____1.snd;
+ Eurydice_slice_uint8_t_x2 uu____2 = Eurydice_slice_split_at(
+ secret_key, LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE, uint8_t,
+ Eurydice_slice_uint8_t_x2);
+ Eurydice_slice ind_cpa_public_key_hash = uu____2.fst;
+ Eurydice_slice implicit_rejection_value = uu____2.snd;
+ return (
+ KRML_CLITERAL(Eurydice_slice_uint8_t_x4){.fst = ind_cpa_secret_key,
+ .snd = ind_cpa_public_key,
+ .thd = ind_cpa_public_key_hash,
+ .f3 = implicit_rejection_value});
+}
+
+/**
+This function found in impl {libcrux_secrets::traits::Declassify<T> for T}
+*/
+/**
+A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8
+with types uint8_t[24size_t]
+
+*/
+static KRML_MUSTINLINE void
+libcrux_secrets_int_public_integers_declassify_d8_d2(uint8_t self[24U],
+ uint8_t ret[24U]) {
+ memcpy(ret, self, (size_t)24U * sizeof(uint8_t));
+}
+
+/**
+This function found in impl {libcrux_secrets::traits::Declassify<T> for T}
+*/
+/**
+A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8
+with types uint8_t[20size_t]
+
+*/
+static KRML_MUSTINLINE void
+libcrux_secrets_int_public_integers_declassify_d8_57(uint8_t self[20U],
+ uint8_t ret[20U]) {
+ memcpy(ret, self, (size_t)20U * sizeof(uint8_t));
+}
+
+/**
+This function found in impl {libcrux_secrets::traits::Declassify<T> for T}
+*/
+/**
+A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8
+with types uint8_t[8size_t]
+
+*/
+static KRML_MUSTINLINE void
+libcrux_secrets_int_public_integers_declassify_d8_76(uint8_t self[8U],
+ uint8_t ret[8U]) {
+ memcpy(ret, self, (size_t)8U * sizeof(uint8_t));
+}
+
+/**
+This function found in impl {libcrux_secrets::traits::Declassify<T> for T}
+*/
+/**
+A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8
+with types uint8_t[2size_t]
+
+*/
+static KRML_MUSTINLINE void
+libcrux_secrets_int_public_integers_declassify_d8_d4(uint8_t self[2U],
+ uint8_t ret[2U]) {
+ memcpy(ret, self, (size_t)2U * sizeof(uint8_t));
+}
+
+/**
+This function found in impl {libcrux_secrets::traits::Classify<T> for T}
+*/
+/**
+A monomorphic instance of libcrux_secrets.int.public_integers.classify_27
+with types int16_t[16size_t]
+
+*/
+static KRML_MUSTINLINE void libcrux_secrets_int_public_integers_classify_27_46(
+ int16_t self[16U], int16_t ret[16U]) {
+ memcpy(ret, self, (size_t)16U * sizeof(int16_t));
+}
+
+/**
+This function found in impl {libcrux_secrets::traits::ClassifyRef<&'a
+(@Slice<T>)> for &'a (@Slice<T>)}
+*/
+/**
+A monomorphic instance of libcrux_secrets.int.classify_public.classify_ref_9b
+with types uint8_t
+
+*/
+static KRML_MUSTINLINE Eurydice_slice
+libcrux_secrets_int_classify_public_classify_ref_9b_90(Eurydice_slice self) {
+ return self;
+}
+
+/**
+This function found in impl {libcrux_secrets::traits::ClassifyRef<&'a
+(@Slice<T>)> for &'a (@Slice<T>)}
+*/
+/**
+A monomorphic instance of libcrux_secrets.int.classify_public.classify_ref_9b
+with types int16_t
+
+*/
+static KRML_MUSTINLINE Eurydice_slice
+libcrux_secrets_int_classify_public_classify_ref_9b_39(Eurydice_slice self) {
+ return self;
+}
+
/**
A monomorphic instance of core.result.Result
with types int16_t[16size_t], core_array_TryFromSliceError
*/
-typedef struct Result_c0_s {
- Result_86_tags tag;
+typedef struct Result_0a_s {
+ Result_b2_tags tag;
union {
int16_t case_Ok[16U];
TryFromSliceError case_Err;
} val;
-} Result_c0;
+} Result_0a;
/**
-This function found in impl {core::result::Result<T, E>}
+This function found in impl {core::result::Result<T, E>[TraitClause@0,
+TraitClause@1]}
*/
/**
-A monomorphic instance of core.result.unwrap_41
+A monomorphic instance of core.result.unwrap_26
with types int16_t[16size_t], core_array_TryFromSliceError
*/
-static inline void unwrap_41_f9(Result_c0 self, int16_t ret[16U]) {
+static inline void unwrap_26_00(Result_0a self, int16_t ret[16U]) {
if (self.tag == Ok) {
int16_t f0[16U];
memcpy(f0, self.val.case_Ok, (size_t)16U * sizeof(int16_t));
@@ -712,23 +1449,24 @@ A monomorphic instance of core.result.Result
with types uint8_t[8size_t], core_array_TryFromSliceError
*/
-typedef struct Result_56_s {
- Result_86_tags tag;
+typedef struct Result_15_s {
+ Result_b2_tags tag;
union {
uint8_t case_Ok[8U];
TryFromSliceError case_Err;
} val;
-} Result_56;
+} Result_15;
/**
-This function found in impl {core::result::Result<T, E>}
+This function found in impl {core::result::Result<T, E>[TraitClause@0,
+TraitClause@1]}
*/
/**
-A monomorphic instance of core.result.unwrap_41
+A monomorphic instance of core.result.unwrap_26
with types uint8_t[8size_t], core_array_TryFromSliceError
*/
-static inline void unwrap_41_ac(Result_56 self, uint8_t ret[8U]) {
+static inline void unwrap_26_68(Result_15 self, uint8_t ret[8U]) {
if (self.tag == Ok) {
uint8_t f0[8U];
memcpy(f0, self.val.case_Ok, (size_t)8U * sizeof(uint8_t));
@@ -740,39 +1478,30 @@ static inline void unwrap_41_ac(Result_56 self, uint8_t ret[8U]) {
}
}
-typedef struct Eurydice_slice_uint8_t_x2_s {
- Eurydice_slice fst;
- Eurydice_slice snd;
-} Eurydice_slice_uint8_t_x2;
-
-typedef struct Eurydice_slice_uint8_t_1size_t__x2_s {
- Eurydice_slice fst[1U];
- Eurydice_slice snd[1U];
-} Eurydice_slice_uint8_t_1size_t__x2;
-
#if defined(__cplusplus)
}
#endif
-#define __libcrux_core_H_DEFINED
-#endif
+#define libcrux_mlkem_core_H_DEFINED
+#endif /* libcrux_mlkem_core_H */
-/* from libcrux/libcrux-ml-kem/cg/libcrux_ct_ops.h */
+/* from libcrux/libcrux-ml-kem/extracts/c_header_only/generated/libcrux_ct_ops.h */
/*
- * SPDX-FileCopyrightText: 2024 Cryspen Sarl <info@cryspen.com>
+ * SPDX-FileCopyrightText: 2025 Cryspen Sarl <info@cryspen.com>
*
* SPDX-License-Identifier: MIT or Apache-2.0
*
* This code was generated with the following revisions:
- * Charon: 6b5e110342a771a3e1c739b10294b1778e4be8b4
- * Eurydice: 31be7d65ca5d6acdacfb33652e478d24dd85c1cb
- * Karamel: 3205d3365ea2790b02368f79fcee38e38d0b5908
- * F*: a32b316e521fa4f239b610ec8f1d15e78d62cbe8-dirty
- * Libcrux: 4ad532b206174114dd4140b718e7794a28fc59ee
+ * Charon: 667d2fc98984ff7f3df989c2367e6c1fa4a000e7
+ * Eurydice: 2381cbc416ef2ad0b561c362c500bc84f36b6785
+ * Karamel: 80f5435f2fc505973c469a4afcc8d875cddd0d8b
+ * F*: 71d8221589d4d438af3706d89cb653cf53e18aab
+ * Libcrux: 68dfed5a4a9e40277f62828471c029afed1ecdcc
*/
-#ifndef __libcrux_ct_ops_H
-#define __libcrux_ct_ops_H
+#ifndef libcrux_ct_ops_H
+#define libcrux_ct_ops_H
+
#if defined(__cplusplus)
extern "C" {
@@ -782,14 +1511,12 @@ extern "C" {
/**
Return 1 if `value` is not zero and 0 otherwise.
*/
-static inline uint8_t libcrux_ml_kem_constant_time_ops_inz(uint8_t value) {
+static KRML_NOINLINE uint8_t
+libcrux_ml_kem_constant_time_ops_inz(uint8_t value) {
uint16_t value0 = (uint16_t)value;
- uint16_t result = (((uint32_t)value0 |
- (uint32_t)core_num__u16_7__wrapping_add(~value0, 1U)) &
- 0xFFFFU) >>
- 8U &
- 1U;
- return (uint8_t)result;
+ uint8_t result =
+ (uint8_t)((uint32_t)core_num__u16__wrapping_add(~value0, 1U) >> 8U);
+ return (uint32_t)result & 1U;
}
static KRML_NOINLINE uint8_t
@@ -801,14 +1528,15 @@ libcrux_ml_kem_constant_time_ops_is_non_zero(uint8_t value) {
Return 1 if the bytes of `lhs` and `rhs` do not exactly
match and 0 otherwise.
*/
-static inline uint8_t libcrux_ml_kem_constant_time_ops_compare(
+static KRML_NOINLINE uint8_t libcrux_ml_kem_constant_time_ops_compare(
Eurydice_slice lhs, Eurydice_slice rhs) {
uint8_t r = 0U;
for (size_t i = (size_t)0U; i < Eurydice_slice_len(lhs, uint8_t); i++) {
size_t i0 = i;
- r = (uint32_t)r |
- ((uint32_t)Eurydice_slice_index(lhs, i0, uint8_t, uint8_t *) ^
- (uint32_t)Eurydice_slice_index(rhs, i0, uint8_t, uint8_t *));
+ uint8_t nr = (uint32_t)r |
+ ((uint32_t)Eurydice_slice_index(lhs, i0, uint8_t, uint8_t *) ^
+ (uint32_t)Eurydice_slice_index(rhs, i0, uint8_t, uint8_t *));
+ r = nr;
}
return libcrux_ml_kem_constant_time_ops_is_non_zero(r);
}
@@ -823,19 +1551,21 @@ libcrux_ml_kem_constant_time_ops_compare_ciphertexts_in_constant_time(
If `selector` is not zero, return the bytes in `rhs`; return the bytes in
`lhs` otherwise.
*/
-static inline void libcrux_ml_kem_constant_time_ops_select_ct(
+static KRML_NOINLINE void libcrux_ml_kem_constant_time_ops_select_ct(
Eurydice_slice lhs, Eurydice_slice rhs, uint8_t selector,
uint8_t ret[32U]) {
- uint8_t mask = core_num__u8_6__wrapping_sub(
+ uint8_t mask = core_num__u8__wrapping_sub(
libcrux_ml_kem_constant_time_ops_is_non_zero(selector), 1U);
uint8_t out[32U] = {0U};
for (size_t i = (size_t)0U; i < LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE;
i++) {
size_t i0 = i;
- out[i0] = ((uint32_t)Eurydice_slice_index(lhs, i0, uint8_t, uint8_t *) &
- (uint32_t)mask) |
- ((uint32_t)Eurydice_slice_index(rhs, i0, uint8_t, uint8_t *) &
- (uint32_t)~mask);
+ uint8_t outi =
+ ((uint32_t)Eurydice_slice_index(lhs, i0, uint8_t, uint8_t *) &
+ (uint32_t)mask) |
+ ((uint32_t)Eurydice_slice_index(rhs, i0, uint8_t, uint8_t *) &
+ (uint32_t)~mask);
+ out[i0] = outi;
}
memcpy(ret, out, (size_t)32U * sizeof(uint8_t));
}
@@ -847,7 +1577,7 @@ libcrux_ml_kem_constant_time_ops_select_shared_secret_in_constant_time(
libcrux_ml_kem_constant_time_ops_select_ct(lhs, rhs, selector, ret);
}
-static inline void
+static KRML_NOINLINE void
libcrux_ml_kem_constant_time_ops_compare_ciphertexts_select_shared_secret_in_constant_time(
Eurydice_slice lhs_c, Eurydice_slice rhs_c, Eurydice_slice lhs_s,
Eurydice_slice rhs_s, uint8_t ret[32U]) {
@@ -864,186 +1594,142 @@ libcrux_ml_kem_constant_time_ops_compare_ciphertexts_select_shared_secret_in_con
}
#endif
-#define __libcrux_ct_ops_H_DEFINED
-#endif
+#define libcrux_ct_ops_H_DEFINED
+#endif /* libcrux_ct_ops_H */
-/* from libcrux/libcrux-ml-kem/cg/libcrux_sha3_portable.h */
+/* from libcrux/libcrux-ml-kem/extracts/c_header_only/generated/libcrux_sha3_portable.h */
/*
- * SPDX-FileCopyrightText: 2024 Cryspen Sarl <info@cryspen.com>
+ * SPDX-FileCopyrightText: 2025 Cryspen Sarl <info@cryspen.com>
*
* SPDX-License-Identifier: MIT or Apache-2.0
*
* This code was generated with the following revisions:
- * Charon: 6b5e110342a771a3e1c739b10294b1778e4be8b4
- * Eurydice: 31be7d65ca5d6acdacfb33652e478d24dd85c1cb
- * Karamel: 3205d3365ea2790b02368f79fcee38e38d0b5908
- * F*: a32b316e521fa4f239b610ec8f1d15e78d62cbe8-dirty
- * Libcrux: 4ad532b206174114dd4140b718e7794a28fc59ee
+ * Charon: 667d2fc98984ff7f3df989c2367e6c1fa4a000e7
+ * Eurydice: 2381cbc416ef2ad0b561c362c500bc84f36b6785
+ * Karamel: 80f5435f2fc505973c469a4afcc8d875cddd0d8b
+ * F*: 71d8221589d4d438af3706d89cb653cf53e18aab
+ * Libcrux: 68dfed5a4a9e40277f62828471c029afed1ecdcc
*/
-#ifndef __libcrux_sha3_portable_H
-#define __libcrux_sha3_portable_H
+#ifndef libcrux_sha3_portable_H
+#define libcrux_sha3_portable_H
+
#if defined(__cplusplus)
extern "C" {
#endif
-static const uint64_t libcrux_sha3_generic_keccak_ROUNDCONSTANTS[24U] = {
- 1ULL,
- 32898ULL,
- 9223372036854808714ULL,
- 9223372039002292224ULL,
- 32907ULL,
- 2147483649ULL,
- 9223372039002292353ULL,
- 9223372036854808585ULL,
- 138ULL,
- 136ULL,
- 2147516425ULL,
- 2147483658ULL,
- 2147516555ULL,
- 9223372036854775947ULL,
- 9223372036854808713ULL,
- 9223372036854808579ULL,
- 9223372036854808578ULL,
- 9223372036854775936ULL,
- 32778ULL,
- 9223372039002259466ULL,
- 9223372039002292353ULL,
- 9223372036854808704ULL,
- 2147483649ULL,
- 9223372039002292232ULL};
-
/**
-This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
-usize> for u64)}
+This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
*/
-static KRML_MUSTINLINE uint64_t libcrux_sha3_portable_keccak_zero_5a(void) {
+static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_zero_d2(void) {
return 0ULL;
}
-static KRML_MUSTINLINE uint64_t libcrux_sha3_portable_keccak__veor5q_u64(
+static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable__veor5q_u64(
uint64_t a, uint64_t b, uint64_t c, uint64_t d, uint64_t e) {
- uint64_t ab = a ^ b;
- uint64_t cd = c ^ d;
- uint64_t abcd = ab ^ cd;
- return abcd ^ e;
+ return (((a ^ b) ^ c) ^ d) ^ e;
}
/**
-This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
-usize> for u64)}
+This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
*/
-static KRML_MUSTINLINE uint64_t libcrux_sha3_portable_keccak_xor5_5a(
+static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_xor5_d2(
uint64_t a, uint64_t b, uint64_t c, uint64_t d, uint64_t e) {
- return libcrux_sha3_portable_keccak__veor5q_u64(a, b, c, d, e);
+ return libcrux_sha3_simd_portable__veor5q_u64(a, b, c, d, e);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
+A monomorphic instance of libcrux_sha3.simd.portable.rotate_left
with const generics
- LEFT= 1
- RIGHT= 63
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak_rotate_left_cb(uint64_t x) {
- return x << (uint32_t)(int32_t)1 | x >> (uint32_t)(int32_t)63;
+libcrux_sha3_simd_portable_rotate_left_76(uint64_t x) {
+ return core_num__u64__rotate_left(x, (uint32_t)(int32_t)1);
}
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak__vrax1q_u64(uint64_t a, uint64_t b) {
+libcrux_sha3_simd_portable__vrax1q_u64(uint64_t a, uint64_t b) {
uint64_t uu____0 = a;
- return uu____0 ^ libcrux_sha3_portable_keccak_rotate_left_cb(b);
+ return uu____0 ^ libcrux_sha3_simd_portable_rotate_left_76(b);
}
/**
-This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
-usize> for u64)}
+This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak_rotate_left1_and_xor_5a(uint64_t a, uint64_t b) {
- return libcrux_sha3_portable_keccak__vrax1q_u64(a, b);
+libcrux_sha3_simd_portable_rotate_left1_and_xor_d2(uint64_t a, uint64_t b) {
+ return libcrux_sha3_simd_portable__vrax1q_u64(a, b);
}
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak__vbcaxq_u64(uint64_t a, uint64_t b, uint64_t c) {
+libcrux_sha3_simd_portable__vbcaxq_u64(uint64_t a, uint64_t b, uint64_t c) {
return a ^ (b & ~c);
}
/**
-This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
-usize> for u64)}
+This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
*/
-static KRML_MUSTINLINE uint64_t libcrux_sha3_portable_keccak_and_not_xor_5a(
- uint64_t a, uint64_t b, uint64_t c) {
- return libcrux_sha3_portable_keccak__vbcaxq_u64(a, b, c);
+static KRML_MUSTINLINE uint64_t
+libcrux_sha3_simd_portable_and_not_xor_d2(uint64_t a, uint64_t b, uint64_t c) {
+ return libcrux_sha3_simd_portable__vbcaxq_u64(a, b, c);
}
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak__veorq_n_u64(uint64_t a, uint64_t c) {
+libcrux_sha3_simd_portable__veorq_n_u64(uint64_t a, uint64_t c) {
return a ^ c;
}
/**
-This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
-usize> for u64)}
+This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak_xor_constant_5a(uint64_t a, uint64_t c) {
- return libcrux_sha3_portable_keccak__veorq_n_u64(a, c);
+libcrux_sha3_simd_portable_xor_constant_d2(uint64_t a, uint64_t c) {
+ return libcrux_sha3_simd_portable__veorq_n_u64(a, c);
}
/**
-This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
-usize> for u64)}
+This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
*/
-static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak_xor_5a(uint64_t a, uint64_t b) {
+static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_xor_d2(uint64_t a,
+ uint64_t b) {
return a ^ b;
}
-static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_slice_1(
- Eurydice_slice a[1U], size_t start, size_t len, Eurydice_slice ret[1U]) {
- ret[0U] = Eurydice_slice_subslice2(a[0U], start, start + len, uint8_t);
-}
-
-/**
-This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
-usize> for u64)}
-*/
-static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_slice_n_5a(
- Eurydice_slice a[1U], size_t start, size_t len, Eurydice_slice ret[1U]) {
- /* Passing arrays by value in Rust generates a copy in C */
- Eurydice_slice copy_of_a[1U];
- memcpy(copy_of_a, a, (size_t)1U * sizeof(Eurydice_slice));
- Eurydice_slice ret0[1U];
- libcrux_sha3_portable_keccak_slice_1(copy_of_a, start, len, ret0);
- memcpy(ret, ret0, (size_t)1U * sizeof(Eurydice_slice));
-}
-
-static KRML_MUSTINLINE Eurydice_slice_uint8_t_1size_t__x2
-libcrux_sha3_portable_keccak_split_at_mut_1(Eurydice_slice out[1U],
- size_t mid) {
- Eurydice_slice_uint8_t_x2 uu____0 = Eurydice_slice_split_at_mut(
- out[0U], mid, uint8_t, Eurydice_slice_uint8_t_x2);
- Eurydice_slice out00 = uu____0.fst;
- Eurydice_slice out01 = uu____0.snd;
- Eurydice_slice_uint8_t_1size_t__x2 lit;
- lit.fst[0U] = out00;
- lit.snd[0U] = out01;
- return lit;
-}
+static const uint64_t
+ libcrux_sha3_generic_keccak_constants_ROUNDCONSTANTS[24U] = {
+ 1ULL,
+ 32898ULL,
+ 9223372036854808714ULL,
+ 9223372039002292224ULL,
+ 32907ULL,
+ 2147483649ULL,
+ 9223372039002292353ULL,
+ 9223372036854808585ULL,
+ 138ULL,
+ 136ULL,
+ 2147516425ULL,
+ 2147483658ULL,
+ 2147516555ULL,
+ 9223372036854775947ULL,
+ 9223372036854808713ULL,
+ 9223372036854808579ULL,
+ 9223372036854808578ULL,
+ 9223372036854775936ULL,
+ 32778ULL,
+ 9223372039002259466ULL,
+ 9223372039002292353ULL,
+ 9223372036854808704ULL,
+ 2147483649ULL,
+ 9223372039002292232ULL};
-/**
-This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
-usize> for u64)}
-*/
-static KRML_MUSTINLINE Eurydice_slice_uint8_t_1size_t__x2
-libcrux_sha3_portable_keccak_split_at_mut_n_5a(Eurydice_slice a[1U],
- size_t mid) {
- return libcrux_sha3_portable_keccak_split_at_mut_1(a, mid);
-}
+typedef struct size_t_x2_s {
+ size_t fst;
+ size_t snd;
+} size_t_x2;
/**
A monomorphic instance of libcrux_sha3.generic_keccak.KeccakState
@@ -1051,2072 +1737,2128 @@ with types uint64_t
with const generics
- $1size_t
*/
-typedef struct libcrux_sha3_generic_keccak_KeccakState_48_s {
- uint64_t st[5U][5U];
-} libcrux_sha3_generic_keccak_KeccakState_48;
+typedef struct libcrux_sha3_generic_keccak_KeccakState_17_s {
+ uint64_t st[25U];
+} libcrux_sha3_generic_keccak_KeccakState_17;
/**
- Create a new Shake128 x4 state.
-*/
-/**
This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T,
-N>[TraitClause@0]#1}
+N>[TraitClause@0, TraitClause@1]}
*/
/**
-A monomorphic instance of libcrux_sha3.generic_keccak.new_1e
+A monomorphic instance of libcrux_sha3.generic_keccak.new_80
with types uint64_t
with const generics
- N= 1
*/
-static KRML_MUSTINLINE libcrux_sha3_generic_keccak_KeccakState_48
-libcrux_sha3_generic_keccak_new_1e_f4(void) {
- libcrux_sha3_generic_keccak_KeccakState_48 lit;
- lit.st[0U][0U] = libcrux_sha3_portable_keccak_zero_5a();
- lit.st[0U][1U] = libcrux_sha3_portable_keccak_zero_5a();
- lit.st[0U][2U] = libcrux_sha3_portable_keccak_zero_5a();
- lit.st[0U][3U] = libcrux_sha3_portable_keccak_zero_5a();
- lit.st[0U][4U] = libcrux_sha3_portable_keccak_zero_5a();
- lit.st[1U][0U] = libcrux_sha3_portable_keccak_zero_5a();
- lit.st[1U][1U] = libcrux_sha3_portable_keccak_zero_5a();
- lit.st[1U][2U] = libcrux_sha3_portable_keccak_zero_5a();
- lit.st[1U][3U] = libcrux_sha3_portable_keccak_zero_5a();
- lit.st[1U][4U] = libcrux_sha3_portable_keccak_zero_5a();
- lit.st[2U][0U] = libcrux_sha3_portable_keccak_zero_5a();
- lit.st[2U][1U] = libcrux_sha3_portable_keccak_zero_5a();
- lit.st[2U][2U] = libcrux_sha3_portable_keccak_zero_5a();
- lit.st[2U][3U] = libcrux_sha3_portable_keccak_zero_5a();
- lit.st[2U][4U] = libcrux_sha3_portable_keccak_zero_5a();
- lit.st[3U][0U] = libcrux_sha3_portable_keccak_zero_5a();
- lit.st[3U][1U] = libcrux_sha3_portable_keccak_zero_5a();
- lit.st[3U][2U] = libcrux_sha3_portable_keccak_zero_5a();
- lit.st[3U][3U] = libcrux_sha3_portable_keccak_zero_5a();
- lit.st[3U][4U] = libcrux_sha3_portable_keccak_zero_5a();
- lit.st[4U][0U] = libcrux_sha3_portable_keccak_zero_5a();
- lit.st[4U][1U] = libcrux_sha3_portable_keccak_zero_5a();
- lit.st[4U][2U] = libcrux_sha3_portable_keccak_zero_5a();
- lit.st[4U][3U] = libcrux_sha3_portable_keccak_zero_5a();
- lit.st[4U][4U] = libcrux_sha3_portable_keccak_zero_5a();
+static KRML_MUSTINLINE libcrux_sha3_generic_keccak_KeccakState_17
+libcrux_sha3_generic_keccak_new_80_04(void) {
+ libcrux_sha3_generic_keccak_KeccakState_17 lit;
+ uint64_t repeat_expression[25U];
+ for (size_t i = (size_t)0U; i < (size_t)25U; i++) {
+ repeat_expression[i] = libcrux_sha3_simd_portable_zero_d2();
+ }
+ memcpy(lit.st, repeat_expression, (size_t)25U * sizeof(uint64_t));
return lit;
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.load_block
+A monomorphic instance of libcrux_sha3.traits.get_ij
+with types uint64_t
+with const generics
+- N= 1
+*/
+static KRML_MUSTINLINE uint64_t *libcrux_sha3_traits_get_ij_04(uint64_t *arr,
+ size_t i,
+ size_t j) {
+ return &arr[(size_t)5U * j + i];
+}
+
+/**
+A monomorphic instance of libcrux_sha3.traits.set_ij
+with types uint64_t
+with const generics
+- N= 1
+*/
+static KRML_MUSTINLINE void libcrux_sha3_traits_set_ij_04(uint64_t *arr,
+ size_t i, size_t j,
+ uint64_t value) {
+ arr[(size_t)5U * j + i] = value;
+}
+
+/**
+A monomorphic instance of libcrux_sha3.simd.portable.load_block
with const generics
- RATE= 72
*/
-static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_2c(
- uint64_t (*s)[5U], Eurydice_slice blocks[1U]) {
+static KRML_MUSTINLINE void libcrux_sha3_simd_portable_load_block_f8(
+ uint64_t *state, Eurydice_slice blocks, size_t start) {
+ uint64_t state_flat[25U] = {0U};
for (size_t i = (size_t)0U; i < (size_t)72U / (size_t)8U; i++) {
size_t i0 = i;
+ size_t offset = start + (size_t)8U * i0;
uint8_t uu____0[8U];
- Result_56 dst;
+ Result_15 dst;
Eurydice_slice_to_array2(
&dst,
- Eurydice_slice_subslice2(blocks[0U], (size_t)8U * i0,
- (size_t)8U * i0 + (size_t)8U, uint8_t),
- Eurydice_slice, uint8_t[8U]);
- unwrap_41_ac(dst, uu____0);
- size_t uu____1 = i0 / (size_t)5U;
- size_t uu____2 = i0 % (size_t)5U;
- s[uu____1][uu____2] =
- s[uu____1][uu____2] ^ core_num__u64_9__from_le_bytes(uu____0);
+ Eurydice_slice_subslice3(blocks, offset, offset + (size_t)8U,
+ uint8_t *),
+ Eurydice_slice, uint8_t[8U], TryFromSliceError);
+ unwrap_26_68(dst, uu____0);
+ state_flat[i0] = core_num__u64__from_le_bytes(uu____0);
+ }
+ for (size_t i = (size_t)0U; i < (size_t)72U / (size_t)8U; i++) {
+ size_t i0 = i;
+ libcrux_sha3_traits_set_ij_04(
+ state, i0 / (size_t)5U, i0 % (size_t)5U,
+ libcrux_sha3_traits_get_ij_04(state, i0 / (size_t)5U,
+ i0 % (size_t)5U)[0U] ^
+ state_flat[i0]);
}
}
/**
-This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
-usize> for u64)}
+This function found in impl {libcrux_sha3::traits::Absorb<1usize> for
+libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>,
+libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for
+u64}]}
*/
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.load_block_5a
+A monomorphic instance of libcrux_sha3.simd.portable.load_block_a1
with const generics
- RATE= 72
*/
-static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_5a_b8(
- uint64_t (*a)[5U], Eurydice_slice b[1U]) {
- uint64_t(*uu____0)[5U] = a;
- /* Passing arrays by value in Rust generates a copy in C */
- Eurydice_slice copy_of_b[1U];
- memcpy(copy_of_b, b, (size_t)1U * sizeof(Eurydice_slice));
- libcrux_sha3_portable_keccak_load_block_2c(uu____0, copy_of_b);
+static inline void libcrux_sha3_simd_portable_load_block_a1_f8(
+ libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *input,
+ size_t start) {
+ libcrux_sha3_simd_portable_load_block_f8(self->st, input[0U], start);
+}
+
+/**
+This function found in impl {core::ops::index::Index<(usize, usize), T> for
+libcrux_sha3::generic_keccak::KeccakState<T, N>[TraitClause@0, TraitClause@1]}
+*/
+/**
+A monomorphic instance of libcrux_sha3.generic_keccak.index_c2
+with types uint64_t
+with const generics
+- N= 1
+*/
+static inline uint64_t *libcrux_sha3_generic_keccak_index_c2_04(
+ libcrux_sha3_generic_keccak_KeccakState_17 *self, size_t_x2 index) {
+ return libcrux_sha3_traits_get_ij_04(self->st, index.fst, index.snd);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
+This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T,
+N>[TraitClause@0, TraitClause@1]}
+*/
+/**
+A monomorphic instance of libcrux_sha3.generic_keccak.theta_80
+with types uint64_t
+with const generics
+- N= 1
+*/
+static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_theta_80_04(
+ libcrux_sha3_generic_keccak_KeccakState_17 *self, uint64_t ret[5U]) {
+ uint64_t c[5U] = {
+ libcrux_sha3_simd_portable_xor5_d2(
+ libcrux_sha3_generic_keccak_index_c2_04(
+ self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U,
+ .snd = (size_t)0U}))[0U],
+ libcrux_sha3_generic_keccak_index_c2_04(
+ self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U,
+ .snd = (size_t)0U}))[0U],
+ libcrux_sha3_generic_keccak_index_c2_04(
+ self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U,
+ .snd = (size_t)0U}))[0U],
+ libcrux_sha3_generic_keccak_index_c2_04(
+ self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U,
+ .snd = (size_t)0U}))[0U],
+ libcrux_sha3_generic_keccak_index_c2_04(
+ self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U,
+ .snd = (size_t)0U}))[0U]),
+ libcrux_sha3_simd_portable_xor5_d2(
+ libcrux_sha3_generic_keccak_index_c2_04(
+ self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U,
+ .snd = (size_t)1U}))[0U],
+ libcrux_sha3_generic_keccak_index_c2_04(
+ self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U,
+ .snd = (size_t)1U}))[0U],
+ libcrux_sha3_generic_keccak_index_c2_04(
+ self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U,
+ .snd = (size_t)1U}))[0U],
+ libcrux_sha3_generic_keccak_index_c2_04(
+ self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U,
+ .snd = (size_t)1U}))[0U],
+ libcrux_sha3_generic_keccak_index_c2_04(
+ self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U,
+ .snd = (size_t)1U}))[0U]),
+ libcrux_sha3_simd_portable_xor5_d2(
+ libcrux_sha3_generic_keccak_index_c2_04(
+ self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U,
+ .snd = (size_t)2U}))[0U],
+ libcrux_sha3_generic_keccak_index_c2_04(
+ self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U,
+ .snd = (size_t)2U}))[0U],
+ libcrux_sha3_generic_keccak_index_c2_04(
+ self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U,
+ .snd = (size_t)2U}))[0U],
+ libcrux_sha3_generic_keccak_index_c2_04(
+ self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U,
+ .snd = (size_t)2U}))[0U],
+ libcrux_sha3_generic_keccak_index_c2_04(
+ self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U,
+ .snd = (size_t)2U}))[0U]),
+ libcrux_sha3_simd_portable_xor5_d2(
+ libcrux_sha3_generic_keccak_index_c2_04(
+ self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U,
+ .snd = (size_t)3U}))[0U],
+ libcrux_sha3_generic_keccak_index_c2_04(
+ self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U,
+ .snd = (size_t)3U}))[0U],
+ libcrux_sha3_generic_keccak_index_c2_04(
+ self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U,
+ .snd = (size_t)3U}))[0U],
+ libcrux_sha3_generic_keccak_index_c2_04(
+ self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U,
+ .snd = (size_t)3U}))[0U],
+ libcrux_sha3_generic_keccak_index_c2_04(
+ self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U,
+ .snd = (size_t)3U}))[0U]),
+ libcrux_sha3_simd_portable_xor5_d2(
+ libcrux_sha3_generic_keccak_index_c2_04(
+ self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U,
+ .snd = (size_t)4U}))[0U],
+ libcrux_sha3_generic_keccak_index_c2_04(
+ self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U,
+ .snd = (size_t)4U}))[0U],
+ libcrux_sha3_generic_keccak_index_c2_04(
+ self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U,
+ .snd = (size_t)4U}))[0U],
+ libcrux_sha3_generic_keccak_index_c2_04(
+ self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U,
+ .snd = (size_t)4U}))[0U],
+ libcrux_sha3_generic_keccak_index_c2_04(
+ self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U,
+ .snd = (size_t)4U}))[0U])};
+ uint64_t uu____0 = libcrux_sha3_simd_portable_rotate_left1_and_xor_d2(
+ c[((size_t)0U + (size_t)4U) % (size_t)5U],
+ c[((size_t)0U + (size_t)1U) % (size_t)5U]);
+ uint64_t uu____1 = libcrux_sha3_simd_portable_rotate_left1_and_xor_d2(
+ c[((size_t)1U + (size_t)4U) % (size_t)5U],
+ c[((size_t)1U + (size_t)1U) % (size_t)5U]);
+ uint64_t uu____2 = libcrux_sha3_simd_portable_rotate_left1_and_xor_d2(
+ c[((size_t)2U + (size_t)4U) % (size_t)5U],
+ c[((size_t)2U + (size_t)1U) % (size_t)5U]);
+ uint64_t uu____3 = libcrux_sha3_simd_portable_rotate_left1_and_xor_d2(
+ c[((size_t)3U + (size_t)4U) % (size_t)5U],
+ c[((size_t)3U + (size_t)1U) % (size_t)5U]);
+ ret[0U] = uu____0;
+ ret[1U] = uu____1;
+ ret[2U] = uu____2;
+ ret[3U] = uu____3;
+ ret[4U] = libcrux_sha3_simd_portable_rotate_left1_and_xor_d2(
+ c[((size_t)4U + (size_t)4U) % (size_t)5U],
+ c[((size_t)4U + (size_t)1U) % (size_t)5U]);
+}
+
+/**
+This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T,
+N>[TraitClause@0, TraitClause@1]}
+*/
+/**
+A monomorphic instance of libcrux_sha3.generic_keccak.set_80
+with types uint64_t
+with const generics
+- N= 1
+*/
+static inline void libcrux_sha3_generic_keccak_set_80_04(
+ libcrux_sha3_generic_keccak_KeccakState_17 *self, size_t i, size_t j,
+ uint64_t v) {
+ libcrux_sha3_traits_set_ij_04(self->st, i, j, v);
+}
+
+/**
+A monomorphic instance of libcrux_sha3.simd.portable.rotate_left
with const generics
- LEFT= 36
- RIGHT= 28
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak_rotate_left_cb0(uint64_t x) {
- return x << (uint32_t)(int32_t)36 | x >> (uint32_t)(int32_t)28;
+libcrux_sha3_simd_portable_rotate_left_02(uint64_t x) {
+ return core_num__u64__rotate_left(x, (uint32_t)(int32_t)36);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
+A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64
with const generics
- LEFT= 36
- RIGHT= 28
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak__vxarq_u64_42(uint64_t a, uint64_t b) {
- uint64_t ab = a ^ b;
- return libcrux_sha3_portable_keccak_rotate_left_cb0(ab);
+libcrux_sha3_simd_portable__vxarq_u64_02(uint64_t a, uint64_t b) {
+ return libcrux_sha3_simd_portable_rotate_left_02(a ^ b);
}
/**
-This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
-usize> for u64)}
+This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
*/
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
+A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2
with const generics
- LEFT= 36
- RIGHT= 28
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb(uint64_t a, uint64_t b) {
- return libcrux_sha3_portable_keccak__vxarq_u64_42(a, b);
+libcrux_sha3_simd_portable_xor_and_rotate_d2_02(uint64_t a, uint64_t b) {
+ return libcrux_sha3_simd_portable__vxarq_u64_02(a, b);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
+A monomorphic instance of libcrux_sha3.simd.portable.rotate_left
with const generics
- LEFT= 3
- RIGHT= 61
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak_rotate_left_cb1(uint64_t x) {
- return x << (uint32_t)(int32_t)3 | x >> (uint32_t)(int32_t)61;
+libcrux_sha3_simd_portable_rotate_left_ac(uint64_t x) {
+ return core_num__u64__rotate_left(x, (uint32_t)(int32_t)3);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
+A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64
with const generics
- LEFT= 3
- RIGHT= 61
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak__vxarq_u64_420(uint64_t a, uint64_t b) {
- uint64_t ab = a ^ b;
- return libcrux_sha3_portable_keccak_rotate_left_cb1(ab);
+libcrux_sha3_simd_portable__vxarq_u64_ac(uint64_t a, uint64_t b) {
+ return libcrux_sha3_simd_portable_rotate_left_ac(a ^ b);
}
/**
-This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
-usize> for u64)}
+This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
*/
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
+A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2
with const generics
- LEFT= 3
- RIGHT= 61
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb0(uint64_t a, uint64_t b) {
- return libcrux_sha3_portable_keccak__vxarq_u64_420(a, b);
+libcrux_sha3_simd_portable_xor_and_rotate_d2_ac(uint64_t a, uint64_t b) {
+ return libcrux_sha3_simd_portable__vxarq_u64_ac(a, b);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
+A monomorphic instance of libcrux_sha3.simd.portable.rotate_left
with const generics
- LEFT= 41
- RIGHT= 23
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak_rotate_left_cb2(uint64_t x) {
- return x << (uint32_t)(int32_t)41 | x >> (uint32_t)(int32_t)23;
+libcrux_sha3_simd_portable_rotate_left_020(uint64_t x) {
+ return core_num__u64__rotate_left(x, (uint32_t)(int32_t)41);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
+A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64
with const generics
- LEFT= 41
- RIGHT= 23
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak__vxarq_u64_421(uint64_t a, uint64_t b) {
- uint64_t ab = a ^ b;
- return libcrux_sha3_portable_keccak_rotate_left_cb2(ab);
+libcrux_sha3_simd_portable__vxarq_u64_020(uint64_t a, uint64_t b) {
+ return libcrux_sha3_simd_portable_rotate_left_020(a ^ b);
}
/**
-This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
-usize> for u64)}
+This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
*/
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
+A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2
with const generics
- LEFT= 41
- RIGHT= 23
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb1(uint64_t a, uint64_t b) {
- return libcrux_sha3_portable_keccak__vxarq_u64_421(a, b);
+libcrux_sha3_simd_portable_xor_and_rotate_d2_020(uint64_t a, uint64_t b) {
+ return libcrux_sha3_simd_portable__vxarq_u64_020(a, b);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
+A monomorphic instance of libcrux_sha3.simd.portable.rotate_left
with const generics
- LEFT= 18
- RIGHT= 46
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak_rotate_left_cb3(uint64_t x) {
- return x << (uint32_t)(int32_t)18 | x >> (uint32_t)(int32_t)46;
+libcrux_sha3_simd_portable_rotate_left_a9(uint64_t x) {
+ return core_num__u64__rotate_left(x, (uint32_t)(int32_t)18);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
+A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64
with const generics
- LEFT= 18
- RIGHT= 46
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak__vxarq_u64_422(uint64_t a, uint64_t b) {
- uint64_t ab = a ^ b;
- return libcrux_sha3_portable_keccak_rotate_left_cb3(ab);
+libcrux_sha3_simd_portable__vxarq_u64_a9(uint64_t a, uint64_t b) {
+ return libcrux_sha3_simd_portable_rotate_left_a9(a ^ b);
}
/**
-This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
-usize> for u64)}
+This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
*/
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
+A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2
with const generics
- LEFT= 18
- RIGHT= 46
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb2(uint64_t a, uint64_t b) {
- return libcrux_sha3_portable_keccak__vxarq_u64_422(a, b);
+libcrux_sha3_simd_portable_xor_and_rotate_d2_a9(uint64_t a, uint64_t b) {
+ return libcrux_sha3_simd_portable__vxarq_u64_a9(a, b);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
+A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64
with const generics
- LEFT= 1
- RIGHT= 63
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak__vxarq_u64_423(uint64_t a, uint64_t b) {
- uint64_t ab = a ^ b;
- return libcrux_sha3_portable_keccak_rotate_left_cb(ab);
+libcrux_sha3_simd_portable__vxarq_u64_76(uint64_t a, uint64_t b) {
+ return libcrux_sha3_simd_portable_rotate_left_76(a ^ b);
}
/**
-This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
-usize> for u64)}
+This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
*/
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
+A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2
with const generics
- LEFT= 1
- RIGHT= 63
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb3(uint64_t a, uint64_t b) {
- return libcrux_sha3_portable_keccak__vxarq_u64_423(a, b);
+libcrux_sha3_simd_portable_xor_and_rotate_d2_76(uint64_t a, uint64_t b) {
+ return libcrux_sha3_simd_portable__vxarq_u64_76(a, b);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
+A monomorphic instance of libcrux_sha3.simd.portable.rotate_left
with const generics
- LEFT= 44
- RIGHT= 20
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak_rotate_left_cb4(uint64_t x) {
- return x << (uint32_t)(int32_t)44 | x >> (uint32_t)(int32_t)20;
+libcrux_sha3_simd_portable_rotate_left_58(uint64_t x) {
+ return core_num__u64__rotate_left(x, (uint32_t)(int32_t)44);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
+A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64
with const generics
- LEFT= 44
- RIGHT= 20
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak__vxarq_u64_424(uint64_t a, uint64_t b) {
- uint64_t ab = a ^ b;
- return libcrux_sha3_portable_keccak_rotate_left_cb4(ab);
+libcrux_sha3_simd_portable__vxarq_u64_58(uint64_t a, uint64_t b) {
+ return libcrux_sha3_simd_portable_rotate_left_58(a ^ b);
}
/**
-This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
-usize> for u64)}
+This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
*/
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
+A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2
with const generics
- LEFT= 44
- RIGHT= 20
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb4(uint64_t a, uint64_t b) {
- return libcrux_sha3_portable_keccak__vxarq_u64_424(a, b);
+libcrux_sha3_simd_portable_xor_and_rotate_d2_58(uint64_t a, uint64_t b) {
+ return libcrux_sha3_simd_portable__vxarq_u64_58(a, b);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
+A monomorphic instance of libcrux_sha3.simd.portable.rotate_left
with const generics
- LEFT= 10
- RIGHT= 54
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak_rotate_left_cb5(uint64_t x) {
- return x << (uint32_t)(int32_t)10 | x >> (uint32_t)(int32_t)54;
+libcrux_sha3_simd_portable_rotate_left_e0(uint64_t x) {
+ return core_num__u64__rotate_left(x, (uint32_t)(int32_t)10);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
+A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64
with const generics
- LEFT= 10
- RIGHT= 54
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak__vxarq_u64_425(uint64_t a, uint64_t b) {
- uint64_t ab = a ^ b;
- return libcrux_sha3_portable_keccak_rotate_left_cb5(ab);
+libcrux_sha3_simd_portable__vxarq_u64_e0(uint64_t a, uint64_t b) {
+ return libcrux_sha3_simd_portable_rotate_left_e0(a ^ b);
}
/**
-This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
-usize> for u64)}
+This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
*/
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
+A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2
with const generics
- LEFT= 10
- RIGHT= 54
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb5(uint64_t a, uint64_t b) {
- return libcrux_sha3_portable_keccak__vxarq_u64_425(a, b);
+libcrux_sha3_simd_portable_xor_and_rotate_d2_e0(uint64_t a, uint64_t b) {
+ return libcrux_sha3_simd_portable__vxarq_u64_e0(a, b);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
+A monomorphic instance of libcrux_sha3.simd.portable.rotate_left
with const generics
- LEFT= 45
- RIGHT= 19
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak_rotate_left_cb6(uint64_t x) {
- return x << (uint32_t)(int32_t)45 | x >> (uint32_t)(int32_t)19;
+libcrux_sha3_simd_portable_rotate_left_63(uint64_t x) {
+ return core_num__u64__rotate_left(x, (uint32_t)(int32_t)45);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
+A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64
with const generics
- LEFT= 45
- RIGHT= 19
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak__vxarq_u64_426(uint64_t a, uint64_t b) {
- uint64_t ab = a ^ b;
- return libcrux_sha3_portable_keccak_rotate_left_cb6(ab);
+libcrux_sha3_simd_portable__vxarq_u64_63(uint64_t a, uint64_t b) {
+ return libcrux_sha3_simd_portable_rotate_left_63(a ^ b);
}
/**
-This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
-usize> for u64)}
+This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
*/
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
+A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2
with const generics
- LEFT= 45
- RIGHT= 19
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb6(uint64_t a, uint64_t b) {
- return libcrux_sha3_portable_keccak__vxarq_u64_426(a, b);
+libcrux_sha3_simd_portable_xor_and_rotate_d2_63(uint64_t a, uint64_t b) {
+ return libcrux_sha3_simd_portable__vxarq_u64_63(a, b);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
+A monomorphic instance of libcrux_sha3.simd.portable.rotate_left
with const generics
- LEFT= 2
- RIGHT= 62
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak_rotate_left_cb7(uint64_t x) {
- return x << (uint32_t)(int32_t)2 | x >> (uint32_t)(int32_t)62;
+libcrux_sha3_simd_portable_rotate_left_6a(uint64_t x) {
+ return core_num__u64__rotate_left(x, (uint32_t)(int32_t)2);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
+A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64
with const generics
- LEFT= 2
- RIGHT= 62
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak__vxarq_u64_427(uint64_t a, uint64_t b) {
- uint64_t ab = a ^ b;
- return libcrux_sha3_portable_keccak_rotate_left_cb7(ab);
+libcrux_sha3_simd_portable__vxarq_u64_6a(uint64_t a, uint64_t b) {
+ return libcrux_sha3_simd_portable_rotate_left_6a(a ^ b);
}
/**
-This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
-usize> for u64)}
+This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
*/
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
+A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2
with const generics
- LEFT= 2
- RIGHT= 62
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb7(uint64_t a, uint64_t b) {
- return libcrux_sha3_portable_keccak__vxarq_u64_427(a, b);
+libcrux_sha3_simd_portable_xor_and_rotate_d2_6a(uint64_t a, uint64_t b) {
+ return libcrux_sha3_simd_portable__vxarq_u64_6a(a, b);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
+A monomorphic instance of libcrux_sha3.simd.portable.rotate_left
with const generics
- LEFT= 62
- RIGHT= 2
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak_rotate_left_cb8(uint64_t x) {
- return x << (uint32_t)(int32_t)62 | x >> (uint32_t)(int32_t)2;
+libcrux_sha3_simd_portable_rotate_left_ab(uint64_t x) {
+ return core_num__u64__rotate_left(x, (uint32_t)(int32_t)62);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
+A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64
with const generics
- LEFT= 62
- RIGHT= 2
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak__vxarq_u64_428(uint64_t a, uint64_t b) {
- uint64_t ab = a ^ b;
- return libcrux_sha3_portable_keccak_rotate_left_cb8(ab);
+libcrux_sha3_simd_portable__vxarq_u64_ab(uint64_t a, uint64_t b) {
+ return libcrux_sha3_simd_portable_rotate_left_ab(a ^ b);
}
/**
-This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
-usize> for u64)}
+This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
*/
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
+A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2
with const generics
- LEFT= 62
- RIGHT= 2
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb8(uint64_t a, uint64_t b) {
- return libcrux_sha3_portable_keccak__vxarq_u64_428(a, b);
+libcrux_sha3_simd_portable_xor_and_rotate_d2_ab(uint64_t a, uint64_t b) {
+ return libcrux_sha3_simd_portable__vxarq_u64_ab(a, b);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
+A monomorphic instance of libcrux_sha3.simd.portable.rotate_left
with const generics
- LEFT= 6
- RIGHT= 58
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak_rotate_left_cb9(uint64_t x) {
- return x << (uint32_t)(int32_t)6 | x >> (uint32_t)(int32_t)58;
+libcrux_sha3_simd_portable_rotate_left_5b(uint64_t x) {
+ return core_num__u64__rotate_left(x, (uint32_t)(int32_t)6);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
+A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64
with const generics
- LEFT= 6
- RIGHT= 58
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak__vxarq_u64_429(uint64_t a, uint64_t b) {
- uint64_t ab = a ^ b;
- return libcrux_sha3_portable_keccak_rotate_left_cb9(ab);
+libcrux_sha3_simd_portable__vxarq_u64_5b(uint64_t a, uint64_t b) {
+ return libcrux_sha3_simd_portable_rotate_left_5b(a ^ b);
}
/**
-This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
-usize> for u64)}
+This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
*/
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
+A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2
with const generics
- LEFT= 6
- RIGHT= 58
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb9(uint64_t a, uint64_t b) {
- return libcrux_sha3_portable_keccak__vxarq_u64_429(a, b);
+libcrux_sha3_simd_portable_xor_and_rotate_d2_5b(uint64_t a, uint64_t b) {
+ return libcrux_sha3_simd_portable__vxarq_u64_5b(a, b);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
+A monomorphic instance of libcrux_sha3.simd.portable.rotate_left
with const generics
- LEFT= 43
- RIGHT= 21
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak_rotate_left_cb10(uint64_t x) {
- return x << (uint32_t)(int32_t)43 | x >> (uint32_t)(int32_t)21;
+libcrux_sha3_simd_portable_rotate_left_6f(uint64_t x) {
+ return core_num__u64__rotate_left(x, (uint32_t)(int32_t)43);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
+A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64
with const generics
- LEFT= 43
- RIGHT= 21
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak__vxarq_u64_4210(uint64_t a, uint64_t b) {
- uint64_t ab = a ^ b;
- return libcrux_sha3_portable_keccak_rotate_left_cb10(ab);
+libcrux_sha3_simd_portable__vxarq_u64_6f(uint64_t a, uint64_t b) {
+ return libcrux_sha3_simd_portable_rotate_left_6f(a ^ b);
}
/**
-This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
-usize> for u64)}
+This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
*/
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
+A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2
with const generics
- LEFT= 43
- RIGHT= 21
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb10(uint64_t a, uint64_t b) {
- return libcrux_sha3_portable_keccak__vxarq_u64_4210(a, b);
+libcrux_sha3_simd_portable_xor_and_rotate_d2_6f(uint64_t a, uint64_t b) {
+ return libcrux_sha3_simd_portable__vxarq_u64_6f(a, b);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
+A monomorphic instance of libcrux_sha3.simd.portable.rotate_left
with const generics
- LEFT= 15
- RIGHT= 49
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak_rotate_left_cb11(uint64_t x) {
- return x << (uint32_t)(int32_t)15 | x >> (uint32_t)(int32_t)49;
+libcrux_sha3_simd_portable_rotate_left_62(uint64_t x) {
+ return core_num__u64__rotate_left(x, (uint32_t)(int32_t)15);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
+A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64
with const generics
- LEFT= 15
- RIGHT= 49
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak__vxarq_u64_4211(uint64_t a, uint64_t b) {
- uint64_t ab = a ^ b;
- return libcrux_sha3_portable_keccak_rotate_left_cb11(ab);
+libcrux_sha3_simd_portable__vxarq_u64_62(uint64_t a, uint64_t b) {
+ return libcrux_sha3_simd_portable_rotate_left_62(a ^ b);
}
/**
-This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
-usize> for u64)}
+This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
*/
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
+A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2
with const generics
- LEFT= 15
- RIGHT= 49
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb11(uint64_t a, uint64_t b) {
- return libcrux_sha3_portable_keccak__vxarq_u64_4211(a, b);
+libcrux_sha3_simd_portable_xor_and_rotate_d2_62(uint64_t a, uint64_t b) {
+ return libcrux_sha3_simd_portable__vxarq_u64_62(a, b);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
+A monomorphic instance of libcrux_sha3.simd.portable.rotate_left
with const generics
- LEFT= 61
- RIGHT= 3
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak_rotate_left_cb12(uint64_t x) {
- return x << (uint32_t)(int32_t)61 | x >> (uint32_t)(int32_t)3;
+libcrux_sha3_simd_portable_rotate_left_23(uint64_t x) {
+ return core_num__u64__rotate_left(x, (uint32_t)(int32_t)61);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
+A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64
with const generics
- LEFT= 61
- RIGHT= 3
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak__vxarq_u64_4212(uint64_t a, uint64_t b) {
- uint64_t ab = a ^ b;
- return libcrux_sha3_portable_keccak_rotate_left_cb12(ab);
+libcrux_sha3_simd_portable__vxarq_u64_23(uint64_t a, uint64_t b) {
+ return libcrux_sha3_simd_portable_rotate_left_23(a ^ b);
}
/**
-This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
-usize> for u64)}
+This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
*/
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
+A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2
with const generics
- LEFT= 61
- RIGHT= 3
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb12(uint64_t a, uint64_t b) {
- return libcrux_sha3_portable_keccak__vxarq_u64_4212(a, b);
+libcrux_sha3_simd_portable_xor_and_rotate_d2_23(uint64_t a, uint64_t b) {
+ return libcrux_sha3_simd_portable__vxarq_u64_23(a, b);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
+A monomorphic instance of libcrux_sha3.simd.portable.rotate_left
with const generics
- LEFT= 28
- RIGHT= 36
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak_rotate_left_cb13(uint64_t x) {
- return x << (uint32_t)(int32_t)28 | x >> (uint32_t)(int32_t)36;
+libcrux_sha3_simd_portable_rotate_left_37(uint64_t x) {
+ return core_num__u64__rotate_left(x, (uint32_t)(int32_t)28);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
+A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64
with const generics
- LEFT= 28
- RIGHT= 36
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak__vxarq_u64_4213(uint64_t a, uint64_t b) {
- uint64_t ab = a ^ b;
- return libcrux_sha3_portable_keccak_rotate_left_cb13(ab);
+libcrux_sha3_simd_portable__vxarq_u64_37(uint64_t a, uint64_t b) {
+ return libcrux_sha3_simd_portable_rotate_left_37(a ^ b);
}
/**
-This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
-usize> for u64)}
+This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
*/
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
+A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2
with const generics
- LEFT= 28
- RIGHT= 36
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb13(uint64_t a, uint64_t b) {
- return libcrux_sha3_portable_keccak__vxarq_u64_4213(a, b);
+libcrux_sha3_simd_portable_xor_and_rotate_d2_37(uint64_t a, uint64_t b) {
+ return libcrux_sha3_simd_portable__vxarq_u64_37(a, b);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
+A monomorphic instance of libcrux_sha3.simd.portable.rotate_left
with const generics
- LEFT= 55
- RIGHT= 9
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak_rotate_left_cb14(uint64_t x) {
- return x << (uint32_t)(int32_t)55 | x >> (uint32_t)(int32_t)9;
+libcrux_sha3_simd_portable_rotate_left_bb(uint64_t x) {
+ return core_num__u64__rotate_left(x, (uint32_t)(int32_t)55);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
+A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64
with const generics
- LEFT= 55
- RIGHT= 9
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak__vxarq_u64_4214(uint64_t a, uint64_t b) {
- uint64_t ab = a ^ b;
- return libcrux_sha3_portable_keccak_rotate_left_cb14(ab);
+libcrux_sha3_simd_portable__vxarq_u64_bb(uint64_t a, uint64_t b) {
+ return libcrux_sha3_simd_portable_rotate_left_bb(a ^ b);
}
/**
-This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
-usize> for u64)}
+This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
*/
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
+A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2
with const generics
- LEFT= 55
- RIGHT= 9
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb14(uint64_t a, uint64_t b) {
- return libcrux_sha3_portable_keccak__vxarq_u64_4214(a, b);
+libcrux_sha3_simd_portable_xor_and_rotate_d2_bb(uint64_t a, uint64_t b) {
+ return libcrux_sha3_simd_portable__vxarq_u64_bb(a, b);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
+A monomorphic instance of libcrux_sha3.simd.portable.rotate_left
with const generics
- LEFT= 25
- RIGHT= 39
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak_rotate_left_cb15(uint64_t x) {
- return x << (uint32_t)(int32_t)25 | x >> (uint32_t)(int32_t)39;
+libcrux_sha3_simd_portable_rotate_left_b9(uint64_t x) {
+ return core_num__u64__rotate_left(x, (uint32_t)(int32_t)25);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
+A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64
with const generics
- LEFT= 25
- RIGHT= 39
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak__vxarq_u64_4215(uint64_t a, uint64_t b) {
- uint64_t ab = a ^ b;
- return libcrux_sha3_portable_keccak_rotate_left_cb15(ab);
+libcrux_sha3_simd_portable__vxarq_u64_b9(uint64_t a, uint64_t b) {
+ return libcrux_sha3_simd_portable_rotate_left_b9(a ^ b);
}
/**
-This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
-usize> for u64)}
+This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
*/
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
+A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2
with const generics
- LEFT= 25
- RIGHT= 39
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb15(uint64_t a, uint64_t b) {
- return libcrux_sha3_portable_keccak__vxarq_u64_4215(a, b);
+libcrux_sha3_simd_portable_xor_and_rotate_d2_b9(uint64_t a, uint64_t b) {
+ return libcrux_sha3_simd_portable__vxarq_u64_b9(a, b);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
+A monomorphic instance of libcrux_sha3.simd.portable.rotate_left
with const generics
- LEFT= 21
- RIGHT= 43
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak_rotate_left_cb16(uint64_t x) {
- return x << (uint32_t)(int32_t)21 | x >> (uint32_t)(int32_t)43;
+libcrux_sha3_simd_portable_rotate_left_54(uint64_t x) {
+ return core_num__u64__rotate_left(x, (uint32_t)(int32_t)21);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
+A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64
with const generics
- LEFT= 21
- RIGHT= 43
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak__vxarq_u64_4216(uint64_t a, uint64_t b) {
- uint64_t ab = a ^ b;
- return libcrux_sha3_portable_keccak_rotate_left_cb16(ab);
+libcrux_sha3_simd_portable__vxarq_u64_54(uint64_t a, uint64_t b) {
+ return libcrux_sha3_simd_portable_rotate_left_54(a ^ b);
}
/**
-This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
-usize> for u64)}
+This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
*/
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
+A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2
with const generics
- LEFT= 21
- RIGHT= 43
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb16(uint64_t a, uint64_t b) {
- return libcrux_sha3_portable_keccak__vxarq_u64_4216(a, b);
+libcrux_sha3_simd_portable_xor_and_rotate_d2_54(uint64_t a, uint64_t b) {
+ return libcrux_sha3_simd_portable__vxarq_u64_54(a, b);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
+A monomorphic instance of libcrux_sha3.simd.portable.rotate_left
with const generics
- LEFT= 56
- RIGHT= 8
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak_rotate_left_cb17(uint64_t x) {
- return x << (uint32_t)(int32_t)56 | x >> (uint32_t)(int32_t)8;
+libcrux_sha3_simd_portable_rotate_left_4c(uint64_t x) {
+ return core_num__u64__rotate_left(x, (uint32_t)(int32_t)56);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
+A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64
with const generics
- LEFT= 56
- RIGHT= 8
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak__vxarq_u64_4217(uint64_t a, uint64_t b) {
- uint64_t ab = a ^ b;
- return libcrux_sha3_portable_keccak_rotate_left_cb17(ab);
+libcrux_sha3_simd_portable__vxarq_u64_4c(uint64_t a, uint64_t b) {
+ return libcrux_sha3_simd_portable_rotate_left_4c(a ^ b);
}
/**
-This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
-usize> for u64)}
+This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
*/
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
+A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2
with const generics
- LEFT= 56
- RIGHT= 8
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb17(uint64_t a, uint64_t b) {
- return libcrux_sha3_portable_keccak__vxarq_u64_4217(a, b);
+libcrux_sha3_simd_portable_xor_and_rotate_d2_4c(uint64_t a, uint64_t b) {
+ return libcrux_sha3_simd_portable__vxarq_u64_4c(a, b);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
+A monomorphic instance of libcrux_sha3.simd.portable.rotate_left
with const generics
- LEFT= 27
- RIGHT= 37
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak_rotate_left_cb18(uint64_t x) {
- return x << (uint32_t)(int32_t)27 | x >> (uint32_t)(int32_t)37;
+libcrux_sha3_simd_portable_rotate_left_ce(uint64_t x) {
+ return core_num__u64__rotate_left(x, (uint32_t)(int32_t)27);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
+A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64
with const generics
- LEFT= 27
- RIGHT= 37
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak__vxarq_u64_4218(uint64_t a, uint64_t b) {
- uint64_t ab = a ^ b;
- return libcrux_sha3_portable_keccak_rotate_left_cb18(ab);
+libcrux_sha3_simd_portable__vxarq_u64_ce(uint64_t a, uint64_t b) {
+ return libcrux_sha3_simd_portable_rotate_left_ce(a ^ b);
}
/**
-This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
-usize> for u64)}
+This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
*/
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
+A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2
with const generics
- LEFT= 27
- RIGHT= 37
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb18(uint64_t a, uint64_t b) {
- return libcrux_sha3_portable_keccak__vxarq_u64_4218(a, b);
+libcrux_sha3_simd_portable_xor_and_rotate_d2_ce(uint64_t a, uint64_t b) {
+ return libcrux_sha3_simd_portable__vxarq_u64_ce(a, b);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
+A monomorphic instance of libcrux_sha3.simd.portable.rotate_left
with const generics
- LEFT= 20
- RIGHT= 44
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak_rotate_left_cb19(uint64_t x) {
- return x << (uint32_t)(int32_t)20 | x >> (uint32_t)(int32_t)44;
+libcrux_sha3_simd_portable_rotate_left_77(uint64_t x) {
+ return core_num__u64__rotate_left(x, (uint32_t)(int32_t)20);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
+A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64
with const generics
- LEFT= 20
- RIGHT= 44
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak__vxarq_u64_4219(uint64_t a, uint64_t b) {
- uint64_t ab = a ^ b;
- return libcrux_sha3_portable_keccak_rotate_left_cb19(ab);
+libcrux_sha3_simd_portable__vxarq_u64_77(uint64_t a, uint64_t b) {
+ return libcrux_sha3_simd_portable_rotate_left_77(a ^ b);
}
/**
-This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
-usize> for u64)}
+This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
*/
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
+A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2
with const generics
- LEFT= 20
- RIGHT= 44
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb19(uint64_t a, uint64_t b) {
- return libcrux_sha3_portable_keccak__vxarq_u64_4219(a, b);
+libcrux_sha3_simd_portable_xor_and_rotate_d2_77(uint64_t a, uint64_t b) {
+ return libcrux_sha3_simd_portable__vxarq_u64_77(a, b);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
+A monomorphic instance of libcrux_sha3.simd.portable.rotate_left
with const generics
- LEFT= 39
- RIGHT= 25
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak_rotate_left_cb20(uint64_t x) {
- return x << (uint32_t)(int32_t)39 | x >> (uint32_t)(int32_t)25;
+libcrux_sha3_simd_portable_rotate_left_25(uint64_t x) {
+ return core_num__u64__rotate_left(x, (uint32_t)(int32_t)39);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
+A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64
with const generics
- LEFT= 39
- RIGHT= 25
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak__vxarq_u64_4220(uint64_t a, uint64_t b) {
- uint64_t ab = a ^ b;
- return libcrux_sha3_portable_keccak_rotate_left_cb20(ab);
+libcrux_sha3_simd_portable__vxarq_u64_25(uint64_t a, uint64_t b) {
+ return libcrux_sha3_simd_portable_rotate_left_25(a ^ b);
}
/**
-This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
-usize> for u64)}
+This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
*/
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
+A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2
with const generics
- LEFT= 39
- RIGHT= 25
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb20(uint64_t a, uint64_t b) {
- return libcrux_sha3_portable_keccak__vxarq_u64_4220(a, b);
+libcrux_sha3_simd_portable_xor_and_rotate_d2_25(uint64_t a, uint64_t b) {
+ return libcrux_sha3_simd_portable__vxarq_u64_25(a, b);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
+A monomorphic instance of libcrux_sha3.simd.portable.rotate_left
with const generics
- LEFT= 8
- RIGHT= 56
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak_rotate_left_cb21(uint64_t x) {
- return x << (uint32_t)(int32_t)8 | x >> (uint32_t)(int32_t)56;
+libcrux_sha3_simd_portable_rotate_left_af(uint64_t x) {
+ return core_num__u64__rotate_left(x, (uint32_t)(int32_t)8);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
+A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64
with const generics
- LEFT= 8
- RIGHT= 56
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak__vxarq_u64_4221(uint64_t a, uint64_t b) {
- uint64_t ab = a ^ b;
- return libcrux_sha3_portable_keccak_rotate_left_cb21(ab);
+libcrux_sha3_simd_portable__vxarq_u64_af(uint64_t a, uint64_t b) {
+ return libcrux_sha3_simd_portable_rotate_left_af(a ^ b);
}
/**
-This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
-usize> for u64)}
+This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
*/
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
+A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2
with const generics
- LEFT= 8
- RIGHT= 56
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb21(uint64_t a, uint64_t b) {
- return libcrux_sha3_portable_keccak__vxarq_u64_4221(a, b);
+libcrux_sha3_simd_portable_xor_and_rotate_d2_af(uint64_t a, uint64_t b) {
+ return libcrux_sha3_simd_portable__vxarq_u64_af(a, b);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
+A monomorphic instance of libcrux_sha3.simd.portable.rotate_left
with const generics
- LEFT= 14
- RIGHT= 50
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak_rotate_left_cb22(uint64_t x) {
- return x << (uint32_t)(int32_t)14 | x >> (uint32_t)(int32_t)50;
+libcrux_sha3_simd_portable_rotate_left_fd(uint64_t x) {
+ return core_num__u64__rotate_left(x, (uint32_t)(int32_t)14);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
+A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64
with const generics
- LEFT= 14
- RIGHT= 50
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak__vxarq_u64_4222(uint64_t a, uint64_t b) {
- uint64_t ab = a ^ b;
- return libcrux_sha3_portable_keccak_rotate_left_cb22(ab);
+libcrux_sha3_simd_portable__vxarq_u64_fd(uint64_t a, uint64_t b) {
+ return libcrux_sha3_simd_portable_rotate_left_fd(a ^ b);
}
/**
-This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
-usize> for u64)}
+This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
*/
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
+A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2
with const generics
- LEFT= 14
- RIGHT= 50
*/
static KRML_MUSTINLINE uint64_t
-libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb22(uint64_t a, uint64_t b) {
- return libcrux_sha3_portable_keccak__vxarq_u64_4222(a, b);
+libcrux_sha3_simd_portable_xor_and_rotate_d2_fd(uint64_t a, uint64_t b) {
+ return libcrux_sha3_simd_portable__vxarq_u64_fd(a, b);
}
/**
-A monomorphic instance of libcrux_sha3.generic_keccak.theta_rho
+This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T,
+N>[TraitClause@0, TraitClause@1]}
+*/
+/**
+A monomorphic instance of libcrux_sha3.generic_keccak.rho_80
with types uint64_t
with const generics
- N= 1
*/
-static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_theta_rho_16(
- libcrux_sha3_generic_keccak_KeccakState_48 *s) {
- uint64_t c[5U] = {
- libcrux_sha3_portable_keccak_xor5_5a(s->st[0U][0U], s->st[1U][0U],
- s->st[2U][0U], s->st[3U][0U],
- s->st[4U][0U]),
- libcrux_sha3_portable_keccak_xor5_5a(s->st[0U][1U], s->st[1U][1U],
- s->st[2U][1U], s->st[3U][1U],
- s->st[4U][1U]),
- libcrux_sha3_portable_keccak_xor5_5a(s->st[0U][2U], s->st[1U][2U],
- s->st[2U][2U], s->st[3U][2U],
- s->st[4U][2U]),
- libcrux_sha3_portable_keccak_xor5_5a(s->st[0U][3U], s->st[1U][3U],
- s->st[2U][3U], s->st[3U][3U],
- s->st[4U][3U]),
- libcrux_sha3_portable_keccak_xor5_5a(s->st[0U][4U], s->st[1U][4U],
- s->st[2U][4U], s->st[3U][4U],
- s->st[4U][4U])};
- uint64_t uu____0 = libcrux_sha3_portable_keccak_rotate_left1_and_xor_5a(
- c[((size_t)0U + (size_t)4U) % (size_t)5U],
- c[((size_t)0U + (size_t)1U) % (size_t)5U]);
- uint64_t uu____1 = libcrux_sha3_portable_keccak_rotate_left1_and_xor_5a(
- c[((size_t)1U + (size_t)4U) % (size_t)5U],
- c[((size_t)1U + (size_t)1U) % (size_t)5U]);
- uint64_t uu____2 = libcrux_sha3_portable_keccak_rotate_left1_and_xor_5a(
- c[((size_t)2U + (size_t)4U) % (size_t)5U],
- c[((size_t)2U + (size_t)1U) % (size_t)5U]);
- uint64_t uu____3 = libcrux_sha3_portable_keccak_rotate_left1_and_xor_5a(
- c[((size_t)3U + (size_t)4U) % (size_t)5U],
- c[((size_t)3U + (size_t)1U) % (size_t)5U]);
- uint64_t t[5U] = {uu____0, uu____1, uu____2, uu____3,
- libcrux_sha3_portable_keccak_rotate_left1_and_xor_5a(
- c[((size_t)4U + (size_t)4U) % (size_t)5U],
- c[((size_t)4U + (size_t)1U) % (size_t)5U])};
- s->st[0U][0U] = libcrux_sha3_portable_keccak_xor_5a(s->st[0U][0U], t[0U]);
- s->st[1U][0U] =
- libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb(s->st[1U][0U], t[0U]);
- s->st[2U][0U] =
- libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb0(s->st[2U][0U], t[0U]);
- s->st[3U][0U] =
- libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb1(s->st[3U][0U], t[0U]);
- s->st[4U][0U] =
- libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb2(s->st[4U][0U], t[0U]);
- s->st[0U][1U] =
- libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb3(s->st[0U][1U], t[1U]);
- s->st[1U][1U] =
- libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb4(s->st[1U][1U], t[1U]);
- s->st[2U][1U] =
- libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb5(s->st[2U][1U], t[1U]);
- s->st[3U][1U] =
- libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb6(s->st[3U][1U], t[1U]);
- s->st[4U][1U] =
- libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb7(s->st[4U][1U], t[1U]);
- s->st[0U][2U] =
- libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb8(s->st[0U][2U], t[2U]);
- s->st[1U][2U] =
- libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb9(s->st[1U][2U], t[2U]);
- s->st[2U][2U] =
- libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb10(s->st[2U][2U], t[2U]);
- s->st[3U][2U] =
- libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb11(s->st[3U][2U], t[2U]);
- s->st[4U][2U] =
- libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb12(s->st[4U][2U], t[2U]);
- s->st[0U][3U] =
- libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb13(s->st[0U][3U], t[3U]);
- s->st[1U][3U] =
- libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb14(s->st[1U][3U], t[3U]);
- s->st[2U][3U] =
- libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb15(s->st[2U][3U], t[3U]);
- s->st[3U][3U] =
- libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb16(s->st[3U][3U], t[3U]);
- s->st[4U][3U] =
- libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb17(s->st[4U][3U], t[3U]);
- s->st[0U][4U] =
- libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb18(s->st[0U][4U], t[4U]);
- s->st[1U][4U] =
- libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb19(s->st[1U][4U], t[4U]);
- s->st[2U][4U] =
- libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb20(s->st[2U][4U], t[4U]);
- s->st[3U][4U] =
- libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb21(s->st[3U][4U], t[4U]);
- uint64_t uu____27 =
- libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb22(s->st[4U][4U], t[4U]);
- s->st[4U][4U] = uu____27;
+static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_rho_80_04(
+ libcrux_sha3_generic_keccak_KeccakState_17 *self, uint64_t t[5U]) {
+ libcrux_sha3_generic_keccak_set_80_04(
+ self, (size_t)0U, (size_t)0U,
+ libcrux_sha3_simd_portable_xor_d2(
+ libcrux_sha3_generic_keccak_index_c2_04(
+ self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U,
+ .snd = (size_t)0U}))[0U],
+ t[0U]));
+ libcrux_sha3_generic_keccak_KeccakState_17 *uu____0 = self;
+ libcrux_sha3_generic_keccak_set_80_04(
+ uu____0, (size_t)1U, (size_t)0U,
+ libcrux_sha3_simd_portable_xor_and_rotate_d2_02(
+ libcrux_sha3_generic_keccak_index_c2_04(
+ self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U,
+ .snd = (size_t)0U}))[0U],
+ t[0U]));
+ libcrux_sha3_generic_keccak_KeccakState_17 *uu____1 = self;
+ libcrux_sha3_generic_keccak_set_80_04(
+ uu____1, (size_t)2U, (size_t)0U,
+ libcrux_sha3_simd_portable_xor_and_rotate_d2_ac(
+ libcrux_sha3_generic_keccak_index_c2_04(
+ self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U,
+ .snd = (size_t)0U}))[0U],
+ t[0U]));
+ libcrux_sha3_generic_keccak_KeccakState_17 *uu____2 = self;
+ libcrux_sha3_generic_keccak_set_80_04(
+ uu____2, (size_t)3U, (size_t)0U,
+ libcrux_sha3_simd_portable_xor_and_rotate_d2_020(
+ libcrux_sha3_generic_keccak_index_c2_04(
+ self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U,
+ .snd = (size_t)0U}))[0U],
+ t[0U]));
+ libcrux_sha3_generic_keccak_KeccakState_17 *uu____3 = self;
+ libcrux_sha3_generic_keccak_set_80_04(
+ uu____3, (size_t)4U, (size_t)0U,
+ libcrux_sha3_simd_portable_xor_and_rotate_d2_a9(
+ libcrux_sha3_generic_keccak_index_c2_04(
+ self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U,
+ .snd = (size_t)0U}))[0U],
+ t[0U]));
+ libcrux_sha3_generic_keccak_KeccakState_17 *uu____4 = self;
+ libcrux_sha3_generic_keccak_set_80_04(
+ uu____4, (size_t)0U, (size_t)1U,
+ libcrux_sha3_simd_portable_xor_and_rotate_d2_76(
+ libcrux_sha3_generic_keccak_index_c2_04(
+ self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U,
+ .snd = (size_t)1U}))[0U],
+ t[1U]));
+ libcrux_sha3_generic_keccak_KeccakState_17 *uu____5 = self;
+ libcrux_sha3_generic_keccak_set_80_04(
+ uu____5, (size_t)1U, (size_t)1U,
+ libcrux_sha3_simd_portable_xor_and_rotate_d2_58(
+ libcrux_sha3_generic_keccak_index_c2_04(
+ self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U,
+ .snd = (size_t)1U}))[0U],
+ t[1U]));
+ libcrux_sha3_generic_keccak_KeccakState_17 *uu____6 = self;
+ libcrux_sha3_generic_keccak_set_80_04(
+ uu____6, (size_t)2U, (size_t)1U,
+ libcrux_sha3_simd_portable_xor_and_rotate_d2_e0(
+ libcrux_sha3_generic_keccak_index_c2_04(
+ self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U,
+ .snd = (size_t)1U}))[0U],
+ t[1U]));
+ libcrux_sha3_generic_keccak_KeccakState_17 *uu____7 = self;
+ libcrux_sha3_generic_keccak_set_80_04(
+ uu____7, (size_t)3U, (size_t)1U,
+ libcrux_sha3_simd_portable_xor_and_rotate_d2_63(
+ libcrux_sha3_generic_keccak_index_c2_04(
+ self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U,
+ .snd = (size_t)1U}))[0U],
+ t[1U]));
+ libcrux_sha3_generic_keccak_KeccakState_17 *uu____8 = self;
+ libcrux_sha3_generic_keccak_set_80_04(
+ uu____8, (size_t)4U, (size_t)1U,
+ libcrux_sha3_simd_portable_xor_and_rotate_d2_6a(
+ libcrux_sha3_generic_keccak_index_c2_04(
+ self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U,
+ .snd = (size_t)1U}))[0U],
+ t[1U]));
+ libcrux_sha3_generic_keccak_KeccakState_17 *uu____9 = self;
+ libcrux_sha3_generic_keccak_set_80_04(
+ uu____9, (size_t)0U, (size_t)2U,
+ libcrux_sha3_simd_portable_xor_and_rotate_d2_ab(
+ libcrux_sha3_generic_keccak_index_c2_04(
+ self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U,
+ .snd = (size_t)2U}))[0U],
+ t[2U]));
+ libcrux_sha3_generic_keccak_KeccakState_17 *uu____10 = self;
+ libcrux_sha3_generic_keccak_set_80_04(
+ uu____10, (size_t)1U, (size_t)2U,
+ libcrux_sha3_simd_portable_xor_and_rotate_d2_5b(
+ libcrux_sha3_generic_keccak_index_c2_04(
+ self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U,
+ .snd = (size_t)2U}))[0U],
+ t[2U]));
+ libcrux_sha3_generic_keccak_KeccakState_17 *uu____11 = self;
+ libcrux_sha3_generic_keccak_set_80_04(
+ uu____11, (size_t)2U, (size_t)2U,
+ libcrux_sha3_simd_portable_xor_and_rotate_d2_6f(
+ libcrux_sha3_generic_keccak_index_c2_04(
+ self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U,
+ .snd = (size_t)2U}))[0U],
+ t[2U]));
+ libcrux_sha3_generic_keccak_KeccakState_17 *uu____12 = self;
+ libcrux_sha3_generic_keccak_set_80_04(
+ uu____12, (size_t)3U, (size_t)2U,
+ libcrux_sha3_simd_portable_xor_and_rotate_d2_62(
+ libcrux_sha3_generic_keccak_index_c2_04(
+ self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U,
+ .snd = (size_t)2U}))[0U],
+ t[2U]));
+ libcrux_sha3_generic_keccak_KeccakState_17 *uu____13 = self;
+ libcrux_sha3_generic_keccak_set_80_04(
+ uu____13, (size_t)4U, (size_t)2U,
+ libcrux_sha3_simd_portable_xor_and_rotate_d2_23(
+ libcrux_sha3_generic_keccak_index_c2_04(
+ self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U,
+ .snd = (size_t)2U}))[0U],
+ t[2U]));
+ libcrux_sha3_generic_keccak_KeccakState_17 *uu____14 = self;
+ libcrux_sha3_generic_keccak_set_80_04(
+ uu____14, (size_t)0U, (size_t)3U,
+ libcrux_sha3_simd_portable_xor_and_rotate_d2_37(
+ libcrux_sha3_generic_keccak_index_c2_04(
+ self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U,
+ .snd = (size_t)3U}))[0U],
+ t[3U]));
+ libcrux_sha3_generic_keccak_KeccakState_17 *uu____15 = self;
+ libcrux_sha3_generic_keccak_set_80_04(
+ uu____15, (size_t)1U, (size_t)3U,
+ libcrux_sha3_simd_portable_xor_and_rotate_d2_bb(
+ libcrux_sha3_generic_keccak_index_c2_04(
+ self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U,
+ .snd = (size_t)3U}))[0U],
+ t[3U]));
+ libcrux_sha3_generic_keccak_KeccakState_17 *uu____16 = self;
+ libcrux_sha3_generic_keccak_set_80_04(
+ uu____16, (size_t)2U, (size_t)3U,
+ libcrux_sha3_simd_portable_xor_and_rotate_d2_b9(
+ libcrux_sha3_generic_keccak_index_c2_04(
+ self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U,
+ .snd = (size_t)3U}))[0U],
+ t[3U]));
+ libcrux_sha3_generic_keccak_KeccakState_17 *uu____17 = self;
+ libcrux_sha3_generic_keccak_set_80_04(
+ uu____17, (size_t)3U, (size_t)3U,
+ libcrux_sha3_simd_portable_xor_and_rotate_d2_54(
+ libcrux_sha3_generic_keccak_index_c2_04(
+ self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U,
+ .snd = (size_t)3U}))[0U],
+ t[3U]));
+ libcrux_sha3_generic_keccak_KeccakState_17 *uu____18 = self;
+ libcrux_sha3_generic_keccak_set_80_04(
+ uu____18, (size_t)4U, (size_t)3U,
+ libcrux_sha3_simd_portable_xor_and_rotate_d2_4c(
+ libcrux_sha3_generic_keccak_index_c2_04(
+ self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U,
+ .snd = (size_t)3U}))[0U],
+ t[3U]));
+ libcrux_sha3_generic_keccak_KeccakState_17 *uu____19 = self;
+ libcrux_sha3_generic_keccak_set_80_04(
+ uu____19, (size_t)0U, (size_t)4U,
+ libcrux_sha3_simd_portable_xor_and_rotate_d2_ce(
+ libcrux_sha3_generic_keccak_index_c2_04(
+ self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U,
+ .snd = (size_t)4U}))[0U],
+ t[4U]));
+ libcrux_sha3_generic_keccak_KeccakState_17 *uu____20 = self;
+ libcrux_sha3_generic_keccak_set_80_04(
+ uu____20, (size_t)1U, (size_t)4U,
+ libcrux_sha3_simd_portable_xor_and_rotate_d2_77(
+ libcrux_sha3_generic_keccak_index_c2_04(
+ self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U,
+ .snd = (size_t)4U}))[0U],
+ t[4U]));
+ libcrux_sha3_generic_keccak_KeccakState_17 *uu____21 = self;
+ libcrux_sha3_generic_keccak_set_80_04(
+ uu____21, (size_t)2U, (size_t)4U,
+ libcrux_sha3_simd_portable_xor_and_rotate_d2_25(
+ libcrux_sha3_generic_keccak_index_c2_04(
+ self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U,
+ .snd = (size_t)4U}))[0U],
+ t[4U]));
+ libcrux_sha3_generic_keccak_KeccakState_17 *uu____22 = self;
+ libcrux_sha3_generic_keccak_set_80_04(
+ uu____22, (size_t)3U, (size_t)4U,
+ libcrux_sha3_simd_portable_xor_and_rotate_d2_af(
+ libcrux_sha3_generic_keccak_index_c2_04(
+ self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U,
+ .snd = (size_t)4U}))[0U],
+ t[4U]));
+ libcrux_sha3_generic_keccak_KeccakState_17 *uu____23 = self;
+ libcrux_sha3_generic_keccak_set_80_04(
+ uu____23, (size_t)4U, (size_t)4U,
+ libcrux_sha3_simd_portable_xor_and_rotate_d2_fd(
+ libcrux_sha3_generic_keccak_index_c2_04(
+ self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U,
+ .snd = (size_t)4U}))[0U],
+ t[4U]));
}
/**
-A monomorphic instance of libcrux_sha3.generic_keccak.pi
+This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T,
+N>[TraitClause@0, TraitClause@1]}
+*/
+/**
+A monomorphic instance of libcrux_sha3.generic_keccak.pi_80
with types uint64_t
with const generics
- N= 1
*/
-static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_pi_1d(
- libcrux_sha3_generic_keccak_KeccakState_48 *s) {
- uint64_t old[5U][5U];
- memcpy(old, s->st, (size_t)5U * sizeof(uint64_t[5U]));
- s->st[0U][1U] = old[1U][1U];
- s->st[0U][2U] = old[2U][2U];
- s->st[0U][3U] = old[3U][3U];
- s->st[0U][4U] = old[4U][4U];
- s->st[1U][0U] = old[0U][3U];
- s->st[1U][1U] = old[1U][4U];
- s->st[1U][2U] = old[2U][0U];
- s->st[1U][3U] = old[3U][1U];
- s->st[1U][4U] = old[4U][2U];
- s->st[2U][0U] = old[0U][1U];
- s->st[2U][1U] = old[1U][2U];
- s->st[2U][2U] = old[2U][3U];
- s->st[2U][3U] = old[3U][4U];
- s->st[2U][4U] = old[4U][0U];
- s->st[3U][0U] = old[0U][4U];
- s->st[3U][1U] = old[1U][0U];
- s->st[3U][2U] = old[2U][1U];
- s->st[3U][3U] = old[3U][2U];
- s->st[3U][4U] = old[4U][3U];
- s->st[4U][0U] = old[0U][2U];
- s->st[4U][1U] = old[1U][3U];
- s->st[4U][2U] = old[2U][4U];
- s->st[4U][3U] = old[3U][0U];
- s->st[4U][4U] = old[4U][1U];
+static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_pi_80_04(
+ libcrux_sha3_generic_keccak_KeccakState_17 *self) {
+ libcrux_sha3_generic_keccak_KeccakState_17 old = self[0U];
+ libcrux_sha3_generic_keccak_set_80_04(
+ self, (size_t)1U, (size_t)0U,
+ libcrux_sha3_generic_keccak_index_c2_04(
+ &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U,
+ .snd = (size_t)3U}))[0U]);
+ libcrux_sha3_generic_keccak_set_80_04(
+ self, (size_t)2U, (size_t)0U,
+ libcrux_sha3_generic_keccak_index_c2_04(
+ &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U,
+ .snd = (size_t)1U}))[0U]);
+ libcrux_sha3_generic_keccak_set_80_04(
+ self, (size_t)3U, (size_t)0U,
+ libcrux_sha3_generic_keccak_index_c2_04(
+ &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U,
+ .snd = (size_t)4U}))[0U]);
+ libcrux_sha3_generic_keccak_set_80_04(
+ self, (size_t)4U, (size_t)0U,
+ libcrux_sha3_generic_keccak_index_c2_04(
+ &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U,
+ .snd = (size_t)2U}))[0U]);
+ libcrux_sha3_generic_keccak_set_80_04(
+ self, (size_t)0U, (size_t)1U,
+ libcrux_sha3_generic_keccak_index_c2_04(
+ &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U,
+ .snd = (size_t)1U}))[0U]);
+ libcrux_sha3_generic_keccak_set_80_04(
+ self, (size_t)1U, (size_t)1U,
+ libcrux_sha3_generic_keccak_index_c2_04(
+ &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U,
+ .snd = (size_t)4U}))[0U]);
+ libcrux_sha3_generic_keccak_set_80_04(
+ self, (size_t)2U, (size_t)1U,
+ libcrux_sha3_generic_keccak_index_c2_04(
+ &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U,
+ .snd = (size_t)2U}))[0U]);
+ libcrux_sha3_generic_keccak_set_80_04(
+ self, (size_t)3U, (size_t)1U,
+ libcrux_sha3_generic_keccak_index_c2_04(
+ &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U,
+ .snd = (size_t)0U}))[0U]);
+ libcrux_sha3_generic_keccak_set_80_04(
+ self, (size_t)4U, (size_t)1U,
+ libcrux_sha3_generic_keccak_index_c2_04(
+ &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U,
+ .snd = (size_t)3U}))[0U]);
+ libcrux_sha3_generic_keccak_set_80_04(
+ self, (size_t)0U, (size_t)2U,
+ libcrux_sha3_generic_keccak_index_c2_04(
+ &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U,
+ .snd = (size_t)2U}))[0U]);
+ libcrux_sha3_generic_keccak_set_80_04(
+ self, (size_t)1U, (size_t)2U,
+ libcrux_sha3_generic_keccak_index_c2_04(
+ &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U,
+ .snd = (size_t)0U}))[0U]);
+ libcrux_sha3_generic_keccak_set_80_04(
+ self, (size_t)2U, (size_t)2U,
+ libcrux_sha3_generic_keccak_index_c2_04(
+ &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U,
+ .snd = (size_t)3U}))[0U]);
+ libcrux_sha3_generic_keccak_set_80_04(
+ self, (size_t)3U, (size_t)2U,
+ libcrux_sha3_generic_keccak_index_c2_04(
+ &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U,
+ .snd = (size_t)1U}))[0U]);
+ libcrux_sha3_generic_keccak_set_80_04(
+ self, (size_t)4U, (size_t)2U,
+ libcrux_sha3_generic_keccak_index_c2_04(
+ &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U,
+ .snd = (size_t)4U}))[0U]);
+ libcrux_sha3_generic_keccak_set_80_04(
+ self, (size_t)0U, (size_t)3U,
+ libcrux_sha3_generic_keccak_index_c2_04(
+ &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U,
+ .snd = (size_t)3U}))[0U]);
+ libcrux_sha3_generic_keccak_set_80_04(
+ self, (size_t)1U, (size_t)3U,
+ libcrux_sha3_generic_keccak_index_c2_04(
+ &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U,
+ .snd = (size_t)1U}))[0U]);
+ libcrux_sha3_generic_keccak_set_80_04(
+ self, (size_t)2U, (size_t)3U,
+ libcrux_sha3_generic_keccak_index_c2_04(
+ &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U,
+ .snd = (size_t)4U}))[0U]);
+ libcrux_sha3_generic_keccak_set_80_04(
+ self, (size_t)3U, (size_t)3U,
+ libcrux_sha3_generic_keccak_index_c2_04(
+ &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U,
+ .snd = (size_t)2U}))[0U]);
+ libcrux_sha3_generic_keccak_set_80_04(
+ self, (size_t)4U, (size_t)3U,
+ libcrux_sha3_generic_keccak_index_c2_04(
+ &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U,
+ .snd = (size_t)0U}))[0U]);
+ libcrux_sha3_generic_keccak_set_80_04(
+ self, (size_t)0U, (size_t)4U,
+ libcrux_sha3_generic_keccak_index_c2_04(
+ &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U,
+ .snd = (size_t)4U}))[0U]);
+ libcrux_sha3_generic_keccak_set_80_04(
+ self, (size_t)1U, (size_t)4U,
+ libcrux_sha3_generic_keccak_index_c2_04(
+ &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U,
+ .snd = (size_t)2U}))[0U]);
+ libcrux_sha3_generic_keccak_set_80_04(
+ self, (size_t)2U, (size_t)4U,
+ libcrux_sha3_generic_keccak_index_c2_04(
+ &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U,
+ .snd = (size_t)0U}))[0U]);
+ libcrux_sha3_generic_keccak_set_80_04(
+ self, (size_t)3U, (size_t)4U,
+ libcrux_sha3_generic_keccak_index_c2_04(
+ &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U,
+ .snd = (size_t)3U}))[0U]);
+ libcrux_sha3_generic_keccak_set_80_04(
+ self, (size_t)4U, (size_t)4U,
+ libcrux_sha3_generic_keccak_index_c2_04(
+ &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U,
+ .snd = (size_t)1U}))[0U]);
}
/**
-A monomorphic instance of libcrux_sha3.generic_keccak.chi
+This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T,
+N>[TraitClause@0, TraitClause@1]}
+*/
+/**
+A monomorphic instance of libcrux_sha3.generic_keccak.chi_80
with types uint64_t
with const generics
- N= 1
*/
-static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_chi_12(
- libcrux_sha3_generic_keccak_KeccakState_48 *s) {
- uint64_t old[5U][5U];
- memcpy(old, s->st, (size_t)5U * sizeof(uint64_t[5U]));
+static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_chi_80_04(
+ libcrux_sha3_generic_keccak_KeccakState_17 *self) {
+ libcrux_sha3_generic_keccak_KeccakState_17 old = self[0U];
for (size_t i0 = (size_t)0U; i0 < (size_t)5U; i0++) {
size_t i1 = i0;
for (size_t i = (size_t)0U; i < (size_t)5U; i++) {
size_t j = i;
- s->st[i1][j] = libcrux_sha3_portable_keccak_and_not_xor_5a(
- s->st[i1][j], old[i1][(j + (size_t)2U) % (size_t)5U],
- old[i1][(j + (size_t)1U) % (size_t)5U]);
+ libcrux_sha3_generic_keccak_set_80_04(
+ self, i1, j,
+ libcrux_sha3_simd_portable_and_not_xor_d2(
+ libcrux_sha3_generic_keccak_index_c2_04(
+ self, (KRML_CLITERAL(size_t_x2){.fst = i1, .snd = j}))[0U],
+ libcrux_sha3_generic_keccak_index_c2_04(
+ &old,
+ (KRML_CLITERAL(size_t_x2){
+ .fst = i1, .snd = (j + (size_t)2U) % (size_t)5U}))[0U],
+ libcrux_sha3_generic_keccak_index_c2_04(
+ &old,
+ (KRML_CLITERAL(size_t_x2){
+ .fst = i1, .snd = (j + (size_t)1U) % (size_t)5U}))[0U]));
}
}
}
/**
-A monomorphic instance of libcrux_sha3.generic_keccak.iota
+This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T,
+N>[TraitClause@0, TraitClause@1]}
+*/
+/**
+A monomorphic instance of libcrux_sha3.generic_keccak.iota_80
with types uint64_t
with const generics
- N= 1
*/
-static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_iota_62(
- libcrux_sha3_generic_keccak_KeccakState_48 *s, size_t i) {
- s->st[0U][0U] = libcrux_sha3_portable_keccak_xor_constant_5a(
- s->st[0U][0U], libcrux_sha3_generic_keccak_ROUNDCONSTANTS[i]);
+static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_iota_80_04(
+ libcrux_sha3_generic_keccak_KeccakState_17 *self, size_t i) {
+ libcrux_sha3_generic_keccak_set_80_04(
+ self, (size_t)0U, (size_t)0U,
+ libcrux_sha3_simd_portable_xor_constant_d2(
+ libcrux_sha3_generic_keccak_index_c2_04(
+ self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U,
+ .snd = (size_t)0U}))[0U],
+ libcrux_sha3_generic_keccak_constants_ROUNDCONSTANTS[i]));
}
/**
-A monomorphic instance of libcrux_sha3.generic_keccak.keccakf1600
+This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T,
+N>[TraitClause@0, TraitClause@1]}
+*/
+/**
+A monomorphic instance of libcrux_sha3.generic_keccak.keccakf1600_80
with types uint64_t
with const generics
- N= 1
*/
-static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_keccakf1600_21(
- libcrux_sha3_generic_keccak_KeccakState_48 *s) {
+static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_keccakf1600_80_04(
+ libcrux_sha3_generic_keccak_KeccakState_17 *self) {
for (size_t i = (size_t)0U; i < (size_t)24U; i++) {
size_t i0 = i;
- libcrux_sha3_generic_keccak_theta_rho_16(s);
- libcrux_sha3_generic_keccak_pi_1d(s);
- libcrux_sha3_generic_keccak_chi_12(s);
- libcrux_sha3_generic_keccak_iota_62(s, i0);
+ uint64_t t[5U];
+ libcrux_sha3_generic_keccak_theta_80_04(self, t);
+ libcrux_sha3_generic_keccak_KeccakState_17 *uu____0 = self;
+ uint64_t uu____1[5U];
+ memcpy(uu____1, t, (size_t)5U * sizeof(uint64_t));
+ libcrux_sha3_generic_keccak_rho_80_04(uu____0, uu____1);
+ libcrux_sha3_generic_keccak_pi_80_04(self);
+ libcrux_sha3_generic_keccak_chi_80_04(self);
+ libcrux_sha3_generic_keccak_iota_80_04(self, i0);
}
}
/**
-A monomorphic instance of libcrux_sha3.generic_keccak.absorb_block
+This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T,
+N>[TraitClause@0, TraitClause@1]}
+*/
+/**
+A monomorphic instance of libcrux_sha3.generic_keccak.absorb_block_80
with types uint64_t
with const generics
- N= 1
- RATE= 72
*/
-static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_block_df(
- libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice blocks[1U]) {
- uint64_t(*uu____0)[5U] = s->st;
- Eurydice_slice uu____1[1U];
- memcpy(uu____1, blocks, (size_t)1U * sizeof(Eurydice_slice));
- libcrux_sha3_portable_keccak_load_block_5a_b8(uu____0, uu____1);
- libcrux_sha3_generic_keccak_keccakf1600_21(s);
+static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_block_80_c6(
+ libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *blocks,
+ size_t start) {
+ libcrux_sha3_simd_portable_load_block_a1_f8(self, blocks, start);
+ libcrux_sha3_generic_keccak_keccakf1600_80_04(self);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.load_block_full
+A monomorphic instance of libcrux_sha3.simd.portable.load_last
with const generics
- RATE= 72
+- DELIMITER= 6
*/
-static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_full_df(
- uint64_t (*s)[5U], uint8_t blocks[1U][200U]) {
- Eurydice_slice buf[1U] = {
- Eurydice_array_to_slice((size_t)200U, blocks[0U], uint8_t)};
- libcrux_sha3_portable_keccak_load_block_2c(s, buf);
+static KRML_MUSTINLINE void libcrux_sha3_simd_portable_load_last_96(
+ uint64_t *state, Eurydice_slice blocks, size_t start, size_t len) {
+ uint8_t buffer[72U] = {0U};
+ Eurydice_slice_copy(
+ Eurydice_array_to_subslice3(buffer, (size_t)0U, len, uint8_t *),
+ Eurydice_slice_subslice3(blocks, start, start + len, uint8_t *), uint8_t);
+ buffer[len] = 6U;
+ size_t uu____0 = (size_t)72U - (size_t)1U;
+ buffer[uu____0] = (uint32_t)buffer[uu____0] | 128U;
+ libcrux_sha3_simd_portable_load_block_f8(
+ state, Eurydice_array_to_slice((size_t)72U, buffer, uint8_t), (size_t)0U);
}
/**
-This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
-usize> for u64)}
+This function found in impl {libcrux_sha3::traits::Absorb<1usize> for
+libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>,
+libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for
+u64}]}
*/
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.load_block_full_5a
+A monomorphic instance of libcrux_sha3.simd.portable.load_last_a1
with const generics
- RATE= 72
+- DELIMITER= 6
*/
-static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_full_5a_d2(
- uint64_t (*a)[5U], uint8_t b[1U][200U]) {
- uint64_t(*uu____0)[5U] = a;
- /* Passing arrays by value in Rust generates a copy in C */
- uint8_t copy_of_b[1U][200U];
- memcpy(copy_of_b, b, (size_t)1U * sizeof(uint8_t[200U]));
- libcrux_sha3_portable_keccak_load_block_full_df(uu____0, copy_of_b);
+static inline void libcrux_sha3_simd_portable_load_last_a1_96(
+ libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *input,
+ size_t start, size_t len) {
+ libcrux_sha3_simd_portable_load_last_96(self->st, input[0U], start, len);
}
/**
-A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final
+This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T,
+N>[TraitClause@0, TraitClause@1]}
+*/
+/**
+A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final_80
with types uint64_t
with const generics
- N= 1
- RATE= 72
- DELIM= 6
*/
-static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_c7(
- libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice last[1U]) {
- size_t last_len = Eurydice_slice_len(last[0U], uint8_t);
- uint8_t blocks[1U][200U] = {{0U}};
- for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
- size_t i0 = i;
- if (last_len > (size_t)0U) {
- Eurydice_slice uu____0 = Eurydice_array_to_subslice2(
- blocks[i0], (size_t)0U, last_len, uint8_t);
- Eurydice_slice_copy(uu____0, last[i0], uint8_t);
- }
- blocks[i0][last_len] = 6U;
- size_t uu____1 = i0;
- size_t uu____2 = (size_t)72U - (size_t)1U;
- blocks[uu____1][uu____2] = (uint32_t)blocks[uu____1][uu____2] | 128U;
- }
- uint64_t(*uu____3)[5U] = s->st;
- uint8_t uu____4[1U][200U];
- memcpy(uu____4, blocks, (size_t)1U * sizeof(uint8_t[200U]));
- libcrux_sha3_portable_keccak_load_block_full_5a_d2(uu____3, uu____4);
- libcrux_sha3_generic_keccak_keccakf1600_21(s);
+static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_80_9e(
+ libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *last,
+ size_t start, size_t len) {
+ libcrux_sha3_simd_portable_load_last_a1_96(self, last, start, len);
+ libcrux_sha3_generic_keccak_keccakf1600_80_04(self);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.store_block
+A monomorphic instance of libcrux_sha3.simd.portable.store_block
with const generics
- RATE= 72
*/
-static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_58(
- uint64_t (*s)[5U], Eurydice_slice out[1U]) {
- for (size_t i = (size_t)0U; i < (size_t)72U / (size_t)8U; i++) {
+static KRML_MUSTINLINE void libcrux_sha3_simd_portable_store_block_f8(
+ uint64_t *s, Eurydice_slice out, size_t start, size_t len) {
+ size_t octets = len / (size_t)8U;
+ for (size_t i = (size_t)0U; i < octets; i++) {
size_t i0 = i;
- Eurydice_slice uu____0 = Eurydice_slice_subslice2(
- out[0U], (size_t)8U * i0, (size_t)8U * i0 + (size_t)8U, uint8_t);
+ Eurydice_slice uu____0 = Eurydice_slice_subslice3(
+ out, start + (size_t)8U * i0, start + (size_t)8U * i0 + (size_t)8U,
+ uint8_t *);
uint8_t ret[8U];
- core_num__u64_9__to_le_bytes(s[i0 / (size_t)5U][i0 % (size_t)5U], ret);
+ core_num__u64__to_le_bytes(
+ libcrux_sha3_traits_get_ij_04(s, i0 / (size_t)5U, i0 % (size_t)5U)[0U],
+ ret);
Eurydice_slice_copy(
uu____0, Eurydice_array_to_slice((size_t)8U, ret, uint8_t), uint8_t);
}
-}
-
-/**
-A monomorphic instance of libcrux_sha3.portable_keccak.store_block_full
-with const generics
-- RATE= 72
-*/
-static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_full_2d(
- uint64_t (*s)[5U], uint8_t ret[1U][200U]) {
- uint8_t out[200U] = {0U};
- Eurydice_slice buf[1U] = {
- Eurydice_array_to_slice((size_t)200U, out, uint8_t)};
- libcrux_sha3_portable_keccak_store_block_58(s, buf);
- /* Passing arrays by value in Rust generates a copy in C */
- uint8_t copy_of_out[200U];
- memcpy(copy_of_out, out, (size_t)200U * sizeof(uint8_t));
- memcpy(ret[0U], copy_of_out, (size_t)200U * sizeof(uint8_t));
-}
-
-/**
-This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
-usize> for u64)}
-*/
-/**
-A monomorphic instance of libcrux_sha3.portable_keccak.store_block_full_5a
-with const generics
-- RATE= 72
-*/
-static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_full_5a_29(
- uint64_t (*a)[5U], uint8_t ret[1U][200U]) {
- libcrux_sha3_portable_keccak_store_block_full_2d(a, ret);
-}
-
-/**
-A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_first_and_last
-with types uint64_t
-with const generics
-- N= 1
-- RATE= 72
-*/
-static KRML_MUSTINLINE void
-libcrux_sha3_generic_keccak_squeeze_first_and_last_c5(
- libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) {
- uint8_t b[1U][200U];
- libcrux_sha3_portable_keccak_store_block_full_5a_29(s->st, b);
- for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
- size_t i0 = i;
- Eurydice_slice uu____0 = out[i0];
- uint8_t *uu____1 = b[i0];
- core_ops_range_Range_b3 lit;
- lit.start = (size_t)0U;
- lit.end = Eurydice_slice_len(out[i0], uint8_t);
+ size_t remaining = len % (size_t)8U;
+ if (remaining > (size_t)0U) {
+ Eurydice_slice uu____1 = Eurydice_slice_subslice3(
+ out, start + len - remaining, start + len, uint8_t *);
+ uint8_t ret[8U];
+ core_num__u64__to_le_bytes(
+ libcrux_sha3_traits_get_ij_04(s, octets / (size_t)5U,
+ octets % (size_t)5U)[0U],
+ ret);
Eurydice_slice_copy(
- uu____0,
- Eurydice_array_to_subslice((size_t)200U, uu____1, lit, uint8_t,
- core_ops_range_Range_b3),
+ uu____1,
+ Eurydice_array_to_subslice3(ret, (size_t)0U, remaining, uint8_t *),
uint8_t);
}
}
/**
-This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
-usize> for u64)}
-*/
-/**
-A monomorphic instance of libcrux_sha3.portable_keccak.store_block_5a
-with const generics
-- RATE= 72
-*/
-static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_5a_59(
- uint64_t (*a)[5U], Eurydice_slice b[1U]) {
- libcrux_sha3_portable_keccak_store_block_58(a, b);
-}
-
-/**
-A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_first_block
-with types uint64_t
-with const generics
-- N= 1
-- RATE= 72
-*/
-static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_first_block_84(
- libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) {
- libcrux_sha3_portable_keccak_store_block_5a_59(s->st, out);
-}
-
-/**
-A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_next_block
-with types uint64_t
-with const generics
-- N= 1
-- RATE= 72
+This function found in impl {libcrux_sha3::traits::Squeeze1<u64> for
+libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>,
+libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for
+u64}]}
*/
-static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_next_block_fc(
- libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) {
- libcrux_sha3_generic_keccak_keccakf1600_21(s);
- libcrux_sha3_portable_keccak_store_block_5a_59(s->st, out);
-}
-
/**
-A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_last
-with types uint64_t
+A monomorphic instance of libcrux_sha3.simd.portable.squeeze_13
with const generics
-- N= 1
- RATE= 72
*/
-static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_last_cf(
- libcrux_sha3_generic_keccak_KeccakState_48 s, Eurydice_slice out[1U]) {
- libcrux_sha3_generic_keccak_keccakf1600_21(&s);
- uint8_t b[1U][200U];
- libcrux_sha3_portable_keccak_store_block_full_5a_29(s.st, b);
- for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
- size_t i0 = i;
- Eurydice_slice uu____0 = out[i0];
- uint8_t *uu____1 = b[i0];
- core_ops_range_Range_b3 lit;
- lit.start = (size_t)0U;
- lit.end = Eurydice_slice_len(out[i0], uint8_t);
- Eurydice_slice_copy(
- uu____0,
- Eurydice_array_to_subslice((size_t)200U, uu____1, lit, uint8_t,
- core_ops_range_Range_b3),
- uint8_t);
- }
+static inline void libcrux_sha3_simd_portable_squeeze_13_f8(
+ libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice out,
+ size_t start, size_t len) {
+ libcrux_sha3_simd_portable_store_block_f8(self->st, out, start, len);
}
/**
-A monomorphic instance of libcrux_sha3.generic_keccak.keccak
-with types uint64_t
+A monomorphic instance of libcrux_sha3.generic_keccak.portable.keccak1
with const generics
-- N= 1
- RATE= 72
- DELIM= 6
*/
-static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_keccak_e9(
- Eurydice_slice data[1U], Eurydice_slice out[1U]) {
- libcrux_sha3_generic_keccak_KeccakState_48 s =
- libcrux_sha3_generic_keccak_new_1e_f4();
- for (size_t i = (size_t)0U;
- i < Eurydice_slice_len(data[0U], uint8_t) / (size_t)72U; i++) {
+static inline void libcrux_sha3_generic_keccak_portable_keccak1_96(
+ Eurydice_slice data, Eurydice_slice out) {
+ libcrux_sha3_generic_keccak_KeccakState_17 s =
+ libcrux_sha3_generic_keccak_new_80_04();
+ size_t data_len = Eurydice_slice_len(data, uint8_t);
+ for (size_t i = (size_t)0U; i < data_len / (size_t)72U; i++) {
size_t i0 = i;
- libcrux_sha3_generic_keccak_KeccakState_48 *uu____0 = &s;
- /* Passing arrays by value in Rust generates a copy in C */
- Eurydice_slice copy_of_data[1U];
- memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice));
- Eurydice_slice ret[1U];
- libcrux_sha3_portable_keccak_slice_n_5a(copy_of_data, i0 * (size_t)72U,
- (size_t)72U, ret);
- libcrux_sha3_generic_keccak_absorb_block_df(uu____0, ret);
+ Eurydice_slice buf[1U] = {data};
+ libcrux_sha3_generic_keccak_absorb_block_80_c6(&s, buf, i0 * (size_t)72U);
}
- size_t rem = Eurydice_slice_len(data[0U], uint8_t) % (size_t)72U;
- libcrux_sha3_generic_keccak_KeccakState_48 *uu____2 = &s;
- /* Passing arrays by value in Rust generates a copy in C */
- Eurydice_slice copy_of_data[1U];
- memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice));
- Eurydice_slice ret[1U];
- libcrux_sha3_portable_keccak_slice_n_5a(
- copy_of_data, Eurydice_slice_len(data[0U], uint8_t) - rem, rem, ret);
- libcrux_sha3_generic_keccak_absorb_final_c7(uu____2, ret);
- size_t outlen = Eurydice_slice_len(out[0U], uint8_t);
+ size_t rem = data_len % (size_t)72U;
+ Eurydice_slice buf[1U] = {data};
+ libcrux_sha3_generic_keccak_absorb_final_80_9e(&s, buf, data_len - rem, rem);
+ size_t outlen = Eurydice_slice_len(out, uint8_t);
size_t blocks = outlen / (size_t)72U;
size_t last = outlen - outlen % (size_t)72U;
if (blocks == (size_t)0U) {
- libcrux_sha3_generic_keccak_squeeze_first_and_last_c5(&s, out);
+ libcrux_sha3_simd_portable_squeeze_13_f8(&s, out, (size_t)0U, outlen);
} else {
- Eurydice_slice_uint8_t_1size_t__x2 uu____4 =
- libcrux_sha3_portable_keccak_split_at_mut_n_5a(out, (size_t)72U);
- Eurydice_slice o0[1U];
- memcpy(o0, uu____4.fst, (size_t)1U * sizeof(Eurydice_slice));
- Eurydice_slice o1[1U];
- memcpy(o1, uu____4.snd, (size_t)1U * sizeof(Eurydice_slice));
- libcrux_sha3_generic_keccak_squeeze_first_block_84(&s, o0);
- core_ops_range_Range_b3 iter =
- core_iter_traits_collect___core__iter__traits__collect__IntoIterator_for_I__1__into_iter(
- (CLITERAL(core_ops_range_Range_b3){.start = (size_t)1U,
- .end = blocks}),
- core_ops_range_Range_b3, core_ops_range_Range_b3);
- while (true) {
- if (core_iter_range___core__iter__traits__iterator__Iterator_for_core__ops__range__Range_A___6__next(
- &iter, size_t, Option_b3)
- .tag == None) {
- break;
- } else {
- Eurydice_slice_uint8_t_1size_t__x2 uu____5 =
- libcrux_sha3_portable_keccak_split_at_mut_n_5a(o1, (size_t)72U);
- Eurydice_slice o[1U];
- memcpy(o, uu____5.fst, (size_t)1U * sizeof(Eurydice_slice));
- Eurydice_slice orest[1U];
- memcpy(orest, uu____5.snd, (size_t)1U * sizeof(Eurydice_slice));
- libcrux_sha3_generic_keccak_squeeze_next_block_fc(&s, o);
- memcpy(o1, orest, (size_t)1U * sizeof(Eurydice_slice));
- }
+ libcrux_sha3_simd_portable_squeeze_13_f8(&s, out, (size_t)0U, (size_t)72U);
+ for (size_t i = (size_t)1U; i < blocks; i++) {
+ size_t i0 = i;
+ libcrux_sha3_generic_keccak_keccakf1600_80_04(&s);
+ libcrux_sha3_simd_portable_squeeze_13_f8(&s, out, i0 * (size_t)72U,
+ (size_t)72U);
}
if (last < outlen) {
- libcrux_sha3_generic_keccak_squeeze_last_cf(s, o1);
+ libcrux_sha3_generic_keccak_keccakf1600_80_04(&s);
+ libcrux_sha3_simd_portable_squeeze_13_f8(&s, out, last, outlen - last);
}
}
}
/**
-A monomorphic instance of libcrux_sha3.portable.keccakx1
-with const generics
-- RATE= 72
-- DELIM= 6
-*/
-static KRML_MUSTINLINE void libcrux_sha3_portable_keccakx1_ce(
- Eurydice_slice data[1U], Eurydice_slice out[1U]) {
- /* Passing arrays by value in Rust generates a copy in C */
- Eurydice_slice copy_of_data[1U];
- memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice));
- libcrux_sha3_generic_keccak_keccak_e9(copy_of_data, out);
-}
-
-/**
A portable SHA3 512 implementation.
*/
static KRML_MUSTINLINE void libcrux_sha3_portable_sha512(Eurydice_slice digest,
Eurydice_slice data) {
- Eurydice_slice buf0[1U] = {data};
- Eurydice_slice buf[1U] = {digest};
- libcrux_sha3_portable_keccakx1_ce(buf0, buf);
+ libcrux_sha3_generic_keccak_portable_keccak1_96(data, digest);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.load_block
+A monomorphic instance of libcrux_sha3.simd.portable.load_block
with const generics
- RATE= 136
*/
-static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_2c0(
- uint64_t (*s)[5U], Eurydice_slice blocks[1U]) {
+static KRML_MUSTINLINE void libcrux_sha3_simd_portable_load_block_5b(
+ uint64_t *state, Eurydice_slice blocks, size_t start) {
+ uint64_t state_flat[25U] = {0U};
for (size_t i = (size_t)0U; i < (size_t)136U / (size_t)8U; i++) {
size_t i0 = i;
+ size_t offset = start + (size_t)8U * i0;
uint8_t uu____0[8U];
- Result_56 dst;
+ Result_15 dst;
Eurydice_slice_to_array2(
&dst,
- Eurydice_slice_subslice2(blocks[0U], (size_t)8U * i0,
- (size_t)8U * i0 + (size_t)8U, uint8_t),
- Eurydice_slice, uint8_t[8U]);
- unwrap_41_ac(dst, uu____0);
- size_t uu____1 = i0 / (size_t)5U;
- size_t uu____2 = i0 % (size_t)5U;
- s[uu____1][uu____2] =
- s[uu____1][uu____2] ^ core_num__u64_9__from_le_bytes(uu____0);
+ Eurydice_slice_subslice3(blocks, offset, offset + (size_t)8U,
+ uint8_t *),
+ Eurydice_slice, uint8_t[8U], TryFromSliceError);
+ unwrap_26_68(dst, uu____0);
+ state_flat[i0] = core_num__u64__from_le_bytes(uu____0);
+ }
+ for (size_t i = (size_t)0U; i < (size_t)136U / (size_t)8U; i++) {
+ size_t i0 = i;
+ libcrux_sha3_traits_set_ij_04(
+ state, i0 / (size_t)5U, i0 % (size_t)5U,
+ libcrux_sha3_traits_get_ij_04(state, i0 / (size_t)5U,
+ i0 % (size_t)5U)[0U] ^
+ state_flat[i0]);
}
}
/**
-This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
-usize> for u64)}
+This function found in impl {libcrux_sha3::traits::Absorb<1usize> for
+libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>,
+libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for
+u64}]}
*/
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.load_block_5a
+A monomorphic instance of libcrux_sha3.simd.portable.load_block_a1
with const generics
- RATE= 136
*/
-static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_5a_b80(
- uint64_t (*a)[5U], Eurydice_slice b[1U]) {
- uint64_t(*uu____0)[5U] = a;
- /* Passing arrays by value in Rust generates a copy in C */
- Eurydice_slice copy_of_b[1U];
- memcpy(copy_of_b, b, (size_t)1U * sizeof(Eurydice_slice));
- libcrux_sha3_portable_keccak_load_block_2c0(uu____0, copy_of_b);
+static inline void libcrux_sha3_simd_portable_load_block_a1_5b(
+ libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *input,
+ size_t start) {
+ libcrux_sha3_simd_portable_load_block_5b(self->st, input[0U], start);
}
/**
-A monomorphic instance of libcrux_sha3.generic_keccak.absorb_block
+This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T,
+N>[TraitClause@0, TraitClause@1]}
+*/
+/**
+A monomorphic instance of libcrux_sha3.generic_keccak.absorb_block_80
with types uint64_t
with const generics
- N= 1
- RATE= 136
*/
-static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_block_df0(
- libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice blocks[1U]) {
- uint64_t(*uu____0)[5U] = s->st;
- Eurydice_slice uu____1[1U];
- memcpy(uu____1, blocks, (size_t)1U * sizeof(Eurydice_slice));
- libcrux_sha3_portable_keccak_load_block_5a_b80(uu____0, uu____1);
- libcrux_sha3_generic_keccak_keccakf1600_21(s);
+static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_block_80_c60(
+ libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *blocks,
+ size_t start) {
+ libcrux_sha3_simd_portable_load_block_a1_5b(self, blocks, start);
+ libcrux_sha3_generic_keccak_keccakf1600_80_04(self);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.load_block_full
+A monomorphic instance of libcrux_sha3.simd.portable.load_last
with const generics
- RATE= 136
+- DELIMITER= 6
*/
-static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_full_df0(
- uint64_t (*s)[5U], uint8_t blocks[1U][200U]) {
- Eurydice_slice buf[1U] = {
- Eurydice_array_to_slice((size_t)200U, blocks[0U], uint8_t)};
- libcrux_sha3_portable_keccak_load_block_2c0(s, buf);
+static KRML_MUSTINLINE void libcrux_sha3_simd_portable_load_last_ad(
+ uint64_t *state, Eurydice_slice blocks, size_t start, size_t len) {
+ uint8_t buffer[136U] = {0U};
+ Eurydice_slice_copy(
+ Eurydice_array_to_subslice3(buffer, (size_t)0U, len, uint8_t *),
+ Eurydice_slice_subslice3(blocks, start, start + len, uint8_t *), uint8_t);
+ buffer[len] = 6U;
+ size_t uu____0 = (size_t)136U - (size_t)1U;
+ buffer[uu____0] = (uint32_t)buffer[uu____0] | 128U;
+ libcrux_sha3_simd_portable_load_block_5b(
+ state, Eurydice_array_to_slice((size_t)136U, buffer, uint8_t),
+ (size_t)0U);
}
/**
-This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
-usize> for u64)}
+This function found in impl {libcrux_sha3::traits::Absorb<1usize> for
+libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>,
+libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for
+u64}]}
*/
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.load_block_full_5a
+A monomorphic instance of libcrux_sha3.simd.portable.load_last_a1
with const generics
- RATE= 136
+- DELIMITER= 6
*/
-static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_full_5a_d20(
- uint64_t (*a)[5U], uint8_t b[1U][200U]) {
- uint64_t(*uu____0)[5U] = a;
- /* Passing arrays by value in Rust generates a copy in C */
- uint8_t copy_of_b[1U][200U];
- memcpy(copy_of_b, b, (size_t)1U * sizeof(uint8_t[200U]));
- libcrux_sha3_portable_keccak_load_block_full_df0(uu____0, copy_of_b);
+static inline void libcrux_sha3_simd_portable_load_last_a1_ad(
+ libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *input,
+ size_t start, size_t len) {
+ libcrux_sha3_simd_portable_load_last_ad(self->st, input[0U], start, len);
}
/**
-A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final
+This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T,
+N>[TraitClause@0, TraitClause@1]}
+*/
+/**
+A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final_80
with types uint64_t
with const generics
- N= 1
- RATE= 136
- DELIM= 6
*/
-static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_c70(
- libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice last[1U]) {
- size_t last_len = Eurydice_slice_len(last[0U], uint8_t);
- uint8_t blocks[1U][200U] = {{0U}};
- for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
- size_t i0 = i;
- if (last_len > (size_t)0U) {
- Eurydice_slice uu____0 = Eurydice_array_to_subslice2(
- blocks[i0], (size_t)0U, last_len, uint8_t);
- Eurydice_slice_copy(uu____0, last[i0], uint8_t);
- }
- blocks[i0][last_len] = 6U;
- size_t uu____1 = i0;
- size_t uu____2 = (size_t)136U - (size_t)1U;
- blocks[uu____1][uu____2] = (uint32_t)blocks[uu____1][uu____2] | 128U;
- }
- uint64_t(*uu____3)[5U] = s->st;
- uint8_t uu____4[1U][200U];
- memcpy(uu____4, blocks, (size_t)1U * sizeof(uint8_t[200U]));
- libcrux_sha3_portable_keccak_load_block_full_5a_d20(uu____3, uu____4);
- libcrux_sha3_generic_keccak_keccakf1600_21(s);
+static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_80_9e0(
+ libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *last,
+ size_t start, size_t len) {
+ libcrux_sha3_simd_portable_load_last_a1_ad(self, last, start, len);
+ libcrux_sha3_generic_keccak_keccakf1600_80_04(self);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.store_block
+A monomorphic instance of libcrux_sha3.simd.portable.store_block
with const generics
- RATE= 136
*/
-static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_580(
- uint64_t (*s)[5U], Eurydice_slice out[1U]) {
- for (size_t i = (size_t)0U; i < (size_t)136U / (size_t)8U; i++) {
+static KRML_MUSTINLINE void libcrux_sha3_simd_portable_store_block_5b(
+ uint64_t *s, Eurydice_slice out, size_t start, size_t len) {
+ size_t octets = len / (size_t)8U;
+ for (size_t i = (size_t)0U; i < octets; i++) {
size_t i0 = i;
- Eurydice_slice uu____0 = Eurydice_slice_subslice2(
- out[0U], (size_t)8U * i0, (size_t)8U * i0 + (size_t)8U, uint8_t);
+ Eurydice_slice uu____0 = Eurydice_slice_subslice3(
+ out, start + (size_t)8U * i0, start + (size_t)8U * i0 + (size_t)8U,
+ uint8_t *);
uint8_t ret[8U];
- core_num__u64_9__to_le_bytes(s[i0 / (size_t)5U][i0 % (size_t)5U], ret);
+ core_num__u64__to_le_bytes(
+ libcrux_sha3_traits_get_ij_04(s, i0 / (size_t)5U, i0 % (size_t)5U)[0U],
+ ret);
Eurydice_slice_copy(
uu____0, Eurydice_array_to_slice((size_t)8U, ret, uint8_t), uint8_t);
}
-}
-
-/**
-A monomorphic instance of libcrux_sha3.portable_keccak.store_block_full
-with const generics
-- RATE= 136
-*/
-static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_full_2d0(
- uint64_t (*s)[5U], uint8_t ret[1U][200U]) {
- uint8_t out[200U] = {0U};
- Eurydice_slice buf[1U] = {
- Eurydice_array_to_slice((size_t)200U, out, uint8_t)};
- libcrux_sha3_portable_keccak_store_block_580(s, buf);
- /* Passing arrays by value in Rust generates a copy in C */
- uint8_t copy_of_out[200U];
- memcpy(copy_of_out, out, (size_t)200U * sizeof(uint8_t));
- memcpy(ret[0U], copy_of_out, (size_t)200U * sizeof(uint8_t));
-}
-
-/**
-This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
-usize> for u64)}
-*/
-/**
-A monomorphic instance of libcrux_sha3.portable_keccak.store_block_full_5a
-with const generics
-- RATE= 136
-*/
-static KRML_MUSTINLINE void
-libcrux_sha3_portable_keccak_store_block_full_5a_290(uint64_t (*a)[5U],
- uint8_t ret[1U][200U]) {
- libcrux_sha3_portable_keccak_store_block_full_2d0(a, ret);
-}
-
-/**
-A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_first_and_last
-with types uint64_t
-with const generics
-- N= 1
-- RATE= 136
-*/
-static KRML_MUSTINLINE void
-libcrux_sha3_generic_keccak_squeeze_first_and_last_c50(
- libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) {
- uint8_t b[1U][200U];
- libcrux_sha3_portable_keccak_store_block_full_5a_290(s->st, b);
- for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
- size_t i0 = i;
- Eurydice_slice uu____0 = out[i0];
- uint8_t *uu____1 = b[i0];
- core_ops_range_Range_b3 lit;
- lit.start = (size_t)0U;
- lit.end = Eurydice_slice_len(out[i0], uint8_t);
+ size_t remaining = len % (size_t)8U;
+ if (remaining > (size_t)0U) {
+ Eurydice_slice uu____1 = Eurydice_slice_subslice3(
+ out, start + len - remaining, start + len, uint8_t *);
+ uint8_t ret[8U];
+ core_num__u64__to_le_bytes(
+ libcrux_sha3_traits_get_ij_04(s, octets / (size_t)5U,
+ octets % (size_t)5U)[0U],
+ ret);
Eurydice_slice_copy(
- uu____0,
- Eurydice_array_to_subslice((size_t)200U, uu____1, lit, uint8_t,
- core_ops_range_Range_b3),
+ uu____1,
+ Eurydice_array_to_subslice3(ret, (size_t)0U, remaining, uint8_t *),
uint8_t);
}
}
/**
-This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
-usize> for u64)}
-*/
-/**
-A monomorphic instance of libcrux_sha3.portable_keccak.store_block_5a
-with const generics
-- RATE= 136
+This function found in impl {libcrux_sha3::traits::Squeeze1<u64> for
+libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>,
+libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for
+u64}]}
*/
-static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_5a_590(
- uint64_t (*a)[5U], Eurydice_slice b[1U]) {
- libcrux_sha3_portable_keccak_store_block_580(a, b);
-}
-
/**
-A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_first_block
-with types uint64_t
+A monomorphic instance of libcrux_sha3.simd.portable.squeeze_13
with const generics
-- N= 1
- RATE= 136
*/
-static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_first_block_840(
- libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) {
- libcrux_sha3_portable_keccak_store_block_5a_590(s->st, out);
+static inline void libcrux_sha3_simd_portable_squeeze_13_5b(
+ libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice out,
+ size_t start, size_t len) {
+ libcrux_sha3_simd_portable_store_block_5b(self->st, out, start, len);
}
/**
-A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_next_block
-with types uint64_t
+A monomorphic instance of libcrux_sha3.generic_keccak.portable.keccak1
with const generics
-- N= 1
-- RATE= 136
-*/
-static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_next_block_fc0(
- libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) {
- libcrux_sha3_generic_keccak_keccakf1600_21(s);
- libcrux_sha3_portable_keccak_store_block_5a_590(s->st, out);
-}
-
-/**
-A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_last
-with types uint64_t
-with const generics
-- N= 1
-- RATE= 136
-*/
-static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_last_cf0(
- libcrux_sha3_generic_keccak_KeccakState_48 s, Eurydice_slice out[1U]) {
- libcrux_sha3_generic_keccak_keccakf1600_21(&s);
- uint8_t b[1U][200U];
- libcrux_sha3_portable_keccak_store_block_full_5a_290(s.st, b);
- for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
- size_t i0 = i;
- Eurydice_slice uu____0 = out[i0];
- uint8_t *uu____1 = b[i0];
- core_ops_range_Range_b3 lit;
- lit.start = (size_t)0U;
- lit.end = Eurydice_slice_len(out[i0], uint8_t);
- Eurydice_slice_copy(
- uu____0,
- Eurydice_array_to_subslice((size_t)200U, uu____1, lit, uint8_t,
- core_ops_range_Range_b3),
- uint8_t);
- }
-}
-
-/**
-A monomorphic instance of libcrux_sha3.generic_keccak.keccak
-with types uint64_t
-with const generics
-- N= 1
- RATE= 136
- DELIM= 6
*/
-static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_keccak_e90(
- Eurydice_slice data[1U], Eurydice_slice out[1U]) {
- libcrux_sha3_generic_keccak_KeccakState_48 s =
- libcrux_sha3_generic_keccak_new_1e_f4();
- for (size_t i = (size_t)0U;
- i < Eurydice_slice_len(data[0U], uint8_t) / (size_t)136U; i++) {
+static inline void libcrux_sha3_generic_keccak_portable_keccak1_ad(
+ Eurydice_slice data, Eurydice_slice out) {
+ libcrux_sha3_generic_keccak_KeccakState_17 s =
+ libcrux_sha3_generic_keccak_new_80_04();
+ size_t data_len = Eurydice_slice_len(data, uint8_t);
+ for (size_t i = (size_t)0U; i < data_len / (size_t)136U; i++) {
size_t i0 = i;
- libcrux_sha3_generic_keccak_KeccakState_48 *uu____0 = &s;
- /* Passing arrays by value in Rust generates a copy in C */
- Eurydice_slice copy_of_data[1U];
- memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice));
- Eurydice_slice ret[1U];
- libcrux_sha3_portable_keccak_slice_n_5a(copy_of_data, i0 * (size_t)136U,
- (size_t)136U, ret);
- libcrux_sha3_generic_keccak_absorb_block_df0(uu____0, ret);
+ Eurydice_slice buf[1U] = {data};
+ libcrux_sha3_generic_keccak_absorb_block_80_c60(&s, buf, i0 * (size_t)136U);
}
- size_t rem = Eurydice_slice_len(data[0U], uint8_t) % (size_t)136U;
- libcrux_sha3_generic_keccak_KeccakState_48 *uu____2 = &s;
- /* Passing arrays by value in Rust generates a copy in C */
- Eurydice_slice copy_of_data[1U];
- memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice));
- Eurydice_slice ret[1U];
- libcrux_sha3_portable_keccak_slice_n_5a(
- copy_of_data, Eurydice_slice_len(data[0U], uint8_t) - rem, rem, ret);
- libcrux_sha3_generic_keccak_absorb_final_c70(uu____2, ret);
- size_t outlen = Eurydice_slice_len(out[0U], uint8_t);
+ size_t rem = data_len % (size_t)136U;
+ Eurydice_slice buf[1U] = {data};
+ libcrux_sha3_generic_keccak_absorb_final_80_9e0(&s, buf, data_len - rem, rem);
+ size_t outlen = Eurydice_slice_len(out, uint8_t);
size_t blocks = outlen / (size_t)136U;
size_t last = outlen - outlen % (size_t)136U;
if (blocks == (size_t)0U) {
- libcrux_sha3_generic_keccak_squeeze_first_and_last_c50(&s, out);
+ libcrux_sha3_simd_portable_squeeze_13_5b(&s, out, (size_t)0U, outlen);
} else {
- Eurydice_slice_uint8_t_1size_t__x2 uu____4 =
- libcrux_sha3_portable_keccak_split_at_mut_n_5a(out, (size_t)136U);
- Eurydice_slice o0[1U];
- memcpy(o0, uu____4.fst, (size_t)1U * sizeof(Eurydice_slice));
- Eurydice_slice o1[1U];
- memcpy(o1, uu____4.snd, (size_t)1U * sizeof(Eurydice_slice));
- libcrux_sha3_generic_keccak_squeeze_first_block_840(&s, o0);
- core_ops_range_Range_b3 iter =
- core_iter_traits_collect___core__iter__traits__collect__IntoIterator_for_I__1__into_iter(
- (CLITERAL(core_ops_range_Range_b3){.start = (size_t)1U,
- .end = blocks}),
- core_ops_range_Range_b3, core_ops_range_Range_b3);
- while (true) {
- if (core_iter_range___core__iter__traits__iterator__Iterator_for_core__ops__range__Range_A___6__next(
- &iter, size_t, Option_b3)
- .tag == None) {
- break;
- } else {
- Eurydice_slice_uint8_t_1size_t__x2 uu____5 =
- libcrux_sha3_portable_keccak_split_at_mut_n_5a(o1, (size_t)136U);
- Eurydice_slice o[1U];
- memcpy(o, uu____5.fst, (size_t)1U * sizeof(Eurydice_slice));
- Eurydice_slice orest[1U];
- memcpy(orest, uu____5.snd, (size_t)1U * sizeof(Eurydice_slice));
- libcrux_sha3_generic_keccak_squeeze_next_block_fc0(&s, o);
- memcpy(o1, orest, (size_t)1U * sizeof(Eurydice_slice));
- }
+ libcrux_sha3_simd_portable_squeeze_13_5b(&s, out, (size_t)0U, (size_t)136U);
+ for (size_t i = (size_t)1U; i < blocks; i++) {
+ size_t i0 = i;
+ libcrux_sha3_generic_keccak_keccakf1600_80_04(&s);
+ libcrux_sha3_simd_portable_squeeze_13_5b(&s, out, i0 * (size_t)136U,
+ (size_t)136U);
}
if (last < outlen) {
- libcrux_sha3_generic_keccak_squeeze_last_cf0(s, o1);
+ libcrux_sha3_generic_keccak_keccakf1600_80_04(&s);
+ libcrux_sha3_simd_portable_squeeze_13_5b(&s, out, last, outlen - last);
}
}
}
/**
-A monomorphic instance of libcrux_sha3.portable.keccakx1
+ A portable SHA3 256 implementation.
+*/
+static KRML_MUSTINLINE void libcrux_sha3_portable_sha256(Eurydice_slice digest,
+ Eurydice_slice data) {
+ libcrux_sha3_generic_keccak_portable_keccak1_ad(data, digest);
+}
+
+/**
+A monomorphic instance of libcrux_sha3.simd.portable.load_last
with const generics
- RATE= 136
-- DELIM= 6
+- DELIMITER= 31
*/
-static KRML_MUSTINLINE void libcrux_sha3_portable_keccakx1_ce0(
- Eurydice_slice data[1U], Eurydice_slice out[1U]) {
- /* Passing arrays by value in Rust generates a copy in C */
- Eurydice_slice copy_of_data[1U];
- memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice));
- libcrux_sha3_generic_keccak_keccak_e90(copy_of_data, out);
+static KRML_MUSTINLINE void libcrux_sha3_simd_portable_load_last_ad0(
+ uint64_t *state, Eurydice_slice blocks, size_t start, size_t len) {
+ uint8_t buffer[136U] = {0U};
+ Eurydice_slice_copy(
+ Eurydice_array_to_subslice3(buffer, (size_t)0U, len, uint8_t *),
+ Eurydice_slice_subslice3(blocks, start, start + len, uint8_t *), uint8_t);
+ buffer[len] = 31U;
+ size_t uu____0 = (size_t)136U - (size_t)1U;
+ buffer[uu____0] = (uint32_t)buffer[uu____0] | 128U;
+ libcrux_sha3_simd_portable_load_block_5b(
+ state, Eurydice_array_to_slice((size_t)136U, buffer, uint8_t),
+ (size_t)0U);
}
/**
- A portable SHA3 256 implementation.
+This function found in impl {libcrux_sha3::traits::Absorb<1usize> for
+libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>,
+libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for
+u64}]}
*/
-static KRML_MUSTINLINE void libcrux_sha3_portable_sha256(Eurydice_slice digest,
- Eurydice_slice data) {
- Eurydice_slice buf0[1U] = {data};
- Eurydice_slice buf[1U] = {digest};
- libcrux_sha3_portable_keccakx1_ce0(buf0, buf);
+/**
+A monomorphic instance of libcrux_sha3.simd.portable.load_last_a1
+with const generics
+- RATE= 136
+- DELIMITER= 31
+*/
+static inline void libcrux_sha3_simd_portable_load_last_a1_ad0(
+ libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *input,
+ size_t start, size_t len) {
+ libcrux_sha3_simd_portable_load_last_ad0(self->st, input[0U], start, len);
}
/**
-A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final
+This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T,
+N>[TraitClause@0, TraitClause@1]}
+*/
+/**
+A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final_80
with types uint64_t
with const generics
- N= 1
- RATE= 136
- DELIM= 31
*/
-static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_c71(
- libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice last[1U]) {
- size_t last_len = Eurydice_slice_len(last[0U], uint8_t);
- uint8_t blocks[1U][200U] = {{0U}};
- for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
- size_t i0 = i;
- if (last_len > (size_t)0U) {
- Eurydice_slice uu____0 = Eurydice_array_to_subslice2(
- blocks[i0], (size_t)0U, last_len, uint8_t);
- Eurydice_slice_copy(uu____0, last[i0], uint8_t);
- }
- blocks[i0][last_len] = 31U;
- size_t uu____1 = i0;
- size_t uu____2 = (size_t)136U - (size_t)1U;
- blocks[uu____1][uu____2] = (uint32_t)blocks[uu____1][uu____2] | 128U;
- }
- uint64_t(*uu____3)[5U] = s->st;
- uint8_t uu____4[1U][200U];
- memcpy(uu____4, blocks, (size_t)1U * sizeof(uint8_t[200U]));
- libcrux_sha3_portable_keccak_load_block_full_5a_d20(uu____3, uu____4);
- libcrux_sha3_generic_keccak_keccakf1600_21(s);
+static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_80_9e1(
+ libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *last,
+ size_t start, size_t len) {
+ libcrux_sha3_simd_portable_load_last_a1_ad0(self, last, start, len);
+ libcrux_sha3_generic_keccak_keccakf1600_80_04(self);
}
/**
-A monomorphic instance of libcrux_sha3.generic_keccak.keccak
-with types uint64_t
+A monomorphic instance of libcrux_sha3.generic_keccak.portable.keccak1
with const generics
-- N= 1
- RATE= 136
- DELIM= 31
*/
-static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_keccak_e91(
- Eurydice_slice data[1U], Eurydice_slice out[1U]) {
- libcrux_sha3_generic_keccak_KeccakState_48 s =
- libcrux_sha3_generic_keccak_new_1e_f4();
- for (size_t i = (size_t)0U;
- i < Eurydice_slice_len(data[0U], uint8_t) / (size_t)136U; i++) {
+static inline void libcrux_sha3_generic_keccak_portable_keccak1_ad0(
+ Eurydice_slice data, Eurydice_slice out) {
+ libcrux_sha3_generic_keccak_KeccakState_17 s =
+ libcrux_sha3_generic_keccak_new_80_04();
+ size_t data_len = Eurydice_slice_len(data, uint8_t);
+ for (size_t i = (size_t)0U; i < data_len / (size_t)136U; i++) {
size_t i0 = i;
- libcrux_sha3_generic_keccak_KeccakState_48 *uu____0 = &s;
- /* Passing arrays by value in Rust generates a copy in C */
- Eurydice_slice copy_of_data[1U];
- memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice));
- Eurydice_slice ret[1U];
- libcrux_sha3_portable_keccak_slice_n_5a(copy_of_data, i0 * (size_t)136U,
- (size_t)136U, ret);
- libcrux_sha3_generic_keccak_absorb_block_df0(uu____0, ret);
+ Eurydice_slice buf[1U] = {data};
+ libcrux_sha3_generic_keccak_absorb_block_80_c60(&s, buf, i0 * (size_t)136U);
}
- size_t rem = Eurydice_slice_len(data[0U], uint8_t) % (size_t)136U;
- libcrux_sha3_generic_keccak_KeccakState_48 *uu____2 = &s;
- /* Passing arrays by value in Rust generates a copy in C */
- Eurydice_slice copy_of_data[1U];
- memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice));
- Eurydice_slice ret[1U];
- libcrux_sha3_portable_keccak_slice_n_5a(
- copy_of_data, Eurydice_slice_len(data[0U], uint8_t) - rem, rem, ret);
- libcrux_sha3_generic_keccak_absorb_final_c71(uu____2, ret);
- size_t outlen = Eurydice_slice_len(out[0U], uint8_t);
+ size_t rem = data_len % (size_t)136U;
+ Eurydice_slice buf[1U] = {data};
+ libcrux_sha3_generic_keccak_absorb_final_80_9e1(&s, buf, data_len - rem, rem);
+ size_t outlen = Eurydice_slice_len(out, uint8_t);
size_t blocks = outlen / (size_t)136U;
size_t last = outlen - outlen % (size_t)136U;
if (blocks == (size_t)0U) {
- libcrux_sha3_generic_keccak_squeeze_first_and_last_c50(&s, out);
+ libcrux_sha3_simd_portable_squeeze_13_5b(&s, out, (size_t)0U, outlen);
} else {
- Eurydice_slice_uint8_t_1size_t__x2 uu____4 =
- libcrux_sha3_portable_keccak_split_at_mut_n_5a(out, (size_t)136U);
- Eurydice_slice o0[1U];
- memcpy(o0, uu____4.fst, (size_t)1U * sizeof(Eurydice_slice));
- Eurydice_slice o1[1U];
- memcpy(o1, uu____4.snd, (size_t)1U * sizeof(Eurydice_slice));
- libcrux_sha3_generic_keccak_squeeze_first_block_840(&s, o0);
- core_ops_range_Range_b3 iter =
- core_iter_traits_collect___core__iter__traits__collect__IntoIterator_for_I__1__into_iter(
- (CLITERAL(core_ops_range_Range_b3){.start = (size_t)1U,
- .end = blocks}),
- core_ops_range_Range_b3, core_ops_range_Range_b3);
- while (true) {
- if (core_iter_range___core__iter__traits__iterator__Iterator_for_core__ops__range__Range_A___6__next(
- &iter, size_t, Option_b3)
- .tag == None) {
- break;
- } else {
- Eurydice_slice_uint8_t_1size_t__x2 uu____5 =
- libcrux_sha3_portable_keccak_split_at_mut_n_5a(o1, (size_t)136U);
- Eurydice_slice o[1U];
- memcpy(o, uu____5.fst, (size_t)1U * sizeof(Eurydice_slice));
- Eurydice_slice orest[1U];
- memcpy(orest, uu____5.snd, (size_t)1U * sizeof(Eurydice_slice));
- libcrux_sha3_generic_keccak_squeeze_next_block_fc0(&s, o);
- memcpy(o1, orest, (size_t)1U * sizeof(Eurydice_slice));
- }
+ libcrux_sha3_simd_portable_squeeze_13_5b(&s, out, (size_t)0U, (size_t)136U);
+ for (size_t i = (size_t)1U; i < blocks; i++) {
+ size_t i0 = i;
+ libcrux_sha3_generic_keccak_keccakf1600_80_04(&s);
+ libcrux_sha3_simd_portable_squeeze_13_5b(&s, out, i0 * (size_t)136U,
+ (size_t)136U);
}
if (last < outlen) {
- libcrux_sha3_generic_keccak_squeeze_last_cf0(s, o1);
+ libcrux_sha3_generic_keccak_keccakf1600_80_04(&s);
+ libcrux_sha3_simd_portable_squeeze_13_5b(&s, out, last, outlen - last);
}
}
}
/**
-A monomorphic instance of libcrux_sha3.portable.keccakx1
-with const generics
-- RATE= 136
-- DELIM= 31
-*/
-static KRML_MUSTINLINE void libcrux_sha3_portable_keccakx1_ce1(
- Eurydice_slice data[1U], Eurydice_slice out[1U]) {
- /* Passing arrays by value in Rust generates a copy in C */
- Eurydice_slice copy_of_data[1U];
- memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice));
- libcrux_sha3_generic_keccak_keccak_e91(copy_of_data, out);
-}
-
-/**
A portable SHAKE256 implementation.
*/
static KRML_MUSTINLINE void libcrux_sha3_portable_shake256(
Eurydice_slice digest, Eurydice_slice data) {
- Eurydice_slice buf0[1U] = {data};
- Eurydice_slice buf[1U] = {digest};
- libcrux_sha3_portable_keccakx1_ce1(buf0, buf);
+ libcrux_sha3_generic_keccak_portable_keccak1_ad0(data, digest);
}
-typedef libcrux_sha3_generic_keccak_KeccakState_48
+typedef libcrux_sha3_generic_keccak_KeccakState_17
libcrux_sha3_portable_KeccakState;
/**
Create a new SHAKE-128 state object.
*/
-static KRML_MUSTINLINE libcrux_sha3_generic_keccak_KeccakState_48
+static KRML_MUSTINLINE libcrux_sha3_generic_keccak_KeccakState_17
libcrux_sha3_portable_incremental_shake128_init(void) {
- return libcrux_sha3_generic_keccak_new_1e_f4();
+ return libcrux_sha3_generic_keccak_new_80_04();
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.load_block
+A monomorphic instance of libcrux_sha3.simd.portable.load_block
with const generics
- RATE= 168
*/
-static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_2c1(
- uint64_t (*s)[5U], Eurydice_slice blocks[1U]) {
+static KRML_MUSTINLINE void libcrux_sha3_simd_portable_load_block_3a(
+ uint64_t *state, Eurydice_slice blocks, size_t start) {
+ uint64_t state_flat[25U] = {0U};
for (size_t i = (size_t)0U; i < (size_t)168U / (size_t)8U; i++) {
size_t i0 = i;
+ size_t offset = start + (size_t)8U * i0;
uint8_t uu____0[8U];
- Result_56 dst;
+ Result_15 dst;
Eurydice_slice_to_array2(
&dst,
- Eurydice_slice_subslice2(blocks[0U], (size_t)8U * i0,
- (size_t)8U * i0 + (size_t)8U, uint8_t),
- Eurydice_slice, uint8_t[8U]);
- unwrap_41_ac(dst, uu____0);
- size_t uu____1 = i0 / (size_t)5U;
- size_t uu____2 = i0 % (size_t)5U;
- s[uu____1][uu____2] =
- s[uu____1][uu____2] ^ core_num__u64_9__from_le_bytes(uu____0);
+ Eurydice_slice_subslice3(blocks, offset, offset + (size_t)8U,
+ uint8_t *),
+ Eurydice_slice, uint8_t[8U], TryFromSliceError);
+ unwrap_26_68(dst, uu____0);
+ state_flat[i0] = core_num__u64__from_le_bytes(uu____0);
+ }
+ for (size_t i = (size_t)0U; i < (size_t)168U / (size_t)8U; i++) {
+ size_t i0 = i;
+ libcrux_sha3_traits_set_ij_04(
+ state, i0 / (size_t)5U, i0 % (size_t)5U,
+ libcrux_sha3_traits_get_ij_04(state, i0 / (size_t)5U,
+ i0 % (size_t)5U)[0U] ^
+ state_flat[i0]);
}
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.load_block_full
+A monomorphic instance of libcrux_sha3.simd.portable.load_last
with const generics
- RATE= 168
+- DELIMITER= 31
*/
-static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_full_df1(
- uint64_t (*s)[5U], uint8_t blocks[1U][200U]) {
- Eurydice_slice buf[1U] = {
- Eurydice_array_to_slice((size_t)200U, blocks[0U], uint8_t)};
- libcrux_sha3_portable_keccak_load_block_2c1(s, buf);
+static KRML_MUSTINLINE void libcrux_sha3_simd_portable_load_last_c6(
+ uint64_t *state, Eurydice_slice blocks, size_t start, size_t len) {
+ uint8_t buffer[168U] = {0U};
+ Eurydice_slice_copy(
+ Eurydice_array_to_subslice3(buffer, (size_t)0U, len, uint8_t *),
+ Eurydice_slice_subslice3(blocks, start, start + len, uint8_t *), uint8_t);
+ buffer[len] = 31U;
+ size_t uu____0 = (size_t)168U - (size_t)1U;
+ buffer[uu____0] = (uint32_t)buffer[uu____0] | 128U;
+ libcrux_sha3_simd_portable_load_block_3a(
+ state, Eurydice_array_to_slice((size_t)168U, buffer, uint8_t),
+ (size_t)0U);
}
/**
-This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
-usize> for u64)}
+This function found in impl {libcrux_sha3::traits::Absorb<1usize> for
+libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>,
+libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for
+u64}]}
*/
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.load_block_full_5a
+A monomorphic instance of libcrux_sha3.simd.portable.load_last_a1
with const generics
- RATE= 168
+- DELIMITER= 31
*/
-static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_full_5a_d21(
- uint64_t (*a)[5U], uint8_t b[1U][200U]) {
- uint64_t(*uu____0)[5U] = a;
- /* Passing arrays by value in Rust generates a copy in C */
- uint8_t copy_of_b[1U][200U];
- memcpy(copy_of_b, b, (size_t)1U * sizeof(uint8_t[200U]));
- libcrux_sha3_portable_keccak_load_block_full_df1(uu____0, copy_of_b);
+static inline void libcrux_sha3_simd_portable_load_last_a1_c6(
+ libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *input,
+ size_t start, size_t len) {
+ libcrux_sha3_simd_portable_load_last_c6(self->st, input[0U], start, len);
}
/**
-A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final
+This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T,
+N>[TraitClause@0, TraitClause@1]}
+*/
+/**
+A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final_80
with types uint64_t
with const generics
- N= 1
- RATE= 168
- DELIM= 31
*/
-static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_c72(
- libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice last[1U]) {
- size_t last_len = Eurydice_slice_len(last[0U], uint8_t);
- uint8_t blocks[1U][200U] = {{0U}};
- for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
- size_t i0 = i;
- if (last_len > (size_t)0U) {
- Eurydice_slice uu____0 = Eurydice_array_to_subslice2(
- blocks[i0], (size_t)0U, last_len, uint8_t);
- Eurydice_slice_copy(uu____0, last[i0], uint8_t);
- }
- blocks[i0][last_len] = 31U;
- size_t uu____1 = i0;
- size_t uu____2 = (size_t)168U - (size_t)1U;
- blocks[uu____1][uu____2] = (uint32_t)blocks[uu____1][uu____2] | 128U;
- }
- uint64_t(*uu____3)[5U] = s->st;
- uint8_t uu____4[1U][200U];
- memcpy(uu____4, blocks, (size_t)1U * sizeof(uint8_t[200U]));
- libcrux_sha3_portable_keccak_load_block_full_5a_d21(uu____3, uu____4);
- libcrux_sha3_generic_keccak_keccakf1600_21(s);
+static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_80_9e2(
+ libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *last,
+ size_t start, size_t len) {
+ libcrux_sha3_simd_portable_load_last_a1_c6(self, last, start, len);
+ libcrux_sha3_generic_keccak_keccakf1600_80_04(self);
}
/**
@@ -3124,143 +3866,160 @@ static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_c72(
*/
static KRML_MUSTINLINE void
libcrux_sha3_portable_incremental_shake128_absorb_final(
- libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice data0) {
- Eurydice_slice buf[1U] = {data0};
- libcrux_sha3_generic_keccak_absorb_final_c72(s, buf);
+ libcrux_sha3_generic_keccak_KeccakState_17 *s, Eurydice_slice data0) {
+ libcrux_sha3_generic_keccak_KeccakState_17 *uu____0 = s;
+ Eurydice_slice uu____1[1U] = {data0};
+ libcrux_sha3_generic_keccak_absorb_final_80_9e2(
+ uu____0, uu____1, (size_t)0U, Eurydice_slice_len(data0, uint8_t));
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.store_block
+A monomorphic instance of libcrux_sha3.simd.portable.store_block
with const generics
- RATE= 168
*/
-static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_581(
- uint64_t (*s)[5U], Eurydice_slice out[1U]) {
- for (size_t i = (size_t)0U; i < (size_t)168U / (size_t)8U; i++) {
+static KRML_MUSTINLINE void libcrux_sha3_simd_portable_store_block_3a(
+ uint64_t *s, Eurydice_slice out, size_t start, size_t len) {
+ size_t octets = len / (size_t)8U;
+ for (size_t i = (size_t)0U; i < octets; i++) {
size_t i0 = i;
- Eurydice_slice uu____0 = Eurydice_slice_subslice2(
- out[0U], (size_t)8U * i0, (size_t)8U * i0 + (size_t)8U, uint8_t);
+ Eurydice_slice uu____0 = Eurydice_slice_subslice3(
+ out, start + (size_t)8U * i0, start + (size_t)8U * i0 + (size_t)8U,
+ uint8_t *);
uint8_t ret[8U];
- core_num__u64_9__to_le_bytes(s[i0 / (size_t)5U][i0 % (size_t)5U], ret);
+ core_num__u64__to_le_bytes(
+ libcrux_sha3_traits_get_ij_04(s, i0 / (size_t)5U, i0 % (size_t)5U)[0U],
+ ret);
Eurydice_slice_copy(
uu____0, Eurydice_array_to_slice((size_t)8U, ret, uint8_t), uint8_t);
}
+ size_t remaining = len % (size_t)8U;
+ if (remaining > (size_t)0U) {
+ Eurydice_slice uu____1 = Eurydice_slice_subslice3(
+ out, start + len - remaining, start + len, uint8_t *);
+ uint8_t ret[8U];
+ core_num__u64__to_le_bytes(
+ libcrux_sha3_traits_get_ij_04(s, octets / (size_t)5U,
+ octets % (size_t)5U)[0U],
+ ret);
+ Eurydice_slice_copy(
+ uu____1,
+ Eurydice_array_to_subslice3(ret, (size_t)0U, remaining, uint8_t *),
+ uint8_t);
+ }
}
/**
-This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
-usize> for u64)}
+This function found in impl {libcrux_sha3::traits::Squeeze1<u64> for
+libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>,
+libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for
+u64}]}
*/
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.store_block_5a
+A monomorphic instance of libcrux_sha3.simd.portable.squeeze_13
with const generics
- RATE= 168
*/
-static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_5a_591(
- uint64_t (*a)[5U], Eurydice_slice b[1U]) {
- libcrux_sha3_portable_keccak_store_block_581(a, b);
+static inline void libcrux_sha3_simd_portable_squeeze_13_3a(
+ libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice out,
+ size_t start, size_t len) {
+ libcrux_sha3_simd_portable_store_block_3a(self->st, out, start, len);
}
/**
-A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_next_block
-with types uint64_t
-with const generics
-- N= 1
+This function found in impl {libcrux_sha3::generic_keccak::KeccakState<u64,
+1usize>[core::marker::Sized<u64>,
+libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for
+u64}]}
+*/
+/**
+A monomorphic instance of
+libcrux_sha3.generic_keccak.portable.squeeze_first_three_blocks_b4 with const
+generics
- RATE= 168
*/
-static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_next_block_fc1(
- libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) {
- libcrux_sha3_generic_keccak_keccakf1600_21(s);
- libcrux_sha3_portable_keccak_store_block_5a_591(s->st, out);
+static KRML_MUSTINLINE void
+libcrux_sha3_generic_keccak_portable_squeeze_first_three_blocks_b4_3a(
+ libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice out) {
+ libcrux_sha3_simd_portable_squeeze_13_3a(self, out, (size_t)0U, (size_t)168U);
+ libcrux_sha3_generic_keccak_keccakf1600_80_04(self);
+ libcrux_sha3_simd_portable_squeeze_13_3a(self, out, (size_t)168U,
+ (size_t)168U);
+ libcrux_sha3_generic_keccak_keccakf1600_80_04(self);
+ libcrux_sha3_simd_portable_squeeze_13_3a(self, out, (size_t)2U * (size_t)168U,
+ (size_t)168U);
}
/**
- Squeeze another block
+ Squeeze three blocks
*/
static KRML_MUSTINLINE void
-libcrux_sha3_portable_incremental_shake128_squeeze_next_block(
- libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out0) {
- Eurydice_slice buf[1U] = {out0};
- libcrux_sha3_generic_keccak_squeeze_next_block_fc1(s, buf);
+libcrux_sha3_portable_incremental_shake128_squeeze_first_three_blocks(
+ libcrux_sha3_generic_keccak_KeccakState_17 *s, Eurydice_slice out0) {
+ libcrux_sha3_generic_keccak_portable_squeeze_first_three_blocks_b4_3a(s,
+ out0);
}
/**
-A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_first_block
-with types uint64_t
-with const generics
-- N= 1
-- RATE= 168
+This function found in impl {libcrux_sha3::generic_keccak::KeccakState<u64,
+1usize>[core::marker::Sized<u64>,
+libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for
+u64}]}
*/
-static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_first_block_841(
- libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) {
- libcrux_sha3_portable_keccak_store_block_5a_591(s->st, out);
-}
-
/**
-A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_first_three_blocks
-with types uint64_t
-with const generics
-- N= 1
+A monomorphic instance of
+libcrux_sha3.generic_keccak.portable.squeeze_next_block_b4 with const generics
- RATE= 168
*/
static KRML_MUSTINLINE void
-libcrux_sha3_generic_keccak_squeeze_first_three_blocks_cc(
- libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) {
- Eurydice_slice_uint8_t_1size_t__x2 uu____0 =
- libcrux_sha3_portable_keccak_split_at_mut_n_5a(out, (size_t)168U);
- Eurydice_slice o0[1U];
- memcpy(o0, uu____0.fst, (size_t)1U * sizeof(Eurydice_slice));
- Eurydice_slice o10[1U];
- memcpy(o10, uu____0.snd, (size_t)1U * sizeof(Eurydice_slice));
- libcrux_sha3_generic_keccak_squeeze_first_block_841(s, o0);
- Eurydice_slice_uint8_t_1size_t__x2 uu____1 =
- libcrux_sha3_portable_keccak_split_at_mut_n_5a(o10, (size_t)168U);
- Eurydice_slice o1[1U];
- memcpy(o1, uu____1.fst, (size_t)1U * sizeof(Eurydice_slice));
- Eurydice_slice o2[1U];
- memcpy(o2, uu____1.snd, (size_t)1U * sizeof(Eurydice_slice));
- libcrux_sha3_generic_keccak_squeeze_next_block_fc1(s, o1);
- libcrux_sha3_generic_keccak_squeeze_next_block_fc1(s, o2);
+libcrux_sha3_generic_keccak_portable_squeeze_next_block_b4_3a(
+ libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice out,
+ size_t start) {
+ libcrux_sha3_generic_keccak_keccakf1600_80_04(self);
+ libcrux_sha3_simd_portable_squeeze_13_3a(self, out, start, (size_t)168U);
}
/**
- Squeeze three blocks
+ Squeeze another block
*/
static KRML_MUSTINLINE void
-libcrux_sha3_portable_incremental_shake128_squeeze_first_three_blocks(
- libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out0) {
- Eurydice_slice buf[1U] = {out0};
- libcrux_sha3_generic_keccak_squeeze_first_three_blocks_cc(s, buf);
+libcrux_sha3_portable_incremental_shake128_squeeze_next_block(
+ libcrux_sha3_generic_keccak_KeccakState_17 *s, Eurydice_slice out0) {
+ libcrux_sha3_generic_keccak_portable_squeeze_next_block_b4_3a(s, out0,
+ (size_t)0U);
}
-#define libcrux_sha3_Sha224 0
-#define libcrux_sha3_Sha256 1
-#define libcrux_sha3_Sha384 2
-#define libcrux_sha3_Sha512 3
+#define libcrux_sha3_Algorithm_Sha224 1
+#define libcrux_sha3_Algorithm_Sha256 2
+#define libcrux_sha3_Algorithm_Sha384 3
+#define libcrux_sha3_Algorithm_Sha512 4
typedef uint8_t libcrux_sha3_Algorithm;
+typedef uint8_t libcrux_sha3_Sha3_224Digest[28U];
+
+typedef uint8_t libcrux_sha3_Sha3_256Digest[32U];
+
+typedef uint8_t libcrux_sha3_Sha3_384Digest[48U];
+
+typedef uint8_t libcrux_sha3_Sha3_512Digest[64U];
+
/**
Returns the output size of a digest.
*/
static inline size_t libcrux_sha3_digest_size(libcrux_sha3_Algorithm mode) {
- size_t uu____0;
switch (mode) {
- case libcrux_sha3_Sha224: {
- uu____0 = (size_t)28U;
+ case libcrux_sha3_Algorithm_Sha224: {
break;
}
- case libcrux_sha3_Sha256: {
- uu____0 = (size_t)32U;
- break;
+ case libcrux_sha3_Algorithm_Sha256: {
+ return (size_t)32U;
}
- case libcrux_sha3_Sha384: {
- uu____0 = (size_t)48U;
- break;
+ case libcrux_sha3_Algorithm_Sha384: {
+ return (size_t)48U;
}
- case libcrux_sha3_Sha512: {
- uu____0 = (size_t)64U;
- break;
+ case libcrux_sha3_Algorithm_Sha512: {
+ return (size_t)64U;
}
default: {
KRML_HOST_EPRINTF("KaRaMeL incomplete match at %s:%d\n", __FILE__,
@@ -3268,725 +4027,453 @@ static inline size_t libcrux_sha3_digest_size(libcrux_sha3_Algorithm mode) {
KRML_HOST_EXIT(253U);
}
}
- return uu____0;
+ return (size_t)28U;
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.load_block
+A monomorphic instance of libcrux_sha3.simd.portable.load_block
with const generics
- RATE= 144
*/
-static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_2c2(
- uint64_t (*s)[5U], Eurydice_slice blocks[1U]) {
+static KRML_MUSTINLINE void libcrux_sha3_simd_portable_load_block_2c(
+ uint64_t *state, Eurydice_slice blocks, size_t start) {
+ uint64_t state_flat[25U] = {0U};
for (size_t i = (size_t)0U; i < (size_t)144U / (size_t)8U; i++) {
size_t i0 = i;
+ size_t offset = start + (size_t)8U * i0;
uint8_t uu____0[8U];
- Result_56 dst;
+ Result_15 dst;
Eurydice_slice_to_array2(
&dst,
- Eurydice_slice_subslice2(blocks[0U], (size_t)8U * i0,
- (size_t)8U * i0 + (size_t)8U, uint8_t),
- Eurydice_slice, uint8_t[8U]);
- unwrap_41_ac(dst, uu____0);
- size_t uu____1 = i0 / (size_t)5U;
- size_t uu____2 = i0 % (size_t)5U;
- s[uu____1][uu____2] =
- s[uu____1][uu____2] ^ core_num__u64_9__from_le_bytes(uu____0);
+ Eurydice_slice_subslice3(blocks, offset, offset + (size_t)8U,
+ uint8_t *),
+ Eurydice_slice, uint8_t[8U], TryFromSliceError);
+ unwrap_26_68(dst, uu____0);
+ state_flat[i0] = core_num__u64__from_le_bytes(uu____0);
+ }
+ for (size_t i = (size_t)0U; i < (size_t)144U / (size_t)8U; i++) {
+ size_t i0 = i;
+ libcrux_sha3_traits_set_ij_04(
+ state, i0 / (size_t)5U, i0 % (size_t)5U,
+ libcrux_sha3_traits_get_ij_04(state, i0 / (size_t)5U,
+ i0 % (size_t)5U)[0U] ^
+ state_flat[i0]);
}
}
/**
-This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
-usize> for u64)}
+This function found in impl {libcrux_sha3::traits::Absorb<1usize> for
+libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>,
+libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for
+u64}]}
*/
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.load_block_5a
+A monomorphic instance of libcrux_sha3.simd.portable.load_block_a1
with const generics
- RATE= 144
*/
-static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_5a_b81(
- uint64_t (*a)[5U], Eurydice_slice b[1U]) {
- uint64_t(*uu____0)[5U] = a;
- /* Passing arrays by value in Rust generates a copy in C */
- Eurydice_slice copy_of_b[1U];
- memcpy(copy_of_b, b, (size_t)1U * sizeof(Eurydice_slice));
- libcrux_sha3_portable_keccak_load_block_2c2(uu____0, copy_of_b);
+static inline void libcrux_sha3_simd_portable_load_block_a1_2c(
+ libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *input,
+ size_t start) {
+ libcrux_sha3_simd_portable_load_block_2c(self->st, input[0U], start);
}
/**
-A monomorphic instance of libcrux_sha3.generic_keccak.absorb_block
+This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T,
+N>[TraitClause@0, TraitClause@1]}
+*/
+/**
+A monomorphic instance of libcrux_sha3.generic_keccak.absorb_block_80
with types uint64_t
with const generics
- N= 1
- RATE= 144
*/
-static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_block_df1(
- libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice blocks[1U]) {
- uint64_t(*uu____0)[5U] = s->st;
- Eurydice_slice uu____1[1U];
- memcpy(uu____1, blocks, (size_t)1U * sizeof(Eurydice_slice));
- libcrux_sha3_portable_keccak_load_block_5a_b81(uu____0, uu____1);
- libcrux_sha3_generic_keccak_keccakf1600_21(s);
+static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_block_80_c61(
+ libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *blocks,
+ size_t start) {
+ libcrux_sha3_simd_portable_load_block_a1_2c(self, blocks, start);
+ libcrux_sha3_generic_keccak_keccakf1600_80_04(self);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.load_block_full
+A monomorphic instance of libcrux_sha3.simd.portable.load_last
with const generics
- RATE= 144
+- DELIMITER= 6
*/
-static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_full_df2(
- uint64_t (*s)[5U], uint8_t blocks[1U][200U]) {
- Eurydice_slice buf[1U] = {
- Eurydice_array_to_slice((size_t)200U, blocks[0U], uint8_t)};
- libcrux_sha3_portable_keccak_load_block_2c2(s, buf);
+static KRML_MUSTINLINE void libcrux_sha3_simd_portable_load_last_1e(
+ uint64_t *state, Eurydice_slice blocks, size_t start, size_t len) {
+ uint8_t buffer[144U] = {0U};
+ Eurydice_slice_copy(
+ Eurydice_array_to_subslice3(buffer, (size_t)0U, len, uint8_t *),
+ Eurydice_slice_subslice3(blocks, start, start + len, uint8_t *), uint8_t);
+ buffer[len] = 6U;
+ size_t uu____0 = (size_t)144U - (size_t)1U;
+ buffer[uu____0] = (uint32_t)buffer[uu____0] | 128U;
+ libcrux_sha3_simd_portable_load_block_2c(
+ state, Eurydice_array_to_slice((size_t)144U, buffer, uint8_t),
+ (size_t)0U);
}
/**
-This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
-usize> for u64)}
+This function found in impl {libcrux_sha3::traits::Absorb<1usize> for
+libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>,
+libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for
+u64}]}
*/
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.load_block_full_5a
+A monomorphic instance of libcrux_sha3.simd.portable.load_last_a1
with const generics
- RATE= 144
+- DELIMITER= 6
*/
-static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_full_5a_d22(
- uint64_t (*a)[5U], uint8_t b[1U][200U]) {
- uint64_t(*uu____0)[5U] = a;
- /* Passing arrays by value in Rust generates a copy in C */
- uint8_t copy_of_b[1U][200U];
- memcpy(copy_of_b, b, (size_t)1U * sizeof(uint8_t[200U]));
- libcrux_sha3_portable_keccak_load_block_full_df2(uu____0, copy_of_b);
+static inline void libcrux_sha3_simd_portable_load_last_a1_1e(
+ libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *input,
+ size_t start, size_t len) {
+ libcrux_sha3_simd_portable_load_last_1e(self->st, input[0U], start, len);
}
/**
-A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final
+This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T,
+N>[TraitClause@0, TraitClause@1]}
+*/
+/**
+A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final_80
with types uint64_t
with const generics
- N= 1
- RATE= 144
- DELIM= 6
*/
-static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_c73(
- libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice last[1U]) {
- size_t last_len = Eurydice_slice_len(last[0U], uint8_t);
- uint8_t blocks[1U][200U] = {{0U}};
- for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
- size_t i0 = i;
- if (last_len > (size_t)0U) {
- Eurydice_slice uu____0 = Eurydice_array_to_subslice2(
- blocks[i0], (size_t)0U, last_len, uint8_t);
- Eurydice_slice_copy(uu____0, last[i0], uint8_t);
- }
- blocks[i0][last_len] = 6U;
- size_t uu____1 = i0;
- size_t uu____2 = (size_t)144U - (size_t)1U;
- blocks[uu____1][uu____2] = (uint32_t)blocks[uu____1][uu____2] | 128U;
- }
- uint64_t(*uu____3)[5U] = s->st;
- uint8_t uu____4[1U][200U];
- memcpy(uu____4, blocks, (size_t)1U * sizeof(uint8_t[200U]));
- libcrux_sha3_portable_keccak_load_block_full_5a_d22(uu____3, uu____4);
- libcrux_sha3_generic_keccak_keccakf1600_21(s);
+static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_80_9e3(
+ libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *last,
+ size_t start, size_t len) {
+ libcrux_sha3_simd_portable_load_last_a1_1e(self, last, start, len);
+ libcrux_sha3_generic_keccak_keccakf1600_80_04(self);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.store_block
+A monomorphic instance of libcrux_sha3.simd.portable.store_block
with const generics
- RATE= 144
*/
-static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_582(
- uint64_t (*s)[5U], Eurydice_slice out[1U]) {
- for (size_t i = (size_t)0U; i < (size_t)144U / (size_t)8U; i++) {
+static KRML_MUSTINLINE void libcrux_sha3_simd_portable_store_block_2c(
+ uint64_t *s, Eurydice_slice out, size_t start, size_t len) {
+ size_t octets = len / (size_t)8U;
+ for (size_t i = (size_t)0U; i < octets; i++) {
size_t i0 = i;
- Eurydice_slice uu____0 = Eurydice_slice_subslice2(
- out[0U], (size_t)8U * i0, (size_t)8U * i0 + (size_t)8U, uint8_t);
+ Eurydice_slice uu____0 = Eurydice_slice_subslice3(
+ out, start + (size_t)8U * i0, start + (size_t)8U * i0 + (size_t)8U,
+ uint8_t *);
uint8_t ret[8U];
- core_num__u64_9__to_le_bytes(s[i0 / (size_t)5U][i0 % (size_t)5U], ret);
+ core_num__u64__to_le_bytes(
+ libcrux_sha3_traits_get_ij_04(s, i0 / (size_t)5U, i0 % (size_t)5U)[0U],
+ ret);
Eurydice_slice_copy(
uu____0, Eurydice_array_to_slice((size_t)8U, ret, uint8_t), uint8_t);
}
-}
-
-/**
-A monomorphic instance of libcrux_sha3.portable_keccak.store_block_full
-with const generics
-- RATE= 144
-*/
-static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_full_2d1(
- uint64_t (*s)[5U], uint8_t ret[1U][200U]) {
- uint8_t out[200U] = {0U};
- Eurydice_slice buf[1U] = {
- Eurydice_array_to_slice((size_t)200U, out, uint8_t)};
- libcrux_sha3_portable_keccak_store_block_582(s, buf);
- /* Passing arrays by value in Rust generates a copy in C */
- uint8_t copy_of_out[200U];
- memcpy(copy_of_out, out, (size_t)200U * sizeof(uint8_t));
- memcpy(ret[0U], copy_of_out, (size_t)200U * sizeof(uint8_t));
-}
-
-/**
-This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
-usize> for u64)}
-*/
-/**
-A monomorphic instance of libcrux_sha3.portable_keccak.store_block_full_5a
-with const generics
-- RATE= 144
-*/
-static KRML_MUSTINLINE void
-libcrux_sha3_portable_keccak_store_block_full_5a_291(uint64_t (*a)[5U],
- uint8_t ret[1U][200U]) {
- libcrux_sha3_portable_keccak_store_block_full_2d1(a, ret);
-}
-
-/**
-A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_first_and_last
-with types uint64_t
-with const generics
-- N= 1
-- RATE= 144
-*/
-static KRML_MUSTINLINE void
-libcrux_sha3_generic_keccak_squeeze_first_and_last_c51(
- libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) {
- uint8_t b[1U][200U];
- libcrux_sha3_portable_keccak_store_block_full_5a_291(s->st, b);
- for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
- size_t i0 = i;
- Eurydice_slice uu____0 = out[i0];
- uint8_t *uu____1 = b[i0];
- core_ops_range_Range_b3 lit;
- lit.start = (size_t)0U;
- lit.end = Eurydice_slice_len(out[i0], uint8_t);
+ size_t remaining = len % (size_t)8U;
+ if (remaining > (size_t)0U) {
+ Eurydice_slice uu____1 = Eurydice_slice_subslice3(
+ out, start + len - remaining, start + len, uint8_t *);
+ uint8_t ret[8U];
+ core_num__u64__to_le_bytes(
+ libcrux_sha3_traits_get_ij_04(s, octets / (size_t)5U,
+ octets % (size_t)5U)[0U],
+ ret);
Eurydice_slice_copy(
- uu____0,
- Eurydice_array_to_subslice((size_t)200U, uu____1, lit, uint8_t,
- core_ops_range_Range_b3),
+ uu____1,
+ Eurydice_array_to_subslice3(ret, (size_t)0U, remaining, uint8_t *),
uint8_t);
}
}
/**
-This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
-usize> for u64)}
-*/
-/**
-A monomorphic instance of libcrux_sha3.portable_keccak.store_block_5a
-with const generics
-- RATE= 144
-*/
-static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_5a_592(
- uint64_t (*a)[5U], Eurydice_slice b[1U]) {
- libcrux_sha3_portable_keccak_store_block_582(a, b);
-}
-
-/**
-A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_first_block
-with types uint64_t
-with const generics
-- N= 1
-- RATE= 144
+This function found in impl {libcrux_sha3::traits::Squeeze1<u64> for
+libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>,
+libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for
+u64}]}
*/
-static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_first_block_842(
- libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) {
- libcrux_sha3_portable_keccak_store_block_5a_592(s->st, out);
-}
-
/**
-A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_next_block
-with types uint64_t
+A monomorphic instance of libcrux_sha3.simd.portable.squeeze_13
with const generics
-- N= 1
- RATE= 144
*/
-static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_next_block_fc2(
- libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) {
- libcrux_sha3_generic_keccak_keccakf1600_21(s);
- libcrux_sha3_portable_keccak_store_block_5a_592(s->st, out);
+static inline void libcrux_sha3_simd_portable_squeeze_13_2c(
+ libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice out,
+ size_t start, size_t len) {
+ libcrux_sha3_simd_portable_store_block_2c(self->st, out, start, len);
}
/**
-A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_last
-with types uint64_t
+A monomorphic instance of libcrux_sha3.generic_keccak.portable.keccak1
with const generics
-- N= 1
-- RATE= 144
-*/
-static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_last_cf1(
- libcrux_sha3_generic_keccak_KeccakState_48 s, Eurydice_slice out[1U]) {
- libcrux_sha3_generic_keccak_keccakf1600_21(&s);
- uint8_t b[1U][200U];
- libcrux_sha3_portable_keccak_store_block_full_5a_291(s.st, b);
- for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
- size_t i0 = i;
- Eurydice_slice uu____0 = out[i0];
- uint8_t *uu____1 = b[i0];
- core_ops_range_Range_b3 lit;
- lit.start = (size_t)0U;
- lit.end = Eurydice_slice_len(out[i0], uint8_t);
- Eurydice_slice_copy(
- uu____0,
- Eurydice_array_to_subslice((size_t)200U, uu____1, lit, uint8_t,
- core_ops_range_Range_b3),
- uint8_t);
- }
-}
-
-/**
-A monomorphic instance of libcrux_sha3.generic_keccak.keccak
-with types uint64_t
-with const generics
-- N= 1
- RATE= 144
- DELIM= 6
*/
-static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_keccak_e92(
- Eurydice_slice data[1U], Eurydice_slice out[1U]) {
- libcrux_sha3_generic_keccak_KeccakState_48 s =
- libcrux_sha3_generic_keccak_new_1e_f4();
- for (size_t i = (size_t)0U;
- i < Eurydice_slice_len(data[0U], uint8_t) / (size_t)144U; i++) {
+static inline void libcrux_sha3_generic_keccak_portable_keccak1_1e(
+ Eurydice_slice data, Eurydice_slice out) {
+ libcrux_sha3_generic_keccak_KeccakState_17 s =
+ libcrux_sha3_generic_keccak_new_80_04();
+ size_t data_len = Eurydice_slice_len(data, uint8_t);
+ for (size_t i = (size_t)0U; i < data_len / (size_t)144U; i++) {
size_t i0 = i;
- libcrux_sha3_generic_keccak_KeccakState_48 *uu____0 = &s;
- /* Passing arrays by value in Rust generates a copy in C */
- Eurydice_slice copy_of_data[1U];
- memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice));
- Eurydice_slice ret[1U];
- libcrux_sha3_portable_keccak_slice_n_5a(copy_of_data, i0 * (size_t)144U,
- (size_t)144U, ret);
- libcrux_sha3_generic_keccak_absorb_block_df1(uu____0, ret);
+ Eurydice_slice buf[1U] = {data};
+ libcrux_sha3_generic_keccak_absorb_block_80_c61(&s, buf, i0 * (size_t)144U);
}
- size_t rem = Eurydice_slice_len(data[0U], uint8_t) % (size_t)144U;
- libcrux_sha3_generic_keccak_KeccakState_48 *uu____2 = &s;
- /* Passing arrays by value in Rust generates a copy in C */
- Eurydice_slice copy_of_data[1U];
- memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice));
- Eurydice_slice ret[1U];
- libcrux_sha3_portable_keccak_slice_n_5a(
- copy_of_data, Eurydice_slice_len(data[0U], uint8_t) - rem, rem, ret);
- libcrux_sha3_generic_keccak_absorb_final_c73(uu____2, ret);
- size_t outlen = Eurydice_slice_len(out[0U], uint8_t);
+ size_t rem = data_len % (size_t)144U;
+ Eurydice_slice buf[1U] = {data};
+ libcrux_sha3_generic_keccak_absorb_final_80_9e3(&s, buf, data_len - rem, rem);
+ size_t outlen = Eurydice_slice_len(out, uint8_t);
size_t blocks = outlen / (size_t)144U;
size_t last = outlen - outlen % (size_t)144U;
if (blocks == (size_t)0U) {
- libcrux_sha3_generic_keccak_squeeze_first_and_last_c51(&s, out);
+ libcrux_sha3_simd_portable_squeeze_13_2c(&s, out, (size_t)0U, outlen);
} else {
- Eurydice_slice_uint8_t_1size_t__x2 uu____4 =
- libcrux_sha3_portable_keccak_split_at_mut_n_5a(out, (size_t)144U);
- Eurydice_slice o0[1U];
- memcpy(o0, uu____4.fst, (size_t)1U * sizeof(Eurydice_slice));
- Eurydice_slice o1[1U];
- memcpy(o1, uu____4.snd, (size_t)1U * sizeof(Eurydice_slice));
- libcrux_sha3_generic_keccak_squeeze_first_block_842(&s, o0);
- core_ops_range_Range_b3 iter =
- core_iter_traits_collect___core__iter__traits__collect__IntoIterator_for_I__1__into_iter(
- (CLITERAL(core_ops_range_Range_b3){.start = (size_t)1U,
- .end = blocks}),
- core_ops_range_Range_b3, core_ops_range_Range_b3);
- while (true) {
- if (core_iter_range___core__iter__traits__iterator__Iterator_for_core__ops__range__Range_A___6__next(
- &iter, size_t, Option_b3)
- .tag == None) {
- break;
- } else {
- Eurydice_slice_uint8_t_1size_t__x2 uu____5 =
- libcrux_sha3_portable_keccak_split_at_mut_n_5a(o1, (size_t)144U);
- Eurydice_slice o[1U];
- memcpy(o, uu____5.fst, (size_t)1U * sizeof(Eurydice_slice));
- Eurydice_slice orest[1U];
- memcpy(orest, uu____5.snd, (size_t)1U * sizeof(Eurydice_slice));
- libcrux_sha3_generic_keccak_squeeze_next_block_fc2(&s, o);
- memcpy(o1, orest, (size_t)1U * sizeof(Eurydice_slice));
- }
+ libcrux_sha3_simd_portable_squeeze_13_2c(&s, out, (size_t)0U, (size_t)144U);
+ for (size_t i = (size_t)1U; i < blocks; i++) {
+ size_t i0 = i;
+ libcrux_sha3_generic_keccak_keccakf1600_80_04(&s);
+ libcrux_sha3_simd_portable_squeeze_13_2c(&s, out, i0 * (size_t)144U,
+ (size_t)144U);
}
if (last < outlen) {
- libcrux_sha3_generic_keccak_squeeze_last_cf1(s, o1);
+ libcrux_sha3_generic_keccak_keccakf1600_80_04(&s);
+ libcrux_sha3_simd_portable_squeeze_13_2c(&s, out, last, outlen - last);
}
}
}
/**
-A monomorphic instance of libcrux_sha3.portable.keccakx1
-with const generics
-- RATE= 144
-- DELIM= 6
-*/
-static KRML_MUSTINLINE void libcrux_sha3_portable_keccakx1_ce2(
- Eurydice_slice data[1U], Eurydice_slice out[1U]) {
- /* Passing arrays by value in Rust generates a copy in C */
- Eurydice_slice copy_of_data[1U];
- memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice));
- libcrux_sha3_generic_keccak_keccak_e92(copy_of_data, out);
-}
-
-/**
A portable SHA3 224 implementation.
*/
static KRML_MUSTINLINE void libcrux_sha3_portable_sha224(Eurydice_slice digest,
Eurydice_slice data) {
- Eurydice_slice buf0[1U] = {data};
- Eurydice_slice buf[1U] = {digest};
- libcrux_sha3_portable_keccakx1_ce2(buf0, buf);
+ libcrux_sha3_generic_keccak_portable_keccak1_1e(data, digest);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.load_block
+A monomorphic instance of libcrux_sha3.simd.portable.load_block
with const generics
- RATE= 104
*/
-static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_2c3(
- uint64_t (*s)[5U], Eurydice_slice blocks[1U]) {
+static KRML_MUSTINLINE void libcrux_sha3_simd_portable_load_block_7a(
+ uint64_t *state, Eurydice_slice blocks, size_t start) {
+ uint64_t state_flat[25U] = {0U};
for (size_t i = (size_t)0U; i < (size_t)104U / (size_t)8U; i++) {
size_t i0 = i;
+ size_t offset = start + (size_t)8U * i0;
uint8_t uu____0[8U];
- Result_56 dst;
+ Result_15 dst;
Eurydice_slice_to_array2(
&dst,
- Eurydice_slice_subslice2(blocks[0U], (size_t)8U * i0,
- (size_t)8U * i0 + (size_t)8U, uint8_t),
- Eurydice_slice, uint8_t[8U]);
- unwrap_41_ac(dst, uu____0);
- size_t uu____1 = i0 / (size_t)5U;
- size_t uu____2 = i0 % (size_t)5U;
- s[uu____1][uu____2] =
- s[uu____1][uu____2] ^ core_num__u64_9__from_le_bytes(uu____0);
+ Eurydice_slice_subslice3(blocks, offset, offset + (size_t)8U,
+ uint8_t *),
+ Eurydice_slice, uint8_t[8U], TryFromSliceError);
+ unwrap_26_68(dst, uu____0);
+ state_flat[i0] = core_num__u64__from_le_bytes(uu____0);
+ }
+ for (size_t i = (size_t)0U; i < (size_t)104U / (size_t)8U; i++) {
+ size_t i0 = i;
+ libcrux_sha3_traits_set_ij_04(
+ state, i0 / (size_t)5U, i0 % (size_t)5U,
+ libcrux_sha3_traits_get_ij_04(state, i0 / (size_t)5U,
+ i0 % (size_t)5U)[0U] ^
+ state_flat[i0]);
}
}
/**
-This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
-usize> for u64)}
+This function found in impl {libcrux_sha3::traits::Absorb<1usize> for
+libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>,
+libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for
+u64}]}
*/
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.load_block_5a
+A monomorphic instance of libcrux_sha3.simd.portable.load_block_a1
with const generics
- RATE= 104
*/
-static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_5a_b82(
- uint64_t (*a)[5U], Eurydice_slice b[1U]) {
- uint64_t(*uu____0)[5U] = a;
- /* Passing arrays by value in Rust generates a copy in C */
- Eurydice_slice copy_of_b[1U];
- memcpy(copy_of_b, b, (size_t)1U * sizeof(Eurydice_slice));
- libcrux_sha3_portable_keccak_load_block_2c3(uu____0, copy_of_b);
+static inline void libcrux_sha3_simd_portable_load_block_a1_7a(
+ libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *input,
+ size_t start) {
+ libcrux_sha3_simd_portable_load_block_7a(self->st, input[0U], start);
}
/**
-A monomorphic instance of libcrux_sha3.generic_keccak.absorb_block
+This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T,
+N>[TraitClause@0, TraitClause@1]}
+*/
+/**
+A monomorphic instance of libcrux_sha3.generic_keccak.absorb_block_80
with types uint64_t
with const generics
- N= 1
- RATE= 104
*/
-static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_block_df2(
- libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice blocks[1U]) {
- uint64_t(*uu____0)[5U] = s->st;
- Eurydice_slice uu____1[1U];
- memcpy(uu____1, blocks, (size_t)1U * sizeof(Eurydice_slice));
- libcrux_sha3_portable_keccak_load_block_5a_b82(uu____0, uu____1);
- libcrux_sha3_generic_keccak_keccakf1600_21(s);
+static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_block_80_c62(
+ libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *blocks,
+ size_t start) {
+ libcrux_sha3_simd_portable_load_block_a1_7a(self, blocks, start);
+ libcrux_sha3_generic_keccak_keccakf1600_80_04(self);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.load_block_full
+A monomorphic instance of libcrux_sha3.simd.portable.load_last
with const generics
- RATE= 104
+- DELIMITER= 6
*/
-static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_full_df3(
- uint64_t (*s)[5U], uint8_t blocks[1U][200U]) {
- Eurydice_slice buf[1U] = {
- Eurydice_array_to_slice((size_t)200U, blocks[0U], uint8_t)};
- libcrux_sha3_portable_keccak_load_block_2c3(s, buf);
+static KRML_MUSTINLINE void libcrux_sha3_simd_portable_load_last_7c(
+ uint64_t *state, Eurydice_slice blocks, size_t start, size_t len) {
+ uint8_t buffer[104U] = {0U};
+ Eurydice_slice_copy(
+ Eurydice_array_to_subslice3(buffer, (size_t)0U, len, uint8_t *),
+ Eurydice_slice_subslice3(blocks, start, start + len, uint8_t *), uint8_t);
+ buffer[len] = 6U;
+ size_t uu____0 = (size_t)104U - (size_t)1U;
+ buffer[uu____0] = (uint32_t)buffer[uu____0] | 128U;
+ libcrux_sha3_simd_portable_load_block_7a(
+ state, Eurydice_array_to_slice((size_t)104U, buffer, uint8_t),
+ (size_t)0U);
}
/**
-This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
-usize> for u64)}
+This function found in impl {libcrux_sha3::traits::Absorb<1usize> for
+libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>,
+libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for
+u64}]}
*/
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.load_block_full_5a
+A monomorphic instance of libcrux_sha3.simd.portable.load_last_a1
with const generics
- RATE= 104
+- DELIMITER= 6
*/
-static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_full_5a_d23(
- uint64_t (*a)[5U], uint8_t b[1U][200U]) {
- uint64_t(*uu____0)[5U] = a;
- /* Passing arrays by value in Rust generates a copy in C */
- uint8_t copy_of_b[1U][200U];
- memcpy(copy_of_b, b, (size_t)1U * sizeof(uint8_t[200U]));
- libcrux_sha3_portable_keccak_load_block_full_df3(uu____0, copy_of_b);
+static inline void libcrux_sha3_simd_portable_load_last_a1_7c(
+ libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *input,
+ size_t start, size_t len) {
+ libcrux_sha3_simd_portable_load_last_7c(self->st, input[0U], start, len);
}
/**
-A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final
+This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T,
+N>[TraitClause@0, TraitClause@1]}
+*/
+/**
+A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final_80
with types uint64_t
with const generics
- N= 1
- RATE= 104
- DELIM= 6
*/
-static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_c74(
- libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice last[1U]) {
- size_t last_len = Eurydice_slice_len(last[0U], uint8_t);
- uint8_t blocks[1U][200U] = {{0U}};
- for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
- size_t i0 = i;
- if (last_len > (size_t)0U) {
- Eurydice_slice uu____0 = Eurydice_array_to_subslice2(
- blocks[i0], (size_t)0U, last_len, uint8_t);
- Eurydice_slice_copy(uu____0, last[i0], uint8_t);
- }
- blocks[i0][last_len] = 6U;
- size_t uu____1 = i0;
- size_t uu____2 = (size_t)104U - (size_t)1U;
- blocks[uu____1][uu____2] = (uint32_t)blocks[uu____1][uu____2] | 128U;
- }
- uint64_t(*uu____3)[5U] = s->st;
- uint8_t uu____4[1U][200U];
- memcpy(uu____4, blocks, (size_t)1U * sizeof(uint8_t[200U]));
- libcrux_sha3_portable_keccak_load_block_full_5a_d23(uu____3, uu____4);
- libcrux_sha3_generic_keccak_keccakf1600_21(s);
+static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_80_9e4(
+ libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *last,
+ size_t start, size_t len) {
+ libcrux_sha3_simd_portable_load_last_a1_7c(self, last, start, len);
+ libcrux_sha3_generic_keccak_keccakf1600_80_04(self);
}
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.store_block
+A monomorphic instance of libcrux_sha3.simd.portable.store_block
with const generics
- RATE= 104
*/
-static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_583(
- uint64_t (*s)[5U], Eurydice_slice out[1U]) {
- for (size_t i = (size_t)0U; i < (size_t)104U / (size_t)8U; i++) {
+static KRML_MUSTINLINE void libcrux_sha3_simd_portable_store_block_7a(
+ uint64_t *s, Eurydice_slice out, size_t start, size_t len) {
+ size_t octets = len / (size_t)8U;
+ for (size_t i = (size_t)0U; i < octets; i++) {
size_t i0 = i;
- Eurydice_slice uu____0 = Eurydice_slice_subslice2(
- out[0U], (size_t)8U * i0, (size_t)8U * i0 + (size_t)8U, uint8_t);
+ Eurydice_slice uu____0 = Eurydice_slice_subslice3(
+ out, start + (size_t)8U * i0, start + (size_t)8U * i0 + (size_t)8U,
+ uint8_t *);
uint8_t ret[8U];
- core_num__u64_9__to_le_bytes(s[i0 / (size_t)5U][i0 % (size_t)5U], ret);
+ core_num__u64__to_le_bytes(
+ libcrux_sha3_traits_get_ij_04(s, i0 / (size_t)5U, i0 % (size_t)5U)[0U],
+ ret);
Eurydice_slice_copy(
uu____0, Eurydice_array_to_slice((size_t)8U, ret, uint8_t), uint8_t);
}
-}
-
-/**
-A monomorphic instance of libcrux_sha3.portable_keccak.store_block_full
-with const generics
-- RATE= 104
-*/
-static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_full_2d2(
- uint64_t (*s)[5U], uint8_t ret[1U][200U]) {
- uint8_t out[200U] = {0U};
- Eurydice_slice buf[1U] = {
- Eurydice_array_to_slice((size_t)200U, out, uint8_t)};
- libcrux_sha3_portable_keccak_store_block_583(s, buf);
- /* Passing arrays by value in Rust generates a copy in C */
- uint8_t copy_of_out[200U];
- memcpy(copy_of_out, out, (size_t)200U * sizeof(uint8_t));
- memcpy(ret[0U], copy_of_out, (size_t)200U * sizeof(uint8_t));
-}
-
-/**
-This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
-usize> for u64)}
-*/
-/**
-A monomorphic instance of libcrux_sha3.portable_keccak.store_block_full_5a
-with const generics
-- RATE= 104
-*/
-static KRML_MUSTINLINE void
-libcrux_sha3_portable_keccak_store_block_full_5a_292(uint64_t (*a)[5U],
- uint8_t ret[1U][200U]) {
- libcrux_sha3_portable_keccak_store_block_full_2d2(a, ret);
-}
-
-/**
-A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_first_and_last
-with types uint64_t
-with const generics
-- N= 1
-- RATE= 104
-*/
-static KRML_MUSTINLINE void
-libcrux_sha3_generic_keccak_squeeze_first_and_last_c52(
- libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) {
- uint8_t b[1U][200U];
- libcrux_sha3_portable_keccak_store_block_full_5a_292(s->st, b);
- for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
- size_t i0 = i;
- Eurydice_slice uu____0 = out[i0];
- uint8_t *uu____1 = b[i0];
- core_ops_range_Range_b3 lit;
- lit.start = (size_t)0U;
- lit.end = Eurydice_slice_len(out[i0], uint8_t);
+ size_t remaining = len % (size_t)8U;
+ if (remaining > (size_t)0U) {
+ Eurydice_slice uu____1 = Eurydice_slice_subslice3(
+ out, start + len - remaining, start + len, uint8_t *);
+ uint8_t ret[8U];
+ core_num__u64__to_le_bytes(
+ libcrux_sha3_traits_get_ij_04(s, octets / (size_t)5U,
+ octets % (size_t)5U)[0U],
+ ret);
Eurydice_slice_copy(
- uu____0,
- Eurydice_array_to_subslice((size_t)200U, uu____1, lit, uint8_t,
- core_ops_range_Range_b3),
+ uu____1,
+ Eurydice_array_to_subslice3(ret, (size_t)0U, remaining, uint8_t *),
uint8_t);
}
}
/**
-This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
-usize> for u64)}
+This function found in impl {libcrux_sha3::traits::Squeeze1<u64> for
+libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>,
+libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for
+u64}]}
*/
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.store_block_5a
+A monomorphic instance of libcrux_sha3.simd.portable.squeeze_13
with const generics
- RATE= 104
*/
-static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_5a_593(
- uint64_t (*a)[5U], Eurydice_slice b[1U]) {
- libcrux_sha3_portable_keccak_store_block_583(a, b);
-}
-
-/**
-A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_first_block
-with types uint64_t
-with const generics
-- N= 1
-- RATE= 104
-*/
-static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_first_block_843(
- libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) {
- libcrux_sha3_portable_keccak_store_block_5a_593(s->st, out);
-}
-
-/**
-A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_next_block
-with types uint64_t
-with const generics
-- N= 1
-- RATE= 104
-*/
-static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_next_block_fc3(
- libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) {
- libcrux_sha3_generic_keccak_keccakf1600_21(s);
- libcrux_sha3_portable_keccak_store_block_5a_593(s->st, out);
-}
-
-/**
-A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_last
-with types uint64_t
-with const generics
-- N= 1
-- RATE= 104
-*/
-static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_last_cf2(
- libcrux_sha3_generic_keccak_KeccakState_48 s, Eurydice_slice out[1U]) {
- libcrux_sha3_generic_keccak_keccakf1600_21(&s);
- uint8_t b[1U][200U];
- libcrux_sha3_portable_keccak_store_block_full_5a_292(s.st, b);
- for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
- size_t i0 = i;
- Eurydice_slice uu____0 = out[i0];
- uint8_t *uu____1 = b[i0];
- core_ops_range_Range_b3 lit;
- lit.start = (size_t)0U;
- lit.end = Eurydice_slice_len(out[i0], uint8_t);
- Eurydice_slice_copy(
- uu____0,
- Eurydice_array_to_subslice((size_t)200U, uu____1, lit, uint8_t,
- core_ops_range_Range_b3),
- uint8_t);
- }
+static inline void libcrux_sha3_simd_portable_squeeze_13_7a(
+ libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice out,
+ size_t start, size_t len) {
+ libcrux_sha3_simd_portable_store_block_7a(self->st, out, start, len);
}
/**
-A monomorphic instance of libcrux_sha3.generic_keccak.keccak
-with types uint64_t
+A monomorphic instance of libcrux_sha3.generic_keccak.portable.keccak1
with const generics
-- N= 1
- RATE= 104
- DELIM= 6
*/
-static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_keccak_e93(
- Eurydice_slice data[1U], Eurydice_slice out[1U]) {
- libcrux_sha3_generic_keccak_KeccakState_48 s =
- libcrux_sha3_generic_keccak_new_1e_f4();
- for (size_t i = (size_t)0U;
- i < Eurydice_slice_len(data[0U], uint8_t) / (size_t)104U; i++) {
+static inline void libcrux_sha3_generic_keccak_portable_keccak1_7c(
+ Eurydice_slice data, Eurydice_slice out) {
+ libcrux_sha3_generic_keccak_KeccakState_17 s =
+ libcrux_sha3_generic_keccak_new_80_04();
+ size_t data_len = Eurydice_slice_len(data, uint8_t);
+ for (size_t i = (size_t)0U; i < data_len / (size_t)104U; i++) {
size_t i0 = i;
- libcrux_sha3_generic_keccak_KeccakState_48 *uu____0 = &s;
- /* Passing arrays by value in Rust generates a copy in C */
- Eurydice_slice copy_of_data[1U];
- memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice));
- Eurydice_slice ret[1U];
- libcrux_sha3_portable_keccak_slice_n_5a(copy_of_data, i0 * (size_t)104U,
- (size_t)104U, ret);
- libcrux_sha3_generic_keccak_absorb_block_df2(uu____0, ret);
+ Eurydice_slice buf[1U] = {data};
+ libcrux_sha3_generic_keccak_absorb_block_80_c62(&s, buf, i0 * (size_t)104U);
}
- size_t rem = Eurydice_slice_len(data[0U], uint8_t) % (size_t)104U;
- libcrux_sha3_generic_keccak_KeccakState_48 *uu____2 = &s;
- /* Passing arrays by value in Rust generates a copy in C */
- Eurydice_slice copy_of_data[1U];
- memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice));
- Eurydice_slice ret[1U];
- libcrux_sha3_portable_keccak_slice_n_5a(
- copy_of_data, Eurydice_slice_len(data[0U], uint8_t) - rem, rem, ret);
- libcrux_sha3_generic_keccak_absorb_final_c74(uu____2, ret);
- size_t outlen = Eurydice_slice_len(out[0U], uint8_t);
+ size_t rem = data_len % (size_t)104U;
+ Eurydice_slice buf[1U] = {data};
+ libcrux_sha3_generic_keccak_absorb_final_80_9e4(&s, buf, data_len - rem, rem);
+ size_t outlen = Eurydice_slice_len(out, uint8_t);
size_t blocks = outlen / (size_t)104U;
size_t last = outlen - outlen % (size_t)104U;
if (blocks == (size_t)0U) {
- libcrux_sha3_generic_keccak_squeeze_first_and_last_c52(&s, out);
+ libcrux_sha3_simd_portable_squeeze_13_7a(&s, out, (size_t)0U, outlen);
} else {
- Eurydice_slice_uint8_t_1size_t__x2 uu____4 =
- libcrux_sha3_portable_keccak_split_at_mut_n_5a(out, (size_t)104U);
- Eurydice_slice o0[1U];
- memcpy(o0, uu____4.fst, (size_t)1U * sizeof(Eurydice_slice));
- Eurydice_slice o1[1U];
- memcpy(o1, uu____4.snd, (size_t)1U * sizeof(Eurydice_slice));
- libcrux_sha3_generic_keccak_squeeze_first_block_843(&s, o0);
- core_ops_range_Range_b3 iter =
- core_iter_traits_collect___core__iter__traits__collect__IntoIterator_for_I__1__into_iter(
- (CLITERAL(core_ops_range_Range_b3){.start = (size_t)1U,
- .end = blocks}),
- core_ops_range_Range_b3, core_ops_range_Range_b3);
- while (true) {
- if (core_iter_range___core__iter__traits__iterator__Iterator_for_core__ops__range__Range_A___6__next(
- &iter, size_t, Option_b3)
- .tag == None) {
- break;
- } else {
- Eurydice_slice_uint8_t_1size_t__x2 uu____5 =
- libcrux_sha3_portable_keccak_split_at_mut_n_5a(o1, (size_t)104U);
- Eurydice_slice o[1U];
- memcpy(o, uu____5.fst, (size_t)1U * sizeof(Eurydice_slice));
- Eurydice_slice orest[1U];
- memcpy(orest, uu____5.snd, (size_t)1U * sizeof(Eurydice_slice));
- libcrux_sha3_generic_keccak_squeeze_next_block_fc3(&s, o);
- memcpy(o1, orest, (size_t)1U * sizeof(Eurydice_slice));
- }
+ libcrux_sha3_simd_portable_squeeze_13_7a(&s, out, (size_t)0U, (size_t)104U);
+ for (size_t i = (size_t)1U; i < blocks; i++) {
+ size_t i0 = i;
+ libcrux_sha3_generic_keccak_keccakf1600_80_04(&s);
+ libcrux_sha3_simd_portable_squeeze_13_7a(&s, out, i0 * (size_t)104U,
+ (size_t)104U);
}
if (last < outlen) {
- libcrux_sha3_generic_keccak_squeeze_last_cf2(s, o1);
+ libcrux_sha3_generic_keccak_keccakf1600_80_04(&s);
+ libcrux_sha3_simd_portable_squeeze_13_7a(&s, out, last, outlen - last);
}
}
}
/**
-A monomorphic instance of libcrux_sha3.portable.keccakx1
-with const generics
-- RATE= 104
-- DELIM= 6
-*/
-static KRML_MUSTINLINE void libcrux_sha3_portable_keccakx1_ce3(
- Eurydice_slice data[1U], Eurydice_slice out[1U]) {
- /* Passing arrays by value in Rust generates a copy in C */
- Eurydice_slice copy_of_data[1U];
- memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice));
- libcrux_sha3_generic_keccak_keccak_e93(copy_of_data, out);
-}
-
-/**
A portable SHA3 384 implementation.
*/
static KRML_MUSTINLINE void libcrux_sha3_portable_sha384(Eurydice_slice digest,
Eurydice_slice data) {
- Eurydice_slice buf0[1U] = {data};
- Eurydice_slice buf[1U] = {digest};
- libcrux_sha3_portable_keccakx1_ce3(buf0, buf);
+ libcrux_sha3_generic_keccak_portable_keccak1_7c(data, digest);
}
/**
@@ -3995,16 +4482,15 @@ static KRML_MUSTINLINE void libcrux_sha3_portable_sha384(Eurydice_slice digest,
Preconditions:
- `digest.len() == 28`
*/
-static KRML_MUSTINLINE void libcrux_sha3_sha224_ema(Eurydice_slice digest,
- Eurydice_slice payload) {
+static inline void libcrux_sha3_sha224_ema(Eurydice_slice digest,
+ Eurydice_slice payload) {
libcrux_sha3_portable_sha224(digest, payload);
}
/**
SHA3 224
*/
-static KRML_MUSTINLINE void libcrux_sha3_sha224(Eurydice_slice data,
- uint8_t ret[28U]) {
+static inline void libcrux_sha3_sha224(Eurydice_slice data, uint8_t ret[28U]) {
uint8_t out[28U] = {0U};
libcrux_sha3_sha224_ema(Eurydice_array_to_slice((size_t)28U, out, uint8_t),
data);
@@ -4014,16 +4500,15 @@ static KRML_MUSTINLINE void libcrux_sha3_sha224(Eurydice_slice data,
/**
SHA3 256
*/
-static KRML_MUSTINLINE void libcrux_sha3_sha256_ema(Eurydice_slice digest,
- Eurydice_slice payload) {
+static inline void libcrux_sha3_sha256_ema(Eurydice_slice digest,
+ Eurydice_slice payload) {
libcrux_sha3_portable_sha256(digest, payload);
}
/**
SHA3 256
*/
-static KRML_MUSTINLINE void libcrux_sha3_sha256(Eurydice_slice data,
- uint8_t ret[32U]) {
+static inline void libcrux_sha3_sha256(Eurydice_slice data, uint8_t ret[32U]) {
uint8_t out[32U] = {0U};
libcrux_sha3_sha256_ema(Eurydice_array_to_slice((size_t)32U, out, uint8_t),
data);
@@ -4033,16 +4518,15 @@ static KRML_MUSTINLINE void libcrux_sha3_sha256(Eurydice_slice data,
/**
SHA3 384
*/
-static KRML_MUSTINLINE void libcrux_sha3_sha384_ema(Eurydice_slice digest,
- Eurydice_slice payload) {
+static inline void libcrux_sha3_sha384_ema(Eurydice_slice digest,
+ Eurydice_slice payload) {
libcrux_sha3_portable_sha384(digest, payload);
}
/**
SHA3 384
*/
-static KRML_MUSTINLINE void libcrux_sha3_sha384(Eurydice_slice data,
- uint8_t ret[48U]) {
+static inline void libcrux_sha3_sha384(Eurydice_slice data, uint8_t ret[48U]) {
uint8_t out[48U] = {0U};
libcrux_sha3_sha384_ema(Eurydice_array_to_slice((size_t)48U, out, uint8_t),
data);
@@ -4052,16 +4536,15 @@ static KRML_MUSTINLINE void libcrux_sha3_sha384(Eurydice_slice data,
/**
SHA3 512
*/
-static KRML_MUSTINLINE void libcrux_sha3_sha512_ema(Eurydice_slice digest,
- Eurydice_slice payload) {
+static inline void libcrux_sha3_sha512_ema(Eurydice_slice digest,
+ Eurydice_slice payload) {
libcrux_sha3_portable_sha512(digest, payload);
}
/**
SHA3 512
*/
-static KRML_MUSTINLINE void libcrux_sha3_sha512(Eurydice_slice data,
- uint8_t ret[64U]) {
+static inline void libcrux_sha3_sha512(Eurydice_slice data, uint8_t ret[64U]) {
uint8_t out[64U] = {0U};
libcrux_sha3_sha512_ema(Eurydice_array_to_slice((size_t)64U, out, uint8_t),
data);
@@ -4069,220 +4552,85 @@ static KRML_MUSTINLINE void libcrux_sha3_sha512(Eurydice_slice data,
}
/**
-This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
-usize> for u64)}
-*/
-/**
-A monomorphic instance of libcrux_sha3.portable_keccak.load_block_5a
-with const generics
-- RATE= 168
-*/
-static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_5a_b83(
- uint64_t (*a)[5U], Eurydice_slice b[1U]) {
- uint64_t(*uu____0)[5U] = a;
- /* Passing arrays by value in Rust generates a copy in C */
- Eurydice_slice copy_of_b[1U];
- memcpy(copy_of_b, b, (size_t)1U * sizeof(Eurydice_slice));
- libcrux_sha3_portable_keccak_load_block_2c1(uu____0, copy_of_b);
-}
-
-/**
-A monomorphic instance of libcrux_sha3.generic_keccak.absorb_block
-with types uint64_t
-with const generics
-- N= 1
-- RATE= 168
-*/
-static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_block_df3(
- libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice blocks[1U]) {
- uint64_t(*uu____0)[5U] = s->st;
- Eurydice_slice uu____1[1U];
- memcpy(uu____1, blocks, (size_t)1U * sizeof(Eurydice_slice));
- libcrux_sha3_portable_keccak_load_block_5a_b83(uu____0, uu____1);
- libcrux_sha3_generic_keccak_keccakf1600_21(s);
-}
-
-/**
-A monomorphic instance of libcrux_sha3.portable_keccak.store_block_full
-with const generics
-- RATE= 168
-*/
-static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_full_2d3(
- uint64_t (*s)[5U], uint8_t ret[1U][200U]) {
- uint8_t out[200U] = {0U};
- Eurydice_slice buf[1U] = {
- Eurydice_array_to_slice((size_t)200U, out, uint8_t)};
- libcrux_sha3_portable_keccak_store_block_581(s, buf);
- /* Passing arrays by value in Rust generates a copy in C */
- uint8_t copy_of_out[200U];
- memcpy(copy_of_out, out, (size_t)200U * sizeof(uint8_t));
- memcpy(ret[0U], copy_of_out, (size_t)200U * sizeof(uint8_t));
-}
-
-/**
-This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
-usize> for u64)}
+This function found in impl {libcrux_sha3::traits::Absorb<1usize> for
+libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>,
+libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for
+u64}]}
*/
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.store_block_full_5a
+A monomorphic instance of libcrux_sha3.simd.portable.load_block_a1
with const generics
- RATE= 168
*/
-static KRML_MUSTINLINE void
-libcrux_sha3_portable_keccak_store_block_full_5a_293(uint64_t (*a)[5U],
- uint8_t ret[1U][200U]) {
- libcrux_sha3_portable_keccak_store_block_full_2d3(a, ret);
+static inline void libcrux_sha3_simd_portable_load_block_a1_3a(
+ libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *input,
+ size_t start) {
+ libcrux_sha3_simd_portable_load_block_3a(self->st, input[0U], start);
}
/**
-A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_first_and_last
-with types uint64_t
-with const generics
-- N= 1
-- RATE= 168
+This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T,
+N>[TraitClause@0, TraitClause@1]}
*/
-static KRML_MUSTINLINE void
-libcrux_sha3_generic_keccak_squeeze_first_and_last_c53(
- libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) {
- uint8_t b[1U][200U];
- libcrux_sha3_portable_keccak_store_block_full_5a_293(s->st, b);
- for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
- size_t i0 = i;
- Eurydice_slice uu____0 = out[i0];
- uint8_t *uu____1 = b[i0];
- core_ops_range_Range_b3 lit;
- lit.start = (size_t)0U;
- lit.end = Eurydice_slice_len(out[i0], uint8_t);
- Eurydice_slice_copy(
- uu____0,
- Eurydice_array_to_subslice((size_t)200U, uu____1, lit, uint8_t,
- core_ops_range_Range_b3),
- uint8_t);
- }
-}
-
/**
-A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_last
+A monomorphic instance of libcrux_sha3.generic_keccak.absorb_block_80
with types uint64_t
with const generics
- N= 1
- RATE= 168
*/
-static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_last_cf3(
- libcrux_sha3_generic_keccak_KeccakState_48 s, Eurydice_slice out[1U]) {
- libcrux_sha3_generic_keccak_keccakf1600_21(&s);
- uint8_t b[1U][200U];
- libcrux_sha3_portable_keccak_store_block_full_5a_293(s.st, b);
- for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
- size_t i0 = i;
- Eurydice_slice uu____0 = out[i0];
- uint8_t *uu____1 = b[i0];
- core_ops_range_Range_b3 lit;
- lit.start = (size_t)0U;
- lit.end = Eurydice_slice_len(out[i0], uint8_t);
- Eurydice_slice_copy(
- uu____0,
- Eurydice_array_to_subslice((size_t)200U, uu____1, lit, uint8_t,
- core_ops_range_Range_b3),
- uint8_t);
- }
+static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_block_80_c63(
+ libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *blocks,
+ size_t start) {
+ libcrux_sha3_simd_portable_load_block_a1_3a(self, blocks, start);
+ libcrux_sha3_generic_keccak_keccakf1600_80_04(self);
}
/**
-A monomorphic instance of libcrux_sha3.generic_keccak.keccak
-with types uint64_t
+A monomorphic instance of libcrux_sha3.generic_keccak.portable.keccak1
with const generics
-- N= 1
- RATE= 168
- DELIM= 31
*/
-static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_keccak_e94(
- Eurydice_slice data[1U], Eurydice_slice out[1U]) {
- libcrux_sha3_generic_keccak_KeccakState_48 s =
- libcrux_sha3_generic_keccak_new_1e_f4();
- for (size_t i = (size_t)0U;
- i < Eurydice_slice_len(data[0U], uint8_t) / (size_t)168U; i++) {
+static inline void libcrux_sha3_generic_keccak_portable_keccak1_c6(
+ Eurydice_slice data, Eurydice_slice out) {
+ libcrux_sha3_generic_keccak_KeccakState_17 s =
+ libcrux_sha3_generic_keccak_new_80_04();
+ size_t data_len = Eurydice_slice_len(data, uint8_t);
+ for (size_t i = (size_t)0U; i < data_len / (size_t)168U; i++) {
size_t i0 = i;
- libcrux_sha3_generic_keccak_KeccakState_48 *uu____0 = &s;
- /* Passing arrays by value in Rust generates a copy in C */
- Eurydice_slice copy_of_data[1U];
- memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice));
- Eurydice_slice ret[1U];
- libcrux_sha3_portable_keccak_slice_n_5a(copy_of_data, i0 * (size_t)168U,
- (size_t)168U, ret);
- libcrux_sha3_generic_keccak_absorb_block_df3(uu____0, ret);
+ Eurydice_slice buf[1U] = {data};
+ libcrux_sha3_generic_keccak_absorb_block_80_c63(&s, buf, i0 * (size_t)168U);
}
- size_t rem = Eurydice_slice_len(data[0U], uint8_t) % (size_t)168U;
- libcrux_sha3_generic_keccak_KeccakState_48 *uu____2 = &s;
- /* Passing arrays by value in Rust generates a copy in C */
- Eurydice_slice copy_of_data[1U];
- memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice));
- Eurydice_slice ret[1U];
- libcrux_sha3_portable_keccak_slice_n_5a(
- copy_of_data, Eurydice_slice_len(data[0U], uint8_t) - rem, rem, ret);
- libcrux_sha3_generic_keccak_absorb_final_c72(uu____2, ret);
- size_t outlen = Eurydice_slice_len(out[0U], uint8_t);
+ size_t rem = data_len % (size_t)168U;
+ Eurydice_slice buf[1U] = {data};
+ libcrux_sha3_generic_keccak_absorb_final_80_9e2(&s, buf, data_len - rem, rem);
+ size_t outlen = Eurydice_slice_len(out, uint8_t);
size_t blocks = outlen / (size_t)168U;
size_t last = outlen - outlen % (size_t)168U;
if (blocks == (size_t)0U) {
- libcrux_sha3_generic_keccak_squeeze_first_and_last_c53(&s, out);
+ libcrux_sha3_simd_portable_squeeze_13_3a(&s, out, (size_t)0U, outlen);
} else {
- Eurydice_slice_uint8_t_1size_t__x2 uu____4 =
- libcrux_sha3_portable_keccak_split_at_mut_n_5a(out, (size_t)168U);
- Eurydice_slice o0[1U];
- memcpy(o0, uu____4.fst, (size_t)1U * sizeof(Eurydice_slice));
- Eurydice_slice o1[1U];
- memcpy(o1, uu____4.snd, (size_t)1U * sizeof(Eurydice_slice));
- libcrux_sha3_generic_keccak_squeeze_first_block_841(&s, o0);
- core_ops_range_Range_b3 iter =
- core_iter_traits_collect___core__iter__traits__collect__IntoIterator_for_I__1__into_iter(
- (CLITERAL(core_ops_range_Range_b3){.start = (size_t)1U,
- .end = blocks}),
- core_ops_range_Range_b3, core_ops_range_Range_b3);
- while (true) {
- if (core_iter_range___core__iter__traits__iterator__Iterator_for_core__ops__range__Range_A___6__next(
- &iter, size_t, Option_b3)
- .tag == None) {
- break;
- } else {
- Eurydice_slice_uint8_t_1size_t__x2 uu____5 =
- libcrux_sha3_portable_keccak_split_at_mut_n_5a(o1, (size_t)168U);
- Eurydice_slice o[1U];
- memcpy(o, uu____5.fst, (size_t)1U * sizeof(Eurydice_slice));
- Eurydice_slice orest[1U];
- memcpy(orest, uu____5.snd, (size_t)1U * sizeof(Eurydice_slice));
- libcrux_sha3_generic_keccak_squeeze_next_block_fc1(&s, o);
- memcpy(o1, orest, (size_t)1U * sizeof(Eurydice_slice));
- }
+ libcrux_sha3_simd_portable_squeeze_13_3a(&s, out, (size_t)0U, (size_t)168U);
+ for (size_t i = (size_t)1U; i < blocks; i++) {
+ size_t i0 = i;
+ libcrux_sha3_generic_keccak_keccakf1600_80_04(&s);
+ libcrux_sha3_simd_portable_squeeze_13_3a(&s, out, i0 * (size_t)168U,
+ (size_t)168U);
}
if (last < outlen) {
- libcrux_sha3_generic_keccak_squeeze_last_cf3(s, o1);
+ libcrux_sha3_generic_keccak_keccakf1600_80_04(&s);
+ libcrux_sha3_simd_portable_squeeze_13_3a(&s, out, last, outlen - last);
}
}
}
/**
-A monomorphic instance of libcrux_sha3.portable.keccakx1
-with const generics
-- RATE= 168
-- DELIM= 31
-*/
-static KRML_MUSTINLINE void libcrux_sha3_portable_keccakx1_ce4(
- Eurydice_slice data[1U], Eurydice_slice out[1U]) {
- /* Passing arrays by value in Rust generates a copy in C */
- Eurydice_slice copy_of_data[1U];
- memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice));
- libcrux_sha3_generic_keccak_keccak_e94(copy_of_data, out);
-}
-
-/**
A portable SHAKE128 implementation.
*/
static KRML_MUSTINLINE void libcrux_sha3_portable_shake128(
Eurydice_slice digest, Eurydice_slice data) {
- Eurydice_slice buf0[1U] = {data};
- Eurydice_slice buf[1U] = {digest};
- libcrux_sha3_portable_keccakx1_ce4(buf0, buf);
+ libcrux_sha3_generic_keccak_portable_keccak1_c6(data, digest);
}
/**
@@ -4290,8 +4638,8 @@ static KRML_MUSTINLINE void libcrux_sha3_portable_shake128(
Writes `out.len()` bytes.
*/
-static KRML_MUSTINLINE void libcrux_sha3_shake128_ema(Eurydice_slice out,
- Eurydice_slice data) {
+static inline void libcrux_sha3_shake128_ema(Eurydice_slice out,
+ Eurydice_slice data) {
libcrux_sha3_portable_shake128(out, data);
}
@@ -4300,208 +4648,113 @@ static KRML_MUSTINLINE void libcrux_sha3_shake128_ema(Eurydice_slice out,
Writes `out.len()` bytes.
*/
-static KRML_MUSTINLINE void libcrux_sha3_shake256_ema(Eurydice_slice out,
- Eurydice_slice data) {
+static inline void libcrux_sha3_shake256_ema(Eurydice_slice out,
+ Eurydice_slice data) {
libcrux_sha3_portable_shake256(out, data);
}
-static const size_t libcrux_sha3_generic_keccak__PI[24U] = {
- (size_t)6U, (size_t)12U, (size_t)18U, (size_t)24U, (size_t)3U,
- (size_t)9U, (size_t)10U, (size_t)16U, (size_t)22U, (size_t)1U,
- (size_t)7U, (size_t)13U, (size_t)19U, (size_t)20U, (size_t)4U,
- (size_t)5U, (size_t)11U, (size_t)17U, (size_t)23U, (size_t)2U,
- (size_t)8U, (size_t)14U, (size_t)15U, (size_t)21U};
-
-static const size_t libcrux_sha3_generic_keccak__ROTC[24U] = {
- (size_t)1U, (size_t)62U, (size_t)28U, (size_t)27U, (size_t)36U,
- (size_t)44U, (size_t)6U, (size_t)55U, (size_t)20U, (size_t)3U,
- (size_t)10U, (size_t)43U, (size_t)25U, (size_t)39U, (size_t)41U,
- (size_t)45U, (size_t)15U, (size_t)21U, (size_t)8U, (size_t)18U,
- (size_t)2U, (size_t)61U, (size_t)56U, (size_t)14U};
-
-/**
- A portable SHA3 224 implementation.
-*/
-static KRML_MUSTINLINE void libcrux_sha3_neon_sha224(Eurydice_slice digest,
- Eurydice_slice data) {
- KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__,
- "panic!");
- KRML_HOST_EXIT(255U);
-}
-
-/**
- A portable SHA3 256 implementation.
-*/
-static KRML_MUSTINLINE void libcrux_sha3_neon_sha256(Eurydice_slice digest,
- Eurydice_slice data) {
- KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__,
- "panic!");
- KRML_HOST_EXIT(255U);
-}
-
/**
- A portable SHA3 384 implementation.
+This function found in impl {libcrux_sha3::generic_keccak::KeccakState<u64,
+1usize>[core::marker::Sized<u64>,
+libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for
+u64}]}
*/
-static KRML_MUSTINLINE void libcrux_sha3_neon_sha384(Eurydice_slice digest,
- Eurydice_slice data) {
- KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__,
- "panic!");
- KRML_HOST_EXIT(255U);
-}
-
/**
- A portable SHA3 512 implementation.
-*/
-static KRML_MUSTINLINE void libcrux_sha3_neon_sha512(Eurydice_slice digest,
- Eurydice_slice data) {
- KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__,
- "panic!");
- KRML_HOST_EXIT(255U);
-}
-
-/**
- Run SHAKE256 on both inputs in parallel.
-
- Writes the two results into `out0` and `out1`
-*/
-static KRML_MUSTINLINE void libcrux_sha3_neon_x2_shake256(Eurydice_slice input0,
- Eurydice_slice input1,
- Eurydice_slice out0,
- Eurydice_slice out1) {
- KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__,
- "panic!");
- KRML_HOST_EXIT(255U);
-}
-
-typedef struct libcrux_sha3_neon_x2_incremental_KeccakState_s {
- libcrux_sha3_generic_keccak_KeccakState_48 state[2U];
-} libcrux_sha3_neon_x2_incremental_KeccakState;
-
-/**
- Initialise the `KeccakState2`.
+A monomorphic instance of
+libcrux_sha3.generic_keccak.portable.squeeze_first_five_blocks_b4 with const
+generics
+- RATE= 168
*/
-static KRML_MUSTINLINE libcrux_sha3_neon_x2_incremental_KeccakState
-libcrux_sha3_neon_x2_incremental_shake128_init(void) {
- KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__,
- "panic!");
- KRML_HOST_EXIT(255U);
+static KRML_MUSTINLINE void
+libcrux_sha3_generic_keccak_portable_squeeze_first_five_blocks_b4_3a(
+ libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice out) {
+ libcrux_sha3_simd_portable_squeeze_13_3a(self, out, (size_t)0U, (size_t)168U);
+ libcrux_sha3_generic_keccak_keccakf1600_80_04(self);
+ libcrux_sha3_simd_portable_squeeze_13_3a(self, out, (size_t)168U,
+ (size_t)168U);
+ libcrux_sha3_generic_keccak_keccakf1600_80_04(self);
+ libcrux_sha3_simd_portable_squeeze_13_3a(self, out, (size_t)2U * (size_t)168U,
+ (size_t)168U);
+ libcrux_sha3_generic_keccak_keccakf1600_80_04(self);
+ libcrux_sha3_simd_portable_squeeze_13_3a(self, out, (size_t)3U * (size_t)168U,
+ (size_t)168U);
+ libcrux_sha3_generic_keccak_keccakf1600_80_04(self);
+ libcrux_sha3_simd_portable_squeeze_13_3a(self, out, (size_t)4U * (size_t)168U,
+ (size_t)168U);
}
/**
- Shake128 absorb `data0` and `data1` in the [`KeccakState`] `s`.
+ Squeeze five blocks
*/
static KRML_MUSTINLINE void
-libcrux_sha3_neon_x2_incremental_shake128_absorb_final(
- libcrux_sha3_neon_x2_incremental_KeccakState *s, Eurydice_slice data0,
- Eurydice_slice data1) {
- KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__,
- "panic!");
- KRML_HOST_EXIT(255U);
+libcrux_sha3_portable_incremental_shake128_squeeze_first_five_blocks(
+ libcrux_sha3_generic_keccak_KeccakState_17 *s, Eurydice_slice out0) {
+ libcrux_sha3_generic_keccak_portable_squeeze_first_five_blocks_b4_3a(s, out0);
}
/**
- Squeeze 2 times the first three blocks in parallel in the
- [`KeccakState`] and return the output in `out0` and `out1`.
+ Absorb some data for SHAKE-256 for the last time
*/
static KRML_MUSTINLINE void
-libcrux_sha3_neon_x2_incremental_shake128_squeeze_first_three_blocks(
- libcrux_sha3_neon_x2_incremental_KeccakState *s, Eurydice_slice out0,
- Eurydice_slice out1) {
- KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__,
- "panic!");
- KRML_HOST_EXIT(255U);
+libcrux_sha3_portable_incremental_shake256_absorb_final(
+ libcrux_sha3_generic_keccak_KeccakState_17 *s, Eurydice_slice data) {
+ libcrux_sha3_generic_keccak_KeccakState_17 *uu____0 = s;
+ Eurydice_slice uu____1[1U] = {data};
+ libcrux_sha3_generic_keccak_absorb_final_80_9e1(
+ uu____0, uu____1, (size_t)0U, Eurydice_slice_len(data, uint8_t));
}
/**
- Squeeze 2 times the next block in parallel in the
- [`KeccakState`] and return the output in `out0` and `out1`.
+ Create a new SHAKE-256 state object.
*/
-static KRML_MUSTINLINE void
-libcrux_sha3_neon_x2_incremental_shake128_squeeze_next_block(
- libcrux_sha3_neon_x2_incremental_KeccakState *s, Eurydice_slice out0,
- Eurydice_slice out1) {
- KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__,
- "panic!");
- KRML_HOST_EXIT(255U);
+static KRML_MUSTINLINE libcrux_sha3_generic_keccak_KeccakState_17
+libcrux_sha3_portable_incremental_shake256_init(void) {
+ return libcrux_sha3_generic_keccak_new_80_04();
}
/**
-A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_first_five_blocks
-with types uint64_t
-with const generics
-- N= 1
-- RATE= 168
+This function found in impl {libcrux_sha3::generic_keccak::KeccakState<u64,
+1usize>[core::marker::Sized<u64>,
+libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for
+u64}]}
*/
-static KRML_MUSTINLINE void
-libcrux_sha3_generic_keccak_squeeze_first_five_blocks_4f(
- libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) {
- Eurydice_slice_uint8_t_1size_t__x2 uu____0 =
- libcrux_sha3_portable_keccak_split_at_mut_n_5a(out, (size_t)168U);
- Eurydice_slice o0[1U];
- memcpy(o0, uu____0.fst, (size_t)1U * sizeof(Eurydice_slice));
- Eurydice_slice o10[1U];
- memcpy(o10, uu____0.snd, (size_t)1U * sizeof(Eurydice_slice));
- libcrux_sha3_generic_keccak_squeeze_first_block_841(s, o0);
- Eurydice_slice_uint8_t_1size_t__x2 uu____1 =
- libcrux_sha3_portable_keccak_split_at_mut_n_5a(o10, (size_t)168U);
- Eurydice_slice o1[1U];
- memcpy(o1, uu____1.fst, (size_t)1U * sizeof(Eurydice_slice));
- Eurydice_slice o20[1U];
- memcpy(o20, uu____1.snd, (size_t)1U * sizeof(Eurydice_slice));
- libcrux_sha3_generic_keccak_squeeze_next_block_fc1(s, o1);
- Eurydice_slice_uint8_t_1size_t__x2 uu____2 =
- libcrux_sha3_portable_keccak_split_at_mut_n_5a(o20, (size_t)168U);
- Eurydice_slice o2[1U];
- memcpy(o2, uu____2.fst, (size_t)1U * sizeof(Eurydice_slice));
- Eurydice_slice o30[1U];
- memcpy(o30, uu____2.snd, (size_t)1U * sizeof(Eurydice_slice));
- libcrux_sha3_generic_keccak_squeeze_next_block_fc1(s, o2);
- Eurydice_slice_uint8_t_1size_t__x2 uu____3 =
- libcrux_sha3_portable_keccak_split_at_mut_n_5a(o30, (size_t)168U);
- Eurydice_slice o3[1U];
- memcpy(o3, uu____3.fst, (size_t)1U * sizeof(Eurydice_slice));
- Eurydice_slice o4[1U];
- memcpy(o4, uu____3.snd, (size_t)1U * sizeof(Eurydice_slice));
- libcrux_sha3_generic_keccak_squeeze_next_block_fc1(s, o3);
- libcrux_sha3_generic_keccak_squeeze_next_block_fc1(s, o4);
-}
-
/**
- Squeeze five blocks
+A monomorphic instance of
+libcrux_sha3.generic_keccak.portable.squeeze_first_block_b4 with const generics
+- RATE= 136
*/
static KRML_MUSTINLINE void
-libcrux_sha3_portable_incremental_shake128_squeeze_first_five_blocks(
- libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out0) {
- Eurydice_slice buf[1U] = {out0};
- libcrux_sha3_generic_keccak_squeeze_first_five_blocks_4f(s, buf);
+libcrux_sha3_generic_keccak_portable_squeeze_first_block_b4_5b(
+ libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice out) {
+ libcrux_sha3_simd_portable_squeeze_13_5b(self, out, (size_t)0U, (size_t)136U);
}
/**
- Absorb some data for SHAKE-256 for the last time
+ Squeeze the first SHAKE-256 block
*/
static KRML_MUSTINLINE void
-libcrux_sha3_portable_incremental_shake256_absorb_final(
- libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice data) {
- Eurydice_slice buf[1U] = {data};
- libcrux_sha3_generic_keccak_absorb_final_c71(s, buf);
+libcrux_sha3_portable_incremental_shake256_squeeze_first_block(
+ libcrux_sha3_generic_keccak_KeccakState_17 *s, Eurydice_slice out) {
+ libcrux_sha3_generic_keccak_portable_squeeze_first_block_b4_5b(s, out);
}
/**
- Create a new SHAKE-256 state object.
+This function found in impl {libcrux_sha3::generic_keccak::KeccakState<u64,
+1usize>[core::marker::Sized<u64>,
+libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for
+u64}]}
*/
-static KRML_MUSTINLINE libcrux_sha3_generic_keccak_KeccakState_48
-libcrux_sha3_portable_incremental_shake256_init(void) {
- return libcrux_sha3_generic_keccak_new_1e_f4();
-}
-
/**
- Squeeze the first SHAKE-256 block
+A monomorphic instance of
+libcrux_sha3.generic_keccak.portable.squeeze_next_block_b4 with const generics
+- RATE= 136
*/
static KRML_MUSTINLINE void
-libcrux_sha3_portable_incremental_shake256_squeeze_first_block(
- libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out) {
- Eurydice_slice buf[1U] = {out};
- libcrux_sha3_generic_keccak_squeeze_first_block_840(s, buf);
+libcrux_sha3_generic_keccak_portable_squeeze_next_block_b4_5b(
+ libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice out,
+ size_t start) {
+ libcrux_sha3_generic_keccak_keccakf1600_80_04(self);
+ libcrux_sha3_simd_portable_squeeze_13_5b(self, out, start, (size_t)136U);
}
/**
@@ -4509,51 +4762,43 @@ libcrux_sha3_portable_incremental_shake256_squeeze_first_block(
*/
static KRML_MUSTINLINE void
libcrux_sha3_portable_incremental_shake256_squeeze_next_block(
- libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out) {
- Eurydice_slice buf[1U] = {out};
- libcrux_sha3_generic_keccak_squeeze_next_block_fc0(s, buf);
+ libcrux_sha3_generic_keccak_KeccakState_17 *s, Eurydice_slice out) {
+ libcrux_sha3_generic_keccak_portable_squeeze_next_block_b4_5b(s, out,
+ (size_t)0U);
}
/**
-A monomorphic instance of libcrux_sha3.generic_keccak.KeccakXofState
+A monomorphic instance of libcrux_sha3.generic_keccak.xof.KeccakXofState
with types uint64_t
with const generics
- $1size_t
- $136size_t
*/
-typedef struct libcrux_sha3_generic_keccak_KeccakXofState_4f_s {
- libcrux_sha3_generic_keccak_KeccakState_48 inner;
+typedef struct libcrux_sha3_generic_keccak_xof_KeccakXofState_e2_s {
+ libcrux_sha3_generic_keccak_KeccakState_17 inner;
uint8_t buf[1U][136U];
size_t buf_len;
bool sponge;
-} libcrux_sha3_generic_keccak_KeccakXofState_4f;
+} libcrux_sha3_generic_keccak_xof_KeccakXofState_e2;
-typedef libcrux_sha3_generic_keccak_KeccakXofState_4f
- libcrux_sha3_portable_incremental_Shake256Absorb;
-
-/**
- Consume the internal buffer and the required amount of the input to pad to
- `RATE`.
+typedef libcrux_sha3_generic_keccak_xof_KeccakXofState_e2
+ libcrux_sha3_portable_incremental_Shake256Xof;
- Returns the `consumed` bytes from `inputs` if there's enough buffered
- content to consume, and `0` otherwise.
- If `consumed > 0` is returned, `self.buf` contains a full block to be
- loaded.
-*/
/**
-This function found in impl {libcrux_sha3::generic_keccak::KeccakXofState<STATE,
-PARALLEL_LANES, RATE>[TraitClause@0]#2}
+This function found in impl
+{libcrux_sha3::generic_keccak::xof::KeccakXofState<STATE, PARALLEL_LANES,
+RATE>[TraitClause@0, TraitClause@1]}
*/
/**
-A monomorphic instance of libcrux_sha3.generic_keccak.fill_buffer_9d
+A monomorphic instance of libcrux_sha3.generic_keccak.xof.fill_buffer_35
with types uint64_t
with const generics
- PARALLEL_LANES= 1
- RATE= 136
*/
-static inline size_t libcrux_sha3_generic_keccak_fill_buffer_9d_b0(
- libcrux_sha3_generic_keccak_KeccakXofState_4f *self,
- Eurydice_slice inputs[1U]) {
+static inline size_t libcrux_sha3_generic_keccak_xof_fill_buffer_35_c6(
+ libcrux_sha3_generic_keccak_xof_KeccakXofState_e2 *self,
+ Eurydice_slice *inputs) {
size_t input_len = Eurydice_slice_len(inputs[0U], uint8_t);
size_t consumed = (size_t)0U;
if (self->buf_len > (size_t)0U) {
@@ -4562,10 +4807,12 @@ static inline size_t libcrux_sha3_generic_keccak_fill_buffer_9d_b0(
for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
size_t i0 = i;
Eurydice_slice uu____0 = Eurydice_array_to_subslice_from(
- (size_t)136U, self->buf[i0], self->buf_len, uint8_t, size_t);
+ (size_t)136U, self->buf[i0], self->buf_len, uint8_t, size_t,
+ uint8_t[]);
Eurydice_slice_copy(
uu____0,
- Eurydice_slice_subslice_to(inputs[i0], consumed, uint8_t, size_t),
+ Eurydice_slice_subslice_to(inputs[i0], consumed, uint8_t, size_t,
+ uint8_t[]),
uint8_t);
}
self->buf_len = self->buf_len + consumed;
@@ -4575,42 +4822,37 @@ static inline size_t libcrux_sha3_generic_keccak_fill_buffer_9d_b0(
}
/**
-This function found in impl {libcrux_sha3::generic_keccak::KeccakXofState<STATE,
-PARALLEL_LANES, RATE>[TraitClause@0]#2}
+This function found in impl
+{libcrux_sha3::generic_keccak::xof::KeccakXofState<STATE, PARALLEL_LANES,
+RATE>[TraitClause@0, TraitClause@1]}
*/
/**
-A monomorphic instance of libcrux_sha3.generic_keccak.absorb_full_9d
+A monomorphic instance of libcrux_sha3.generic_keccak.xof.absorb_full_35
with types uint64_t
with const generics
- PARALLEL_LANES= 1
- RATE= 136
*/
-static inline size_t libcrux_sha3_generic_keccak_absorb_full_9d_f8(
- libcrux_sha3_generic_keccak_KeccakXofState_4f *self,
- Eurydice_slice inputs[1U]) {
- libcrux_sha3_generic_keccak_KeccakXofState_4f *uu____0 = self;
- /* Passing arrays by value in Rust generates a copy in C */
- Eurydice_slice copy_of_inputs0[1U];
- memcpy(copy_of_inputs0, inputs, (size_t)1U * sizeof(Eurydice_slice));
+static inline size_t libcrux_sha3_generic_keccak_xof_absorb_full_35_c6(
+ libcrux_sha3_generic_keccak_xof_KeccakXofState_e2 *self,
+ Eurydice_slice *inputs) {
size_t input_consumed =
- libcrux_sha3_generic_keccak_fill_buffer_9d_b0(uu____0, copy_of_inputs0);
+ libcrux_sha3_generic_keccak_xof_fill_buffer_35_c6(self, inputs);
if (input_consumed > (size_t)0U) {
Eurydice_slice borrowed[1U];
for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
uint8_t buf[136U] = {0U};
- borrowed[i] = core_array___Array_T__N__23__as_slice(
- (size_t)136U, buf, uint8_t, Eurydice_slice);
+ borrowed[i] = core_array___Array_T__N___as_slice((size_t)136U, buf,
+ uint8_t, Eurydice_slice);
}
for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
size_t i0 = i;
borrowed[i0] =
Eurydice_array_to_slice((size_t)136U, self->buf[i0], uint8_t);
}
- uint64_t(*uu____2)[5U] = self->inner.st;
- Eurydice_slice uu____3[1U];
- memcpy(uu____3, borrowed, (size_t)1U * sizeof(Eurydice_slice));
- libcrux_sha3_portable_keccak_load_block_5a_b80(uu____2, uu____3);
- libcrux_sha3_generic_keccak_keccakf1600_21(&self->inner);
+ libcrux_sha3_simd_portable_load_block_a1_5b(&self->inner, borrowed,
+ (size_t)0U);
+ libcrux_sha3_generic_keccak_keccakf1600_80_04(&self->inner);
self->buf_len = (size_t)0U;
}
size_t input_to_consume =
@@ -4619,63 +4861,41 @@ static inline size_t libcrux_sha3_generic_keccak_absorb_full_9d_f8(
size_t remainder = input_to_consume % (size_t)136U;
for (size_t i = (size_t)0U; i < num_blocks; i++) {
size_t i0 = i;
- uint64_t(*uu____4)[5U] = self->inner.st;
- /* Passing arrays by value in Rust generates a copy in C */
- Eurydice_slice copy_of_inputs[1U];
- memcpy(copy_of_inputs, inputs, (size_t)1U * sizeof(Eurydice_slice));
- Eurydice_slice ret[1U];
- libcrux_sha3_portable_keccak_slice_n_5a(
- copy_of_inputs, input_consumed + i0 * (size_t)136U, (size_t)136U, ret);
- libcrux_sha3_portable_keccak_load_block_5a_b80(uu____4, ret);
- libcrux_sha3_generic_keccak_keccakf1600_21(&self->inner);
+ libcrux_sha3_simd_portable_load_block_a1_5b(
+ &self->inner, inputs, input_consumed + i0 * (size_t)136U);
+ libcrux_sha3_generic_keccak_keccakf1600_80_04(&self->inner);
}
return remainder;
}
/**
- Absorb
-
- This function takes any number of bytes to absorb and buffers if it's not
- enough. The function assumes that all input slices in `blocks` have the same
- length.
-
- Only a multiple of `RATE` blocks are absorbed.
- For the remaining bytes [`absorb_final`] needs to be called.
-
- This works best with relatively small `inputs`.
-*/
-/**
-This function found in impl {libcrux_sha3::generic_keccak::KeccakXofState<STATE,
-PARALLEL_LANES, RATE>[TraitClause@0]#2}
+This function found in impl
+{libcrux_sha3::generic_keccak::xof::KeccakXofState<STATE, PARALLEL_LANES,
+RATE>[TraitClause@0, TraitClause@1]}
*/
/**
-A monomorphic instance of libcrux_sha3.generic_keccak.absorb_9d
+A monomorphic instance of libcrux_sha3.generic_keccak.xof.absorb_35
with types uint64_t
with const generics
- PARALLEL_LANES= 1
- RATE= 136
*/
-static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_9d_7b(
- libcrux_sha3_generic_keccak_KeccakXofState_4f *self,
- Eurydice_slice inputs[1U]) {
- libcrux_sha3_generic_keccak_KeccakXofState_4f *uu____0 = self;
- /* Passing arrays by value in Rust generates a copy in C */
- Eurydice_slice copy_of_inputs[1U];
- memcpy(copy_of_inputs, inputs, (size_t)1U * sizeof(Eurydice_slice));
+static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_xof_absorb_35_c6(
+ libcrux_sha3_generic_keccak_xof_KeccakXofState_e2 *self,
+ Eurydice_slice *inputs) {
size_t input_remainder_len =
- libcrux_sha3_generic_keccak_absorb_full_9d_f8(uu____0, copy_of_inputs);
+ libcrux_sha3_generic_keccak_xof_absorb_full_35_c6(self, inputs);
if (input_remainder_len > (size_t)0U) {
size_t input_len = Eurydice_slice_len(inputs[0U], uint8_t);
for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
size_t i0 = i;
- Eurydice_slice uu____2 = Eurydice_array_to_subslice2(
- self->buf[i0], self->buf_len, self->buf_len + input_remainder_len,
- uint8_t);
- Eurydice_slice_copy(
- uu____2,
- Eurydice_slice_subslice_from(
- inputs[i0], input_len - input_remainder_len, uint8_t, size_t),
- uint8_t);
+ Eurydice_slice_copy(Eurydice_array_to_subslice3(
+ self->buf[i0], self->buf_len,
+ self->buf_len + input_remainder_len, uint8_t *),
+ Eurydice_slice_subslice_from(
+ inputs[i0], input_len - input_remainder_len,
+ uint8_t, size_t, uint8_t[]),
+ uint8_t);
}
self->buf_len = self->buf_len + input_remainder_len;
}
@@ -4685,271 +4905,101 @@ static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_9d_7b(
Shake256 absorb
*/
/**
-This function found in impl
-{(libcrux_sha3::portable::incremental::XofAbsorb<136: usize> for
-libcrux_sha3::portable::incremental::Shake256Absorb)#2}
+This function found in impl {libcrux_sha3::portable::incremental::Xof<136usize>
+for libcrux_sha3::portable::incremental::Shake256Xof}
*/
-static inline void libcrux_sha3_portable_incremental_absorb_7d(
- libcrux_sha3_generic_keccak_KeccakXofState_4f *self, Eurydice_slice input) {
+static inline void libcrux_sha3_portable_incremental_absorb_42(
+ libcrux_sha3_generic_keccak_xof_KeccakXofState_e2 *self,
+ Eurydice_slice input) {
Eurydice_slice buf[1U] = {input};
- libcrux_sha3_generic_keccak_absorb_9d_7b(self, buf);
+ libcrux_sha3_generic_keccak_xof_absorb_35_c6(self, buf);
}
-typedef libcrux_sha3_generic_keccak_KeccakXofState_4f
- libcrux_sha3_portable_incremental_Shake256Squeeze;
-
-/**
- Absorb a final block.
-
- The `inputs` block may be empty. Everything in the `inputs` block beyond
- `RATE` bytes is ignored.
-*/
/**
-This function found in impl {libcrux_sha3::generic_keccak::KeccakXofState<STATE,
-PARALLEL_LANES, RATE>[TraitClause@0]#2}
+This function found in impl
+{libcrux_sha3::generic_keccak::xof::KeccakXofState<STATE, PARALLEL_LANES,
+RATE>[TraitClause@0, TraitClause@1]}
*/
/**
-A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final_9d
+A monomorphic instance of libcrux_sha3.generic_keccak.xof.absorb_final_35
with types uint64_t
with const generics
- PARALLEL_LANES= 1
- RATE= 136
- DELIMITER= 31
*/
-static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_9d_25(
- libcrux_sha3_generic_keccak_KeccakXofState_4f *self,
- Eurydice_slice inputs[1U]) {
- libcrux_sha3_generic_keccak_KeccakXofState_4f *uu____0 = self;
- /* Passing arrays by value in Rust generates a copy in C */
- Eurydice_slice copy_of_inputs[1U];
- memcpy(copy_of_inputs, inputs, (size_t)1U * sizeof(Eurydice_slice));
- size_t input_remainder_len =
- libcrux_sha3_generic_keccak_absorb_full_9d_f8(uu____0, copy_of_inputs);
- size_t input_len = Eurydice_slice_len(inputs[0U], uint8_t);
- uint8_t blocks[1U][200U] = {{0U}};
+static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_xof_absorb_final_35_9e(
+ libcrux_sha3_generic_keccak_xof_KeccakXofState_e2 *self,
+ Eurydice_slice *inputs) {
+ libcrux_sha3_generic_keccak_xof_absorb_35_c6(self, inputs);
+ Eurydice_slice borrowed[1U];
+ for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
+ uint8_t buf[136U] = {0U};
+ borrowed[i] = core_array___Array_T__N___as_slice((size_t)136U, buf, uint8_t,
+ Eurydice_slice);
+ }
for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
size_t i0 = i;
- if (self->buf_len > (size_t)0U) {
- Eurydice_slice uu____2 = Eurydice_array_to_subslice2(
- blocks[i0], (size_t)0U, self->buf_len, uint8_t);
- Eurydice_slice_copy(uu____2,
- Eurydice_array_to_subslice2(self->buf[i0], (size_t)0U,
- self->buf_len, uint8_t),
- uint8_t);
- }
- if (input_remainder_len > (size_t)0U) {
- Eurydice_slice uu____3 = Eurydice_array_to_subslice2(
- blocks[i0], self->buf_len, self->buf_len + input_remainder_len,
- uint8_t);
- Eurydice_slice_copy(
- uu____3,
- Eurydice_slice_subslice_from(
- inputs[i0], input_len - input_remainder_len, uint8_t, size_t),
- uint8_t);
- }
- blocks[i0][self->buf_len + input_remainder_len] = 31U;
- size_t uu____4 = i0;
- size_t uu____5 = (size_t)136U - (size_t)1U;
- blocks[uu____4][uu____5] = (uint32_t)blocks[uu____4][uu____5] | 128U;
+ borrowed[i0] =
+ Eurydice_array_to_slice((size_t)136U, self->buf[i0], uint8_t);
}
- uint64_t(*uu____6)[5U] = self->inner.st;
- uint8_t uu____7[1U][200U];
- memcpy(uu____7, blocks, (size_t)1U * sizeof(uint8_t[200U]));
- libcrux_sha3_portable_keccak_load_block_full_5a_d20(uu____6, uu____7);
- libcrux_sha3_generic_keccak_keccakf1600_21(&self->inner);
+ libcrux_sha3_simd_portable_load_last_a1_ad0(&self->inner, borrowed,
+ (size_t)0U, self->buf_len);
+ libcrux_sha3_generic_keccak_keccakf1600_80_04(&self->inner);
}
/**
Shake256 absorb final
*/
/**
-This function found in impl
-{(libcrux_sha3::portable::incremental::XofAbsorb<136: usize> for
-libcrux_sha3::portable::incremental::Shake256Absorb)#2}
+This function found in impl {libcrux_sha3::portable::incremental::Xof<136usize>
+for libcrux_sha3::portable::incremental::Shake256Xof}
*/
-static inline libcrux_sha3_generic_keccak_KeccakXofState_4f
-libcrux_sha3_portable_incremental_absorb_final_7d(
- libcrux_sha3_generic_keccak_KeccakXofState_4f self, Eurydice_slice input) {
+static inline void libcrux_sha3_portable_incremental_absorb_final_42(
+ libcrux_sha3_generic_keccak_xof_KeccakXofState_e2 *self,
+ Eurydice_slice input) {
Eurydice_slice buf[1U] = {input};
- libcrux_sha3_generic_keccak_absorb_final_9d_25(&self, buf);
- return self;
+ libcrux_sha3_generic_keccak_xof_absorb_final_35_9e(self, buf);
}
/**
- An all zero block
-*/
-/**
-This function found in impl {libcrux_sha3::generic_keccak::KeccakXofState<STATE,
-PARALLEL_LANES, RATE>[TraitClause@0]#2}
+This function found in impl
+{libcrux_sha3::generic_keccak::xof::KeccakXofState<STATE, PARALLEL_LANES,
+RATE>[TraitClause@0, TraitClause@1]}
*/
/**
-A monomorphic instance of libcrux_sha3.generic_keccak.zero_block_9d
+A monomorphic instance of libcrux_sha3.generic_keccak.xof.zero_block_35
with types uint64_t
with const generics
- PARALLEL_LANES= 1
- RATE= 136
*/
-static inline void libcrux_sha3_generic_keccak_zero_block_9d_e6(
+static inline void libcrux_sha3_generic_keccak_xof_zero_block_35_c6(
uint8_t ret[136U]) {
- ret[0U] = 0U;
- ret[1U] = 0U;
- ret[2U] = 0U;
- ret[3U] = 0U;
- ret[4U] = 0U;
- ret[5U] = 0U;
- ret[6U] = 0U;
- ret[7U] = 0U;
- ret[8U] = 0U;
- ret[9U] = 0U;
- ret[10U] = 0U;
- ret[11U] = 0U;
- ret[12U] = 0U;
- ret[13U] = 0U;
- ret[14U] = 0U;
- ret[15U] = 0U;
- ret[16U] = 0U;
- ret[17U] = 0U;
- ret[18U] = 0U;
- ret[19U] = 0U;
- ret[20U] = 0U;
- ret[21U] = 0U;
- ret[22U] = 0U;
- ret[23U] = 0U;
- ret[24U] = 0U;
- ret[25U] = 0U;
- ret[26U] = 0U;
- ret[27U] = 0U;
- ret[28U] = 0U;
- ret[29U] = 0U;
- ret[30U] = 0U;
- ret[31U] = 0U;
- ret[32U] = 0U;
- ret[33U] = 0U;
- ret[34U] = 0U;
- ret[35U] = 0U;
- ret[36U] = 0U;
- ret[37U] = 0U;
- ret[38U] = 0U;
- ret[39U] = 0U;
- ret[40U] = 0U;
- ret[41U] = 0U;
- ret[42U] = 0U;
- ret[43U] = 0U;
- ret[44U] = 0U;
- ret[45U] = 0U;
- ret[46U] = 0U;
- ret[47U] = 0U;
- ret[48U] = 0U;
- ret[49U] = 0U;
- ret[50U] = 0U;
- ret[51U] = 0U;
- ret[52U] = 0U;
- ret[53U] = 0U;
- ret[54U] = 0U;
- ret[55U] = 0U;
- ret[56U] = 0U;
- ret[57U] = 0U;
- ret[58U] = 0U;
- ret[59U] = 0U;
- ret[60U] = 0U;
- ret[61U] = 0U;
- ret[62U] = 0U;
- ret[63U] = 0U;
- ret[64U] = 0U;
- ret[65U] = 0U;
- ret[66U] = 0U;
- ret[67U] = 0U;
- ret[68U] = 0U;
- ret[69U] = 0U;
- ret[70U] = 0U;
- ret[71U] = 0U;
- ret[72U] = 0U;
- ret[73U] = 0U;
- ret[74U] = 0U;
- ret[75U] = 0U;
- ret[76U] = 0U;
- ret[77U] = 0U;
- ret[78U] = 0U;
- ret[79U] = 0U;
- ret[80U] = 0U;
- ret[81U] = 0U;
- ret[82U] = 0U;
- ret[83U] = 0U;
- ret[84U] = 0U;
- ret[85U] = 0U;
- ret[86U] = 0U;
- ret[87U] = 0U;
- ret[88U] = 0U;
- ret[89U] = 0U;
- ret[90U] = 0U;
- ret[91U] = 0U;
- ret[92U] = 0U;
- ret[93U] = 0U;
- ret[94U] = 0U;
- ret[95U] = 0U;
- ret[96U] = 0U;
- ret[97U] = 0U;
- ret[98U] = 0U;
- ret[99U] = 0U;
- ret[100U] = 0U;
- ret[101U] = 0U;
- ret[102U] = 0U;
- ret[103U] = 0U;
- ret[104U] = 0U;
- ret[105U] = 0U;
- ret[106U] = 0U;
- ret[107U] = 0U;
- ret[108U] = 0U;
- ret[109U] = 0U;
- ret[110U] = 0U;
- ret[111U] = 0U;
- ret[112U] = 0U;
- ret[113U] = 0U;
- ret[114U] = 0U;
- ret[115U] = 0U;
- ret[116U] = 0U;
- ret[117U] = 0U;
- ret[118U] = 0U;
- ret[119U] = 0U;
- ret[120U] = 0U;
- ret[121U] = 0U;
- ret[122U] = 0U;
- ret[123U] = 0U;
- ret[124U] = 0U;
- ret[125U] = 0U;
- ret[126U] = 0U;
- ret[127U] = 0U;
- ret[128U] = 0U;
- ret[129U] = 0U;
- ret[130U] = 0U;
- ret[131U] = 0U;
- ret[132U] = 0U;
- ret[133U] = 0U;
- ret[134U] = 0U;
- ret[135U] = 0U;
+ memset(ret, 0U, 136U * sizeof(uint8_t));
}
/**
- Generate a new keccak xof state.
-*/
-/**
-This function found in impl {libcrux_sha3::generic_keccak::KeccakXofState<STATE,
-PARALLEL_LANES, RATE>[TraitClause@0]#2}
+This function found in impl
+{libcrux_sha3::generic_keccak::xof::KeccakXofState<STATE, PARALLEL_LANES,
+RATE>[TraitClause@0, TraitClause@1]}
*/
/**
-A monomorphic instance of libcrux_sha3.generic_keccak.new_9d
+A monomorphic instance of libcrux_sha3.generic_keccak.xof.new_35
with types uint64_t
with const generics
- PARALLEL_LANES= 1
- RATE= 136
*/
-static inline libcrux_sha3_generic_keccak_KeccakXofState_4f
-libcrux_sha3_generic_keccak_new_9d_7e(void) {
- libcrux_sha3_generic_keccak_KeccakXofState_4f lit;
- lit.inner = libcrux_sha3_generic_keccak_new_1e_f4();
- uint8_t ret[136U];
- libcrux_sha3_generic_keccak_zero_block_9d_e6(ret);
- memcpy(lit.buf[0U], ret, (size_t)136U * sizeof(uint8_t));
+static inline libcrux_sha3_generic_keccak_xof_KeccakXofState_e2
+libcrux_sha3_generic_keccak_xof_new_35_c6(void) {
+ libcrux_sha3_generic_keccak_xof_KeccakXofState_e2 lit;
+ lit.inner = libcrux_sha3_generic_keccak_new_80_04();
+ uint8_t repeat_expression[1U][136U];
+ for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
+ libcrux_sha3_generic_keccak_xof_zero_block_35_c6(repeat_expression[i]);
+ }
+ memcpy(lit.buf, repeat_expression, (size_t)1U * sizeof(uint8_t[136U]));
lit.buf_len = (size_t)0U;
lit.sponge = false;
return lit;
@@ -4959,55 +5009,103 @@ libcrux_sha3_generic_keccak_new_9d_7e(void) {
Shake256 new state
*/
/**
+This function found in impl {libcrux_sha3::portable::incremental::Xof<136usize>
+for libcrux_sha3::portable::incremental::Shake256Xof}
+*/
+static inline libcrux_sha3_generic_keccak_xof_KeccakXofState_e2
+libcrux_sha3_portable_incremental_new_42(void) {
+ return libcrux_sha3_generic_keccak_xof_new_35_c6();
+}
+
+/**
+ Squeeze `N` x `LEN` bytes. Only `N = 1` for now.
+*/
+/**
This function found in impl
-{(libcrux_sha3::portable::incremental::XofAbsorb<136: usize> for
-libcrux_sha3::portable::incremental::Shake256Absorb)#2}
+{libcrux_sha3::generic_keccak::xof::KeccakXofState<STATE, 1usize,
+RATE>[TraitClause@0, TraitClause@1]}
+*/
+/**
+A monomorphic instance of libcrux_sha3.generic_keccak.xof.squeeze_85
+with types uint64_t
+with const generics
+- RATE= 136
*/
-static inline libcrux_sha3_generic_keccak_KeccakXofState_4f
-libcrux_sha3_portable_incremental_new_7d(void) {
- return libcrux_sha3_generic_keccak_new_9d_7e();
+static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_xof_squeeze_85_c7(
+ libcrux_sha3_generic_keccak_xof_KeccakXofState_e2 *self,
+ Eurydice_slice out) {
+ if (self->sponge) {
+ libcrux_sha3_generic_keccak_keccakf1600_80_04(&self->inner);
+ }
+ size_t out_len = Eurydice_slice_len(out, uint8_t);
+ if (out_len > (size_t)0U) {
+ if (out_len <= (size_t)136U) {
+ libcrux_sha3_simd_portable_squeeze_13_5b(&self->inner, out, (size_t)0U,
+ out_len);
+ } else {
+ size_t blocks = out_len / (size_t)136U;
+ for (size_t i = (size_t)0U; i < blocks; i++) {
+ size_t i0 = i;
+ libcrux_sha3_generic_keccak_keccakf1600_80_04(&self->inner);
+ libcrux_sha3_simd_portable_squeeze_13_5b(
+ &self->inner, out, i0 * (size_t)136U, (size_t)136U);
+ }
+ size_t remaining = out_len % (size_t)136U;
+ if (remaining > (size_t)0U) {
+ libcrux_sha3_generic_keccak_keccakf1600_80_04(&self->inner);
+ libcrux_sha3_simd_portable_squeeze_13_5b(
+ &self->inner, out, blocks * (size_t)136U, remaining);
+ }
+ }
+ self->sponge = true;
+ }
+}
+
+/**
+ Shake256 squeeze
+*/
+/**
+This function found in impl {libcrux_sha3::portable::incremental::Xof<136usize>
+for libcrux_sha3::portable::incremental::Shake256Xof}
+*/
+static inline void libcrux_sha3_portable_incremental_squeeze_42(
+ libcrux_sha3_generic_keccak_xof_KeccakXofState_e2 *self,
+ Eurydice_slice out) {
+ libcrux_sha3_generic_keccak_xof_squeeze_85_c7(self, out);
}
/**
-A monomorphic instance of libcrux_sha3.generic_keccak.KeccakXofState
+A monomorphic instance of libcrux_sha3.generic_keccak.xof.KeccakXofState
with types uint64_t
with const generics
- $1size_t
- $168size_t
*/
-typedef struct libcrux_sha3_generic_keccak_KeccakXofState_78_s {
- libcrux_sha3_generic_keccak_KeccakState_48 inner;
+typedef struct libcrux_sha3_generic_keccak_xof_KeccakXofState_97_s {
+ libcrux_sha3_generic_keccak_KeccakState_17 inner;
uint8_t buf[1U][168U];
size_t buf_len;
bool sponge;
-} libcrux_sha3_generic_keccak_KeccakXofState_78;
-
-typedef libcrux_sha3_generic_keccak_KeccakXofState_78
- libcrux_sha3_portable_incremental_Shake128Absorb;
+} libcrux_sha3_generic_keccak_xof_KeccakXofState_97;
-/**
- Consume the internal buffer and the required amount of the input to pad to
- `RATE`.
+typedef libcrux_sha3_generic_keccak_xof_KeccakXofState_97
+ libcrux_sha3_portable_incremental_Shake128Xof;
- Returns the `consumed` bytes from `inputs` if there's enough buffered
- content to consume, and `0` otherwise.
- If `consumed > 0` is returned, `self.buf` contains a full block to be
- loaded.
-*/
/**
-This function found in impl {libcrux_sha3::generic_keccak::KeccakXofState<STATE,
-PARALLEL_LANES, RATE>[TraitClause@0]#2}
+This function found in impl
+{libcrux_sha3::generic_keccak::xof::KeccakXofState<STATE, PARALLEL_LANES,
+RATE>[TraitClause@0, TraitClause@1]}
*/
/**
-A monomorphic instance of libcrux_sha3.generic_keccak.fill_buffer_9d
+A monomorphic instance of libcrux_sha3.generic_keccak.xof.fill_buffer_35
with types uint64_t
with const generics
- PARALLEL_LANES= 1
- RATE= 168
*/
-static inline size_t libcrux_sha3_generic_keccak_fill_buffer_9d_b00(
- libcrux_sha3_generic_keccak_KeccakXofState_78 *self,
- Eurydice_slice inputs[1U]) {
+static inline size_t libcrux_sha3_generic_keccak_xof_fill_buffer_35_c60(
+ libcrux_sha3_generic_keccak_xof_KeccakXofState_97 *self,
+ Eurydice_slice *inputs) {
size_t input_len = Eurydice_slice_len(inputs[0U], uint8_t);
size_t consumed = (size_t)0U;
if (self->buf_len > (size_t)0U) {
@@ -5016,10 +5114,12 @@ static inline size_t libcrux_sha3_generic_keccak_fill_buffer_9d_b00(
for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
size_t i0 = i;
Eurydice_slice uu____0 = Eurydice_array_to_subslice_from(
- (size_t)168U, self->buf[i0], self->buf_len, uint8_t, size_t);
+ (size_t)168U, self->buf[i0], self->buf_len, uint8_t, size_t,
+ uint8_t[]);
Eurydice_slice_copy(
uu____0,
- Eurydice_slice_subslice_to(inputs[i0], consumed, uint8_t, size_t),
+ Eurydice_slice_subslice_to(inputs[i0], consumed, uint8_t, size_t,
+ uint8_t[]),
uint8_t);
}
self->buf_len = self->buf_len + consumed;
@@ -5029,42 +5129,37 @@ static inline size_t libcrux_sha3_generic_keccak_fill_buffer_9d_b00(
}
/**
-This function found in impl {libcrux_sha3::generic_keccak::KeccakXofState<STATE,
-PARALLEL_LANES, RATE>[TraitClause@0]#2}
+This function found in impl
+{libcrux_sha3::generic_keccak::xof::KeccakXofState<STATE, PARALLEL_LANES,
+RATE>[TraitClause@0, TraitClause@1]}
*/
/**
-A monomorphic instance of libcrux_sha3.generic_keccak.absorb_full_9d
+A monomorphic instance of libcrux_sha3.generic_keccak.xof.absorb_full_35
with types uint64_t
with const generics
- PARALLEL_LANES= 1
- RATE= 168
*/
-static inline size_t libcrux_sha3_generic_keccak_absorb_full_9d_f80(
- libcrux_sha3_generic_keccak_KeccakXofState_78 *self,
- Eurydice_slice inputs[1U]) {
- libcrux_sha3_generic_keccak_KeccakXofState_78 *uu____0 = self;
- /* Passing arrays by value in Rust generates a copy in C */
- Eurydice_slice copy_of_inputs0[1U];
- memcpy(copy_of_inputs0, inputs, (size_t)1U * sizeof(Eurydice_slice));
+static inline size_t libcrux_sha3_generic_keccak_xof_absorb_full_35_c60(
+ libcrux_sha3_generic_keccak_xof_KeccakXofState_97 *self,
+ Eurydice_slice *inputs) {
size_t input_consumed =
- libcrux_sha3_generic_keccak_fill_buffer_9d_b00(uu____0, copy_of_inputs0);
+ libcrux_sha3_generic_keccak_xof_fill_buffer_35_c60(self, inputs);
if (input_consumed > (size_t)0U) {
Eurydice_slice borrowed[1U];
for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
uint8_t buf[168U] = {0U};
- borrowed[i] = core_array___Array_T__N__23__as_slice(
- (size_t)168U, buf, uint8_t, Eurydice_slice);
+ borrowed[i] = core_array___Array_T__N___as_slice((size_t)168U, buf,
+ uint8_t, Eurydice_slice);
}
for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
size_t i0 = i;
borrowed[i0] =
Eurydice_array_to_slice((size_t)168U, self->buf[i0], uint8_t);
}
- uint64_t(*uu____2)[5U] = self->inner.st;
- Eurydice_slice uu____3[1U];
- memcpy(uu____3, borrowed, (size_t)1U * sizeof(Eurydice_slice));
- libcrux_sha3_portable_keccak_load_block_5a_b83(uu____2, uu____3);
- libcrux_sha3_generic_keccak_keccakf1600_21(&self->inner);
+ libcrux_sha3_simd_portable_load_block_a1_3a(&self->inner, borrowed,
+ (size_t)0U);
+ libcrux_sha3_generic_keccak_keccakf1600_80_04(&self->inner);
self->buf_len = (size_t)0U;
}
size_t input_to_consume =
@@ -5073,648 +5168,237 @@ static inline size_t libcrux_sha3_generic_keccak_absorb_full_9d_f80(
size_t remainder = input_to_consume % (size_t)168U;
for (size_t i = (size_t)0U; i < num_blocks; i++) {
size_t i0 = i;
- uint64_t(*uu____4)[5U] = self->inner.st;
- /* Passing arrays by value in Rust generates a copy in C */
- Eurydice_slice copy_of_inputs[1U];
- memcpy(copy_of_inputs, inputs, (size_t)1U * sizeof(Eurydice_slice));
- Eurydice_slice ret[1U];
- libcrux_sha3_portable_keccak_slice_n_5a(
- copy_of_inputs, input_consumed + i0 * (size_t)168U, (size_t)168U, ret);
- libcrux_sha3_portable_keccak_load_block_5a_b83(uu____4, ret);
- libcrux_sha3_generic_keccak_keccakf1600_21(&self->inner);
+ libcrux_sha3_simd_portable_load_block_a1_3a(
+ &self->inner, inputs, input_consumed + i0 * (size_t)168U);
+ libcrux_sha3_generic_keccak_keccakf1600_80_04(&self->inner);
}
return remainder;
}
/**
- Absorb
-
- This function takes any number of bytes to absorb and buffers if it's not
- enough. The function assumes that all input slices in `blocks` have the same
- length.
-
- Only a multiple of `RATE` blocks are absorbed.
- For the remaining bytes [`absorb_final`] needs to be called.
-
- This works best with relatively small `inputs`.
-*/
-/**
-This function found in impl {libcrux_sha3::generic_keccak::KeccakXofState<STATE,
-PARALLEL_LANES, RATE>[TraitClause@0]#2}
+This function found in impl
+{libcrux_sha3::generic_keccak::xof::KeccakXofState<STATE, PARALLEL_LANES,
+RATE>[TraitClause@0, TraitClause@1]}
*/
/**
-A monomorphic instance of libcrux_sha3.generic_keccak.absorb_9d
+A monomorphic instance of libcrux_sha3.generic_keccak.xof.absorb_35
with types uint64_t
with const generics
- PARALLEL_LANES= 1
- RATE= 168
*/
-static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_9d_7b0(
- libcrux_sha3_generic_keccak_KeccakXofState_78 *self,
- Eurydice_slice inputs[1U]) {
- libcrux_sha3_generic_keccak_KeccakXofState_78 *uu____0 = self;
- /* Passing arrays by value in Rust generates a copy in C */
- Eurydice_slice copy_of_inputs[1U];
- memcpy(copy_of_inputs, inputs, (size_t)1U * sizeof(Eurydice_slice));
+static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_xof_absorb_35_c60(
+ libcrux_sha3_generic_keccak_xof_KeccakXofState_97 *self,
+ Eurydice_slice *inputs) {
size_t input_remainder_len =
- libcrux_sha3_generic_keccak_absorb_full_9d_f80(uu____0, copy_of_inputs);
+ libcrux_sha3_generic_keccak_xof_absorb_full_35_c60(self, inputs);
if (input_remainder_len > (size_t)0U) {
size_t input_len = Eurydice_slice_len(inputs[0U], uint8_t);
for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
size_t i0 = i;
- Eurydice_slice uu____2 = Eurydice_array_to_subslice2(
- self->buf[i0], self->buf_len, self->buf_len + input_remainder_len,
- uint8_t);
- Eurydice_slice_copy(
- uu____2,
- Eurydice_slice_subslice_from(
- inputs[i0], input_len - input_remainder_len, uint8_t, size_t),
- uint8_t);
+ Eurydice_slice_copy(Eurydice_array_to_subslice3(
+ self->buf[i0], self->buf_len,
+ self->buf_len + input_remainder_len, uint8_t *),
+ Eurydice_slice_subslice_from(
+ inputs[i0], input_len - input_remainder_len,
+ uint8_t, size_t, uint8_t[]),
+ uint8_t);
}
self->buf_len = self->buf_len + input_remainder_len;
}
}
/**
-This function found in impl
-{(libcrux_sha3::portable::incremental::XofAbsorb<168: usize> for
-libcrux_sha3::portable::incremental::Shake128Absorb)}
+This function found in impl {libcrux_sha3::portable::incremental::Xof<168usize>
+for libcrux_sha3::portable::incremental::Shake128Xof}
*/
-static inline void libcrux_sha3_portable_incremental_absorb_1c(
- libcrux_sha3_generic_keccak_KeccakXofState_78 *self, Eurydice_slice input) {
+static inline void libcrux_sha3_portable_incremental_absorb_26(
+ libcrux_sha3_generic_keccak_xof_KeccakXofState_97 *self,
+ Eurydice_slice input) {
Eurydice_slice buf[1U] = {input};
- libcrux_sha3_generic_keccak_absorb_9d_7b0(self, buf);
+ libcrux_sha3_generic_keccak_xof_absorb_35_c60(self, buf);
}
-typedef libcrux_sha3_generic_keccak_KeccakXofState_78
- libcrux_sha3_portable_incremental_Shake128Squeeze;
-
-/**
- Absorb a final block.
-
- The `inputs` block may be empty. Everything in the `inputs` block beyond
- `RATE` bytes is ignored.
-*/
/**
-This function found in impl {libcrux_sha3::generic_keccak::KeccakXofState<STATE,
-PARALLEL_LANES, RATE>[TraitClause@0]#2}
+This function found in impl
+{libcrux_sha3::generic_keccak::xof::KeccakXofState<STATE, PARALLEL_LANES,
+RATE>[TraitClause@0, TraitClause@1]}
*/
/**
-A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final_9d
+A monomorphic instance of libcrux_sha3.generic_keccak.xof.absorb_final_35
with types uint64_t
with const generics
- PARALLEL_LANES= 1
- RATE= 168
- DELIMITER= 31
*/
-static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_9d_250(
- libcrux_sha3_generic_keccak_KeccakXofState_78 *self,
- Eurydice_slice inputs[1U]) {
- libcrux_sha3_generic_keccak_KeccakXofState_78 *uu____0 = self;
- /* Passing arrays by value in Rust generates a copy in C */
- Eurydice_slice copy_of_inputs[1U];
- memcpy(copy_of_inputs, inputs, (size_t)1U * sizeof(Eurydice_slice));
- size_t input_remainder_len =
- libcrux_sha3_generic_keccak_absorb_full_9d_f80(uu____0, copy_of_inputs);
- size_t input_len = Eurydice_slice_len(inputs[0U], uint8_t);
- uint8_t blocks[1U][200U] = {{0U}};
+static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_xof_absorb_final_35_9e0(
+ libcrux_sha3_generic_keccak_xof_KeccakXofState_97 *self,
+ Eurydice_slice *inputs) {
+ libcrux_sha3_generic_keccak_xof_absorb_35_c60(self, inputs);
+ Eurydice_slice borrowed[1U];
+ for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
+ uint8_t buf[168U] = {0U};
+ borrowed[i] = core_array___Array_T__N___as_slice((size_t)168U, buf, uint8_t,
+ Eurydice_slice);
+ }
for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
size_t i0 = i;
- if (self->buf_len > (size_t)0U) {
- Eurydice_slice uu____2 = Eurydice_array_to_subslice2(
- blocks[i0], (size_t)0U, self->buf_len, uint8_t);
- Eurydice_slice_copy(uu____2,
- Eurydice_array_to_subslice2(self->buf[i0], (size_t)0U,
- self->buf_len, uint8_t),
- uint8_t);
- }
- if (input_remainder_len > (size_t)0U) {
- Eurydice_slice uu____3 = Eurydice_array_to_subslice2(
- blocks[i0], self->buf_len, self->buf_len + input_remainder_len,
- uint8_t);
- Eurydice_slice_copy(
- uu____3,
- Eurydice_slice_subslice_from(
- inputs[i0], input_len - input_remainder_len, uint8_t, size_t),
- uint8_t);
- }
- blocks[i0][self->buf_len + input_remainder_len] = 31U;
- size_t uu____4 = i0;
- size_t uu____5 = (size_t)168U - (size_t)1U;
- blocks[uu____4][uu____5] = (uint32_t)blocks[uu____4][uu____5] | 128U;
+ borrowed[i0] =
+ Eurydice_array_to_slice((size_t)168U, self->buf[i0], uint8_t);
}
- uint64_t(*uu____6)[5U] = self->inner.st;
- uint8_t uu____7[1U][200U];
- memcpy(uu____7, blocks, (size_t)1U * sizeof(uint8_t[200U]));
- libcrux_sha3_portable_keccak_load_block_full_5a_d21(uu____6, uu____7);
- libcrux_sha3_generic_keccak_keccakf1600_21(&self->inner);
+ libcrux_sha3_simd_portable_load_last_a1_c6(&self->inner, borrowed, (size_t)0U,
+ self->buf_len);
+ libcrux_sha3_generic_keccak_keccakf1600_80_04(&self->inner);
}
/**
-This function found in impl
-{(libcrux_sha3::portable::incremental::XofAbsorb<168: usize> for
-libcrux_sha3::portable::incremental::Shake128Absorb)}
+This function found in impl {libcrux_sha3::portable::incremental::Xof<168usize>
+for libcrux_sha3::portable::incremental::Shake128Xof}
*/
-static inline libcrux_sha3_generic_keccak_KeccakXofState_78
-libcrux_sha3_portable_incremental_absorb_final_1c(
- libcrux_sha3_generic_keccak_KeccakXofState_78 self, Eurydice_slice input) {
+static inline void libcrux_sha3_portable_incremental_absorb_final_26(
+ libcrux_sha3_generic_keccak_xof_KeccakXofState_97 *self,
+ Eurydice_slice input) {
Eurydice_slice buf[1U] = {input};
- libcrux_sha3_generic_keccak_absorb_final_9d_250(&self, buf);
- return self;
+ libcrux_sha3_generic_keccak_xof_absorb_final_35_9e0(self, buf);
}
/**
- An all zero block
-*/
-/**
-This function found in impl {libcrux_sha3::generic_keccak::KeccakXofState<STATE,
-PARALLEL_LANES, RATE>[TraitClause@0]#2}
+This function found in impl
+{libcrux_sha3::generic_keccak::xof::KeccakXofState<STATE, PARALLEL_LANES,
+RATE>[TraitClause@0, TraitClause@1]}
*/
/**
-A monomorphic instance of libcrux_sha3.generic_keccak.zero_block_9d
+A monomorphic instance of libcrux_sha3.generic_keccak.xof.zero_block_35
with types uint64_t
with const generics
- PARALLEL_LANES= 1
- RATE= 168
*/
-static inline void libcrux_sha3_generic_keccak_zero_block_9d_e60(
+static inline void libcrux_sha3_generic_keccak_xof_zero_block_35_c60(
uint8_t ret[168U]) {
- ret[0U] = 0U;
- ret[1U] = 0U;
- ret[2U] = 0U;
- ret[3U] = 0U;
- ret[4U] = 0U;
- ret[5U] = 0U;
- ret[6U] = 0U;
- ret[7U] = 0U;
- ret[8U] = 0U;
- ret[9U] = 0U;
- ret[10U] = 0U;
- ret[11U] = 0U;
- ret[12U] = 0U;
- ret[13U] = 0U;
- ret[14U] = 0U;
- ret[15U] = 0U;
- ret[16U] = 0U;
- ret[17U] = 0U;
- ret[18U] = 0U;
- ret[19U] = 0U;
- ret[20U] = 0U;
- ret[21U] = 0U;
- ret[22U] = 0U;
- ret[23U] = 0U;
- ret[24U] = 0U;
- ret[25U] = 0U;
- ret[26U] = 0U;
- ret[27U] = 0U;
- ret[28U] = 0U;
- ret[29U] = 0U;
- ret[30U] = 0U;
- ret[31U] = 0U;
- ret[32U] = 0U;
- ret[33U] = 0U;
- ret[34U] = 0U;
- ret[35U] = 0U;
- ret[36U] = 0U;
- ret[37U] = 0U;
- ret[38U] = 0U;
- ret[39U] = 0U;
- ret[40U] = 0U;
- ret[41U] = 0U;
- ret[42U] = 0U;
- ret[43U] = 0U;
- ret[44U] = 0U;
- ret[45U] = 0U;
- ret[46U] = 0U;
- ret[47U] = 0U;
- ret[48U] = 0U;
- ret[49U] = 0U;
- ret[50U] = 0U;
- ret[51U] = 0U;
- ret[52U] = 0U;
- ret[53U] = 0U;
- ret[54U] = 0U;
- ret[55U] = 0U;
- ret[56U] = 0U;
- ret[57U] = 0U;
- ret[58U] = 0U;
- ret[59U] = 0U;
- ret[60U] = 0U;
- ret[61U] = 0U;
- ret[62U] = 0U;
- ret[63U] = 0U;
- ret[64U] = 0U;
- ret[65U] = 0U;
- ret[66U] = 0U;
- ret[67U] = 0U;
- ret[68U] = 0U;
- ret[69U] = 0U;
- ret[70U] = 0U;
- ret[71U] = 0U;
- ret[72U] = 0U;
- ret[73U] = 0U;
- ret[74U] = 0U;
- ret[75U] = 0U;
- ret[76U] = 0U;
- ret[77U] = 0U;
- ret[78U] = 0U;
- ret[79U] = 0U;
- ret[80U] = 0U;
- ret[81U] = 0U;
- ret[82U] = 0U;
- ret[83U] = 0U;
- ret[84U] = 0U;
- ret[85U] = 0U;
- ret[86U] = 0U;
- ret[87U] = 0U;
- ret[88U] = 0U;
- ret[89U] = 0U;
- ret[90U] = 0U;
- ret[91U] = 0U;
- ret[92U] = 0U;
- ret[93U] = 0U;
- ret[94U] = 0U;
- ret[95U] = 0U;
- ret[96U] = 0U;
- ret[97U] = 0U;
- ret[98U] = 0U;
- ret[99U] = 0U;
- ret[100U] = 0U;
- ret[101U] = 0U;
- ret[102U] = 0U;
- ret[103U] = 0U;
- ret[104U] = 0U;
- ret[105U] = 0U;
- ret[106U] = 0U;
- ret[107U] = 0U;
- ret[108U] = 0U;
- ret[109U] = 0U;
- ret[110U] = 0U;
- ret[111U] = 0U;
- ret[112U] = 0U;
- ret[113U] = 0U;
- ret[114U] = 0U;
- ret[115U] = 0U;
- ret[116U] = 0U;
- ret[117U] = 0U;
- ret[118U] = 0U;
- ret[119U] = 0U;
- ret[120U] = 0U;
- ret[121U] = 0U;
- ret[122U] = 0U;
- ret[123U] = 0U;
- ret[124U] = 0U;
- ret[125U] = 0U;
- ret[126U] = 0U;
- ret[127U] = 0U;
- ret[128U] = 0U;
- ret[129U] = 0U;
- ret[130U] = 0U;
- ret[131U] = 0U;
- ret[132U] = 0U;
- ret[133U] = 0U;
- ret[134U] = 0U;
- ret[135U] = 0U;
- ret[136U] = 0U;
- ret[137U] = 0U;
- ret[138U] = 0U;
- ret[139U] = 0U;
- ret[140U] = 0U;
- ret[141U] = 0U;
- ret[142U] = 0U;
- ret[143U] = 0U;
- ret[144U] = 0U;
- ret[145U] = 0U;
- ret[146U] = 0U;
- ret[147U] = 0U;
- ret[148U] = 0U;
- ret[149U] = 0U;
- ret[150U] = 0U;
- ret[151U] = 0U;
- ret[152U] = 0U;
- ret[153U] = 0U;
- ret[154U] = 0U;
- ret[155U] = 0U;
- ret[156U] = 0U;
- ret[157U] = 0U;
- ret[158U] = 0U;
- ret[159U] = 0U;
- ret[160U] = 0U;
- ret[161U] = 0U;
- ret[162U] = 0U;
- ret[163U] = 0U;
- ret[164U] = 0U;
- ret[165U] = 0U;
- ret[166U] = 0U;
- ret[167U] = 0U;
+ memset(ret, 0U, 168U * sizeof(uint8_t));
}
/**
- Generate a new keccak xof state.
-*/
-/**
-This function found in impl {libcrux_sha3::generic_keccak::KeccakXofState<STATE,
-PARALLEL_LANES, RATE>[TraitClause@0]#2}
+This function found in impl
+{libcrux_sha3::generic_keccak::xof::KeccakXofState<STATE, PARALLEL_LANES,
+RATE>[TraitClause@0, TraitClause@1]}
*/
/**
-A monomorphic instance of libcrux_sha3.generic_keccak.new_9d
+A monomorphic instance of libcrux_sha3.generic_keccak.xof.new_35
with types uint64_t
with const generics
- PARALLEL_LANES= 1
- RATE= 168
*/
-static inline libcrux_sha3_generic_keccak_KeccakXofState_78
-libcrux_sha3_generic_keccak_new_9d_7e0(void) {
- libcrux_sha3_generic_keccak_KeccakXofState_78 lit;
- lit.inner = libcrux_sha3_generic_keccak_new_1e_f4();
- uint8_t ret[168U];
- libcrux_sha3_generic_keccak_zero_block_9d_e60(ret);
- memcpy(lit.buf[0U], ret, (size_t)168U * sizeof(uint8_t));
+static inline libcrux_sha3_generic_keccak_xof_KeccakXofState_97
+libcrux_sha3_generic_keccak_xof_new_35_c60(void) {
+ libcrux_sha3_generic_keccak_xof_KeccakXofState_97 lit;
+ lit.inner = libcrux_sha3_generic_keccak_new_80_04();
+ uint8_t repeat_expression[1U][168U];
+ for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
+ libcrux_sha3_generic_keccak_xof_zero_block_35_c60(repeat_expression[i]);
+ }
+ memcpy(lit.buf, repeat_expression, (size_t)1U * sizeof(uint8_t[168U]));
lit.buf_len = (size_t)0U;
lit.sponge = false;
return lit;
}
/**
-This function found in impl
-{(libcrux_sha3::portable::incremental::XofAbsorb<168: usize> for
-libcrux_sha3::portable::incremental::Shake128Absorb)}
-*/
-static inline libcrux_sha3_generic_keccak_KeccakXofState_78
-libcrux_sha3_portable_incremental_new_1c(void) {
- return libcrux_sha3_generic_keccak_new_9d_7e0();
-}
-
-/**
- `out` has the exact size we want here. It must be less than or equal to `RATE`.
-*/
-/**
-This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
-usize> for u64)}
-*/
-/**
-A monomorphic instance of libcrux_sha3.portable_keccak.store_5a
-with const generics
-- RATE= 136
+This function found in impl {libcrux_sha3::portable::incremental::Xof<168usize>
+for libcrux_sha3::portable::incremental::Shake128Xof}
*/
-static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_5a_1c(
- uint64_t (*state)[5U], Eurydice_slice out[1U]) {
- size_t num_full_blocks = Eurydice_slice_len(out[0U], uint8_t) / (size_t)8U;
- size_t last_block_len = Eurydice_slice_len(out[0U], uint8_t) % (size_t)8U;
- for (size_t i = (size_t)0U; i < num_full_blocks; i++) {
- size_t i0 = i;
- Eurydice_slice uu____0 = Eurydice_slice_subslice2(
- out[0U], i0 * (size_t)8U, i0 * (size_t)8U + (size_t)8U, uint8_t);
- uint8_t ret[8U];
- core_num__u64_9__to_le_bytes(state[i0 / (size_t)5U][i0 % (size_t)5U], ret);
- Eurydice_slice_copy(
- uu____0, Eurydice_array_to_slice((size_t)8U, ret, uint8_t), uint8_t);
- }
- if (last_block_len != (size_t)0U) {
- Eurydice_slice uu____1 = Eurydice_slice_subslice2(
- out[0U], num_full_blocks * (size_t)8U,
- num_full_blocks * (size_t)8U + last_block_len, uint8_t);
- uint8_t ret[8U];
- core_num__u64_9__to_le_bytes(
- state[num_full_blocks / (size_t)5U][num_full_blocks % (size_t)5U], ret);
- Eurydice_slice_copy(
- uu____1,
- Eurydice_array_to_subslice2(ret, (size_t)0U, last_block_len, uint8_t),
- uint8_t);
- }
+static inline libcrux_sha3_generic_keccak_xof_KeccakXofState_97
+libcrux_sha3_portable_incremental_new_26(void) {
+ return libcrux_sha3_generic_keccak_xof_new_35_c60();
}
/**
- Squeeze `N` x `LEN` bytes.
-*/
-/**
-This function found in impl {libcrux_sha3::generic_keccak::KeccakXofState<STATE,
-PARALLEL_LANES, RATE>[TraitClause@0]#2}
-*/
-/**
-A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_9d
-with types uint64_t
-with const generics
-- PARALLEL_LANES= 1
-- RATE= 136
-*/
-static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_9d_96(
- libcrux_sha3_generic_keccak_KeccakXofState_4f *self,
- Eurydice_slice out[1U]) {
- if (self->sponge) {
- libcrux_sha3_generic_keccak_keccakf1600_21(&self->inner);
- }
- size_t out_len = Eurydice_slice_len(out[0U], uint8_t);
- size_t blocks = out_len / (size_t)136U;
- size_t last = out_len - out_len % (size_t)136U;
- size_t mid;
- if ((size_t)136U >= out_len) {
- mid = out_len;
- } else {
- mid = (size_t)136U;
- }
- Eurydice_slice_uint8_t_1size_t__x2 uu____0 =
- libcrux_sha3_portable_keccak_split_at_mut_n_5a(out, mid);
- Eurydice_slice out00[1U];
- memcpy(out00, uu____0.fst, (size_t)1U * sizeof(Eurydice_slice));
- Eurydice_slice out_rest[1U];
- memcpy(out_rest, uu____0.snd, (size_t)1U * sizeof(Eurydice_slice));
- libcrux_sha3_portable_keccak_store_5a_1c(self->inner.st, out00);
- core_ops_range_Range_b3 iter =
- core_iter_traits_collect___core__iter__traits__collect__IntoIterator_for_I__1__into_iter(
- (CLITERAL(core_ops_range_Range_b3){.start = (size_t)1U,
- .end = blocks}),
- core_ops_range_Range_b3, core_ops_range_Range_b3);
- while (true) {
- if (core_iter_range___core__iter__traits__iterator__Iterator_for_core__ops__range__Range_A___6__next(
- &iter, size_t, Option_b3)
- .tag == None) {
- break;
- } else {
- Eurydice_slice_uint8_t_1size_t__x2 uu____1 =
- libcrux_sha3_portable_keccak_split_at_mut_n_5a(out_rest,
- (size_t)136U);
- Eurydice_slice out0[1U];
- memcpy(out0, uu____1.fst, (size_t)1U * sizeof(Eurydice_slice));
- Eurydice_slice tmp[1U];
- memcpy(tmp, uu____1.snd, (size_t)1U * sizeof(Eurydice_slice));
- libcrux_sha3_generic_keccak_keccakf1600_21(&self->inner);
- libcrux_sha3_portable_keccak_store_5a_1c(self->inner.st, out0);
- memcpy(out_rest, tmp, (size_t)1U * sizeof(Eurydice_slice));
- }
- }
- if (last < out_len) {
- libcrux_sha3_generic_keccak_keccakf1600_21(&self->inner);
- libcrux_sha3_portable_keccak_store_5a_1c(self->inner.st, out_rest);
- }
- self->sponge = true;
-}
-
-/**
- Shake256 squeeze
+ Squeeze `N` x `LEN` bytes. Only `N = 1` for now.
*/
/**
This function found in impl
-{(libcrux_sha3::portable::incremental::XofSqueeze<136: usize> for
-libcrux_sha3::portable::incremental::Shake256Squeeze)#3}
-*/
-static inline void libcrux_sha3_portable_incremental_squeeze_8a(
- libcrux_sha3_generic_keccak_KeccakXofState_4f *self, Eurydice_slice out) {
- Eurydice_slice buf[1U] = {out};
- libcrux_sha3_generic_keccak_squeeze_9d_96(self, buf);
-}
-
-/**
- `out` has the exact size we want here. It must be less than or equal to `RATE`.
-*/
-/**
-This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
-usize> for u64)}
+{libcrux_sha3::generic_keccak::xof::KeccakXofState<STATE, 1usize,
+RATE>[TraitClause@0, TraitClause@1]}
*/
/**
-A monomorphic instance of libcrux_sha3.portable_keccak.store_5a
-with const generics
-- RATE= 168
-*/
-static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_5a_1c0(
- uint64_t (*state)[5U], Eurydice_slice out[1U]) {
- size_t num_full_blocks = Eurydice_slice_len(out[0U], uint8_t) / (size_t)8U;
- size_t last_block_len = Eurydice_slice_len(out[0U], uint8_t) % (size_t)8U;
- for (size_t i = (size_t)0U; i < num_full_blocks; i++) {
- size_t i0 = i;
- Eurydice_slice uu____0 = Eurydice_slice_subslice2(
- out[0U], i0 * (size_t)8U, i0 * (size_t)8U + (size_t)8U, uint8_t);
- uint8_t ret[8U];
- core_num__u64_9__to_le_bytes(state[i0 / (size_t)5U][i0 % (size_t)5U], ret);
- Eurydice_slice_copy(
- uu____0, Eurydice_array_to_slice((size_t)8U, ret, uint8_t), uint8_t);
- }
- if (last_block_len != (size_t)0U) {
- Eurydice_slice uu____1 = Eurydice_slice_subslice2(
- out[0U], num_full_blocks * (size_t)8U,
- num_full_blocks * (size_t)8U + last_block_len, uint8_t);
- uint8_t ret[8U];
- core_num__u64_9__to_le_bytes(
- state[num_full_blocks / (size_t)5U][num_full_blocks % (size_t)5U], ret);
- Eurydice_slice_copy(
- uu____1,
- Eurydice_array_to_subslice2(ret, (size_t)0U, last_block_len, uint8_t),
- uint8_t);
- }
-}
-
-/**
- Squeeze `N` x `LEN` bytes.
-*/
-/**
-This function found in impl {libcrux_sha3::generic_keccak::KeccakXofState<STATE,
-PARALLEL_LANES, RATE>[TraitClause@0]#2}
-*/
-/**
-A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_9d
+A monomorphic instance of libcrux_sha3.generic_keccak.xof.squeeze_85
with types uint64_t
with const generics
-- PARALLEL_LANES= 1
- RATE= 168
*/
-static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_9d_960(
- libcrux_sha3_generic_keccak_KeccakXofState_78 *self,
- Eurydice_slice out[1U]) {
+static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_xof_squeeze_85_13(
+ libcrux_sha3_generic_keccak_xof_KeccakXofState_97 *self,
+ Eurydice_slice out) {
if (self->sponge) {
- libcrux_sha3_generic_keccak_keccakf1600_21(&self->inner);
- }
- size_t out_len = Eurydice_slice_len(out[0U], uint8_t);
- size_t blocks = out_len / (size_t)168U;
- size_t last = out_len - out_len % (size_t)168U;
- size_t mid;
- if ((size_t)168U >= out_len) {
- mid = out_len;
- } else {
- mid = (size_t)168U;
+ libcrux_sha3_generic_keccak_keccakf1600_80_04(&self->inner);
}
- Eurydice_slice_uint8_t_1size_t__x2 uu____0 =
- libcrux_sha3_portable_keccak_split_at_mut_n_5a(out, mid);
- Eurydice_slice out00[1U];
- memcpy(out00, uu____0.fst, (size_t)1U * sizeof(Eurydice_slice));
- Eurydice_slice out_rest[1U];
- memcpy(out_rest, uu____0.snd, (size_t)1U * sizeof(Eurydice_slice));
- libcrux_sha3_portable_keccak_store_5a_1c0(self->inner.st, out00);
- core_ops_range_Range_b3 iter =
- core_iter_traits_collect___core__iter__traits__collect__IntoIterator_for_I__1__into_iter(
- (CLITERAL(core_ops_range_Range_b3){.start = (size_t)1U,
- .end = blocks}),
- core_ops_range_Range_b3, core_ops_range_Range_b3);
- while (true) {
- if (core_iter_range___core__iter__traits__iterator__Iterator_for_core__ops__range__Range_A___6__next(
- &iter, size_t, Option_b3)
- .tag == None) {
- break;
+ size_t out_len = Eurydice_slice_len(out, uint8_t);
+ if (out_len > (size_t)0U) {
+ if (out_len <= (size_t)168U) {
+ libcrux_sha3_simd_portable_squeeze_13_3a(&self->inner, out, (size_t)0U,
+ out_len);
} else {
- Eurydice_slice_uint8_t_1size_t__x2 uu____1 =
- libcrux_sha3_portable_keccak_split_at_mut_n_5a(out_rest,
- (size_t)168U);
- Eurydice_slice out0[1U];
- memcpy(out0, uu____1.fst, (size_t)1U * sizeof(Eurydice_slice));
- Eurydice_slice tmp[1U];
- memcpy(tmp, uu____1.snd, (size_t)1U * sizeof(Eurydice_slice));
- libcrux_sha3_generic_keccak_keccakf1600_21(&self->inner);
- libcrux_sha3_portable_keccak_store_5a_1c0(self->inner.st, out0);
- memcpy(out_rest, tmp, (size_t)1U * sizeof(Eurydice_slice));
+ size_t blocks = out_len / (size_t)168U;
+ for (size_t i = (size_t)0U; i < blocks; i++) {
+ size_t i0 = i;
+ libcrux_sha3_generic_keccak_keccakf1600_80_04(&self->inner);
+ libcrux_sha3_simd_portable_squeeze_13_3a(
+ &self->inner, out, i0 * (size_t)168U, (size_t)168U);
+ }
+ size_t remaining = out_len % (size_t)168U;
+ if (remaining > (size_t)0U) {
+ libcrux_sha3_generic_keccak_keccakf1600_80_04(&self->inner);
+ libcrux_sha3_simd_portable_squeeze_13_3a(
+ &self->inner, out, blocks * (size_t)168U, remaining);
+ }
}
+ self->sponge = true;
}
- if (last < out_len) {
- libcrux_sha3_generic_keccak_keccakf1600_21(&self->inner);
- libcrux_sha3_portable_keccak_store_5a_1c0(self->inner.st, out_rest);
- }
- self->sponge = true;
}
/**
Shake128 squeeze
*/
/**
-This function found in impl
-{(libcrux_sha3::portable::incremental::XofSqueeze<168: usize> for
-libcrux_sha3::portable::incremental::Shake128Squeeze)#1}
+This function found in impl {libcrux_sha3::portable::incremental::Xof<168usize>
+for libcrux_sha3::portable::incremental::Shake128Xof}
*/
-static inline void libcrux_sha3_portable_incremental_squeeze_10(
- libcrux_sha3_generic_keccak_KeccakXofState_78 *self, Eurydice_slice out) {
- Eurydice_slice buf[1U] = {out};
- libcrux_sha3_generic_keccak_squeeze_9d_960(self, buf);
+static inline void libcrux_sha3_portable_incremental_squeeze_26(
+ libcrux_sha3_generic_keccak_xof_KeccakXofState_97 *self,
+ Eurydice_slice out) {
+ libcrux_sha3_generic_keccak_xof_squeeze_85_13(self, out);
}
/**
-This function found in impl {(core::clone::Clone for
-libcrux_sha3::portable::KeccakState)}
+This function found in impl {core::clone::Clone for
+libcrux_sha3::portable::KeccakState}
*/
-static inline libcrux_sha3_generic_keccak_KeccakState_48
-libcrux_sha3_portable_clone_3d(
- libcrux_sha3_generic_keccak_KeccakState_48 *self) {
+static inline libcrux_sha3_generic_keccak_KeccakState_17
+libcrux_sha3_portable_clone_fe(
+ libcrux_sha3_generic_keccak_KeccakState_17 *self) {
return self[0U];
}
/**
-This function found in impl {(core::convert::From<libcrux_sha3::Algorithm> for
-u32)#1}
+This function found in impl {core::convert::From<libcrux_sha3::Algorithm> for
+u32}
*/
-static inline uint32_t libcrux_sha3_from_eb(libcrux_sha3_Algorithm v) {
- uint32_t uu____0;
+static inline uint32_t libcrux_sha3_from_6c(libcrux_sha3_Algorithm v) {
switch (v) {
- case libcrux_sha3_Sha224: {
- uu____0 = 1U;
+ case libcrux_sha3_Algorithm_Sha224: {
break;
}
- case libcrux_sha3_Sha256: {
- uu____0 = 2U;
- break;
+ case libcrux_sha3_Algorithm_Sha256: {
+ return 2U;
}
- case libcrux_sha3_Sha384: {
- uu____0 = 3U;
- break;
+ case libcrux_sha3_Algorithm_Sha384: {
+ return 3U;
}
- case libcrux_sha3_Sha512: {
- uu____0 = 4U;
- break;
+ case libcrux_sha3_Algorithm_Sha512: {
+ return 4U;
}
default: {
KRML_HOST_EPRINTF("KaRaMeL incomplete match at %s:%d\n", __FILE__,
@@ -5722,31 +5406,26 @@ static inline uint32_t libcrux_sha3_from_eb(libcrux_sha3_Algorithm v) {
KRML_HOST_EXIT(253U);
}
}
- return uu____0;
+ return 1U;
}
/**
-This function found in impl {(core::convert::From<u32> for
-libcrux_sha3::Algorithm)}
+This function found in impl {core::convert::From<u32> for
+libcrux_sha3::Algorithm}
*/
-static inline libcrux_sha3_Algorithm libcrux_sha3_from_2d(uint32_t v) {
- libcrux_sha3_Algorithm uu____0;
+static inline libcrux_sha3_Algorithm libcrux_sha3_from_29(uint32_t v) {
switch (v) {
case 1U: {
- uu____0 = libcrux_sha3_Sha224;
break;
}
case 2U: {
- uu____0 = libcrux_sha3_Sha256;
- break;
+ return libcrux_sha3_Algorithm_Sha256;
}
case 3U: {
- uu____0 = libcrux_sha3_Sha384;
- break;
+ return libcrux_sha3_Algorithm_Sha384;
}
case 4U: {
- uu____0 = libcrux_sha3_Sha512;
- break;
+ return libcrux_sha3_Algorithm_Sha512;
}
default: {
KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__,
@@ -5754,52 +5433,40 @@ static inline libcrux_sha3_Algorithm libcrux_sha3_from_2d(uint32_t v) {
KRML_HOST_EXIT(255U);
}
}
- return uu____0;
+ return libcrux_sha3_Algorithm_Sha224;
}
-typedef uint8_t libcrux_sha3_Sha3_512Digest[64U];
-
-typedef uint8_t libcrux_sha3_Sha3_384Digest[48U];
-
-typedef uint8_t libcrux_sha3_Sha3_256Digest[32U];
-
-typedef uint8_t libcrux_sha3_Sha3_224Digest[28U];
-
#if defined(__cplusplus)
}
#endif
-#define __libcrux_sha3_portable_H_DEFINED
-#endif
+#define libcrux_sha3_portable_H_DEFINED
+#endif /* libcrux_sha3_portable_H */
-/* from libcrux/libcrux-ml-kem/cg/libcrux_mlkem768_portable.h */
+/* from libcrux/libcrux-ml-kem/extracts/c_header_only/generated/libcrux_mlkem768_portable.h */
/*
- * SPDX-FileCopyrightText: 2024 Cryspen Sarl <info@cryspen.com>
+ * SPDX-FileCopyrightText: 2025 Cryspen Sarl <info@cryspen.com>
*
* SPDX-License-Identifier: MIT or Apache-2.0
*
* This code was generated with the following revisions:
- * Charon: 6b5e110342a771a3e1c739b10294b1778e4be8b4
- * Eurydice: 31be7d65ca5d6acdacfb33652e478d24dd85c1cb
- * Karamel: 3205d3365ea2790b02368f79fcee38e38d0b5908
- * F*: a32b316e521fa4f239b610ec8f1d15e78d62cbe8-dirty
- * Libcrux: 4ad532b206174114dd4140b718e7794a28fc59ee
+ * Charon: 667d2fc98984ff7f3df989c2367e6c1fa4a000e7
+ * Eurydice: 2381cbc416ef2ad0b561c362c500bc84f36b6785
+ * Karamel: 80f5435f2fc505973c469a4afcc8d875cddd0d8b
+ * F*: 71d8221589d4d438af3706d89cb653cf53e18aab
+ * Libcrux: 68dfed5a4a9e40277f62828471c029afed1ecdcc
*/
-#ifndef __libcrux_mlkem768_portable_H
-#define __libcrux_mlkem768_portable_H
+#ifndef libcrux_mlkem768_portable_H
+#define libcrux_mlkem768_portable_H
+
#if defined(__cplusplus)
extern "C" {
#endif
-#define LIBCRUX_ML_KEM_HASH_FUNCTIONS_BLOCK_SIZE ((size_t)168U)
-
-#define LIBCRUX_ML_KEM_HASH_FUNCTIONS_THREE_BLOCKS \
- (LIBCRUX_ML_KEM_HASH_FUNCTIONS_BLOCK_SIZE * (size_t)3U)
-
-static KRML_MUSTINLINE void libcrux_ml_kem_hash_functions_portable_G(
+static inline void libcrux_ml_kem_hash_functions_portable_G(
Eurydice_slice input, uint8_t ret[64U]) {
uint8_t digest[64U] = {0U};
libcrux_sha3_portable_sha512(
@@ -5807,7 +5474,7 @@ static KRML_MUSTINLINE void libcrux_ml_kem_hash_functions_portable_G(
memcpy(ret, digest, (size_t)64U * sizeof(uint8_t));
}
-static KRML_MUSTINLINE void libcrux_ml_kem_hash_functions_portable_H(
+static inline void libcrux_ml_kem_hash_functions_portable_H(
Eurydice_slice input, uint8_t ret[32U]) {
uint8_t digest[32U] = {0U};
libcrux_sha3_portable_sha256(
@@ -5815,15 +5482,6 @@ static KRML_MUSTINLINE void libcrux_ml_kem_hash_functions_portable_H(
memcpy(ret, digest, (size_t)32U * sizeof(uint8_t));
}
-#define LIBCRUX_ML_KEM_IND_CCA_ENCAPS_SEED_SIZE \
- (LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE)
-
-#define LIBCRUX_ML_KEM_IND_CCA_KEY_GENERATION_SEED_SIZE \
- (LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE + \
- LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE)
-
-typedef uint8_t libcrux_ml_kem_ind_cca_MlKemSharedSecret[32U];
-
static const int16_t libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[128U] =
{(int16_t)-1044, (int16_t)-758, (int16_t)-359, (int16_t)-1517,
(int16_t)1493, (int16_t)1422, (int16_t)287, (int16_t)202,
@@ -5858,17 +5516,19 @@ static const int16_t libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[128U] =
(int16_t)-108, (int16_t)-308, (int16_t)996, (int16_t)991,
(int16_t)958, (int16_t)-1460, (int16_t)1522, (int16_t)1628};
-#define LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR ((size_t)16U)
+static KRML_MUSTINLINE int16_t libcrux_ml_kem_polynomial_zeta(size_t i) {
+ return libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[i];
+}
-#define LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT \
- (LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT / \
- LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR)
+#define LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT ((size_t)16U)
-#define LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS ((int16_t)3329)
+#define LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR ((size_t)16U)
#define LIBCRUX_ML_KEM_VECTOR_TRAITS_MONTGOMERY_R_SQUARED_MOD_FIELD_MODULUS \
((int16_t)1353)
+#define LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS ((int16_t)3329)
+
#define LIBCRUX_ML_KEM_VECTOR_TRAITS_INVERSE_OF_MODULUS_MOD_MONTGOMERY_R \
(62209U)
@@ -5881,155 +5541,23 @@ libcrux_ml_kem_vector_portable_vector_type_from_i16_array(
Eurydice_slice array) {
libcrux_ml_kem_vector_portable_vector_type_PortableVector lit;
int16_t ret[16U];
- Result_c0 dst;
+ Result_0a dst;
Eurydice_slice_to_array2(
- &dst, Eurydice_slice_subslice2(array, (size_t)0U, (size_t)16U, int16_t),
- Eurydice_slice, int16_t[16U]);
- unwrap_41_f9(dst, ret);
+ &dst, Eurydice_slice_subslice3(array, (size_t)0U, (size_t)16U, int16_t *),
+ Eurydice_slice, int16_t[16U], TryFromSliceError);
+ unwrap_26_00(dst, ret);
memcpy(lit.elements, ret, (size_t)16U * sizeof(int16_t));
return lit;
}
/**
-This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
-libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
+This function found in impl {libcrux_ml_kem::vector::traits::Operations for
+libcrux_ml_kem::vector::portable::vector_type::PortableVector}
*/
static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
-libcrux_ml_kem_vector_portable_from_i16_array_0d(Eurydice_slice array) {
- return libcrux_ml_kem_vector_portable_vector_type_from_i16_array(array);
-}
-
-typedef struct uint8_t_x11_s {
- uint8_t fst;
- uint8_t snd;
- uint8_t thd;
- uint8_t f3;
- uint8_t f4;
- uint8_t f5;
- uint8_t f6;
- uint8_t f7;
- uint8_t f8;
- uint8_t f9;
- uint8_t f10;
-} uint8_t_x11;
-
-static KRML_MUSTINLINE uint8_t_x11
-libcrux_ml_kem_vector_portable_serialize_serialize_11_int(Eurydice_slice v) {
- uint8_t r0 = (uint8_t)Eurydice_slice_index(v, (size_t)0U, int16_t, int16_t *);
- uint8_t r1 = (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)1U, int16_t,
- int16_t *) &
- (int16_t)31)
- << 3U |
- (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)0U, int16_t,
- int16_t *) >>
- 8U);
- uint8_t r2 = (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)2U, int16_t,
- int16_t *) &
- (int16_t)3)
- << 6U |
- (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)1U, int16_t,
- int16_t *) >>
- 5U);
- uint8_t r3 =
- (uint8_t)(Eurydice_slice_index(v, (size_t)2U, int16_t, int16_t *) >> 2U &
- (int16_t)255);
- uint8_t r4 = (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)3U, int16_t,
- int16_t *) &
- (int16_t)127)
- << 1U |
- (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)2U, int16_t,
- int16_t *) >>
- 10U);
- uint8_t r5 = (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)4U, int16_t,
- int16_t *) &
- (int16_t)15)
- << 4U |
- (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)3U, int16_t,
- int16_t *) >>
- 7U);
- uint8_t r6 = (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)5U, int16_t,
- int16_t *) &
- (int16_t)1)
- << 7U |
- (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)4U, int16_t,
- int16_t *) >>
- 4U);
- uint8_t r7 =
- (uint8_t)(Eurydice_slice_index(v, (size_t)5U, int16_t, int16_t *) >> 1U &
- (int16_t)255);
- uint8_t r8 = (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)6U, int16_t,
- int16_t *) &
- (int16_t)63)
- << 2U |
- (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)5U, int16_t,
- int16_t *) >>
- 9U);
- uint8_t r9 = (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)7U, int16_t,
- int16_t *) &
- (int16_t)7)
- << 5U |
- (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)6U, int16_t,
- int16_t *) >>
- 6U);
- uint8_t r10 =
- (uint8_t)(Eurydice_slice_index(v, (size_t)7U, int16_t, int16_t *) >> 3U);
- return (CLITERAL(uint8_t_x11){.fst = r0,
- .snd = r1,
- .thd = r2,
- .f3 = r3,
- .f4 = r4,
- .f5 = r5,
- .f6 = r6,
- .f7 = r7,
- .f8 = r8,
- .f9 = r9,
- .f10 = r10});
-}
-
-static KRML_MUSTINLINE void
-libcrux_ml_kem_vector_portable_serialize_serialize_11(
- libcrux_ml_kem_vector_portable_vector_type_PortableVector v,
- uint8_t ret[22U]) {
- uint8_t_x11 r0_10 = libcrux_ml_kem_vector_portable_serialize_serialize_11_int(
- Eurydice_array_to_subslice2(v.elements, (size_t)0U, (size_t)8U, int16_t));
- uint8_t_x11 r11_21 =
- libcrux_ml_kem_vector_portable_serialize_serialize_11_int(
- Eurydice_array_to_subslice2(v.elements, (size_t)8U, (size_t)16U,
- int16_t));
- uint8_t result[22U] = {0U};
- result[0U] = r0_10.fst;
- result[1U] = r0_10.snd;
- result[2U] = r0_10.thd;
- result[3U] = r0_10.f3;
- result[4U] = r0_10.f4;
- result[5U] = r0_10.f5;
- result[6U] = r0_10.f6;
- result[7U] = r0_10.f7;
- result[8U] = r0_10.f8;
- result[9U] = r0_10.f9;
- result[10U] = r0_10.f10;
- result[11U] = r11_21.fst;
- result[12U] = r11_21.snd;
- result[13U] = r11_21.thd;
- result[14U] = r11_21.f3;
- result[15U] = r11_21.f4;
- result[16U] = r11_21.f5;
- result[17U] = r11_21.f6;
- result[18U] = r11_21.f7;
- result[19U] = r11_21.f8;
- result[20U] = r11_21.f9;
- result[21U] = r11_21.f10;
- memcpy(ret, result, (size_t)22U * sizeof(uint8_t));
-}
-
-/**
-This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
-libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
-*/
-static inline void libcrux_ml_kem_vector_portable_serialize_11_0d(
- libcrux_ml_kem_vector_portable_vector_type_PortableVector a,
- uint8_t ret[22U]) {
- libcrux_ml_kem_vector_portable_serialize_serialize_11(a, ret);
+libcrux_ml_kem_vector_portable_from_i16_array_b8(Eurydice_slice array) {
+ return libcrux_ml_kem_vector_portable_vector_type_from_i16_array(
+ libcrux_secrets_int_classify_public_classify_ref_9b_39(array));
}
typedef struct int16_t_x8_s {
@@ -6043,666 +5571,22 @@ typedef struct int16_t_x8_s {
int16_t f7;
} int16_t_x8;
-static KRML_MUSTINLINE int16_t_x8
-libcrux_ml_kem_vector_portable_serialize_deserialize_11_int(
- Eurydice_slice bytes) {
- int16_t r0 =
- ((int16_t)Eurydice_slice_index(bytes, (size_t)1U, uint8_t, uint8_t *) &
- (int16_t)7)
- << 8U |
- (int16_t)Eurydice_slice_index(bytes, (size_t)0U, uint8_t, uint8_t *);
- int16_t r1 =
- ((int16_t)Eurydice_slice_index(bytes, (size_t)2U, uint8_t, uint8_t *) &
- (int16_t)63)
- << 5U |
- (int16_t)Eurydice_slice_index(bytes, (size_t)1U, uint8_t, uint8_t *) >>
- 3U;
- int16_t r2 =
- (((int16_t)Eurydice_slice_index(bytes, (size_t)4U, uint8_t, uint8_t *) &
- (int16_t)1)
- << 10U |
- (int16_t)Eurydice_slice_index(bytes, (size_t)3U, uint8_t, uint8_t *)
- << 2U) |
- (int16_t)Eurydice_slice_index(bytes, (size_t)2U, uint8_t, uint8_t *) >>
- 6U;
- int16_t r3 =
- ((int16_t)Eurydice_slice_index(bytes, (size_t)5U, uint8_t, uint8_t *) &
- (int16_t)15)
- << 7U |
- (int16_t)Eurydice_slice_index(bytes, (size_t)4U, uint8_t, uint8_t *) >>
- 1U;
- int16_t r4 =
- ((int16_t)Eurydice_slice_index(bytes, (size_t)6U, uint8_t, uint8_t *) &
- (int16_t)127)
- << 4U |
- (int16_t)Eurydice_slice_index(bytes, (size_t)5U, uint8_t, uint8_t *) >>
- 4U;
- int16_t r5 =
- (((int16_t)Eurydice_slice_index(bytes, (size_t)8U, uint8_t, uint8_t *) &
- (int16_t)3)
- << 9U |
- (int16_t)Eurydice_slice_index(bytes, (size_t)7U, uint8_t, uint8_t *)
- << 1U) |
- (int16_t)Eurydice_slice_index(bytes, (size_t)6U, uint8_t, uint8_t *) >>
- 7U;
- int16_t r6 =
- ((int16_t)Eurydice_slice_index(bytes, (size_t)9U, uint8_t, uint8_t *) &
- (int16_t)31)
- << 6U |
- (int16_t)Eurydice_slice_index(bytes, (size_t)8U, uint8_t, uint8_t *) >>
- 2U;
- int16_t r7 =
- (int16_t)Eurydice_slice_index(bytes, (size_t)10U, uint8_t, uint8_t *)
- << 3U |
- (int16_t)Eurydice_slice_index(bytes, (size_t)9U, uint8_t, uint8_t *) >>
- 5U;
- return (CLITERAL(int16_t_x8){.fst = r0,
- .snd = r1,
- .thd = r2,
- .f3 = r3,
- .f4 = r4,
- .f5 = r5,
- .f6 = r6,
- .f7 = r7});
-}
-
static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_vector_type_zero(void) {
libcrux_ml_kem_vector_portable_vector_type_PortableVector lit;
- lit.elements[0U] = (int16_t)0;
- lit.elements[1U] = (int16_t)0;
- lit.elements[2U] = (int16_t)0;
- lit.elements[3U] = (int16_t)0;
- lit.elements[4U] = (int16_t)0;
- lit.elements[5U] = (int16_t)0;
- lit.elements[6U] = (int16_t)0;
- lit.elements[7U] = (int16_t)0;
- lit.elements[8U] = (int16_t)0;
- lit.elements[9U] = (int16_t)0;
- lit.elements[10U] = (int16_t)0;
- lit.elements[11U] = (int16_t)0;
- lit.elements[12U] = (int16_t)0;
- lit.elements[13U] = (int16_t)0;
- lit.elements[14U] = (int16_t)0;
- lit.elements[15U] = (int16_t)0;
+ int16_t ret[16U];
+ int16_t buf[16U] = {0U};
+ libcrux_secrets_int_public_integers_classify_27_46(buf, ret);
+ memcpy(lit.elements, ret, (size_t)16U * sizeof(int16_t));
return lit;
}
-static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
-libcrux_ml_kem_vector_portable_serialize_deserialize_11(Eurydice_slice bytes) {
- int16_t_x8 v0_7 = libcrux_ml_kem_vector_portable_serialize_deserialize_11_int(
- Eurydice_slice_subslice2(bytes, (size_t)0U, (size_t)11U, uint8_t));
- int16_t_x8 v8_15 =
- libcrux_ml_kem_vector_portable_serialize_deserialize_11_int(
- Eurydice_slice_subslice2(bytes, (size_t)11U, (size_t)22U, uint8_t));
- libcrux_ml_kem_vector_portable_vector_type_PortableVector v =
- libcrux_ml_kem_vector_portable_vector_type_zero();
- v.elements[0U] = v0_7.fst;
- v.elements[1U] = v0_7.snd;
- v.elements[2U] = v0_7.thd;
- v.elements[3U] = v0_7.f3;
- v.elements[4U] = v0_7.f4;
- v.elements[5U] = v0_7.f5;
- v.elements[6U] = v0_7.f6;
- v.elements[7U] = v0_7.f7;
- v.elements[8U] = v8_15.fst;
- v.elements[9U] = v8_15.snd;
- v.elements[10U] = v8_15.thd;
- v.elements[11U] = v8_15.f3;
- v.elements[12U] = v8_15.f4;
- v.elements[13U] = v8_15.f5;
- v.elements[14U] = v8_15.f6;
- v.elements[15U] = v8_15.f7;
- return v;
-}
-
-/**
-This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
-libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
-*/
-static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
-libcrux_ml_kem_vector_portable_deserialize_11_0d(Eurydice_slice a) {
- return libcrux_ml_kem_vector_portable_serialize_deserialize_11(a);
-}
-
-static KRML_MUSTINLINE void
-libcrux_ml_kem_vector_portable_vector_type_to_i16_array(
- libcrux_ml_kem_vector_portable_vector_type_PortableVector x,
- int16_t ret[16U]) {
- memcpy(ret, x.elements, (size_t)16U * sizeof(int16_t));
-}
-
-/**
-This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
-libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
-*/
-static inline void libcrux_ml_kem_vector_portable_to_i16_array_0d(
- libcrux_ml_kem_vector_portable_vector_type_PortableVector x,
- int16_t ret[16U]) {
- libcrux_ml_kem_vector_portable_vector_type_to_i16_array(x, ret);
-}
-
-static const uint8_t
- libcrux_ml_kem_vector_rej_sample_table_REJECTION_SAMPLE_SHUFFLE_TABLE
- [256U][16U] = {{255U, 255U, 255U, 255U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 255U, 255U, 255U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U, 255U},
- {2U, 3U, 255U, 255U, 255U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 255U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U, 255U},
- {4U, 5U, 255U, 255U, 255U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 4U, 5U, 255U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U, 255U},
- {2U, 3U, 4U, 5U, 255U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 4U, 5U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {6U, 7U, 255U, 255U, 255U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 6U, 7U, 255U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U, 255U},
- {2U, 3U, 6U, 7U, 255U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 6U, 7U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {4U, 5U, 6U, 7U, 255U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 4U, 5U, 6U, 7U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {2U, 3U, 4U, 5U, 6U, 7U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U},
- {8U, 9U, 255U, 255U, 255U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 8U, 9U, 255U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U, 255U},
- {2U, 3U, 8U, 9U, 255U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 8U, 9U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {4U, 5U, 8U, 9U, 255U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 4U, 5U, 8U, 9U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {2U, 3U, 4U, 5U, 8U, 9U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 4U, 5U, 8U, 9U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U},
- {6U, 7U, 8U, 9U, 255U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 6U, 7U, 8U, 9U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {2U, 3U, 6U, 7U, 8U, 9U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 6U, 7U, 8U, 9U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U},
- {4U, 5U, 6U, 7U, 8U, 9U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 4U, 5U, 6U, 7U, 8U, 9U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U},
- {2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 255U, 255U,
- 255U, 255U, 255U, 255U},
- {10U, 11U, 255U, 255U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 10U, 11U, 255U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U, 255U},
- {2U, 3U, 10U, 11U, 255U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 10U, 11U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {4U, 5U, 10U, 11U, 255U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 4U, 5U, 10U, 11U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {2U, 3U, 4U, 5U, 10U, 11U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 4U, 5U, 10U, 11U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {6U, 7U, 10U, 11U, 255U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 6U, 7U, 10U, 11U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {2U, 3U, 6U, 7U, 10U, 11U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 6U, 7U, 10U, 11U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {4U, 5U, 6U, 7U, 10U, 11U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 4U, 5U, 6U, 7U, 10U, 11U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {2U, 3U, 4U, 5U, 6U, 7U, 10U, 11U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 10U, 11U, 255U, 255U,
- 255U, 255U, 255U, 255U},
- {8U, 9U, 10U, 11U, 255U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 8U, 9U, 10U, 11U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {2U, 3U, 8U, 9U, 10U, 11U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 8U, 9U, 10U, 11U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {4U, 5U, 8U, 9U, 10U, 11U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 4U, 5U, 8U, 9U, 10U, 11U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {2U, 3U, 4U, 5U, 8U, 9U, 10U, 11U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 4U, 5U, 8U, 9U, 10U, 11U, 255U, 255U,
- 255U, 255U, 255U, 255U},
- {6U, 7U, 8U, 9U, 10U, 11U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 6U, 7U, 8U, 9U, 10U, 11U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {2U, 3U, 6U, 7U, 8U, 9U, 10U, 11U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 6U, 7U, 8U, 9U, 10U, 11U, 255U, 255U,
- 255U, 255U, 255U, 255U},
- {4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 255U, 255U,
- 255U, 255U, 255U, 255U},
- {2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 255U, 255U,
- 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 255U,
- 255U, 255U, 255U},
- {12U, 13U, 255U, 255U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 12U, 13U, 255U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U, 255U},
- {2U, 3U, 12U, 13U, 255U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 12U, 13U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {4U, 5U, 12U, 13U, 255U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 4U, 5U, 12U, 13U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {2U, 3U, 4U, 5U, 12U, 13U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 4U, 5U, 12U, 13U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {6U, 7U, 12U, 13U, 255U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 6U, 7U, 12U, 13U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {2U, 3U, 6U, 7U, 12U, 13U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 6U, 7U, 12U, 13U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {4U, 5U, 6U, 7U, 12U, 13U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 4U, 5U, 6U, 7U, 12U, 13U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {2U, 3U, 4U, 5U, 6U, 7U, 12U, 13U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 12U, 13U, 255U, 255U,
- 255U, 255U, 255U, 255U},
- {8U, 9U, 12U, 13U, 255U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 8U, 9U, 12U, 13U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {2U, 3U, 8U, 9U, 12U, 13U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 8U, 9U, 12U, 13U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {4U, 5U, 8U, 9U, 12U, 13U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 4U, 5U, 8U, 9U, 12U, 13U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {2U, 3U, 4U, 5U, 8U, 9U, 12U, 13U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 4U, 5U, 8U, 9U, 12U, 13U, 255U, 255U,
- 255U, 255U, 255U, 255U},
- {6U, 7U, 8U, 9U, 12U, 13U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 6U, 7U, 8U, 9U, 12U, 13U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {2U, 3U, 6U, 7U, 8U, 9U, 12U, 13U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 6U, 7U, 8U, 9U, 12U, 13U, 255U, 255U,
- 255U, 255U, 255U, 255U},
- {4U, 5U, 6U, 7U, 8U, 9U, 12U, 13U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 4U, 5U, 6U, 7U, 8U, 9U, 12U, 13U, 255U, 255U,
- 255U, 255U, 255U, 255U},
- {2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 12U, 13U, 255U, 255U,
- 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 12U, 13U, 255U,
- 255U, 255U, 255U},
- {10U, 11U, 12U, 13U, 255U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 10U, 11U, 12U, 13U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U, 255U},
- {2U, 3U, 10U, 11U, 12U, 13U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 10U, 11U, 12U, 13U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {4U, 5U, 10U, 11U, 12U, 13U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 4U, 5U, 10U, 11U, 12U, 13U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {2U, 3U, 4U, 5U, 10U, 11U, 12U, 13U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 4U, 5U, 10U, 11U, 12U, 13U, 255U, 255U,
- 255U, 255U, 255U, 255U},
- {6U, 7U, 10U, 11U, 12U, 13U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 6U, 7U, 10U, 11U, 12U, 13U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {2U, 3U, 6U, 7U, 10U, 11U, 12U, 13U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 6U, 7U, 10U, 11U, 12U, 13U, 255U, 255U,
- 255U, 255U, 255U, 255U},
- {4U, 5U, 6U, 7U, 10U, 11U, 12U, 13U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 4U, 5U, 6U, 7U, 10U, 11U, 12U, 13U, 255U, 255U,
- 255U, 255U, 255U, 255U},
- {2U, 3U, 4U, 5U, 6U, 7U, 10U, 11U, 12U, 13U, 255U, 255U,
- 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 10U, 11U, 12U, 13U,
- 255U, 255U, 255U, 255U},
- {8U, 9U, 10U, 11U, 12U, 13U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 8U, 9U, 10U, 11U, 12U, 13U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {2U, 3U, 8U, 9U, 10U, 11U, 12U, 13U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 8U, 9U, 10U, 11U, 12U, 13U, 255U, 255U,
- 255U, 255U, 255U, 255U},
- {4U, 5U, 8U, 9U, 10U, 11U, 12U, 13U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 4U, 5U, 8U, 9U, 10U, 11U, 12U, 13U, 255U, 255U,
- 255U, 255U, 255U, 255U},
- {2U, 3U, 4U, 5U, 8U, 9U, 10U, 11U, 12U, 13U, 255U, 255U,
- 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 4U, 5U, 8U, 9U, 10U, 11U, 12U, 13U,
- 255U, 255U, 255U, 255U},
- {6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 255U, 255U,
- 255U, 255U, 255U, 255U},
- {2U, 3U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 255U, 255U,
- 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U,
- 255U, 255U, 255U, 255U},
- {4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 255U, 255U,
- 255U, 255U, 255U, 255U},
- {0U, 1U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U,
- 255U, 255U, 255U, 255U},
- {2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U,
- 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 12U,
- 13U, 255U, 255U},
- {14U, 15U, 255U, 255U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 14U, 15U, 255U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U, 255U},
- {2U, 3U, 14U, 15U, 255U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 14U, 15U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {4U, 5U, 14U, 15U, 255U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 4U, 5U, 14U, 15U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {2U, 3U, 4U, 5U, 14U, 15U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 4U, 5U, 14U, 15U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {6U, 7U, 14U, 15U, 255U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 6U, 7U, 14U, 15U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {2U, 3U, 6U, 7U, 14U, 15U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 6U, 7U, 14U, 15U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {4U, 5U, 6U, 7U, 14U, 15U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 4U, 5U, 6U, 7U, 14U, 15U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {2U, 3U, 4U, 5U, 6U, 7U, 14U, 15U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 14U, 15U, 255U, 255U,
- 255U, 255U, 255U, 255U},
- {8U, 9U, 14U, 15U, 255U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 8U, 9U, 14U, 15U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {2U, 3U, 8U, 9U, 14U, 15U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 8U, 9U, 14U, 15U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {4U, 5U, 8U, 9U, 14U, 15U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 4U, 5U, 8U, 9U, 14U, 15U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {2U, 3U, 4U, 5U, 8U, 9U, 14U, 15U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 4U, 5U, 8U, 9U, 14U, 15U, 255U, 255U,
- 255U, 255U, 255U, 255U},
- {6U, 7U, 8U, 9U, 14U, 15U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 6U, 7U, 8U, 9U, 14U, 15U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {2U, 3U, 6U, 7U, 8U, 9U, 14U, 15U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 6U, 7U, 8U, 9U, 14U, 15U, 255U, 255U,
- 255U, 255U, 255U, 255U},
- {4U, 5U, 6U, 7U, 8U, 9U, 14U, 15U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 4U, 5U, 6U, 7U, 8U, 9U, 14U, 15U, 255U, 255U,
- 255U, 255U, 255U, 255U},
- {2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 14U, 15U, 255U, 255U,
- 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 14U, 15U, 255U,
- 255U, 255U, 255U},
- {10U, 11U, 14U, 15U, 255U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 10U, 11U, 14U, 15U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U, 255U},
- {2U, 3U, 10U, 11U, 14U, 15U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 10U, 11U, 14U, 15U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {4U, 5U, 10U, 11U, 14U, 15U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 4U, 5U, 10U, 11U, 14U, 15U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {2U, 3U, 4U, 5U, 10U, 11U, 14U, 15U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 4U, 5U, 10U, 11U, 14U, 15U, 255U, 255U,
- 255U, 255U, 255U, 255U},
- {6U, 7U, 10U, 11U, 14U, 15U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 6U, 7U, 10U, 11U, 14U, 15U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {2U, 3U, 6U, 7U, 10U, 11U, 14U, 15U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 6U, 7U, 10U, 11U, 14U, 15U, 255U, 255U,
- 255U, 255U, 255U, 255U},
- {4U, 5U, 6U, 7U, 10U, 11U, 14U, 15U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 4U, 5U, 6U, 7U, 10U, 11U, 14U, 15U, 255U, 255U,
- 255U, 255U, 255U, 255U},
- {2U, 3U, 4U, 5U, 6U, 7U, 10U, 11U, 14U, 15U, 255U, 255U,
- 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 10U, 11U, 14U, 15U,
- 255U, 255U, 255U, 255U},
- {8U, 9U, 10U, 11U, 14U, 15U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 8U, 9U, 10U, 11U, 14U, 15U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {2U, 3U, 8U, 9U, 10U, 11U, 14U, 15U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 8U, 9U, 10U, 11U, 14U, 15U, 255U, 255U,
- 255U, 255U, 255U, 255U},
- {4U, 5U, 8U, 9U, 10U, 11U, 14U, 15U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 4U, 5U, 8U, 9U, 10U, 11U, 14U, 15U, 255U, 255U,
- 255U, 255U, 255U, 255U},
- {2U, 3U, 4U, 5U, 8U, 9U, 10U, 11U, 14U, 15U, 255U, 255U,
- 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 4U, 5U, 8U, 9U, 10U, 11U, 14U, 15U,
- 255U, 255U, 255U, 255U},
- {6U, 7U, 8U, 9U, 10U, 11U, 14U, 15U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 6U, 7U, 8U, 9U, 10U, 11U, 14U, 15U, 255U, 255U,
- 255U, 255U, 255U, 255U},
- {2U, 3U, 6U, 7U, 8U, 9U, 10U, 11U, 14U, 15U, 255U, 255U,
- 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 6U, 7U, 8U, 9U, 10U, 11U, 14U, 15U,
- 255U, 255U, 255U, 255U},
- {4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 14U, 15U, 255U, 255U,
- 255U, 255U, 255U, 255U},
- {0U, 1U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 14U, 15U,
- 255U, 255U, 255U, 255U},
- {2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 14U, 15U,
- 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 14U,
- 15U, 255U, 255U},
- {12U, 13U, 14U, 15U, 255U, 255U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 12U, 13U, 14U, 15U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U, 255U},
- {2U, 3U, 12U, 13U, 14U, 15U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 12U, 13U, 14U, 15U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {4U, 5U, 12U, 13U, 14U, 15U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 4U, 5U, 12U, 13U, 14U, 15U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {2U, 3U, 4U, 5U, 12U, 13U, 14U, 15U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 4U, 5U, 12U, 13U, 14U, 15U, 255U, 255U,
- 255U, 255U, 255U, 255U},
- {6U, 7U, 12U, 13U, 14U, 15U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 6U, 7U, 12U, 13U, 14U, 15U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {2U, 3U, 6U, 7U, 12U, 13U, 14U, 15U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 6U, 7U, 12U, 13U, 14U, 15U, 255U, 255U,
- 255U, 255U, 255U, 255U},
- {4U, 5U, 6U, 7U, 12U, 13U, 14U, 15U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 4U, 5U, 6U, 7U, 12U, 13U, 14U, 15U, 255U, 255U,
- 255U, 255U, 255U, 255U},
- {2U, 3U, 4U, 5U, 6U, 7U, 12U, 13U, 14U, 15U, 255U, 255U,
- 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 12U, 13U, 14U, 15U,
- 255U, 255U, 255U, 255U},
- {8U, 9U, 12U, 13U, 14U, 15U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 8U, 9U, 12U, 13U, 14U, 15U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {2U, 3U, 8U, 9U, 12U, 13U, 14U, 15U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 8U, 9U, 12U, 13U, 14U, 15U, 255U, 255U,
- 255U, 255U, 255U, 255U},
- {4U, 5U, 8U, 9U, 12U, 13U, 14U, 15U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 4U, 5U, 8U, 9U, 12U, 13U, 14U, 15U, 255U, 255U,
- 255U, 255U, 255U, 255U},
- {2U, 3U, 4U, 5U, 8U, 9U, 12U, 13U, 14U, 15U, 255U, 255U,
- 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 4U, 5U, 8U, 9U, 12U, 13U, 14U, 15U,
- 255U, 255U, 255U, 255U},
- {6U, 7U, 8U, 9U, 12U, 13U, 14U, 15U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 6U, 7U, 8U, 9U, 12U, 13U, 14U, 15U, 255U, 255U,
- 255U, 255U, 255U, 255U},
- {2U, 3U, 6U, 7U, 8U, 9U, 12U, 13U, 14U, 15U, 255U, 255U,
- 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 6U, 7U, 8U, 9U, 12U, 13U, 14U, 15U,
- 255U, 255U, 255U, 255U},
- {4U, 5U, 6U, 7U, 8U, 9U, 12U, 13U, 14U, 15U, 255U, 255U,
- 255U, 255U, 255U, 255U},
- {0U, 1U, 4U, 5U, 6U, 7U, 8U, 9U, 12U, 13U, 14U, 15U,
- 255U, 255U, 255U, 255U},
- {2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 12U, 13U, 14U, 15U,
- 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 12U, 13U, 14U,
- 15U, 255U, 255U},
- {10U, 11U, 12U, 13U, 14U, 15U, 255U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 10U, 11U, 12U, 13U, 14U, 15U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {2U, 3U, 10U, 11U, 12U, 13U, 14U, 15U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 10U, 11U, 12U, 13U, 14U, 15U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {4U, 5U, 10U, 11U, 12U, 13U, 14U, 15U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 4U, 5U, 10U, 11U, 12U, 13U, 14U, 15U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {2U, 3U, 4U, 5U, 10U, 11U, 12U, 13U, 14U, 15U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 4U, 5U, 10U, 11U, 12U, 13U, 14U, 15U,
- 255U, 255U, 255U, 255U},
- {6U, 7U, 10U, 11U, 12U, 13U, 14U, 15U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 6U, 7U, 10U, 11U, 12U, 13U, 14U, 15U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {2U, 3U, 6U, 7U, 10U, 11U, 12U, 13U, 14U, 15U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 6U, 7U, 10U, 11U, 12U, 13U, 14U, 15U,
- 255U, 255U, 255U, 255U},
- {4U, 5U, 6U, 7U, 10U, 11U, 12U, 13U, 14U, 15U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 4U, 5U, 6U, 7U, 10U, 11U, 12U, 13U, 14U, 15U,
- 255U, 255U, 255U, 255U},
- {2U, 3U, 4U, 5U, 6U, 7U, 10U, 11U, 12U, 13U, 14U, 15U,
- 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 10U, 11U, 12U, 13U, 14U,
- 15U, 255U, 255U},
- {8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U, 255U, 255U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {2U, 3U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U,
- 255U, 255U, 255U, 255U},
- {4U, 5U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 4U, 5U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U,
- 255U, 255U, 255U, 255U},
- {2U, 3U, 4U, 5U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U,
- 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 4U, 5U, 8U, 9U, 10U, 11U, 12U, 13U, 14U,
- 15U, 255U, 255U},
- {6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U, 255U,
- 255U, 255U, 255U, 255U, 255U},
- {0U, 1U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U,
- 255U, 255U, 255U, 255U},
- {2U, 3U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U,
- 255U, 255U, 255U, 255U},
- {0U, 1U, 2U, 3U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 14U,
- 15U, 255U, 255U},
- {4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U,
- 255U, 255U, 255U, 255U},
- {0U, 1U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 14U,
- 15U, 255U, 255U},
- {2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 14U,
- 15U, 255U, 255U},
- {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 12U,
- 13U, 14U, 15U}};
-
/**
-This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
-libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
+This function found in impl {libcrux_ml_kem::vector::traits::Operations for
+libcrux_ml_kem::vector::portable::vector_type::PortableVector}
*/
static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
-libcrux_ml_kem_vector_portable_ZERO_0d(void) {
+libcrux_ml_kem_vector_portable_ZERO_b8(void) {
return libcrux_ml_kem_vector_portable_vector_type_zero();
}
@@ -6720,11 +5604,11 @@ libcrux_ml_kem_vector_portable_arithmetic_add(
}
/**
-This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
-libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
+This function found in impl {libcrux_ml_kem::vector::traits::Operations for
+libcrux_ml_kem::vector::portable::vector_type::PortableVector}
*/
static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
-libcrux_ml_kem_vector_portable_add_0d(
+libcrux_ml_kem_vector_portable_add_b8(
libcrux_ml_kem_vector_portable_vector_type_PortableVector lhs,
libcrux_ml_kem_vector_portable_vector_type_PortableVector *rhs) {
return libcrux_ml_kem_vector_portable_arithmetic_add(lhs, rhs);
@@ -6744,11 +5628,11 @@ libcrux_ml_kem_vector_portable_arithmetic_sub(
}
/**
-This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
-libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
+This function found in impl {libcrux_ml_kem::vector::traits::Operations for
+libcrux_ml_kem::vector::portable::vector_type::PortableVector}
*/
static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
-libcrux_ml_kem_vector_portable_sub_0d(
+libcrux_ml_kem_vector_portable_sub_b8(
libcrux_ml_kem_vector_portable_vector_type_PortableVector lhs,
libcrux_ml_kem_vector_portable_vector_type_PortableVector *rhs) {
return libcrux_ml_kem_vector_portable_arithmetic_sub(lhs, rhs);
@@ -6756,80 +5640,51 @@ libcrux_ml_kem_vector_portable_sub_0d(
static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_arithmetic_multiply_by_constant(
- libcrux_ml_kem_vector_portable_vector_type_PortableVector v, int16_t c) {
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector vec, int16_t c) {
for (size_t i = (size_t)0U;
i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
size_t i0 = i;
size_t uu____0 = i0;
- v.elements[uu____0] = v.elements[uu____0] * c;
+ vec.elements[uu____0] = vec.elements[uu____0] * c;
}
- return v;
+ return vec;
}
/**
-This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
-libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
+This function found in impl {libcrux_ml_kem::vector::traits::Operations for
+libcrux_ml_kem::vector::portable::vector_type::PortableVector}
*/
static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
-libcrux_ml_kem_vector_portable_multiply_by_constant_0d(
- libcrux_ml_kem_vector_portable_vector_type_PortableVector v, int16_t c) {
- return libcrux_ml_kem_vector_portable_arithmetic_multiply_by_constant(v, c);
-}
-
-static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
-libcrux_ml_kem_vector_portable_arithmetic_bitwise_and_with_constant(
- libcrux_ml_kem_vector_portable_vector_type_PortableVector v, int16_t c) {
- for (size_t i = (size_t)0U;
- i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
- size_t i0 = i;
- size_t uu____0 = i0;
- v.elements[uu____0] = v.elements[uu____0] & c;
- }
- return v;
+libcrux_ml_kem_vector_portable_multiply_by_constant_b8(
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector vec, int16_t c) {
+ return libcrux_ml_kem_vector_portable_arithmetic_multiply_by_constant(vec, c);
}
/**
-This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
-libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
+ Note: This function is not secret independent
+ Only use with public values.
*/
-static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
-libcrux_ml_kem_vector_portable_bitwise_and_with_constant_0d(
- libcrux_ml_kem_vector_portable_vector_type_PortableVector v, int16_t c) {
- return libcrux_ml_kem_vector_portable_arithmetic_bitwise_and_with_constant(v,
- c);
-}
-
static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_arithmetic_cond_subtract_3329(
- libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
- core_ops_range_Range_b3 iter =
- core_iter_traits_collect___core__iter__traits__collect__IntoIterator_for_I__1__into_iter(
- (CLITERAL(core_ops_range_Range_b3){
- .start = (size_t)0U,
- .end = LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR}),
- core_ops_range_Range_b3, core_ops_range_Range_b3);
- while (true) {
- Option_b3 uu____0 =
- core_iter_range___core__iter__traits__iterator__Iterator_for_core__ops__range__Range_A___6__next(
- &iter, size_t, Option_b3);
- if (!(uu____0.tag == None)) {
- size_t i = uu____0.f0;
- if (v.elements[i] >= (int16_t)3329) {
- size_t uu____1 = i;
- v.elements[uu____1] = v.elements[uu____1] - (int16_t)3329;
- }
- continue;
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector vec) {
+ for (size_t i = (size_t)0U;
+ i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
+ size_t i0 = i;
+ if (libcrux_secrets_int_public_integers_declassify_d8_39(
+ vec.elements[i0]) >= (int16_t)3329) {
+ size_t uu____0 = i0;
+ vec.elements[uu____0] = vec.elements[uu____0] - (int16_t)3329;
}
- return v;
}
+ return vec;
}
/**
-This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
-libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
+This function found in impl {libcrux_ml_kem::vector::traits::Operations for
+libcrux_ml_kem::vector::portable::vector_type::PortableVector}
*/
static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
-libcrux_ml_kem_vector_portable_cond_subtract_3329_0d(
+libcrux_ml_kem_vector_portable_cond_subtract_3329_b8(
libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
return libcrux_ml_kem_vector_portable_arithmetic_cond_subtract_3329(v);
}
@@ -6837,11 +5692,10 @@ libcrux_ml_kem_vector_portable_cond_subtract_3329_0d(
#define LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_BARRETT_MULTIPLIER \
((int32_t)20159)
-#define LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_BARRETT_SHIFT ((int32_t)26)
+#define LIBCRUX_ML_KEM_VECTOR_TRAITS_BARRETT_SHIFT ((int32_t)26)
-#define LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_BARRETT_R \
- ((int32_t)1 << (uint32_t) \
- LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_BARRETT_SHIFT)
+#define LIBCRUX_ML_KEM_VECTOR_TRAITS_BARRETT_R \
+ ((int32_t)1 << (uint32_t)LIBCRUX_ML_KEM_VECTOR_TRAITS_BARRETT_SHIFT)
/**
Signed Barrett Reduction
@@ -6854,50 +5708,47 @@ libcrux_ml_kem_vector_portable_cond_subtract_3329_0d(
`|result| ≤ FIELD_MODULUS / 2 · (|value|/BARRETT_R + 1)
- In particular, if `|value| < BARRETT_R`, then `|result| < FIELD_MODULUS`.
+ Note: The input bound is 28296 to prevent overflow in the multiplication of
+ quotient by FIELD_MODULUS
+
*/
static inline int16_t
libcrux_ml_kem_vector_portable_arithmetic_barrett_reduce_element(
int16_t value) {
- int32_t t = (int32_t)value *
+ int32_t t = libcrux_secrets_int_as_i32_f5(value) *
LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_BARRETT_MULTIPLIER +
- (LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_BARRETT_R >> 1U);
- int16_t quotient =
- (int16_t)(t >>
- (uint32_t)
- LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_BARRETT_SHIFT);
+ (LIBCRUX_ML_KEM_VECTOR_TRAITS_BARRETT_R >> 1U);
+ int16_t quotient = libcrux_secrets_int_as_i16_36(
+ t >> (uint32_t)LIBCRUX_ML_KEM_VECTOR_TRAITS_BARRETT_SHIFT);
return value - quotient * LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS;
}
static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_arithmetic_barrett_reduce(
- libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector vec) {
for (size_t i = (size_t)0U;
i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
size_t i0 = i;
- v.elements[i0] =
+ int16_t vi =
libcrux_ml_kem_vector_portable_arithmetic_barrett_reduce_element(
- v.elements[i0]);
+ vec.elements[i0]);
+ vec.elements[i0] = vi;
}
- return v;
+ return vec;
}
/**
-This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
-libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
+This function found in impl {libcrux_ml_kem::vector::traits::Operations for
+libcrux_ml_kem::vector::portable::vector_type::PortableVector}
*/
static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
-libcrux_ml_kem_vector_portable_barrett_reduce_0d(
- libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
- return libcrux_ml_kem_vector_portable_arithmetic_barrett_reduce(v);
+libcrux_ml_kem_vector_portable_barrett_reduce_b8(
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector vector) {
+ return libcrux_ml_kem_vector_portable_arithmetic_barrett_reduce(vector);
}
#define LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_MONTGOMERY_SHIFT (16U)
-#define LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_MONTGOMERY_R \
- ((int32_t)1 << (uint32_t) \
- LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_MONTGOMERY_SHIFT)
-
/**
Signed Montgomery Reduction
@@ -6907,27 +5758,32 @@ libcrux_ml_kem_vector_portable_barrett_reduce_0d(
- o ≡ value · MONTGOMERY_R^(-1) (mod FIELD_MODULUS)
- the absolute value of `o` is bound as follows:
- `|result| ≤ (|value| / MONTGOMERY_R) + (FIELD_MODULUS / 2)
+ `|result| ≤ ceil(|value| / MONTGOMERY_R) + 1665
+
+ In particular, if `|value| ≤ FIELD_MODULUS-1 * FIELD_MODULUS-1`, then `|o| <=
+ FIELD_MODULUS-1`. And, if `|value| ≤ pow2 16 * FIELD_MODULUS-1`, then `|o| <=
+ FIELD_MODULUS + 1664
- In particular, if `|value| ≤ FIELD_MODULUS * MONTGOMERY_R`, then `|o| < (3 ·
- FIELD_MODULUS) / 2`.
*/
static inline int16_t
libcrux_ml_kem_vector_portable_arithmetic_montgomery_reduce_element(
int32_t value) {
int32_t k =
- (int32_t)(int16_t)value *
- (int32_t)LIBCRUX_ML_KEM_VECTOR_TRAITS_INVERSE_OF_MODULUS_MOD_MONTGOMERY_R;
+ libcrux_secrets_int_as_i32_f5(libcrux_secrets_int_as_i16_36(value)) *
+ libcrux_secrets_int_as_i32_b8(
+ libcrux_secrets_int_public_integers_classify_27_df(
+ LIBCRUX_ML_KEM_VECTOR_TRAITS_INVERSE_OF_MODULUS_MOD_MONTGOMERY_R));
int32_t k_times_modulus =
- (int32_t)(int16_t)k * (int32_t)LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS;
- int16_t c =
- (int16_t)(k_times_modulus >>
- (uint32_t)
- LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_MONTGOMERY_SHIFT);
- int16_t value_high =
- (int16_t)(value >>
- (uint32_t)
- LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_MONTGOMERY_SHIFT);
+ libcrux_secrets_int_as_i32_f5(libcrux_secrets_int_as_i16_36(k)) *
+ libcrux_secrets_int_as_i32_f5(
+ libcrux_secrets_int_public_integers_classify_27_39(
+ LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS));
+ int16_t c = libcrux_secrets_int_as_i16_36(
+ k_times_modulus >>
+ (uint32_t)LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_MONTGOMERY_SHIFT);
+ int16_t value_high = libcrux_secrets_int_as_i16_36(
+ value >>
+ (uint32_t)LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_MONTGOMERY_SHIFT);
return value_high - c;
}
@@ -6945,32 +5801,85 @@ libcrux_ml_kem_vector_portable_arithmetic_montgomery_reduce_element(
static KRML_MUSTINLINE int16_t
libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_fe_by_fer(
int16_t fe, int16_t fer) {
+ int32_t product =
+ libcrux_secrets_int_as_i32_f5(fe) * libcrux_secrets_int_as_i32_f5(fer);
return libcrux_ml_kem_vector_portable_arithmetic_montgomery_reduce_element(
- (int32_t)fe * (int32_t)fer);
+ product);
}
static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_by_constant(
- libcrux_ml_kem_vector_portable_vector_type_PortableVector v, int16_t c) {
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector vec, int16_t c) {
for (size_t i = (size_t)0U;
i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
size_t i0 = i;
- v.elements[i0] =
+ vec.elements[i0] =
libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_fe_by_fer(
- v.elements[i0], c);
+ vec.elements[i0], c);
}
- return v;
+ return vec;
}
/**
-This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
-libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
+This function found in impl {libcrux_ml_kem::vector::traits::Operations for
+libcrux_ml_kem::vector::portable::vector_type::PortableVector}
*/
static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
-libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_0d(
- libcrux_ml_kem_vector_portable_vector_type_PortableVector v, int16_t r) {
+libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_b8(
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector vector,
+ int16_t constant) {
return libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_by_constant(
- v, r);
+ vector, libcrux_secrets_int_public_integers_classify_27_39(constant));
+}
+
+static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
+libcrux_ml_kem_vector_portable_arithmetic_bitwise_and_with_constant(
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector vec, int16_t c) {
+ for (size_t i = (size_t)0U;
+ i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
+ size_t i0 = i;
+ size_t uu____0 = i0;
+ vec.elements[uu____0] = vec.elements[uu____0] & c;
+ }
+ return vec;
+}
+
+/**
+A monomorphic instance of libcrux_ml_kem.vector.portable.arithmetic.shift_right
+with const generics
+- SHIFT_BY= 15
+*/
+static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
+libcrux_ml_kem_vector_portable_arithmetic_shift_right_ef(
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector vec) {
+ for (size_t i = (size_t)0U;
+ i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
+ size_t i0 = i;
+ vec.elements[i0] = vec.elements[i0] >> (uint32_t)(int32_t)15;
+ }
+ return vec;
+}
+
+static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
+libcrux_ml_kem_vector_portable_arithmetic_to_unsigned_representative(
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector a) {
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector t =
+ libcrux_ml_kem_vector_portable_arithmetic_shift_right_ef(a);
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector fm =
+ libcrux_ml_kem_vector_portable_arithmetic_bitwise_and_with_constant(
+ t, LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS);
+ return libcrux_ml_kem_vector_portable_arithmetic_add(a, &fm);
+}
+
+/**
+This function found in impl {libcrux_ml_kem::vector::traits::Operations for
+libcrux_ml_kem::vector::portable::vector_type::PortableVector}
+*/
+static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
+libcrux_ml_kem_vector_portable_to_unsigned_representative_b8(
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector a) {
+ return libcrux_ml_kem_vector_portable_arithmetic_to_unsigned_representative(
+ a);
}
/**
@@ -6998,34 +5907,38 @@ libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_0d(
static inline uint8_t
libcrux_ml_kem_vector_portable_compress_compress_message_coefficient(
uint16_t fe) {
- int16_t shifted = (int16_t)1664 - (int16_t)fe;
+ int16_t shifted =
+ libcrux_secrets_int_public_integers_classify_27_39((int16_t)1664) -
+ libcrux_secrets_int_as_i16_ca(fe);
int16_t mask = shifted >> 15U;
int16_t shifted_to_positive = mask ^ shifted;
int16_t shifted_positive_in_range = shifted_to_positive - (int16_t)832;
- return (uint8_t)(shifted_positive_in_range >> 15U & (int16_t)1);
+ int16_t r0 = shifted_positive_in_range >> 15U;
+ int16_t r1 = r0 & (int16_t)1;
+ return libcrux_secrets_int_as_u8_f5(r1);
}
static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_compress_compress_1(
- libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector a) {
for (size_t i = (size_t)0U;
i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
size_t i0 = i;
- v.elements[i0] = (int16_t)
+ a.elements[i0] = libcrux_secrets_int_as_i16_59(
libcrux_ml_kem_vector_portable_compress_compress_message_coefficient(
- (uint16_t)v.elements[i0]);
+ libcrux_secrets_int_as_u16_f5(a.elements[i0])));
}
- return v;
+ return a;
}
/**
-This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
-libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
+This function found in impl {libcrux_ml_kem::vector::traits::Operations for
+libcrux_ml_kem::vector::portable::vector_type::PortableVector}
*/
static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
-libcrux_ml_kem_vector_portable_compress_1_0d(
- libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
- return libcrux_ml_kem_vector_portable_compress_compress_1(v);
+libcrux_ml_kem_vector_portable_compress_1_b8(
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector a) {
+ return libcrux_ml_kem_vector_portable_compress_compress_1(a);
}
static KRML_MUSTINLINE uint32_t
@@ -7037,54 +5950,81 @@ libcrux_ml_kem_vector_portable_arithmetic_get_n_least_significant_bits(
static inline int16_t
libcrux_ml_kem_vector_portable_compress_compress_ciphertext_coefficient(
uint8_t coefficient_bits, uint16_t fe) {
- uint64_t compressed = (uint64_t)fe << (uint32_t)coefficient_bits;
+ uint64_t compressed = libcrux_secrets_int_as_u64_ca(fe)
+ << (uint32_t)coefficient_bits;
compressed = compressed + 1664ULL;
compressed = compressed * 10321340ULL;
compressed = compressed >> 35U;
- return (int16_t)
+ return libcrux_secrets_int_as_i16_b8(
libcrux_ml_kem_vector_portable_arithmetic_get_n_least_significant_bits(
- coefficient_bits, (uint32_t)compressed);
+ coefficient_bits, libcrux_secrets_int_as_u32_a3(compressed)));
+}
+
+static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
+libcrux_ml_kem_vector_portable_compress_decompress_1(
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector a) {
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector z =
+ libcrux_ml_kem_vector_portable_vector_type_zero();
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector s =
+ libcrux_ml_kem_vector_portable_arithmetic_sub(z, &a);
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector res =
+ libcrux_ml_kem_vector_portable_arithmetic_bitwise_and_with_constant(
+ s, (int16_t)1665);
+ return res;
+}
+
+/**
+This function found in impl {libcrux_ml_kem::vector::traits::Operations for
+libcrux_ml_kem::vector::portable::vector_type::PortableVector}
+*/
+static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
+libcrux_ml_kem_vector_portable_decompress_1_b8(
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector a) {
+ return libcrux_ml_kem_vector_portable_compress_decompress_1(a);
}
static KRML_MUSTINLINE void libcrux_ml_kem_vector_portable_ntt_ntt_step(
- libcrux_ml_kem_vector_portable_vector_type_PortableVector *v, int16_t zeta,
- size_t i, size_t j) {
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector *vec,
+ int16_t zeta, size_t i, size_t j) {
int16_t t =
libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_fe_by_fer(
- v->elements[j], zeta);
- v->elements[j] = v->elements[i] - t;
- v->elements[i] = v->elements[i] + t;
+ vec->elements[j],
+ libcrux_secrets_int_public_integers_classify_27_39(zeta));
+ int16_t a_minus_t = vec->elements[i] - t;
+ int16_t a_plus_t = vec->elements[i] + t;
+ vec->elements[j] = a_minus_t;
+ vec->elements[i] = a_plus_t;
}
static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_ntt_ntt_layer_1_step(
- libcrux_ml_kem_vector_portable_vector_type_PortableVector v, int16_t zeta0,
- int16_t zeta1, int16_t zeta2, int16_t zeta3) {
- libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta0, (size_t)0U,
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector vec,
+ int16_t zeta0, int16_t zeta1, int16_t zeta2, int16_t zeta3) {
+ libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta0, (size_t)0U,
(size_t)2U);
- libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta0, (size_t)1U,
+ libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta0, (size_t)1U,
(size_t)3U);
- libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta1, (size_t)4U,
+ libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta1, (size_t)4U,
(size_t)6U);
- libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta1, (size_t)5U,
+ libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta1, (size_t)5U,
(size_t)7U);
- libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta2, (size_t)8U,
+ libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta2, (size_t)8U,
(size_t)10U);
- libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta2, (size_t)9U,
+ libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta2, (size_t)9U,
(size_t)11U);
- libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta3, (size_t)12U,
+ libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta3, (size_t)12U,
(size_t)14U);
- libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta3, (size_t)13U,
+ libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta3, (size_t)13U,
(size_t)15U);
- return v;
+ return vec;
}
/**
-This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
-libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
+This function found in impl {libcrux_ml_kem::vector::traits::Operations for
+libcrux_ml_kem::vector::portable::vector_type::PortableVector}
*/
static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
-libcrux_ml_kem_vector_portable_ntt_layer_1_step_0d(
+libcrux_ml_kem_vector_portable_ntt_layer_1_step_b8(
libcrux_ml_kem_vector_portable_vector_type_PortableVector a, int16_t zeta0,
int16_t zeta1, int16_t zeta2, int16_t zeta3) {
return libcrux_ml_kem_vector_portable_ntt_ntt_layer_1_step(a, zeta0, zeta1,
@@ -7093,33 +6033,33 @@ libcrux_ml_kem_vector_portable_ntt_layer_1_step_0d(
static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_ntt_ntt_layer_2_step(
- libcrux_ml_kem_vector_portable_vector_type_PortableVector v, int16_t zeta0,
- int16_t zeta1) {
- libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta0, (size_t)0U,
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector vec,
+ int16_t zeta0, int16_t zeta1) {
+ libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta0, (size_t)0U,
(size_t)4U);
- libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta0, (size_t)1U,
+ libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta0, (size_t)1U,
(size_t)5U);
- libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta0, (size_t)2U,
+ libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta0, (size_t)2U,
(size_t)6U);
- libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta0, (size_t)3U,
+ libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta0, (size_t)3U,
(size_t)7U);
- libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta1, (size_t)8U,
+ libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta1, (size_t)8U,
(size_t)12U);
- libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta1, (size_t)9U,
+ libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta1, (size_t)9U,
(size_t)13U);
- libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta1, (size_t)10U,
+ libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta1, (size_t)10U,
(size_t)14U);
- libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta1, (size_t)11U,
+ libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta1, (size_t)11U,
(size_t)15U);
- return v;
+ return vec;
}
/**
-This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
-libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
+This function found in impl {libcrux_ml_kem::vector::traits::Operations for
+libcrux_ml_kem::vector::portable::vector_type::PortableVector}
*/
static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
-libcrux_ml_kem_vector_portable_ntt_layer_2_step_0d(
+libcrux_ml_kem_vector_portable_ntt_layer_2_step_b8(
libcrux_ml_kem_vector_portable_vector_type_PortableVector a, int16_t zeta0,
int16_t zeta1) {
return libcrux_ml_kem_vector_portable_ntt_ntt_layer_2_step(a, zeta0, zeta1);
@@ -7127,75 +6067,80 @@ libcrux_ml_kem_vector_portable_ntt_layer_2_step_0d(
static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_ntt_ntt_layer_3_step(
- libcrux_ml_kem_vector_portable_vector_type_PortableVector v, int16_t zeta) {
- libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta, (size_t)0U, (size_t)8U);
- libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta, (size_t)1U, (size_t)9U);
- libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta, (size_t)2U,
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector vec,
+ int16_t zeta) {
+ libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta, (size_t)0U,
+ (size_t)8U);
+ libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta, (size_t)1U,
+ (size_t)9U);
+ libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta, (size_t)2U,
(size_t)10U);
- libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta, (size_t)3U,
+ libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta, (size_t)3U,
(size_t)11U);
- libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta, (size_t)4U,
+ libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta, (size_t)4U,
(size_t)12U);
- libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta, (size_t)5U,
+ libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta, (size_t)5U,
(size_t)13U);
- libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta, (size_t)6U,
+ libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta, (size_t)6U,
(size_t)14U);
- libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta, (size_t)7U,
+ libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta, (size_t)7U,
(size_t)15U);
- return v;
+ return vec;
}
/**
-This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
-libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
+This function found in impl {libcrux_ml_kem::vector::traits::Operations for
+libcrux_ml_kem::vector::portable::vector_type::PortableVector}
*/
static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
-libcrux_ml_kem_vector_portable_ntt_layer_3_step_0d(
+libcrux_ml_kem_vector_portable_ntt_layer_3_step_b8(
libcrux_ml_kem_vector_portable_vector_type_PortableVector a, int16_t zeta) {
return libcrux_ml_kem_vector_portable_ntt_ntt_layer_3_step(a, zeta);
}
static KRML_MUSTINLINE void libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(
- libcrux_ml_kem_vector_portable_vector_type_PortableVector *v, int16_t zeta,
- size_t i, size_t j) {
- int16_t a_minus_b = v->elements[j] - v->elements[i];
- v->elements[i] =
- libcrux_ml_kem_vector_portable_arithmetic_barrett_reduce_element(
- v->elements[i] + v->elements[j]);
- v->elements[j] =
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector *vec,
+ int16_t zeta, size_t i, size_t j) {
+ int16_t a_minus_b = vec->elements[j] - vec->elements[i];
+ int16_t a_plus_b = vec->elements[j] + vec->elements[i];
+ int16_t o0 = libcrux_ml_kem_vector_portable_arithmetic_barrett_reduce_element(
+ a_plus_b);
+ int16_t o1 =
libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_fe_by_fer(
- a_minus_b, zeta);
+ a_minus_b, libcrux_secrets_int_public_integers_classify_27_39(zeta));
+ vec->elements[i] = o0;
+ vec->elements[j] = o1;
}
static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_1_step(
- libcrux_ml_kem_vector_portable_vector_type_PortableVector v, int16_t zeta0,
- int16_t zeta1, int16_t zeta2, int16_t zeta3) {
- libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta0, (size_t)0U,
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector vec,
+ int16_t zeta0, int16_t zeta1, int16_t zeta2, int16_t zeta3) {
+ libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta0, (size_t)0U,
(size_t)2U);
- libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta0, (size_t)1U,
+ libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta0, (size_t)1U,
(size_t)3U);
- libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta1, (size_t)4U,
+ libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta1, (size_t)4U,
(size_t)6U);
- libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta1, (size_t)5U,
+ libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta1, (size_t)5U,
(size_t)7U);
- libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta2, (size_t)8U,
+ libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta2, (size_t)8U,
(size_t)10U);
- libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta2, (size_t)9U,
+ libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta2, (size_t)9U,
(size_t)11U);
- libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta3, (size_t)12U,
+ libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta3, (size_t)12U,
(size_t)14U);
- libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta3, (size_t)13U,
+ libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta3, (size_t)13U,
(size_t)15U);
- return v;
+ return vec;
}
/**
-This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
-libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
+This function found in impl {libcrux_ml_kem::vector::traits::Operations for
+libcrux_ml_kem::vector::portable::vector_type::PortableVector}
*/
static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
-libcrux_ml_kem_vector_portable_inv_ntt_layer_1_step_0d(
+libcrux_ml_kem_vector_portable_inv_ntt_layer_1_step_b8(
libcrux_ml_kem_vector_portable_vector_type_PortableVector a, int16_t zeta0,
int16_t zeta1, int16_t zeta2, int16_t zeta3) {
return libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_1_step(
@@ -7204,33 +6149,33 @@ libcrux_ml_kem_vector_portable_inv_ntt_layer_1_step_0d(
static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_2_step(
- libcrux_ml_kem_vector_portable_vector_type_PortableVector v, int16_t zeta0,
- int16_t zeta1) {
- libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta0, (size_t)0U,
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector vec,
+ int16_t zeta0, int16_t zeta1) {
+ libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta0, (size_t)0U,
(size_t)4U);
- libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta0, (size_t)1U,
+ libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta0, (size_t)1U,
(size_t)5U);
- libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta0, (size_t)2U,
+ libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta0, (size_t)2U,
(size_t)6U);
- libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta0, (size_t)3U,
+ libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta0, (size_t)3U,
(size_t)7U);
- libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta1, (size_t)8U,
+ libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta1, (size_t)8U,
(size_t)12U);
- libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta1, (size_t)9U,
+ libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta1, (size_t)9U,
(size_t)13U);
- libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta1, (size_t)10U,
+ libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta1, (size_t)10U,
(size_t)14U);
- libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta1, (size_t)11U,
+ libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta1, (size_t)11U,
(size_t)15U);
- return v;
+ return vec;
}
/**
-This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
-libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
+This function found in impl {libcrux_ml_kem::vector::traits::Operations for
+libcrux_ml_kem::vector::portable::vector_type::PortableVector}
*/
static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
-libcrux_ml_kem_vector_portable_inv_ntt_layer_2_step_0d(
+libcrux_ml_kem_vector_portable_inv_ntt_layer_2_step_b8(
libcrux_ml_kem_vector_portable_vector_type_PortableVector a, int16_t zeta0,
int16_t zeta1) {
return libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_2_step(a, zeta0,
@@ -7239,32 +6184,33 @@ libcrux_ml_kem_vector_portable_inv_ntt_layer_2_step_0d(
static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_3_step(
- libcrux_ml_kem_vector_portable_vector_type_PortableVector v, int16_t zeta) {
- libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta, (size_t)0U,
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector vec,
+ int16_t zeta) {
+ libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta, (size_t)0U,
(size_t)8U);
- libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta, (size_t)1U,
+ libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta, (size_t)1U,
(size_t)9U);
- libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta, (size_t)2U,
+ libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta, (size_t)2U,
(size_t)10U);
- libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta, (size_t)3U,
+ libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta, (size_t)3U,
(size_t)11U);
- libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta, (size_t)4U,
+ libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta, (size_t)4U,
(size_t)12U);
- libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta, (size_t)5U,
+ libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta, (size_t)5U,
(size_t)13U);
- libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta, (size_t)6U,
+ libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta, (size_t)6U,
(size_t)14U);
- libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta, (size_t)7U,
+ libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta, (size_t)7U,
(size_t)15U);
- return v;
+ return vec;
}
/**
-This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
-libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
+This function found in impl {libcrux_ml_kem::vector::traits::Operations for
+libcrux_ml_kem::vector::portable::vector_type::PortableVector}
*/
static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
-libcrux_ml_kem_vector_portable_inv_ntt_layer_3_step_0d(
+libcrux_ml_kem_vector_portable_inv_ntt_layer_3_step_b8(
libcrux_ml_kem_vector_portable_vector_type_PortableVector a, int16_t zeta) {
return libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_3_step(a, zeta);
}
@@ -7295,20 +6241,34 @@ static KRML_MUSTINLINE void
libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials(
libcrux_ml_kem_vector_portable_vector_type_PortableVector *a,
libcrux_ml_kem_vector_portable_vector_type_PortableVector *b, int16_t zeta,
- size_t i, size_t j,
- libcrux_ml_kem_vector_portable_vector_type_PortableVector *out) {
- int16_t o0 = libcrux_ml_kem_vector_portable_arithmetic_montgomery_reduce_element(
- (int32_t)a->elements[i] * (int32_t)b->elements[i] +
- (int32_t)
- libcrux_ml_kem_vector_portable_arithmetic_montgomery_reduce_element(
- (int32_t)a->elements[j] * (int32_t)b->elements[j]) *
- (int32_t)zeta);
+ size_t i, libcrux_ml_kem_vector_portable_vector_type_PortableVector *out) {
+ int16_t ai = a->elements[(size_t)2U * i];
+ int16_t bi = b->elements[(size_t)2U * i];
+ int16_t aj = a->elements[(size_t)2U * i + (size_t)1U];
+ int16_t bj = b->elements[(size_t)2U * i + (size_t)1U];
+ int32_t ai_bi =
+ libcrux_secrets_int_as_i32_f5(ai) * libcrux_secrets_int_as_i32_f5(bi);
+ int32_t aj_bj_ =
+ libcrux_secrets_int_as_i32_f5(aj) * libcrux_secrets_int_as_i32_f5(bj);
+ int16_t aj_bj =
+ libcrux_ml_kem_vector_portable_arithmetic_montgomery_reduce_element(
+ aj_bj_);
+ int32_t aj_bj_zeta = libcrux_secrets_int_as_i32_f5(aj_bj) *
+ libcrux_secrets_int_as_i32_f5(zeta);
+ int32_t ai_bi_aj_bj = ai_bi + aj_bj_zeta;
+ int16_t o0 =
+ libcrux_ml_kem_vector_portable_arithmetic_montgomery_reduce_element(
+ ai_bi_aj_bj);
+ int32_t ai_bj =
+ libcrux_secrets_int_as_i32_f5(ai) * libcrux_secrets_int_as_i32_f5(bj);
+ int32_t aj_bi =
+ libcrux_secrets_int_as_i32_f5(aj) * libcrux_secrets_int_as_i32_f5(bi);
+ int32_t ai_bj_aj_bi = ai_bj + aj_bi;
int16_t o1 =
libcrux_ml_kem_vector_portable_arithmetic_montgomery_reduce_element(
- (int32_t)a->elements[i] * (int32_t)b->elements[j] +
- (int32_t)a->elements[j] * (int32_t)b->elements[i]);
- out->elements[i] = o0;
- out->elements[j] = o1;
+ ai_bj_aj_bi);
+ out->elements[(size_t)2U * i] = o0;
+ out->elements[(size_t)2U * i + (size_t)1U] = o1;
}
static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
@@ -7316,33 +6276,45 @@ libcrux_ml_kem_vector_portable_ntt_ntt_multiply(
libcrux_ml_kem_vector_portable_vector_type_PortableVector *lhs,
libcrux_ml_kem_vector_portable_vector_type_PortableVector *rhs,
int16_t zeta0, int16_t zeta1, int16_t zeta2, int16_t zeta3) {
+ int16_t nzeta0 = -zeta0;
+ int16_t nzeta1 = -zeta1;
+ int16_t nzeta2 = -zeta2;
+ int16_t nzeta3 = -zeta3;
libcrux_ml_kem_vector_portable_vector_type_PortableVector out =
libcrux_ml_kem_vector_portable_vector_type_zero();
libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials(
- lhs, rhs, zeta0, (size_t)0U, (size_t)1U, &out);
+ lhs, rhs, libcrux_secrets_int_public_integers_classify_27_39(zeta0),
+ (size_t)0U, &out);
libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials(
- lhs, rhs, -zeta0, (size_t)2U, (size_t)3U, &out);
+ lhs, rhs, libcrux_secrets_int_public_integers_classify_27_39(nzeta0),
+ (size_t)1U, &out);
libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials(
- lhs, rhs, zeta1, (size_t)4U, (size_t)5U, &out);
+ lhs, rhs, libcrux_secrets_int_public_integers_classify_27_39(zeta1),
+ (size_t)2U, &out);
libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials(
- lhs, rhs, -zeta1, (size_t)6U, (size_t)7U, &out);
+ lhs, rhs, libcrux_secrets_int_public_integers_classify_27_39(nzeta1),
+ (size_t)3U, &out);
libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials(
- lhs, rhs, zeta2, (size_t)8U, (size_t)9U, &out);
+ lhs, rhs, libcrux_secrets_int_public_integers_classify_27_39(zeta2),
+ (size_t)4U, &out);
libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials(
- lhs, rhs, -zeta2, (size_t)10U, (size_t)11U, &out);
+ lhs, rhs, libcrux_secrets_int_public_integers_classify_27_39(nzeta2),
+ (size_t)5U, &out);
libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials(
- lhs, rhs, zeta3, (size_t)12U, (size_t)13U, &out);
+ lhs, rhs, libcrux_secrets_int_public_integers_classify_27_39(zeta3),
+ (size_t)6U, &out);
libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials(
- lhs, rhs, -zeta3, (size_t)14U, (size_t)15U, &out);
+ lhs, rhs, libcrux_secrets_int_public_integers_classify_27_39(nzeta3),
+ (size_t)7U, &out);
return out;
}
/**
-This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
-libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
+This function found in impl {libcrux_ml_kem::vector::traits::Operations for
+libcrux_ml_kem::vector::portable::vector_type::PortableVector}
*/
static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
-libcrux_ml_kem_vector_portable_ntt_multiply_0d(
+libcrux_ml_kem_vector_portable_ntt_multiply_b8(
libcrux_ml_kem_vector_portable_vector_type_PortableVector *lhs,
libcrux_ml_kem_vector_portable_vector_type_PortableVector *rhs,
int16_t zeta0, int16_t zeta1, int16_t zeta2, int16_t zeta3) {
@@ -7354,62 +6326,114 @@ static KRML_MUSTINLINE void
libcrux_ml_kem_vector_portable_serialize_serialize_1(
libcrux_ml_kem_vector_portable_vector_type_PortableVector v,
uint8_t ret[2U]) {
- uint8_t result[2U] = {0U};
- for (size_t i = (size_t)0U; i < (size_t)8U; i++) {
- size_t i0 = i;
- size_t uu____0 = (size_t)0U;
- result[uu____0] = (uint32_t)result[uu____0] |
- (uint32_t)(uint8_t)v.elements[i0] << (uint32_t)i0;
- }
- for (size_t i = (size_t)8U; i < (size_t)16U; i++) {
- size_t i0 = i;
- size_t uu____1 = (size_t)1U;
- result[uu____1] =
- (uint32_t)result[uu____1] | (uint32_t)(uint8_t)v.elements[i0]
- << (uint32_t)(i0 - (size_t)8U);
- }
- memcpy(ret, result, (size_t)2U * sizeof(uint8_t));
+ uint8_t result0 =
+ (((((((uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[0U]) |
+ (uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[1U]) << 1U) |
+ (uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[2U]) << 2U) |
+ (uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[3U]) << 3U) |
+ (uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[4U]) << 4U) |
+ (uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[5U]) << 5U) |
+ (uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[6U]) << 6U) |
+ (uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[7U]) << 7U;
+ uint8_t result1 =
+ (((((((uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[8U]) |
+ (uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[9U]) << 1U) |
+ (uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[10U]) << 2U) |
+ (uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[11U]) << 3U) |
+ (uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[12U]) << 4U) |
+ (uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[13U]) << 5U) |
+ (uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[14U]) << 6U) |
+ (uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[15U]) << 7U;
+ ret[0U] = result0;
+ ret[1U] = result1;
+}
+
+static inline void libcrux_ml_kem_vector_portable_serialize_1(
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector a,
+ uint8_t ret[2U]) {
+ uint8_t ret0[2U];
+ libcrux_ml_kem_vector_portable_serialize_serialize_1(a, ret0);
+ libcrux_secrets_int_public_integers_declassify_d8_d4(ret0, ret);
}
/**
-This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
-libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
+This function found in impl {libcrux_ml_kem::vector::traits::Operations for
+libcrux_ml_kem::vector::portable::vector_type::PortableVector}
*/
-static inline void libcrux_ml_kem_vector_portable_serialize_1_0d(
+static inline void libcrux_ml_kem_vector_portable_serialize_1_b8(
libcrux_ml_kem_vector_portable_vector_type_PortableVector a,
uint8_t ret[2U]) {
- libcrux_ml_kem_vector_portable_serialize_serialize_1(a, ret);
+ libcrux_ml_kem_vector_portable_serialize_1(a, ret);
}
static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_serialize_deserialize_1(Eurydice_slice v) {
- libcrux_ml_kem_vector_portable_vector_type_PortableVector result =
- libcrux_ml_kem_vector_portable_vector_type_zero();
- for (size_t i = (size_t)0U; i < (size_t)8U; i++) {
- size_t i0 = i;
- result.elements[i0] = (int16_t)((uint32_t)Eurydice_slice_index(
- v, (size_t)0U, uint8_t, uint8_t *) >>
- (uint32_t)i0 &
- 1U);
- }
- for (size_t i = (size_t)8U;
- i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
- size_t i0 = i;
- result.elements[i0] = (int16_t)((uint32_t)Eurydice_slice_index(
- v, (size_t)1U, uint8_t, uint8_t *) >>
- (uint32_t)(i0 - (size_t)8U) &
- 1U);
- }
- return result;
+ int16_t result0 = libcrux_secrets_int_as_i16_59(
+ (uint32_t)Eurydice_slice_index(v, (size_t)0U, uint8_t, uint8_t *) & 1U);
+ int16_t result1 = libcrux_secrets_int_as_i16_59(
+ (uint32_t)Eurydice_slice_index(v, (size_t)0U, uint8_t, uint8_t *) >> 1U &
+ 1U);
+ int16_t result2 = libcrux_secrets_int_as_i16_59(
+ (uint32_t)Eurydice_slice_index(v, (size_t)0U, uint8_t, uint8_t *) >> 2U &
+ 1U);
+ int16_t result3 = libcrux_secrets_int_as_i16_59(
+ (uint32_t)Eurydice_slice_index(v, (size_t)0U, uint8_t, uint8_t *) >> 3U &
+ 1U);
+ int16_t result4 = libcrux_secrets_int_as_i16_59(
+ (uint32_t)Eurydice_slice_index(v, (size_t)0U, uint8_t, uint8_t *) >> 4U &
+ 1U);
+ int16_t result5 = libcrux_secrets_int_as_i16_59(
+ (uint32_t)Eurydice_slice_index(v, (size_t)0U, uint8_t, uint8_t *) >> 5U &
+ 1U);
+ int16_t result6 = libcrux_secrets_int_as_i16_59(
+ (uint32_t)Eurydice_slice_index(v, (size_t)0U, uint8_t, uint8_t *) >> 6U &
+ 1U);
+ int16_t result7 = libcrux_secrets_int_as_i16_59(
+ (uint32_t)Eurydice_slice_index(v, (size_t)0U, uint8_t, uint8_t *) >> 7U &
+ 1U);
+ int16_t result8 = libcrux_secrets_int_as_i16_59(
+ (uint32_t)Eurydice_slice_index(v, (size_t)1U, uint8_t, uint8_t *) & 1U);
+ int16_t result9 = libcrux_secrets_int_as_i16_59(
+ (uint32_t)Eurydice_slice_index(v, (size_t)1U, uint8_t, uint8_t *) >> 1U &
+ 1U);
+ int16_t result10 = libcrux_secrets_int_as_i16_59(
+ (uint32_t)Eurydice_slice_index(v, (size_t)1U, uint8_t, uint8_t *) >> 2U &
+ 1U);
+ int16_t result11 = libcrux_secrets_int_as_i16_59(
+ (uint32_t)Eurydice_slice_index(v, (size_t)1U, uint8_t, uint8_t *) >> 3U &
+ 1U);
+ int16_t result12 = libcrux_secrets_int_as_i16_59(
+ (uint32_t)Eurydice_slice_index(v, (size_t)1U, uint8_t, uint8_t *) >> 4U &
+ 1U);
+ int16_t result13 = libcrux_secrets_int_as_i16_59(
+ (uint32_t)Eurydice_slice_index(v, (size_t)1U, uint8_t, uint8_t *) >> 5U &
+ 1U);
+ int16_t result14 = libcrux_secrets_int_as_i16_59(
+ (uint32_t)Eurydice_slice_index(v, (size_t)1U, uint8_t, uint8_t *) >> 6U &
+ 1U);
+ int16_t result15 = libcrux_secrets_int_as_i16_59(
+ (uint32_t)Eurydice_slice_index(v, (size_t)1U, uint8_t, uint8_t *) >> 7U &
+ 1U);
+ return (
+ KRML_CLITERAL(libcrux_ml_kem_vector_portable_vector_type_PortableVector){
+ .elements = {result0, result1, result2, result3, result4, result5,
+ result6, result7, result8, result9, result10, result11,
+ result12, result13, result14, result15}});
+}
+
+static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
+libcrux_ml_kem_vector_portable_deserialize_1(Eurydice_slice a) {
+ return libcrux_ml_kem_vector_portable_serialize_deserialize_1(
+ libcrux_secrets_int_classify_public_classify_ref_9b_90(a));
}
/**
-This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
-libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
+This function found in impl {libcrux_ml_kem::vector::traits::Operations for
+libcrux_ml_kem::vector::portable::vector_type::PortableVector}
*/
static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
-libcrux_ml_kem_vector_portable_deserialize_1_0d(Eurydice_slice a) {
- return libcrux_ml_kem_vector_portable_serialize_deserialize_1(a);
+libcrux_ml_kem_vector_portable_deserialize_1_b8(Eurydice_slice a) {
+ return libcrux_ml_kem_vector_portable_deserialize_1(a);
}
typedef struct uint8_t_x4_s {
@@ -7421,27 +6445,27 @@ typedef struct uint8_t_x4_s {
static KRML_MUSTINLINE uint8_t_x4
libcrux_ml_kem_vector_portable_serialize_serialize_4_int(Eurydice_slice v) {
- uint8_t result0 =
- (uint32_t)(uint8_t)Eurydice_slice_index(v, (size_t)1U, int16_t, int16_t *)
- << 4U |
- (uint32_t)(uint8_t)Eurydice_slice_index(v, (size_t)0U, int16_t,
- int16_t *);
- uint8_t result1 =
- (uint32_t)(uint8_t)Eurydice_slice_index(v, (size_t)3U, int16_t, int16_t *)
- << 4U |
- (uint32_t)(uint8_t)Eurydice_slice_index(v, (size_t)2U, int16_t,
- int16_t *);
- uint8_t result2 =
- (uint32_t)(uint8_t)Eurydice_slice_index(v, (size_t)5U, int16_t, int16_t *)
- << 4U |
- (uint32_t)(uint8_t)Eurydice_slice_index(v, (size_t)4U, int16_t,
- int16_t *);
- uint8_t result3 =
- (uint32_t)(uint8_t)Eurydice_slice_index(v, (size_t)7U, int16_t, int16_t *)
- << 4U |
- (uint32_t)(uint8_t)Eurydice_slice_index(v, (size_t)6U, int16_t,
- int16_t *);
- return (CLITERAL(uint8_t_x4){
+ uint8_t result0 = (uint32_t)libcrux_secrets_int_as_u8_f5(
+ Eurydice_slice_index(v, (size_t)1U, int16_t, int16_t *))
+ << 4U |
+ (uint32_t)libcrux_secrets_int_as_u8_f5(Eurydice_slice_index(
+ v, (size_t)0U, int16_t, int16_t *));
+ uint8_t result1 = (uint32_t)libcrux_secrets_int_as_u8_f5(
+ Eurydice_slice_index(v, (size_t)3U, int16_t, int16_t *))
+ << 4U |
+ (uint32_t)libcrux_secrets_int_as_u8_f5(Eurydice_slice_index(
+ v, (size_t)2U, int16_t, int16_t *));
+ uint8_t result2 = (uint32_t)libcrux_secrets_int_as_u8_f5(
+ Eurydice_slice_index(v, (size_t)5U, int16_t, int16_t *))
+ << 4U |
+ (uint32_t)libcrux_secrets_int_as_u8_f5(Eurydice_slice_index(
+ v, (size_t)4U, int16_t, int16_t *));
+ uint8_t result3 = (uint32_t)libcrux_secrets_int_as_u8_f5(
+ Eurydice_slice_index(v, (size_t)7U, int16_t, int16_t *))
+ << 4U |
+ (uint32_t)libcrux_secrets_int_as_u8_f5(Eurydice_slice_index(
+ v, (size_t)6U, int16_t, int16_t *));
+ return (KRML_CLITERAL(uint8_t_x4){
.fst = result0, .snd = result1, .thd = result2, .f3 = result3});
}
@@ -7451,109 +6475,107 @@ libcrux_ml_kem_vector_portable_serialize_serialize_4(
uint8_t ret[8U]) {
uint8_t_x4 result0_3 =
libcrux_ml_kem_vector_portable_serialize_serialize_4_int(
- Eurydice_array_to_subslice2(v.elements, (size_t)0U, (size_t)8U,
- int16_t));
+ Eurydice_array_to_subslice3(v.elements, (size_t)0U, (size_t)8U,
+ int16_t *));
uint8_t_x4 result4_7 =
libcrux_ml_kem_vector_portable_serialize_serialize_4_int(
- Eurydice_array_to_subslice2(v.elements, (size_t)8U, (size_t)16U,
- int16_t));
- uint8_t result[8U] = {0U};
- result[0U] = result0_3.fst;
- result[1U] = result0_3.snd;
- result[2U] = result0_3.thd;
- result[3U] = result0_3.f3;
- result[4U] = result4_7.fst;
- result[5U] = result4_7.snd;
- result[6U] = result4_7.thd;
- result[7U] = result4_7.f3;
- memcpy(ret, result, (size_t)8U * sizeof(uint8_t));
+ Eurydice_array_to_subslice3(v.elements, (size_t)8U, (size_t)16U,
+ int16_t *));
+ ret[0U] = result0_3.fst;
+ ret[1U] = result0_3.snd;
+ ret[2U] = result0_3.thd;
+ ret[3U] = result0_3.f3;
+ ret[4U] = result4_7.fst;
+ ret[5U] = result4_7.snd;
+ ret[6U] = result4_7.thd;
+ ret[7U] = result4_7.f3;
+}
+
+static inline void libcrux_ml_kem_vector_portable_serialize_4(
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector a,
+ uint8_t ret[8U]) {
+ uint8_t ret0[8U];
+ libcrux_ml_kem_vector_portable_serialize_serialize_4(a, ret0);
+ libcrux_secrets_int_public_integers_declassify_d8_76(ret0, ret);
}
/**
-This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
-libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
+This function found in impl {libcrux_ml_kem::vector::traits::Operations for
+libcrux_ml_kem::vector::portable::vector_type::PortableVector}
*/
-static inline void libcrux_ml_kem_vector_portable_serialize_4_0d(
+static inline void libcrux_ml_kem_vector_portable_serialize_4_b8(
libcrux_ml_kem_vector_portable_vector_type_PortableVector a,
uint8_t ret[8U]) {
- libcrux_ml_kem_vector_portable_serialize_serialize_4(a, ret);
+ libcrux_ml_kem_vector_portable_serialize_4(a, ret);
}
static KRML_MUSTINLINE int16_t_x8
libcrux_ml_kem_vector_portable_serialize_deserialize_4_int(
Eurydice_slice bytes) {
- int16_t v0 = (int16_t)((uint32_t)Eurydice_slice_index(bytes, (size_t)0U,
- uint8_t, uint8_t *) &
- 15U);
- int16_t v1 = (int16_t)((uint32_t)Eurydice_slice_index(bytes, (size_t)0U,
- uint8_t, uint8_t *) >>
- 4U &
- 15U);
- int16_t v2 = (int16_t)((uint32_t)Eurydice_slice_index(bytes, (size_t)1U,
- uint8_t, uint8_t *) &
- 15U);
- int16_t v3 = (int16_t)((uint32_t)Eurydice_slice_index(bytes, (size_t)1U,
- uint8_t, uint8_t *) >>
- 4U &
- 15U);
- int16_t v4 = (int16_t)((uint32_t)Eurydice_slice_index(bytes, (size_t)2U,
- uint8_t, uint8_t *) &
- 15U);
- int16_t v5 = (int16_t)((uint32_t)Eurydice_slice_index(bytes, (size_t)2U,
- uint8_t, uint8_t *) >>
- 4U &
- 15U);
- int16_t v6 = (int16_t)((uint32_t)Eurydice_slice_index(bytes, (size_t)3U,
- uint8_t, uint8_t *) &
- 15U);
- int16_t v7 = (int16_t)((uint32_t)Eurydice_slice_index(bytes, (size_t)3U,
- uint8_t, uint8_t *) >>
- 4U &
- 15U);
- return (CLITERAL(int16_t_x8){.fst = v0,
- .snd = v1,
- .thd = v2,
- .f3 = v3,
- .f4 = v4,
- .f5 = v5,
- .f6 = v6,
- .f7 = v7});
+ int16_t v0 = libcrux_secrets_int_as_i16_59(
+ (uint32_t)Eurydice_slice_index(bytes, (size_t)0U, uint8_t, uint8_t *) &
+ 15U);
+ int16_t v1 = libcrux_secrets_int_as_i16_59(
+ (uint32_t)Eurydice_slice_index(bytes, (size_t)0U, uint8_t, uint8_t *) >>
+ 4U &
+ 15U);
+ int16_t v2 = libcrux_secrets_int_as_i16_59(
+ (uint32_t)Eurydice_slice_index(bytes, (size_t)1U, uint8_t, uint8_t *) &
+ 15U);
+ int16_t v3 = libcrux_secrets_int_as_i16_59(
+ (uint32_t)Eurydice_slice_index(bytes, (size_t)1U, uint8_t, uint8_t *) >>
+ 4U &
+ 15U);
+ int16_t v4 = libcrux_secrets_int_as_i16_59(
+ (uint32_t)Eurydice_slice_index(bytes, (size_t)2U, uint8_t, uint8_t *) &
+ 15U);
+ int16_t v5 = libcrux_secrets_int_as_i16_59(
+ (uint32_t)Eurydice_slice_index(bytes, (size_t)2U, uint8_t, uint8_t *) >>
+ 4U &
+ 15U);
+ int16_t v6 = libcrux_secrets_int_as_i16_59(
+ (uint32_t)Eurydice_slice_index(bytes, (size_t)3U, uint8_t, uint8_t *) &
+ 15U);
+ int16_t v7 = libcrux_secrets_int_as_i16_59(
+ (uint32_t)Eurydice_slice_index(bytes, (size_t)3U, uint8_t, uint8_t *) >>
+ 4U &
+ 15U);
+ return (KRML_CLITERAL(int16_t_x8){.fst = v0,
+ .snd = v1,
+ .thd = v2,
+ .f3 = v3,
+ .f4 = v4,
+ .f5 = v5,
+ .f6 = v6,
+ .f7 = v7});
}
static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_serialize_deserialize_4(Eurydice_slice bytes) {
int16_t_x8 v0_7 = libcrux_ml_kem_vector_portable_serialize_deserialize_4_int(
- Eurydice_slice_subslice2(bytes, (size_t)0U, (size_t)4U, uint8_t));
+ Eurydice_slice_subslice3(bytes, (size_t)0U, (size_t)4U, uint8_t *));
int16_t_x8 v8_15 = libcrux_ml_kem_vector_portable_serialize_deserialize_4_int(
- Eurydice_slice_subslice2(bytes, (size_t)4U, (size_t)8U, uint8_t));
- libcrux_ml_kem_vector_portable_vector_type_PortableVector v =
- libcrux_ml_kem_vector_portable_vector_type_zero();
- v.elements[0U] = v0_7.fst;
- v.elements[1U] = v0_7.snd;
- v.elements[2U] = v0_7.thd;
- v.elements[3U] = v0_7.f3;
- v.elements[4U] = v0_7.f4;
- v.elements[5U] = v0_7.f5;
- v.elements[6U] = v0_7.f6;
- v.elements[7U] = v0_7.f7;
- v.elements[8U] = v8_15.fst;
- v.elements[9U] = v8_15.snd;
- v.elements[10U] = v8_15.thd;
- v.elements[11U] = v8_15.f3;
- v.elements[12U] = v8_15.f4;
- v.elements[13U] = v8_15.f5;
- v.elements[14U] = v8_15.f6;
- v.elements[15U] = v8_15.f7;
- return v;
+ Eurydice_slice_subslice3(bytes, (size_t)4U, (size_t)8U, uint8_t *));
+ return (
+ KRML_CLITERAL(libcrux_ml_kem_vector_portable_vector_type_PortableVector){
+ .elements = {v0_7.fst, v0_7.snd, v0_7.thd, v0_7.f3, v0_7.f4, v0_7.f5,
+ v0_7.f6, v0_7.f7, v8_15.fst, v8_15.snd, v8_15.thd,
+ v8_15.f3, v8_15.f4, v8_15.f5, v8_15.f6, v8_15.f7}});
+}
+
+static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
+libcrux_ml_kem_vector_portable_deserialize_4(Eurydice_slice a) {
+ return libcrux_ml_kem_vector_portable_serialize_deserialize_4(
+ libcrux_secrets_int_classify_public_classify_ref_9b_90(a));
}
/**
-This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
-libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
+This function found in impl {libcrux_ml_kem::vector::traits::Operations for
+libcrux_ml_kem::vector::portable::vector_type::PortableVector}
*/
static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
-libcrux_ml_kem_vector_portable_deserialize_4_0d(Eurydice_slice a) {
- return libcrux_ml_kem_vector_portable_serialize_deserialize_4(a);
+libcrux_ml_kem_vector_portable_deserialize_4_b8(Eurydice_slice a) {
+ return libcrux_ml_kem_vector_portable_deserialize_4(a);
}
typedef struct uint8_t_x5_s {
@@ -7565,184 +6587,34 @@ typedef struct uint8_t_x5_s {
} uint8_t_x5;
static KRML_MUSTINLINE uint8_t_x5
-libcrux_ml_kem_vector_portable_serialize_serialize_5_int(Eurydice_slice v) {
- uint8_t r0 =
- (uint8_t)(Eurydice_slice_index(v, (size_t)0U, int16_t, int16_t *) |
- Eurydice_slice_index(v, (size_t)1U, int16_t, int16_t *) << 5U);
+libcrux_ml_kem_vector_portable_serialize_serialize_10_int(Eurydice_slice v) {
+ uint8_t r0 = libcrux_secrets_int_as_u8_f5(
+ Eurydice_slice_index(v, (size_t)0U, int16_t, int16_t *) & (int16_t)255);
uint8_t r1 =
- (uint8_t)((Eurydice_slice_index(v, (size_t)1U, int16_t, int16_t *) >> 3U |
- Eurydice_slice_index(v, (size_t)2U, int16_t, int16_t *)
- << 2U) |
- Eurydice_slice_index(v, (size_t)3U, int16_t, int16_t *) << 7U);
+ (uint32_t)libcrux_secrets_int_as_u8_f5(
+ Eurydice_slice_index(v, (size_t)1U, int16_t, int16_t *) & (int16_t)63)
+ << 2U |
+ (uint32_t)libcrux_secrets_int_as_u8_f5(
+ Eurydice_slice_index(v, (size_t)0U, int16_t, int16_t *) >> 8U &
+ (int16_t)3);
uint8_t r2 =
- (uint8_t)(Eurydice_slice_index(v, (size_t)3U, int16_t, int16_t *) >> 1U |
- Eurydice_slice_index(v, (size_t)4U, int16_t, int16_t *) << 4U);
+ (uint32_t)libcrux_secrets_int_as_u8_f5(
+ Eurydice_slice_index(v, (size_t)2U, int16_t, int16_t *) & (int16_t)15)
+ << 4U |
+ (uint32_t)libcrux_secrets_int_as_u8_f5(
+ Eurydice_slice_index(v, (size_t)1U, int16_t, int16_t *) >> 6U &
+ (int16_t)15);
uint8_t r3 =
- (uint8_t)((Eurydice_slice_index(v, (size_t)4U, int16_t, int16_t *) >> 4U |
- Eurydice_slice_index(v, (size_t)5U, int16_t, int16_t *)
- << 1U) |
- Eurydice_slice_index(v, (size_t)6U, int16_t, int16_t *) << 6U);
- uint8_t r4 =
- (uint8_t)(Eurydice_slice_index(v, (size_t)6U, int16_t, int16_t *) >> 2U |
- Eurydice_slice_index(v, (size_t)7U, int16_t, int16_t *) << 3U);
- return (CLITERAL(uint8_t_x5){
- .fst = r0, .snd = r1, .thd = r2, .f3 = r3, .f4 = r4});
-}
-
-static KRML_MUSTINLINE void
-libcrux_ml_kem_vector_portable_serialize_serialize_5(
- libcrux_ml_kem_vector_portable_vector_type_PortableVector v,
- uint8_t ret[10U]) {
- uint8_t_x5 r0_4 = libcrux_ml_kem_vector_portable_serialize_serialize_5_int(
- Eurydice_array_to_subslice2(v.elements, (size_t)0U, (size_t)8U, int16_t));
- uint8_t_x5 r5_9 = libcrux_ml_kem_vector_portable_serialize_serialize_5_int(
- Eurydice_array_to_subslice2(v.elements, (size_t)8U, (size_t)16U,
- int16_t));
- uint8_t result[10U] = {0U};
- result[0U] = r0_4.fst;
- result[1U] = r0_4.snd;
- result[2U] = r0_4.thd;
- result[3U] = r0_4.f3;
- result[4U] = r0_4.f4;
- result[5U] = r5_9.fst;
- result[6U] = r5_9.snd;
- result[7U] = r5_9.thd;
- result[8U] = r5_9.f3;
- result[9U] = r5_9.f4;
- memcpy(ret, result, (size_t)10U * sizeof(uint8_t));
-}
-
-/**
-This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
-libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
-*/
-static inline void libcrux_ml_kem_vector_portable_serialize_5_0d(
- libcrux_ml_kem_vector_portable_vector_type_PortableVector a,
- uint8_t ret[10U]) {
- libcrux_ml_kem_vector_portable_serialize_serialize_5(a, ret);
-}
-
-static KRML_MUSTINLINE int16_t_x8
-libcrux_ml_kem_vector_portable_serialize_deserialize_5_int(
- Eurydice_slice bytes) {
- int16_t v0 = (int16_t)((uint32_t)Eurydice_slice_index(bytes, (size_t)0U,
- uint8_t, uint8_t *) &
- 31U);
- int16_t v1 = (int16_t)(((uint32_t)Eurydice_slice_index(bytes, (size_t)1U,
- uint8_t, uint8_t *) &
- 3U) << 3U |
- (uint32_t)Eurydice_slice_index(bytes, (size_t)0U,
- uint8_t, uint8_t *) >>
- 5U);
- int16_t v2 = (int16_t)((uint32_t)Eurydice_slice_index(bytes, (size_t)1U,
- uint8_t, uint8_t *) >>
- 2U &
- 31U);
- int16_t v3 = (int16_t)(((uint32_t)Eurydice_slice_index(bytes, (size_t)2U,
- uint8_t, uint8_t *) &
- 15U)
- << 1U |
- (uint32_t)Eurydice_slice_index(bytes, (size_t)1U,
- uint8_t, uint8_t *) >>
- 7U);
- int16_t v4 = (int16_t)(((uint32_t)Eurydice_slice_index(bytes, (size_t)3U,
- uint8_t, uint8_t *) &
- 1U) << 4U |
- (uint32_t)Eurydice_slice_index(bytes, (size_t)2U,
- uint8_t, uint8_t *) >>
- 4U);
- int16_t v5 = (int16_t)((uint32_t)Eurydice_slice_index(bytes, (size_t)3U,
- uint8_t, uint8_t *) >>
- 1U &
- 31U);
- int16_t v6 = (int16_t)(((uint32_t)Eurydice_slice_index(bytes, (size_t)4U,
- uint8_t, uint8_t *) &
- 7U) << 2U |
- (uint32_t)Eurydice_slice_index(bytes, (size_t)3U,
- uint8_t, uint8_t *) >>
- 6U);
- int16_t v7 = (int16_t)((uint32_t)Eurydice_slice_index(bytes, (size_t)4U,
- uint8_t, uint8_t *) >>
- 3U);
- return (CLITERAL(int16_t_x8){.fst = v0,
- .snd = v1,
- .thd = v2,
- .f3 = v3,
- .f4 = v4,
- .f5 = v5,
- .f6 = v6,
- .f7 = v7});
-}
-
-static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
-libcrux_ml_kem_vector_portable_serialize_deserialize_5(Eurydice_slice bytes) {
- int16_t_x8 v0_7 = libcrux_ml_kem_vector_portable_serialize_deserialize_5_int(
- Eurydice_slice_subslice2(bytes, (size_t)0U, (size_t)5U, uint8_t));
- int16_t_x8 v8_15 = libcrux_ml_kem_vector_portable_serialize_deserialize_5_int(
- Eurydice_slice_subslice2(bytes, (size_t)5U, (size_t)10U, uint8_t));
- libcrux_ml_kem_vector_portable_vector_type_PortableVector v =
- libcrux_ml_kem_vector_portable_vector_type_zero();
- v.elements[0U] = v0_7.fst;
- v.elements[1U] = v0_7.snd;
- v.elements[2U] = v0_7.thd;
- v.elements[3U] = v0_7.f3;
- v.elements[4U] = v0_7.f4;
- v.elements[5U] = v0_7.f5;
- v.elements[6U] = v0_7.f6;
- v.elements[7U] = v0_7.f7;
- v.elements[8U] = v8_15.fst;
- v.elements[9U] = v8_15.snd;
- v.elements[10U] = v8_15.thd;
- v.elements[11U] = v8_15.f3;
- v.elements[12U] = v8_15.f4;
- v.elements[13U] = v8_15.f5;
- v.elements[14U] = v8_15.f6;
- v.elements[15U] = v8_15.f7;
- return v;
-}
-
-/**
-This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
-libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
-*/
-static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
-libcrux_ml_kem_vector_portable_deserialize_5_0d(Eurydice_slice a) {
- return libcrux_ml_kem_vector_portable_serialize_deserialize_5(a);
-}
-
-static KRML_MUSTINLINE uint8_t_x5
-libcrux_ml_kem_vector_portable_serialize_serialize_10_int(Eurydice_slice v) {
- uint8_t r0 =
- (uint8_t)(Eurydice_slice_index(v, (size_t)0U, int16_t, int16_t *) &
- (int16_t)255);
- uint8_t r1 = (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)1U, int16_t,
- int16_t *) &
- (int16_t)63)
- << 2U |
- (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)0U, int16_t,
- int16_t *) >>
- 8U &
- (int16_t)3);
- uint8_t r2 = (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)2U, int16_t,
- int16_t *) &
- (int16_t)15)
- << 4U |
- (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)1U, int16_t,
- int16_t *) >>
- 6U &
- (int16_t)15);
- uint8_t r3 = (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)3U, int16_t,
- int16_t *) &
- (int16_t)3)
- << 6U |
- (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)2U, int16_t,
- int16_t *) >>
- 4U &
- (int16_t)63);
- uint8_t r4 =
- (uint8_t)(Eurydice_slice_index(v, (size_t)3U, int16_t, int16_t *) >> 2U &
- (int16_t)255);
- return (CLITERAL(uint8_t_x5){
+ (uint32_t)libcrux_secrets_int_as_u8_f5(
+ Eurydice_slice_index(v, (size_t)3U, int16_t, int16_t *) & (int16_t)3)
+ << 6U |
+ (uint32_t)libcrux_secrets_int_as_u8_f5(
+ Eurydice_slice_index(v, (size_t)2U, int16_t, int16_t *) >> 4U &
+ (int16_t)63);
+ uint8_t r4 = libcrux_secrets_int_as_u8_f5(
+ Eurydice_slice_index(v, (size_t)3U, int16_t, int16_t *) >> 2U &
+ (int16_t)255);
+ return (KRML_CLITERAL(uint8_t_x5){
.fst = r0, .snd = r1, .thd = r2, .f3 = r3, .f4 = r4});
}
@@ -7751,143 +6623,159 @@ libcrux_ml_kem_vector_portable_serialize_serialize_10(
libcrux_ml_kem_vector_portable_vector_type_PortableVector v,
uint8_t ret[20U]) {
uint8_t_x5 r0_4 = libcrux_ml_kem_vector_portable_serialize_serialize_10_int(
- Eurydice_array_to_subslice2(v.elements, (size_t)0U, (size_t)4U, int16_t));
+ Eurydice_array_to_subslice3(v.elements, (size_t)0U, (size_t)4U,
+ int16_t *));
uint8_t_x5 r5_9 = libcrux_ml_kem_vector_portable_serialize_serialize_10_int(
- Eurydice_array_to_subslice2(v.elements, (size_t)4U, (size_t)8U, int16_t));
+ Eurydice_array_to_subslice3(v.elements, (size_t)4U, (size_t)8U,
+ int16_t *));
uint8_t_x5 r10_14 = libcrux_ml_kem_vector_portable_serialize_serialize_10_int(
- Eurydice_array_to_subslice2(v.elements, (size_t)8U, (size_t)12U,
- int16_t));
+ Eurydice_array_to_subslice3(v.elements, (size_t)8U, (size_t)12U,
+ int16_t *));
uint8_t_x5 r15_19 = libcrux_ml_kem_vector_portable_serialize_serialize_10_int(
- Eurydice_array_to_subslice2(v.elements, (size_t)12U, (size_t)16U,
- int16_t));
- uint8_t result[20U] = {0U};
- result[0U] = r0_4.fst;
- result[1U] = r0_4.snd;
- result[2U] = r0_4.thd;
- result[3U] = r0_4.f3;
- result[4U] = r0_4.f4;
- result[5U] = r5_9.fst;
- result[6U] = r5_9.snd;
- result[7U] = r5_9.thd;
- result[8U] = r5_9.f3;
- result[9U] = r5_9.f4;
- result[10U] = r10_14.fst;
- result[11U] = r10_14.snd;
- result[12U] = r10_14.thd;
- result[13U] = r10_14.f3;
- result[14U] = r10_14.f4;
- result[15U] = r15_19.fst;
- result[16U] = r15_19.snd;
- result[17U] = r15_19.thd;
- result[18U] = r15_19.f3;
- result[19U] = r15_19.f4;
- memcpy(ret, result, (size_t)20U * sizeof(uint8_t));
+ Eurydice_array_to_subslice3(v.elements, (size_t)12U, (size_t)16U,
+ int16_t *));
+ ret[0U] = r0_4.fst;
+ ret[1U] = r0_4.snd;
+ ret[2U] = r0_4.thd;
+ ret[3U] = r0_4.f3;
+ ret[4U] = r0_4.f4;
+ ret[5U] = r5_9.fst;
+ ret[6U] = r5_9.snd;
+ ret[7U] = r5_9.thd;
+ ret[8U] = r5_9.f3;
+ ret[9U] = r5_9.f4;
+ ret[10U] = r10_14.fst;
+ ret[11U] = r10_14.snd;
+ ret[12U] = r10_14.thd;
+ ret[13U] = r10_14.f3;
+ ret[14U] = r10_14.f4;
+ ret[15U] = r15_19.fst;
+ ret[16U] = r15_19.snd;
+ ret[17U] = r15_19.thd;
+ ret[18U] = r15_19.f3;
+ ret[19U] = r15_19.f4;
+}
+
+static inline void libcrux_ml_kem_vector_portable_serialize_10(
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector a,
+ uint8_t ret[20U]) {
+ uint8_t ret0[20U];
+ libcrux_ml_kem_vector_portable_serialize_serialize_10(a, ret0);
+ libcrux_secrets_int_public_integers_declassify_d8_57(ret0, ret);
}
/**
-This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
-libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
+This function found in impl {libcrux_ml_kem::vector::traits::Operations for
+libcrux_ml_kem::vector::portable::vector_type::PortableVector}
*/
-static inline void libcrux_ml_kem_vector_portable_serialize_10_0d(
+static inline void libcrux_ml_kem_vector_portable_serialize_10_b8(
libcrux_ml_kem_vector_portable_vector_type_PortableVector a,
uint8_t ret[20U]) {
- libcrux_ml_kem_vector_portable_serialize_serialize_10(a, ret);
+ libcrux_ml_kem_vector_portable_serialize_10(a, ret);
}
static KRML_MUSTINLINE int16_t_x8
libcrux_ml_kem_vector_portable_serialize_deserialize_10_int(
Eurydice_slice bytes) {
- int16_t r0 =
- ((int16_t)Eurydice_slice_index(bytes, (size_t)1U, uint8_t, uint8_t *) &
+ int16_t r0 = libcrux_secrets_int_as_i16_f5(
+ (libcrux_secrets_int_as_i16_59(
+ Eurydice_slice_index(bytes, (size_t)1U, uint8_t, uint8_t *)) &
(int16_t)3)
<< 8U |
- ((int16_t)Eurydice_slice_index(bytes, (size_t)0U, uint8_t, uint8_t *) &
- (int16_t)255);
- int16_t r1 =
- ((int16_t)Eurydice_slice_index(bytes, (size_t)2U, uint8_t, uint8_t *) &
+ (libcrux_secrets_int_as_i16_59(
+ Eurydice_slice_index(bytes, (size_t)0U, uint8_t, uint8_t *)) &
+ (int16_t)255));
+ int16_t r1 = libcrux_secrets_int_as_i16_f5(
+ (libcrux_secrets_int_as_i16_59(
+ Eurydice_slice_index(bytes, (size_t)2U, uint8_t, uint8_t *)) &
(int16_t)15)
<< 6U |
- (int16_t)Eurydice_slice_index(bytes, (size_t)1U, uint8_t, uint8_t *) >>
- 2U;
- int16_t r2 =
- ((int16_t)Eurydice_slice_index(bytes, (size_t)3U, uint8_t, uint8_t *) &
+ libcrux_secrets_int_as_i16_59(
+ Eurydice_slice_index(bytes, (size_t)1U, uint8_t, uint8_t *)) >>
+ 2U);
+ int16_t r2 = libcrux_secrets_int_as_i16_f5(
+ (libcrux_secrets_int_as_i16_59(
+ Eurydice_slice_index(bytes, (size_t)3U, uint8_t, uint8_t *)) &
(int16_t)63)
<< 4U |
- (int16_t)Eurydice_slice_index(bytes, (size_t)2U, uint8_t, uint8_t *) >>
- 4U;
- int16_t r3 =
- (int16_t)Eurydice_slice_index(bytes, (size_t)4U, uint8_t, uint8_t *)
+ libcrux_secrets_int_as_i16_59(
+ Eurydice_slice_index(bytes, (size_t)2U, uint8_t, uint8_t *)) >>
+ 4U);
+ int16_t r3 = libcrux_secrets_int_as_i16_f5(
+ libcrux_secrets_int_as_i16_59(
+ Eurydice_slice_index(bytes, (size_t)4U, uint8_t, uint8_t *))
<< 2U |
- (int16_t)Eurydice_slice_index(bytes, (size_t)3U, uint8_t, uint8_t *) >>
- 6U;
- int16_t r4 =
- ((int16_t)Eurydice_slice_index(bytes, (size_t)6U, uint8_t, uint8_t *) &
+ libcrux_secrets_int_as_i16_59(
+ Eurydice_slice_index(bytes, (size_t)3U, uint8_t, uint8_t *)) >>
+ 6U);
+ int16_t r4 = libcrux_secrets_int_as_i16_f5(
+ (libcrux_secrets_int_as_i16_59(
+ Eurydice_slice_index(bytes, (size_t)6U, uint8_t, uint8_t *)) &
(int16_t)3)
<< 8U |
- ((int16_t)Eurydice_slice_index(bytes, (size_t)5U, uint8_t, uint8_t *) &
- (int16_t)255);
- int16_t r5 =
- ((int16_t)Eurydice_slice_index(bytes, (size_t)7U, uint8_t, uint8_t *) &
+ (libcrux_secrets_int_as_i16_59(
+ Eurydice_slice_index(bytes, (size_t)5U, uint8_t, uint8_t *)) &
+ (int16_t)255));
+ int16_t r5 = libcrux_secrets_int_as_i16_f5(
+ (libcrux_secrets_int_as_i16_59(
+ Eurydice_slice_index(bytes, (size_t)7U, uint8_t, uint8_t *)) &
(int16_t)15)
<< 6U |
- (int16_t)Eurydice_slice_index(bytes, (size_t)6U, uint8_t, uint8_t *) >>
- 2U;
- int16_t r6 =
- ((int16_t)Eurydice_slice_index(bytes, (size_t)8U, uint8_t, uint8_t *) &
+ libcrux_secrets_int_as_i16_59(
+ Eurydice_slice_index(bytes, (size_t)6U, uint8_t, uint8_t *)) >>
+ 2U);
+ int16_t r6 = libcrux_secrets_int_as_i16_f5(
+ (libcrux_secrets_int_as_i16_59(
+ Eurydice_slice_index(bytes, (size_t)8U, uint8_t, uint8_t *)) &
(int16_t)63)
<< 4U |
- (int16_t)Eurydice_slice_index(bytes, (size_t)7U, uint8_t, uint8_t *) >>
- 4U;
- int16_t r7 =
- (int16_t)Eurydice_slice_index(bytes, (size_t)9U, uint8_t, uint8_t *)
+ libcrux_secrets_int_as_i16_59(
+ Eurydice_slice_index(bytes, (size_t)7U, uint8_t, uint8_t *)) >>
+ 4U);
+ int16_t r7 = libcrux_secrets_int_as_i16_f5(
+ libcrux_secrets_int_as_i16_59(
+ Eurydice_slice_index(bytes, (size_t)9U, uint8_t, uint8_t *))
<< 2U |
- (int16_t)Eurydice_slice_index(bytes, (size_t)8U, uint8_t, uint8_t *) >>
- 6U;
- return (CLITERAL(int16_t_x8){.fst = r0,
- .snd = r1,
- .thd = r2,
- .f3 = r3,
- .f4 = r4,
- .f5 = r5,
- .f6 = r6,
- .f7 = r7});
+ libcrux_secrets_int_as_i16_59(
+ Eurydice_slice_index(bytes, (size_t)8U, uint8_t, uint8_t *)) >>
+ 6U);
+ return (KRML_CLITERAL(int16_t_x8){.fst = r0,
+ .snd = r1,
+ .thd = r2,
+ .f3 = r3,
+ .f4 = r4,
+ .f5 = r5,
+ .f6 = r6,
+ .f7 = r7});
}
static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_serialize_deserialize_10(Eurydice_slice bytes) {
int16_t_x8 v0_7 = libcrux_ml_kem_vector_portable_serialize_deserialize_10_int(
- Eurydice_slice_subslice2(bytes, (size_t)0U, (size_t)10U, uint8_t));
+ Eurydice_slice_subslice3(bytes, (size_t)0U, (size_t)10U, uint8_t *));
int16_t_x8 v8_15 =
libcrux_ml_kem_vector_portable_serialize_deserialize_10_int(
- Eurydice_slice_subslice2(bytes, (size_t)10U, (size_t)20U, uint8_t));
- libcrux_ml_kem_vector_portable_vector_type_PortableVector v =
- libcrux_ml_kem_vector_portable_vector_type_zero();
- v.elements[0U] = v0_7.fst;
- v.elements[1U] = v0_7.snd;
- v.elements[2U] = v0_7.thd;
- v.elements[3U] = v0_7.f3;
- v.elements[4U] = v0_7.f4;
- v.elements[5U] = v0_7.f5;
- v.elements[6U] = v0_7.f6;
- v.elements[7U] = v0_7.f7;
- v.elements[8U] = v8_15.fst;
- v.elements[9U] = v8_15.snd;
- v.elements[10U] = v8_15.thd;
- v.elements[11U] = v8_15.f3;
- v.elements[12U] = v8_15.f4;
- v.elements[13U] = v8_15.f5;
- v.elements[14U] = v8_15.f6;
- v.elements[15U] = v8_15.f7;
- return v;
+ Eurydice_slice_subslice3(bytes, (size_t)10U, (size_t)20U, uint8_t *));
+ return (
+ KRML_CLITERAL(libcrux_ml_kem_vector_portable_vector_type_PortableVector){
+ .elements = {v0_7.fst, v0_7.snd, v0_7.thd, v0_7.f3, v0_7.f4, v0_7.f5,
+ v0_7.f6, v0_7.f7, v8_15.fst, v8_15.snd, v8_15.thd,
+ v8_15.f3, v8_15.f4, v8_15.f5, v8_15.f6, v8_15.f7}});
+}
+
+static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
+libcrux_ml_kem_vector_portable_deserialize_10(Eurydice_slice a) {
+ return libcrux_ml_kem_vector_portable_serialize_deserialize_10(
+ libcrux_secrets_int_classify_public_classify_ref_9b_90(a));
}
/**
-This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
-libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
+This function found in impl {libcrux_ml_kem::vector::traits::Operations for
+libcrux_ml_kem::vector::portable::vector_type::PortableVector}
*/
static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
-libcrux_ml_kem_vector_portable_deserialize_10_0d(Eurydice_slice a) {
- return libcrux_ml_kem_vector_portable_serialize_deserialize_10(a);
+libcrux_ml_kem_vector_portable_deserialize_10_b8(Eurydice_slice a) {
+ return libcrux_ml_kem_vector_portable_deserialize_10(a);
}
typedef struct uint8_t_x3_s {
@@ -7898,18 +6786,16 @@ typedef struct uint8_t_x3_s {
static KRML_MUSTINLINE uint8_t_x3
libcrux_ml_kem_vector_portable_serialize_serialize_12_int(Eurydice_slice v) {
- uint8_t r0 =
- (uint8_t)(Eurydice_slice_index(v, (size_t)0U, int16_t, int16_t *) &
- (int16_t)255);
- uint8_t r1 =
- (uint8_t)(Eurydice_slice_index(v, (size_t)0U, int16_t, int16_t *) >> 8U |
- (Eurydice_slice_index(v, (size_t)1U, int16_t, int16_t *) &
- (int16_t)15)
- << 4U);
- uint8_t r2 =
- (uint8_t)(Eurydice_slice_index(v, (size_t)1U, int16_t, int16_t *) >> 4U &
- (int16_t)255);
- return (CLITERAL(uint8_t_x3){.fst = r0, .snd = r1, .thd = r2});
+ uint8_t r0 = libcrux_secrets_int_as_u8_f5(
+ Eurydice_slice_index(v, (size_t)0U, int16_t, int16_t *) & (int16_t)255);
+ uint8_t r1 = libcrux_secrets_int_as_u8_f5(
+ Eurydice_slice_index(v, (size_t)0U, int16_t, int16_t *) >> 8U |
+ (Eurydice_slice_index(v, (size_t)1U, int16_t, int16_t *) & (int16_t)15)
+ << 4U);
+ uint8_t r2 = libcrux_secrets_int_as_u8_f5(
+ Eurydice_slice_index(v, (size_t)1U, int16_t, int16_t *) >> 4U &
+ (int16_t)255);
+ return (KRML_CLITERAL(uint8_t_x3){.fst = r0, .snd = r1, .thd = r2});
}
static KRML_MUSTINLINE void
@@ -7917,61 +6803,71 @@ libcrux_ml_kem_vector_portable_serialize_serialize_12(
libcrux_ml_kem_vector_portable_vector_type_PortableVector v,
uint8_t ret[24U]) {
uint8_t_x3 r0_2 = libcrux_ml_kem_vector_portable_serialize_serialize_12_int(
- Eurydice_array_to_subslice2(v.elements, (size_t)0U, (size_t)2U, int16_t));
+ Eurydice_array_to_subslice3(v.elements, (size_t)0U, (size_t)2U,
+ int16_t *));
uint8_t_x3 r3_5 = libcrux_ml_kem_vector_portable_serialize_serialize_12_int(
- Eurydice_array_to_subslice2(v.elements, (size_t)2U, (size_t)4U, int16_t));
+ Eurydice_array_to_subslice3(v.elements, (size_t)2U, (size_t)4U,
+ int16_t *));
uint8_t_x3 r6_8 = libcrux_ml_kem_vector_portable_serialize_serialize_12_int(
- Eurydice_array_to_subslice2(v.elements, (size_t)4U, (size_t)6U, int16_t));
+ Eurydice_array_to_subslice3(v.elements, (size_t)4U, (size_t)6U,
+ int16_t *));
uint8_t_x3 r9_11 = libcrux_ml_kem_vector_portable_serialize_serialize_12_int(
- Eurydice_array_to_subslice2(v.elements, (size_t)6U, (size_t)8U, int16_t));
+ Eurydice_array_to_subslice3(v.elements, (size_t)6U, (size_t)8U,
+ int16_t *));
uint8_t_x3 r12_14 = libcrux_ml_kem_vector_portable_serialize_serialize_12_int(
- Eurydice_array_to_subslice2(v.elements, (size_t)8U, (size_t)10U,
- int16_t));
+ Eurydice_array_to_subslice3(v.elements, (size_t)8U, (size_t)10U,
+ int16_t *));
uint8_t_x3 r15_17 = libcrux_ml_kem_vector_portable_serialize_serialize_12_int(
- Eurydice_array_to_subslice2(v.elements, (size_t)10U, (size_t)12U,
- int16_t));
+ Eurydice_array_to_subslice3(v.elements, (size_t)10U, (size_t)12U,
+ int16_t *));
uint8_t_x3 r18_20 = libcrux_ml_kem_vector_portable_serialize_serialize_12_int(
- Eurydice_array_to_subslice2(v.elements, (size_t)12U, (size_t)14U,
- int16_t));
+ Eurydice_array_to_subslice3(v.elements, (size_t)12U, (size_t)14U,
+ int16_t *));
uint8_t_x3 r21_23 = libcrux_ml_kem_vector_portable_serialize_serialize_12_int(
- Eurydice_array_to_subslice2(v.elements, (size_t)14U, (size_t)16U,
- int16_t));
- uint8_t result[24U] = {0U};
- result[0U] = r0_2.fst;
- result[1U] = r0_2.snd;
- result[2U] = r0_2.thd;
- result[3U] = r3_5.fst;
- result[4U] = r3_5.snd;
- result[5U] = r3_5.thd;
- result[6U] = r6_8.fst;
- result[7U] = r6_8.snd;
- result[8U] = r6_8.thd;
- result[9U] = r9_11.fst;
- result[10U] = r9_11.snd;
- result[11U] = r9_11.thd;
- result[12U] = r12_14.fst;
- result[13U] = r12_14.snd;
- result[14U] = r12_14.thd;
- result[15U] = r15_17.fst;
- result[16U] = r15_17.snd;
- result[17U] = r15_17.thd;
- result[18U] = r18_20.fst;
- result[19U] = r18_20.snd;
- result[20U] = r18_20.thd;
- result[21U] = r21_23.fst;
- result[22U] = r21_23.snd;
- result[23U] = r21_23.thd;
- memcpy(ret, result, (size_t)24U * sizeof(uint8_t));
+ Eurydice_array_to_subslice3(v.elements, (size_t)14U, (size_t)16U,
+ int16_t *));
+ ret[0U] = r0_2.fst;
+ ret[1U] = r0_2.snd;
+ ret[2U] = r0_2.thd;
+ ret[3U] = r3_5.fst;
+ ret[4U] = r3_5.snd;
+ ret[5U] = r3_5.thd;
+ ret[6U] = r6_8.fst;
+ ret[7U] = r6_8.snd;
+ ret[8U] = r6_8.thd;
+ ret[9U] = r9_11.fst;
+ ret[10U] = r9_11.snd;
+ ret[11U] = r9_11.thd;
+ ret[12U] = r12_14.fst;
+ ret[13U] = r12_14.snd;
+ ret[14U] = r12_14.thd;
+ ret[15U] = r15_17.fst;
+ ret[16U] = r15_17.snd;
+ ret[17U] = r15_17.thd;
+ ret[18U] = r18_20.fst;
+ ret[19U] = r18_20.snd;
+ ret[20U] = r18_20.thd;
+ ret[21U] = r21_23.fst;
+ ret[22U] = r21_23.snd;
+ ret[23U] = r21_23.thd;
+}
+
+static inline void libcrux_ml_kem_vector_portable_serialize_12(
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector a,
+ uint8_t ret[24U]) {
+ uint8_t ret0[24U];
+ libcrux_ml_kem_vector_portable_serialize_serialize_12(a, ret0);
+ libcrux_secrets_int_public_integers_declassify_d8_d2(ret0, ret);
}
/**
-This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
-libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
+This function found in impl {libcrux_ml_kem::vector::traits::Operations for
+libcrux_ml_kem::vector::portable::vector_type::PortableVector}
*/
-static inline void libcrux_ml_kem_vector_portable_serialize_12_0d(
+static inline void libcrux_ml_kem_vector_portable_serialize_12_b8(
libcrux_ml_kem_vector_portable_vector_type_PortableVector a,
uint8_t ret[24U]) {
- libcrux_ml_kem_vector_portable_serialize_serialize_12(a, ret);
+ libcrux_ml_kem_vector_portable_serialize_12(a, ret);
}
typedef struct int16_t_x2_s {
@@ -7982,66 +6878,59 @@ typedef struct int16_t_x2_s {
static KRML_MUSTINLINE int16_t_x2
libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(
Eurydice_slice bytes) {
- int16_t byte0 =
- (int16_t)Eurydice_slice_index(bytes, (size_t)0U, uint8_t, uint8_t *);
- int16_t byte1 =
- (int16_t)Eurydice_slice_index(bytes, (size_t)1U, uint8_t, uint8_t *);
- int16_t byte2 =
- (int16_t)Eurydice_slice_index(bytes, (size_t)2U, uint8_t, uint8_t *);
+ int16_t byte0 = libcrux_secrets_int_as_i16_59(
+ Eurydice_slice_index(bytes, (size_t)0U, uint8_t, uint8_t *));
+ int16_t byte1 = libcrux_secrets_int_as_i16_59(
+ Eurydice_slice_index(bytes, (size_t)1U, uint8_t, uint8_t *));
+ int16_t byte2 = libcrux_secrets_int_as_i16_59(
+ Eurydice_slice_index(bytes, (size_t)2U, uint8_t, uint8_t *));
int16_t r0 = (byte1 & (int16_t)15) << 8U | (byte0 & (int16_t)255);
int16_t r1 = byte2 << 4U | (byte1 >> 4U & (int16_t)15);
- return (CLITERAL(int16_t_x2){.fst = r0, .snd = r1});
+ return (KRML_CLITERAL(int16_t_x2){.fst = r0, .snd = r1});
}
static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_serialize_deserialize_12(Eurydice_slice bytes) {
int16_t_x2 v0_1 = libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(
- Eurydice_slice_subslice2(bytes, (size_t)0U, (size_t)3U, uint8_t));
+ Eurydice_slice_subslice3(bytes, (size_t)0U, (size_t)3U, uint8_t *));
int16_t_x2 v2_3 = libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(
- Eurydice_slice_subslice2(bytes, (size_t)3U, (size_t)6U, uint8_t));
+ Eurydice_slice_subslice3(bytes, (size_t)3U, (size_t)6U, uint8_t *));
int16_t_x2 v4_5 = libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(
- Eurydice_slice_subslice2(bytes, (size_t)6U, (size_t)9U, uint8_t));
+ Eurydice_slice_subslice3(bytes, (size_t)6U, (size_t)9U, uint8_t *));
int16_t_x2 v6_7 = libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(
- Eurydice_slice_subslice2(bytes, (size_t)9U, (size_t)12U, uint8_t));
+ Eurydice_slice_subslice3(bytes, (size_t)9U, (size_t)12U, uint8_t *));
int16_t_x2 v8_9 = libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(
- Eurydice_slice_subslice2(bytes, (size_t)12U, (size_t)15U, uint8_t));
+ Eurydice_slice_subslice3(bytes, (size_t)12U, (size_t)15U, uint8_t *));
int16_t_x2 v10_11 =
libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(
- Eurydice_slice_subslice2(bytes, (size_t)15U, (size_t)18U, uint8_t));
+ Eurydice_slice_subslice3(bytes, (size_t)15U, (size_t)18U, uint8_t *));
int16_t_x2 v12_13 =
libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(
- Eurydice_slice_subslice2(bytes, (size_t)18U, (size_t)21U, uint8_t));
+ Eurydice_slice_subslice3(bytes, (size_t)18U, (size_t)21U, uint8_t *));
int16_t_x2 v14_15 =
libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(
- Eurydice_slice_subslice2(bytes, (size_t)21U, (size_t)24U, uint8_t));
- libcrux_ml_kem_vector_portable_vector_type_PortableVector re =
- libcrux_ml_kem_vector_portable_vector_type_zero();
- re.elements[0U] = v0_1.fst;
- re.elements[1U] = v0_1.snd;
- re.elements[2U] = v2_3.fst;
- re.elements[3U] = v2_3.snd;
- re.elements[4U] = v4_5.fst;
- re.elements[5U] = v4_5.snd;
- re.elements[6U] = v6_7.fst;
- re.elements[7U] = v6_7.snd;
- re.elements[8U] = v8_9.fst;
- re.elements[9U] = v8_9.snd;
- re.elements[10U] = v10_11.fst;
- re.elements[11U] = v10_11.snd;
- re.elements[12U] = v12_13.fst;
- re.elements[13U] = v12_13.snd;
- re.elements[14U] = v14_15.fst;
- re.elements[15U] = v14_15.snd;
- return re;
+ Eurydice_slice_subslice3(bytes, (size_t)21U, (size_t)24U, uint8_t *));
+ return (
+ KRML_CLITERAL(libcrux_ml_kem_vector_portable_vector_type_PortableVector){
+ .elements = {v0_1.fst, v0_1.snd, v2_3.fst, v2_3.snd, v4_5.fst,
+ v4_5.snd, v6_7.fst, v6_7.snd, v8_9.fst, v8_9.snd,
+ v10_11.fst, v10_11.snd, v12_13.fst, v12_13.snd,
+ v14_15.fst, v14_15.snd}});
+}
+
+static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
+libcrux_ml_kem_vector_portable_deserialize_12(Eurydice_slice a) {
+ return libcrux_ml_kem_vector_portable_serialize_deserialize_12(
+ libcrux_secrets_int_classify_public_classify_ref_9b_90(a));
}
/**
-This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
-libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
+This function found in impl {libcrux_ml_kem::vector::traits::Operations for
+libcrux_ml_kem::vector::portable::vector_type::PortableVector}
*/
static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
-libcrux_ml_kem_vector_portable_deserialize_12_0d(Eurydice_slice a) {
- return libcrux_ml_kem_vector_portable_serialize_deserialize_12(a);
+libcrux_ml_kem_vector_portable_deserialize_12_b8(Eurydice_slice a) {
+ return libcrux_ml_kem_vector_portable_deserialize_12(a);
}
static KRML_MUSTINLINE size_t
@@ -8059,46 +6948,16 @@ libcrux_ml_kem_vector_portable_sampling_rej_sample(Eurydice_slice a,
uint8_t, uint8_t *);
int16_t d1 = (b2 & (int16_t)15) << 8U | b1;
int16_t d2 = b3 << 4U | b2 >> 4U;
- bool uu____0;
- int16_t uu____1;
- bool uu____2;
- size_t uu____3;
- int16_t uu____4;
- size_t uu____5;
- int16_t uu____6;
if (d1 < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS) {
if (sampled < (size_t)16U) {
Eurydice_slice_index(result, sampled, int16_t, int16_t *) = d1;
sampled++;
- uu____1 = d2;
- uu____6 = LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS;
- uu____0 = uu____1 < uu____6;
- if (uu____0) {
- uu____3 = sampled;
- uu____2 = uu____3 < (size_t)16U;
- if (uu____2) {
- uu____4 = d2;
- uu____5 = sampled;
- Eurydice_slice_index(result, uu____5, int16_t, int16_t *) = uu____4;
- sampled++;
- continue;
- }
- }
- continue;
}
}
- uu____1 = d2;
- uu____6 = LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS;
- uu____0 = uu____1 < uu____6;
- if (uu____0) {
- uu____3 = sampled;
- uu____2 = uu____3 < (size_t)16U;
- if (uu____2) {
- uu____4 = d2;
- uu____5 = sampled;
- Eurydice_slice_index(result, uu____5, int16_t, int16_t *) = uu____4;
+ if (d2 < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS) {
+ if (sampled < (size_t)16U) {
+ Eurydice_slice_index(result, sampled, int16_t, int16_t *) = d2;
sampled++;
- continue;
}
}
}
@@ -8106,45 +6965,45 @@ libcrux_ml_kem_vector_portable_sampling_rej_sample(Eurydice_slice a,
}
/**
-This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
-libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
+This function found in impl {libcrux_ml_kem::vector::traits::Operations for
+libcrux_ml_kem::vector::portable::vector_type::PortableVector}
*/
-static inline size_t libcrux_ml_kem_vector_portable_rej_sample_0d(
+static inline size_t libcrux_ml_kem_vector_portable_rej_sample_b8(
Eurydice_slice a, Eurydice_slice out) {
return libcrux_ml_kem_vector_portable_sampling_rej_sample(a, out);
}
-#define LIBCRUX_ML_KEM_MLKEM768_VECTOR_U_COMPRESSION_FACTOR_768 ((size_t)10U)
+#define LIBCRUX_ML_KEM_MLKEM768_VECTOR_U_COMPRESSION_FACTOR ((size_t)10U)
-#define LIBCRUX_ML_KEM_MLKEM768_C1_BLOCK_SIZE_768 \
+#define LIBCRUX_ML_KEM_MLKEM768_C1_BLOCK_SIZE \
(LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * \
- LIBCRUX_ML_KEM_MLKEM768_VECTOR_U_COMPRESSION_FACTOR_768 / (size_t)8U)
+ LIBCRUX_ML_KEM_MLKEM768_VECTOR_U_COMPRESSION_FACTOR / (size_t)8U)
-#define LIBCRUX_ML_KEM_MLKEM768_RANK_768 ((size_t)3U)
+#define LIBCRUX_ML_KEM_MLKEM768_RANK ((size_t)3U)
-#define LIBCRUX_ML_KEM_MLKEM768_C1_SIZE_768 \
- (LIBCRUX_ML_KEM_MLKEM768_C1_BLOCK_SIZE_768 * LIBCRUX_ML_KEM_MLKEM768_RANK_768)
+#define LIBCRUX_ML_KEM_MLKEM768_C1_SIZE \
+ (LIBCRUX_ML_KEM_MLKEM768_C1_BLOCK_SIZE * LIBCRUX_ML_KEM_MLKEM768_RANK)
-#define LIBCRUX_ML_KEM_MLKEM768_VECTOR_V_COMPRESSION_FACTOR_768 ((size_t)4U)
+#define LIBCRUX_ML_KEM_MLKEM768_VECTOR_V_COMPRESSION_FACTOR ((size_t)4U)
-#define LIBCRUX_ML_KEM_MLKEM768_C2_SIZE_768 \
+#define LIBCRUX_ML_KEM_MLKEM768_C2_SIZE \
(LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * \
- LIBCRUX_ML_KEM_MLKEM768_VECTOR_V_COMPRESSION_FACTOR_768 / (size_t)8U)
+ LIBCRUX_ML_KEM_MLKEM768_VECTOR_V_COMPRESSION_FACTOR / (size_t)8U)
-#define LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_CIPHERTEXT_SIZE_768 \
- (LIBCRUX_ML_KEM_MLKEM768_C1_SIZE_768 + LIBCRUX_ML_KEM_MLKEM768_C2_SIZE_768)
+#define LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_CIPHERTEXT_SIZE \
+ (LIBCRUX_ML_KEM_MLKEM768_C1_SIZE + LIBCRUX_ML_KEM_MLKEM768_C2_SIZE)
-#define LIBCRUX_ML_KEM_MLKEM768_T_AS_NTT_ENCODED_SIZE_768 \
- (LIBCRUX_ML_KEM_MLKEM768_RANK_768 * \
+#define LIBCRUX_ML_KEM_MLKEM768_T_AS_NTT_ENCODED_SIZE \
+ (LIBCRUX_ML_KEM_MLKEM768_RANK * \
LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * \
LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_COEFFICIENT / (size_t)8U)
-#define LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_PUBLIC_KEY_SIZE_768 \
- (LIBCRUX_ML_KEM_MLKEM768_T_AS_NTT_ENCODED_SIZE_768 + (size_t)32U)
+#define LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_PUBLIC_KEY_SIZE \
+ (LIBCRUX_ML_KEM_MLKEM768_T_AS_NTT_ENCODED_SIZE + (size_t)32U)
-#define LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_SECRET_KEY_SIZE_768 \
- (LIBCRUX_ML_KEM_MLKEM768_RANK_768 * \
- LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * \
+#define LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_SECRET_KEY_SIZE \
+ (LIBCRUX_ML_KEM_MLKEM768_RANK * \
+ LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * \
LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_COEFFICIENT / (size_t)8U)
#define LIBCRUX_ML_KEM_MLKEM768_ETA1 ((size_t)2U)
@@ -8159,22 +7018,22 @@ static inline size_t libcrux_ml_kem_vector_portable_rej_sample_0d(
#define LIBCRUX_ML_KEM_MLKEM768_IMPLICIT_REJECTION_HASH_INPUT_SIZE \
(LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE + \
- LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_CIPHERTEXT_SIZE_768)
+ LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_CIPHERTEXT_SIZE)
-typedef libcrux_ml_kem_types_MlKemPrivateKey_55
+typedef libcrux_ml_kem_types_MlKemPrivateKey_d9
libcrux_ml_kem_mlkem768_MlKem768PrivateKey;
-typedef libcrux_ml_kem_types_MlKemPublicKey_15
+typedef libcrux_ml_kem_types_MlKemPublicKey_30
libcrux_ml_kem_mlkem768_MlKem768PublicKey;
-#define LIBCRUX_ML_KEM_MLKEM768_RANKED_BYTES_PER_RING_ELEMENT_768 \
- (LIBCRUX_ML_KEM_MLKEM768_RANK_768 * \
+#define LIBCRUX_ML_KEM_MLKEM768_RANKED_BYTES_PER_RING_ELEMENT \
+ (LIBCRUX_ML_KEM_MLKEM768_RANK * \
LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_RING_ELEMENT / (size_t)8U)
-#define LIBCRUX_ML_KEM_MLKEM768_SECRET_KEY_SIZE_768 \
- (LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_SECRET_KEY_SIZE_768 + \
- LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_PUBLIC_KEY_SIZE_768 + \
- LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE + \
+#define LIBCRUX_ML_KEM_MLKEM768_SECRET_KEY_SIZE \
+ (LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_SECRET_KEY_SIZE + \
+ LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_PUBLIC_KEY_SIZE + \
+ LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE + \
LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE)
/**
@@ -8182,51 +7041,65 @@ A monomorphic instance of libcrux_ml_kem.polynomial.PolynomialRingElement
with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
*/
-typedef struct libcrux_ml_kem_polynomial_PolynomialRingElement_f0_s {
+typedef struct libcrux_ml_kem_polynomial_PolynomialRingElement_1d_s {
libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficients[16U];
-} libcrux_ml_kem_polynomial_PolynomialRingElement_f0;
+} libcrux_ml_kem_polynomial_PolynomialRingElement_1d;
+
+/**
+A monomorphic instance of
+libcrux_ml_kem.ind_cpa.unpacked.IndCpaPrivateKeyUnpacked with types
+libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
+- $3size_t
+*/
+typedef struct libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_a0_s {
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d secret_as_ntt[3U];
+} libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_a0;
/**
This function found in impl
-{libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0]}
+{libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0,
+TraitClause@1]}
*/
/**
-A monomorphic instance of libcrux_ml_kem.polynomial.ZERO_89
+A monomorphic instance of libcrux_ml_kem.polynomial.ZERO_d6
with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
with const generics
*/
-static inline libcrux_ml_kem_polynomial_PolynomialRingElement_f0
-libcrux_ml_kem_polynomial_ZERO_89_ea(void) {
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 lit;
- lit.coefficients[0U] = libcrux_ml_kem_vector_portable_ZERO_0d();
- lit.coefficients[1U] = libcrux_ml_kem_vector_portable_ZERO_0d();
- lit.coefficients[2U] = libcrux_ml_kem_vector_portable_ZERO_0d();
- lit.coefficients[3U] = libcrux_ml_kem_vector_portable_ZERO_0d();
- lit.coefficients[4U] = libcrux_ml_kem_vector_portable_ZERO_0d();
- lit.coefficients[5U] = libcrux_ml_kem_vector_portable_ZERO_0d();
- lit.coefficients[6U] = libcrux_ml_kem_vector_portable_ZERO_0d();
- lit.coefficients[7U] = libcrux_ml_kem_vector_portable_ZERO_0d();
- lit.coefficients[8U] = libcrux_ml_kem_vector_portable_ZERO_0d();
- lit.coefficients[9U] = libcrux_ml_kem_vector_portable_ZERO_0d();
- lit.coefficients[10U] = libcrux_ml_kem_vector_portable_ZERO_0d();
- lit.coefficients[11U] = libcrux_ml_kem_vector_portable_ZERO_0d();
- lit.coefficients[12U] = libcrux_ml_kem_vector_portable_ZERO_0d();
- lit.coefficients[13U] = libcrux_ml_kem_vector_portable_ZERO_0d();
- lit.coefficients[14U] = libcrux_ml_kem_vector_portable_ZERO_0d();
- lit.coefficients[15U] = libcrux_ml_kem_vector_portable_ZERO_0d();
+static inline libcrux_ml_kem_polynomial_PolynomialRingElement_1d
+libcrux_ml_kem_polynomial_ZERO_d6_ea(void) {
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d lit;
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector
+ repeat_expression[16U];
+ for (size_t i = (size_t)0U; i < (size_t)16U; i++) {
+ repeat_expression[i] = libcrux_ml_kem_vector_portable_ZERO_b8();
+ }
+ memcpy(lit.coefficients, repeat_expression,
+ (size_t)16U *
+ sizeof(libcrux_ml_kem_vector_portable_vector_type_PortableVector));
return lit;
}
/**
-A monomorphic instance of libcrux_ml_kem.ind_cpa.deserialize_secret_key.closure
+This function found in impl {core::ops::function::FnMut<(usize),
+libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0,
+TraitClause@1]> for libcrux_ml_kem::ind_cpa::decrypt::closure<Vector, K,
+CIPHERTEXT_SIZE, VECTOR_U_ENCODED_SIZE, U_COMPRESSION_FACTOR,
+V_COMPRESSION_FACTOR>[TraitClause@0, TraitClause@1]}
+*/
+/**
+A monomorphic instance of libcrux_ml_kem.ind_cpa.decrypt.call_mut_0b
with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
with const generics
- K= 3
+- CIPHERTEXT_SIZE= 1088
+- VECTOR_U_ENCODED_SIZE= 960
+- U_COMPRESSION_FACTOR= 10
+- V_COMPRESSION_FACTOR= 4
*/
-static inline libcrux_ml_kem_polynomial_PolynomialRingElement_f0
-libcrux_ml_kem_ind_cpa_deserialize_secret_key_closure_6b(size_t _) {
- return libcrux_ml_kem_polynomial_ZERO_89_ea();
+static inline libcrux_ml_kem_polynomial_PolynomialRingElement_1d
+libcrux_ml_kem_ind_cpa_decrypt_call_mut_0b_42(void **_, size_t tupled_args) {
+ return libcrux_ml_kem_polynomial_ZERO_d6_ea();
}
/**
@@ -8235,18 +7108,19 @@ libcrux_ml_kem.serialize.deserialize_to_uncompressed_ring_element with types
libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
*/
-static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0
-libcrux_ml_kem_serialize_deserialize_to_uncompressed_ring_element_af(
+static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d
+libcrux_ml_kem_serialize_deserialize_to_uncompressed_ring_element_ea(
Eurydice_slice serialized) {
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re =
- libcrux_ml_kem_polynomial_ZERO_89_ea();
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d re =
+ libcrux_ml_kem_polynomial_ZERO_d6_ea();
for (size_t i = (size_t)0U;
i < Eurydice_slice_len(serialized, uint8_t) / (size_t)24U; i++) {
size_t i0 = i;
- Eurydice_slice bytes = Eurydice_slice_subslice2(
- serialized, i0 * (size_t)24U, i0 * (size_t)24U + (size_t)24U, uint8_t);
+ Eurydice_slice bytes =
+ Eurydice_slice_subslice3(serialized, i0 * (size_t)24U,
+ i0 * (size_t)24U + (size_t)24U, uint8_t *);
libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
- libcrux_ml_kem_vector_portable_deserialize_12_0d(bytes);
+ libcrux_ml_kem_vector_portable_deserialize_12_b8(bytes);
re.coefficients[i0] = uu____0;
}
return re;
@@ -8256,59 +7130,47 @@ libcrux_ml_kem_serialize_deserialize_to_uncompressed_ring_element_af(
Call [`deserialize_to_uncompressed_ring_element`] for each ring element.
*/
/**
-A monomorphic instance of libcrux_ml_kem.ind_cpa.deserialize_secret_key
+A monomorphic instance of libcrux_ml_kem.ind_cpa.deserialize_vector
with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
with const generics
- K= 3
*/
-static KRML_MUSTINLINE void libcrux_ml_kem_ind_cpa_deserialize_secret_key_24(
+static KRML_MUSTINLINE void libcrux_ml_kem_ind_cpa_deserialize_vector_1b(
Eurydice_slice secret_key,
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret[3U]) {
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 secret_as_ntt[3U];
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *secret_as_ntt) {
for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
- secret_as_ntt[i] = libcrux_ml_kem_polynomial_ZERO_89_ea();
- }
- for (size_t i = (size_t)0U;
- i < Eurydice_slice_len(secret_key, uint8_t) /
- LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT;
- i++) {
size_t i0 = i;
- Eurydice_slice secret_bytes = Eurydice_slice_subslice2(
- secret_key, i0 * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT,
- i0 * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT +
- LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT,
- uint8_t);
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 uu____0 =
- libcrux_ml_kem_serialize_deserialize_to_uncompressed_ring_element_af(
- secret_bytes);
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d uu____0 =
+ libcrux_ml_kem_serialize_deserialize_to_uncompressed_ring_element_ea(
+ Eurydice_slice_subslice3(
+ secret_key,
+ i0 * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT,
+ (i0 + (size_t)1U) *
+ LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT,
+ uint8_t *));
secret_as_ntt[i0] = uu____0;
}
- memcpy(
- ret, secret_as_ntt,
- (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
}
/**
-A monomorphic instance of
-libcrux_ml_kem.ind_cpa.unpacked.IndCpaPrivateKeyUnpacked with types
-libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
-- $3size_t
+This function found in impl {core::ops::function::FnMut<(usize),
+libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0,
+TraitClause@1]> for
+libcrux_ml_kem::ind_cpa::deserialize_then_decompress_u::closure<Vector, K,
+CIPHERTEXT_SIZE, U_COMPRESSION_FACTOR>[TraitClause@0, TraitClause@1]}
*/
-typedef struct libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_f8_s {
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 secret_as_ntt[3U];
-} libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_f8;
-
/**
A monomorphic instance of
-libcrux_ml_kem.ind_cpa.deserialize_then_decompress_u.closure with types
+libcrux_ml_kem.ind_cpa.deserialize_then_decompress_u.call_mut_35 with types
libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
- K= 3
- CIPHERTEXT_SIZE= 1088
- U_COMPRESSION_FACTOR= 10
*/
-static inline libcrux_ml_kem_polynomial_PolynomialRingElement_f0
-libcrux_ml_kem_ind_cpa_deserialize_then_decompress_u_closure_7c(size_t _) {
- return libcrux_ml_kem_polynomial_ZERO_89_ea();
+static inline libcrux_ml_kem_polynomial_PolynomialRingElement_1d
+libcrux_ml_kem_ind_cpa_deserialize_then_decompress_u_call_mut_35_6c(
+ void **_, size_t tupled_args) {
+ return libcrux_ml_kem_polynomial_ZERO_d6_ea();
}
/**
@@ -8318,35 +7180,38 @@ const generics
- COEFFICIENT_BITS= 10
*/
static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
-libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_6b(
- libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
+libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_ef(
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector a) {
for (size_t i = (size_t)0U;
i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
size_t i0 = i;
- int32_t decompressed = (int32_t)v.elements[i0] *
- (int32_t)LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS;
+ int32_t decompressed =
+ libcrux_secrets_int_as_i32_f5(a.elements[i0]) *
+ libcrux_secrets_int_as_i32_f5(
+ libcrux_secrets_int_public_integers_classify_27_39(
+ LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS));
decompressed = (decompressed << 1U) + ((int32_t)1 << (uint32_t)(int32_t)10);
decompressed = decompressed >> (uint32_t)((int32_t)10 + (int32_t)1);
- v.elements[i0] = (int16_t)decompressed;
+ a.elements[i0] = libcrux_secrets_int_as_i16_36(decompressed);
}
- return v;
+ return a;
}
/**
-This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
-libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
+This function found in impl {libcrux_ml_kem::vector::traits::Operations for
+libcrux_ml_kem::vector::portable::vector_type::PortableVector}
*/
/**
A monomorphic instance of
-libcrux_ml_kem.vector.portable.decompress_ciphertext_coefficient_0d with const
+libcrux_ml_kem.vector.portable.decompress_ciphertext_coefficient_b8 with const
generics
- COEFFICIENT_BITS= 10
*/
static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
-libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_0d_5a(
- libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
- return libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_6b(
- v);
+libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_b8_ef(
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector a) {
+ return libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_ef(
+ a);
}
/**
@@ -8355,84 +7220,21 @@ libcrux_ml_kem.serialize.deserialize_then_decompress_10 with types
libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
*/
-static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0
-libcrux_ml_kem_serialize_deserialize_then_decompress_10_2c(
+static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d
+libcrux_ml_kem_serialize_deserialize_then_decompress_10_ea(
Eurydice_slice serialized) {
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re =
- libcrux_ml_kem_polynomial_ZERO_89_ea();
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d re =
+ libcrux_ml_kem_polynomial_ZERO_d6_ea();
for (size_t i = (size_t)0U;
i < Eurydice_slice_len(serialized, uint8_t) / (size_t)20U; i++) {
size_t i0 = i;
- Eurydice_slice bytes = Eurydice_slice_subslice2(
- serialized, i0 * (size_t)20U, i0 * (size_t)20U + (size_t)20U, uint8_t);
- libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient =
- libcrux_ml_kem_vector_portable_deserialize_10_0d(bytes);
- libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
- libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_0d_5a(
- coefficient);
- re.coefficients[i0] = uu____0;
- }
- return re;
-}
-
-/**
-A monomorphic instance of
-libcrux_ml_kem.vector.portable.compress.decompress_ciphertext_coefficient with
-const generics
-- COEFFICIENT_BITS= 11
-*/
-static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
-libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_6b0(
- libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
- for (size_t i = (size_t)0U;
- i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
- size_t i0 = i;
- int32_t decompressed = (int32_t)v.elements[i0] *
- (int32_t)LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS;
- decompressed = (decompressed << 1U) + ((int32_t)1 << (uint32_t)(int32_t)11);
- decompressed = decompressed >> (uint32_t)((int32_t)11 + (int32_t)1);
- v.elements[i0] = (int16_t)decompressed;
- }
- return v;
-}
-
-/**
-This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
-libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
-*/
-/**
-A monomorphic instance of
-libcrux_ml_kem.vector.portable.decompress_ciphertext_coefficient_0d with const
-generics
-- COEFFICIENT_BITS= 11
-*/
-static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
-libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_0d_5a0(
- libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
- return libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_6b0(
- v);
-}
-
-/**
-A monomorphic instance of
-libcrux_ml_kem.serialize.deserialize_then_decompress_11 with types
-libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
-
-*/
-static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0
-libcrux_ml_kem_serialize_deserialize_then_decompress_11_8d(
- Eurydice_slice serialized) {
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re =
- libcrux_ml_kem_polynomial_ZERO_89_ea();
- for (size_t i = (size_t)0U;
- i < Eurydice_slice_len(serialized, uint8_t) / (size_t)22U; i++) {
- size_t i0 = i;
- Eurydice_slice bytes = Eurydice_slice_subslice2(
- serialized, i0 * (size_t)22U, i0 * (size_t)22U + (size_t)22U, uint8_t);
+ Eurydice_slice bytes =
+ Eurydice_slice_subslice3(serialized, i0 * (size_t)20U,
+ i0 * (size_t)20U + (size_t)20U, uint8_t *);
libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient =
- libcrux_ml_kem_vector_portable_deserialize_11_0d(bytes);
+ libcrux_ml_kem_vector_portable_deserialize_10_b8(bytes);
libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
- libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_0d_5a0(
+ libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_b8_ef(
coefficient);
re.coefficients[i0] = uu____0;
}
@@ -8445,10 +7247,10 @@ libcrux_ml_kem.serialize.deserialize_then_decompress_ring_element_u with types
libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
- COMPRESSION_FACTOR= 10
*/
-static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0
-libcrux_ml_kem_serialize_deserialize_then_decompress_ring_element_u_34(
+static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d
+libcrux_ml_kem_serialize_deserialize_then_decompress_ring_element_u_0a(
Eurydice_slice serialized) {
- return libcrux_ml_kem_serialize_deserialize_then_decompress_10_2c(serialized);
+ return libcrux_ml_kem_serialize_deserialize_then_decompress_10_ea(serialized);
}
typedef struct libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2_s {
@@ -8457,19 +7259,6 @@ typedef struct libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2_s {
} libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2;
/**
-A monomorphic instance of libcrux_ml_kem.vector.traits.montgomery_multiply_fe
-with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
-with const generics
-
-*/
-static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
-libcrux_ml_kem_vector_traits_montgomery_multiply_fe_67(
- libcrux_ml_kem_vector_portable_vector_type_PortableVector v, int16_t fer) {
- return libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_0d(v,
- fer);
-}
-
-/**
A monomorphic instance of libcrux_ml_kem.ntt.ntt_layer_int_vec_step
with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
with const generics
@@ -8477,17 +7266,18 @@ with const generics
*/
static KRML_MUSTINLINE
libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2
- libcrux_ml_kem_ntt_ntt_layer_int_vec_step_0c(
+ libcrux_ml_kem_ntt_ntt_layer_int_vec_step_ea(
libcrux_ml_kem_vector_portable_vector_type_PortableVector a,
libcrux_ml_kem_vector_portable_vector_type_PortableVector b,
int16_t zeta_r) {
libcrux_ml_kem_vector_portable_vector_type_PortableVector t =
- libcrux_ml_kem_vector_traits_montgomery_multiply_fe_67(b, zeta_r);
- b = libcrux_ml_kem_vector_portable_sub_0d(a, &t);
- a = libcrux_ml_kem_vector_portable_add_0d(a, &t);
- return (
- CLITERAL(libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2){
- .fst = a, .snd = b});
+ libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_b8(b,
+ zeta_r);
+ b = libcrux_ml_kem_vector_portable_sub_b8(a, &t);
+ a = libcrux_ml_kem_vector_portable_add_b8(a, &t);
+ return (KRML_CLITERAL(
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2){.fst = a,
+ .snd = b});
}
/**
@@ -8496,8 +7286,8 @@ with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
with const generics
*/
-static KRML_MUSTINLINE void libcrux_ml_kem_ntt_ntt_at_layer_4_plus_51(
- size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re,
+static KRML_MUSTINLINE void libcrux_ml_kem_ntt_ntt_at_layer_4_plus_ea(
+ size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re,
size_t layer, size_t _initial_coefficient_bound) {
size_t step = (size_t)1U << (uint32_t)layer;
for (size_t i0 = (size_t)0U; i0 < (size_t)128U >> (uint32_t)layer; i0++) {
@@ -8509,9 +7299,9 @@ static KRML_MUSTINLINE void libcrux_ml_kem_ntt_ntt_at_layer_4_plus_51(
for (size_t i = offset_vec; i < offset_vec + step_vec; i++) {
size_t j = i;
libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2 uu____0 =
- libcrux_ml_kem_ntt_ntt_layer_int_vec_step_0c(
+ libcrux_ml_kem_ntt_ntt_layer_int_vec_step_ea(
re->coefficients[j], re->coefficients[j + step_vec],
- libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U]]);
+ libcrux_ml_kem_polynomial_zeta(zeta_i[0U]));
libcrux_ml_kem_vector_portable_vector_type_PortableVector x = uu____0.fst;
libcrux_ml_kem_vector_portable_vector_type_PortableVector y = uu____0.snd;
re->coefficients[j] = x;
@@ -8526,16 +7316,16 @@ with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
with const generics
*/
-static KRML_MUSTINLINE void libcrux_ml_kem_ntt_ntt_at_layer_3_fd(
- size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re,
- size_t _layer, size_t _initial_coefficient_bound) {
+static KRML_MUSTINLINE void libcrux_ml_kem_ntt_ntt_at_layer_3_ea(
+ size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re,
+ size_t _initial_coefficient_bound) {
for (size_t i = (size_t)0U; i < (size_t)16U; i++) {
size_t round = i;
zeta_i[0U] = zeta_i[0U] + (size_t)1U;
libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
- libcrux_ml_kem_vector_portable_ntt_layer_3_step_0d(
+ libcrux_ml_kem_vector_portable_ntt_layer_3_step_b8(
re->coefficients[round],
- libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U]]);
+ libcrux_ml_kem_polynomial_zeta(zeta_i[0U]));
re->coefficients[round] = uu____0;
}
}
@@ -8546,18 +7336,16 @@ with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
with const generics
*/
-static KRML_MUSTINLINE void libcrux_ml_kem_ntt_ntt_at_layer_2_ad(
- size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re,
- size_t _layer, size_t _initial_coefficient_bound) {
+static KRML_MUSTINLINE void libcrux_ml_kem_ntt_ntt_at_layer_2_ea(
+ size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re,
+ size_t _initial_coefficient_bound) {
for (size_t i = (size_t)0U; i < (size_t)16U; i++) {
size_t round = i;
zeta_i[0U] = zeta_i[0U] + (size_t)1U;
re->coefficients[round] =
- libcrux_ml_kem_vector_portable_ntt_layer_2_step_0d(
- re->coefficients[round],
- libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U]],
- libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U] +
- (size_t)1U]);
+ libcrux_ml_kem_vector_portable_ntt_layer_2_step_b8(
+ re->coefficients[round], libcrux_ml_kem_polynomial_zeta(zeta_i[0U]),
+ libcrux_ml_kem_polynomial_zeta(zeta_i[0U] + (size_t)1U));
zeta_i[0U] = zeta_i[0U] + (size_t)1U;
}
}
@@ -8568,69 +7356,77 @@ with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
with const generics
*/
-static KRML_MUSTINLINE void libcrux_ml_kem_ntt_ntt_at_layer_1_a2(
- size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re,
- size_t _layer, size_t _initial_coefficient_bound) {
+static KRML_MUSTINLINE void libcrux_ml_kem_ntt_ntt_at_layer_1_ea(
+ size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re,
+ size_t _initial_coefficient_bound) {
for (size_t i = (size_t)0U; i < (size_t)16U; i++) {
size_t round = i;
zeta_i[0U] = zeta_i[0U] + (size_t)1U;
re->coefficients[round] =
- libcrux_ml_kem_vector_portable_ntt_layer_1_step_0d(
- re->coefficients[round],
- libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U]],
- libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U] +
- (size_t)1U],
- libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U] +
- (size_t)2U],
- libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U] +
- (size_t)3U]);
+ libcrux_ml_kem_vector_portable_ntt_layer_1_step_b8(
+ re->coefficients[round], libcrux_ml_kem_polynomial_zeta(zeta_i[0U]),
+ libcrux_ml_kem_polynomial_zeta(zeta_i[0U] + (size_t)1U),
+ libcrux_ml_kem_polynomial_zeta(zeta_i[0U] + (size_t)2U),
+ libcrux_ml_kem_polynomial_zeta(zeta_i[0U] + (size_t)3U));
zeta_i[0U] = zeta_i[0U] + (size_t)3U;
}
}
/**
-This function found in impl
-{libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0]}
-*/
-/**
-A monomorphic instance of libcrux_ml_kem.polynomial.poly_barrett_reduce_89
+A monomorphic instance of libcrux_ml_kem.polynomial.poly_barrett_reduce
with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
with const generics
*/
-static KRML_MUSTINLINE void libcrux_ml_kem_polynomial_poly_barrett_reduce_89_8b(
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *self) {
+static KRML_MUSTINLINE void libcrux_ml_kem_polynomial_poly_barrett_reduce_ea(
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *myself) {
for (size_t i = (size_t)0U;
i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) {
size_t i0 = i;
libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
- libcrux_ml_kem_vector_portable_barrett_reduce_0d(
- self->coefficients[i0]);
- self->coefficients[i0] = uu____0;
+ libcrux_ml_kem_vector_portable_barrett_reduce_b8(
+ myself->coefficients[i0]);
+ myself->coefficients[i0] = uu____0;
}
}
/**
+This function found in impl
+{libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0,
+TraitClause@1]}
+*/
+/**
+A monomorphic instance of libcrux_ml_kem.polynomial.poly_barrett_reduce_d6
+with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
+with const generics
+
+*/
+static KRML_MUSTINLINE void libcrux_ml_kem_polynomial_poly_barrett_reduce_d6_ea(
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *self) {
+ libcrux_ml_kem_polynomial_poly_barrett_reduce_ea(self);
+}
+
+/**
A monomorphic instance of libcrux_ml_kem.ntt.ntt_vector_u
with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
with const generics
- VECTOR_U_COMPRESSION_FACTOR= 10
*/
-static KRML_MUSTINLINE void libcrux_ml_kem_ntt_ntt_vector_u_9f(
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re) {
+static KRML_MUSTINLINE void libcrux_ml_kem_ntt_ntt_vector_u_0a(
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re) {
size_t zeta_i = (size_t)0U;
- libcrux_ml_kem_ntt_ntt_at_layer_4_plus_51(&zeta_i, re, (size_t)7U,
- (size_t)3328U);
- libcrux_ml_kem_ntt_ntt_at_layer_4_plus_51(&zeta_i, re, (size_t)6U,
+ libcrux_ml_kem_ntt_ntt_at_layer_4_plus_ea(&zeta_i, re, (size_t)7U,
(size_t)3328U);
- libcrux_ml_kem_ntt_ntt_at_layer_4_plus_51(&zeta_i, re, (size_t)5U,
- (size_t)3328U);
- libcrux_ml_kem_ntt_ntt_at_layer_4_plus_51(&zeta_i, re, (size_t)4U,
- (size_t)3328U);
- libcrux_ml_kem_ntt_ntt_at_layer_3_fd(&zeta_i, re, (size_t)3U, (size_t)3328U);
- libcrux_ml_kem_ntt_ntt_at_layer_2_ad(&zeta_i, re, (size_t)2U, (size_t)3328U);
- libcrux_ml_kem_ntt_ntt_at_layer_1_a2(&zeta_i, re, (size_t)1U, (size_t)3328U);
- libcrux_ml_kem_polynomial_poly_barrett_reduce_89_8b(re);
+ libcrux_ml_kem_ntt_ntt_at_layer_4_plus_ea(&zeta_i, re, (size_t)6U,
+ (size_t)2U * (size_t)3328U);
+ libcrux_ml_kem_ntt_ntt_at_layer_4_plus_ea(&zeta_i, re, (size_t)5U,
+ (size_t)3U * (size_t)3328U);
+ libcrux_ml_kem_ntt_ntt_at_layer_4_plus_ea(&zeta_i, re, (size_t)4U,
+ (size_t)4U * (size_t)3328U);
+ libcrux_ml_kem_ntt_ntt_at_layer_3_ea(&zeta_i, re, (size_t)5U * (size_t)3328U);
+ libcrux_ml_kem_ntt_ntt_at_layer_2_ea(&zeta_i, re, (size_t)6U * (size_t)3328U);
+ libcrux_ml_kem_ntt_ntt_at_layer_1_ea(&zeta_i, re, (size_t)7U * (size_t)3328U);
+ libcrux_ml_kem_polynomial_poly_barrett_reduce_d6_ea(re);
}
/**
@@ -8646,12 +7442,16 @@ with const generics
- U_COMPRESSION_FACTOR= 10
*/
static KRML_MUSTINLINE void
-libcrux_ml_kem_ind_cpa_deserialize_then_decompress_u_f4(
+libcrux_ml_kem_ind_cpa_deserialize_then_decompress_u_6c(
uint8_t *ciphertext,
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret[3U]) {
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 u_as_ntt[3U];
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d ret[3U]) {
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d u_as_ntt[3U];
for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
- u_as_ntt[i] = libcrux_ml_kem_polynomial_ZERO_89_ea();
+ /* original Rust expression is not an lvalue in C */
+ void *lvalue = (void *)0U;
+ u_as_ntt[i] =
+ libcrux_ml_kem_ind_cpa_deserialize_then_decompress_u_call_mut_35_6c(
+ &lvalue, i);
}
for (size_t i = (size_t)0U;
i < Eurydice_slice_len(
@@ -8661,7 +7461,7 @@ libcrux_ml_kem_ind_cpa_deserialize_then_decompress_u_f4(
(size_t)10U / (size_t)8U);
i++) {
size_t i0 = i;
- Eurydice_slice u_bytes = Eurydice_array_to_subslice2(
+ Eurydice_slice u_bytes = Eurydice_array_to_subslice3(
ciphertext,
i0 * (LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT *
(size_t)10U / (size_t)8U),
@@ -8669,15 +7469,15 @@ libcrux_ml_kem_ind_cpa_deserialize_then_decompress_u_f4(
(size_t)10U / (size_t)8U) +
LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT *
(size_t)10U / (size_t)8U,
- uint8_t);
+ uint8_t *);
u_as_ntt[i0] =
- libcrux_ml_kem_serialize_deserialize_then_decompress_ring_element_u_34(
+ libcrux_ml_kem_serialize_deserialize_then_decompress_ring_element_u_0a(
u_bytes);
- libcrux_ml_kem_ntt_ntt_vector_u_9f(&u_as_ntt[i0]);
+ libcrux_ml_kem_ntt_ntt_vector_u_0a(&u_as_ntt[i0]);
}
memcpy(
ret, u_as_ntt,
- (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
+ (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d));
}
/**
@@ -8687,35 +7487,38 @@ const generics
- COEFFICIENT_BITS= 4
*/
static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
-libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_6b1(
- libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
+libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_d1(
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector a) {
for (size_t i = (size_t)0U;
i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
size_t i0 = i;
- int32_t decompressed = (int32_t)v.elements[i0] *
- (int32_t)LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS;
+ int32_t decompressed =
+ libcrux_secrets_int_as_i32_f5(a.elements[i0]) *
+ libcrux_secrets_int_as_i32_f5(
+ libcrux_secrets_int_public_integers_classify_27_39(
+ LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS));
decompressed = (decompressed << 1U) + ((int32_t)1 << (uint32_t)(int32_t)4);
decompressed = decompressed >> (uint32_t)((int32_t)4 + (int32_t)1);
- v.elements[i0] = (int16_t)decompressed;
+ a.elements[i0] = libcrux_secrets_int_as_i16_36(decompressed);
}
- return v;
+ return a;
}
/**
-This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
-libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
+This function found in impl {libcrux_ml_kem::vector::traits::Operations for
+libcrux_ml_kem::vector::portable::vector_type::PortableVector}
*/
/**
A monomorphic instance of
-libcrux_ml_kem.vector.portable.decompress_ciphertext_coefficient_0d with const
+libcrux_ml_kem.vector.portable.decompress_ciphertext_coefficient_b8 with const
generics
- COEFFICIENT_BITS= 4
*/
static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
-libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_0d_5a1(
- libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
- return libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_6b1(
- v);
+libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_b8_d1(
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector a) {
+ return libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_d1(
+ a);
}
/**
@@ -8724,20 +7527,20 @@ with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
with const generics
*/
-static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0
-libcrux_ml_kem_serialize_deserialize_then_decompress_4_41(
+static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d
+libcrux_ml_kem_serialize_deserialize_then_decompress_4_ea(
Eurydice_slice serialized) {
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re =
- libcrux_ml_kem_polynomial_ZERO_89_ea();
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d re =
+ libcrux_ml_kem_polynomial_ZERO_d6_ea();
for (size_t i = (size_t)0U;
i < Eurydice_slice_len(serialized, uint8_t) / (size_t)8U; i++) {
size_t i0 = i;
- Eurydice_slice bytes = Eurydice_slice_subslice2(
- serialized, i0 * (size_t)8U, i0 * (size_t)8U + (size_t)8U, uint8_t);
+ Eurydice_slice bytes = Eurydice_slice_subslice3(
+ serialized, i0 * (size_t)8U, i0 * (size_t)8U + (size_t)8U, uint8_t *);
libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient =
- libcrux_ml_kem_vector_portable_deserialize_4_0d(bytes);
+ libcrux_ml_kem_vector_portable_deserialize_4_b8(bytes);
libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
- libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_0d_5a1(
+ libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_b8_d1(
coefficient);
re.coefficients[i0] = uu____0;
}
@@ -8746,78 +7549,35 @@ libcrux_ml_kem_serialize_deserialize_then_decompress_4_41(
/**
A monomorphic instance of
-libcrux_ml_kem.vector.portable.compress.decompress_ciphertext_coefficient with
-const generics
-- COEFFICIENT_BITS= 5
-*/
-static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
-libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_6b2(
- libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
- for (size_t i = (size_t)0U;
- i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
- size_t i0 = i;
- int32_t decompressed = (int32_t)v.elements[i0] *
- (int32_t)LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS;
- decompressed = (decompressed << 1U) + ((int32_t)1 << (uint32_t)(int32_t)5);
- decompressed = decompressed >> (uint32_t)((int32_t)5 + (int32_t)1);
- v.elements[i0] = (int16_t)decompressed;
- }
- return v;
-}
-
-/**
-This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
-libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
-*/
-/**
-A monomorphic instance of
-libcrux_ml_kem.vector.portable.decompress_ciphertext_coefficient_0d with const
-generics
-- COEFFICIENT_BITS= 5
+libcrux_ml_kem.serialize.deserialize_then_decompress_ring_element_v with types
+libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
+- K= 3
+- COMPRESSION_FACTOR= 4
*/
-static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
-libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_0d_5a2(
- libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
- return libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_6b2(
- v);
+static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d
+libcrux_ml_kem_serialize_deserialize_then_decompress_ring_element_v_89(
+ Eurydice_slice serialized) {
+ return libcrux_ml_kem_serialize_deserialize_then_decompress_4_ea(serialized);
}
/**
-A monomorphic instance of libcrux_ml_kem.serialize.deserialize_then_decompress_5
+A monomorphic instance of libcrux_ml_kem.polynomial.ZERO
with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
with const generics
*/
-static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0
-libcrux_ml_kem_serialize_deserialize_then_decompress_5_4e(
- Eurydice_slice serialized) {
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re =
- libcrux_ml_kem_polynomial_ZERO_89_ea();
- for (size_t i = (size_t)0U;
- i < Eurydice_slice_len(serialized, uint8_t) / (size_t)10U; i++) {
- size_t i0 = i;
- Eurydice_slice bytes = Eurydice_slice_subslice2(
- serialized, i0 * (size_t)10U, i0 * (size_t)10U + (size_t)10U, uint8_t);
- re.coefficients[i0] =
- libcrux_ml_kem_vector_portable_deserialize_5_0d(bytes);
- libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____1 =
- libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_0d_5a2(
- re.coefficients[i0]);
- re.coefficients[i0] = uu____1;
+static inline libcrux_ml_kem_polynomial_PolynomialRingElement_1d
+libcrux_ml_kem_polynomial_ZERO_ea(void) {
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d lit;
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector
+ repeat_expression[16U];
+ for (size_t i = (size_t)0U; i < (size_t)16U; i++) {
+ repeat_expression[i] = libcrux_ml_kem_vector_portable_ZERO_b8();
}
- return re;
-}
-
-/**
-A monomorphic instance of
-libcrux_ml_kem.serialize.deserialize_then_decompress_ring_element_v with types
-libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
-- COMPRESSION_FACTOR= 4
-*/
-static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0
-libcrux_ml_kem_serialize_deserialize_then_decompress_ring_element_v_56(
- Eurydice_slice serialized) {
- return libcrux_ml_kem_serialize_deserialize_then_decompress_4_41(serialized);
+ memcpy(lit.coefficients, repeat_expression,
+ (size_t)16U *
+ sizeof(libcrux_ml_kem_vector_portable_vector_type_PortableVector));
+ return lit;
}
/**
@@ -8848,97 +7608,115 @@ libcrux_ml_kem_serialize_deserialize_then_decompress_ring_element_v_56(
<https://csrc.nist.gov/pubs/fips/203/ipd>.
*/
/**
-This function found in impl
-{libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0]}
-*/
-/**
-A monomorphic instance of libcrux_ml_kem.polynomial.ntt_multiply_89
+A monomorphic instance of libcrux_ml_kem.polynomial.ntt_multiply
with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
with const generics
*/
-static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0
-libcrux_ml_kem_polynomial_ntt_multiply_89_2a(
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *self,
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *rhs) {
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 out =
- libcrux_ml_kem_polynomial_ZERO_89_ea();
+static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d
+libcrux_ml_kem_polynomial_ntt_multiply_ea(
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *myself,
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *rhs) {
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d out =
+ libcrux_ml_kem_polynomial_ZERO_ea();
for (size_t i = (size_t)0U;
i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) {
size_t i0 = i;
libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
- libcrux_ml_kem_vector_portable_ntt_multiply_0d(
- &self->coefficients[i0], &rhs->coefficients[i0],
- libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[(size_t)64U +
- (size_t)4U * i0],
- libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[(size_t)64U +
- (size_t)4U * i0 +
- (size_t)1U],
- libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[(size_t)64U +
- (size_t)4U * i0 +
- (size_t)2U],
- libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[(size_t)64U +
- (size_t)4U * i0 +
- (size_t)3U]);
+ libcrux_ml_kem_vector_portable_ntt_multiply_b8(
+ &myself->coefficients[i0], &rhs->coefficients[i0],
+ libcrux_ml_kem_polynomial_zeta((size_t)64U + (size_t)4U * i0),
+ libcrux_ml_kem_polynomial_zeta((size_t)64U + (size_t)4U * i0 +
+ (size_t)1U),
+ libcrux_ml_kem_polynomial_zeta((size_t)64U + (size_t)4U * i0 +
+ (size_t)2U),
+ libcrux_ml_kem_polynomial_zeta((size_t)64U + (size_t)4U * i0 +
+ (size_t)3U));
out.coefficients[i0] = uu____0;
}
return out;
}
/**
- Given two polynomial ring elements `lhs` and `rhs`, compute the pointwise
- sum of their constituent coefficients.
+This function found in impl
+{libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0,
+TraitClause@1]}
*/
/**
-This function found in impl
-{libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0]}
+A monomorphic instance of libcrux_ml_kem.polynomial.ntt_multiply_d6
+with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
+with const generics
+
+*/
+static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d
+libcrux_ml_kem_polynomial_ntt_multiply_d6_ea(
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *self,
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *rhs) {
+ return libcrux_ml_kem_polynomial_ntt_multiply_ea(self, rhs);
+}
+
+/**
+ Given two polynomial ring elements `lhs` and `rhs`, compute the pointwise
+ sum of their constituent coefficients.
*/
/**
-A monomorphic instance of libcrux_ml_kem.polynomial.add_to_ring_element_89
+A monomorphic instance of libcrux_ml_kem.polynomial.add_to_ring_element
with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
with const generics
- K= 3
*/
-static KRML_MUSTINLINE void libcrux_ml_kem_polynomial_add_to_ring_element_89_84(
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *self,
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *rhs) {
+static KRML_MUSTINLINE void libcrux_ml_kem_polynomial_add_to_ring_element_1b(
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *myself,
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *rhs) {
for (size_t i = (size_t)0U;
i < Eurydice_slice_len(
Eurydice_array_to_slice(
- (size_t)16U, self->coefficients,
+ (size_t)16U, myself->coefficients,
libcrux_ml_kem_vector_portable_vector_type_PortableVector),
libcrux_ml_kem_vector_portable_vector_type_PortableVector);
i++) {
size_t i0 = i;
libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
- libcrux_ml_kem_vector_portable_add_0d(self->coefficients[i0],
+ libcrux_ml_kem_vector_portable_add_b8(myself->coefficients[i0],
&rhs->coefficients[i0]);
- self->coefficients[i0] = uu____0;
+ myself->coefficients[i0] = uu____0;
}
}
/**
+This function found in impl
+{libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0,
+TraitClause@1]}
+*/
+/**
+A monomorphic instance of libcrux_ml_kem.polynomial.add_to_ring_element_d6
+with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
+with const generics
+- K= 3
+*/
+static KRML_MUSTINLINE void libcrux_ml_kem_polynomial_add_to_ring_element_d6_1b(
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *self,
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *rhs) {
+ libcrux_ml_kem_polynomial_add_to_ring_element_1b(self, rhs);
+}
+
+/**
A monomorphic instance of libcrux_ml_kem.invert_ntt.invert_ntt_at_layer_1
with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
with const generics
*/
-static KRML_MUSTINLINE void libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_1_83(
- size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re,
- size_t _layer) {
+static KRML_MUSTINLINE void libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_1_ea(
+ size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re) {
for (size_t i = (size_t)0U; i < (size_t)16U; i++) {
size_t round = i;
zeta_i[0U] = zeta_i[0U] - (size_t)1U;
re->coefficients[round] =
- libcrux_ml_kem_vector_portable_inv_ntt_layer_1_step_0d(
- re->coefficients[round],
- libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U]],
- libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U] -
- (size_t)1U],
- libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U] -
- (size_t)2U],
- libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U] -
- (size_t)3U]);
+ libcrux_ml_kem_vector_portable_inv_ntt_layer_1_step_b8(
+ re->coefficients[round], libcrux_ml_kem_polynomial_zeta(zeta_i[0U]),
+ libcrux_ml_kem_polynomial_zeta(zeta_i[0U] - (size_t)1U),
+ libcrux_ml_kem_polynomial_zeta(zeta_i[0U] - (size_t)2U),
+ libcrux_ml_kem_polynomial_zeta(zeta_i[0U] - (size_t)3U));
zeta_i[0U] = zeta_i[0U] - (size_t)3U;
}
}
@@ -8949,18 +7727,15 @@ with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
with const generics
*/
-static KRML_MUSTINLINE void libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_2_c3(
- size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re,
- size_t _layer) {
+static KRML_MUSTINLINE void libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_2_ea(
+ size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re) {
for (size_t i = (size_t)0U; i < (size_t)16U; i++) {
size_t round = i;
zeta_i[0U] = zeta_i[0U] - (size_t)1U;
re->coefficients[round] =
- libcrux_ml_kem_vector_portable_inv_ntt_layer_2_step_0d(
- re->coefficients[round],
- libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U]],
- libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U] -
- (size_t)1U]);
+ libcrux_ml_kem_vector_portable_inv_ntt_layer_2_step_b8(
+ re->coefficients[round], libcrux_ml_kem_polynomial_zeta(zeta_i[0U]),
+ libcrux_ml_kem_polynomial_zeta(zeta_i[0U] - (size_t)1U));
zeta_i[0U] = zeta_i[0U] - (size_t)1U;
}
}
@@ -8971,16 +7746,15 @@ with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
with const generics
*/
-static KRML_MUSTINLINE void libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_3_68(
- size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re,
- size_t _layer) {
+static KRML_MUSTINLINE void libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_3_ea(
+ size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re) {
for (size_t i = (size_t)0U; i < (size_t)16U; i++) {
size_t round = i;
zeta_i[0U] = zeta_i[0U] - (size_t)1U;
libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
- libcrux_ml_kem_vector_portable_inv_ntt_layer_3_step_0d(
+ libcrux_ml_kem_vector_portable_inv_ntt_layer_3_step_b8(
re->coefficients[round],
- libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U]]);
+ libcrux_ml_kem_polynomial_zeta(zeta_i[0U]));
re->coefficients[round] = uu____0;
}
}
@@ -8993,18 +7767,19 @@ libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
*/
static KRML_MUSTINLINE
libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2
- libcrux_ml_kem_invert_ntt_inv_ntt_layer_int_vec_step_reduce_65(
+ libcrux_ml_kem_invert_ntt_inv_ntt_layer_int_vec_step_reduce_ea(
libcrux_ml_kem_vector_portable_vector_type_PortableVector a,
libcrux_ml_kem_vector_portable_vector_type_PortableVector b,
int16_t zeta_r) {
libcrux_ml_kem_vector_portable_vector_type_PortableVector a_minus_b =
- libcrux_ml_kem_vector_portable_sub_0d(b, &a);
- a = libcrux_ml_kem_vector_portable_barrett_reduce_0d(
- libcrux_ml_kem_vector_portable_add_0d(a, &b));
- b = libcrux_ml_kem_vector_traits_montgomery_multiply_fe_67(a_minus_b, zeta_r);
- return (
- CLITERAL(libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2){
- .fst = a, .snd = b});
+ libcrux_ml_kem_vector_portable_sub_b8(b, &a);
+ a = libcrux_ml_kem_vector_portable_barrett_reduce_b8(
+ libcrux_ml_kem_vector_portable_add_b8(a, &b));
+ b = libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_b8(
+ a_minus_b, zeta_r);
+ return (KRML_CLITERAL(
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2){.fst = a,
+ .snd = b});
}
/**
@@ -9014,8 +7789,8 @@ with const generics
*/
static KRML_MUSTINLINE void
-libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_4_plus_6e(
- size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re,
+libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_4_plus_ea(
+ size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re,
size_t layer) {
size_t step = (size_t)1U << (uint32_t)layer;
for (size_t i0 = (size_t)0U; i0 < (size_t)128U >> (uint32_t)layer; i0++) {
@@ -9029,9 +7804,9 @@ libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_4_plus_6e(
for (size_t i = offset_vec; i < offset_vec + step_vec; i++) {
size_t j = i;
libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2 uu____0 =
- libcrux_ml_kem_invert_ntt_inv_ntt_layer_int_vec_step_reduce_65(
+ libcrux_ml_kem_invert_ntt_inv_ntt_layer_int_vec_step_reduce_ea(
re->coefficients[j], re->coefficients[j + step_vec],
- libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U]]);
+ libcrux_ml_kem_polynomial_zeta(zeta_i[0U]));
libcrux_ml_kem_vector_portable_vector_type_PortableVector x = uu____0.fst;
libcrux_ml_kem_vector_portable_vector_type_PortableVector y = uu____0.snd;
re->coefficients[j] = x;
@@ -9046,55 +7821,70 @@ with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
with const generics
- K= 3
*/
-static KRML_MUSTINLINE void libcrux_ml_kem_invert_ntt_invert_ntt_montgomery_f6(
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re) {
+static KRML_MUSTINLINE void libcrux_ml_kem_invert_ntt_invert_ntt_montgomery_1b(
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re) {
size_t zeta_i =
LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT / (size_t)2U;
- libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_1_83(&zeta_i, re, (size_t)1U);
- libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_2_c3(&zeta_i, re, (size_t)2U);
- libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_3_68(&zeta_i, re, (size_t)3U);
- libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_4_plus_6e(&zeta_i, re,
+ libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_1_ea(&zeta_i, re);
+ libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_2_ea(&zeta_i, re);
+ libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_3_ea(&zeta_i, re);
+ libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_4_plus_ea(&zeta_i, re,
(size_t)4U);
- libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_4_plus_6e(&zeta_i, re,
+ libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_4_plus_ea(&zeta_i, re,
(size_t)5U);
- libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_4_plus_6e(&zeta_i, re,
+ libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_4_plus_ea(&zeta_i, re,
(size_t)6U);
- libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_4_plus_6e(&zeta_i, re,
+ libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_4_plus_ea(&zeta_i, re,
(size_t)7U);
- libcrux_ml_kem_polynomial_poly_barrett_reduce_89_8b(re);
+ libcrux_ml_kem_polynomial_poly_barrett_reduce_d6_ea(re);
}
/**
-This function found in impl
-{libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0]}
-*/
-/**
-A monomorphic instance of libcrux_ml_kem.polynomial.subtract_reduce_89
+A monomorphic instance of libcrux_ml_kem.polynomial.subtract_reduce
with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
with const generics
*/
-static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0
-libcrux_ml_kem_polynomial_subtract_reduce_89_d4(
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *self,
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 b) {
+static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d
+libcrux_ml_kem_polynomial_subtract_reduce_ea(
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *myself,
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d b) {
for (size_t i = (size_t)0U;
i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) {
size_t i0 = i;
libcrux_ml_kem_vector_portable_vector_type_PortableVector
coefficient_normal_form =
- libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_0d(
+ libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_b8(
b.coefficients[i0], (int16_t)1441);
- libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
- libcrux_ml_kem_vector_portable_barrett_reduce_0d(
- libcrux_ml_kem_vector_portable_sub_0d(self->coefficients[i0],
- &coefficient_normal_form));
- b.coefficients[i0] = uu____0;
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector diff =
+ libcrux_ml_kem_vector_portable_sub_b8(myself->coefficients[i0],
+ &coefficient_normal_form);
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector red =
+ libcrux_ml_kem_vector_portable_barrett_reduce_b8(diff);
+ b.coefficients[i0] = red;
}
return b;
}
/**
+This function found in impl
+{libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0,
+TraitClause@1]}
+*/
+/**
+A monomorphic instance of libcrux_ml_kem.polynomial.subtract_reduce_d6
+with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
+with const generics
+
+*/
+static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d
+libcrux_ml_kem_polynomial_subtract_reduce_d6_ea(
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *self,
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d b) {
+ return libcrux_ml_kem_polynomial_subtract_reduce_ea(self, b);
+}
+
+/**
The following functions compute various expressions involving
vectors and matrices. The computation of these expressions has been
abstracted away into these functions in order to save on loop iterations.
@@ -9106,71 +7896,34 @@ with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
with const generics
- K= 3
*/
-static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0
-libcrux_ml_kem_matrix_compute_message_b3(
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *v,
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *secret_as_ntt,
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *u_as_ntt) {
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 result =
- libcrux_ml_kem_polynomial_ZERO_89_ea();
+static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d
+libcrux_ml_kem_matrix_compute_message_1b(
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *v,
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *secret_as_ntt,
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *u_as_ntt) {
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d result =
+ libcrux_ml_kem_polynomial_ZERO_d6_ea();
for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
size_t i0 = i;
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 product =
- libcrux_ml_kem_polynomial_ntt_multiply_89_2a(&secret_as_ntt[i0],
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d product =
+ libcrux_ml_kem_polynomial_ntt_multiply_d6_ea(&secret_as_ntt[i0],
&u_as_ntt[i0]);
- libcrux_ml_kem_polynomial_add_to_ring_element_89_84(&result, &product);
- }
- libcrux_ml_kem_invert_ntt_invert_ntt_montgomery_f6(&result);
- result = libcrux_ml_kem_polynomial_subtract_reduce_89_d4(v, result);
- return result;
-}
-
-/**
-A monomorphic instance of libcrux_ml_kem.vector.portable.arithmetic.shift_right
-with const generics
-- SHIFT_BY= 15
-*/
-static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
-libcrux_ml_kem_vector_portable_arithmetic_shift_right_94(
- libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
- for (size_t i = (size_t)0U;
- i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
- size_t i0 = i;
- v.elements[i0] = v.elements[i0] >> (uint32_t)(int32_t)15;
+ libcrux_ml_kem_polynomial_add_to_ring_element_d6_1b(&result, &product);
}
- return v;
+ libcrux_ml_kem_invert_ntt_invert_ntt_montgomery_1b(&result);
+ return libcrux_ml_kem_polynomial_subtract_reduce_d6_ea(v, result);
}
/**
-This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
-libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
-*/
-/**
-A monomorphic instance of libcrux_ml_kem.vector.portable.shift_right_0d
+A monomorphic instance of libcrux_ml_kem.serialize.to_unsigned_field_modulus
+with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
with const generics
-- SHIFT_BY= 15
-*/
-static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
-libcrux_ml_kem_vector_portable_shift_right_0d_19(
- libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
- return libcrux_ml_kem_vector_portable_arithmetic_shift_right_94(v);
-}
-
-/**
-A monomorphic instance of
-libcrux_ml_kem.vector.traits.to_unsigned_representative with types
-libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
*/
-static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
-libcrux_ml_kem_vector_traits_to_unsigned_representative_db(
+static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
+libcrux_ml_kem_serialize_to_unsigned_field_modulus_ea(
libcrux_ml_kem_vector_portable_vector_type_PortableVector a) {
- libcrux_ml_kem_vector_portable_vector_type_PortableVector t =
- libcrux_ml_kem_vector_portable_shift_right_0d_19(a);
- libcrux_ml_kem_vector_portable_vector_type_PortableVector fm =
- libcrux_ml_kem_vector_portable_bitwise_and_with_constant_0d(
- t, LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS);
- return libcrux_ml_kem_vector_portable_add_0d(a, &fm);
+ return libcrux_ml_kem_vector_portable_to_unsigned_representative_b8(a);
}
/**
@@ -9180,24 +7933,24 @@ libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
*/
static KRML_MUSTINLINE void
-libcrux_ml_kem_serialize_compress_then_serialize_message_aa(
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re, uint8_t ret[32U]) {
+libcrux_ml_kem_serialize_compress_then_serialize_message_ea(
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d re, uint8_t ret[32U]) {
uint8_t serialized[32U] = {0U};
for (size_t i = (size_t)0U; i < (size_t)16U; i++) {
size_t i0 = i;
libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient =
- libcrux_ml_kem_vector_traits_to_unsigned_representative_db(
+ libcrux_ml_kem_serialize_to_unsigned_field_modulus_ea(
re.coefficients[i0]);
libcrux_ml_kem_vector_portable_vector_type_PortableVector
coefficient_compressed =
- libcrux_ml_kem_vector_portable_compress_1_0d(coefficient);
+ libcrux_ml_kem_vector_portable_compress_1_b8(coefficient);
uint8_t bytes[2U];
- libcrux_ml_kem_vector_portable_serialize_1_0d(coefficient_compressed,
+ libcrux_ml_kem_vector_portable_serialize_1_b8(coefficient_compressed,
bytes);
- Eurydice_slice uu____0 = Eurydice_array_to_subslice2(
- serialized, (size_t)2U * i0, (size_t)2U * i0 + (size_t)2U, uint8_t);
Eurydice_slice_copy(
- uu____0, Eurydice_array_to_slice((size_t)2U, bytes, uint8_t), uint8_t);
+ Eurydice_array_to_subslice3(serialized, (size_t)2U * i0,
+ (size_t)2U * i0 + (size_t)2U, uint8_t *),
+ Eurydice_array_to_slice((size_t)2U, bytes, uint8_t), uint8_t);
}
memcpy(ret, serialized, (size_t)32U * sizeof(uint8_t));
}
@@ -9236,20 +7989,21 @@ with const generics
- U_COMPRESSION_FACTOR= 10
- V_COMPRESSION_FACTOR= 4
*/
-static inline void libcrux_ml_kem_ind_cpa_decrypt_unpacked_6d(
- libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_f8 *secret_key,
+static KRML_MUSTINLINE void libcrux_ml_kem_ind_cpa_decrypt_unpacked_42(
+ libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_a0 *secret_key,
uint8_t *ciphertext, uint8_t ret[32U]) {
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 u_as_ntt[3U];
- libcrux_ml_kem_ind_cpa_deserialize_then_decompress_u_f4(ciphertext, u_as_ntt);
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 v =
- libcrux_ml_kem_serialize_deserialize_then_decompress_ring_element_v_56(
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d u_as_ntt[3U];
+ libcrux_ml_kem_ind_cpa_deserialize_then_decompress_u_6c(ciphertext, u_as_ntt);
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d v =
+ libcrux_ml_kem_serialize_deserialize_then_decompress_ring_element_v_89(
Eurydice_array_to_subslice_from((size_t)1088U, ciphertext,
- (size_t)960U, uint8_t, size_t));
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 message =
- libcrux_ml_kem_matrix_compute_message_b3(&v, secret_key->secret_as_ntt,
+ (size_t)960U, uint8_t, size_t,
+ uint8_t[]));
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d message =
+ libcrux_ml_kem_matrix_compute_message_1b(&v, secret_key->secret_as_ntt,
u_as_ntt);
uint8_t ret0[32U];
- libcrux_ml_kem_serialize_compress_then_serialize_message_aa(message, ret0);
+ libcrux_ml_kem_serialize_compress_then_serialize_message_ea(message, ret0);
memcpy(ret, ret0, (size_t)32U * sizeof(uint8_t));
}
@@ -9263,37 +8017,37 @@ with const generics
- U_COMPRESSION_FACTOR= 10
- V_COMPRESSION_FACTOR= 4
*/
-static inline void libcrux_ml_kem_ind_cpa_decrypt_43(Eurydice_slice secret_key,
- uint8_t *ciphertext,
- uint8_t ret[32U]) {
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 secret_as_ntt[3U];
- libcrux_ml_kem_ind_cpa_deserialize_secret_key_24(secret_key, secret_as_ntt);
- /* Passing arrays by value in Rust generates a copy in C */
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 copy_of_secret_as_ntt[3U];
- memcpy(
- copy_of_secret_as_ntt, secret_as_ntt,
- (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
- libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_f8
+static KRML_MUSTINLINE void libcrux_ml_kem_ind_cpa_decrypt_42(
+ Eurydice_slice secret_key, uint8_t *ciphertext, uint8_t ret[32U]) {
+ libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_a0
secret_key_unpacked;
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d ret0[3U];
+ for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
+ /* original Rust expression is not an lvalue in C */
+ void *lvalue = (void *)0U;
+ ret0[i] = libcrux_ml_kem_ind_cpa_decrypt_call_mut_0b_42(&lvalue, i);
+ }
memcpy(
- secret_key_unpacked.secret_as_ntt, copy_of_secret_as_ntt,
- (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
- uint8_t ret0[32U];
- libcrux_ml_kem_ind_cpa_decrypt_unpacked_6d(&secret_key_unpacked, ciphertext,
- ret0);
- memcpy(ret, ret0, (size_t)32U * sizeof(uint8_t));
+ secret_key_unpacked.secret_as_ntt, ret0,
+ (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d));
+ libcrux_ml_kem_ind_cpa_deserialize_vector_1b(
+ secret_key, secret_key_unpacked.secret_as_ntt);
+ uint8_t ret1[32U];
+ libcrux_ml_kem_ind_cpa_decrypt_unpacked_42(&secret_key_unpacked, ciphertext,
+ ret1);
+ memcpy(ret, ret1, (size_t)32U * sizeof(uint8_t));
}
/**
-This function found in impl {(libcrux_ml_kem::hash_functions::Hash<K> for
-libcrux_ml_kem::hash_functions::portable::PortableHash<K>)}
+This function found in impl {libcrux_ml_kem::hash_functions::Hash<K> for
+libcrux_ml_kem::hash_functions::portable::PortableHash<K>}
*/
/**
-A monomorphic instance of libcrux_ml_kem.hash_functions.portable.G_f1
+A monomorphic instance of libcrux_ml_kem.hash_functions.portable.G_4a
with const generics
- K= 3
*/
-static KRML_MUSTINLINE void libcrux_ml_kem_hash_functions_portable_G_f1_e4(
+static inline void libcrux_ml_kem_hash_functions_portable_G_4a_e0(
Eurydice_slice input, uint8_t ret[64U]) {
libcrux_ml_kem_hash_functions_portable_G(input, ret);
}
@@ -9303,7 +8057,7 @@ A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PRF
with const generics
- LEN= 32
*/
-static KRML_MUSTINLINE void libcrux_ml_kem_hash_functions_portable_PRF_2b(
+static inline void libcrux_ml_kem_hash_functions_portable_PRF_9e(
Eurydice_slice input, uint8_t ret[32U]) {
uint8_t digest[32U] = {0U};
libcrux_sha3_portable_shake256(
@@ -9312,31 +8066,69 @@ static KRML_MUSTINLINE void libcrux_ml_kem_hash_functions_portable_PRF_2b(
}
/**
-This function found in impl {(libcrux_ml_kem::hash_functions::Hash<K> for
-libcrux_ml_kem::hash_functions::portable::PortableHash<K>)}
+This function found in impl {libcrux_ml_kem::hash_functions::Hash<K> for
+libcrux_ml_kem::hash_functions::portable::PortableHash<K>}
*/
/**
-A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PRF_f1
+A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PRF_4a
with const generics
- K= 3
- LEN= 32
*/
-static KRML_MUSTINLINE void libcrux_ml_kem_hash_functions_portable_PRF_f1_ee(
+static inline void libcrux_ml_kem_hash_functions_portable_PRF_4a_41(
Eurydice_slice input, uint8_t ret[32U]) {
- libcrux_ml_kem_hash_functions_portable_PRF_2b(input, ret);
+ libcrux_ml_kem_hash_functions_portable_PRF_9e(input, ret);
}
/**
A monomorphic instance of
-libcrux_ml_kem.serialize.deserialize_ring_elements_reduced.closure with types
+libcrux_ml_kem.ind_cpa.unpacked.IndCpaPublicKeyUnpacked with types
libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
-- PUBLIC_KEY_SIZE= 1152
+- $3size_t
+*/
+typedef struct libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0_s {
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d t_as_ntt[3U];
+ uint8_t seed_for_A[32U];
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d A[3U][3U];
+} libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0;
+
+/**
+This function found in impl {core::default::Default for
+libcrux_ml_kem::ind_cpa::unpacked::IndCpaPublicKeyUnpacked<Vector,
+K>[TraitClause@0, TraitClause@1]}
+*/
+/**
+A monomorphic instance of libcrux_ml_kem.ind_cpa.unpacked.default_8b
+with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
+with const generics
- K= 3
*/
-static inline libcrux_ml_kem_polynomial_PolynomialRingElement_f0
-libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_closure_cd(
- size_t _i) {
- return libcrux_ml_kem_polynomial_ZERO_89_ea();
+static inline libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0
+libcrux_ml_kem_ind_cpa_unpacked_default_8b_1b(void) {
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d uu____0[3U];
+ for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
+ uu____0[i] = libcrux_ml_kem_polynomial_ZERO_d6_ea();
+ }
+ uint8_t uu____1[32U] = {0U};
+ libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0 lit;
+ memcpy(
+ lit.t_as_ntt, uu____0,
+ (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d));
+ memcpy(lit.seed_for_A, uu____1, (size_t)32U * sizeof(uint8_t));
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d repeat_expression0[3U][3U];
+ for (size_t i0 = (size_t)0U; i0 < (size_t)3U; i0++) {
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d repeat_expression[3U];
+ for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
+ repeat_expression[i] = libcrux_ml_kem_polynomial_ZERO_d6_ea();
+ }
+ memcpy(repeat_expression0[i0], repeat_expression,
+ (size_t)3U *
+ sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d));
+ }
+ memcpy(lit.A, repeat_expression0,
+ (size_t)3U *
+ sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d[3U]));
+ return lit;
}
/**
@@ -9351,90 +8143,54 @@ libcrux_ml_kem.serialize.deserialize_to_reduced_ring_element with types
libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
*/
-static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0
-libcrux_ml_kem_serialize_deserialize_to_reduced_ring_element_4c(
+static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d
+libcrux_ml_kem_serialize_deserialize_to_reduced_ring_element_ea(
Eurydice_slice serialized) {
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re =
- libcrux_ml_kem_polynomial_ZERO_89_ea();
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d re =
+ libcrux_ml_kem_polynomial_ZERO_d6_ea();
for (size_t i = (size_t)0U;
i < Eurydice_slice_len(serialized, uint8_t) / (size_t)24U; i++) {
size_t i0 = i;
- Eurydice_slice bytes = Eurydice_slice_subslice2(
- serialized, i0 * (size_t)24U, i0 * (size_t)24U + (size_t)24U, uint8_t);
+ Eurydice_slice bytes =
+ Eurydice_slice_subslice3(serialized, i0 * (size_t)24U,
+ i0 * (size_t)24U + (size_t)24U, uint8_t *);
libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient =
- libcrux_ml_kem_vector_portable_deserialize_12_0d(bytes);
+ libcrux_ml_kem_vector_portable_deserialize_12_b8(bytes);
libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
- libcrux_ml_kem_vector_portable_cond_subtract_3329_0d(coefficient);
+ libcrux_ml_kem_vector_portable_cond_subtract_3329_b8(coefficient);
re.coefficients[i0] = uu____0;
}
return re;
}
/**
- This function deserializes ring elements and reduces the result by the field
- modulus.
-
- This function MUST NOT be used on secret inputs.
+ See [deserialize_ring_elements_reduced_out].
*/
/**
A monomorphic instance of
libcrux_ml_kem.serialize.deserialize_ring_elements_reduced with types
libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
-- PUBLIC_KEY_SIZE= 1152
- K= 3
*/
static KRML_MUSTINLINE void
-libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_33(
+libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_1b(
Eurydice_slice public_key,
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret[3U]) {
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 deserialized_pk[3U];
- for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
- deserialized_pk[i] = libcrux_ml_kem_polynomial_ZERO_89_ea();
- }
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *deserialized_pk) {
for (size_t i = (size_t)0U;
i < Eurydice_slice_len(public_key, uint8_t) /
LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT;
i++) {
size_t i0 = i;
- Eurydice_slice ring_element = Eurydice_slice_subslice2(
+ Eurydice_slice ring_element = Eurydice_slice_subslice3(
public_key, i0 * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT,
i0 * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT +
LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT,
- uint8_t);
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 uu____0 =
- libcrux_ml_kem_serialize_deserialize_to_reduced_ring_element_4c(
+ uint8_t *);
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d uu____0 =
+ libcrux_ml_kem_serialize_deserialize_to_reduced_ring_element_ea(
ring_element);
deserialized_pk[i0] = uu____0;
}
- memcpy(
- ret, deserialized_pk,
- (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
-}
-
-/**
-A monomorphic instance of libcrux_ml_kem.matrix.sample_matrix_A.closure.closure
-with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
-libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const
-generics
-- K= 3
-*/
-static inline libcrux_ml_kem_polynomial_PolynomialRingElement_f0
-libcrux_ml_kem_matrix_sample_matrix_A_closure_closure_78(size_t _j) {
- return libcrux_ml_kem_polynomial_ZERO_89_ea();
-}
-
-/**
-A monomorphic instance of libcrux_ml_kem.matrix.sample_matrix_A.closure
-with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
-libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const
-generics
-- K= 3
-*/
-static inline void libcrux_ml_kem_matrix_sample_matrix_A_closure_4b(
- size_t _i, libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret[3U]) {
- for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
- ret[i] = libcrux_ml_kem_polynomial_ZERO_89_ea();
- }
}
/**
@@ -9442,67 +8198,61 @@ A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PortableHash
with const generics
- $3size_t
*/
-typedef struct libcrux_ml_kem_hash_functions_portable_PortableHash_58_s {
- libcrux_sha3_generic_keccak_KeccakState_48 shake128_state[3U];
-} libcrux_ml_kem_hash_functions_portable_PortableHash_58;
+typedef struct libcrux_ml_kem_hash_functions_portable_PortableHash_88_s {
+ libcrux_sha3_generic_keccak_KeccakState_17 shake128_state[3U];
+} libcrux_ml_kem_hash_functions_portable_PortableHash_88;
/**
A monomorphic instance of
-libcrux_ml_kem.hash_functions.portable.shake128_init_absorb with const generics
+libcrux_ml_kem.hash_functions.portable.shake128_init_absorb_final with const
+generics
- K= 3
*/
-static KRML_MUSTINLINE libcrux_ml_kem_hash_functions_portable_PortableHash_58
-libcrux_ml_kem_hash_functions_portable_shake128_init_absorb_b7(
- uint8_t input[3U][34U]) {
- libcrux_sha3_generic_keccak_KeccakState_48 shake128_state[3U];
+static inline libcrux_ml_kem_hash_functions_portable_PortableHash_88
+libcrux_ml_kem_hash_functions_portable_shake128_init_absorb_final_e0(
+ uint8_t (*input)[34U]) {
+ libcrux_ml_kem_hash_functions_portable_PortableHash_88 shake128_state;
+ libcrux_sha3_generic_keccak_KeccakState_17 repeat_expression[3U];
for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
- shake128_state[i] = libcrux_sha3_portable_incremental_shake128_init();
+ repeat_expression[i] = libcrux_sha3_portable_incremental_shake128_init();
}
+ memcpy(shake128_state.shake128_state, repeat_expression,
+ (size_t)3U * sizeof(libcrux_sha3_generic_keccak_KeccakState_17));
for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
size_t i0 = i;
libcrux_sha3_portable_incremental_shake128_absorb_final(
- &shake128_state[i0],
+ &shake128_state.shake128_state[i0],
Eurydice_array_to_slice((size_t)34U, input[i0], uint8_t));
}
- /* Passing arrays by value in Rust generates a copy in C */
- libcrux_sha3_generic_keccak_KeccakState_48 copy_of_shake128_state[3U];
- memcpy(copy_of_shake128_state, shake128_state,
- (size_t)3U * sizeof(libcrux_sha3_generic_keccak_KeccakState_48));
- libcrux_ml_kem_hash_functions_portable_PortableHash_58 lit;
- memcpy(lit.shake128_state, copy_of_shake128_state,
- (size_t)3U * sizeof(libcrux_sha3_generic_keccak_KeccakState_48));
- return lit;
+ return shake128_state;
}
/**
-This function found in impl {(libcrux_ml_kem::hash_functions::Hash<K> for
-libcrux_ml_kem::hash_functions::portable::PortableHash<K>)}
+This function found in impl {libcrux_ml_kem::hash_functions::Hash<K> for
+libcrux_ml_kem::hash_functions::portable::PortableHash<K>}
*/
/**
A monomorphic instance of
-libcrux_ml_kem.hash_functions.portable.shake128_init_absorb_f1 with const
+libcrux_ml_kem.hash_functions.portable.shake128_init_absorb_final_4a with const
generics
- K= 3
*/
-static KRML_MUSTINLINE libcrux_ml_kem_hash_functions_portable_PortableHash_58
-libcrux_ml_kem_hash_functions_portable_shake128_init_absorb_f1_8c(
- uint8_t input[3U][34U]) {
- /* Passing arrays by value in Rust generates a copy in C */
- uint8_t copy_of_input[3U][34U];
- memcpy(copy_of_input, input, (size_t)3U * sizeof(uint8_t[34U]));
- return libcrux_ml_kem_hash_functions_portable_shake128_init_absorb_b7(
- copy_of_input);
+static inline libcrux_ml_kem_hash_functions_portable_PortableHash_88
+libcrux_ml_kem_hash_functions_portable_shake128_init_absorb_final_4a_e0(
+ uint8_t (*input)[34U]) {
+ return libcrux_ml_kem_hash_functions_portable_shake128_init_absorb_final_e0(
+ input);
}
/**
A monomorphic instance of
-libcrux_ml_kem.hash_functions.portable.shake128_squeeze_three_blocks with const
-generics
+libcrux_ml_kem.hash_functions.portable.shake128_squeeze_first_three_blocks with
+const generics
- K= 3
*/
-static KRML_MUSTINLINE void
-libcrux_ml_kem_hash_functions_portable_shake128_squeeze_three_blocks_ca(
- libcrux_ml_kem_hash_functions_portable_PortableHash_58 *st,
+static inline void
+libcrux_ml_kem_hash_functions_portable_shake128_squeeze_first_three_blocks_e0(
+ libcrux_ml_kem_hash_functions_portable_PortableHash_88 *st,
uint8_t ret[3U][504U]) {
uint8_t out[3U][504U] = {{0U}};
for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
@@ -9515,21 +8265,21 @@ libcrux_ml_kem_hash_functions_portable_shake128_squeeze_three_blocks_ca(
}
/**
-This function found in impl {(libcrux_ml_kem::hash_functions::Hash<K> for
-libcrux_ml_kem::hash_functions::portable::PortableHash<K>)}
+This function found in impl {libcrux_ml_kem::hash_functions::Hash<K> for
+libcrux_ml_kem::hash_functions::portable::PortableHash<K>}
*/
/**
A monomorphic instance of
-libcrux_ml_kem.hash_functions.portable.shake128_squeeze_three_blocks_f1 with
-const generics
+libcrux_ml_kem.hash_functions.portable.shake128_squeeze_first_three_blocks_4a
+with const generics
- K= 3
*/
-static KRML_MUSTINLINE void
-libcrux_ml_kem_hash_functions_portable_shake128_squeeze_three_blocks_f1_69(
- libcrux_ml_kem_hash_functions_portable_PortableHash_58 *self,
+static inline void
+libcrux_ml_kem_hash_functions_portable_shake128_squeeze_first_three_blocks_4a_e0(
+ libcrux_ml_kem_hash_functions_portable_PortableHash_88 *self,
uint8_t ret[3U][504U]) {
- libcrux_ml_kem_hash_functions_portable_shake128_squeeze_three_blocks_ca(self,
- ret);
+ libcrux_ml_kem_hash_functions_portable_shake128_squeeze_first_three_blocks_e0(
+ self, ret);
}
/**
@@ -9581,8 +8331,8 @@ libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
- N= 504
*/
static KRML_MUSTINLINE bool
-libcrux_ml_kem_sampling_sample_from_uniform_distribution_next_db(
- uint8_t randomness[3U][504U], size_t *sampled_coefficients,
+libcrux_ml_kem_sampling_sample_from_uniform_distribution_next_89(
+ uint8_t (*randomness)[504U], size_t *sampled_coefficients,
int16_t (*out)[272U]) {
for (size_t i0 = (size_t)0U; i0 < (size_t)3U; i0++) {
size_t i1 = i0;
@@ -9590,15 +8340,15 @@ libcrux_ml_kem_sampling_sample_from_uniform_distribution_next_db(
size_t r = i;
if (sampled_coefficients[i1] <
LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT) {
- Eurydice_slice uu____0 =
- Eurydice_array_to_subslice2(randomness[i1], r * (size_t)24U,
- r * (size_t)24U + (size_t)24U, uint8_t);
- size_t sampled = libcrux_ml_kem_vector_portable_rej_sample_0d(
- uu____0, Eurydice_array_to_subslice2(
- out[i1], sampled_coefficients[i1],
- sampled_coefficients[i1] + (size_t)16U, int16_t));
- size_t uu____1 = i1;
- sampled_coefficients[uu____1] = sampled_coefficients[uu____1] + sampled;
+ size_t sampled = libcrux_ml_kem_vector_portable_rej_sample_b8(
+ Eurydice_array_to_subslice3(randomness[i1], r * (size_t)24U,
+ r * (size_t)24U + (size_t)24U,
+ uint8_t *),
+ Eurydice_array_to_subslice3(out[i1], sampled_coefficients[i1],
+ sampled_coefficients[i1] + (size_t)16U,
+ int16_t *));
+ size_t uu____0 = i1;
+ sampled_coefficients[uu____0] = sampled_coefficients[uu____0] + sampled;
}
}
}
@@ -9618,13 +8368,13 @@ libcrux_ml_kem_sampling_sample_from_uniform_distribution_next_db(
/**
A monomorphic instance of
-libcrux_ml_kem.hash_functions.portable.shake128_squeeze_block with const
+libcrux_ml_kem.hash_functions.portable.shake128_squeeze_next_block with const
generics
- K= 3
*/
-static KRML_MUSTINLINE void
-libcrux_ml_kem_hash_functions_portable_shake128_squeeze_block_dd(
- libcrux_ml_kem_hash_functions_portable_PortableHash_58 *st,
+static inline void
+libcrux_ml_kem_hash_functions_portable_shake128_squeeze_next_block_e0(
+ libcrux_ml_kem_hash_functions_portable_PortableHash_88 *st,
uint8_t ret[3U][168U]) {
uint8_t out[3U][168U] = {{0U}};
for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
@@ -9637,20 +8387,21 @@ libcrux_ml_kem_hash_functions_portable_shake128_squeeze_block_dd(
}
/**
-This function found in impl {(libcrux_ml_kem::hash_functions::Hash<K> for
-libcrux_ml_kem::hash_functions::portable::PortableHash<K>)}
+This function found in impl {libcrux_ml_kem::hash_functions::Hash<K> for
+libcrux_ml_kem::hash_functions::portable::PortableHash<K>}
*/
/**
A monomorphic instance of
-libcrux_ml_kem.hash_functions.portable.shake128_squeeze_block_f1 with const
+libcrux_ml_kem.hash_functions.portable.shake128_squeeze_next_block_4a with const
generics
- K= 3
*/
-static KRML_MUSTINLINE void
-libcrux_ml_kem_hash_functions_portable_shake128_squeeze_block_f1_60(
- libcrux_ml_kem_hash_functions_portable_PortableHash_58 *self,
+static inline void
+libcrux_ml_kem_hash_functions_portable_shake128_squeeze_next_block_4a_e0(
+ libcrux_ml_kem_hash_functions_portable_PortableHash_88 *self,
uint8_t ret[3U][168U]) {
- libcrux_ml_kem_hash_functions_portable_shake128_squeeze_block_dd(self, ret);
+ libcrux_ml_kem_hash_functions_portable_shake128_squeeze_next_block_e0(self,
+ ret);
}
/**
@@ -9702,8 +8453,8 @@ libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
- N= 168
*/
static KRML_MUSTINLINE bool
-libcrux_ml_kem_sampling_sample_from_uniform_distribution_next_db0(
- uint8_t randomness[3U][168U], size_t *sampled_coefficients,
+libcrux_ml_kem_sampling_sample_from_uniform_distribution_next_890(
+ uint8_t (*randomness)[168U], size_t *sampled_coefficients,
int16_t (*out)[272U]) {
for (size_t i0 = (size_t)0U; i0 < (size_t)3U; i0++) {
size_t i1 = i0;
@@ -9711,15 +8462,15 @@ libcrux_ml_kem_sampling_sample_from_uniform_distribution_next_db0(
size_t r = i;
if (sampled_coefficients[i1] <
LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT) {
- Eurydice_slice uu____0 =
- Eurydice_array_to_subslice2(randomness[i1], r * (size_t)24U,
- r * (size_t)24U + (size_t)24U, uint8_t);
- size_t sampled = libcrux_ml_kem_vector_portable_rej_sample_0d(
- uu____0, Eurydice_array_to_subslice2(
- out[i1], sampled_coefficients[i1],
- sampled_coefficients[i1] + (size_t)16U, int16_t));
- size_t uu____1 = i1;
- sampled_coefficients[uu____1] = sampled_coefficients[uu____1] + sampled;
+ size_t sampled = libcrux_ml_kem_vector_portable_rej_sample_b8(
+ Eurydice_array_to_subslice3(randomness[i1], r * (size_t)24U,
+ r * (size_t)24U + (size_t)24U,
+ uint8_t *),
+ Eurydice_array_to_subslice3(out[i1], sampled_coefficients[i1],
+ sampled_coefficients[i1] + (size_t)16U,
+ int16_t *));
+ size_t uu____0 = i1;
+ sampled_coefficients[uu____0] = sampled_coefficients[uu____0] + sampled;
}
}
}
@@ -9738,42 +8489,64 @@ libcrux_ml_kem_sampling_sample_from_uniform_distribution_next_db0(
}
/**
-This function found in impl
-{libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0]}
-*/
-/**
-A monomorphic instance of libcrux_ml_kem.polynomial.from_i16_array_89
+A monomorphic instance of libcrux_ml_kem.polynomial.from_i16_array
with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
with const generics
*/
-static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0
-libcrux_ml_kem_polynomial_from_i16_array_89_c1(Eurydice_slice a) {
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 result =
- libcrux_ml_kem_polynomial_ZERO_89_ea();
+static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d
+libcrux_ml_kem_polynomial_from_i16_array_ea(Eurydice_slice a) {
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d result =
+ libcrux_ml_kem_polynomial_ZERO_ea();
for (size_t i = (size_t)0U;
i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) {
size_t i0 = i;
libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
- libcrux_ml_kem_vector_portable_from_i16_array_0d(
- Eurydice_slice_subslice2(a, i0 * (size_t)16U,
- (i0 + (size_t)1U) * (size_t)16U, int16_t));
+ libcrux_ml_kem_vector_portable_from_i16_array_b8(
+ Eurydice_slice_subslice3(a, i0 * (size_t)16U,
+ (i0 + (size_t)1U) * (size_t)16U,
+ int16_t *));
result.coefficients[i0] = uu____0;
}
return result;
}
/**
-A monomorphic instance of libcrux_ml_kem.sampling.sample_from_xof.closure
+This function found in impl
+{libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0,
+TraitClause@1]}
+*/
+/**
+A monomorphic instance of libcrux_ml_kem.polynomial.from_i16_array_d6
+with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
+with const generics
+
+*/
+static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d
+libcrux_ml_kem_polynomial_from_i16_array_d6_ea(Eurydice_slice a) {
+ return libcrux_ml_kem_polynomial_from_i16_array_ea(a);
+}
+
+/**
+This function found in impl {core::ops::function::FnMut<(@Array<i16, 272usize>),
+libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0,
+TraitClause@2]> for libcrux_ml_kem::sampling::sample_from_xof::closure<Vector,
+Hasher, K>[TraitClause@0, TraitClause@1, TraitClause@2, TraitClause@3]}
+*/
+/**
+A monomorphic instance of libcrux_ml_kem.sampling.sample_from_xof.call_mut_e7
with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const
generics
- K= 3
*/
-static inline libcrux_ml_kem_polynomial_PolynomialRingElement_f0
-libcrux_ml_kem_sampling_sample_from_xof_closure_04(int16_t s[272U]) {
- return libcrux_ml_kem_polynomial_from_i16_array_89_c1(
- Eurydice_array_to_subslice2(s, (size_t)0U, (size_t)256U, int16_t));
+static inline libcrux_ml_kem_polynomial_PolynomialRingElement_1d
+libcrux_ml_kem_sampling_sample_from_xof_call_mut_e7_2b(
+ void **_, int16_t tupled_args[272U]) {
+ int16_t s[272U];
+ memcpy(s, tupled_args, (size_t)272U * sizeof(int16_t));
+ return libcrux_ml_kem_polynomial_from_i16_array_d6_ea(
+ Eurydice_array_to_subslice3(s, (size_t)0U, (size_t)256U, int16_t *));
}
/**
@@ -9783,51 +8556,43 @@ libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const
generics
- K= 3
*/
-static KRML_MUSTINLINE void libcrux_ml_kem_sampling_sample_from_xof_3f(
- uint8_t seeds[3U][34U],
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret[3U]) {
+static KRML_MUSTINLINE void libcrux_ml_kem_sampling_sample_from_xof_2b(
+ uint8_t (*seeds)[34U],
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d ret[3U]) {
size_t sampled_coefficients[3U] = {0U};
int16_t out[3U][272U] = {{0U}};
- /* Passing arrays by value in Rust generates a copy in C */
- uint8_t copy_of_seeds[3U][34U];
- memcpy(copy_of_seeds, seeds, (size_t)3U * sizeof(uint8_t[34U]));
- libcrux_ml_kem_hash_functions_portable_PortableHash_58 xof_state =
- libcrux_ml_kem_hash_functions_portable_shake128_init_absorb_f1_8c(
- copy_of_seeds);
+ libcrux_ml_kem_hash_functions_portable_PortableHash_88 xof_state =
+ libcrux_ml_kem_hash_functions_portable_shake128_init_absorb_final_4a_e0(
+ seeds);
uint8_t randomness0[3U][504U];
- libcrux_ml_kem_hash_functions_portable_shake128_squeeze_three_blocks_f1_69(
+ libcrux_ml_kem_hash_functions_portable_shake128_squeeze_first_three_blocks_4a_e0(
&xof_state, randomness0);
- /* Passing arrays by value in Rust generates a copy in C */
- uint8_t copy_of_randomness0[3U][504U];
- memcpy(copy_of_randomness0, randomness0, (size_t)3U * sizeof(uint8_t[504U]));
- bool done = libcrux_ml_kem_sampling_sample_from_uniform_distribution_next_db(
- copy_of_randomness0, sampled_coefficients, out);
+ bool done = libcrux_ml_kem_sampling_sample_from_uniform_distribution_next_89(
+ randomness0, sampled_coefficients, out);
while (true) {
if (done) {
break;
} else {
uint8_t randomness[3U][168U];
- libcrux_ml_kem_hash_functions_portable_shake128_squeeze_block_f1_60(
+ libcrux_ml_kem_hash_functions_portable_shake128_squeeze_next_block_4a_e0(
&xof_state, randomness);
- /* Passing arrays by value in Rust generates a copy in C */
- uint8_t copy_of_randomness[3U][168U];
- memcpy(copy_of_randomness, randomness,
- (size_t)3U * sizeof(uint8_t[168U]));
- done = libcrux_ml_kem_sampling_sample_from_uniform_distribution_next_db0(
- copy_of_randomness, sampled_coefficients, out);
+ done = libcrux_ml_kem_sampling_sample_from_uniform_distribution_next_890(
+ randomness, sampled_coefficients, out);
}
}
/* Passing arrays by value in Rust generates a copy in C */
int16_t copy_of_out[3U][272U];
memcpy(copy_of_out, out, (size_t)3U * sizeof(int16_t[272U]));
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret0[3U];
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d ret0[3U];
for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
- ret0[i] =
- libcrux_ml_kem_sampling_sample_from_xof_closure_04(copy_of_out[i]);
+ /* original Rust expression is not an lvalue in C */
+ void *lvalue = (void *)0U;
+ ret0[i] = libcrux_ml_kem_sampling_sample_from_xof_call_mut_e7_2b(
+ &lvalue, copy_of_out[i]);
}
memcpy(
ret, ret0,
- (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
+ (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d));
}
/**
@@ -9837,41 +8602,32 @@ libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const
generics
- K= 3
*/
-static KRML_MUSTINLINE void libcrux_ml_kem_matrix_sample_matrix_A_38(
- uint8_t seed[34U], bool transpose,
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret[3U][3U]) {
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 A_transpose[3U][3U];
- for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
- libcrux_ml_kem_matrix_sample_matrix_A_closure_4b(i, A_transpose[i]);
- }
+static KRML_MUSTINLINE void libcrux_ml_kem_matrix_sample_matrix_A_2b(
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d (*A_transpose)[3U],
+ uint8_t *seed, bool transpose) {
for (size_t i0 = (size_t)0U; i0 < (size_t)3U; i0++) {
size_t i1 = i0;
- /* Passing arrays by value in Rust generates a copy in C */
- uint8_t copy_of_seed[34U];
- memcpy(copy_of_seed, seed, (size_t)34U * sizeof(uint8_t));
uint8_t seeds[3U][34U];
for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
- memcpy(seeds[i], copy_of_seed, (size_t)34U * sizeof(uint8_t));
+ core_array__core__clone__Clone_for__Array_T__N___clone(
+ (size_t)34U, seed, seeds[i], uint8_t, void *);
}
for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
size_t j = i;
seeds[j][32U] = (uint8_t)i1;
seeds[j][33U] = (uint8_t)j;
}
- /* Passing arrays by value in Rust generates a copy in C */
- uint8_t copy_of_seeds[3U][34U];
- memcpy(copy_of_seeds, seeds, (size_t)3U * sizeof(uint8_t[34U]));
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 sampled[3U];
- libcrux_ml_kem_sampling_sample_from_xof_3f(copy_of_seeds, sampled);
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d sampled[3U];
+ libcrux_ml_kem_sampling_sample_from_xof_2b(seeds, sampled);
for (size_t i = (size_t)0U;
i < Eurydice_slice_len(
Eurydice_array_to_slice(
(size_t)3U, sampled,
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0),
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0);
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d),
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d);
i++) {
size_t j = i;
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 sample = sampled[j];
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d sample = sampled[j];
if (transpose) {
A_transpose[j][i1] = sample;
} else {
@@ -9879,35 +8635,91 @@ static KRML_MUSTINLINE void libcrux_ml_kem_matrix_sample_matrix_A_38(
}
}
}
- memcpy(ret, A_transpose,
- (size_t)3U *
- sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0[3U]));
+}
+
+/**
+A monomorphic instance of libcrux_ml_kem.ind_cpa.build_unpacked_public_key_mut
+with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
+libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const
+generics
+- K= 3
+- T_AS_NTT_ENCODED_SIZE= 1152
+*/
+static KRML_MUSTINLINE void
+libcrux_ml_kem_ind_cpa_build_unpacked_public_key_mut_3f(
+ Eurydice_slice public_key,
+ libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0
+ *unpacked_public_key) {
+ Eurydice_slice uu____0 = Eurydice_slice_subslice_to(
+ public_key, (size_t)1152U, uint8_t, size_t, uint8_t[]);
+ libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_1b(
+ uu____0, unpacked_public_key->t_as_ntt);
+ Eurydice_slice seed = Eurydice_slice_subslice_from(
+ public_key, (size_t)1152U, uint8_t, size_t, uint8_t[]);
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d(*uu____1)[3U] =
+ unpacked_public_key->A;
+ uint8_t ret[34U];
+ libcrux_ml_kem_utils_into_padded_array_b6(seed, ret);
+ libcrux_ml_kem_matrix_sample_matrix_A_2b(uu____1, ret, false);
+}
+
+/**
+A monomorphic instance of libcrux_ml_kem.ind_cpa.build_unpacked_public_key
+with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
+libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const
+generics
+- K= 3
+- T_AS_NTT_ENCODED_SIZE= 1152
+*/
+static KRML_MUSTINLINE
+ libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0
+ libcrux_ml_kem_ind_cpa_build_unpacked_public_key_3f(
+ Eurydice_slice public_key) {
+ libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0
+ unpacked_public_key = libcrux_ml_kem_ind_cpa_unpacked_default_8b_1b();
+ libcrux_ml_kem_ind_cpa_build_unpacked_public_key_mut_3f(public_key,
+ &unpacked_public_key);
+ return unpacked_public_key;
}
/**
A monomorphic instance of K.
with types libcrux_ml_kem_polynomial_PolynomialRingElement
-libcrux_ml_kem_vector_portable_vector_type_PortableVector[3size_t], uint8_t
+libcrux_ml_kem_vector_portable_vector_type_PortableVector[3size_t],
+libcrux_ml_kem_polynomial_PolynomialRingElement
+libcrux_ml_kem_vector_portable_vector_type_PortableVector
*/
-typedef struct tuple_b0_s {
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 fst[3U];
- uint8_t snd;
-} tuple_b0;
+typedef struct tuple_ed_s {
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d fst[3U];
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d snd;
+} tuple_ed;
/**
-A monomorphic instance of
-libcrux_ml_kem.ind_cpa.sample_vector_cbd_then_ntt.closure with types
-libcrux_ml_kem_vector_portable_vector_type_PortableVector,
+This function found in impl {core::ops::function::FnMut<(usize),
+libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0,
+TraitClause@2]> for libcrux_ml_kem::ind_cpa::encrypt_c1::closure<Vector, Hasher,
+K, C1_LEN, U_COMPRESSION_FACTOR, BLOCK_LEN, ETA1, ETA1_RANDOMNESS_SIZE, ETA2,
+ETA2_RANDOMNESS_SIZE>[TraitClause@0, TraitClause@1, TraitClause@2,
+TraitClause@3]}
+*/
+/**
+A monomorphic instance of libcrux_ml_kem.ind_cpa.encrypt_c1.call_mut_f1
+with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const
generics
- K= 3
-- ETA= 2
-- ETA_RANDOMNESS_SIZE= 128
+- C1_LEN= 960
+- U_COMPRESSION_FACTOR= 10
+- BLOCK_LEN= 320
+- ETA1= 2
+- ETA1_RANDOMNESS_SIZE= 128
+- ETA2= 2
+- ETA2_RANDOMNESS_SIZE= 128
*/
-static inline libcrux_ml_kem_polynomial_PolynomialRingElement_f0
-libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_closure_f7(size_t _i) {
- return libcrux_ml_kem_polynomial_ZERO_89_ea();
+static inline libcrux_ml_kem_polynomial_PolynomialRingElement_1d
+libcrux_ml_kem_ind_cpa_encrypt_c1_call_mut_f1_85(void **_, size_t tupled_args) {
+ return libcrux_ml_kem_polynomial_ZERO_d6_ea();
}
/**
@@ -9916,7 +8728,7 @@ with const generics
- K= 3
- LEN= 128
*/
-static KRML_MUSTINLINE void libcrux_ml_kem_hash_functions_portable_PRFxN_c5(
+static inline void libcrux_ml_kem_hash_functions_portable_PRFxN_41(
uint8_t (*input)[33U], uint8_t ret[3U][128U]) {
uint8_t out[3U][128U] = {{0U}};
for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
@@ -9929,18 +8741,18 @@ static KRML_MUSTINLINE void libcrux_ml_kem_hash_functions_portable_PRFxN_c5(
}
/**
-This function found in impl {(libcrux_ml_kem::hash_functions::Hash<K> for
-libcrux_ml_kem::hash_functions::portable::PortableHash<K>)}
+This function found in impl {libcrux_ml_kem::hash_functions::Hash<K> for
+libcrux_ml_kem::hash_functions::portable::PortableHash<K>}
*/
/**
-A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PRFxN_f1
+A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PRFxN_4a
with const generics
- K= 3
- LEN= 128
*/
-static KRML_MUSTINLINE void libcrux_ml_kem_hash_functions_portable_PRFxN_f1_93(
+static inline void libcrux_ml_kem_hash_functions_portable_PRFxN_4a_41(
uint8_t (*input)[33U], uint8_t ret[3U][128U]) {
- libcrux_ml_kem_hash_functions_portable_PRFxN_c5(input, ret);
+ libcrux_ml_kem_hash_functions_portable_PRFxN_41(input, ret);
}
/**
@@ -9998,16 +8810,16 @@ libcrux_ml_kem.sampling.sample_from_binomial_distribution_2 with types
libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
*/
-static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0
-libcrux_ml_kem_sampling_sample_from_binomial_distribution_2_85(
+static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d
+libcrux_ml_kem_sampling_sample_from_binomial_distribution_2_ea(
Eurydice_slice randomness) {
int16_t sampled_i16s[256U] = {0U};
for (size_t i0 = (size_t)0U;
i0 < Eurydice_slice_len(randomness, uint8_t) / (size_t)4U; i0++) {
size_t chunk_number = i0;
- Eurydice_slice byte_chunk = Eurydice_slice_subslice2(
+ Eurydice_slice byte_chunk = Eurydice_slice_subslice3(
randomness, chunk_number * (size_t)4U,
- chunk_number * (size_t)4U + (size_t)4U, uint8_t);
+ chunk_number * (size_t)4U + (size_t)4U, uint8_t *);
uint32_t random_bits_as_u32 =
(((uint32_t)Eurydice_slice_index(byte_chunk, (size_t)0U, uint8_t,
uint8_t *) |
@@ -10023,7 +8835,7 @@ libcrux_ml_kem_sampling_sample_from_binomial_distribution_2_85(
uint32_t even_bits = random_bits_as_u32 & 1431655765U;
uint32_t odd_bits = random_bits_as_u32 >> 1U & 1431655765U;
uint32_t coin_toss_outcomes = even_bits + odd_bits;
- for (uint32_t i = 0U; i < CORE_NUM__U32_8__BITS / 4U; i++) {
+ for (uint32_t i = 0U; i < 32U / 4U; i++) {
uint32_t outcome_set = i;
uint32_t outcome_set0 = outcome_set * 4U;
int16_t outcome_1 =
@@ -10034,52 +8846,7 @@ libcrux_ml_kem_sampling_sample_from_binomial_distribution_2_85(
sampled_i16s[(size_t)8U * chunk_number + offset] = outcome_1 - outcome_2;
}
}
- return libcrux_ml_kem_polynomial_from_i16_array_89_c1(
- Eurydice_array_to_slice((size_t)256U, sampled_i16s, int16_t));
-}
-
-/**
-A monomorphic instance of
-libcrux_ml_kem.sampling.sample_from_binomial_distribution_3 with types
-libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
-
-*/
-static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0
-libcrux_ml_kem_sampling_sample_from_binomial_distribution_3_eb(
- Eurydice_slice randomness) {
- int16_t sampled_i16s[256U] = {0U};
- for (size_t i0 = (size_t)0U;
- i0 < Eurydice_slice_len(randomness, uint8_t) / (size_t)3U; i0++) {
- size_t chunk_number = i0;
- Eurydice_slice byte_chunk = Eurydice_slice_subslice2(
- randomness, chunk_number * (size_t)3U,
- chunk_number * (size_t)3U + (size_t)3U, uint8_t);
- uint32_t random_bits_as_u24 =
- ((uint32_t)Eurydice_slice_index(byte_chunk, (size_t)0U, uint8_t,
- uint8_t *) |
- (uint32_t)Eurydice_slice_index(byte_chunk, (size_t)1U, uint8_t,
- uint8_t *)
- << 8U) |
- (uint32_t)Eurydice_slice_index(byte_chunk, (size_t)2U, uint8_t,
- uint8_t *)
- << 16U;
- uint32_t first_bits = random_bits_as_u24 & 2396745U;
- uint32_t second_bits = random_bits_as_u24 >> 1U & 2396745U;
- uint32_t third_bits = random_bits_as_u24 >> 2U & 2396745U;
- uint32_t coin_toss_outcomes = first_bits + second_bits + third_bits;
- for (int32_t i = (int32_t)0; i < (int32_t)24 / (int32_t)6; i++) {
- int32_t outcome_set = i;
- int32_t outcome_set0 = outcome_set * (int32_t)6;
- int16_t outcome_1 =
- (int16_t)(coin_toss_outcomes >> (uint32_t)outcome_set0 & 7U);
- int16_t outcome_2 = (int16_t)(coin_toss_outcomes >>
- (uint32_t)(outcome_set0 + (int32_t)3) &
- 7U);
- size_t offset = (size_t)(outcome_set0 / (int32_t)6);
- sampled_i16s[(size_t)4U * chunk_number + offset] = outcome_1 - outcome_2;
- }
- }
- return libcrux_ml_kem_polynomial_from_i16_array_89_c1(
+ return libcrux_ml_kem_polynomial_from_i16_array_d6_ea(
Eurydice_array_to_slice((size_t)256U, sampled_i16s, int16_t));
}
@@ -10089,10 +8856,10 @@ libcrux_ml_kem.sampling.sample_from_binomial_distribution with types
libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
- ETA= 2
*/
-static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0
-libcrux_ml_kem_sampling_sample_from_binomial_distribution_c6(
+static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d
+libcrux_ml_kem_sampling_sample_from_binomial_distribution_a0(
Eurydice_slice randomness) {
- return libcrux_ml_kem_sampling_sample_from_binomial_distribution_2_85(
+ return libcrux_ml_kem_sampling_sample_from_binomial_distribution_2_ea(
randomness);
}
@@ -10102,18 +8869,18 @@ with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
with const generics
*/
-static KRML_MUSTINLINE void libcrux_ml_kem_ntt_ntt_at_layer_7_f4(
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re) {
+static KRML_MUSTINLINE void libcrux_ml_kem_ntt_ntt_at_layer_7_ea(
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re) {
size_t step = LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT / (size_t)2U;
for (size_t i = (size_t)0U; i < step; i++) {
size_t j = i;
libcrux_ml_kem_vector_portable_vector_type_PortableVector t =
- libcrux_ml_kem_vector_portable_multiply_by_constant_0d(
+ libcrux_ml_kem_vector_portable_multiply_by_constant_b8(
re->coefficients[j + step], (int16_t)-1600);
re->coefficients[j + step] =
- libcrux_ml_kem_vector_portable_sub_0d(re->coefficients[j], &t);
+ libcrux_ml_kem_vector_portable_sub_b8(re->coefficients[j], &t);
libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____1 =
- libcrux_ml_kem_vector_portable_add_0d(re->coefficients[j], &t);
+ libcrux_ml_kem_vector_portable_add_b8(re->coefficients[j], &t);
re->coefficients[j] = uu____1;
}
}
@@ -10125,20 +8892,23 @@ with const generics
*/
static KRML_MUSTINLINE void
-libcrux_ml_kem_ntt_ntt_binomially_sampled_ring_element_0f(
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re) {
- libcrux_ml_kem_ntt_ntt_at_layer_7_f4(re);
+libcrux_ml_kem_ntt_ntt_binomially_sampled_ring_element_ea(
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re) {
+ libcrux_ml_kem_ntt_ntt_at_layer_7_ea(re);
size_t zeta_i = (size_t)1U;
- libcrux_ml_kem_ntt_ntt_at_layer_4_plus_51(&zeta_i, re, (size_t)6U,
- (size_t)3U);
- libcrux_ml_kem_ntt_ntt_at_layer_4_plus_51(&zeta_i, re, (size_t)5U,
- (size_t)3U);
- libcrux_ml_kem_ntt_ntt_at_layer_4_plus_51(&zeta_i, re, (size_t)4U,
- (size_t)3U);
- libcrux_ml_kem_ntt_ntt_at_layer_3_fd(&zeta_i, re, (size_t)3U, (size_t)3U);
- libcrux_ml_kem_ntt_ntt_at_layer_2_ad(&zeta_i, re, (size_t)2U, (size_t)3U);
- libcrux_ml_kem_ntt_ntt_at_layer_1_a2(&zeta_i, re, (size_t)1U, (size_t)3U);
- libcrux_ml_kem_polynomial_poly_barrett_reduce_89_8b(re);
+ libcrux_ml_kem_ntt_ntt_at_layer_4_plus_ea(&zeta_i, re, (size_t)6U,
+ (size_t)11207U);
+ libcrux_ml_kem_ntt_ntt_at_layer_4_plus_ea(&zeta_i, re, (size_t)5U,
+ (size_t)11207U + (size_t)3328U);
+ libcrux_ml_kem_ntt_ntt_at_layer_4_plus_ea(
+ &zeta_i, re, (size_t)4U, (size_t)11207U + (size_t)2U * (size_t)3328U);
+ libcrux_ml_kem_ntt_ntt_at_layer_3_ea(
+ &zeta_i, re, (size_t)11207U + (size_t)3U * (size_t)3328U);
+ libcrux_ml_kem_ntt_ntt_at_layer_2_ea(
+ &zeta_i, re, (size_t)11207U + (size_t)4U * (size_t)3328U);
+ libcrux_ml_kem_ntt_ntt_at_layer_1_ea(
+ &zeta_i, re, (size_t)11207U + (size_t)5U * (size_t)3328U);
+ libcrux_ml_kem_polynomial_poly_barrett_reduce_d6_ea(re);
}
/**
@@ -10154,59 +8924,54 @@ generics
- ETA= 2
- ETA_RANDOMNESS_SIZE= 128
*/
-static KRML_MUSTINLINE tuple_b0
-libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_fc(uint8_t prf_input[33U],
- uint8_t domain_separator) {
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re_as_ntt[3U];
- for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
- re_as_ntt[i] = libcrux_ml_kem_polynomial_ZERO_89_ea();
- }
- /* Passing arrays by value in Rust generates a copy in C */
- uint8_t copy_of_prf_input[33U];
- memcpy(copy_of_prf_input, prf_input, (size_t)33U * sizeof(uint8_t));
+static KRML_MUSTINLINE uint8_t
+libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_3b(
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re_as_ntt,
+ uint8_t *prf_input, uint8_t domain_separator) {
uint8_t prf_inputs[3U][33U];
for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
- memcpy(prf_inputs[i], copy_of_prf_input, (size_t)33U * sizeof(uint8_t));
- }
- for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
- size_t i0 = i;
- prf_inputs[i0][32U] = domain_separator;
- domain_separator = (uint32_t)domain_separator + 1U;
+ core_array__core__clone__Clone_for__Array_T__N___clone(
+ (size_t)33U, prf_input, prf_inputs[i], uint8_t, void *);
}
+ domain_separator =
+ libcrux_ml_kem_utils_prf_input_inc_e0(prf_inputs, domain_separator);
uint8_t prf_outputs[3U][128U];
- libcrux_ml_kem_hash_functions_portable_PRFxN_f1_93(prf_inputs, prf_outputs);
+ libcrux_ml_kem_hash_functions_portable_PRFxN_4a_41(prf_inputs, prf_outputs);
for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
size_t i0 = i;
re_as_ntt[i0] =
- libcrux_ml_kem_sampling_sample_from_binomial_distribution_c6(
+ libcrux_ml_kem_sampling_sample_from_binomial_distribution_a0(
Eurydice_array_to_slice((size_t)128U, prf_outputs[i0], uint8_t));
- libcrux_ml_kem_ntt_ntt_binomially_sampled_ring_element_0f(&re_as_ntt[i0]);
+ libcrux_ml_kem_ntt_ntt_binomially_sampled_ring_element_ea(&re_as_ntt[i0]);
}
- /* Passing arrays by value in Rust generates a copy in C */
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 copy_of_re_as_ntt[3U];
- memcpy(
- copy_of_re_as_ntt, re_as_ntt,
- (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
- tuple_b0 lit;
- memcpy(
- lit.fst, copy_of_re_as_ntt,
- (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
- lit.snd = domain_separator;
- return lit;
+ return domain_separator;
}
/**
-A monomorphic instance of libcrux_ml_kem.ind_cpa.sample_ring_element_cbd.closure
+This function found in impl {core::ops::function::FnMut<(usize),
+libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0,
+TraitClause@2]> for libcrux_ml_kem::ind_cpa::encrypt_c1::closure#1<Vector,
+Hasher, K, C1_LEN, U_COMPRESSION_FACTOR, BLOCK_LEN, ETA1, ETA1_RANDOMNESS_SIZE,
+ETA2, ETA2_RANDOMNESS_SIZE>[TraitClause@0, TraitClause@1, TraitClause@2,
+TraitClause@3]}
+*/
+/**
+A monomorphic instance of libcrux_ml_kem.ind_cpa.encrypt_c1.call_mut_dd
with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const
generics
- K= 3
-- ETA2_RANDOMNESS_SIZE= 128
+- C1_LEN= 960
+- U_COMPRESSION_FACTOR= 10
+- BLOCK_LEN= 320
+- ETA1= 2
+- ETA1_RANDOMNESS_SIZE= 128
- ETA2= 2
+- ETA2_RANDOMNESS_SIZE= 128
*/
-static inline libcrux_ml_kem_polynomial_PolynomialRingElement_f0
-libcrux_ml_kem_ind_cpa_sample_ring_element_cbd_closure_77(size_t _i) {
- return libcrux_ml_kem_polynomial_ZERO_89_ea();
+static inline libcrux_ml_kem_polynomial_PolynomialRingElement_1d
+libcrux_ml_kem_ind_cpa_encrypt_c1_call_mut_dd_85(void **_, size_t tupled_args) {
+ return libcrux_ml_kem_polynomial_ZERO_d6_ea();
}
/**
@@ -10221,45 +8986,27 @@ generics
- ETA2_RANDOMNESS_SIZE= 128
- ETA2= 2
*/
-static KRML_MUSTINLINE tuple_b0
-libcrux_ml_kem_ind_cpa_sample_ring_element_cbd_ac(uint8_t prf_input[33U],
- uint8_t domain_separator) {
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 error_1[3U];
- for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
- error_1[i] = libcrux_ml_kem_polynomial_ZERO_89_ea();
- }
- /* Passing arrays by value in Rust generates a copy in C */
- uint8_t copy_of_prf_input[33U];
- memcpy(copy_of_prf_input, prf_input, (size_t)33U * sizeof(uint8_t));
+static KRML_MUSTINLINE uint8_t
+libcrux_ml_kem_ind_cpa_sample_ring_element_cbd_3b(
+ uint8_t *prf_input, uint8_t domain_separator,
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *error_1) {
uint8_t prf_inputs[3U][33U];
for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
- memcpy(prf_inputs[i], copy_of_prf_input, (size_t)33U * sizeof(uint8_t));
- }
- for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
- size_t i0 = i;
- prf_inputs[i0][32U] = domain_separator;
- domain_separator = (uint32_t)domain_separator + 1U;
+ core_array__core__clone__Clone_for__Array_T__N___clone(
+ (size_t)33U, prf_input, prf_inputs[i], uint8_t, void *);
}
+ domain_separator =
+ libcrux_ml_kem_utils_prf_input_inc_e0(prf_inputs, domain_separator);
uint8_t prf_outputs[3U][128U];
- libcrux_ml_kem_hash_functions_portable_PRFxN_f1_93(prf_inputs, prf_outputs);
+ libcrux_ml_kem_hash_functions_portable_PRFxN_4a_41(prf_inputs, prf_outputs);
for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
size_t i0 = i;
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 uu____1 =
- libcrux_ml_kem_sampling_sample_from_binomial_distribution_c6(
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d uu____0 =
+ libcrux_ml_kem_sampling_sample_from_binomial_distribution_a0(
Eurydice_array_to_slice((size_t)128U, prf_outputs[i0], uint8_t));
- error_1[i0] = uu____1;
+ error_1[i0] = uu____0;
}
- /* Passing arrays by value in Rust generates a copy in C */
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 copy_of_error_1[3U];
- memcpy(
- copy_of_error_1, error_1,
- (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
- tuple_b0 lit;
- memcpy(
- lit.fst, copy_of_error_1,
- (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
- lit.snd = domain_separator;
- return lit;
+ return domain_separator;
}
/**
@@ -10267,7 +9014,7 @@ A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PRF
with const generics
- LEN= 128
*/
-static KRML_MUSTINLINE void libcrux_ml_kem_hash_functions_portable_PRF_2b0(
+static inline void libcrux_ml_kem_hash_functions_portable_PRF_a6(
Eurydice_slice input, uint8_t ret[128U]) {
uint8_t digest[128U] = {0U};
libcrux_sha3_portable_shake256(
@@ -10276,60 +9023,81 @@ static KRML_MUSTINLINE void libcrux_ml_kem_hash_functions_portable_PRF_2b0(
}
/**
-This function found in impl {(libcrux_ml_kem::hash_functions::Hash<K> for
-libcrux_ml_kem::hash_functions::portable::PortableHash<K>)}
+This function found in impl {libcrux_ml_kem::hash_functions::Hash<K> for
+libcrux_ml_kem::hash_functions::portable::PortableHash<K>}
*/
/**
-A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PRF_f1
+A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PRF_4a
with const generics
- K= 3
- LEN= 128
*/
-static KRML_MUSTINLINE void libcrux_ml_kem_hash_functions_portable_PRF_f1_ee0(
+static inline void libcrux_ml_kem_hash_functions_portable_PRF_4a_410(
Eurydice_slice input, uint8_t ret[128U]) {
- libcrux_ml_kem_hash_functions_portable_PRF_2b0(input, ret);
+ libcrux_ml_kem_hash_functions_portable_PRF_a6(input, ret);
}
/**
-A monomorphic instance of libcrux_ml_kem.matrix.compute_vector_u.closure
+This function found in impl {core::ops::function::FnMut<(usize),
+libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0,
+TraitClause@1]> for libcrux_ml_kem::matrix::compute_vector_u::closure<Vector,
+K>[TraitClause@0, TraitClause@1]}
+*/
+/**
+A monomorphic instance of libcrux_ml_kem.matrix.compute_vector_u.call_mut_a8
with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
with const generics
- K= 3
*/
-static inline libcrux_ml_kem_polynomial_PolynomialRingElement_f0
-libcrux_ml_kem_matrix_compute_vector_u_closure_d6(size_t _i) {
- return libcrux_ml_kem_polynomial_ZERO_89_ea();
+static inline libcrux_ml_kem_polynomial_PolynomialRingElement_1d
+libcrux_ml_kem_matrix_compute_vector_u_call_mut_a8_1b(void **_,
+ size_t tupled_args) {
+ return libcrux_ml_kem_polynomial_ZERO_d6_ea();
}
/**
-This function found in impl
-{libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0]}
-*/
-/**
-A monomorphic instance of libcrux_ml_kem.polynomial.add_error_reduce_89
+A monomorphic instance of libcrux_ml_kem.polynomial.add_error_reduce
with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
with const generics
*/
-static KRML_MUSTINLINE void libcrux_ml_kem_polynomial_add_error_reduce_89_38(
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *self,
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *error) {
+static KRML_MUSTINLINE void libcrux_ml_kem_polynomial_add_error_reduce_ea(
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *myself,
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *error) {
for (size_t i = (size_t)0U;
i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) {
size_t j = i;
libcrux_ml_kem_vector_portable_vector_type_PortableVector
coefficient_normal_form =
- libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_0d(
- self->coefficients[j], (int16_t)1441);
- libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
- libcrux_ml_kem_vector_portable_barrett_reduce_0d(
- libcrux_ml_kem_vector_portable_add_0d(coefficient_normal_form,
- &error->coefficients[j]));
- self->coefficients[j] = uu____0;
+ libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_b8(
+ myself->coefficients[j], (int16_t)1441);
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector sum =
+ libcrux_ml_kem_vector_portable_add_b8(coefficient_normal_form,
+ &error->coefficients[j]);
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector red =
+ libcrux_ml_kem_vector_portable_barrett_reduce_b8(sum);
+ myself->coefficients[j] = red;
}
}
/**
+This function found in impl
+{libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0,
+TraitClause@1]}
+*/
+/**
+A monomorphic instance of libcrux_ml_kem.polynomial.add_error_reduce_d6
+with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
+with const generics
+
+*/
+static KRML_MUSTINLINE void libcrux_ml_kem_polynomial_add_error_reduce_d6_ea(
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *self,
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *error) {
+ libcrux_ml_kem_polynomial_add_error_reduce_ea(self, error);
+}
+
+/**
Compute u := InvertNTT(Aᵀ ◦ r̂) + e₁
*/
/**
@@ -10338,149 +9106,47 @@ with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
with const generics
- K= 3
*/
-static KRML_MUSTINLINE void libcrux_ml_kem_matrix_compute_vector_u_59(
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 (*a_as_ntt)[3U],
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *r_as_ntt,
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *error_1,
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret[3U]) {
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 result[3U];
+static KRML_MUSTINLINE void libcrux_ml_kem_matrix_compute_vector_u_1b(
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d (*a_as_ntt)[3U],
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *r_as_ntt,
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *error_1,
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d ret[3U]) {
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d result[3U];
for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
- result[i] = libcrux_ml_kem_polynomial_ZERO_89_ea();
+ /* original Rust expression is not an lvalue in C */
+ void *lvalue = (void *)0U;
+ result[i] =
+ libcrux_ml_kem_matrix_compute_vector_u_call_mut_a8_1b(&lvalue, i);
}
for (size_t i0 = (size_t)0U;
i0 < Eurydice_slice_len(
Eurydice_array_to_slice(
(size_t)3U, a_as_ntt,
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0[3U]),
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0[3U]);
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d[3U]),
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d[3U]);
i0++) {
size_t i1 = i0;
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *row = a_as_ntt[i1];
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *row = a_as_ntt[i1];
for (size_t i = (size_t)0U;
i < Eurydice_slice_len(
Eurydice_array_to_slice(
(size_t)3U, row,
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0),
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0);
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d),
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d);
i++) {
size_t j = i;
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *a_element = &row[j];
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 product =
- libcrux_ml_kem_polynomial_ntt_multiply_89_2a(a_element, &r_as_ntt[j]);
- libcrux_ml_kem_polynomial_add_to_ring_element_89_84(&result[i1],
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *a_element = &row[j];
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d product =
+ libcrux_ml_kem_polynomial_ntt_multiply_d6_ea(a_element, &r_as_ntt[j]);
+ libcrux_ml_kem_polynomial_add_to_ring_element_d6_1b(&result[i1],
&product);
}
- libcrux_ml_kem_invert_ntt_invert_ntt_montgomery_f6(&result[i1]);
- libcrux_ml_kem_polynomial_add_error_reduce_89_38(&result[i1], &error_1[i1]);
+ libcrux_ml_kem_invert_ntt_invert_ntt_montgomery_1b(&result[i1]);
+ libcrux_ml_kem_polynomial_add_error_reduce_d6_ea(&result[i1], &error_1[i1]);
}
memcpy(
ret, result,
- (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
-}
-
-/**
-A monomorphic instance of libcrux_ml_kem.vector.traits.decompress_1
-with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
-with const generics
-
-*/
-static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
-libcrux_ml_kem_vector_traits_decompress_1_63(
- libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
- libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
- libcrux_ml_kem_vector_portable_ZERO_0d();
- return libcrux_ml_kem_vector_portable_bitwise_and_with_constant_0d(
- libcrux_ml_kem_vector_portable_sub_0d(uu____0, &v), (int16_t)1665);
-}
-
-/**
-A monomorphic instance of
-libcrux_ml_kem.serialize.deserialize_then_decompress_message with types
-libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
-
-*/
-static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0
-libcrux_ml_kem_serialize_deserialize_then_decompress_message_0d(
- uint8_t serialized[32U]) {
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re =
- libcrux_ml_kem_polynomial_ZERO_89_ea();
- for (size_t i = (size_t)0U; i < (size_t)16U; i++) {
- size_t i0 = i;
- libcrux_ml_kem_vector_portable_vector_type_PortableVector
- coefficient_compressed =
- libcrux_ml_kem_vector_portable_deserialize_1_0d(
- Eurydice_array_to_subslice2(serialized, (size_t)2U * i0,
- (size_t)2U * i0 + (size_t)2U,
- uint8_t));
- libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
- libcrux_ml_kem_vector_traits_decompress_1_63(coefficient_compressed);
- re.coefficients[i0] = uu____0;
- }
- return re;
-}
-
-/**
-This function found in impl
-{libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0]}
-*/
-/**
-A monomorphic instance of libcrux_ml_kem.polynomial.add_message_error_reduce_89
-with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
-with const generics
-
-*/
-static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0
-libcrux_ml_kem_polynomial_add_message_error_reduce_89_ea(
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *self,
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *message,
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 result) {
- for (size_t i = (size_t)0U;
- i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) {
- size_t i0 = i;
- libcrux_ml_kem_vector_portable_vector_type_PortableVector
- coefficient_normal_form =
- libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_0d(
- result.coefficients[i0], (int16_t)1441);
- libcrux_ml_kem_vector_portable_vector_type_PortableVector tmp =
- libcrux_ml_kem_vector_portable_add_0d(self->coefficients[i0],
- &message->coefficients[i0]);
- libcrux_ml_kem_vector_portable_vector_type_PortableVector tmp0 =
- libcrux_ml_kem_vector_portable_add_0d(coefficient_normal_form, &tmp);
- libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
- libcrux_ml_kem_vector_portable_barrett_reduce_0d(tmp0);
- result.coefficients[i0] = uu____0;
- }
- return result;
-}
-
-/**
- Compute InverseNTT(tᵀ ◦ r̂) + e₂ + message
-*/
-/**
-A monomorphic instance of libcrux_ml_kem.matrix.compute_ring_element_v
-with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
-with const generics
-- K= 3
-*/
-static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0
-libcrux_ml_kem_matrix_compute_ring_element_v_54(
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *t_as_ntt,
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *r_as_ntt,
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *error_2,
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *message) {
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 result =
- libcrux_ml_kem_polynomial_ZERO_89_ea();
- for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
- size_t i0 = i;
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 product =
- libcrux_ml_kem_polynomial_ntt_multiply_89_2a(&t_as_ntt[i0],
- &r_as_ntt[i0]);
- libcrux_ml_kem_polynomial_add_to_ring_element_89_84(&result, &product);
- }
- libcrux_ml_kem_invert_ntt_invert_ntt_montgomery_f6(&result);
- result = libcrux_ml_kem_polynomial_add_message_error_reduce_89_ea(
- error_2, message, result);
- return result;
+ (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d));
}
/**
@@ -10489,32 +9155,33 @@ with const generics
- COEFFICIENT_BITS= 10
*/
static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
-libcrux_ml_kem_vector_portable_compress_compress_02(
- libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
+libcrux_ml_kem_vector_portable_compress_compress_ef(
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector a) {
for (size_t i = (size_t)0U;
i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
size_t i0 = i;
- int16_t uu____0 =
+ int16_t uu____0 = libcrux_secrets_int_as_i16_f5(
libcrux_ml_kem_vector_portable_compress_compress_ciphertext_coefficient(
- (uint8_t)(int32_t)10, (uint16_t)v.elements[i0]);
- v.elements[i0] = uu____0;
+ (uint8_t)(int32_t)10,
+ libcrux_secrets_int_as_u16_f5(a.elements[i0])));
+ a.elements[i0] = uu____0;
}
- return v;
+ return a;
}
/**
-This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
-libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
+This function found in impl {libcrux_ml_kem::vector::traits::Operations for
+libcrux_ml_kem::vector::portable::vector_type::PortableVector}
*/
/**
-A monomorphic instance of libcrux_ml_kem.vector.portable.compress_0d
+A monomorphic instance of libcrux_ml_kem.vector.portable.compress_b8
with const generics
- COEFFICIENT_BITS= 10
*/
static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
-libcrux_ml_kem_vector_portable_compress_0d_28(
- libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
- return libcrux_ml_kem_vector_portable_compress_compress_02(v);
+libcrux_ml_kem_vector_portable_compress_b8_ef(
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector a) {
+ return libcrux_ml_kem_vector_portable_compress_compress_ef(a);
}
/**
@@ -10524,83 +9191,22 @@ with const generics
- OUT_LEN= 320
*/
static KRML_MUSTINLINE void
-libcrux_ml_kem_serialize_compress_then_serialize_10_fc(
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re, uint8_t ret[320U]) {
+libcrux_ml_kem_serialize_compress_then_serialize_10_ff(
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re, uint8_t ret[320U]) {
uint8_t serialized[320U] = {0U};
for (size_t i = (size_t)0U;
i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) {
size_t i0 = i;
libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient =
- libcrux_ml_kem_vector_portable_compress_0d_28(
- libcrux_ml_kem_vector_traits_to_unsigned_representative_db(
+ libcrux_ml_kem_vector_portable_compress_b8_ef(
+ libcrux_ml_kem_serialize_to_unsigned_field_modulus_ea(
re->coefficients[i0]));
uint8_t bytes[20U];
- libcrux_ml_kem_vector_portable_serialize_10_0d(coefficient, bytes);
- Eurydice_slice uu____0 = Eurydice_array_to_subslice2(
- serialized, (size_t)20U * i0, (size_t)20U * i0 + (size_t)20U, uint8_t);
+ libcrux_ml_kem_vector_portable_serialize_10_b8(coefficient, bytes);
Eurydice_slice_copy(
- uu____0, Eurydice_array_to_slice((size_t)20U, bytes, uint8_t), uint8_t);
- }
- memcpy(ret, serialized, (size_t)320U * sizeof(uint8_t));
-}
-
-/**
-A monomorphic instance of libcrux_ml_kem.vector.portable.compress.compress
-with const generics
-- COEFFICIENT_BITS= 11
-*/
-static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
-libcrux_ml_kem_vector_portable_compress_compress_020(
- libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
- for (size_t i = (size_t)0U;
- i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
- size_t i0 = i;
- int16_t uu____0 =
- libcrux_ml_kem_vector_portable_compress_compress_ciphertext_coefficient(
- (uint8_t)(int32_t)11, (uint16_t)v.elements[i0]);
- v.elements[i0] = uu____0;
- }
- return v;
-}
-
-/**
-This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
-libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
-*/
-/**
-A monomorphic instance of libcrux_ml_kem.vector.portable.compress_0d
-with const generics
-- COEFFICIENT_BITS= 11
-*/
-static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
-libcrux_ml_kem_vector_portable_compress_0d_280(
- libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
- return libcrux_ml_kem_vector_portable_compress_compress_020(v);
-}
-
-/**
-A monomorphic instance of libcrux_ml_kem.serialize.compress_then_serialize_11
-with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
-with const generics
-- OUT_LEN= 320
-*/
-static KRML_MUSTINLINE void
-libcrux_ml_kem_serialize_compress_then_serialize_11_e1(
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re, uint8_t ret[320U]) {
- uint8_t serialized[320U] = {0U};
- for (size_t i = (size_t)0U;
- i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) {
- size_t i0 = i;
- libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient =
- libcrux_ml_kem_vector_portable_compress_0d_280(
- libcrux_ml_kem_vector_traits_to_unsigned_representative_db(
- re->coefficients[i0]));
- uint8_t bytes[22U];
- libcrux_ml_kem_vector_portable_serialize_11_0d(coefficient, bytes);
- Eurydice_slice uu____0 = Eurydice_array_to_subslice2(
- serialized, (size_t)22U * i0, (size_t)22U * i0 + (size_t)22U, uint8_t);
- Eurydice_slice_copy(
- uu____0, Eurydice_array_to_slice((size_t)22U, bytes, uint8_t), uint8_t);
+ Eurydice_array_to_subslice3(serialized, (size_t)20U * i0,
+ (size_t)20U * i0 + (size_t)20U, uint8_t *),
+ Eurydice_array_to_slice((size_t)20U, bytes, uint8_t), uint8_t);
}
memcpy(ret, serialized, (size_t)320U * sizeof(uint8_t));
}
@@ -10613,10 +9219,10 @@ libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
- OUT_LEN= 320
*/
static KRML_MUSTINLINE void
-libcrux_ml_kem_serialize_compress_then_serialize_ring_element_u_5f(
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re, uint8_t ret[320U]) {
+libcrux_ml_kem_serialize_compress_then_serialize_ring_element_u_fe(
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re, uint8_t ret[320U]) {
uint8_t uu____0[320U];
- libcrux_ml_kem_serialize_compress_then_serialize_10_fc(re, uu____0);
+ libcrux_ml_kem_serialize_compress_then_serialize_10_ff(re, uu____0);
memcpy(ret, uu____0, (size_t)320U * sizeof(uint8_t));
}
@@ -10632,23 +9238,23 @@ with const generics
- COMPRESSION_FACTOR= 10
- BLOCK_LEN= 320
*/
-static inline void libcrux_ml_kem_ind_cpa_compress_then_serialize_u_a7(
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 input[3U],
+static KRML_MUSTINLINE void libcrux_ml_kem_ind_cpa_compress_then_serialize_u_43(
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d input[3U],
Eurydice_slice out) {
for (size_t i = (size_t)0U;
i < Eurydice_slice_len(
Eurydice_array_to_slice(
(size_t)3U, input,
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0),
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0);
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d),
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d);
i++) {
size_t i0 = i;
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re = input[i0];
- Eurydice_slice uu____0 = Eurydice_slice_subslice2(
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d re = input[i0];
+ Eurydice_slice uu____0 = Eurydice_slice_subslice3(
out, i0 * ((size_t)960U / (size_t)3U),
- (i0 + (size_t)1U) * ((size_t)960U / (size_t)3U), uint8_t);
+ (i0 + (size_t)1U) * ((size_t)960U / (size_t)3U), uint8_t *);
uint8_t ret[320U];
- libcrux_ml_kem_serialize_compress_then_serialize_ring_element_u_5f(&re,
+ libcrux_ml_kem_serialize_compress_then_serialize_ring_element_u_fe(&re,
ret);
Eurydice_slice_copy(
uu____0, Eurydice_array_to_slice((size_t)320U, ret, uint8_t), uint8_t);
@@ -10656,122 +9262,232 @@ static inline void libcrux_ml_kem_ind_cpa_compress_then_serialize_u_a7(
}
/**
-A monomorphic instance of libcrux_ml_kem.vector.portable.compress.compress
+A monomorphic instance of libcrux_ml_kem.ind_cpa.encrypt_c1
+with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
+libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const
+generics
+- K= 3
+- C1_LEN= 960
+- U_COMPRESSION_FACTOR= 10
+- BLOCK_LEN= 320
+- ETA1= 2
+- ETA1_RANDOMNESS_SIZE= 128
+- ETA2= 2
+- ETA2_RANDOMNESS_SIZE= 128
+*/
+static KRML_MUSTINLINE tuple_ed libcrux_ml_kem_ind_cpa_encrypt_c1_85(
+ Eurydice_slice randomness,
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d (*matrix)[3U],
+ Eurydice_slice ciphertext) {
+ uint8_t prf_input[33U];
+ libcrux_ml_kem_utils_into_padded_array_c8(randomness, prf_input);
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d r_as_ntt[3U];
+ for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
+ /* original Rust expression is not an lvalue in C */
+ void *lvalue = (void *)0U;
+ r_as_ntt[i] = libcrux_ml_kem_ind_cpa_encrypt_c1_call_mut_f1_85(&lvalue, i);
+ }
+ uint8_t domain_separator0 =
+ libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_3b(r_as_ntt, prf_input,
+ 0U);
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d error_1[3U];
+ for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
+ /* original Rust expression is not an lvalue in C */
+ void *lvalue = (void *)0U;
+ error_1[i] = libcrux_ml_kem_ind_cpa_encrypt_c1_call_mut_dd_85(&lvalue, i);
+ }
+ uint8_t domain_separator = libcrux_ml_kem_ind_cpa_sample_ring_element_cbd_3b(
+ prf_input, domain_separator0, error_1);
+ prf_input[32U] = domain_separator;
+ uint8_t prf_output[128U];
+ libcrux_ml_kem_hash_functions_portable_PRF_4a_410(
+ Eurydice_array_to_slice((size_t)33U, prf_input, uint8_t), prf_output);
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d error_2 =
+ libcrux_ml_kem_sampling_sample_from_binomial_distribution_a0(
+ Eurydice_array_to_slice((size_t)128U, prf_output, uint8_t));
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d u[3U];
+ libcrux_ml_kem_matrix_compute_vector_u_1b(matrix, r_as_ntt, error_1, u);
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d uu____0[3U];
+ memcpy(
+ uu____0, u,
+ (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d));
+ libcrux_ml_kem_ind_cpa_compress_then_serialize_u_43(uu____0, ciphertext);
+ /* Passing arrays by value in Rust generates a copy in C */
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d copy_of_r_as_ntt[3U];
+ memcpy(
+ copy_of_r_as_ntt, r_as_ntt,
+ (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d));
+ tuple_ed lit;
+ memcpy(
+ lit.fst, copy_of_r_as_ntt,
+ (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d));
+ lit.snd = error_2;
+ return lit;
+}
+
+/**
+A monomorphic instance of
+libcrux_ml_kem.serialize.deserialize_then_decompress_message with types
+libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
+
+*/
+static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d
+libcrux_ml_kem_serialize_deserialize_then_decompress_message_ea(
+ uint8_t *serialized) {
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d re =
+ libcrux_ml_kem_polynomial_ZERO_d6_ea();
+ for (size_t i = (size_t)0U; i < (size_t)16U; i++) {
+ size_t i0 = i;
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector
+ coefficient_compressed =
+ libcrux_ml_kem_vector_portable_deserialize_1_b8(
+ Eurydice_array_to_subslice3(serialized, (size_t)2U * i0,
+ (size_t)2U * i0 + (size_t)2U,
+ uint8_t *));
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
+ libcrux_ml_kem_vector_portable_decompress_1_b8(coefficient_compressed);
+ re.coefficients[i0] = uu____0;
+ }
+ return re;
+}
+
+/**
+A monomorphic instance of libcrux_ml_kem.polynomial.add_message_error_reduce
+with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
with const generics
-- COEFFICIENT_BITS= 4
+
*/
-static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
-libcrux_ml_kem_vector_portable_compress_compress_021(
- libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
+static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d
+libcrux_ml_kem_polynomial_add_message_error_reduce_ea(
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *myself,
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *message,
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d result) {
for (size_t i = (size_t)0U;
- i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
+ i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) {
size_t i0 = i;
- int16_t uu____0 =
- libcrux_ml_kem_vector_portable_compress_compress_ciphertext_coefficient(
- (uint8_t)(int32_t)4, (uint16_t)v.elements[i0]);
- v.elements[i0] = uu____0;
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector
+ coefficient_normal_form =
+ libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_b8(
+ result.coefficients[i0], (int16_t)1441);
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector sum1 =
+ libcrux_ml_kem_vector_portable_add_b8(myself->coefficients[i0],
+ &message->coefficients[i0]);
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector sum2 =
+ libcrux_ml_kem_vector_portable_add_b8(coefficient_normal_form, &sum1);
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector red =
+ libcrux_ml_kem_vector_portable_barrett_reduce_b8(sum2);
+ result.coefficients[i0] = red;
}
- return v;
+ return result;
}
/**
-This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
-libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
+This function found in impl
+{libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0,
+TraitClause@1]}
*/
/**
-A monomorphic instance of libcrux_ml_kem.vector.portable.compress_0d
+A monomorphic instance of libcrux_ml_kem.polynomial.add_message_error_reduce_d6
+with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
with const generics
-- COEFFICIENT_BITS= 4
+
*/
-static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
-libcrux_ml_kem_vector_portable_compress_0d_281(
- libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
- return libcrux_ml_kem_vector_portable_compress_compress_021(v);
+static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d
+libcrux_ml_kem_polynomial_add_message_error_reduce_d6_ea(
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *self,
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *message,
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d result) {
+ return libcrux_ml_kem_polynomial_add_message_error_reduce_ea(self, message,
+ result);
}
/**
-A monomorphic instance of libcrux_ml_kem.serialize.compress_then_serialize_4
+ Compute InverseNTT(tᵀ ◦ r̂) + e₂ + message
+*/
+/**
+A monomorphic instance of libcrux_ml_kem.matrix.compute_ring_element_v
with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
with const generics
-
+- K= 3
*/
-static KRML_MUSTINLINE void
-libcrux_ml_kem_serialize_compress_then_serialize_4_9a(
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re,
- Eurydice_slice serialized) {
- for (size_t i = (size_t)0U;
- i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) {
+static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d
+libcrux_ml_kem_matrix_compute_ring_element_v_1b(
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *t_as_ntt,
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *r_as_ntt,
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *error_2,
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *message) {
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d result =
+ libcrux_ml_kem_polynomial_ZERO_d6_ea();
+ for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
size_t i0 = i;
- libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient =
- libcrux_ml_kem_vector_portable_compress_0d_281(
- libcrux_ml_kem_vector_traits_to_unsigned_representative_db(
- re.coefficients[i0]));
- uint8_t bytes[8U];
- libcrux_ml_kem_vector_portable_serialize_4_0d(coefficient, bytes);
- Eurydice_slice_copy(
- Eurydice_slice_subslice2(serialized, (size_t)8U * i0,
- (size_t)8U * i0 + (size_t)8U, uint8_t),
- Eurydice_array_to_slice((size_t)8U, bytes, uint8_t), uint8_t);
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d product =
+ libcrux_ml_kem_polynomial_ntt_multiply_d6_ea(&t_as_ntt[i0],
+ &r_as_ntt[i0]);
+ libcrux_ml_kem_polynomial_add_to_ring_element_d6_1b(&result, &product);
}
+ libcrux_ml_kem_invert_ntt_invert_ntt_montgomery_1b(&result);
+ return libcrux_ml_kem_polynomial_add_message_error_reduce_d6_ea(
+ error_2, message, result);
}
/**
A monomorphic instance of libcrux_ml_kem.vector.portable.compress.compress
with const generics
-- COEFFICIENT_BITS= 5
+- COEFFICIENT_BITS= 4
*/
static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
-libcrux_ml_kem_vector_portable_compress_compress_022(
- libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
+libcrux_ml_kem_vector_portable_compress_compress_d1(
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector a) {
for (size_t i = (size_t)0U;
i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
size_t i0 = i;
- int16_t uu____0 =
+ int16_t uu____0 = libcrux_secrets_int_as_i16_f5(
libcrux_ml_kem_vector_portable_compress_compress_ciphertext_coefficient(
- (uint8_t)(int32_t)5, (uint16_t)v.elements[i0]);
- v.elements[i0] = uu____0;
+ (uint8_t)(int32_t)4,
+ libcrux_secrets_int_as_u16_f5(a.elements[i0])));
+ a.elements[i0] = uu____0;
}
- return v;
+ return a;
}
/**
-This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
-libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
+This function found in impl {libcrux_ml_kem::vector::traits::Operations for
+libcrux_ml_kem::vector::portable::vector_type::PortableVector}
*/
/**
-A monomorphic instance of libcrux_ml_kem.vector.portable.compress_0d
+A monomorphic instance of libcrux_ml_kem.vector.portable.compress_b8
with const generics
-- COEFFICIENT_BITS= 5
+- COEFFICIENT_BITS= 4
*/
static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
-libcrux_ml_kem_vector_portable_compress_0d_282(
- libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
- return libcrux_ml_kem_vector_portable_compress_compress_022(v);
+libcrux_ml_kem_vector_portable_compress_b8_d1(
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector a) {
+ return libcrux_ml_kem_vector_portable_compress_compress_d1(a);
}
/**
-A monomorphic instance of libcrux_ml_kem.serialize.compress_then_serialize_5
+A monomorphic instance of libcrux_ml_kem.serialize.compress_then_serialize_4
with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
with const generics
*/
static KRML_MUSTINLINE void
-libcrux_ml_kem_serialize_compress_then_serialize_5_1f(
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re,
+libcrux_ml_kem_serialize_compress_then_serialize_4_ea(
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d re,
Eurydice_slice serialized) {
for (size_t i = (size_t)0U;
i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) {
size_t i0 = i;
- libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficients =
- libcrux_ml_kem_vector_portable_compress_0d_282(
- libcrux_ml_kem_vector_traits_to_unsigned_representative_db(
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient =
+ libcrux_ml_kem_vector_portable_compress_b8_d1(
+ libcrux_ml_kem_serialize_to_unsigned_field_modulus_ea(
re.coefficients[i0]));
- uint8_t bytes[10U];
- libcrux_ml_kem_vector_portable_serialize_5_0d(coefficients, bytes);
+ uint8_t bytes[8U];
+ libcrux_ml_kem_vector_portable_serialize_4_b8(coefficient, bytes);
Eurydice_slice_copy(
- Eurydice_slice_subslice2(serialized, (size_t)10U * i0,
- (size_t)10U * i0 + (size_t)10U, uint8_t),
- Eurydice_array_to_slice((size_t)10U, bytes, uint8_t), uint8_t);
+ Eurydice_slice_subslice3(serialized, (size_t)8U * i0,
+ (size_t)8U * i0 + (size_t)8U, uint8_t *),
+ Eurydice_array_to_slice((size_t)8U, bytes, uint8_t), uint8_t);
}
}
@@ -10779,17 +9495,81 @@ libcrux_ml_kem_serialize_compress_then_serialize_5_1f(
A monomorphic instance of
libcrux_ml_kem.serialize.compress_then_serialize_ring_element_v with types
libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
+- K= 3
- COMPRESSION_FACTOR= 4
- OUT_LEN= 128
*/
static KRML_MUSTINLINE void
-libcrux_ml_kem_serialize_compress_then_serialize_ring_element_v_4e(
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re, Eurydice_slice out) {
- libcrux_ml_kem_serialize_compress_then_serialize_4_9a(re, out);
+libcrux_ml_kem_serialize_compress_then_serialize_ring_element_v_6c(
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d re, Eurydice_slice out) {
+ libcrux_ml_kem_serialize_compress_then_serialize_4_ea(re, out);
}
/**
-A monomorphic instance of libcrux_ml_kem.ind_cpa.encrypt
+A monomorphic instance of libcrux_ml_kem.ind_cpa.encrypt_c2
+with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
+with const generics
+- K= 3
+- V_COMPRESSION_FACTOR= 4
+- C2_LEN= 128
+*/
+static KRML_MUSTINLINE void libcrux_ml_kem_ind_cpa_encrypt_c2_6c(
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *t_as_ntt,
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *r_as_ntt,
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *error_2,
+ uint8_t *message, Eurydice_slice ciphertext) {
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d message_as_ring_element =
+ libcrux_ml_kem_serialize_deserialize_then_decompress_message_ea(message);
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d v =
+ libcrux_ml_kem_matrix_compute_ring_element_v_1b(
+ t_as_ntt, r_as_ntt, error_2, &message_as_ring_element);
+ libcrux_ml_kem_serialize_compress_then_serialize_ring_element_v_6c(
+ v, ciphertext);
+}
+
+/**
+ This function implements <strong>Algorithm 13</strong> of the
+ NIST FIPS 203 specification; this is the Kyber CPA-PKE encryption algorithm.
+
+ Algorithm 13 is reproduced below:
+
+ ```plaintext
+ Input: encryption key ekₚₖₑ ∈ 𝔹^{384k+32}.
+ Input: message m ∈ 𝔹^{32}.
+ Input: encryption randomness r ∈ 𝔹^{32}.
+ Output: ciphertext c ∈ 𝔹^{32(dᵤk + dᵥ)}.
+
+ N ← 0
+ t̂ ← ByteDecode₁₂(ekₚₖₑ[0:384k])
+ ρ ← ekₚₖₑ[384k: 384k + 32]
+ for (i ← 0; i < k; i++)
+ for(j ← 0; j < k; j++)
+ Â[i,j] ← SampleNTT(XOF(ρ, i, j))
+ end for
+ end for
+ for(i ← 0; i < k; i++)
+ r[i] ← SamplePolyCBD_{η₁}(PRF_{η₁}(r,N))
+ N ← N + 1
+ end for
+ for(i ← 0; i < k; i++)
+ e₁[i] ← SamplePolyCBD_{η₂}(PRF_{η₂}(r,N))
+ N ← N + 1
+ end for
+ e₂ ← SamplePolyCBD_{η₂}(PRF_{η₂}(r,N))
+ r̂ ← NTT(r)
+ u ← NTT-¹(Âᵀ ◦ r̂) + e₁
+ μ ← Decompress₁(ByteDecode₁(m)))
+ v ← NTT-¹(t̂ᵀ ◦ rˆ) + e₂ + μ
+ c₁ ← ByteEncode_{dᵤ}(Compress_{dᵤ}(u))
+ c₂ ← ByteEncode_{dᵥ}(Compress_{dᵥ}(v))
+ return c ← (c₁ ‖ c₂)
+ ```
+
+ The NIST FIPS 203 standard can be found at
+ <https://csrc.nist.gov/pubs/fips/203/ipd>.
+*/
+/**
+A monomorphic instance of libcrux_ml_kem.ind_cpa.encrypt_unpacked
with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const
generics
@@ -10806,89 +9586,74 @@ generics
- ETA2= 2
- ETA2_RANDOMNESS_SIZE= 128
*/
-static inline void libcrux_ml_kem_ind_cpa_encrypt_60(Eurydice_slice public_key,
- uint8_t message[32U],
- Eurydice_slice randomness,
- uint8_t ret[1088U]) {
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 t_as_ntt[3U];
- libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_33(
- Eurydice_slice_subslice_to(public_key, (size_t)1152U, uint8_t, size_t),
- t_as_ntt);
- Eurydice_slice seed =
- Eurydice_slice_subslice_from(public_key, (size_t)1152U, uint8_t, size_t);
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 A[3U][3U];
- uint8_t ret0[34U];
- libcrux_ml_kem_utils_into_padded_array_ea1(seed, ret0);
- libcrux_ml_kem_matrix_sample_matrix_A_38(ret0, false, A);
- uint8_t prf_input[33U];
- libcrux_ml_kem_utils_into_padded_array_ea2(randomness, prf_input);
- /* Passing arrays by value in Rust generates a copy in C */
- uint8_t copy_of_prf_input0[33U];
- memcpy(copy_of_prf_input0, prf_input, (size_t)33U * sizeof(uint8_t));
- tuple_b0 uu____1 = libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_fc(
- copy_of_prf_input0, 0U);
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 r_as_ntt[3U];
- memcpy(
- r_as_ntt, uu____1.fst,
- (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
- uint8_t domain_separator0 = uu____1.snd;
- /* Passing arrays by value in Rust generates a copy in C */
- uint8_t copy_of_prf_input[33U];
- memcpy(copy_of_prf_input, prf_input, (size_t)33U * sizeof(uint8_t));
- tuple_b0 uu____3 = libcrux_ml_kem_ind_cpa_sample_ring_element_cbd_ac(
- copy_of_prf_input, domain_separator0);
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 error_1[3U];
- memcpy(
- error_1, uu____3.fst,
- (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
- uint8_t domain_separator = uu____3.snd;
- prf_input[32U] = domain_separator;
- uint8_t prf_output[128U];
- libcrux_ml_kem_hash_functions_portable_PRF_f1_ee0(
- Eurydice_array_to_slice((size_t)33U, prf_input, uint8_t), prf_output);
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 error_2 =
- libcrux_ml_kem_sampling_sample_from_binomial_distribution_c6(
- Eurydice_array_to_slice((size_t)128U, prf_output, uint8_t));
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 u[3U];
- libcrux_ml_kem_matrix_compute_vector_u_59(A, r_as_ntt, error_1, u);
- /* Passing arrays by value in Rust generates a copy in C */
- uint8_t copy_of_message[32U];
- memcpy(copy_of_message, message, (size_t)32U * sizeof(uint8_t));
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 message_as_ring_element =
- libcrux_ml_kem_serialize_deserialize_then_decompress_message_0d(
- copy_of_message);
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 v =
- libcrux_ml_kem_matrix_compute_ring_element_v_54(
- t_as_ntt, r_as_ntt, &error_2, &message_as_ring_element);
+static KRML_MUSTINLINE void libcrux_ml_kem_ind_cpa_encrypt_unpacked_2a(
+ libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0 *public_key,
+ uint8_t *message, Eurydice_slice randomness, uint8_t ret[1088U]) {
uint8_t ciphertext[1088U] = {0U};
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 uu____5[3U];
+ tuple_ed uu____0 = libcrux_ml_kem_ind_cpa_encrypt_c1_85(
+ randomness, public_key->A,
+ Eurydice_array_to_subslice3(ciphertext, (size_t)0U, (size_t)960U,
+ uint8_t *));
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d r_as_ntt[3U];
memcpy(
- uu____5, u,
- (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
- libcrux_ml_kem_ind_cpa_compress_then_serialize_u_a7(
- uu____5, Eurydice_array_to_subslice2(ciphertext, (size_t)0U, (size_t)960U,
- uint8_t));
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 uu____6 = v;
- libcrux_ml_kem_serialize_compress_then_serialize_ring_element_v_4e(
- uu____6, Eurydice_array_to_subslice_from((size_t)1088U, ciphertext,
- (size_t)960U, uint8_t, size_t));
+ r_as_ntt, uu____0.fst,
+ (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d));
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d error_2 = uu____0.snd;
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *uu____1 =
+ public_key->t_as_ntt;
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *uu____2 = r_as_ntt;
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *uu____3 = &error_2;
+ uint8_t *uu____4 = message;
+ libcrux_ml_kem_ind_cpa_encrypt_c2_6c(
+ uu____1, uu____2, uu____3, uu____4,
+ Eurydice_array_to_subslice_from((size_t)1088U, ciphertext, (size_t)960U,
+ uint8_t, size_t, uint8_t[]));
memcpy(ret, ciphertext, (size_t)1088U * sizeof(uint8_t));
}
/**
-This function found in impl {(libcrux_ml_kem::variant::Variant for
-libcrux_ml_kem::variant::MlKem)#1}
+A monomorphic instance of libcrux_ml_kem.ind_cpa.encrypt
+with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
+libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const
+generics
+- K= 3
+- CIPHERTEXT_SIZE= 1088
+- T_AS_NTT_ENCODED_SIZE= 1152
+- C1_LEN= 960
+- C2_LEN= 128
+- U_COMPRESSION_FACTOR= 10
+- V_COMPRESSION_FACTOR= 4
+- BLOCK_LEN= 320
+- ETA1= 2
+- ETA1_RANDOMNESS_SIZE= 128
+- ETA2= 2
+- ETA2_RANDOMNESS_SIZE= 128
+*/
+static KRML_MUSTINLINE void libcrux_ml_kem_ind_cpa_encrypt_2a(
+ Eurydice_slice public_key, uint8_t *message, Eurydice_slice randomness,
+ uint8_t ret[1088U]) {
+ libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0
+ unpacked_public_key =
+ libcrux_ml_kem_ind_cpa_build_unpacked_public_key_3f(public_key);
+ uint8_t ret0[1088U];
+ libcrux_ml_kem_ind_cpa_encrypt_unpacked_2a(&unpacked_public_key, message,
+ randomness, ret0);
+ memcpy(ret, ret0, (size_t)1088U * sizeof(uint8_t));
+}
+
+/**
+This function found in impl {libcrux_ml_kem::variant::Variant for
+libcrux_ml_kem::variant::MlKem}
*/
/**
-A monomorphic instance of libcrux_ml_kem.variant.kdf_d8
+A monomorphic instance of libcrux_ml_kem.variant.kdf_39
with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]]
with const generics
- K= 3
- CIPHERTEXT_SIZE= 1088
*/
-static KRML_MUSTINLINE void libcrux_ml_kem_variant_kdf_d8_41(
- Eurydice_slice shared_secret, libcrux_ml_kem_mlkem768_MlKem768Ciphertext *_,
- uint8_t ret[32U]) {
+static KRML_MUSTINLINE void libcrux_ml_kem_variant_kdf_39_d6(
+ Eurydice_slice shared_secret, uint8_t *_, uint8_t ret[32U]) {
uint8_t out[32U] = {0U};
Eurydice_slice_copy(Eurydice_array_to_slice((size_t)32U, out, uint8_t),
shared_secret, uint8_t);
@@ -10896,6 +9661,9 @@ static KRML_MUSTINLINE void libcrux_ml_kem_variant_kdf_d8_41(
}
/**
+ This code verifies on some machines, runs out of memory on others
+*/
+/**
A monomorphic instance of libcrux_ml_kem.ind_cca.decapsulate
with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]],
@@ -10917,71 +9685,63 @@ libcrux_ml_kem_variant_MlKem with const generics
- ETA2_RANDOMNESS_SIZE= 128
- IMPLICIT_REJECTION_HASH_INPUT_SIZE= 1120
*/
-static inline void libcrux_ml_kem_ind_cca_decapsulate_70(
- libcrux_ml_kem_types_MlKemPrivateKey_55 *private_key,
+static KRML_MUSTINLINE void libcrux_ml_kem_ind_cca_decapsulate_62(
+ libcrux_ml_kem_types_MlKemPrivateKey_d9 *private_key,
libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext, uint8_t ret[32U]) {
- Eurydice_slice_uint8_t_x2 uu____0 = Eurydice_slice_split_at(
- Eurydice_array_to_slice((size_t)2400U, private_key->value, uint8_t),
- (size_t)1152U, uint8_t, Eurydice_slice_uint8_t_x2);
+ Eurydice_slice_uint8_t_x4 uu____0 =
+ libcrux_ml_kem_types_unpack_private_key_b4(
+ Eurydice_array_to_slice((size_t)2400U, private_key->value, uint8_t));
Eurydice_slice ind_cpa_secret_key = uu____0.fst;
- Eurydice_slice secret_key0 = uu____0.snd;
- Eurydice_slice_uint8_t_x2 uu____1 = Eurydice_slice_split_at(
- secret_key0, (size_t)1184U, uint8_t, Eurydice_slice_uint8_t_x2);
- Eurydice_slice ind_cpa_public_key = uu____1.fst;
- Eurydice_slice secret_key = uu____1.snd;
- Eurydice_slice_uint8_t_x2 uu____2 = Eurydice_slice_split_at(
- secret_key, LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE, uint8_t,
- Eurydice_slice_uint8_t_x2);
- Eurydice_slice ind_cpa_public_key_hash = uu____2.fst;
- Eurydice_slice implicit_rejection_value = uu____2.snd;
+ Eurydice_slice ind_cpa_public_key = uu____0.snd;
+ Eurydice_slice ind_cpa_public_key_hash = uu____0.thd;
+ Eurydice_slice implicit_rejection_value = uu____0.f3;
uint8_t decrypted[32U];
- libcrux_ml_kem_ind_cpa_decrypt_43(ind_cpa_secret_key, ciphertext->value,
+ libcrux_ml_kem_ind_cpa_decrypt_42(ind_cpa_secret_key, ciphertext->value,
decrypted);
uint8_t to_hash0[64U];
- libcrux_ml_kem_utils_into_padded_array_ea(
+ libcrux_ml_kem_utils_into_padded_array_24(
Eurydice_array_to_slice((size_t)32U, decrypted, uint8_t), to_hash0);
Eurydice_slice_copy(
Eurydice_array_to_subslice_from(
(size_t)64U, to_hash0, LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE,
- uint8_t, size_t),
+ uint8_t, size_t, uint8_t[]),
ind_cpa_public_key_hash, uint8_t);
uint8_t hashed[64U];
- libcrux_ml_kem_hash_functions_portable_G_f1_e4(
+ libcrux_ml_kem_hash_functions_portable_G_4a_e0(
Eurydice_array_to_slice((size_t)64U, to_hash0, uint8_t), hashed);
- Eurydice_slice_uint8_t_x2 uu____3 = Eurydice_slice_split_at(
+ Eurydice_slice_uint8_t_x2 uu____1 = Eurydice_slice_split_at(
Eurydice_array_to_slice((size_t)64U, hashed, uint8_t),
LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE, uint8_t,
Eurydice_slice_uint8_t_x2);
- Eurydice_slice shared_secret0 = uu____3.fst;
- Eurydice_slice pseudorandomness = uu____3.snd;
+ Eurydice_slice shared_secret0 = uu____1.fst;
+ Eurydice_slice pseudorandomness = uu____1.snd;
uint8_t to_hash[1120U];
- libcrux_ml_kem_utils_into_padded_array_ea0(implicit_rejection_value, to_hash);
- Eurydice_slice uu____4 = Eurydice_array_to_subslice_from(
+ libcrux_ml_kem_utils_into_padded_array_15(implicit_rejection_value, to_hash);
+ Eurydice_slice uu____2 = Eurydice_array_to_subslice_from(
(size_t)1120U, to_hash, LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE,
- uint8_t, size_t);
- Eurydice_slice_copy(uu____4, libcrux_ml_kem_types_as_ref_00_24(ciphertext),
+ uint8_t, size_t, uint8_t[]);
+ Eurydice_slice_copy(uu____2, libcrux_ml_kem_types_as_ref_d3_80(ciphertext),
uint8_t);
uint8_t implicit_rejection_shared_secret0[32U];
- libcrux_ml_kem_hash_functions_portable_PRF_f1_ee(
+ libcrux_ml_kem_hash_functions_portable_PRF_4a_41(
Eurydice_array_to_slice((size_t)1120U, to_hash, uint8_t),
implicit_rejection_shared_secret0);
- Eurydice_slice uu____5 = ind_cpa_public_key;
- /* Passing arrays by value in Rust generates a copy in C */
- uint8_t copy_of_decrypted[32U];
- memcpy(copy_of_decrypted, decrypted, (size_t)32U * sizeof(uint8_t));
uint8_t expected_ciphertext[1088U];
- libcrux_ml_kem_ind_cpa_encrypt_60(uu____5, copy_of_decrypted,
+ libcrux_ml_kem_ind_cpa_encrypt_2a(ind_cpa_public_key, decrypted,
pseudorandomness, expected_ciphertext);
uint8_t implicit_rejection_shared_secret[32U];
- libcrux_ml_kem_variant_kdf_d8_41(
+ libcrux_ml_kem_variant_kdf_39_d6(
Eurydice_array_to_slice((size_t)32U, implicit_rejection_shared_secret0,
uint8_t),
- ciphertext, implicit_rejection_shared_secret);
+ libcrux_ml_kem_types_as_slice_a9_80(ciphertext),
+ implicit_rejection_shared_secret);
uint8_t shared_secret[32U];
- libcrux_ml_kem_variant_kdf_d8_41(shared_secret0, ciphertext, shared_secret);
+ libcrux_ml_kem_variant_kdf_39_d6(
+ shared_secret0, libcrux_ml_kem_types_as_slice_a9_80(ciphertext),
+ shared_secret);
uint8_t ret0[32U];
libcrux_ml_kem_constant_time_ops_compare_ciphertexts_select_shared_secret_in_constant_time(
- libcrux_ml_kem_types_as_ref_00_24(ciphertext),
+ libcrux_ml_kem_types_as_ref_d3_80(ciphertext),
Eurydice_array_to_slice((size_t)1088U, expected_ciphertext, uint8_t),
Eurydice_array_to_slice((size_t)32U, shared_secret, uint8_t),
Eurydice_array_to_slice((size_t)32U, implicit_rejection_shared_secret,
@@ -11014,10 +9774,10 @@ libcrux_ml_kem.ind_cca.instantiations.portable.decapsulate with const generics
- IMPLICIT_REJECTION_HASH_INPUT_SIZE= 1120
*/
static inline void
-libcrux_ml_kem_ind_cca_instantiations_portable_decapsulate_2e(
- libcrux_ml_kem_types_MlKemPrivateKey_55 *private_key,
+libcrux_ml_kem_ind_cca_instantiations_portable_decapsulate_35(
+ libcrux_ml_kem_types_MlKemPrivateKey_d9 *private_key,
libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext, uint8_t ret[32U]) {
- libcrux_ml_kem_ind_cca_decapsulate_70(private_key, ciphertext, ret);
+ libcrux_ml_kem_ind_cca_decapsulate_62(private_key, ciphertext, ret);
}
/**
@@ -11028,23 +9788,23 @@ libcrux_ml_kem_ind_cca_instantiations_portable_decapsulate_2e(
[`MlKem768Ciphertext`].
*/
static inline void libcrux_ml_kem_mlkem768_portable_decapsulate(
- libcrux_ml_kem_types_MlKemPrivateKey_55 *private_key,
+ libcrux_ml_kem_types_MlKemPrivateKey_d9 *private_key,
libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext, uint8_t ret[32U]) {
- libcrux_ml_kem_ind_cca_instantiations_portable_decapsulate_2e(
+ libcrux_ml_kem_ind_cca_instantiations_portable_decapsulate_35(
private_key, ciphertext, ret);
}
/**
-This function found in impl {(libcrux_ml_kem::variant::Variant for
-libcrux_ml_kem::variant::MlKem)#1}
+This function found in impl {libcrux_ml_kem::variant::Variant for
+libcrux_ml_kem::variant::MlKem}
*/
/**
-A monomorphic instance of libcrux_ml_kem.variant.entropy_preprocess_d8
+A monomorphic instance of libcrux_ml_kem.variant.entropy_preprocess_39
with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]]
with const generics
- K= 3
*/
-static KRML_MUSTINLINE void libcrux_ml_kem_variant_entropy_preprocess_d8_63(
+static KRML_MUSTINLINE void libcrux_ml_kem_variant_entropy_preprocess_39_9c(
Eurydice_slice randomness, uint8_t ret[32U]) {
uint8_t out[32U] = {0U};
Eurydice_slice_copy(Eurydice_array_to_slice((size_t)32U, out, uint8_t),
@@ -11053,15 +9813,15 @@ static KRML_MUSTINLINE void libcrux_ml_kem_variant_entropy_preprocess_d8_63(
}
/**
-This function found in impl {(libcrux_ml_kem::hash_functions::Hash<K> for
-libcrux_ml_kem::hash_functions::portable::PortableHash<K>)}
+This function found in impl {libcrux_ml_kem::hash_functions::Hash<K> for
+libcrux_ml_kem::hash_functions::portable::PortableHash<K>}
*/
/**
-A monomorphic instance of libcrux_ml_kem.hash_functions.portable.H_f1
+A monomorphic instance of libcrux_ml_kem.hash_functions.portable.H_4a
with const generics
- K= 3
*/
-static KRML_MUSTINLINE void libcrux_ml_kem_hash_functions_portable_H_f1_1a(
+static inline void libcrux_ml_kem_hash_functions_portable_H_4a_e0(
Eurydice_slice input, uint8_t ret[32U]) {
libcrux_ml_kem_hash_functions_portable_H(input, ret);
}
@@ -11079,34 +9839,33 @@ libcrux_ml_kem_variant_MlKem with const generics
- C2_SIZE= 128
- VECTOR_U_COMPRESSION_FACTOR= 10
- VECTOR_V_COMPRESSION_FACTOR= 4
-- VECTOR_U_BLOCK_LEN= 320
+- C1_BLOCK_SIZE= 320
- ETA1= 2
- ETA1_RANDOMNESS_SIZE= 128
- ETA2= 2
- ETA2_RANDOMNESS_SIZE= 128
*/
-static inline tuple_3c libcrux_ml_kem_ind_cca_encapsulate_cd(
- libcrux_ml_kem_types_MlKemPublicKey_15 *public_key,
- uint8_t randomness[32U]) {
+static KRML_MUSTINLINE tuple_c2 libcrux_ml_kem_ind_cca_encapsulate_ca(
+ libcrux_ml_kem_types_MlKemPublicKey_30 *public_key, uint8_t *randomness) {
uint8_t randomness0[32U];
- libcrux_ml_kem_variant_entropy_preprocess_d8_63(
+ libcrux_ml_kem_variant_entropy_preprocess_39_9c(
Eurydice_array_to_slice((size_t)32U, randomness, uint8_t), randomness0);
uint8_t to_hash[64U];
- libcrux_ml_kem_utils_into_padded_array_ea(
+ libcrux_ml_kem_utils_into_padded_array_24(
Eurydice_array_to_slice((size_t)32U, randomness0, uint8_t), to_hash);
Eurydice_slice uu____0 = Eurydice_array_to_subslice_from(
(size_t)64U, to_hash, LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE, uint8_t,
- size_t);
- uint8_t ret[32U];
- libcrux_ml_kem_hash_functions_portable_H_f1_1a(
+ size_t, uint8_t[]);
+ uint8_t ret0[32U];
+ libcrux_ml_kem_hash_functions_portable_H_4a_e0(
Eurydice_array_to_slice((size_t)1184U,
- libcrux_ml_kem_types_as_slice_cb_50(public_key),
+ libcrux_ml_kem_types_as_slice_e6_d0(public_key),
uint8_t),
- ret);
+ ret0);
Eurydice_slice_copy(
- uu____0, Eurydice_array_to_slice((size_t)32U, ret, uint8_t), uint8_t);
+ uu____0, Eurydice_array_to_slice((size_t)32U, ret0, uint8_t), uint8_t);
uint8_t hashed[64U];
- libcrux_ml_kem_hash_functions_portable_G_f1_e4(
+ libcrux_ml_kem_hash_functions_portable_G_4a_e0(
Eurydice_array_to_slice((size_t)64U, to_hash, uint8_t), hashed);
Eurydice_slice_uint8_t_x2 uu____1 = Eurydice_slice_split_at(
Eurydice_array_to_slice((size_t)64U, hashed, uint8_t),
@@ -11114,30 +9873,20 @@ static inline tuple_3c libcrux_ml_kem_ind_cca_encapsulate_cd(
Eurydice_slice_uint8_t_x2);
Eurydice_slice shared_secret = uu____1.fst;
Eurydice_slice pseudorandomness = uu____1.snd;
- Eurydice_slice uu____2 = Eurydice_array_to_slice(
- (size_t)1184U, libcrux_ml_kem_types_as_slice_cb_50(public_key), uint8_t);
- /* Passing arrays by value in Rust generates a copy in C */
- uint8_t copy_of_randomness[32U];
- memcpy(copy_of_randomness, randomness0, (size_t)32U * sizeof(uint8_t));
uint8_t ciphertext[1088U];
- libcrux_ml_kem_ind_cpa_encrypt_60(uu____2, copy_of_randomness,
- pseudorandomness, ciphertext);
+ libcrux_ml_kem_ind_cpa_encrypt_2a(
+ Eurydice_array_to_slice((size_t)1184U,
+ libcrux_ml_kem_types_as_slice_e6_d0(public_key),
+ uint8_t),
+ randomness0, pseudorandomness, ciphertext);
/* Passing arrays by value in Rust generates a copy in C */
uint8_t copy_of_ciphertext[1088U];
memcpy(copy_of_ciphertext, ciphertext, (size_t)1088U * sizeof(uint8_t));
- libcrux_ml_kem_mlkem768_MlKem768Ciphertext ciphertext0 =
- libcrux_ml_kem_types_from_01_9f(copy_of_ciphertext);
- uint8_t shared_secret_array[32U];
- libcrux_ml_kem_variant_kdf_d8_41(shared_secret, &ciphertext0,
- shared_secret_array);
- libcrux_ml_kem_mlkem768_MlKem768Ciphertext uu____5 = ciphertext0;
- /* Passing arrays by value in Rust generates a copy in C */
- uint8_t copy_of_shared_secret_array[32U];
- memcpy(copy_of_shared_secret_array, shared_secret_array,
- (size_t)32U * sizeof(uint8_t));
- tuple_3c lit;
- lit.fst = uu____5;
- memcpy(lit.snd, copy_of_shared_secret_array, (size_t)32U * sizeof(uint8_t));
+ tuple_c2 lit;
+ lit.fst = libcrux_ml_kem_types_from_e0_80(copy_of_ciphertext);
+ uint8_t ret[32U];
+ libcrux_ml_kem_variant_kdf_39_d6(shared_secret, ciphertext, ret);
+ memcpy(lit.snd, ret, (size_t)32U * sizeof(uint8_t));
return lit;
}
@@ -11152,21 +9901,16 @@ libcrux_ml_kem.ind_cca.instantiations.portable.encapsulate with const generics
- C2_SIZE= 128
- VECTOR_U_COMPRESSION_FACTOR= 10
- VECTOR_V_COMPRESSION_FACTOR= 4
-- VECTOR_U_BLOCK_LEN= 320
+- C1_BLOCK_SIZE= 320
- ETA1= 2
- ETA1_RANDOMNESS_SIZE= 128
- ETA2= 2
- ETA2_RANDOMNESS_SIZE= 128
*/
-static inline tuple_3c
-libcrux_ml_kem_ind_cca_instantiations_portable_encapsulate_c6(
- libcrux_ml_kem_types_MlKemPublicKey_15 *public_key,
- uint8_t randomness[32U]) {
- libcrux_ml_kem_types_MlKemPublicKey_15 *uu____0 = public_key;
- /* Passing arrays by value in Rust generates a copy in C */
- uint8_t copy_of_randomness[32U];
- memcpy(copy_of_randomness, randomness, (size_t)32U * sizeof(uint8_t));
- return libcrux_ml_kem_ind_cca_encapsulate_cd(uu____0, copy_of_randomness);
+static inline tuple_c2
+libcrux_ml_kem_ind_cca_instantiations_portable_encapsulate_cd(
+ libcrux_ml_kem_types_MlKemPublicKey_30 *public_key, uint8_t *randomness) {
+ return libcrux_ml_kem_ind_cca_encapsulate_ca(public_key, randomness);
}
/**
@@ -11176,97 +9920,146 @@ libcrux_ml_kem_ind_cca_instantiations_portable_encapsulate_c6(
The input is a reference to an [`MlKem768PublicKey`] and [`SHARED_SECRET_SIZE`]
bytes of `randomness`.
*/
-static inline tuple_3c libcrux_ml_kem_mlkem768_portable_encapsulate(
- libcrux_ml_kem_types_MlKemPublicKey_15 *public_key,
+static inline tuple_c2 libcrux_ml_kem_mlkem768_portable_encapsulate(
+ libcrux_ml_kem_types_MlKemPublicKey_30 *public_key,
uint8_t randomness[32U]) {
- libcrux_ml_kem_types_MlKemPublicKey_15 *uu____0 = public_key;
- /* Passing arrays by value in Rust generates a copy in C */
- uint8_t copy_of_randomness[32U];
- memcpy(copy_of_randomness, randomness, (size_t)32U * sizeof(uint8_t));
- return libcrux_ml_kem_ind_cca_instantiations_portable_encapsulate_c6(
- uu____0, copy_of_randomness);
+ return libcrux_ml_kem_ind_cca_instantiations_portable_encapsulate_cd(
+ public_key, randomness);
}
/**
-This function found in impl {(libcrux_ml_kem::variant::Variant for
-libcrux_ml_kem::variant::MlKem)#1}
+This function found in impl {core::default::Default for
+libcrux_ml_kem::ind_cpa::unpacked::IndCpaPrivateKeyUnpacked<Vector,
+K>[TraitClause@0, TraitClause@1]}
*/
/**
-A monomorphic instance of libcrux_ml_kem.variant.cpa_keygen_seed_d8
+A monomorphic instance of libcrux_ml_kem.ind_cpa.unpacked.default_70
+with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
+with const generics
+- K= 3
+*/
+static inline libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_a0
+libcrux_ml_kem_ind_cpa_unpacked_default_70_1b(void) {
+ libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_a0 lit;
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d repeat_expression[3U];
+ for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
+ repeat_expression[i] = libcrux_ml_kem_polynomial_ZERO_d6_ea();
+ }
+ memcpy(
+ lit.secret_as_ntt, repeat_expression,
+ (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d));
+ return lit;
+}
+
+/**
+This function found in impl {libcrux_ml_kem::variant::Variant for
+libcrux_ml_kem::variant::MlKem}
+*/
+/**
+A monomorphic instance of libcrux_ml_kem.variant.cpa_keygen_seed_39
with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]]
with const generics
- K= 3
*/
-static KRML_MUSTINLINE void libcrux_ml_kem_variant_cpa_keygen_seed_d8_0e(
+static KRML_MUSTINLINE void libcrux_ml_kem_variant_cpa_keygen_seed_39_9c(
Eurydice_slice key_generation_seed, uint8_t ret[64U]) {
uint8_t seed[33U] = {0U};
Eurydice_slice_copy(
- Eurydice_array_to_subslice2(
+ Eurydice_array_to_subslice3(
seed, (size_t)0U,
- LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE, uint8_t),
+ LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE, uint8_t *),
key_generation_seed, uint8_t);
seed[LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE] =
(uint8_t)(size_t)3U;
uint8_t ret0[64U];
- libcrux_ml_kem_hash_functions_portable_G_f1_e4(
+ libcrux_ml_kem_hash_functions_portable_G_4a_e0(
Eurydice_array_to_slice((size_t)33U, seed, uint8_t), ret0);
memcpy(ret, ret0, (size_t)64U * sizeof(uint8_t));
}
/**
-A monomorphic instance of libcrux_ml_kem.matrix.compute_As_plus_e.closure
-with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
-with const generics
+This function found in impl {core::ops::function::FnMut<(usize),
+libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0,
+TraitClause@3]> for
+libcrux_ml_kem::ind_cpa::generate_keypair_unpacked::closure<Vector, Hasher,
+Scheme, K, ETA1, ETA1_RANDOMNESS_SIZE>[TraitClause@0, TraitClause@1,
+TraitClause@2, TraitClause@3, TraitClause@4, TraitClause@5]}
+*/
+/**
+A monomorphic instance of
+libcrux_ml_kem.ind_cpa.generate_keypair_unpacked.call_mut_73 with types
+libcrux_ml_kem_vector_portable_vector_type_PortableVector,
+libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]],
+libcrux_ml_kem_variant_MlKem with const generics
- K= 3
+- ETA1= 2
+- ETA1_RANDOMNESS_SIZE= 128
*/
-static inline libcrux_ml_kem_polynomial_PolynomialRingElement_f0
-libcrux_ml_kem_matrix_compute_As_plus_e_closure_87(size_t _i) {
- return libcrux_ml_kem_polynomial_ZERO_89_ea();
+static inline libcrux_ml_kem_polynomial_PolynomialRingElement_1d
+libcrux_ml_kem_ind_cpa_generate_keypair_unpacked_call_mut_73_1c(
+ void **_, size_t tupled_args) {
+ return libcrux_ml_kem_polynomial_ZERO_d6_ea();
}
/**
-A monomorphic instance of libcrux_ml_kem.vector.traits.to_standard_domain
+A monomorphic instance of libcrux_ml_kem.polynomial.to_standard_domain
with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
with const generics
*/
-static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
-libcrux_ml_kem_vector_traits_to_standard_domain_59(
- libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
- return libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_0d(
- v, LIBCRUX_ML_KEM_VECTOR_TRAITS_MONTGOMERY_R_SQUARED_MOD_FIELD_MODULUS);
+static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
+libcrux_ml_kem_polynomial_to_standard_domain_ea(
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector vector) {
+ return libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_b8(
+ vector,
+ LIBCRUX_ML_KEM_VECTOR_TRAITS_MONTGOMERY_R_SQUARED_MOD_FIELD_MODULUS);
}
/**
-This function found in impl
-{libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0]}
-*/
-/**
-A monomorphic instance of libcrux_ml_kem.polynomial.add_standard_error_reduce_89
+A monomorphic instance of libcrux_ml_kem.polynomial.add_standard_error_reduce
with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
with const generics
*/
static KRML_MUSTINLINE void
-libcrux_ml_kem_polynomial_add_standard_error_reduce_89_03(
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *self,
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *error) {
+libcrux_ml_kem_polynomial_add_standard_error_reduce_ea(
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *myself,
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *error) {
for (size_t i = (size_t)0U;
i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) {
size_t j = i;
libcrux_ml_kem_vector_portable_vector_type_PortableVector
coefficient_normal_form =
- libcrux_ml_kem_vector_traits_to_standard_domain_59(
- self->coefficients[j]);
- libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
- libcrux_ml_kem_vector_portable_barrett_reduce_0d(
- libcrux_ml_kem_vector_portable_add_0d(coefficient_normal_form,
- &error->coefficients[j]));
- self->coefficients[j] = uu____0;
+ libcrux_ml_kem_polynomial_to_standard_domain_ea(
+ myself->coefficients[j]);
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector sum =
+ libcrux_ml_kem_vector_portable_add_b8(coefficient_normal_form,
+ &error->coefficients[j]);
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector red =
+ libcrux_ml_kem_vector_portable_barrett_reduce_b8(sum);
+ myself->coefficients[j] = red;
}
}
/**
+This function found in impl
+{libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0,
+TraitClause@1]}
+*/
+/**
+A monomorphic instance of libcrux_ml_kem.polynomial.add_standard_error_reduce_d6
+with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
+with const generics
+
+*/
+static KRML_MUSTINLINE void
+libcrux_ml_kem_polynomial_add_standard_error_reduce_d6_ea(
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *self,
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *error) {
+ libcrux_ml_kem_polynomial_add_standard_error_reduce_ea(self, error);
+}
+
+/**
Compute  ◦ ŝ + ê
*/
/**
@@ -11275,46 +10068,135 @@ with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
with const generics
- K= 3
*/
-static KRML_MUSTINLINE void libcrux_ml_kem_matrix_compute_As_plus_e_60(
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 (*matrix_A)[3U],
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *s_as_ntt,
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *error_as_ntt,
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret[3U]) {
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 result[3U];
- for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
- result[i] = libcrux_ml_kem_polynomial_ZERO_89_ea();
- }
- for (size_t i0 = (size_t)0U;
- i0 < Eurydice_slice_len(
- Eurydice_array_to_slice(
- (size_t)3U, matrix_A,
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0[3U]),
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0[3U]);
- i0++) {
- size_t i1 = i0;
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *row = matrix_A[i1];
- for (size_t i = (size_t)0U;
- i < Eurydice_slice_len(
- Eurydice_array_to_slice(
- (size_t)3U, row,
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0),
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0);
- i++) {
- size_t j = i;
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *matrix_element =
+static KRML_MUSTINLINE void libcrux_ml_kem_matrix_compute_As_plus_e_1b(
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *t_as_ntt,
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d (*matrix_A)[3U],
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *s_as_ntt,
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *error_as_ntt) {
+ for (size_t i = (size_t)0U;
+ i < Eurydice_slice_len(
+ Eurydice_array_to_slice(
+ (size_t)3U, matrix_A,
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d[3U]),
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d[3U]);
+ i++) {
+ size_t i0 = i;
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *row = matrix_A[i0];
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d uu____0 =
+ libcrux_ml_kem_polynomial_ZERO_d6_ea();
+ t_as_ntt[i0] = uu____0;
+ for (size_t i1 = (size_t)0U;
+ i1 < Eurydice_slice_len(
+ Eurydice_array_to_slice(
+ (size_t)3U, row,
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d),
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d);
+ i1++) {
+ size_t j = i1;
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *matrix_element =
&row[j];
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 product =
- libcrux_ml_kem_polynomial_ntt_multiply_89_2a(matrix_element,
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d product =
+ libcrux_ml_kem_polynomial_ntt_multiply_d6_ea(matrix_element,
&s_as_ntt[j]);
- libcrux_ml_kem_polynomial_add_to_ring_element_89_84(&result[i1],
+ libcrux_ml_kem_polynomial_add_to_ring_element_d6_1b(&t_as_ntt[i0],
&product);
}
- libcrux_ml_kem_polynomial_add_standard_error_reduce_89_03(
- &result[i1], &error_as_ntt[i1]);
+ libcrux_ml_kem_polynomial_add_standard_error_reduce_d6_ea(
+ &t_as_ntt[i0], &error_as_ntt[i0]);
}
- memcpy(
- ret, result,
- (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
+}
+
+/**
+ This function implements most of <strong>Algorithm 12</strong> of the
+ NIST FIPS 203 specification; this is the Kyber CPA-PKE key generation
+ algorithm.
+
+ We say "most of" since Algorithm 12 samples the required randomness within
+ the function itself, whereas this implementation expects it to be provided
+ through the `key_generation_seed` parameter.
+
+ Algorithm 12 is reproduced below:
+
+ ```plaintext
+ Output: encryption key ekₚₖₑ ∈ 𝔹^{384k+32}.
+ Output: decryption key dkₚₖₑ ∈ 𝔹^{384k}.
+
+ d ←$ B
+ (ρ,σ) ← G(d)
+ N ← 0
+ for (i ← 0; i < k; i++)
+ for(j ← 0; j < k; j++)
+ Â[i,j] ← SampleNTT(XOF(ρ, i, j))
+ end for
+ end for
+ for(i ← 0; i < k; i++)
+ s[i] ← SamplePolyCBD_{η₁}(PRF_{η₁}(σ,N))
+ N ← N + 1
+ end for
+ for(i ← 0; i < k; i++)
+ e[i] ← SamplePolyCBD_{η₂}(PRF_{η₂}(σ,N))
+ N ← N + 1
+ end for
+ ŝ ← NTT(s)
+ ê ← NTT(e)
+ t̂ ← Â◦ŝ + ê
+ ekₚₖₑ ← ByteEncode₁₂(t̂) ‖ ρ
+ dkₚₖₑ ← ByteEncode₁₂(ŝ)
+ ```
+
+ The NIST FIPS 203 standard can be found at
+ <https://csrc.nist.gov/pubs/fips/203/ipd>.
+*/
+/**
+A monomorphic instance of libcrux_ml_kem.ind_cpa.generate_keypair_unpacked
+with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
+libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]],
+libcrux_ml_kem_variant_MlKem with const generics
+- K= 3
+- ETA1= 2
+- ETA1_RANDOMNESS_SIZE= 128
+*/
+static KRML_MUSTINLINE void libcrux_ml_kem_ind_cpa_generate_keypair_unpacked_1c(
+ Eurydice_slice key_generation_seed,
+ libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_a0 *private_key,
+ libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0 *public_key) {
+ uint8_t hashed[64U];
+ libcrux_ml_kem_variant_cpa_keygen_seed_39_9c(key_generation_seed, hashed);
+ Eurydice_slice_uint8_t_x2 uu____0 = Eurydice_slice_split_at(
+ Eurydice_array_to_slice((size_t)64U, hashed, uint8_t), (size_t)32U,
+ uint8_t, Eurydice_slice_uint8_t_x2);
+ Eurydice_slice seed_for_A = uu____0.fst;
+ Eurydice_slice seed_for_secret_and_error = uu____0.snd;
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d(*uu____1)[3U] =
+ public_key->A;
+ uint8_t ret[34U];
+ libcrux_ml_kem_utils_into_padded_array_b6(seed_for_A, ret);
+ libcrux_ml_kem_matrix_sample_matrix_A_2b(uu____1, ret, true);
+ uint8_t prf_input[33U];
+ libcrux_ml_kem_utils_into_padded_array_c8(seed_for_secret_and_error,
+ prf_input);
+ uint8_t domain_separator =
+ libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_3b(
+ private_key->secret_as_ntt, prf_input, 0U);
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d error_as_ntt[3U];
+ for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
+ /* original Rust expression is not an lvalue in C */
+ void *lvalue = (void *)0U;
+ error_as_ntt[i] =
+ libcrux_ml_kem_ind_cpa_generate_keypair_unpacked_call_mut_73_1c(&lvalue,
+ i);
+ }
+ libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_3b(error_as_ntt, prf_input,
+ domain_separator);
+ libcrux_ml_kem_matrix_compute_As_plus_e_1b(
+ public_key->t_as_ntt, public_key->A, private_key->secret_as_ntt,
+ error_as_ntt);
+ uint8_t uu____2[32U];
+ Result_fb dst;
+ Eurydice_slice_to_array2(&dst, seed_for_A, Eurydice_slice, uint8_t[32U],
+ TryFromSliceError);
+ unwrap_26_b3(dst, uu____2);
+ memcpy(public_key->seed_for_A, uu____2, (size_t)32U * sizeof(uint8_t));
}
/**
@@ -11324,21 +10206,21 @@ libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
*/
static KRML_MUSTINLINE void
-libcrux_ml_kem_serialize_serialize_uncompressed_ring_element_5b(
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re, uint8_t ret[384U]) {
+libcrux_ml_kem_serialize_serialize_uncompressed_ring_element_ea(
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re, uint8_t ret[384U]) {
uint8_t serialized[384U] = {0U};
for (size_t i = (size_t)0U;
i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) {
size_t i0 = i;
libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient =
- libcrux_ml_kem_vector_traits_to_unsigned_representative_db(
+ libcrux_ml_kem_serialize_to_unsigned_field_modulus_ea(
re->coefficients[i0]);
uint8_t bytes[24U];
- libcrux_ml_kem_vector_portable_serialize_12_0d(coefficient, bytes);
- Eurydice_slice uu____0 = Eurydice_array_to_subslice2(
- serialized, (size_t)24U * i0, (size_t)24U * i0 + (size_t)24U, uint8_t);
+ libcrux_ml_kem_vector_portable_serialize_12_b8(coefficient, bytes);
Eurydice_slice_copy(
- uu____0, Eurydice_array_to_slice((size_t)24U, bytes, uint8_t), uint8_t);
+ Eurydice_array_to_subslice3(serialized, (size_t)24U * i0,
+ (size_t)24U * i0 + (size_t)24U, uint8_t *),
+ Eurydice_array_to_slice((size_t)24U, bytes, uint8_t), uint8_t);
}
memcpy(ret, serialized, (size_t)384U * sizeof(uint8_t));
}
@@ -11347,35 +10229,59 @@ libcrux_ml_kem_serialize_serialize_uncompressed_ring_element_5b(
Call [`serialize_uncompressed_ring_element`] for each ring element.
*/
/**
-A monomorphic instance of libcrux_ml_kem.ind_cpa.serialize_secret_key
+A monomorphic instance of libcrux_ml_kem.ind_cpa.serialize_vector
with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
with const generics
- K= 3
-- OUT_LEN= 1152
*/
-static KRML_MUSTINLINE void libcrux_ml_kem_ind_cpa_serialize_secret_key_b5(
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *key,
- uint8_t ret[1152U]) {
- uint8_t out[1152U] = {0U};
+static KRML_MUSTINLINE void libcrux_ml_kem_ind_cpa_serialize_vector_1b(
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *key,
+ Eurydice_slice out) {
for (size_t i = (size_t)0U;
i < Eurydice_slice_len(
Eurydice_array_to_slice(
(size_t)3U, key,
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0),
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0);
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d),
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d);
i++) {
size_t i0 = i;
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re = key[i0];
- Eurydice_slice uu____0 = Eurydice_array_to_subslice2(
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d re = key[i0];
+ Eurydice_slice uu____0 = Eurydice_slice_subslice3(
out, i0 * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT,
(i0 + (size_t)1U) * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT,
- uint8_t);
- uint8_t ret0[384U];
- libcrux_ml_kem_serialize_serialize_uncompressed_ring_element_5b(&re, ret0);
+ uint8_t *);
+ uint8_t ret[384U];
+ libcrux_ml_kem_serialize_serialize_uncompressed_ring_element_ea(&re, ret);
Eurydice_slice_copy(
- uu____0, Eurydice_array_to_slice((size_t)384U, ret0, uint8_t), uint8_t);
+ uu____0, Eurydice_array_to_slice((size_t)384U, ret, uint8_t), uint8_t);
}
- memcpy(ret, out, (size_t)1152U * sizeof(uint8_t));
+}
+
+/**
+ Concatenate `t` and `ρ` into the public key.
+*/
+/**
+A monomorphic instance of libcrux_ml_kem.ind_cpa.serialize_public_key_mut
+with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
+with const generics
+- K= 3
+- PUBLIC_KEY_SIZE= 1184
+*/
+static KRML_MUSTINLINE void libcrux_ml_kem_ind_cpa_serialize_public_key_mut_89(
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *t_as_ntt,
+ Eurydice_slice seed_for_a, uint8_t *serialized) {
+ libcrux_ml_kem_ind_cpa_serialize_vector_1b(
+ t_as_ntt,
+ Eurydice_array_to_subslice3(
+ serialized, (size_t)0U,
+ libcrux_ml_kem_constants_ranked_bytes_per_ring_element((size_t)3U),
+ uint8_t *));
+ Eurydice_slice_copy(
+ Eurydice_array_to_subslice_from(
+ (size_t)1184U, serialized,
+ libcrux_ml_kem_constants_ranked_bytes_per_ring_element((size_t)3U),
+ uint8_t, size_t, uint8_t[]),
+ seed_for_a, uint8_t);
}
/**
@@ -11386,88 +10292,41 @@ A monomorphic instance of libcrux_ml_kem.ind_cpa.serialize_public_key
with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
with const generics
- K= 3
-- RANKED_BYTES_PER_RING_ELEMENT= 1152
- PUBLIC_KEY_SIZE= 1184
*/
-static KRML_MUSTINLINE void libcrux_ml_kem_ind_cpa_serialize_public_key_79(
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *t_as_ntt,
+static KRML_MUSTINLINE void libcrux_ml_kem_ind_cpa_serialize_public_key_89(
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *t_as_ntt,
Eurydice_slice seed_for_a, uint8_t ret[1184U]) {
uint8_t public_key_serialized[1184U] = {0U};
- Eurydice_slice uu____0 = Eurydice_array_to_subslice2(
- public_key_serialized, (size_t)0U, (size_t)1152U, uint8_t);
- uint8_t ret0[1152U];
- libcrux_ml_kem_ind_cpa_serialize_secret_key_b5(t_as_ntt, ret0);
- Eurydice_slice_copy(
- uu____0, Eurydice_array_to_slice((size_t)1152U, ret0, uint8_t), uint8_t);
- Eurydice_slice_copy(
- Eurydice_array_to_subslice_from((size_t)1184U, public_key_serialized,
- (size_t)1152U, uint8_t, size_t),
- seed_for_a, uint8_t);
+ libcrux_ml_kem_ind_cpa_serialize_public_key_mut_89(t_as_ntt, seed_for_a,
+ public_key_serialized);
memcpy(ret, public_key_serialized, (size_t)1184U * sizeof(uint8_t));
}
/**
-A monomorphic instance of libcrux_ml_kem.ind_cpa.generate_keypair
-with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
-libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]],
-libcrux_ml_kem_variant_MlKem with const generics
+ Serialize the secret key from the unpacked key pair generation.
+*/
+/**
+A monomorphic instance of libcrux_ml_kem.ind_cpa.serialize_unpacked_secret_key
+with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
+with const generics
- K= 3
- PRIVATE_KEY_SIZE= 1152
- PUBLIC_KEY_SIZE= 1184
-- RANKED_BYTES_PER_RING_ELEMENT= 1152
-- ETA1= 2
-- ETA1_RANDOMNESS_SIZE= 128
*/
static inline libcrux_ml_kem_utils_extraction_helper_Keypair768
-libcrux_ml_kem_ind_cpa_generate_keypair_fc(Eurydice_slice key_generation_seed) {
- uint8_t hashed[64U];
- libcrux_ml_kem_variant_cpa_keygen_seed_d8_0e(key_generation_seed, hashed);
- Eurydice_slice_uint8_t_x2 uu____0 = Eurydice_slice_split_at(
- Eurydice_array_to_slice((size_t)64U, hashed, uint8_t), (size_t)32U,
- uint8_t, Eurydice_slice_uint8_t_x2);
- Eurydice_slice seed_for_A0 = uu____0.fst;
- Eurydice_slice seed_for_secret_and_error = uu____0.snd;
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 A_transpose[3U][3U];
- uint8_t ret[34U];
- libcrux_ml_kem_utils_into_padded_array_ea1(seed_for_A0, ret);
- libcrux_ml_kem_matrix_sample_matrix_A_38(ret, true, A_transpose);
- uint8_t prf_input[33U];
- libcrux_ml_kem_utils_into_padded_array_ea2(seed_for_secret_and_error,
- prf_input);
- /* Passing arrays by value in Rust generates a copy in C */
- uint8_t copy_of_prf_input0[33U];
- memcpy(copy_of_prf_input0, prf_input, (size_t)33U * sizeof(uint8_t));
- tuple_b0 uu____2 = libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_fc(
- copy_of_prf_input0, 0U);
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 secret_as_ntt[3U];
- memcpy(
- secret_as_ntt, uu____2.fst,
- (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
- uint8_t domain_separator = uu____2.snd;
- /* Passing arrays by value in Rust generates a copy in C */
- uint8_t copy_of_prf_input[33U];
- memcpy(copy_of_prf_input, prf_input, (size_t)33U * sizeof(uint8_t));
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 error_as_ntt[3U];
- memcpy(
- error_as_ntt,
- libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_fc(copy_of_prf_input,
- domain_separator)
- .fst,
- (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 t_as_ntt[3U];
- libcrux_ml_kem_matrix_compute_As_plus_e_60(A_transpose, secret_as_ntt,
- error_as_ntt, t_as_ntt);
- uint8_t seed_for_A[32U];
- Result_00 dst;
- Eurydice_slice_to_array2(&dst, seed_for_A0, Eurydice_slice, uint8_t[32U]);
- unwrap_41_83(dst, seed_for_A);
+libcrux_ml_kem_ind_cpa_serialize_unpacked_secret_key_6c(
+ libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0 *public_key,
+ libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_a0 *private_key) {
uint8_t public_key_serialized[1184U];
- libcrux_ml_kem_ind_cpa_serialize_public_key_79(
- t_as_ntt, Eurydice_array_to_slice((size_t)32U, seed_for_A, uint8_t),
+ libcrux_ml_kem_ind_cpa_serialize_public_key_89(
+ public_key->t_as_ntt,
+ Eurydice_array_to_slice((size_t)32U, public_key->seed_for_A, uint8_t),
public_key_serialized);
- uint8_t secret_key_serialized[1152U];
- libcrux_ml_kem_ind_cpa_serialize_secret_key_b5(secret_as_ntt,
- secret_key_serialized);
+ uint8_t secret_key_serialized[1152U] = {0U};
+ libcrux_ml_kem_ind_cpa_serialize_vector_1b(
+ private_key->secret_as_ntt,
+ Eurydice_array_to_slice((size_t)1152U, secret_key_serialized, uint8_t));
/* Passing arrays by value in Rust generates a copy in C */
uint8_t copy_of_secret_key_serialized[1152U];
memcpy(copy_of_secret_key_serialized, secret_key_serialized,
@@ -11485,54 +10344,93 @@ libcrux_ml_kem_ind_cpa_generate_keypair_fc(Eurydice_slice key_generation_seed) {
}
/**
+A monomorphic instance of libcrux_ml_kem.ind_cpa.generate_keypair
+with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
+libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]],
+libcrux_ml_kem_variant_MlKem with const generics
+- K= 3
+- PRIVATE_KEY_SIZE= 1152
+- PUBLIC_KEY_SIZE= 1184
+- ETA1= 2
+- ETA1_RANDOMNESS_SIZE= 128
+*/
+static KRML_MUSTINLINE libcrux_ml_kem_utils_extraction_helper_Keypair768
+libcrux_ml_kem_ind_cpa_generate_keypair_ea(Eurydice_slice key_generation_seed) {
+ libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_a0 private_key =
+ libcrux_ml_kem_ind_cpa_unpacked_default_70_1b();
+ libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0 public_key =
+ libcrux_ml_kem_ind_cpa_unpacked_default_8b_1b();
+ libcrux_ml_kem_ind_cpa_generate_keypair_unpacked_1c(
+ key_generation_seed, &private_key, &public_key);
+ return libcrux_ml_kem_ind_cpa_serialize_unpacked_secret_key_6c(&public_key,
+ &private_key);
+}
+
+/**
Serialize the secret key.
*/
/**
-A monomorphic instance of libcrux_ml_kem.ind_cca.serialize_kem_secret_key
+A monomorphic instance of libcrux_ml_kem.ind_cca.serialize_kem_secret_key_mut
with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]]
with const generics
- K= 3
- SERIALIZED_KEY_LEN= 2400
*/
-static KRML_MUSTINLINE void libcrux_ml_kem_ind_cca_serialize_kem_secret_key_48(
+static KRML_MUSTINLINE void
+libcrux_ml_kem_ind_cca_serialize_kem_secret_key_mut_d6(
Eurydice_slice private_key, Eurydice_slice public_key,
- Eurydice_slice implicit_rejection_value, uint8_t ret[2400U]) {
- uint8_t out[2400U] = {0U};
+ Eurydice_slice implicit_rejection_value, uint8_t *serialized) {
size_t pointer = (size_t)0U;
- uint8_t *uu____0 = out;
+ uint8_t *uu____0 = serialized;
size_t uu____1 = pointer;
size_t uu____2 = pointer;
Eurydice_slice_copy(
- Eurydice_array_to_subslice2(
+ Eurydice_array_to_subslice3(
uu____0, uu____1, uu____2 + Eurydice_slice_len(private_key, uint8_t),
- uint8_t),
+ uint8_t *),
private_key, uint8_t);
pointer = pointer + Eurydice_slice_len(private_key, uint8_t);
- uint8_t *uu____3 = out;
+ uint8_t *uu____3 = serialized;
size_t uu____4 = pointer;
size_t uu____5 = pointer;
Eurydice_slice_copy(
- Eurydice_array_to_subslice2(
+ Eurydice_array_to_subslice3(
uu____3, uu____4, uu____5 + Eurydice_slice_len(public_key, uint8_t),
- uint8_t),
+ uint8_t *),
public_key, uint8_t);
pointer = pointer + Eurydice_slice_len(public_key, uint8_t);
- Eurydice_slice uu____6 = Eurydice_array_to_subslice2(
- out, pointer, pointer + LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE, uint8_t);
- uint8_t ret0[32U];
- libcrux_ml_kem_hash_functions_portable_H_f1_1a(public_key, ret0);
+ Eurydice_slice uu____6 = Eurydice_array_to_subslice3(
+ serialized, pointer, pointer + LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE,
+ uint8_t *);
+ uint8_t ret[32U];
+ libcrux_ml_kem_hash_functions_portable_H_4a_e0(public_key, ret);
Eurydice_slice_copy(
- uu____6, Eurydice_array_to_slice((size_t)32U, ret0, uint8_t), uint8_t);
+ uu____6, Eurydice_array_to_slice((size_t)32U, ret, uint8_t), uint8_t);
pointer = pointer + LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE;
- uint8_t *uu____7 = out;
+ uint8_t *uu____7 = serialized;
size_t uu____8 = pointer;
size_t uu____9 = pointer;
Eurydice_slice_copy(
- Eurydice_array_to_subslice2(
+ Eurydice_array_to_subslice3(
uu____7, uu____8,
uu____9 + Eurydice_slice_len(implicit_rejection_value, uint8_t),
- uint8_t),
+ uint8_t *),
implicit_rejection_value, uint8_t);
+}
+
+/**
+A monomorphic instance of libcrux_ml_kem.ind_cca.serialize_kem_secret_key
+with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]]
+with const generics
+- K= 3
+- SERIALIZED_KEY_LEN= 2400
+*/
+static KRML_MUSTINLINE void libcrux_ml_kem_ind_cca_serialize_kem_secret_key_d6(
+ Eurydice_slice private_key, Eurydice_slice public_key,
+ Eurydice_slice implicit_rejection_value, uint8_t ret[2400U]) {
+ uint8_t out[2400U] = {0U};
+ libcrux_ml_kem_ind_cca_serialize_kem_secret_key_mut_d6(
+ private_key, public_key, implicit_rejection_value, out);
memcpy(ret, out, (size_t)2400U * sizeof(uint8_t));
}
@@ -11553,27 +10451,26 @@ libcrux_ml_kem_variant_MlKem with const generics
- CPA_PRIVATE_KEY_SIZE= 1152
- PRIVATE_KEY_SIZE= 2400
- PUBLIC_KEY_SIZE= 1184
-- BYTES_PER_RING_ELEMENT= 1152
- ETA1= 2
- ETA1_RANDOMNESS_SIZE= 128
*/
-static inline libcrux_ml_kem_mlkem768_MlKem768KeyPair
-libcrux_ml_kem_ind_cca_generate_keypair_8c(uint8_t randomness[64U]) {
- Eurydice_slice ind_cpa_keypair_randomness = Eurydice_array_to_subslice2(
+static KRML_MUSTINLINE libcrux_ml_kem_mlkem768_MlKem768KeyPair
+libcrux_ml_kem_ind_cca_generate_keypair_15(uint8_t *randomness) {
+ Eurydice_slice ind_cpa_keypair_randomness = Eurydice_array_to_subslice3(
randomness, (size_t)0U,
- LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE, uint8_t);
+ LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE, uint8_t *);
Eurydice_slice implicit_rejection_value = Eurydice_array_to_subslice_from(
(size_t)64U, randomness,
LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE, uint8_t,
- size_t);
+ size_t, uint8_t[]);
libcrux_ml_kem_utils_extraction_helper_Keypair768 uu____0 =
- libcrux_ml_kem_ind_cpa_generate_keypair_fc(ind_cpa_keypair_randomness);
+ libcrux_ml_kem_ind_cpa_generate_keypair_ea(ind_cpa_keypair_randomness);
uint8_t ind_cpa_private_key[1152U];
memcpy(ind_cpa_private_key, uu____0.fst, (size_t)1152U * sizeof(uint8_t));
uint8_t public_key[1184U];
memcpy(public_key, uu____0.snd, (size_t)1184U * sizeof(uint8_t));
uint8_t secret_key_serialized[2400U];
- libcrux_ml_kem_ind_cca_serialize_kem_secret_key_48(
+ libcrux_ml_kem_ind_cca_serialize_kem_secret_key_d6(
Eurydice_array_to_slice((size_t)1152U, ind_cpa_private_key, uint8_t),
Eurydice_array_to_slice((size_t)1184U, public_key, uint8_t),
implicit_rejection_value, secret_key_serialized);
@@ -11581,14 +10478,14 @@ libcrux_ml_kem_ind_cca_generate_keypair_8c(uint8_t randomness[64U]) {
uint8_t copy_of_secret_key_serialized[2400U];
memcpy(copy_of_secret_key_serialized, secret_key_serialized,
(size_t)2400U * sizeof(uint8_t));
- libcrux_ml_kem_types_MlKemPrivateKey_55 private_key =
- libcrux_ml_kem_types_from_05_f2(copy_of_secret_key_serialized);
- libcrux_ml_kem_types_MlKemPrivateKey_55 uu____2 = private_key;
+ libcrux_ml_kem_types_MlKemPrivateKey_d9 private_key =
+ libcrux_ml_kem_types_from_77_28(copy_of_secret_key_serialized);
+ libcrux_ml_kem_types_MlKemPrivateKey_d9 uu____2 = private_key;
/* Passing arrays by value in Rust generates a copy in C */
uint8_t copy_of_public_key[1184U];
memcpy(copy_of_public_key, public_key, (size_t)1184U * sizeof(uint8_t));
- return libcrux_ml_kem_types_from_17_35(
- uu____2, libcrux_ml_kem_types_from_b6_da(copy_of_public_key));
+ return libcrux_ml_kem_types_from_17_74(
+ uu____2, libcrux_ml_kem_types_from_fd_d0(copy_of_public_key));
}
/**
@@ -11602,17 +10499,13 @@ generics
- CPA_PRIVATE_KEY_SIZE= 1152
- PRIVATE_KEY_SIZE= 2400
- PUBLIC_KEY_SIZE= 1184
-- BYTES_PER_RING_ELEMENT= 1152
- ETA1= 2
- ETA1_RANDOMNESS_SIZE= 128
*/
static inline libcrux_ml_kem_mlkem768_MlKem768KeyPair
-libcrux_ml_kem_ind_cca_instantiations_portable_generate_keypair_d5(
- uint8_t randomness[64U]) {
- /* Passing arrays by value in Rust generates a copy in C */
- uint8_t copy_of_randomness[64U];
- memcpy(copy_of_randomness, randomness, (size_t)64U * sizeof(uint8_t));
- return libcrux_ml_kem_ind_cca_generate_keypair_8c(copy_of_randomness);
+libcrux_ml_kem_ind_cca_instantiations_portable_generate_keypair_ce(
+ uint8_t *randomness) {
+ return libcrux_ml_kem_ind_cca_generate_keypair_15(randomness);
}
/**
@@ -11620,51 +10513,266 @@ libcrux_ml_kem_ind_cca_instantiations_portable_generate_keypair_d5(
*/
static inline libcrux_ml_kem_mlkem768_MlKem768KeyPair
libcrux_ml_kem_mlkem768_portable_generate_key_pair(uint8_t randomness[64U]) {
- /* Passing arrays by value in Rust generates a copy in C */
- uint8_t copy_of_randomness[64U];
- memcpy(copy_of_randomness, randomness, (size_t)64U * sizeof(uint8_t));
- return libcrux_ml_kem_ind_cca_instantiations_portable_generate_keypair_d5(
- copy_of_randomness);
+ return libcrux_ml_kem_ind_cca_instantiations_portable_generate_keypair_ce(
+ randomness);
}
/**
-This function found in impl {(libcrux_ml_kem::variant::Variant for
-libcrux_ml_kem::variant::Kyber)}
+ Validate an ML-KEM private key.
+
+ This implements the Hash check in 7.3 3.
+*/
+/**
+A monomorphic instance of libcrux_ml_kem.ind_cca.validate_private_key_only
+with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]]
+with const generics
+- K= 3
+- SECRET_KEY_SIZE= 2400
+*/
+static KRML_MUSTINLINE bool libcrux_ml_kem_ind_cca_validate_private_key_only_d6(
+ libcrux_ml_kem_types_MlKemPrivateKey_d9 *private_key) {
+ uint8_t t[32U];
+ libcrux_ml_kem_hash_functions_portable_H_4a_e0(
+ Eurydice_array_to_subslice3(private_key->value, (size_t)384U * (size_t)3U,
+ (size_t)768U * (size_t)3U + (size_t)32U,
+ uint8_t *),
+ t);
+ Eurydice_slice expected = Eurydice_array_to_subslice3(
+ private_key->value, (size_t)768U * (size_t)3U + (size_t)32U,
+ (size_t)768U * (size_t)3U + (size_t)64U, uint8_t *);
+ return Eurydice_array_eq_slice((size_t)32U, t, &expected, uint8_t, bool);
+}
+
+/**
+ Validate an ML-KEM private key.
+
+ This implements the Hash check in 7.3 3.
+ Note that the size checks in 7.2 1 and 2 are covered by the `SECRET_KEY_SIZE`
+ and `CIPHERTEXT_SIZE` in the `private_key` and `ciphertext` types.
*/
/**
-A monomorphic instance of libcrux_ml_kem.variant.kdf_33
+A monomorphic instance of libcrux_ml_kem.ind_cca.validate_private_key
with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]]
with const generics
- K= 3
+- SECRET_KEY_SIZE= 2400
- CIPHERTEXT_SIZE= 1088
*/
-static KRML_MUSTINLINE void libcrux_ml_kem_variant_kdf_33_f0(
- Eurydice_slice shared_secret,
- libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext, uint8_t ret[32U]) {
- uint8_t kdf_input[64U];
- libcrux_ml_kem_utils_into_padded_array_ea(shared_secret, kdf_input);
- Eurydice_slice uu____0 = Eurydice_array_to_subslice_from(
- (size_t)64U, kdf_input, LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE, uint8_t,
- size_t);
- uint8_t ret0[32U];
- libcrux_ml_kem_hash_functions_portable_H_f1_1a(
- Eurydice_array_to_slice((size_t)1088U,
- libcrux_ml_kem_types_as_slice_d4_1d(ciphertext),
- uint8_t),
- ret0);
- Eurydice_slice_copy(
- uu____0, Eurydice_array_to_slice((size_t)32U, ret0, uint8_t), uint8_t);
- uint8_t ret1[32U];
- libcrux_ml_kem_hash_functions_portable_PRF_f1_ee(
- Eurydice_array_to_slice((size_t)64U, kdf_input, uint8_t), ret1);
- memcpy(ret, ret1, (size_t)32U * sizeof(uint8_t));
+static KRML_MUSTINLINE bool libcrux_ml_kem_ind_cca_validate_private_key_37(
+ libcrux_ml_kem_types_MlKemPrivateKey_d9 *private_key,
+ libcrux_ml_kem_mlkem768_MlKem768Ciphertext *_ciphertext) {
+ return libcrux_ml_kem_ind_cca_validate_private_key_only_d6(private_key);
}
/**
-A monomorphic instance of libcrux_ml_kem.ind_cca.decapsulate
+ Private key validation
+*/
+/**
+A monomorphic instance of
+libcrux_ml_kem.ind_cca.instantiations.portable.validate_private_key with const
+generics
+- K= 3
+- SECRET_KEY_SIZE= 2400
+- CIPHERTEXT_SIZE= 1088
+*/
+static KRML_MUSTINLINE bool
+libcrux_ml_kem_ind_cca_instantiations_portable_validate_private_key_31(
+ libcrux_ml_kem_types_MlKemPrivateKey_d9 *private_key,
+ libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext) {
+ return libcrux_ml_kem_ind_cca_validate_private_key_37(private_key,
+ ciphertext);
+}
+
+/**
+ Validate a private key.
+
+ Returns `true` if valid, and `false` otherwise.
+*/
+static inline bool libcrux_ml_kem_mlkem768_portable_validate_private_key(
+ libcrux_ml_kem_types_MlKemPrivateKey_d9 *private_key,
+ libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext) {
+ return libcrux_ml_kem_ind_cca_instantiations_portable_validate_private_key_31(
+ private_key, ciphertext);
+}
+
+/**
+ Private key validation
+*/
+/**
+A monomorphic instance of
+libcrux_ml_kem.ind_cca.instantiations.portable.validate_private_key_only with
+const generics
+- K= 3
+- SECRET_KEY_SIZE= 2400
+*/
+static KRML_MUSTINLINE bool
+libcrux_ml_kem_ind_cca_instantiations_portable_validate_private_key_only_41(
+ libcrux_ml_kem_types_MlKemPrivateKey_d9 *private_key) {
+ return libcrux_ml_kem_ind_cca_validate_private_key_only_d6(private_key);
+}
+
+/**
+ Validate the private key only.
+
+ Returns `true` if valid, and `false` otherwise.
+*/
+static inline bool libcrux_ml_kem_mlkem768_portable_validate_private_key_only(
+ libcrux_ml_kem_types_MlKemPrivateKey_d9 *private_key) {
+ return libcrux_ml_kem_ind_cca_instantiations_portable_validate_private_key_only_41(
+ private_key);
+}
+
+/**
+This function found in impl {core::ops::function::FnMut<(usize),
+libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0,
+TraitClause@1]> for
+libcrux_ml_kem::serialize::deserialize_ring_elements_reduced_out::closure<Vector,
+K>[TraitClause@0, TraitClause@1]}
+*/
+/**
+A monomorphic instance of
+libcrux_ml_kem.serialize.deserialize_ring_elements_reduced_out.call_mut_0b with
+types libcrux_ml_kem_vector_portable_vector_type_PortableVector with const
+generics
+- K= 3
+*/
+static inline libcrux_ml_kem_polynomial_PolynomialRingElement_1d
+libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_out_call_mut_0b_1b(
+ void **_, size_t tupled_args) {
+ return libcrux_ml_kem_polynomial_ZERO_d6_ea();
+}
+
+/**
+ This function deserializes ring elements and reduces the result by the field
+ modulus.
+
+ This function MUST NOT be used on secret inputs.
+*/
+/**
+A monomorphic instance of
+libcrux_ml_kem.serialize.deserialize_ring_elements_reduced_out with types
+libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
+- K= 3
+*/
+static KRML_MUSTINLINE void
+libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_out_1b(
+ Eurydice_slice public_key,
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d ret[3U]) {
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d deserialized_pk[3U];
+ for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
+ /* original Rust expression is not an lvalue in C */
+ void *lvalue = (void *)0U;
+ deserialized_pk[i] =
+ libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_out_call_mut_0b_1b(
+ &lvalue, i);
+ }
+ libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_1b(
+ public_key, deserialized_pk);
+ memcpy(
+ ret, deserialized_pk,
+ (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d));
+}
+
+/**
+ Validate an ML-KEM public key.
+
+ This implements the Modulus check in 7.2 2.
+ Note that the size check in 7.2 1 is covered by the `PUBLIC_KEY_SIZE` in the
+ `public_key` type.
+*/
+/**
+A monomorphic instance of libcrux_ml_kem.ind_cca.validate_public_key
+with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
+with const generics
+- K= 3
+- PUBLIC_KEY_SIZE= 1184
+*/
+static KRML_MUSTINLINE bool libcrux_ml_kem_ind_cca_validate_public_key_89(
+ uint8_t *public_key) {
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d deserialized_pk[3U];
+ libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_out_1b(
+ Eurydice_array_to_subslice_to(
+ (size_t)1184U, public_key,
+ libcrux_ml_kem_constants_ranked_bytes_per_ring_element((size_t)3U),
+ uint8_t, size_t, uint8_t[]),
+ deserialized_pk);
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *uu____0 = deserialized_pk;
+ uint8_t public_key_serialized[1184U];
+ libcrux_ml_kem_ind_cpa_serialize_public_key_89(
+ uu____0,
+ Eurydice_array_to_subslice_from(
+ (size_t)1184U, public_key,
+ libcrux_ml_kem_constants_ranked_bytes_per_ring_element((size_t)3U),
+ uint8_t, size_t, uint8_t[]),
+ public_key_serialized);
+ return Eurydice_array_eq((size_t)1184U, public_key, public_key_serialized,
+ uint8_t);
+}
+
+/**
+ Public key validation
+*/
+/**
+A monomorphic instance of
+libcrux_ml_kem.ind_cca.instantiations.portable.validate_public_key with const
+generics
+- K= 3
+- PUBLIC_KEY_SIZE= 1184
+*/
+static KRML_MUSTINLINE bool
+libcrux_ml_kem_ind_cca_instantiations_portable_validate_public_key_41(
+ uint8_t *public_key) {
+ return libcrux_ml_kem_ind_cca_validate_public_key_89(public_key);
+}
+
+/**
+ Validate a public key.
+
+ Returns `true` if valid, and `false` otherwise.
+*/
+static inline bool libcrux_ml_kem_mlkem768_portable_validate_public_key(
+ libcrux_ml_kem_types_MlKemPublicKey_30 *public_key) {
+ return libcrux_ml_kem_ind_cca_instantiations_portable_validate_public_key_41(
+ public_key->value);
+}
+
+/**
+A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.MlKemPublicKeyUnpacked
+with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
+with const generics
+- $3size_t
+*/
+typedef struct libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0_s {
+ libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0 ind_cpa_public_key;
+ uint8_t public_key_hash[32U];
+} libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0;
+
+typedef libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0
+ libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768PublicKeyUnpacked;
+
+/**
+A monomorphic instance of
+libcrux_ml_kem.ind_cca.unpacked.MlKemPrivateKeyUnpacked with types
+libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
+- $3size_t
+*/
+typedef struct libcrux_ml_kem_ind_cca_unpacked_MlKemPrivateKeyUnpacked_a0_s {
+ libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_a0
+ ind_cpa_private_key;
+ uint8_t implicit_rejection_value[32U];
+} libcrux_ml_kem_ind_cca_unpacked_MlKemPrivateKeyUnpacked_a0;
+
+typedef struct
+ libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked_s {
+ libcrux_ml_kem_ind_cca_unpacked_MlKemPrivateKeyUnpacked_a0 private_key;
+ libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 public_key;
+} libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked;
+
+/**
+A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.decapsulate
with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
-libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]],
-libcrux_ml_kem_variant_Kyber with const generics
+libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const
+generics
- K= 3
- SECRET_KEY_SIZE= 2400
- CPA_SECRET_KEY_SIZE= 1152
@@ -11682,85 +10790,69 @@ libcrux_ml_kem_variant_Kyber with const generics
- ETA2_RANDOMNESS_SIZE= 128
- IMPLICIT_REJECTION_HASH_INPUT_SIZE= 1120
*/
-static inline void libcrux_ml_kem_ind_cca_decapsulate_700(
- libcrux_ml_kem_types_MlKemPrivateKey_55 *private_key,
+static KRML_MUSTINLINE void libcrux_ml_kem_ind_cca_unpacked_decapsulate_51(
+ libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *key_pair,
libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext, uint8_t ret[32U]) {
- Eurydice_slice_uint8_t_x2 uu____0 = Eurydice_slice_split_at(
- Eurydice_array_to_slice((size_t)2400U, private_key->value, uint8_t),
- (size_t)1152U, uint8_t, Eurydice_slice_uint8_t_x2);
- Eurydice_slice ind_cpa_secret_key = uu____0.fst;
- Eurydice_slice secret_key0 = uu____0.snd;
- Eurydice_slice_uint8_t_x2 uu____1 = Eurydice_slice_split_at(
- secret_key0, (size_t)1184U, uint8_t, Eurydice_slice_uint8_t_x2);
- Eurydice_slice ind_cpa_public_key = uu____1.fst;
- Eurydice_slice secret_key = uu____1.snd;
- Eurydice_slice_uint8_t_x2 uu____2 = Eurydice_slice_split_at(
- secret_key, LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE, uint8_t,
- Eurydice_slice_uint8_t_x2);
- Eurydice_slice ind_cpa_public_key_hash = uu____2.fst;
- Eurydice_slice implicit_rejection_value = uu____2.snd;
uint8_t decrypted[32U];
- libcrux_ml_kem_ind_cpa_decrypt_43(ind_cpa_secret_key, ciphertext->value,
- decrypted);
+ libcrux_ml_kem_ind_cpa_decrypt_unpacked_42(
+ &key_pair->private_key.ind_cpa_private_key, ciphertext->value, decrypted);
uint8_t to_hash0[64U];
- libcrux_ml_kem_utils_into_padded_array_ea(
+ libcrux_ml_kem_utils_into_padded_array_24(
Eurydice_array_to_slice((size_t)32U, decrypted, uint8_t), to_hash0);
+ Eurydice_slice uu____0 = Eurydice_array_to_subslice_from(
+ (size_t)64U, to_hash0, LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE,
+ uint8_t, size_t, uint8_t[]);
Eurydice_slice_copy(
- Eurydice_array_to_subslice_from(
- (size_t)64U, to_hash0, LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE,
- uint8_t, size_t),
- ind_cpa_public_key_hash, uint8_t);
+ uu____0,
+ Eurydice_array_to_slice((size_t)32U, key_pair->public_key.public_key_hash,
+ uint8_t),
+ uint8_t);
uint8_t hashed[64U];
- libcrux_ml_kem_hash_functions_portable_G_f1_e4(
+ libcrux_ml_kem_hash_functions_portable_G_4a_e0(
Eurydice_array_to_slice((size_t)64U, to_hash0, uint8_t), hashed);
- Eurydice_slice_uint8_t_x2 uu____3 = Eurydice_slice_split_at(
+ Eurydice_slice_uint8_t_x2 uu____1 = Eurydice_slice_split_at(
Eurydice_array_to_slice((size_t)64U, hashed, uint8_t),
LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE, uint8_t,
Eurydice_slice_uint8_t_x2);
- Eurydice_slice shared_secret0 = uu____3.fst;
- Eurydice_slice pseudorandomness = uu____3.snd;
+ Eurydice_slice shared_secret = uu____1.fst;
+ Eurydice_slice pseudorandomness = uu____1.snd;
uint8_t to_hash[1120U];
- libcrux_ml_kem_utils_into_padded_array_ea0(implicit_rejection_value, to_hash);
- Eurydice_slice uu____4 = Eurydice_array_to_subslice_from(
+ libcrux_ml_kem_utils_into_padded_array_15(
+ Eurydice_array_to_slice(
+ (size_t)32U, key_pair->private_key.implicit_rejection_value, uint8_t),
+ to_hash);
+ Eurydice_slice uu____2 = Eurydice_array_to_subslice_from(
(size_t)1120U, to_hash, LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE,
- uint8_t, size_t);
- Eurydice_slice_copy(uu____4, libcrux_ml_kem_types_as_ref_00_24(ciphertext),
+ uint8_t, size_t, uint8_t[]);
+ Eurydice_slice_copy(uu____2, libcrux_ml_kem_types_as_ref_d3_80(ciphertext),
uint8_t);
- uint8_t implicit_rejection_shared_secret0[32U];
- libcrux_ml_kem_hash_functions_portable_PRF_f1_ee(
+ uint8_t implicit_rejection_shared_secret[32U];
+ libcrux_ml_kem_hash_functions_portable_PRF_4a_41(
Eurydice_array_to_slice((size_t)1120U, to_hash, uint8_t),
- implicit_rejection_shared_secret0);
- Eurydice_slice uu____5 = ind_cpa_public_key;
- /* Passing arrays by value in Rust generates a copy in C */
- uint8_t copy_of_decrypted[32U];
- memcpy(copy_of_decrypted, decrypted, (size_t)32U * sizeof(uint8_t));
+ implicit_rejection_shared_secret);
uint8_t expected_ciphertext[1088U];
- libcrux_ml_kem_ind_cpa_encrypt_60(uu____5, copy_of_decrypted,
- pseudorandomness, expected_ciphertext);
- uint8_t implicit_rejection_shared_secret[32U];
- libcrux_ml_kem_variant_kdf_33_f0(
- Eurydice_array_to_slice((size_t)32U, implicit_rejection_shared_secret0,
- uint8_t),
- ciphertext, implicit_rejection_shared_secret);
- uint8_t shared_secret[32U];
- libcrux_ml_kem_variant_kdf_33_f0(shared_secret0, ciphertext, shared_secret);
+ libcrux_ml_kem_ind_cpa_encrypt_unpacked_2a(
+ &key_pair->public_key.ind_cpa_public_key, decrypted, pseudorandomness,
+ expected_ciphertext);
+ uint8_t selector =
+ libcrux_ml_kem_constant_time_ops_compare_ciphertexts_in_constant_time(
+ libcrux_ml_kem_types_as_ref_d3_80(ciphertext),
+ Eurydice_array_to_slice((size_t)1088U, expected_ciphertext, uint8_t));
uint8_t ret0[32U];
- libcrux_ml_kem_constant_time_ops_compare_ciphertexts_select_shared_secret_in_constant_time(
- libcrux_ml_kem_types_as_ref_00_24(ciphertext),
- Eurydice_array_to_slice((size_t)1088U, expected_ciphertext, uint8_t),
- Eurydice_array_to_slice((size_t)32U, shared_secret, uint8_t),
+ libcrux_ml_kem_constant_time_ops_select_shared_secret_in_constant_time(
+ shared_secret,
Eurydice_array_to_slice((size_t)32U, implicit_rejection_shared_secret,
uint8_t),
- ret0);
+ selector, ret0);
memcpy(ret, ret0, (size_t)32U * sizeof(uint8_t));
}
/**
- Portable decapsulate
+ Unpacked decapsulate
*/
/**
A monomorphic instance of
-libcrux_ml_kem.ind_cca.instantiations.portable.kyber_decapsulate with const
+libcrux_ml_kem.ind_cca.instantiations.portable.unpacked.decapsulate with const
generics
- K= 3
- SECRET_KEY_SIZE= 2400
@@ -11779,47 +10871,54 @@ generics
- ETA2_RANDOMNESS_SIZE= 128
- IMPLICIT_REJECTION_HASH_INPUT_SIZE= 1120
*/
-static inline void
-libcrux_ml_kem_ind_cca_instantiations_portable_kyber_decapsulate_fc(
- libcrux_ml_kem_types_MlKemPrivateKey_55 *private_key,
+static KRML_MUSTINLINE void
+libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_decapsulate_35(
+ libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *key_pair,
libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext, uint8_t ret[32U]) {
- libcrux_ml_kem_ind_cca_decapsulate_700(private_key, ciphertext, ret);
+ libcrux_ml_kem_ind_cca_unpacked_decapsulate_51(key_pair, ciphertext, ret);
}
/**
- Decapsulate Kyber 768
+ Decapsulate ML-KEM 768 (unpacked)
Generates an [`MlKemSharedSecret`].
- The input is a reference to an [`MlKem768PrivateKey`] and an
- [`MlKem768Ciphertext`].
+ The input is a reference to an unpacked key pair of type
+ [`MlKem768KeyPairUnpacked`] and an [`MlKem768Ciphertext`].
*/
-static inline void libcrux_ml_kem_mlkem768_portable_kyber_decapsulate(
- libcrux_ml_kem_types_MlKemPrivateKey_55 *private_key,
+static inline void libcrux_ml_kem_mlkem768_portable_unpacked_decapsulate(
+ libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked
+ *private_key,
libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext, uint8_t ret[32U]) {
- libcrux_ml_kem_ind_cca_instantiations_portable_kyber_decapsulate_fc(
+ libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_decapsulate_35(
private_key, ciphertext, ret);
}
/**
-This function found in impl {(libcrux_ml_kem::variant::Variant for
-libcrux_ml_kem::variant::Kyber)}
-*/
-/**
-A monomorphic instance of libcrux_ml_kem.variant.entropy_preprocess_33
+A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.encaps_prepare
with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]]
with const generics
- K= 3
*/
-static KRML_MUSTINLINE void libcrux_ml_kem_variant_entropy_preprocess_33_8a(
- Eurydice_slice randomness, uint8_t ret[32U]) {
- libcrux_ml_kem_hash_functions_portable_H_f1_1a(randomness, ret);
+static inline void libcrux_ml_kem_ind_cca_unpacked_encaps_prepare_9c(
+ Eurydice_slice randomness, Eurydice_slice pk_hash, uint8_t ret[64U]) {
+ uint8_t to_hash[64U];
+ libcrux_ml_kem_utils_into_padded_array_24(randomness, to_hash);
+ Eurydice_slice_copy(
+ Eurydice_array_to_subslice_from((size_t)64U, to_hash,
+ LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE,
+ uint8_t, size_t, uint8_t[]),
+ pk_hash, uint8_t);
+ uint8_t ret0[64U];
+ libcrux_ml_kem_hash_functions_portable_G_4a_e0(
+ Eurydice_array_to_slice((size_t)64U, to_hash, uint8_t), ret0);
+ memcpy(ret, ret0, (size_t)64U * sizeof(uint8_t));
}
/**
-A monomorphic instance of libcrux_ml_kem.ind_cca.encapsulate
+A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.encapsulate
with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
-libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]],
-libcrux_ml_kem_variant_Kyber with const generics
+libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const
+generics
- K= 3
- CIPHERTEXT_SIZE= 1088
- PUBLIC_KEY_SIZE= 1184
@@ -11834,68 +10933,50 @@ libcrux_ml_kem_variant_Kyber with const generics
- ETA2= 2
- ETA2_RANDOMNESS_SIZE= 128
*/
-static inline tuple_3c libcrux_ml_kem_ind_cca_encapsulate_cd0(
- libcrux_ml_kem_types_MlKemPublicKey_15 *public_key,
- uint8_t randomness[32U]) {
- uint8_t randomness0[32U];
- libcrux_ml_kem_variant_entropy_preprocess_33_8a(
- Eurydice_array_to_slice((size_t)32U, randomness, uint8_t), randomness0);
- uint8_t to_hash[64U];
- libcrux_ml_kem_utils_into_padded_array_ea(
- Eurydice_array_to_slice((size_t)32U, randomness0, uint8_t), to_hash);
- Eurydice_slice uu____0 = Eurydice_array_to_subslice_from(
- (size_t)64U, to_hash, LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE, uint8_t,
- size_t);
- uint8_t ret[32U];
- libcrux_ml_kem_hash_functions_portable_H_f1_1a(
- Eurydice_array_to_slice((size_t)1184U,
- libcrux_ml_kem_types_as_slice_cb_50(public_key),
- uint8_t),
- ret);
- Eurydice_slice_copy(
- uu____0, Eurydice_array_to_slice((size_t)32U, ret, uint8_t), uint8_t);
+static KRML_MUSTINLINE tuple_c2 libcrux_ml_kem_ind_cca_unpacked_encapsulate_0c(
+ libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 *public_key,
+ uint8_t *randomness) {
uint8_t hashed[64U];
- libcrux_ml_kem_hash_functions_portable_G_f1_e4(
- Eurydice_array_to_slice((size_t)64U, to_hash, uint8_t), hashed);
- Eurydice_slice_uint8_t_x2 uu____1 = Eurydice_slice_split_at(
+ libcrux_ml_kem_ind_cca_unpacked_encaps_prepare_9c(
+ Eurydice_array_to_slice((size_t)32U, randomness, uint8_t),
+ Eurydice_array_to_slice((size_t)32U, public_key->public_key_hash,
+ uint8_t),
+ hashed);
+ Eurydice_slice_uint8_t_x2 uu____0 = Eurydice_slice_split_at(
Eurydice_array_to_slice((size_t)64U, hashed, uint8_t),
LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE, uint8_t,
Eurydice_slice_uint8_t_x2);
- Eurydice_slice shared_secret = uu____1.fst;
- Eurydice_slice pseudorandomness = uu____1.snd;
- Eurydice_slice uu____2 = Eurydice_array_to_slice(
- (size_t)1184U, libcrux_ml_kem_types_as_slice_cb_50(public_key), uint8_t);
- /* Passing arrays by value in Rust generates a copy in C */
- uint8_t copy_of_randomness[32U];
- memcpy(copy_of_randomness, randomness0, (size_t)32U * sizeof(uint8_t));
+ Eurydice_slice shared_secret = uu____0.fst;
+ Eurydice_slice pseudorandomness = uu____0.snd;
uint8_t ciphertext[1088U];
- libcrux_ml_kem_ind_cpa_encrypt_60(uu____2, copy_of_randomness,
- pseudorandomness, ciphertext);
+ libcrux_ml_kem_ind_cpa_encrypt_unpacked_2a(&public_key->ind_cpa_public_key,
+ randomness, pseudorandomness,
+ ciphertext);
+ uint8_t shared_secret_array[32U] = {0U};
+ Eurydice_slice_copy(
+ Eurydice_array_to_slice((size_t)32U, shared_secret_array, uint8_t),
+ shared_secret, uint8_t);
/* Passing arrays by value in Rust generates a copy in C */
uint8_t copy_of_ciphertext[1088U];
memcpy(copy_of_ciphertext, ciphertext, (size_t)1088U * sizeof(uint8_t));
- libcrux_ml_kem_mlkem768_MlKem768Ciphertext ciphertext0 =
- libcrux_ml_kem_types_from_01_9f(copy_of_ciphertext);
- uint8_t shared_secret_array[32U];
- libcrux_ml_kem_variant_kdf_33_f0(shared_secret, &ciphertext0,
- shared_secret_array);
- libcrux_ml_kem_mlkem768_MlKem768Ciphertext uu____5 = ciphertext0;
+ libcrux_ml_kem_mlkem768_MlKem768Ciphertext uu____2 =
+ libcrux_ml_kem_types_from_e0_80(copy_of_ciphertext);
/* Passing arrays by value in Rust generates a copy in C */
uint8_t copy_of_shared_secret_array[32U];
memcpy(copy_of_shared_secret_array, shared_secret_array,
(size_t)32U * sizeof(uint8_t));
- tuple_3c lit;
- lit.fst = uu____5;
+ tuple_c2 lit;
+ lit.fst = uu____2;
memcpy(lit.snd, copy_of_shared_secret_array, (size_t)32U * sizeof(uint8_t));
return lit;
}
/**
- Portable encapsulate
+ Unpacked encapsulate
*/
/**
A monomorphic instance of
-libcrux_ml_kem.ind_cca.instantiations.portable.kyber_encapsulate with const
+libcrux_ml_kem.ind_cca.instantiations.portable.unpacked.encapsulate with const
generics
- K= 3
- CIPHERTEXT_SIZE= 1088
@@ -11911,428 +10992,761 @@ generics
- ETA2= 2
- ETA2_RANDOMNESS_SIZE= 128
*/
-static inline tuple_3c
-libcrux_ml_kem_ind_cca_instantiations_portable_kyber_encapsulate_7a(
- libcrux_ml_kem_types_MlKemPublicKey_15 *public_key,
- uint8_t randomness[32U]) {
- libcrux_ml_kem_types_MlKemPublicKey_15 *uu____0 = public_key;
- /* Passing arrays by value in Rust generates a copy in C */
- uint8_t copy_of_randomness[32U];
- memcpy(copy_of_randomness, randomness, (size_t)32U * sizeof(uint8_t));
- return libcrux_ml_kem_ind_cca_encapsulate_cd0(uu____0, copy_of_randomness);
+static KRML_MUSTINLINE tuple_c2
+libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_encapsulate_cd(
+ libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 *public_key,
+ uint8_t *randomness) {
+ return libcrux_ml_kem_ind_cca_unpacked_encapsulate_0c(public_key, randomness);
}
/**
- Encapsulate Kyber 768
+ Encapsulate ML-KEM 768 (unpacked)
Generates an ([`MlKem768Ciphertext`], [`MlKemSharedSecret`]) tuple.
- The input is a reference to an [`MlKem768PublicKey`] and [`SHARED_SECRET_SIZE`]
- bytes of `randomness`.
+ The input is a reference to an unpacked public key of type
+ [`MlKem768PublicKeyUnpacked`], the SHA3-256 hash of this public key, and
+ [`SHARED_SECRET_SIZE`] bytes of `randomness`.
*/
-static inline tuple_3c libcrux_ml_kem_mlkem768_portable_kyber_encapsulate(
- libcrux_ml_kem_types_MlKemPublicKey_15 *public_key,
+static inline tuple_c2 libcrux_ml_kem_mlkem768_portable_unpacked_encapsulate(
+ libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 *public_key,
uint8_t randomness[32U]) {
- libcrux_ml_kem_types_MlKemPublicKey_15 *uu____0 = public_key;
- /* Passing arrays by value in Rust generates a copy in C */
- uint8_t copy_of_randomness[32U];
- memcpy(copy_of_randomness, randomness, (size_t)32U * sizeof(uint8_t));
- return libcrux_ml_kem_ind_cca_instantiations_portable_kyber_encapsulate_7a(
- uu____0, copy_of_randomness);
+ return libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_encapsulate_cd(
+ public_key, randomness);
}
/**
-This function found in impl {(libcrux_ml_kem::variant::Variant for
-libcrux_ml_kem::variant::Kyber)}
+This function found in impl {core::ops::function::FnMut<(usize),
+libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0,
+TraitClause@1]> for
+libcrux_ml_kem::ind_cca::unpacked::transpose_a::closure::closure<Vector,
+K>[TraitClause@0, TraitClause@1]}
*/
/**
-A monomorphic instance of libcrux_ml_kem.variant.cpa_keygen_seed_33
-with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]]
-with const generics
+A monomorphic instance of
+libcrux_ml_kem.ind_cca.unpacked.transpose_a.closure.call_mut_b4 with types
+libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
- K= 3
*/
-static KRML_MUSTINLINE void libcrux_ml_kem_variant_cpa_keygen_seed_33_b6(
- Eurydice_slice key_generation_seed, uint8_t ret[64U]) {
- libcrux_ml_kem_hash_functions_portable_G_f1_e4(key_generation_seed, ret);
+static inline libcrux_ml_kem_polynomial_PolynomialRingElement_1d
+libcrux_ml_kem_ind_cca_unpacked_transpose_a_closure_call_mut_b4_1b(
+ void **_, size_t tupled_args) {
+ return libcrux_ml_kem_polynomial_ZERO_d6_ea();
}
/**
-A monomorphic instance of libcrux_ml_kem.ind_cpa.generate_keypair
-with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
-libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]],
-libcrux_ml_kem_variant_Kyber with const generics
+This function found in impl {core::ops::function::FnMut<(usize),
+@Array<libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0,
+TraitClause@1], K>> for
+libcrux_ml_kem::ind_cca::unpacked::transpose_a::closure<Vector,
+K>[TraitClause@0, TraitClause@1]}
+*/
+/**
+A monomorphic instance of
+libcrux_ml_kem.ind_cca.unpacked.transpose_a.call_mut_7b with types
+libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
- K= 3
-- PRIVATE_KEY_SIZE= 1152
-- PUBLIC_KEY_SIZE= 1184
-- RANKED_BYTES_PER_RING_ELEMENT= 1152
-- ETA1= 2
-- ETA1_RANDOMNESS_SIZE= 128
*/
-static inline libcrux_ml_kem_utils_extraction_helper_Keypair768
-libcrux_ml_kem_ind_cpa_generate_keypair_fc0(
- Eurydice_slice key_generation_seed) {
- uint8_t hashed[64U];
- libcrux_ml_kem_variant_cpa_keygen_seed_33_b6(key_generation_seed, hashed);
- Eurydice_slice_uint8_t_x2 uu____0 = Eurydice_slice_split_at(
- Eurydice_array_to_slice((size_t)64U, hashed, uint8_t), (size_t)32U,
- uint8_t, Eurydice_slice_uint8_t_x2);
- Eurydice_slice seed_for_A0 = uu____0.fst;
- Eurydice_slice seed_for_secret_and_error = uu____0.snd;
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 A_transpose[3U][3U];
- uint8_t ret[34U];
- libcrux_ml_kem_utils_into_padded_array_ea1(seed_for_A0, ret);
- libcrux_ml_kem_matrix_sample_matrix_A_38(ret, true, A_transpose);
- uint8_t prf_input[33U];
- libcrux_ml_kem_utils_into_padded_array_ea2(seed_for_secret_and_error,
- prf_input);
- /* Passing arrays by value in Rust generates a copy in C */
- uint8_t copy_of_prf_input0[33U];
- memcpy(copy_of_prf_input0, prf_input, (size_t)33U * sizeof(uint8_t));
- tuple_b0 uu____2 = libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_fc(
- copy_of_prf_input0, 0U);
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 secret_as_ntt[3U];
- memcpy(
- secret_as_ntt, uu____2.fst,
- (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
- uint8_t domain_separator = uu____2.snd;
- /* Passing arrays by value in Rust generates a copy in C */
- uint8_t copy_of_prf_input[33U];
- memcpy(copy_of_prf_input, prf_input, (size_t)33U * sizeof(uint8_t));
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 error_as_ntt[3U];
- memcpy(
- error_as_ntt,
- libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_fc(copy_of_prf_input,
- domain_separator)
- .fst,
- (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 t_as_ntt[3U];
- libcrux_ml_kem_matrix_compute_As_plus_e_60(A_transpose, secret_as_ntt,
- error_as_ntt, t_as_ntt);
- uint8_t seed_for_A[32U];
- Result_00 dst;
- Eurydice_slice_to_array2(&dst, seed_for_A0, Eurydice_slice, uint8_t[32U]);
- unwrap_41_83(dst, seed_for_A);
- uint8_t public_key_serialized[1184U];
- libcrux_ml_kem_ind_cpa_serialize_public_key_79(
- t_as_ntt, Eurydice_array_to_slice((size_t)32U, seed_for_A, uint8_t),
- public_key_serialized);
- uint8_t secret_key_serialized[1152U];
- libcrux_ml_kem_ind_cpa_serialize_secret_key_b5(secret_as_ntt,
- secret_key_serialized);
- /* Passing arrays by value in Rust generates a copy in C */
- uint8_t copy_of_secret_key_serialized[1152U];
- memcpy(copy_of_secret_key_serialized, secret_key_serialized,
- (size_t)1152U * sizeof(uint8_t));
- /* Passing arrays by value in Rust generates a copy in C */
- uint8_t copy_of_public_key_serialized[1184U];
- memcpy(copy_of_public_key_serialized, public_key_serialized,
- (size_t)1184U * sizeof(uint8_t));
- libcrux_ml_kem_utils_extraction_helper_Keypair768 lit;
- memcpy(lit.fst, copy_of_secret_key_serialized,
- (size_t)1152U * sizeof(uint8_t));
- memcpy(lit.snd, copy_of_public_key_serialized,
- (size_t)1184U * sizeof(uint8_t));
- return lit;
+static inline void libcrux_ml_kem_ind_cca_unpacked_transpose_a_call_mut_7b_1b(
+ void **_, size_t tupled_args,
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d ret[3U]) {
+ for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
+ /* original Rust expression is not an lvalue in C */
+ void *lvalue = (void *)0U;
+ ret[i] = libcrux_ml_kem_ind_cca_unpacked_transpose_a_closure_call_mut_b4_1b(
+ &lvalue, i);
+ }
}
/**
- Packed API
+This function found in impl {core::clone::Clone for
+libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0,
+TraitClause@2]}
+*/
+/**
+A monomorphic instance of libcrux_ml_kem.polynomial.clone_c1
+with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
+with const generics
- Generate a key pair.
+*/
+static inline libcrux_ml_kem_polynomial_PolynomialRingElement_1d
+libcrux_ml_kem_polynomial_clone_c1_ea(
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d *self) {
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d lit;
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector ret[16U];
+ core_array__core__clone__Clone_for__Array_T__N___clone(
+ (size_t)16U, self->coefficients, ret,
+ libcrux_ml_kem_vector_portable_vector_type_PortableVector, void *);
+ memcpy(lit.coefficients, ret,
+ (size_t)16U *
+ sizeof(libcrux_ml_kem_vector_portable_vector_type_PortableVector));
+ return lit;
+}
- Depending on the `Vector` and `Hasher` used, this requires different hardware
- features
+/**
+A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.transpose_a
+with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
+with const generics
+- K= 3
*/
+static inline void libcrux_ml_kem_ind_cca_unpacked_transpose_a_1b(
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d ind_cpa_a[3U][3U],
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d ret[3U][3U]) {
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d A[3U][3U];
+ for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
+ /* original Rust expression is not an lvalue in C */
+ void *lvalue = (void *)0U;
+ libcrux_ml_kem_ind_cca_unpacked_transpose_a_call_mut_7b_1b(&lvalue, i,
+ A[i]);
+ }
+ for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
+ size_t i0 = i;
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d _a_i[3U][3U];
+ memcpy(_a_i, A,
+ (size_t)3U *
+ sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d[3U]));
+ for (size_t i1 = (size_t)0U; i1 < (size_t)3U; i1++) {
+ size_t j = i1;
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d uu____0 =
+ libcrux_ml_kem_polynomial_clone_c1_ea(&ind_cpa_a[j][i0]);
+ A[i0][j] = uu____0;
+ }
+ }
+ memcpy(ret, A,
+ (size_t)3U *
+ sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d[3U]));
+}
+
/**
-A monomorphic instance of libcrux_ml_kem.ind_cca.generate_keypair
+ Generate Unpacked Keys
+*/
+/**
+A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.generate_keypair
with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]],
-libcrux_ml_kem_variant_Kyber with const generics
+libcrux_ml_kem_variant_MlKem with const generics
- K= 3
- CPA_PRIVATE_KEY_SIZE= 1152
- PRIVATE_KEY_SIZE= 2400
- PUBLIC_KEY_SIZE= 1184
-- BYTES_PER_RING_ELEMENT= 1152
- ETA1= 2
- ETA1_RANDOMNESS_SIZE= 128
*/
-static inline libcrux_ml_kem_mlkem768_MlKem768KeyPair
-libcrux_ml_kem_ind_cca_generate_keypair_8c0(uint8_t randomness[64U]) {
- Eurydice_slice ind_cpa_keypair_randomness = Eurydice_array_to_subslice2(
+static KRML_MUSTINLINE void libcrux_ml_kem_ind_cca_unpacked_generate_keypair_15(
+ uint8_t randomness[64U],
+ libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *out) {
+ Eurydice_slice ind_cpa_keypair_randomness = Eurydice_array_to_subslice3(
randomness, (size_t)0U,
- LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE, uint8_t);
+ LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE, uint8_t *);
Eurydice_slice implicit_rejection_value = Eurydice_array_to_subslice_from(
(size_t)64U, randomness,
LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE, uint8_t,
- size_t);
- libcrux_ml_kem_utils_extraction_helper_Keypair768 uu____0 =
- libcrux_ml_kem_ind_cpa_generate_keypair_fc0(ind_cpa_keypair_randomness);
- uint8_t ind_cpa_private_key[1152U];
- memcpy(ind_cpa_private_key, uu____0.fst, (size_t)1152U * sizeof(uint8_t));
- uint8_t public_key[1184U];
- memcpy(public_key, uu____0.snd, (size_t)1184U * sizeof(uint8_t));
- uint8_t secret_key_serialized[2400U];
- libcrux_ml_kem_ind_cca_serialize_kem_secret_key_48(
- Eurydice_array_to_slice((size_t)1152U, ind_cpa_private_key, uint8_t),
- Eurydice_array_to_slice((size_t)1184U, public_key, uint8_t),
- implicit_rejection_value, secret_key_serialized);
- /* Passing arrays by value in Rust generates a copy in C */
- uint8_t copy_of_secret_key_serialized[2400U];
- memcpy(copy_of_secret_key_serialized, secret_key_serialized,
- (size_t)2400U * sizeof(uint8_t));
- libcrux_ml_kem_types_MlKemPrivateKey_55 private_key =
- libcrux_ml_kem_types_from_05_f2(copy_of_secret_key_serialized);
- libcrux_ml_kem_types_MlKemPrivateKey_55 uu____2 = private_key;
- /* Passing arrays by value in Rust generates a copy in C */
- uint8_t copy_of_public_key[1184U];
- memcpy(copy_of_public_key, public_key, (size_t)1184U * sizeof(uint8_t));
- return libcrux_ml_kem_types_from_17_35(
- uu____2, libcrux_ml_kem_types_from_b6_da(copy_of_public_key));
+ size_t, uint8_t[]);
+ libcrux_ml_kem_ind_cpa_generate_keypair_unpacked_1c(
+ ind_cpa_keypair_randomness, &out->private_key.ind_cpa_private_key,
+ &out->public_key.ind_cpa_public_key);
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d uu____0[3U][3U];
+ memcpy(uu____0, out->public_key.ind_cpa_public_key.A,
+ (size_t)3U *
+ sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d[3U]));
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d A[3U][3U];
+ libcrux_ml_kem_ind_cca_unpacked_transpose_a_1b(uu____0, A);
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d uu____1[3U][3U];
+ memcpy(uu____1, A,
+ (size_t)3U *
+ sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d[3U]));
+ memcpy(out->public_key.ind_cpa_public_key.A, uu____1,
+ (size_t)3U *
+ sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d[3U]));
+ uint8_t pk_serialized[1184U];
+ libcrux_ml_kem_ind_cpa_serialize_public_key_89(
+ out->public_key.ind_cpa_public_key.t_as_ntt,
+ Eurydice_array_to_slice(
+ (size_t)32U, out->public_key.ind_cpa_public_key.seed_for_A, uint8_t),
+ pk_serialized);
+ uint8_t uu____2[32U];
+ libcrux_ml_kem_hash_functions_portable_H_4a_e0(
+ Eurydice_array_to_slice((size_t)1184U, pk_serialized, uint8_t), uu____2);
+ memcpy(out->public_key.public_key_hash, uu____2,
+ (size_t)32U * sizeof(uint8_t));
+ uint8_t uu____3[32U];
+ Result_fb dst;
+ Eurydice_slice_to_array2(&dst, implicit_rejection_value, Eurydice_slice,
+ uint8_t[32U], TryFromSliceError);
+ unwrap_26_b3(dst, uu____3);
+ memcpy(out->private_key.implicit_rejection_value, uu____3,
+ (size_t)32U * sizeof(uint8_t));
}
/**
+ Generate a key pair
+*/
+/**
A monomorphic instance of
-libcrux_ml_kem.ind_cca.instantiations.portable.kyber_generate_keypair with const
-generics
+libcrux_ml_kem.ind_cca.instantiations.portable.unpacked.generate_keypair with
+const generics
- K= 3
- CPA_PRIVATE_KEY_SIZE= 1152
- PRIVATE_KEY_SIZE= 2400
- PUBLIC_KEY_SIZE= 1184
-- BYTES_PER_RING_ELEMENT= 1152
- ETA1= 2
- ETA1_RANDOMNESS_SIZE= 128
*/
-static inline libcrux_ml_kem_mlkem768_MlKem768KeyPair
-libcrux_ml_kem_ind_cca_instantiations_portable_kyber_generate_keypair_9b(
- uint8_t randomness[64U]) {
+static KRML_MUSTINLINE void
+libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_generate_keypair_ce(
+ uint8_t randomness[64U],
+ libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *out) {
/* Passing arrays by value in Rust generates a copy in C */
uint8_t copy_of_randomness[64U];
memcpy(copy_of_randomness, randomness, (size_t)64U * sizeof(uint8_t));
- return libcrux_ml_kem_ind_cca_generate_keypair_8c0(copy_of_randomness);
+ libcrux_ml_kem_ind_cca_unpacked_generate_keypair_15(copy_of_randomness, out);
}
/**
- Generate Kyber 768 Key Pair
+ Generate ML-KEM 768 Key Pair in "unpacked" form.
*/
-static inline libcrux_ml_kem_mlkem768_MlKem768KeyPair
-libcrux_ml_kem_mlkem768_portable_kyber_generate_key_pair(
- uint8_t randomness[64U]) {
+static inline void
+libcrux_ml_kem_mlkem768_portable_unpacked_generate_key_pair_mut(
+ uint8_t randomness[64U],
+ libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked
+ *key_pair) {
/* Passing arrays by value in Rust generates a copy in C */
uint8_t copy_of_randomness[64U];
memcpy(copy_of_randomness, randomness, (size_t)64U * sizeof(uint8_t));
- return libcrux_ml_kem_ind_cca_instantiations_portable_kyber_generate_keypair_9b(
- copy_of_randomness);
+ libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_generate_keypair_ce(
+ copy_of_randomness, key_pair);
}
/**
- Validate an ML-KEM private key.
+This function found in impl {core::default::Default for
+libcrux_ml_kem::ind_cca::unpacked::MlKemPublicKeyUnpacked<Vector,
+K>[TraitClause@0, TraitClause@1]}
+*/
+/**
+A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.default_30
+with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
+with const generics
+- K= 3
+*/
+static KRML_MUSTINLINE libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0
+libcrux_ml_kem_ind_cca_unpacked_default_30_1b(void) {
+ return (
+ KRML_CLITERAL(libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0){
+ .ind_cpa_public_key = libcrux_ml_kem_ind_cpa_unpacked_default_8b_1b(),
+ .public_key_hash = {0U}});
+}
- This implements the Hash check in 7.3 3.
- Note that the size checks in 7.2 1 and 2 are covered by the `SECRET_KEY_SIZE`
- and `CIPHERTEXT_SIZE` in the `private_key` and `ciphertext` types.
+/**
+This function found in impl {core::default::Default for
+libcrux_ml_kem::ind_cca::unpacked::MlKemKeyPairUnpacked<Vector,
+K>[TraitClause@0, TraitClause@1]}
*/
/**
-A monomorphic instance of libcrux_ml_kem.ind_cca.validate_private_key
-with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]]
+A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.default_7b
+with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
+with const generics
+- K= 3
+*/
+static KRML_MUSTINLINE
+ libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked
+ libcrux_ml_kem_ind_cca_unpacked_default_7b_1b(void) {
+ libcrux_ml_kem_ind_cca_unpacked_MlKemPrivateKeyUnpacked_a0 uu____0 = {
+ .ind_cpa_private_key = libcrux_ml_kem_ind_cpa_unpacked_default_70_1b(),
+ .implicit_rejection_value = {0U}};
+ return (KRML_CLITERAL(
+ libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked){
+ .private_key = uu____0,
+ .public_key = libcrux_ml_kem_ind_cca_unpacked_default_30_1b()});
+}
+
+/**
+ Generate ML-KEM 768 Key Pair in "unpacked" form.
+*/
+static inline libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked
+libcrux_ml_kem_mlkem768_portable_unpacked_generate_key_pair(
+ uint8_t randomness[64U]) {
+ libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked key_pair =
+ libcrux_ml_kem_ind_cca_unpacked_default_7b_1b();
+ uint8_t uu____0[64U];
+ memcpy(uu____0, randomness, (size_t)64U * sizeof(uint8_t));
+ libcrux_ml_kem_mlkem768_portable_unpacked_generate_key_pair_mut(uu____0,
+ &key_pair);
+ return key_pair;
+}
+
+/**
+ Create a new, empty unpacked key.
+*/
+static inline libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked
+libcrux_ml_kem_mlkem768_portable_unpacked_init_key_pair(void) {
+ return libcrux_ml_kem_ind_cca_unpacked_default_7b_1b();
+}
+
+/**
+ Create a new, empty unpacked public key.
+*/
+static inline libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0
+libcrux_ml_kem_mlkem768_portable_unpacked_init_public_key(void) {
+ return libcrux_ml_kem_ind_cca_unpacked_default_30_1b();
+}
+
+/**
+ Take a serialized private key and generate an unpacked key pair from it.
+*/
+/**
+A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.keys_from_private_key
+with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
with const generics
- K= 3
- SECRET_KEY_SIZE= 2400
-- CIPHERTEXT_SIZE= 1088
+- CPA_SECRET_KEY_SIZE= 1152
+- PUBLIC_KEY_SIZE= 1184
+- T_AS_NTT_ENCODED_SIZE= 1152
*/
-static KRML_MUSTINLINE bool libcrux_ml_kem_ind_cca_validate_private_key_e7(
- libcrux_ml_kem_types_MlKemPrivateKey_55 *private_key,
- libcrux_ml_kem_mlkem768_MlKem768Ciphertext *_ciphertext) {
- uint8_t t[32U];
- libcrux_ml_kem_hash_functions_portable_H_f1_1a(
- Eurydice_array_to_subslice2(private_key->value, (size_t)384U * (size_t)3U,
- (size_t)768U * (size_t)3U + (size_t)32U,
- uint8_t),
- t);
- Eurydice_slice expected = Eurydice_array_to_subslice2(
- private_key->value, (size_t)768U * (size_t)3U + (size_t)32U,
- (size_t)768U * (size_t)3U + (size_t)64U, uint8_t);
- return core_array_equality___core__cmp__PartialEq__0___Slice_U____for__Array_T__N___3__eq(
- (size_t)32U, t, &expected, uint8_t, uint8_t, bool);
+static KRML_MUSTINLINE void
+libcrux_ml_kem_ind_cca_unpacked_keys_from_private_key_42(
+ libcrux_ml_kem_types_MlKemPrivateKey_d9 *private_key,
+ libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked
+ *key_pair) {
+ Eurydice_slice_uint8_t_x4 uu____0 =
+ libcrux_ml_kem_types_unpack_private_key_b4(
+ Eurydice_array_to_slice((size_t)2400U, private_key->value, uint8_t));
+ Eurydice_slice ind_cpa_secret_key = uu____0.fst;
+ Eurydice_slice ind_cpa_public_key = uu____0.snd;
+ Eurydice_slice ind_cpa_public_key_hash = uu____0.thd;
+ Eurydice_slice implicit_rejection_value = uu____0.f3;
+ libcrux_ml_kem_ind_cpa_deserialize_vector_1b(
+ ind_cpa_secret_key,
+ key_pair->private_key.ind_cpa_private_key.secret_as_ntt);
+ libcrux_ml_kem_ind_cpa_build_unpacked_public_key_mut_3f(
+ ind_cpa_public_key, &key_pair->public_key.ind_cpa_public_key);
+ Eurydice_slice_copy(
+ Eurydice_array_to_slice((size_t)32U, key_pair->public_key.public_key_hash,
+ uint8_t),
+ ind_cpa_public_key_hash, uint8_t);
+ Eurydice_slice_copy(
+ Eurydice_array_to_slice(
+ (size_t)32U, key_pair->private_key.implicit_rejection_value, uint8_t),
+ implicit_rejection_value, uint8_t);
+ Eurydice_slice_copy(
+ Eurydice_array_to_slice(
+ (size_t)32U, key_pair->public_key.ind_cpa_public_key.seed_for_A,
+ uint8_t),
+ Eurydice_slice_subslice_from(ind_cpa_public_key, (size_t)1152U, uint8_t,
+ size_t, uint8_t[]),
+ uint8_t);
}
/**
- Portable private key validation
+ Take a serialized private key and generate an unpacked key pair from it.
*/
/**
A monomorphic instance of
-libcrux_ml_kem.ind_cca.instantiations.portable.validate_private_key with const
-generics
+libcrux_ml_kem.ind_cca.instantiations.portable.unpacked.keypair_from_private_key
+with const generics
- K= 3
- SECRET_KEY_SIZE= 2400
-- CIPHERTEXT_SIZE= 1088
+- CPA_SECRET_KEY_SIZE= 1152
+- PUBLIC_KEY_SIZE= 1184
+- T_AS_NTT_ENCODED_SIZE= 1152
*/
-static KRML_MUSTINLINE bool
-libcrux_ml_kem_ind_cca_instantiations_portable_validate_private_key_9c(
- libcrux_ml_kem_types_MlKemPrivateKey_55 *private_key,
- libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext) {
- return libcrux_ml_kem_ind_cca_validate_private_key_e7(private_key,
- ciphertext);
+static KRML_MUSTINLINE void
+libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_keypair_from_private_key_fd(
+ libcrux_ml_kem_types_MlKemPrivateKey_d9 *private_key,
+ libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked
+ *key_pair) {
+ libcrux_ml_kem_ind_cca_unpacked_keys_from_private_key_42(private_key,
+ key_pair);
}
/**
- Validate a private key.
-
- Returns `true` if valid, and `false` otherwise.
+ Get an unpacked key from a private key.
*/
-static inline bool libcrux_ml_kem_mlkem768_portable_validate_private_key(
- libcrux_ml_kem_types_MlKemPrivateKey_55 *private_key,
- libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext) {
- return libcrux_ml_kem_ind_cca_instantiations_portable_validate_private_key_9c(
- private_key, ciphertext);
+static inline void
+libcrux_ml_kem_mlkem768_portable_unpacked_key_pair_from_private_mut(
+ libcrux_ml_kem_types_MlKemPrivateKey_d9 *private_key,
+ libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked
+ *key_pair) {
+ libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_keypair_from_private_key_fd(
+ private_key, key_pair);
}
/**
+This function found in impl
+{libcrux_ml_kem::ind_cca::unpacked::MlKemKeyPairUnpacked<Vector,
+K>[TraitClause@0, TraitClause@1]}
+*/
+/**
A monomorphic instance of
-libcrux_ml_kem.serialize.deserialize_ring_elements_reduced.closure with types
+libcrux_ml_kem.ind_cca.unpacked.serialized_private_key_mut_11 with types
libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
+- K= 3
+- CPA_PRIVATE_KEY_SIZE= 1152
+- PRIVATE_KEY_SIZE= 2400
- PUBLIC_KEY_SIZE= 1184
+*/
+static KRML_MUSTINLINE void
+libcrux_ml_kem_ind_cca_unpacked_serialized_private_key_mut_11_43(
+ libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *self,
+ libcrux_ml_kem_types_MlKemPrivateKey_d9 *serialized) {
+ libcrux_ml_kem_utils_extraction_helper_Keypair768 uu____0 =
+ libcrux_ml_kem_ind_cpa_serialize_unpacked_secret_key_6c(
+ &self->public_key.ind_cpa_public_key,
+ &self->private_key.ind_cpa_private_key);
+ uint8_t ind_cpa_private_key[1152U];
+ memcpy(ind_cpa_private_key, uu____0.fst, (size_t)1152U * sizeof(uint8_t));
+ uint8_t ind_cpa_public_key[1184U];
+ memcpy(ind_cpa_public_key, uu____0.snd, (size_t)1184U * sizeof(uint8_t));
+ libcrux_ml_kem_ind_cca_serialize_kem_secret_key_mut_d6(
+ Eurydice_array_to_slice((size_t)1152U, ind_cpa_private_key, uint8_t),
+ Eurydice_array_to_slice((size_t)1184U, ind_cpa_public_key, uint8_t),
+ Eurydice_array_to_slice(
+ (size_t)32U, self->private_key.implicit_rejection_value, uint8_t),
+ serialized->value);
+}
+
+/**
+This function found in impl
+{libcrux_ml_kem::ind_cca::unpacked::MlKemKeyPairUnpacked<Vector,
+K>[TraitClause@0, TraitClause@1]}
+*/
+/**
+A monomorphic instance of
+libcrux_ml_kem.ind_cca.unpacked.serialized_private_key_11 with types
+libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
- K= 3
+- CPA_PRIVATE_KEY_SIZE= 1152
+- PRIVATE_KEY_SIZE= 2400
+- PUBLIC_KEY_SIZE= 1184
*/
-static inline libcrux_ml_kem_polynomial_PolynomialRingElement_f0
-libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_closure_cd0(
- size_t _i) {
- return libcrux_ml_kem_polynomial_ZERO_89_ea();
+static KRML_MUSTINLINE libcrux_ml_kem_types_MlKemPrivateKey_d9
+libcrux_ml_kem_ind_cca_unpacked_serialized_private_key_11_43(
+ libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *self) {
+ libcrux_ml_kem_types_MlKemPrivateKey_d9 sk =
+ libcrux_ml_kem_types_default_d3_28();
+ libcrux_ml_kem_ind_cca_unpacked_serialized_private_key_mut_11_43(self, &sk);
+ return sk;
}
/**
- This function deserializes ring elements and reduces the result by the field
- modulus.
+ Get the serialized private key.
+*/
+static inline libcrux_ml_kem_types_MlKemPrivateKey_d9
+libcrux_ml_kem_mlkem768_portable_unpacked_key_pair_serialized_private_key(
+ libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked
+ *key_pair) {
+ return libcrux_ml_kem_ind_cca_unpacked_serialized_private_key_11_43(key_pair);
+}
- This function MUST NOT be used on secret inputs.
+/**
+ Get the serialized private key.
+*/
+static inline void
+libcrux_ml_kem_mlkem768_portable_unpacked_key_pair_serialized_private_key_mut(
+ libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *key_pair,
+ libcrux_ml_kem_types_MlKemPrivateKey_d9 *serialized) {
+ libcrux_ml_kem_ind_cca_unpacked_serialized_private_key_mut_11_43(key_pair,
+ serialized);
+}
+
+/**
+This function found in impl
+{libcrux_ml_kem::ind_cca::unpacked::MlKemPublicKeyUnpacked<Vector,
+K>[TraitClause@0, TraitClause@1]}
+*/
+/**
+A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.serialized_dd
+with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
+with const generics
+- K= 3
+- PUBLIC_KEY_SIZE= 1184
+*/
+static KRML_MUSTINLINE libcrux_ml_kem_types_MlKemPublicKey_30
+libcrux_ml_kem_ind_cca_unpacked_serialized_dd_89(
+ libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 *self) {
+ uint8_t ret[1184U];
+ libcrux_ml_kem_ind_cpa_serialize_public_key_89(
+ self->ind_cpa_public_key.t_as_ntt,
+ Eurydice_array_to_slice((size_t)32U, self->ind_cpa_public_key.seed_for_A,
+ uint8_t),
+ ret);
+ return libcrux_ml_kem_types_from_fd_d0(ret);
+}
+
+/**
+This function found in impl
+{libcrux_ml_kem::ind_cca::unpacked::MlKemKeyPairUnpacked<Vector,
+K>[TraitClause@0, TraitClause@1]}
*/
/**
A monomorphic instance of
-libcrux_ml_kem.serialize.deserialize_ring_elements_reduced with types
+libcrux_ml_kem.ind_cca.unpacked.serialized_public_key_11 with types
libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
-- PUBLIC_KEY_SIZE= 1184
- K= 3
+- PUBLIC_KEY_SIZE= 1184
*/
-static KRML_MUSTINLINE void
-libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_330(
- Eurydice_slice public_key,
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret[3U]) {
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 deserialized_pk[3U];
- for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
- deserialized_pk[i] = libcrux_ml_kem_polynomial_ZERO_89_ea();
- }
- for (size_t i = (size_t)0U;
- i < Eurydice_slice_len(public_key, uint8_t) /
- LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT;
- i++) {
- size_t i0 = i;
- Eurydice_slice ring_element = Eurydice_slice_subslice2(
- public_key, i0 * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT,
- i0 * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT +
- LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT,
- uint8_t);
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 uu____0 =
- libcrux_ml_kem_serialize_deserialize_to_reduced_ring_element_4c(
- ring_element);
- deserialized_pk[i0] = uu____0;
- }
- memcpy(
- ret, deserialized_pk,
- (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
+static KRML_MUSTINLINE libcrux_ml_kem_types_MlKemPublicKey_30
+libcrux_ml_kem_ind_cca_unpacked_serialized_public_key_11_89(
+ libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *self) {
+ return libcrux_ml_kem_ind_cca_unpacked_serialized_dd_89(&self->public_key);
}
/**
- Validate an ML-KEM public key.
+ Get the serialized public key.
+*/
+static inline libcrux_ml_kem_types_MlKemPublicKey_30
+libcrux_ml_kem_mlkem768_portable_unpacked_key_pair_serialized_public_key(
+ libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked
+ *key_pair) {
+ return libcrux_ml_kem_ind_cca_unpacked_serialized_public_key_11_89(key_pair);
+}
- This implements the Modulus check in 7.2 2.
- Note that the size check in 7.2 1 is covered by the `PUBLIC_KEY_SIZE` in the
- `public_key` type.
+/**
+This function found in impl
+{libcrux_ml_kem::ind_cca::unpacked::MlKemPublicKeyUnpacked<Vector,
+K>[TraitClause@0, TraitClause@1]}
*/
/**
-A monomorphic instance of libcrux_ml_kem.ind_cca.validate_public_key
+A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.serialized_mut_dd
with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
with const generics
- K= 3
-- RANKED_BYTES_PER_RING_ELEMENT= 1152
- PUBLIC_KEY_SIZE= 1184
*/
-static KRML_MUSTINLINE bool libcrux_ml_kem_ind_cca_validate_public_key_19(
- uint8_t *public_key) {
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 deserialized_pk[3U];
- libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_330(
- Eurydice_array_to_subslice_to((size_t)1184U, public_key, (size_t)1152U,
- uint8_t, size_t),
- deserialized_pk);
- libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *uu____0 = deserialized_pk;
- uint8_t public_key_serialized[1184U];
- libcrux_ml_kem_ind_cpa_serialize_public_key_79(
- uu____0,
- Eurydice_array_to_subslice_from((size_t)1184U, public_key, (size_t)1152U,
- uint8_t, size_t),
- public_key_serialized);
- return core_array_equality___core__cmp__PartialEq__Array_U__N___for__Array_T__N____eq(
- (size_t)1184U, public_key, public_key_serialized, uint8_t, uint8_t, bool);
+static KRML_MUSTINLINE void
+libcrux_ml_kem_ind_cca_unpacked_serialized_mut_dd_89(
+ libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 *self,
+ libcrux_ml_kem_types_MlKemPublicKey_30 *serialized) {
+ libcrux_ml_kem_ind_cpa_serialize_public_key_mut_89(
+ self->ind_cpa_public_key.t_as_ntt,
+ Eurydice_array_to_slice((size_t)32U, self->ind_cpa_public_key.seed_for_A,
+ uint8_t),
+ serialized->value);
}
/**
- Portable public key validation
+This function found in impl
+{libcrux_ml_kem::ind_cca::unpacked::MlKemKeyPairUnpacked<Vector,
+K>[TraitClause@0, TraitClause@1]}
*/
/**
A monomorphic instance of
-libcrux_ml_kem.ind_cca.instantiations.portable.validate_public_key with const
-generics
+libcrux_ml_kem.ind_cca.unpacked.serialized_public_key_mut_11 with types
+libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
- K= 3
-- RANKED_BYTES_PER_RING_ELEMENT= 1152
- PUBLIC_KEY_SIZE= 1184
*/
-static KRML_MUSTINLINE bool
-libcrux_ml_kem_ind_cca_instantiations_portable_validate_public_key_4b(
- uint8_t *public_key) {
- return libcrux_ml_kem_ind_cca_validate_public_key_19(public_key);
+static KRML_MUSTINLINE void
+libcrux_ml_kem_ind_cca_unpacked_serialized_public_key_mut_11_89(
+ libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *self,
+ libcrux_ml_kem_types_MlKemPublicKey_30 *serialized) {
+ libcrux_ml_kem_ind_cca_unpacked_serialized_mut_dd_89(&self->public_key,
+ serialized);
}
/**
- Validate a public key.
+ Get the serialized public key.
+*/
+static inline void
+libcrux_ml_kem_mlkem768_portable_unpacked_key_pair_serialized_public_key_mut(
+ libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *key_pair,
+ libcrux_ml_kem_types_MlKemPublicKey_30 *serialized) {
+ libcrux_ml_kem_ind_cca_unpacked_serialized_public_key_mut_11_89(key_pair,
+ serialized);
+}
- Returns `true` if valid, and `false` otherwise.
+/**
+This function found in impl {core::clone::Clone for
+libcrux_ml_kem::ind_cpa::unpacked::IndCpaPublicKeyUnpacked<Vector,
+K>[TraitClause@0, TraitClause@2]}
*/
-static inline bool libcrux_ml_kem_mlkem768_portable_validate_public_key(
- libcrux_ml_kem_types_MlKemPublicKey_15 *public_key) {
- return libcrux_ml_kem_ind_cca_instantiations_portable_validate_public_key_4b(
- public_key->value);
+/**
+A monomorphic instance of libcrux_ml_kem.ind_cpa.unpacked.clone_91
+with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
+with const generics
+- K= 3
+*/
+static inline libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0
+libcrux_ml_kem_ind_cpa_unpacked_clone_91_1b(
+ libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0 *self) {
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d uu____0[3U];
+ core_array__core__clone__Clone_for__Array_T__N___clone(
+ (size_t)3U, self->t_as_ntt, uu____0,
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d, void *);
+ uint8_t uu____1[32U];
+ core_array__core__clone__Clone_for__Array_T__N___clone(
+ (size_t)32U, self->seed_for_A, uu____1, uint8_t, void *);
+ libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0 lit;
+ memcpy(
+ lit.t_as_ntt, uu____0,
+ (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d));
+ memcpy(lit.seed_for_A, uu____1, (size_t)32U * sizeof(uint8_t));
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d ret[3U][3U];
+ core_array__core__clone__Clone_for__Array_T__N___clone(
+ (size_t)3U, self->A, ret,
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d[3U], void *);
+ memcpy(lit.A, ret,
+ (size_t)3U *
+ sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d[3U]));
+ return lit;
}
/**
-This function found in impl {(core::clone::Clone for
-libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
+This function found in impl {core::clone::Clone for
+libcrux_ml_kem::ind_cca::unpacked::MlKemPublicKeyUnpacked<Vector,
+K>[TraitClause@0, TraitClause@2]}
*/
-static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
-libcrux_ml_kem_vector_portable_vector_type_clone_3b(
- libcrux_ml_kem_vector_portable_vector_type_PortableVector *self) {
- return self[0U];
+/**
+A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.clone_d7
+with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
+with const generics
+- K= 3
+*/
+static inline libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0
+libcrux_ml_kem_ind_cca_unpacked_clone_d7_1b(
+ libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 *self) {
+ libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 lit;
+ lit.ind_cpa_public_key =
+ libcrux_ml_kem_ind_cpa_unpacked_clone_91_1b(&self->ind_cpa_public_key);
+ uint8_t ret[32U];
+ core_array__core__clone__Clone_for__Array_T__N___clone(
+ (size_t)32U, self->public_key_hash, ret, uint8_t, void *);
+ memcpy(lit.public_key_hash, ret, (size_t)32U * sizeof(uint8_t));
+ return lit;
}
-typedef int16_t libcrux_ml_kem_vector_portable_vector_type_FieldElement;
+/**
+This function found in impl
+{libcrux_ml_kem::ind_cca::unpacked::MlKemKeyPairUnpacked<Vector,
+K>[TraitClause@0, TraitClause@1]}
+*/
+/**
+A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.public_key_11
+with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
+with const generics
+- K= 3
+*/
+static KRML_MUSTINLINE libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 *
+libcrux_ml_kem_ind_cca_unpacked_public_key_11_1b(
+ libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *self) {
+ return &self->public_key;
+}
-typedef int16_t
- libcrux_ml_kem_vector_portable_arithmetic_MontgomeryFieldElement;
+/**
+ Get the unpacked public key.
+*/
+static inline void libcrux_ml_kem_mlkem768_portable_unpacked_public_key(
+ libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *key_pair,
+ libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 *pk) {
+ libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 uu____0 =
+ libcrux_ml_kem_ind_cca_unpacked_clone_d7_1b(
+ libcrux_ml_kem_ind_cca_unpacked_public_key_11_1b(key_pair));
+ pk[0U] = uu____0;
+}
-typedef int16_t
- libcrux_ml_kem_vector_portable_arithmetic_FieldElementTimesMontgomeryR;
+/**
+ Get the serialized public key.
+*/
+static inline void
+libcrux_ml_kem_mlkem768_portable_unpacked_serialized_public_key(
+ libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 *public_key,
+ libcrux_ml_kem_types_MlKemPublicKey_30 *serialized) {
+ libcrux_ml_kem_ind_cca_unpacked_serialized_mut_dd_89(public_key, serialized);
+}
+
+/**
+ Generate an unpacked key from a serialized key.
+*/
+/**
+A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.unpack_public_key
+with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]],
+libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
+- K= 3
+- T_AS_NTT_ENCODED_SIZE= 1152
+- PUBLIC_KEY_SIZE= 1184
+*/
+static KRML_MUSTINLINE void
+libcrux_ml_kem_ind_cca_unpacked_unpack_public_key_0a(
+ libcrux_ml_kem_types_MlKemPublicKey_30 *public_key,
+ libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0
+ *unpacked_public_key) {
+ Eurydice_slice uu____0 =
+ Eurydice_array_to_subslice_to((size_t)1184U, public_key->value,
+ (size_t)1152U, uint8_t, size_t, uint8_t[]);
+ libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_1b(
+ uu____0, unpacked_public_key->ind_cpa_public_key.t_as_ntt);
+ uint8_t uu____1[32U];
+ libcrux_ml_kem_utils_into_padded_array_9e(
+ Eurydice_array_to_subslice_from((size_t)1184U, public_key->value,
+ (size_t)1152U, uint8_t, size_t,
+ uint8_t[]),
+ uu____1);
+ memcpy(unpacked_public_key->ind_cpa_public_key.seed_for_A, uu____1,
+ (size_t)32U * sizeof(uint8_t));
+ libcrux_ml_kem_polynomial_PolynomialRingElement_1d(*uu____2)[3U] =
+ unpacked_public_key->ind_cpa_public_key.A;
+ uint8_t ret[34U];
+ libcrux_ml_kem_utils_into_padded_array_b6(
+ Eurydice_array_to_subslice_from((size_t)1184U, public_key->value,
+ (size_t)1152U, uint8_t, size_t,
+ uint8_t[]),
+ ret);
+ libcrux_ml_kem_matrix_sample_matrix_A_2b(uu____2, ret, false);
+ uint8_t uu____3[32U];
+ libcrux_ml_kem_hash_functions_portable_H_4a_e0(
+ Eurydice_array_to_slice((size_t)1184U,
+ libcrux_ml_kem_types_as_slice_e6_d0(public_key),
+ uint8_t),
+ uu____3);
+ memcpy(unpacked_public_key->public_key_hash, uu____3,
+ (size_t)32U * sizeof(uint8_t));
+}
+
+/**
+ Get the unpacked public key.
+*/
+/**
+A monomorphic instance of
+libcrux_ml_kem.ind_cca.instantiations.portable.unpacked.unpack_public_key with
+const generics
+- K= 3
+- T_AS_NTT_ENCODED_SIZE= 1152
+- PUBLIC_KEY_SIZE= 1184
+*/
+static KRML_MUSTINLINE void
+libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_unpack_public_key_31(
+ libcrux_ml_kem_types_MlKemPublicKey_30 *public_key,
+ libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0
+ *unpacked_public_key) {
+ libcrux_ml_kem_ind_cca_unpacked_unpack_public_key_0a(public_key,
+ unpacked_public_key);
+}
+
+/**
+ Get the unpacked public key.
+*/
+static inline void
+libcrux_ml_kem_mlkem768_portable_unpacked_unpacked_public_key(
+ libcrux_ml_kem_types_MlKemPublicKey_30 *public_key,
+ libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0
+ *unpacked_public_key) {
+ libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_unpack_public_key_31(
+ public_key, unpacked_public_key);
+}
#if defined(__cplusplus)
}
#endif
-#define __libcrux_mlkem768_portable_H_DEFINED
-#endif
+#define libcrux_mlkem768_portable_H_DEFINED
+#endif /* libcrux_mlkem768_portable_H */
/* rename some types to be a bit more ergonomic */
#define libcrux_mlkem768_keypair libcrux_ml_kem_mlkem768_MlKem768KeyPair_s
-#define libcrux_mlkem768_pk_valid_result Option_92_s
-#define libcrux_mlkem768_pk libcrux_ml_kem_types_MlKemPublicKey_15_s
-#define libcrux_mlkem768_sk libcrux_ml_kem_types_MlKemPrivateKey_55_s
+#define libcrux_mlkem768_pk libcrux_ml_kem_types_MlKemPublicKey_30_s
+#define libcrux_mlkem768_sk libcrux_ml_kem_types_MlKemPrivateKey_d9_s
#define libcrux_mlkem768_ciphertext libcrux_ml_kem_mlkem768_MlKem768Ciphertext_s
-#define libcrux_mlkem768_enc_result tuple_3c_s
+#define libcrux_mlkem768_enc_result tuple_c2_s
/* defines for PRNG inputs */
-#define LIBCRUX_ML_KEM_KEY_PAIR_PRNG_LEN 64
+#define LIBCRUX_ML_KEM_KEY_PAIR_PRNG_LEN 64U
#define LIBCRUX_ML_KEM_ENC_PRNG_LEN 32
diff --git a/log.c b/log.c
index 5969c4a16392..2903871aab4e 100644
--- a/log.c
+++ b/log.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: log.c,v 1.65 2025/09/02 09:34:48 djm Exp $ */
+/* $OpenBSD: log.c,v 1.67 2026/02/14 00:18:34 jsg Exp $ */
/*
* Author: Tatu Ylonen <ylo@cs.hut.fi>
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -46,7 +46,6 @@
#include <stdlib.h>
#include <string.h>
#include <syslog.h>
-#include <time.h>
#include <unistd.h>
#if defined(HAVE_STRNVIS) && defined(HAVE_VIS_H) && !defined(BROKEN_STRNVIS)
# include <vis.h>
@@ -64,7 +63,6 @@ static log_handler_fn *log_handler;
static void *log_handler_ctx;
static char **log_verbose;
static size_t nlog_verbose;
-
extern char *__progname;
#define LOG_SYSLOG_VIS (VIS_CSTYLE|VIS_NL|VIS_TAB|VIS_OCTAL)
@@ -403,7 +401,8 @@ do_log(LogLevel level, int force, const char *suffix, const char *fmt,
/* Avoid recursion */
tmp_handler = log_handler;
log_handler = NULL;
- tmp_handler(level, force, fmtbuf, log_handler_ctx);
+ /* Note: this sends the raw (i.e. no strnvis) log message */
+ tmp_handler(level, force, msgbuf, log_handler_ctx);
log_handler = tmp_handler;
} else if (log_on_stderr) {
snprintf(msgbuf, sizeof msgbuf, "%s%s%.*s\r\n",
diff --git a/loginrec.c b/loginrec.c
index 7d1c9dd43de9..7499aa975625 100644
--- a/loginrec.c
+++ b/loginrec.c
@@ -66,7 +66,7 @@
* code should suffice.
*
* Retrieving the time of last login ('lastlog') is in some ways even
- * more problemmatic than login recording. Some systems provide a
+ * more problematic than login recording. Some systems provide a
* simple table of all users which we seek based on uid and retrieve a
* relatively standard structure. Others record the same information in
* a directory with a separate file, and others don't record the
@@ -651,6 +651,9 @@ construct_utmp(struct logininfo *li,
# ifdef HAVE_TYPE_IN_UTMP
/* This is done here to keep utmp constants out of struct logininfo */
switch (li->type) {
+ case LTYPE_FAILED:
+ ut->ut_type = LOGIN_PROCESS;
+ break;
case LTYPE_LOGIN:
ut->ut_type = USER_PROCESS;
break;
@@ -975,7 +978,7 @@ utmp_write_entry(struct logininfo *li)
/* not much point if we don't want utmpx entries */
#ifdef USE_UTMPX
-/* if we have the wherewithall, use pututxline etc. */
+/* if we have the wherewithal, use pututxline etc. */
# if !defined(DISABLE_PUTUTXLINE) && defined(HAVE_SETUTXENT) && \
defined(HAVE_PUTUTXLINE)
# define UTMPX_USE_LIBRARY
@@ -1732,7 +1735,7 @@ record_failed_login(struct ssh *ssh, const char *username, const char *hostname,
/* Construct a logininfo and turn it into a utmp */
memset(&li, 0, sizeof(li));
- li.type = LTYPE_LOGIN;
+ li.type = LTYPE_FAILED;
li.pid = getpid();
strlcpy(li.line, "ssh:notty", sizeof(li.line));
strlcpy(li.username, username, sizeof(li.username));
diff --git a/loginrec.h b/loginrec.h
index 62ddd01d515a..42b45f040c04 100644
--- a/loginrec.h
+++ b/loginrec.h
@@ -52,6 +52,7 @@ union login_netinfo {
*/
/* types - different to utmp.h 'type' macros */
/* (though set to the same value as linux, openbsd and others...) */
+#define LTYPE_FAILED 6
#define LTYPE_LOGIN 7
#define LTYPE_LOGOUT 8
diff --git a/mac.c b/mac.c
index c95f5ea06856..17607830c5d2 100644
--- a/mac.c
+++ b/mac.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: mac.c,v 1.37 2025/09/05 10:01:35 dtucker Exp $ */
+/* $OpenBSD: mac.c,v 1.38 2026/03/03 09:57:25 dtucker Exp $ */
/*
* Copyright (c) 2001 Markus Friedl. All rights reserved.
*
@@ -152,13 +152,13 @@ mac_init(struct sshmac *mac)
}
int
-mac_compute(struct sshmac *mac, u_int32_t seqno,
+mac_compute(struct sshmac *mac, uint32_t seqno,
const u_char *data, int datalen,
u_char *digest, size_t dlen)
{
static union {
u_char m[SSH_DIGEST_MAX_LENGTH];
- u_int64_t for_align;
+ uint64_t for_align;
} u;
u_char b[4];
u_char nonce[8];
@@ -198,7 +198,7 @@ mac_compute(struct sshmac *mac, u_int32_t seqno,
}
int
-mac_check(struct sshmac *mac, u_int32_t seqno,
+mac_check(struct sshmac *mac, uint32_t seqno,
const u_char *data, size_t dlen,
const u_char *theirmac, size_t mlen)
{
diff --git a/mac.h b/mac.h
index 0b119d7a1c3b..04089f41b4a1 100644
--- a/mac.h
+++ b/mac.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: mac.h,v 1.10 2016/07/08 03:44:42 djm Exp $ */
+/* $OpenBSD: mac.h,v 1.11 2026/03/03 09:57:25 dtucker Exp $ */
/*
* Copyright (c) 2001 Markus Friedl. All rights reserved.
*
@@ -44,9 +44,9 @@ int mac_valid(const char *);
char *mac_alg_list(char);
int mac_setup(struct sshmac *, char *);
int mac_init(struct sshmac *);
-int mac_compute(struct sshmac *, u_int32_t, const u_char *, int,
+int mac_compute(struct sshmac *, uint32_t, const u_char *, int,
u_char *, size_t);
-int mac_check(struct sshmac *, u_int32_t, const u_char *, size_t,
+int mac_check(struct sshmac *, uint32_t, const u_char *, size_t,
const u_char *, size_t);
void mac_clear(struct sshmac *);
diff --git a/mdoc2man.awk b/mdoc2man.awk
index 02a04f7621d8..c942ab86f709 100644
--- a/mdoc2man.awk
+++ b/mdoc2man.awk
@@ -95,6 +95,8 @@ function add(str) {
} else if(match(words[w],"^Ed$")) {
skip=1
literal=0
+ } else if(match(words[w],"^Dl$")) {
+ skip=1
} else if(match(words[w],"^Ns$")) {
skip=1
if(!nospace)
@@ -281,6 +283,12 @@ function add(str) {
add("[")
words[nwords]=words[nwords] "]"
}
+ if(match(words[w],"^Ns$")) {
+ w++
+ if(!nospace)
+ nospace=1
+ sub(" $","",line)
+ }
if(match(words[w],"^Ar$")) {
add("\\fI" words[++w] "\\fP")
} else if(match(words[w],"^[\\.,]")) {
diff --git a/misc-agent.c b/misc-agent.c
index 07c8fb136ec4..cb61405a7f49 100644
--- a/misc-agent.c
+++ b/misc-agent.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: misc-agent.c,v 1.6 2025/06/17 01:19:27 djm Exp $ */
+/* $OpenBSD: misc-agent.c,v 1.7 2026/02/11 17:05:32 dtucker Exp $ */
/*
* Copyright (c) 2025 Damien Miller <djm@mindrot.org>
*
diff --git a/misc.c b/misc.c
index ce77ec943067..ed3e9d31425c 100644
--- a/misc.c
+++ b/misc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: misc.c,v 1.208 2025/09/25 06:33:19 djm Exp $ */
+/* $OpenBSD: misc.c,v 1.213 2026/03/03 09:57:25 dtucker Exp $ */
/*
* Copyright (c) 2000 Markus Friedl. All rights reserved.
* Copyright (c) 2005-2020 Damien Miller. All rights reserved.
@@ -43,7 +43,6 @@
#include <unistd.h>
#include <netinet/in.h>
-#include <netinet/in_systm.h>
#include <netinet/ip.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>
@@ -121,6 +120,34 @@ strprefix(const char *s, const char *prefix, int ignorecase)
return s + prefixlen;
}
+/* Append string 's' to a NULL-terminated array of strings */
+void
+stringlist_append(char ***listp, const char *s)
+{
+ size_t i = 0;
+
+ if (*listp == NULL)
+ *listp = xcalloc(2, sizeof(**listp));
+ else {
+ for (i = 0; (*listp)[i] != NULL; i++)
+ ; /* count */
+ *listp = xrecallocarray(*listp, i + 1, i + 2, sizeof(**listp));
+ }
+ (*listp)[i] = xstrdup(s);
+}
+
+void
+stringlist_free(char **list)
+{
+ size_t i = 0;
+
+ if (list == NULL)
+ return;
+ for (i = 0; list[i] != NULL; i++)
+ free(list[i]);
+ free(list);
+}
+
/* set/unset filedescriptor to non-blocking */
int
set_nonblock(int fd)
@@ -594,25 +621,22 @@ a2tun(const char *s, int *remote)
return (tun);
}
-#define SECONDS 1
+#define SECONDS 1.0
#define MINUTES (SECONDS * 60)
#define HOURS (MINUTES * 60)
#define DAYS (HOURS * 24)
#define WEEKS (DAYS * 7)
-static char *
-scandigits(char *s)
-{
- while (isdigit((unsigned char)*s))
- s++;
- return s;
-}
-
/*
- * Convert a time string into seconds; format is
- * a sequence of:
+ * Convert an interval/duration time string into seconds, which may include
+ * fractional seconds.
+ *
+ * The format is a sequence of:
* time[qualifier]
*
+ * This supports fractional values for the seconds value only. All other
+ * values must be integers.
+ *
* Valid time qualifiers are:
* <none> seconds
* s|S seconds
@@ -622,44 +646,46 @@ scandigits(char *s)
* w|W weeks
*
* Examples:
- * 90m 90 minutes
- * 1h30m 90 minutes
- * 2d 2 days
- * 1w 1 week
+ * 90m 90 minutes
+ * 1h30m 90 minutes
+ * 1.5s 1.5 seconds
+ * 2d 2 days
+ * 1w 1 week
*
- * Return -1 if time string is invalid.
+ * Returns <0.0 if the time string is invalid.
*/
-int
-convtime(const char *s)
+double
+convtime_double(const char *s)
{
- int secs, total = 0, multiplier;
- char *p, *os, *np, c = 0;
- const char *errstr;
+ double val, total_sec = 0.0, multiplier;
+ const char *p, *start_p;
+ char *endp;
+ int seen_seconds = 0;
if (s == NULL || *s == '\0')
- return -1;
- p = os = strdup(s); /* deal with const */
- if (os == NULL)
- return -1;
+ return -1.0;
- while (*p) {
- np = scandigits(p);
- if (np) {
- c = *np;
- *np = '\0';
- }
- secs = (int)strtonum(p, 0, INT_MAX, &errstr);
- if (errstr)
- goto fail;
- *np = c;
+ for (p = s; *p != '\0';) {
+ if (!isdigit((unsigned char)*p) && *p != '.')
+ return -1.0;
- multiplier = 1;
- switch (c) {
+ errno = 0;
+ if ((val = strtod(p, &endp)) < 0 || errno != 0 || p == endp)
+ return -1.0;
+ /* Allow only decimal forms */
+ if (p + strspn(p, "0123456789.") != endp)
+ return -1.0;
+ start_p = p;
+ p = endp;
+
+ switch (*p) {
case '\0':
- np--; /* back up */
- break;
+ /* FALLTHROUGH */
case 's':
case 'S':
+ if (seen_seconds++)
+ return -1.0;
+ multiplier = SECONDS;
break;
case 'm':
case 'M':
@@ -678,23 +704,44 @@ convtime(const char *s)
multiplier = WEEKS;
break;
default:
- goto fail;
+ return -1.0;
+ }
+
+ /* Special handling if this was a decimal */
+ if (memchr(start_p, '.', endp - start_p) != NULL) {
+ /* Decimal point present */
+ if (multiplier > 1.0)
+ return -1.0; /* No fractionals for non-seconds */
+ /* For seconds, ensure digits follow */
+ if (!isdigit((unsigned char)*(endp - 1)))
+ return -1.0;
}
- if (secs > INT_MAX / multiplier)
- goto fail;
- secs *= multiplier;
- if (total > INT_MAX - secs)
- goto fail;
- total += secs;
- if (total < 0)
- goto fail;
- p = ++np;
+
+ total_sec += val * multiplier;
+
+ if (*p != '\0')
+ p++;
}
- free(os);
- return total;
-fail:
- free(os);
- return -1;
+ return total_sec;
+}
+
+/*
+ * Same as convtime_double() above but fractional seconds are ignored.
+ * Return -1 if time string is invalid.
+ */
+int
+convtime(const char *s)
+{
+ double sec_val;
+
+ if ((sec_val = convtime_double(s)) < 0.0)
+ return -1;
+
+ /* Check for overflow into int */
+ if (sec_val < 0 || sec_val > INT_MAX)
+ return -1;
+
+ return (int)sec_val;
}
#define TF_BUFS 8
@@ -1613,66 +1660,66 @@ xextendf(char **sp, const char *sep, const char *fmt, ...)
}
-u_int64_t
+uint64_t
get_u64(const void *vp)
{
const u_char *p = (const u_char *)vp;
- u_int64_t v;
+ uint64_t v;
- v = (u_int64_t)p[0] << 56;
- v |= (u_int64_t)p[1] << 48;
- v |= (u_int64_t)p[2] << 40;
- v |= (u_int64_t)p[3] << 32;
- v |= (u_int64_t)p[4] << 24;
- v |= (u_int64_t)p[5] << 16;
- v |= (u_int64_t)p[6] << 8;
- v |= (u_int64_t)p[7];
+ v = (uint64_t)p[0] << 56;
+ v |= (uint64_t)p[1] << 48;
+ v |= (uint64_t)p[2] << 40;
+ v |= (uint64_t)p[3] << 32;
+ v |= (uint64_t)p[4] << 24;
+ v |= (uint64_t)p[5] << 16;
+ v |= (uint64_t)p[6] << 8;
+ v |= (uint64_t)p[7];
return (v);
}
-u_int32_t
+uint32_t
get_u32(const void *vp)
{
const u_char *p = (const u_char *)vp;
- u_int32_t v;
+ uint32_t v;
- v = (u_int32_t)p[0] << 24;
- v |= (u_int32_t)p[1] << 16;
- v |= (u_int32_t)p[2] << 8;
- v |= (u_int32_t)p[3];
+ v = (uint32_t)p[0] << 24;
+ v |= (uint32_t)p[1] << 16;
+ v |= (uint32_t)p[2] << 8;
+ v |= (uint32_t)p[3];
return (v);
}
-u_int32_t
+uint32_t
get_u32_le(const void *vp)
{
const u_char *p = (const u_char *)vp;
- u_int32_t v;
+ uint32_t v;
- v = (u_int32_t)p[0];
- v |= (u_int32_t)p[1] << 8;
- v |= (u_int32_t)p[2] << 16;
- v |= (u_int32_t)p[3] << 24;
+ v = (uint32_t)p[0];
+ v |= (uint32_t)p[1] << 8;
+ v |= (uint32_t)p[2] << 16;
+ v |= (uint32_t)p[3] << 24;
return (v);
}
-u_int16_t
+uint16_t
get_u16(const void *vp)
{
const u_char *p = (const u_char *)vp;
- u_int16_t v;
+ uint16_t v;
- v = (u_int16_t)p[0] << 8;
- v |= (u_int16_t)p[1];
+ v = (uint16_t)p[0] << 8;
+ v |= (uint16_t)p[1];
return (v);
}
void
-put_u64(void *vp, u_int64_t v)
+put_u64(void *vp, uint64_t v)
{
u_char *p = (u_char *)vp;
@@ -1687,7 +1734,7 @@ put_u64(void *vp, u_int64_t v)
}
void
-put_u32(void *vp, u_int32_t v)
+put_u32(void *vp, uint32_t v)
{
u_char *p = (u_char *)vp;
@@ -1698,7 +1745,7 @@ put_u32(void *vp, u_int32_t v)
}
void
-put_u32_le(void *vp, u_int32_t v)
+put_u32_le(void *vp, uint32_t v)
{
u_char *p = (u_char *)vp;
@@ -1709,7 +1756,7 @@ put_u32_le(void *vp, u_int32_t v)
}
void
-put_u16(void *vp, u_int16_t v)
+put_u16(void *vp, uint16_t v)
{
u_char *p = (u_char *)vp;
@@ -1783,7 +1830,7 @@ monotime(void)
struct timespec ts;
monotime_ts(&ts);
- return ts.tv_sec;
+ return (ts.tv_sec);
}
double
@@ -1792,11 +1839,11 @@ monotime_double(void)
struct timespec ts;
monotime_ts(&ts);
- return ts.tv_sec + ((double)ts.tv_nsec / 1000000000);
+ return (double)ts.tv_sec + (double)ts.tv_nsec / 1000000000.0;
}
void
-bandwidth_limit_init(struct bwlimit *bw, u_int64_t kbps, size_t buflen)
+bandwidth_limit_init(struct bwlimit *bw, uint64_t kbps, size_t buflen)
{
bw->buflen = buflen;
bw->rate = kbps;
@@ -1810,7 +1857,7 @@ bandwidth_limit_init(struct bwlimit *bw, u_int64_t kbps, size_t buflen)
void
bandwidth_limit(struct bwlimit *bw, size_t read_len)
{
- u_int64_t waitlen;
+ uint64_t waitlen;
struct timespec ts, rm;
bw->lamt += read_len;
@@ -1902,6 +1949,7 @@ static const struct {
{ "cs7", IPTOS_DSCP_CS7 },
{ "ef", IPTOS_DSCP_EF },
{ "le", IPTOS_DSCP_LE },
+ { "va", IPTOS_DSCP_VA },
{ "lowdelay", INT_MIN }, /* deprecated */
{ "throughput", INT_MIN }, /* deprecated */
{ "reliability", INT_MIN }, /* deprecated */
diff --git a/misc.h b/misc.h
index f3c5a18c6249..791876c1e166 100644
--- a/misc.h
+++ b/misc.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: misc.h,v 1.112 2025/09/25 06:33:19 djm Exp $ */
+/* $OpenBSD: misc.h,v 1.116 2026/03/11 09:10:59 dtucker Exp $ */
/*
* Author: Tatu Ylonen <ylo@cs.hut.fi>
@@ -59,6 +59,8 @@ void skip_space(char **);
const char *strprefix(const char *, const char *, int);
char *strdelim(char **);
char *strdelimw(char **);
+void stringlist_append(char ***listp, const char *s);
+void stringlist_free(char **list);
int set_nonblock(int);
int unset_nonblock(int);
void set_nodelay(int);
@@ -79,7 +81,9 @@ char *colon(char *);
int parse_user_host_path(const char *, char **, char **, char **);
int parse_user_host_port(const char *, char **, char **, int *);
int parse_uri(const char *, const char *, char **, char **, int *, char **);
+double convtime_double(const char *);
int convtime(const char *);
+double convtime_double(const char *);
const char *fmt_timeframe(time_t t);
int tilde_expand(const char *, uid_t, char **);
char *tilde_expand_filename(const char *, uid_t);
@@ -114,6 +118,7 @@ void sock_set_v6only(int);
struct passwd *pwcopy(struct passwd *);
void pwfree(struct passwd *); /* NB. only use with pwcopy */
+
const char *ssh_gai_strerror(int);
typedef void privdrop_fn(struct passwd *);
@@ -155,34 +160,34 @@ int tun_open(int, int, char **);
#define PORT_STREAMLOCAL -2
/* Functions to extract or store big-endian words of various sizes */
-u_int64_t get_u64(const void *)
+uint64_t get_u64(const void *)
__attribute__((__bounded__( __minbytes__, 1, 8)));
-u_int32_t get_u32(const void *)
+uint32_t get_u32(const void *)
__attribute__((__bounded__( __minbytes__, 1, 4)));
-u_int16_t get_u16(const void *)
+uint16_t get_u16(const void *)
__attribute__((__bounded__( __minbytes__, 1, 2)));
-void put_u64(void *, u_int64_t)
+void put_u64(void *, uint64_t)
__attribute__((__bounded__( __minbytes__, 1, 8)));
-void put_u32(void *, u_int32_t)
+void put_u32(void *, uint32_t)
__attribute__((__bounded__( __minbytes__, 1, 4)));
-void put_u16(void *, u_int16_t)
+void put_u16(void *, uint16_t)
__attribute__((__bounded__( __minbytes__, 1, 2)));
/* Little-endian store/load, used by umac.c */
-u_int32_t get_u32_le(const void *)
+uint32_t get_u32_le(const void *)
__attribute__((__bounded__(__minbytes__, 1, 4)));
-void put_u32_le(void *, u_int32_t)
+void put_u32_le(void *, uint32_t)
__attribute__((__bounded__(__minbytes__, 1, 4)));
struct bwlimit {
size_t buflen;
- u_int64_t rate; /* desired rate in kbit/s */
- u_int64_t thresh; /* threshold after which we'll check timers */
- u_int64_t lamt; /* amount written in last timer interval */
+ uint64_t rate; /* desired rate in kbit/s */
+ uint64_t thresh; /* threshold after which we'll check timers */
+ uint64_t lamt; /* amount written in last timer interval */
struct timeval bwstart, bwend;
};
-void bandwidth_limit_init(struct bwlimit *, u_int64_t, size_t);
+void bandwidth_limit_init(struct bwlimit *, uint64_t, size_t);
void bandwidth_limit(struct bwlimit *, size_t);
int parse_ipqos(const char *);
@@ -265,4 +270,10 @@ int signal_is_crash(int);
/* On OpenBSD time_t is int64_t which is long long. */
/* #define SSH_TIME_T_MAX LLONG_MAX */
+#define FD_CLOSEONEXEC(x) do { \
+ if (fcntl(x, F_SETFD, FD_CLOEXEC) == -1) \
+ fatal_f("fcntl(%d, F_SETFD, FD_CLOEXEC): %s", x, \
+ strerror(errno)); \
+} while (0)
+
#endif /* _MISC_H */
diff --git a/mlkem768.sh b/mlkem768.sh
index cbc3d14da2ed..bec372a5fc7b 100644
--- a/mlkem768.sh
+++ b/mlkem768.sh
@@ -1,17 +1,18 @@
#!/bin/sh
-# $OpenBSD: mlkem768.sh,v 1.3 2024/10/27 02:06:01 djm Exp $
+# $OpenBSD: mlkem768.sh,v 1.5 2025/11/13 05:13:06 djm Exp $
# Placed in the Public Domain.
#
#WANT_LIBCRUX_REVISION="origin/main"
-WANT_LIBCRUX_REVISION="84c5d87b3092c59294345aa269ceefe0eb97cc35"
+WANT_LIBCRUX_REVISION="core-models-v0.0.4"
+BASE="libcrux/libcrux-ml-kem/extracts/c_header_only/generated"
FILES="
- libcrux/libcrux-ml-kem/cg/eurydice_glue.h
- libcrux/libcrux-ml-kem/cg/libcrux_core.h
- libcrux/libcrux-ml-kem/cg/libcrux_ct_ops.h
- libcrux/libcrux-ml-kem/cg/libcrux_sha3_portable.h
- libcrux/libcrux-ml-kem/cg/libcrux_mlkem768_portable.h
+ $BASE/eurydice_glue.h
+ $BASE/libcrux_mlkem_core.h
+ $BASE/libcrux_ct_ops.h
+ $BASE/libcrux_sha3_portable.h
+ $BASE/libcrux_mlkem768_portable.h
"
START="$PWD"
@@ -40,19 +41,80 @@ echo '/*'
cat libcrux/LICENSE-MIT | sed 's/^/ * /;s/ *$//'
echo ' */'
echo
-echo '#if !defined(__GNUC__) || (__GNUC__ < 2)'
-echo '# define __attribute__(x)'
-echo '#endif'
-echo '#define KRML_MUSTINLINE inline'
-echo '#define KRML_NOINLINE __attribute__((noinline, unused))'
-echo '#define KRML_HOST_EPRINTF(...)'
-echo '#define KRML_HOST_EXIT(x) fatal_f("internal error")'
-echo
-__builtin_popcount_replacement='
- const uint8_t v[16] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4 };
- return v[x0 & 0xf] + v[(x0 >> 4) & 0xf];
-'
+LSHIFT="<<"
+cat << _EOF
+#if !defined(__GNUC__) || (__GNUC__ < 2)
+# define __attribute__(x)
+#endif
+#define KRML_MUSTINLINE inline
+#define KRML_NOINLINE __attribute__((noinline, unused))
+#define KRML_HOST_EPRINTF(...)
+#define KRML_HOST_EXIT(x) fatal_f("internal error")
+
+static inline void
+store64_le(uint8_t dst[8], uint64_t src)
+{
+ dst[0] = src & 0xff;
+ dst[1] = (src >> 8) & 0xff;
+ dst[2] = (src >> 16) & 0xff;
+ dst[3] = (src >> 24) & 0xff;
+ dst[4] = (src >> 32) & 0xff;
+ dst[5] = (src >> 40) & 0xff;
+ dst[6] = (src >> 48) & 0xff;
+ dst[7] = (src >> 56) & 0xff;
+}
+
+static inline void
+store32_le(uint8_t dst[4], uint32_t src)
+{
+ dst[0] = src & 0xff;
+ dst[1] = (src >> 8) & 0xff;
+ dst[2] = (src >> 16) & 0xff;
+ dst[3] = (src >> 24) & 0xff;
+}
+
+static inline void
+store32_be(uint8_t dst[4], uint32_t src)
+{
+ dst[0] = (src >> 24) & 0xff;
+ dst[1] = (src >> 16) & 0xff;
+ dst[2] = (src >> 8) & 0xff;
+ dst[3] = src & 0xff;
+}
+
+static inline uint64_t
+load64_le(uint8_t src[8])
+{
+ return (uint64_t)(src[0]) |
+ ((uint64_t)(src[1]) $LSHIFT 8) |
+ ((uint64_t)(src[2]) $LSHIFT 16) |
+ ((uint64_t)(src[3]) $LSHIFT 24) |
+ ((uint64_t)(src[4]) $LSHIFT 32) |
+ ((uint64_t)(src[5]) $LSHIFT 40) |
+ ((uint64_t)(src[6]) $LSHIFT 48) |
+ ((uint64_t)(src[7]) $LSHIFT 56);
+}
+
+static inline uint32_t
+load32_le(uint8_t src[4])
+{
+ return (uint32_t)(src[0]) |
+ ((uint32_t)(src[1]) $LSHIFT 8) |
+ ((uint32_t)(src[2]) $LSHIFT 16) |
+ ((uint32_t)(src[3]) $LSHIFT 24);
+}
+
+#ifdef MISSING_BUILTIN_POPCOUNT
+static inline unsigned int
+__builtin_popcount(unsigned int num)
+{
+ const int v[16] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4 };
+ return v[num & 0xf] + v[(num >> 4) & 0xf];
+}
+#endif
+
+_EOF
for i in $FILES; do
echo "/* from $i */"
@@ -63,14 +125,9 @@ for i in $FILES; do
-e 's/[ ]*$//' \
$i | \
case "$i" in
- */libcrux-ml-kem/cg/eurydice_glue.h)
- # Replace endian functions with versions that work.
- perl -0777 -pe 's/(static inline void core_num__u64_9__to_le_bytes.*\n)([^}]*\n)/\1 v = htole64(v);\n\2/' |
- perl -0777 -pe 's/(static inline uint64_t core_num__u64_9__from_le_bytes.*?)return v;/\1return le64toh(v);/s' |
- perl -0777 -pe 's/(static inline uint32_t core_num__u32_8__from_le_bytes.*?)return v;/\1return le32toh(v);/s' |
- # Compat for popcount.
- perl -0777 -pe 's/\#ifdef (_MSC_VER)(.*?return __popcnt\(x0\);)/\#if defined(\1)\2/s' |
- perl -0777 -pe "s/\\#else(\\n\\s+return __builtin_popcount\\(x0\\);)/\\#elif !defined(MISSING_BUILTIN_POPCOUNT)\\1\\n#else$__builtin_popcount_replacement/s"
+ */eurydice_glue.h)
+ # Replace endian function for consistency.
+ perl -0777 -pe 's/(static inline void core_num__u32__to_be_bytes.*\n)([^}]*\n)/\1 store32_be(dst, src);\n/'
;;
# Default: pass through.
*)
@@ -83,11 +140,10 @@ done
echo
echo '/* rename some types to be a bit more ergonomic */'
echo '#define libcrux_mlkem768_keypair libcrux_ml_kem_mlkem768_MlKem768KeyPair_s'
-echo '#define libcrux_mlkem768_pk_valid_result Option_92_s'
-echo '#define libcrux_mlkem768_pk libcrux_ml_kem_types_MlKemPublicKey_15_s'
-echo '#define libcrux_mlkem768_sk libcrux_ml_kem_types_MlKemPrivateKey_55_s'
+echo '#define libcrux_mlkem768_pk libcrux_ml_kem_types_MlKemPublicKey_30_s'
+echo '#define libcrux_mlkem768_sk libcrux_ml_kem_types_MlKemPrivateKey_d9_s'
echo '#define libcrux_mlkem768_ciphertext libcrux_ml_kem_mlkem768_MlKem768Ciphertext_s'
-echo '#define libcrux_mlkem768_enc_result tuple_3c_s'
+echo '#define libcrux_mlkem768_enc_result tuple_c2_s'
) > libcrux_mlkem768_sha3.h_new
# Do some checks on the resultant file
@@ -140,13 +196,13 @@ int main(void) {
return 0;
}
_EOF
-cc -Wall -Wextra -Wno-unused-parameter -o libcrux_mlkem768_sha3_check \
+cc -Wall -Wextra -Wno-unused-parameter -I . -o libcrux_mlkem768_sha3_check \
libcrux_mlkem768_sha3_check.c
./libcrux_mlkem768_sha3_check
# Extract PRNG inputs; there's no nice #defines for these
-key_pair_rng_len=`sed -e '/^libcrux_ml_kem_mlkem768_portable_kyber_generate_key_pair[(]$/,/[)] {$/!d' < libcrux_mlkem768_sha3.h_new | grep 'uint8_t randomness\[[0-9]*U\][)]' | sed 's/.*randomness\[\([0-9]*\)U\].*/\1/'`
-enc_rng_len=`sed -e '/^static inline tuple_3c libcrux_ml_kem_mlkem768_portable_kyber_encapsulate[(]$/,/[)] {$/!d' < libcrux_mlkem768_sha3.h_new | grep 'uint8_t randomness\[[0-9]*U\][)]' | sed 's/.*randomness\[\([0-9]*\)U\].*/\1/'`
+key_pair_rng_len=`grep '^libcrux_ml_kem_mlkem768_portable_generate_key_pair.*randomness' libcrux_mlkem768_sha3.h_new | sed 's/.*randomness[[]//;s/\].*//'`
+enc_rng_len=`sed -e '/^static inline tuple_c2 libcrux_ml_kem_mlkem768_portable_encapsulate[(]$/,/[)] {$/!d' < libcrux_mlkem768_sha3.h_new | grep 'uint8_t randomness\[[0-9]*U\][)]' | sed 's/.*randomness\[\([0-9]*\)U\].*/\1/'`
test -z "$key_pair_rng_len" && die "couldn't find size of libcrux_ml_kem_mlkem768_portable_kyber_generate_key_pair randomness argument"
test -z "$enc_rng_len" && die "couldn't find size of libcrux_ml_kem_mlkem768_portable_kyber_encapsulate randomness argument"
diff --git a/moduli b/moduli
index 2fe04ab76032..f5e0bba07354 100644
--- a/moduli
+++ b/moduli
@@ -1,427 +1,586 @@
-# $OpenBSD: moduli,v 1.40 2025/05/23 01:14:35 dtucker Exp $
+# $OpenBSD: moduli,v 1.41 2025/10/11 23:39:14 dtucker Exp $
# Time Type Tests Tries Size Generator Modulus
-20241129001801 2 6 100 2047 5 CAA48956B64FC48DD5A4823E073002797519479815F1B8D4AAAB1748CB28F30774053A901B0A52BB700F0AFB1C23E06C63EEC4326CFA484724954492B3703B50C706447754E091B6F69DEF32413B230FBC521D3912A2A030258ED841F28BD56BF27A3543756DEA1BBD62A44E66D80B22D9B41045E6DB0AFA700156862E4D24F682327787A9E10BC63D2E5F303F19109E1E3BA661635E34BBDC98BA711DFF7F7710CF632D3DDAD5B3B2539B61A309AD1BA93A60A03F1ACF9F89A6B166EDBBBA0B8160993BEF2FE072E278CDACBA5BBE44D9D5F353158DC4AECABC6EF9E16CC7DB9E5D697D3B42E02B675FB800D91F7CE79F553C6B610320EEA13FC56E329A8EFF
-20241129001804 2 6 100 2047 5 CAA48956B64FC48DD5A4823E073002797519479815F1B8D4AAAB1748CB28F30774053A901B0A52BB700F0AFB1C23E06C63EEC4326CFA484724954492B3703B50C706447754E091B6F69DEF32413B230FBC521D3912A2A030258ED841F28BD56BF27A3543756DEA1BBD62A44E66D80B22D9B41045E6DB0AFA700156862E4D24F682327787A9E10BC63D2E5F303F19109E1E3BA661635E34BBDC98BA711DFF7F7710CF632D3DDAD5B3B2539B61A309AD1BA93A60A03F1ACF9F89A6B166EDBBBA0B8160993BEF2FE072E278CDACBA5BBE44D9D5F353158DC4AECABC6EF9E16CC7DB9E5D697D3B42E02B675FB800D91F7CE79F553C6B610320EEA13FC56E32AA678F
-20241129001808 2 6 100 2047 2 CAA48956B64FC48DD5A4823E073002797519479815F1B8D4AAAB1748CB28F30774053A901B0A52BB700F0AFB1C23E06C63EEC4326CFA484724954492B3703B50C706447754E091B6F69DEF32413B230FBC521D3912A2A030258ED841F28BD56BF27A3543756DEA1BBD62A44E66D80B22D9B41045E6DB0AFA700156862E4D24F682327787A9E10BC63D2E5F303F19109E1E3BA661635E34BBDC98BA711DFF7F7710CF632D3DDAD5B3B2539B61A309AD1BA93A60A03F1ACF9F89A6B166EDBBBA0B8160993BEF2FE072E278CDACBA5BBE44D9D5F353158DC4AECABC6EF9E16CC7DB9E5D697D3B42E02B675FB800D91F7CE79F553C6B610320EEA13FC56E32C4EBAB
-20241129001813 2 6 100 2047 2 CAA48956B64FC48DD5A4823E073002797519479815F1B8D4AAAB1748CB28F30774053A901B0A52BB700F0AFB1C23E06C63EEC4326CFA484724954492B3703B50C706447754E091B6F69DEF32413B230FBC521D3912A2A030258ED841F28BD56BF27A3543756DEA1BBD62A44E66D80B22D9B41045E6DB0AFA700156862E4D24F682327787A9E10BC63D2E5F303F19109E1E3BA661635E34BBDC98BA711DFF7F7710CF632D3DDAD5B3B2539B61A309AD1BA93A60A03F1ACF9F89A6B166EDBBBA0B8160993BEF2FE072E278CDACBA5BBE44D9D5F353158DC4AECABC6EF9E16CC7DB9E5D697D3B42E02B675FB800D91F7CE79F553C6B610320EEA13FC56E32EB8EAB
-20241129001817 2 6 100 2047 2 CAA48956B64FC48DD5A4823E073002797519479815F1B8D4AAAB1748CB28F30774053A901B0A52BB700F0AFB1C23E06C63EEC4326CFA484724954492B3703B50C706447754E091B6F69DEF32413B230FBC521D3912A2A030258ED841F28BD56BF27A3543756DEA1BBD62A44E66D80B22D9B41045E6DB0AFA700156862E4D24F682327787A9E10BC63D2E5F303F19109E1E3BA661635E34BBDC98BA711DFF7F7710CF632D3DDAD5B3B2539B61A309AD1BA93A60A03F1ACF9F89A6B166EDBBBA0B8160993BEF2FE072E278CDACBA5BBE44D9D5F353158DC4AECABC6EF9E16CC7DB9E5D697D3B42E02B675FB800D91F7CE79F553C6B610320EEA13FC56E3308D17B
-20241129001819 2 6 100 2047 5 CAA48956B64FC48DD5A4823E073002797519479815F1B8D4AAAB1748CB28F30774053A901B0A52BB700F0AFB1C23E06C63EEC4326CFA484724954492B3703B50C706447754E091B6F69DEF32413B230FBC521D3912A2A030258ED841F28BD56BF27A3543756DEA1BBD62A44E66D80B22D9B41045E6DB0AFA700156862E4D24F682327787A9E10BC63D2E5F303F19109E1E3BA661635E34BBDC98BA711DFF7F7710CF632D3DDAD5B3B2539B61A309AD1BA93A60A03F1ACF9F89A6B166EDBBBA0B8160993BEF2FE072E278CDACBA5BBE44D9D5F353158DC4AECABC6EF9E16CC7DB9E5D697D3B42E02B675FB800D91F7CE79F553C6B610320EEA13FC56E330EB1EF
-20241129001825 2 6 100 2047 2 CAA48956B64FC48DD5A4823E073002797519479815F1B8D4AAAB1748CB28F30774053A901B0A52BB700F0AFB1C23E06C63EEC4326CFA484724954492B3703B50C706447754E091B6F69DEF32413B230FBC521D3912A2A030258ED841F28BD56BF27A3543756DEA1BBD62A44E66D80B22D9B41045E6DB0AFA700156862E4D24F682327787A9E10BC63D2E5F303F19109E1E3BA661635E34BBDC98BA711DFF7F7710CF632D3DDAD5B3B2539B61A309AD1BA93A60A03F1ACF9F89A6B166EDBBBA0B8160993BEF2FE072E278CDACBA5BBE44D9D5F353158DC4AECABC6EF9E16CC7DB9E5D697D3B42E02B675FB800D91F7CE79F553C6B610320EEA13FC56E333E0923
-20241129001832 2 6 100 2047 2 CAA48956B64FC48DD5A4823E073002797519479815F1B8D4AAAB1748CB28F30774053A901B0A52BB700F0AFB1C23E06C63EEC4326CFA484724954492B3703B50C706447754E091B6F69DEF32413B230FBC521D3912A2A030258ED841F28BD56BF27A3543756DEA1BBD62A44E66D80B22D9B41045E6DB0AFA700156862E4D24F682327787A9E10BC63D2E5F303F19109E1E3BA661635E34BBDC98BA711DFF7F7710CF632D3DDAD5B3B2539B61A309AD1BA93A60A03F1ACF9F89A6B166EDBBBA0B8160993BEF2FE072E278CDACBA5BBE44D9D5F353158DC4AECABC6EF9E16CC7DB9E5D697D3B42E02B675FB800D91F7CE79F553C6B610320EEA13FC56E3370EFD3
-20241129001904 2 6 100 2047 2 CAA48956B64FC48DD5A4823E073002797519479815F1B8D4AAAB1748CB28F30774053A901B0A52BB700F0AFB1C23E06C63EEC4326CFA484724954492B3703B50C706447754E091B6F69DEF32413B230FBC521D3912A2A030258ED841F28BD56BF27A3543756DEA1BBD62A44E66D80B22D9B41045E6DB0AFA700156862E4D24F682327787A9E10BC63D2E5F303F19109E1E3BA661635E34BBDC98BA711DFF7F7710CF632D3DDAD5B3B2539B61A309AD1BA93A60A03F1ACF9F89A6B166EDBBBA0B8160993BEF2FE072E278CDACBA5BBE44D9D5F353158DC4AECABC6EF9E16CC7DB9E5D697D3B42E02B675FB800D91F7CE79F553C6B610320EEA13FC56E3471A693
-20241129001908 2 6 100 2047 2 CAA48956B64FC48DD5A4823E073002797519479815F1B8D4AAAB1748CB28F30774053A901B0A52BB700F0AFB1C23E06C63EEC4326CFA484724954492B3703B50C706447754E091B6F69DEF32413B230FBC521D3912A2A030258ED841F28BD56BF27A3543756DEA1BBD62A44E66D80B22D9B41045E6DB0AFA700156862E4D24F682327787A9E10BC63D2E5F303F19109E1E3BA661635E34BBDC98BA711DFF7F7710CF632D3DDAD5B3B2539B61A309AD1BA93A60A03F1ACF9F89A6B166EDBBBA0B8160993BEF2FE072E278CDACBA5BBE44D9D5F353158DC4AECABC6EF9E16CC7DB9E5D697D3B42E02B675FB800D91F7CE79F553C6B610320EEA13FC56E348736C3
-20241129001923 2 6 100 2047 2 CAA48956B64FC48DD5A4823E073002797519479815F1B8D4AAAB1748CB28F30774053A901B0A52BB700F0AFB1C23E06C63EEC4326CFA484724954492B3703B50C706447754E091B6F69DEF32413B230FBC521D3912A2A030258ED841F28BD56BF27A3543756DEA1BBD62A44E66D80B22D9B41045E6DB0AFA700156862E4D24F682327787A9E10BC63D2E5F303F19109E1E3BA661635E34BBDC98BA711DFF7F7710CF632D3DDAD5B3B2539B61A309AD1BA93A60A03F1ACF9F89A6B166EDBBBA0B8160993BEF2FE072E278CDACBA5BBE44D9D5F353158DC4AECABC6EF9E16CC7DB9E5D697D3B42E02B675FB800D91F7CE79F553C6B610320EEA13FC56E35021F83
-20241129001930 2 6 100 2047 2 CAA48956B64FC48DD5A4823E073002797519479815F1B8D4AAAB1748CB28F30774053A901B0A52BB700F0AFB1C23E06C63EEC4326CFA484724954492B3703B50C706447754E091B6F69DEF32413B230FBC521D3912A2A030258ED841F28BD56BF27A3543756DEA1BBD62A44E66D80B22D9B41045E6DB0AFA700156862E4D24F682327787A9E10BC63D2E5F303F19109E1E3BA661635E34BBDC98BA711DFF7F7710CF632D3DDAD5B3B2539B61A309AD1BA93A60A03F1ACF9F89A6B166EDBBBA0B8160993BEF2FE072E278CDACBA5BBE44D9D5F353158DC4AECABC6EF9E16CC7DB9E5D697D3B42E02B675FB800D91F7CE79F553C6B610320EEA13FC56E352FB613
-20241129001942 2 6 100 2047 2 CAA48956B64FC48DD5A4823E073002797519479815F1B8D4AAAB1748CB28F30774053A901B0A52BB700F0AFB1C23E06C63EEC4326CFA484724954492B3703B50C706447754E091B6F69DEF32413B230FBC521D3912A2A030258ED841F28BD56BF27A3543756DEA1BBD62A44E66D80B22D9B41045E6DB0AFA700156862E4D24F682327787A9E10BC63D2E5F303F19109E1E3BA661635E34BBDC98BA711DFF7F7710CF632D3DDAD5B3B2539B61A309AD1BA93A60A03F1ACF9F89A6B166EDBBBA0B8160993BEF2FE072E278CDACBA5BBE44D9D5F353158DC4AECABC6EF9E16CC7DB9E5D697D3B42E02B675FB800D91F7CE79F553C6B610320EEA13FC56E3591257B
-20241129001946 2 6 100 2047 2 CAA48956B64FC48DD5A4823E073002797519479815F1B8D4AAAB1748CB28F30774053A901B0A52BB700F0AFB1C23E06C63EEC4326CFA484724954492B3703B50C706447754E091B6F69DEF32413B230FBC521D3912A2A030258ED841F28BD56BF27A3543756DEA1BBD62A44E66D80B22D9B41045E6DB0AFA700156862E4D24F682327787A9E10BC63D2E5F303F19109E1E3BA661635E34BBDC98BA711DFF7F7710CF632D3DDAD5B3B2539B61A309AD1BA93A60A03F1ACF9F89A6B166EDBBBA0B8160993BEF2FE072E278CDACBA5BBE44D9D5F353158DC4AECABC6EF9E16CC7DB9E5D697D3B42E02B675FB800D91F7CE79F553C6B610320EEA13FC56E35AB042B
-20241129001947 2 6 100 2047 2 CAA48956B64FC48DD5A4823E073002797519479815F1B8D4AAAB1748CB28F30774053A901B0A52BB700F0AFB1C23E06C63EEC4326CFA484724954492B3703B50C706447754E091B6F69DEF32413B230FBC521D3912A2A030258ED841F28BD56BF27A3543756DEA1BBD62A44E66D80B22D9B41045E6DB0AFA700156862E4D24F682327787A9E10BC63D2E5F303F19109E1E3BA661635E34BBDC98BA711DFF7F7710CF632D3DDAD5B3B2539B61A309AD1BA93A60A03F1ACF9F89A6B166EDBBBA0B8160993BEF2FE072E278CDACBA5BBE44D9D5F353158DC4AECABC6EF9E16CC7DB9E5D697D3B42E02B675FB800D91F7CE79F553C6B610320EEA13FC56E35B082CB
-20241129002012 2 6 100 2047 2 CAA48956B64FC48DD5A4823E073002797519479815F1B8D4AAAB1748CB28F30774053A901B0A52BB700F0AFB1C23E06C63EEC4326CFA484724954492B3703B50C706447754E091B6F69DEF32413B230FBC521D3912A2A030258ED841F28BD56BF27A3543756DEA1BBD62A44E66D80B22D9B41045E6DB0AFA700156862E4D24F682327787A9E10BC63D2E5F303F19109E1E3BA661635E34BBDC98BA711DFF7F7710CF632D3DDAD5B3B2539B61A309AD1BA93A60A03F1ACF9F89A6B166EDBBBA0B8160993BEF2FE072E278CDACBA5BBE44D9D5F353158DC4AECABC6EF9E16CC7DB9E5D697D3B42E02B675FB800D91F7CE79F553C6B610320EEA13FC56E36777D7B
-20241129002017 2 6 100 2047 2 CAA48956B64FC48DD5A4823E073002797519479815F1B8D4AAAB1748CB28F30774053A901B0A52BB700F0AFB1C23E06C63EEC4326CFA484724954492B3703B50C706447754E091B6F69DEF32413B230FBC521D3912A2A030258ED841F28BD56BF27A3543756DEA1BBD62A44E66D80B22D9B41045E6DB0AFA700156862E4D24F682327787A9E10BC63D2E5F303F19109E1E3BA661635E34BBDC98BA711DFF7F7710CF632D3DDAD5B3B2539B61A309AD1BA93A60A03F1ACF9F89A6B166EDBBBA0B8160993BEF2FE072E278CDACBA5BBE44D9D5F353158DC4AECABC6EF9E16CC7DB9E5D697D3B42E02B675FB800D91F7CE79F553C6B610320EEA13FC56E3697886B
-20241129002030 2 6 100 2047 2 CAA48956B64FC48DD5A4823E073002797519479815F1B8D4AAAB1748CB28F30774053A901B0A52BB700F0AFB1C23E06C63EEC4326CFA484724954492B3703B50C706447754E091B6F69DEF32413B230FBC521D3912A2A030258ED841F28BD56BF27A3543756DEA1BBD62A44E66D80B22D9B41045E6DB0AFA700156862E4D24F682327787A9E10BC63D2E5F303F19109E1E3BA661635E34BBDC98BA711DFF7F7710CF632D3DDAD5B3B2539B61A309AD1BA93A60A03F1ACF9F89A6B166EDBBBA0B8160993BEF2FE072E278CDACBA5BBE44D9D5F353158DC4AECABC6EF9E16CC7DB9E5D697D3B42E02B675FB800D91F7CE79F553C6B610320EEA13FC56E36F5B2EB
-20241129002036 2 6 100 2047 2 CAA48956B64FC48DD5A4823E073002797519479815F1B8D4AAAB1748CB28F30774053A901B0A52BB700F0AFB1C23E06C63EEC4326CFA484724954492B3703B50C706447754E091B6F69DEF32413B230FBC521D3912A2A030258ED841F28BD56BF27A3543756DEA1BBD62A44E66D80B22D9B41045E6DB0AFA700156862E4D24F682327787A9E10BC63D2E5F303F19109E1E3BA661635E34BBDC98BA711DFF7F7710CF632D3DDAD5B3B2539B61A309AD1BA93A60A03F1ACF9F89A6B166EDBBBA0B8160993BEF2FE072E278CDACBA5BBE44D9D5F353158DC4AECABC6EF9E16CC7DB9E5D697D3B42E02B675FB800D91F7CE79F553C6B610320EEA13FC56E37249BD3
-20241129002045 2 6 100 2047 2 CAA48956B64FC48DD5A4823E073002797519479815F1B8D4AAAB1748CB28F30774053A901B0A52BB700F0AFB1C23E06C63EEC4326CFA484724954492B3703B50C706447754E091B6F69DEF32413B230FBC521D3912A2A030258ED841F28BD56BF27A3543756DEA1BBD62A44E66D80B22D9B41045E6DB0AFA700156862E4D24F682327787A9E10BC63D2E5F303F19109E1E3BA661635E34BBDC98BA711DFF7F7710CF632D3DDAD5B3B2539B61A309AD1BA93A60A03F1ACF9F89A6B166EDBBBA0B8160993BEF2FE072E278CDACBA5BBE44D9D5F353158DC4AECABC6EF9E16CC7DB9E5D697D3B42E02B675FB800D91F7CE79F553C6B610320EEA13FC56E3769C1B3
-20241129002059 2 6 100 2047 5 CAA48956B64FC48DD5A4823E073002797519479815F1B8D4AAAB1748CB28F30774053A901B0A52BB700F0AFB1C23E06C63EEC4326CFA484724954492B3703B50C706447754E091B6F69DEF32413B230FBC521D3912A2A030258ED841F28BD56BF27A3543756DEA1BBD62A44E66D80B22D9B41045E6DB0AFA700156862E4D24F682327787A9E10BC63D2E5F303F19109E1E3BA661635E34BBDC98BA711DFF7F7710CF632D3DDAD5B3B2539B61A309AD1BA93A60A03F1ACF9F89A6B166EDBBBA0B8160993BEF2FE072E278CDACBA5BBE44D9D5F353158DC4AECABC6EF9E16CC7DB9E5D697D3B42E02B675FB800D91F7CE79F553C6B610320EEA13FC56E37D6FDAF
-20241129002102 2 6 100 2047 2 CAA48956B64FC48DD5A4823E073002797519479815F1B8D4AAAB1748CB28F30774053A901B0A52BB700F0AFB1C23E06C63EEC4326CFA484724954492B3703B50C706447754E091B6F69DEF32413B230FBC521D3912A2A030258ED841F28BD56BF27A3543756DEA1BBD62A44E66D80B22D9B41045E6DB0AFA700156862E4D24F682327787A9E10BC63D2E5F303F19109E1E3BA661635E34BBDC98BA711DFF7F7710CF632D3DDAD5B3B2539B61A309AD1BA93A60A03F1ACF9F89A6B166EDBBBA0B8160993BEF2FE072E278CDACBA5BBE44D9D5F353158DC4AECABC6EF9E16CC7DB9E5D697D3B42E02B675FB800D91F7CE79F553C6B610320EEA13FC56E37EDB2E3
-20241129002105 2 6 100 2047 5 CAA48956B64FC48DD5A4823E073002797519479815F1B8D4AAAB1748CB28F30774053A901B0A52BB700F0AFB1C23E06C63EEC4326CFA484724954492B3703B50C706447754E091B6F69DEF32413B230FBC521D3912A2A030258ED841F28BD56BF27A3543756DEA1BBD62A44E66D80B22D9B41045E6DB0AFA700156862E4D24F682327787A9E10BC63D2E5F303F19109E1E3BA661635E34BBDC98BA711DFF7F7710CF632D3DDAD5B3B2539B61A309AD1BA93A60A03F1ACF9F89A6B166EDBBBA0B8160993BEF2FE072E278CDACBA5BBE44D9D5F353158DC4AECABC6EF9E16CC7DB9E5D697D3B42E02B675FB800D91F7CE79F553C6B610320EEA13FC56E37FA449F
-20241129002109 2 6 100 2047 5 CAA48956B64FC48DD5A4823E073002797519479815F1B8D4AAAB1748CB28F30774053A901B0A52BB700F0AFB1C23E06C63EEC4326CFA484724954492B3703B50C706447754E091B6F69DEF32413B230FBC521D3912A2A030258ED841F28BD56BF27A3543756DEA1BBD62A44E66D80B22D9B41045E6DB0AFA700156862E4D24F682327787A9E10BC63D2E5F303F19109E1E3BA661635E34BBDC98BA711DFF7F7710CF632D3DDAD5B3B2539B61A309AD1BA93A60A03F1ACF9F89A6B166EDBBBA0B8160993BEF2FE072E278CDACBA5BBE44D9D5F353158DC4AECABC6EF9E16CC7DB9E5D697D3B42E02B675FB800D91F7CE79F553C6B610320EEA13FC56E381694E7
-20241129002127 2 6 100 2047 5 CAA48956B64FC48DD5A4823E073002797519479815F1B8D4AAAB1748CB28F30774053A901B0A52BB700F0AFB1C23E06C63EEC4326CFA484724954492B3703B50C706447754E091B6F69DEF32413B230FBC521D3912A2A030258ED841F28BD56BF27A3543756DEA1BBD62A44E66D80B22D9B41045E6DB0AFA700156862E4D24F682327787A9E10BC63D2E5F303F19109E1E3BA661635E34BBDC98BA711DFF7F7710CF632D3DDAD5B3B2539B61A309AD1BA93A60A03F1ACF9F89A6B166EDBBBA0B8160993BEF2FE072E278CDACBA5BBE44D9D5F353158DC4AECABC6EF9E16CC7DB9E5D697D3B42E02B675FB800D91F7CE79F553C6B610320EEA13FC56E38A56437
-20241129002141 2 6 100 2047 2 CAA48956B64FC48DD5A4823E073002797519479815F1B8D4AAAB1748CB28F30774053A901B0A52BB700F0AFB1C23E06C63EEC4326CFA484724954492B3703B50C706447754E091B6F69DEF32413B230FBC521D3912A2A030258ED841F28BD56BF27A3543756DEA1BBD62A44E66D80B22D9B41045E6DB0AFA700156862E4D24F682327787A9E10BC63D2E5F303F19109E1E3BA661635E34BBDC98BA711DFF7F7710CF632D3DDAD5B3B2539B61A309AD1BA93A60A03F1ACF9F89A6B166EDBBBA0B8160993BEF2FE072E278CDACBA5BBE44D9D5F353158DC4AECABC6EF9E16CC7DB9E5D697D3B42E02B675FB800D91F7CE79F553C6B610320EEA13FC56E391852F3
-20241129002144 2 6 100 2047 5 CAA48956B64FC48DD5A4823E073002797519479815F1B8D4AAAB1748CB28F30774053A901B0A52BB700F0AFB1C23E06C63EEC4326CFA484724954492B3703B50C706447754E091B6F69DEF32413B230FBC521D3912A2A030258ED841F28BD56BF27A3543756DEA1BBD62A44E66D80B22D9B41045E6DB0AFA700156862E4D24F682327787A9E10BC63D2E5F303F19109E1E3BA661635E34BBDC98BA711DFF7F7710CF632D3DDAD5B3B2539B61A309AD1BA93A60A03F1ACF9F89A6B166EDBBBA0B8160993BEF2FE072E278CDACBA5BBE44D9D5F353158DC4AECABC6EF9E16CC7DB9E5D697D3B42E02B675FB800D91F7CE79F553C6B610320EEA13FC56E3927ECD7
-20241129002150 2 6 100 2047 5 CAA48956B64FC48DD5A4823E073002797519479815F1B8D4AAAB1748CB28F30774053A901B0A52BB700F0AFB1C23E06C63EEC4326CFA484724954492B3703B50C706447754E091B6F69DEF32413B230FBC521D3912A2A030258ED841F28BD56BF27A3543756DEA1BBD62A44E66D80B22D9B41045E6DB0AFA700156862E4D24F682327787A9E10BC63D2E5F303F19109E1E3BA661635E34BBDC98BA711DFF7F7710CF632D3DDAD5B3B2539B61A309AD1BA93A60A03F1ACF9F89A6B166EDBBBA0B8160993BEF2FE072E278CDACBA5BBE44D9D5F353158DC4AECABC6EF9E16CC7DB9E5D697D3B42E02B675FB800D91F7CE79F553C6B610320EEA13FC56E3952495F
-20241129002154 2 6 100 2047 2 CAA48956B64FC48DD5A4823E073002797519479815F1B8D4AAAB1748CB28F30774053A901B0A52BB700F0AFB1C23E06C63EEC4326CFA484724954492B3703B50C706447754E091B6F69DEF32413B230FBC521D3912A2A030258ED841F28BD56BF27A3543756DEA1BBD62A44E66D80B22D9B41045E6DB0AFA700156862E4D24F682327787A9E10BC63D2E5F303F19109E1E3BA661635E34BBDC98BA711DFF7F7710CF632D3DDAD5B3B2539B61A309AD1BA93A60A03F1ACF9F89A6B166EDBBBA0B8160993BEF2FE072E278CDACBA5BBE44D9D5F353158DC4AECABC6EF9E16CC7DB9E5D697D3B42E02B675FB800D91F7CE79F553C6B610320EEA13FC56E3971FEDB
-20241129002226 2 6 100 2047 2 D62BDAF38E54FDFF0C708C3A9D5A49ADD950102DDCE4017B0B90CB32FE8736EE054C70F834E7196596829647330A22260674F15C124DFD61BD6304ED8DAA2BAF03E37A43714575DC4E50D30EB36E31B994DA55D6CCE62E854F087F56587D5C04E2907BF39AE275B9B5E0353A50453DA96E714E11E5A00F72680903B482731C04A0791B018B4FDB5D2EA1DE235C20CF300B0C1CED91A218390A09DF78C1877BB35E0D92D22ED647E32EA5C9F877B589B4A8F7F6685715AC5E0E5F93DB5671E028A9DFE1C66662C94A47C19FE0ED1B9C9BCBEA281F705C358F792091DE4A2F110B6B68E4AB15D6B30C59C8850D1E436BDDABADF17ED1E8881271CD1E7C8F34FC6B
-20241129002249 2 6 100 2047 5 D62BDAF38E54FDFF0C708C3A9D5A49ADD950102DDCE4017B0B90CB32FE8736EE054C70F834E7196596829647330A22260674F15C124DFD61BD6304ED8DAA2BAF03E37A43714575DC4E50D30EB36E31B994DA55D6CCE62E854F087F56587D5C04E2907BF39AE275B9B5E0353A50453DA96E714E11E5A00F72680903B482731C04A0791B018B4FDB5D2EA1DE235C20CF300B0C1CED91A218390A09DF78C1877BB35E0D92D22ED647E32EA5C9F877B589B4A8F7F6685715AC5E0E5F93DB5671E028A9DFE1C66662C94A47C19FE0ED1B9C9BCBEA281F705C358F792091DE4A2F110B6B68E4AB15D6B30C59C8850D1E436BDDABADF17ED1E8881271CD1E7C8FE809EF
-20241129002253 2 6 100 2047 2 D62BDAF38E54FDFF0C708C3A9D5A49ADD950102DDCE4017B0B90CB32FE8736EE054C70F834E7196596829647330A22260674F15C124DFD61BD6304ED8DAA2BAF03E37A43714575DC4E50D30EB36E31B994DA55D6CCE62E854F087F56587D5C04E2907BF39AE275B9B5E0353A50453DA96E714E11E5A00F72680903B482731C04A0791B018B4FDB5D2EA1DE235C20CF300B0C1CED91A218390A09DF78C1877BB35E0D92D22ED647E32EA5C9F877B589B4A8F7F6685715AC5E0E5F93DB5671E028A9DFE1C66662C94A47C19FE0ED1B9C9BCBEA281F705C358F792091DE4A2F110B6B68E4AB15D6B30C59C8850D1E436BDDABADF17ED1E8881271CD1E7C9008BDF3
-20241129002312 2 6 100 2047 2 D62BDAF38E54FDFF0C708C3A9D5A49ADD950102DDCE4017B0B90CB32FE8736EE054C70F834E7196596829647330A22260674F15C124DFD61BD6304ED8DAA2BAF03E37A43714575DC4E50D30EB36E31B994DA55D6CCE62E854F087F56587D5C04E2907BF39AE275B9B5E0353A50453DA96E714E11E5A00F72680903B482731C04A0791B018B4FDB5D2EA1DE235C20CF300B0C1CED91A218390A09DF78C1877BB35E0D92D22ED647E32EA5C9F877B589B4A8F7F6685715AC5E0E5F93DB5671E028A9DFE1C66662C94A47C19FE0ED1B9C9BCBEA281F705C358F792091DE4A2F110B6B68E4AB15D6B30C59C8850D1E436BDDABADF17ED1E8881271CD1E7C9099D883
-20241129002320 2 6 100 2047 2 D62BDAF38E54FDFF0C708C3A9D5A49ADD950102DDCE4017B0B90CB32FE8736EE054C70F834E7196596829647330A22260674F15C124DFD61BD6304ED8DAA2BAF03E37A43714575DC4E50D30EB36E31B994DA55D6CCE62E854F087F56587D5C04E2907BF39AE275B9B5E0353A50453DA96E714E11E5A00F72680903B482731C04A0791B018B4FDB5D2EA1DE235C20CF300B0C1CED91A218390A09DF78C1877BB35E0D92D22ED647E32EA5C9F877B589B4A8F7F6685715AC5E0E5F93DB5671E028A9DFE1C66662C94A47C19FE0ED1B9C9BCBEA281F705C358F792091DE4A2F110B6B68E4AB15D6B30C59C8850D1E436BDDABADF17ED1E8881271CD1E7C90D2E5BB
-20241129002328 2 6 100 2047 5 D62BDAF38E54FDFF0C708C3A9D5A49ADD950102DDCE4017B0B90CB32FE8736EE054C70F834E7196596829647330A22260674F15C124DFD61BD6304ED8DAA2BAF03E37A43714575DC4E50D30EB36E31B994DA55D6CCE62E854F087F56587D5C04E2907BF39AE275B9B5E0353A50453DA96E714E11E5A00F72680903B482731C04A0791B018B4FDB5D2EA1DE235C20CF300B0C1CED91A218390A09DF78C1877BB35E0D92D22ED647E32EA5C9F877B589B4A8F7F6685715AC5E0E5F93DB5671E028A9DFE1C66662C94A47C19FE0ED1B9C9BCBEA281F705C358F792091DE4A2F110B6B68E4AB15D6B30C59C8850D1E436BDDABADF17ED1E8881271CD1E7C9111A1E7
-20241129002329 2 6 100 2047 5 D62BDAF38E54FDFF0C708C3A9D5A49ADD950102DDCE4017B0B90CB32FE8736EE054C70F834E7196596829647330A22260674F15C124DFD61BD6304ED8DAA2BAF03E37A43714575DC4E50D30EB36E31B994DA55D6CCE62E854F087F56587D5C04E2907BF39AE275B9B5E0353A50453DA96E714E11E5A00F72680903B482731C04A0791B018B4FDB5D2EA1DE235C20CF300B0C1CED91A218390A09DF78C1877BB35E0D92D22ED647E32EA5C9F877B589B4A8F7F6685715AC5E0E5F93DB5671E028A9DFE1C66662C94A47C19FE0ED1B9C9BCBEA281F705C358F792091DE4A2F110B6B68E4AB15D6B30C59C8850D1E436BDDABADF17ED1E8881271CD1E7C9113E88F
-20241129002336 2 6 100 2047 2 D62BDAF38E54FDFF0C708C3A9D5A49ADD950102DDCE4017B0B90CB32FE8736EE054C70F834E7196596829647330A22260674F15C124DFD61BD6304ED8DAA2BAF03E37A43714575DC4E50D30EB36E31B994DA55D6CCE62E854F087F56587D5C04E2907BF39AE275B9B5E0353A50453DA96E714E11E5A00F72680903B482731C04A0791B018B4FDB5D2EA1DE235C20CF300B0C1CED91A218390A09DF78C1877BB35E0D92D22ED647E32EA5C9F877B589B4A8F7F6685715AC5E0E5F93DB5671E028A9DFE1C66662C94A47C19FE0ED1B9C9BCBEA281F705C358F792091DE4A2F110B6B68E4AB15D6B30C59C8850D1E436BDDABADF17ED1E8881271CD1E7C9148164B
-20241129002339 2 6 100 2047 2 D62BDAF38E54FDFF0C708C3A9D5A49ADD950102DDCE4017B0B90CB32FE8736EE054C70F834E7196596829647330A22260674F15C124DFD61BD6304ED8DAA2BAF03E37A43714575DC4E50D30EB36E31B994DA55D6CCE62E854F087F56587D5C04E2907BF39AE275B9B5E0353A50453DA96E714E11E5A00F72680903B482731C04A0791B018B4FDB5D2EA1DE235C20CF300B0C1CED91A218390A09DF78C1877BB35E0D92D22ED647E32EA5C9F877B589B4A8F7F6685715AC5E0E5F93DB5671E028A9DFE1C66662C94A47C19FE0ED1B9C9BCBEA281F705C358F792091DE4A2F110B6B68E4AB15D6B30C59C8850D1E436BDDABADF17ED1E8881271CD1E7C915E0DCB
-20241129002340 2 6 100 2047 2 D62BDAF38E54FDFF0C708C3A9D5A49ADD950102DDCE4017B0B90CB32FE8736EE054C70F834E7196596829647330A22260674F15C124DFD61BD6304ED8DAA2BAF03E37A43714575DC4E50D30EB36E31B994DA55D6CCE62E854F087F56587D5C04E2907BF39AE275B9B5E0353A50453DA96E714E11E5A00F72680903B482731C04A0791B018B4FDB5D2EA1DE235C20CF300B0C1CED91A218390A09DF78C1877BB35E0D92D22ED647E32EA5C9F877B589B4A8F7F6685715AC5E0E5F93DB5671E028A9DFE1C66662C94A47C19FE0ED1B9C9BCBEA281F705C358F792091DE4A2F110B6B68E4AB15D6B30C59C8850D1E436BDDABADF17ED1E8881271CD1E7C915EB103
-20241129002420 2 6 100 2047 5 D62BDAF38E54FDFF0C708C3A9D5A49ADD950102DDCE4017B0B90CB32FE8736EE054C70F834E7196596829647330A22260674F15C124DFD61BD6304ED8DAA2BAF03E37A43714575DC4E50D30EB36E31B994DA55D6CCE62E854F087F56587D5C04E2907BF39AE275B9B5E0353A50453DA96E714E11E5A00F72680903B482731C04A0791B018B4FDB5D2EA1DE235C20CF300B0C1CED91A218390A09DF78C1877BB35E0D92D22ED647E32EA5C9F877B589B4A8F7F6685715AC5E0E5F93DB5671E028A9DFE1C66662C94A47C19FE0ED1B9C9BCBEA281F705C358F792091DE4A2F110B6B68E4AB15D6B30C59C8850D1E436BDDABADF17ED1E8881271CD1E7C92A19C97
-20241129002428 2 6 100 2047 5 D62BDAF38E54FDFF0C708C3A9D5A49ADD950102DDCE4017B0B90CB32FE8736EE054C70F834E7196596829647330A22260674F15C124DFD61BD6304ED8DAA2BAF03E37A43714575DC4E50D30EB36E31B994DA55D6CCE62E854F087F56587D5C04E2907BF39AE275B9B5E0353A50453DA96E714E11E5A00F72680903B482731C04A0791B018B4FDB5D2EA1DE235C20CF300B0C1CED91A218390A09DF78C1877BB35E0D92D22ED647E32EA5C9F877B589B4A8F7F6685715AC5E0E5F93DB5671E028A9DFE1C66662C94A47C19FE0ED1B9C9BCBEA281F705C358F792091DE4A2F110B6B68E4AB15D6B30C59C8850D1E436BDDABADF17ED1E8881271CD1E7C92E090AF
-20241129002433 2 6 100 2047 2 D62BDAF38E54FDFF0C708C3A9D5A49ADD950102DDCE4017B0B90CB32FE8736EE054C70F834E7196596829647330A22260674F15C124DFD61BD6304ED8DAA2BAF03E37A43714575DC4E50D30EB36E31B994DA55D6CCE62E854F087F56587D5C04E2907BF39AE275B9B5E0353A50453DA96E714E11E5A00F72680903B482731C04A0791B018B4FDB5D2EA1DE235C20CF300B0C1CED91A218390A09DF78C1877BB35E0D92D22ED647E32EA5C9F877B589B4A8F7F6685715AC5E0E5F93DB5671E028A9DFE1C66662C94A47C19FE0ED1B9C9BCBEA281F705C358F792091DE4A2F110B6B68E4AB15D6B30C59C8850D1E436BDDABADF17ED1E8881271CD1E7C93040BCB
-20241129002434 2 6 100 2047 2 D62BDAF38E54FDFF0C708C3A9D5A49ADD950102DDCE4017B0B90CB32FE8736EE054C70F834E7196596829647330A22260674F15C124DFD61BD6304ED8DAA2BAF03E37A43714575DC4E50D30EB36E31B994DA55D6CCE62E854F087F56587D5C04E2907BF39AE275B9B5E0353A50453DA96E714E11E5A00F72680903B482731C04A0791B018B4FDB5D2EA1DE235C20CF300B0C1CED91A218390A09DF78C1877BB35E0D92D22ED647E32EA5C9F877B589B4A8F7F6685715AC5E0E5F93DB5671E028A9DFE1C66662C94A47C19FE0ED1B9C9BCBEA281F705C358F792091DE4A2F110B6B68E4AB15D6B30C59C8850D1E436BDDABADF17ED1E8881271CD1E7C930B22CB
-20241129002436 2 6 100 2047 2 D62BDAF38E54FDFF0C708C3A9D5A49ADD950102DDCE4017B0B90CB32FE8736EE054C70F834E7196596829647330A22260674F15C124DFD61BD6304ED8DAA2BAF03E37A43714575DC4E50D30EB36E31B994DA55D6CCE62E854F087F56587D5C04E2907BF39AE275B9B5E0353A50453DA96E714E11E5A00F72680903B482731C04A0791B018B4FDB5D2EA1DE235C20CF300B0C1CED91A218390A09DF78C1877BB35E0D92D22ED647E32EA5C9F877B589B4A8F7F6685715AC5E0E5F93DB5671E028A9DFE1C66662C94A47C19FE0ED1B9C9BCBEA281F705C358F792091DE4A2F110B6B68E4AB15D6B30C59C8850D1E436BDDABADF17ED1E8881271CD1E7C931188B3
-20241129002446 2 6 100 2047 5 D62BDAF38E54FDFF0C708C3A9D5A49ADD950102DDCE4017B0B90CB32FE8736EE054C70F834E7196596829647330A22260674F15C124DFD61BD6304ED8DAA2BAF03E37A43714575DC4E50D30EB36E31B994DA55D6CCE62E854F087F56587D5C04E2907BF39AE275B9B5E0353A50453DA96E714E11E5A00F72680903B482731C04A0791B018B4FDB5D2EA1DE235C20CF300B0C1CED91A218390A09DF78C1877BB35E0D92D22ED647E32EA5C9F877B589B4A8F7F6685715AC5E0E5F93DB5671E028A9DFE1C66662C94A47C19FE0ED1B9C9BCBEA281F705C358F792091DE4A2F110B6B68E4AB15D6B30C59C8850D1E436BDDABADF17ED1E8881271CD1E7C935DB5F7
-20241129002507 2 6 100 2047 2 D62BDAF38E54FDFF0C708C3A9D5A49ADD950102DDCE4017B0B90CB32FE8736EE054C70F834E7196596829647330A22260674F15C124DFD61BD6304ED8DAA2BAF03E37A43714575DC4E50D30EB36E31B994DA55D6CCE62E854F087F56587D5C04E2907BF39AE275B9B5E0353A50453DA96E714E11E5A00F72680903B482731C04A0791B018B4FDB5D2EA1DE235C20CF300B0C1CED91A218390A09DF78C1877BB35E0D92D22ED647E32EA5C9F877B589B4A8F7F6685715AC5E0E5F93DB5671E028A9DFE1C66662C94A47C19FE0ED1B9C9BCBEA281F705C358F792091DE4A2F110B6B68E4AB15D6B30C59C8850D1E436BDDABADF17ED1E8881271CD1E7C9408C96B
-20241129002510 2 6 100 2047 2 D62BDAF38E54FDFF0C708C3A9D5A49ADD950102DDCE4017B0B90CB32FE8736EE054C70F834E7196596829647330A22260674F15C124DFD61BD6304ED8DAA2BAF03E37A43714575DC4E50D30EB36E31B994DA55D6CCE62E854F087F56587D5C04E2907BF39AE275B9B5E0353A50453DA96E714E11E5A00F72680903B482731C04A0791B018B4FDB5D2EA1DE235C20CF300B0C1CED91A218390A09DF78C1877BB35E0D92D22ED647E32EA5C9F877B589B4A8F7F6685715AC5E0E5F93DB5671E028A9DFE1C66662C94A47C19FE0ED1B9C9BCBEA281F705C358F792091DE4A2F110B6B68E4AB15D6B30C59C8850D1E436BDDABADF17ED1E8881271CD1E7C941D429B
-20241129002527 2 6 100 2047 2 D62BDAF38E54FDFF0C708C3A9D5A49ADD950102DDCE4017B0B90CB32FE8736EE054C70F834E7196596829647330A22260674F15C124DFD61BD6304ED8DAA2BAF03E37A43714575DC4E50D30EB36E31B994DA55D6CCE62E854F087F56587D5C04E2907BF39AE275B9B5E0353A50453DA96E714E11E5A00F72680903B482731C04A0791B018B4FDB5D2EA1DE235C20CF300B0C1CED91A218390A09DF78C1877BB35E0D92D22ED647E32EA5C9F877B589B4A8F7F6685715AC5E0E5F93DB5671E028A9DFE1C66662C94A47C19FE0ED1B9C9BCBEA281F705C358F792091DE4A2F110B6B68E4AB15D6B30C59C8850D1E436BDDABADF17ED1E8881271CD1E7C94A15E73
-20241129002528 2 6 100 2047 5 D62BDAF38E54FDFF0C708C3A9D5A49ADD950102DDCE4017B0B90CB32FE8736EE054C70F834E7196596829647330A22260674F15C124DFD61BD6304ED8DAA2BAF03E37A43714575DC4E50D30EB36E31B994DA55D6CCE62E854F087F56587D5C04E2907BF39AE275B9B5E0353A50453DA96E714E11E5A00F72680903B482731C04A0791B018B4FDB5D2EA1DE235C20CF300B0C1CED91A218390A09DF78C1877BB35E0D92D22ED647E32EA5C9F877B589B4A8F7F6685715AC5E0E5F93DB5671E028A9DFE1C66662C94A47C19FE0ED1B9C9BCBEA281F705C358F792091DE4A2F110B6B68E4AB15D6B30C59C8850D1E436BDDABADF17ED1E8881271CD1E7C94AA3DAF
-20241129002531 2 6 100 2047 5 D62BDAF38E54FDFF0C708C3A9D5A49ADD950102DDCE4017B0B90CB32FE8736EE054C70F834E7196596829647330A22260674F15C124DFD61BD6304ED8DAA2BAF03E37A43714575DC4E50D30EB36E31B994DA55D6CCE62E854F087F56587D5C04E2907BF39AE275B9B5E0353A50453DA96E714E11E5A00F72680903B482731C04A0791B018B4FDB5D2EA1DE235C20CF300B0C1CED91A218390A09DF78C1877BB35E0D92D22ED647E32EA5C9F877B589B4A8F7F6685715AC5E0E5F93DB5671E028A9DFE1C66662C94A47C19FE0ED1B9C9BCBEA281F705C358F792091DE4A2F110B6B68E4AB15D6B30C59C8850D1E436BDDABADF17ED1E8881271CD1E7C94BA0ED7
-20241129002538 2 6 100 2047 5 D62BDAF38E54FDFF0C708C3A9D5A49ADD950102DDCE4017B0B90CB32FE8736EE054C70F834E7196596829647330A22260674F15C124DFD61BD6304ED8DAA2BAF03E37A43714575DC4E50D30EB36E31B994DA55D6CCE62E854F087F56587D5C04E2907BF39AE275B9B5E0353A50453DA96E714E11E5A00F72680903B482731C04A0791B018B4FDB5D2EA1DE235C20CF300B0C1CED91A218390A09DF78C1877BB35E0D92D22ED647E32EA5C9F877B589B4A8F7F6685715AC5E0E5F93DB5671E028A9DFE1C66662C94A47C19FE0ED1B9C9BCBEA281F705C358F792091DE4A2F110B6B68E4AB15D6B30C59C8850D1E436BDDABADF17ED1E8881271CD1E7C94ECC017
-20241129002543 2 6 100 2047 5 D62BDAF38E54FDFF0C708C3A9D5A49ADD950102DDCE4017B0B90CB32FE8736EE054C70F834E7196596829647330A22260674F15C124DFD61BD6304ED8DAA2BAF03E37A43714575DC4E50D30EB36E31B994DA55D6CCE62E854F087F56587D5C04E2907BF39AE275B9B5E0353A50453DA96E714E11E5A00F72680903B482731C04A0791B018B4FDB5D2EA1DE235C20CF300B0C1CED91A218390A09DF78C1877BB35E0D92D22ED647E32EA5C9F877B589B4A8F7F6685715AC5E0E5F93DB5671E028A9DFE1C66662C94A47C19FE0ED1B9C9BCBEA281F705C358F792091DE4A2F110B6B68E4AB15D6B30C59C8850D1E436BDDABADF17ED1E8881271CD1E7C9511A1BF
-20241129002558 2 6 100 2047 5 D62BDAF38E54FDFF0C708C3A9D5A49ADD950102DDCE4017B0B90CB32FE8736EE054C70F834E7196596829647330A22260674F15C124DFD61BD6304ED8DAA2BAF03E37A43714575DC4E50D30EB36E31B994DA55D6CCE62E854F087F56587D5C04E2907BF39AE275B9B5E0353A50453DA96E714E11E5A00F72680903B482731C04A0791B018B4FDB5D2EA1DE235C20CF300B0C1CED91A218390A09DF78C1877BB35E0D92D22ED647E32EA5C9F877B589B4A8F7F6685715AC5E0E5F93DB5671E028A9DFE1C66662C94A47C19FE0ED1B9C9BCBEA281F705C358F792091DE4A2F110B6B68E4AB15D6B30C59C8850D1E436BDDABADF17ED1E8881271CD1E7C95871257
-20241129002602 2 6 100 2047 2 D62BDAF38E54FDFF0C708C3A9D5A49ADD950102DDCE4017B0B90CB32FE8736EE054C70F834E7196596829647330A22260674F15C124DFD61BD6304ED8DAA2BAF03E37A43714575DC4E50D30EB36E31B994DA55D6CCE62E854F087F56587D5C04E2907BF39AE275B9B5E0353A50453DA96E714E11E5A00F72680903B482731C04A0791B018B4FDB5D2EA1DE235C20CF300B0C1CED91A218390A09DF78C1877BB35E0D92D22ED647E32EA5C9F877B589B4A8F7F6685715AC5E0E5F93DB5671E028A9DFE1C66662C94A47C19FE0ED1B9C9BCBEA281F705C358F792091DE4A2F110B6B68E4AB15D6B30C59C8850D1E436BDDABADF17ED1E8881271CD1E7C95A7B2AB
-20241129002617 2 6 100 2047 2 D62BDAF38E54FDFF0C708C3A9D5A49ADD950102DDCE4017B0B90CB32FE8736EE054C70F834E7196596829647330A22260674F15C124DFD61BD6304ED8DAA2BAF03E37A43714575DC4E50D30EB36E31B994DA55D6CCE62E854F087F56587D5C04E2907BF39AE275B9B5E0353A50453DA96E714E11E5A00F72680903B482731C04A0791B018B4FDB5D2EA1DE235C20CF300B0C1CED91A218390A09DF78C1877BB35E0D92D22ED647E32EA5C9F877B589B4A8F7F6685715AC5E0E5F93DB5671E028A9DFE1C66662C94A47C19FE0ED1B9C9BCBEA281F705C358F792091DE4A2F110B6B68E4AB15D6B30C59C8850D1E436BDDABADF17ED1E8881271CD1E7C961AFC4B
-20241129002644 2 6 100 2047 2 D62BDAF38E54FDFF0C708C3A9D5A49ADD950102DDCE4017B0B90CB32FE8736EE054C70F834E7196596829647330A22260674F15C124DFD61BD6304ED8DAA2BAF03E37A43714575DC4E50D30EB36E31B994DA55D6CCE62E854F087F56587D5C04E2907BF39AE275B9B5E0353A50453DA96E714E11E5A00F72680903B482731C04A0791B018B4FDB5D2EA1DE235C20CF300B0C1CED91A218390A09DF78C1877BB35E0D92D22ED647E32EA5C9F877B589B4A8F7F6685715AC5E0E5F93DB5671E028A9DFE1C66662C94A47C19FE0ED1B9C9BCBEA281F705C358F792091DE4A2F110B6B68E4AB15D6B30C59C8850D1E436BDDABADF17ED1E8881271CD1E7C96F5DDA3
-20241129002646 2 6 100 2047 5 D62BDAF38E54FDFF0C708C3A9D5A49ADD950102DDCE4017B0B90CB32FE8736EE054C70F834E7196596829647330A22260674F15C124DFD61BD6304ED8DAA2BAF03E37A43714575DC4E50D30EB36E31B994DA55D6CCE62E854F087F56587D5C04E2907BF39AE275B9B5E0353A50453DA96E714E11E5A00F72680903B482731C04A0791B018B4FDB5D2EA1DE235C20CF300B0C1CED91A218390A09DF78C1877BB35E0D92D22ED647E32EA5C9F877B589B4A8F7F6685715AC5E0E5F93DB5671E028A9DFE1C66662C94A47C19FE0ED1B9C9BCBEA281F705C358F792091DE4A2F110B6B68E4AB15D6B30C59C8850D1E436BDDABADF17ED1E8881271CD1E7C9701A557
-20241129003212 2 6 100 3071 5 C94F41FDB4E54DBDD1C7A49F586104E6D74F4CD07A2B9730A4FB5D40C24AB929C55B955144ADC62AEF2DF80D151E4F20E946F69C9B7AC7F01D1A916F3C1D23984DAF12A5CF18C5FDD9922AE0DBFFB31E9EAC765DCF315EBB0524E8B9246BC97169BE71440DF64D5884F63D9ECC8C96E312169E71BC1D25DCE1AE142F6C4D265BA36CBAAC0860E6C83C26B287461F4FE90C5D2CAF4A87937E12407CC632618086D75FB5A17ED87F8EEE71893A6890E74AA378BD6B91CD4CF264F0826110494D2492F6A45567AB8FF4C28142582D3E66E9D3961881DFA1877E2EC993E31A35017C8291B0C74BCF285F94BC6E8B5D0EDEE7F571BEDDEB32184688CB221D1E42A74657FE9AC83679E51B925D617069FF259975C40D370D0D51F18D1C17358B9C197B00893AEE90BA06517787E8C4884E783F2A4B7633C62E7843B743688FA6296F11A6F4D584C2905EADA2076D289449F5DB07E2788F021D435DD188563CDAA1C89B0E7E87017788634AF18CAD9ADB8BA18E80C5BD0BE1424FF9135B07DD31A6F92F
-20241129003232 2 6 100 3071 2 C94F41FDB4E54DBDD1C7A49F586104E6D74F4CD07A2B9730A4FB5D40C24AB929C55B955144ADC62AEF2DF80D151E4F20E946F69C9B7AC7F01D1A916F3C1D23984DAF12A5CF18C5FDD9922AE0DBFFB31E9EAC765DCF315EBB0524E8B9246BC97169BE71440DF64D5884F63D9ECC8C96E312169E71BC1D25DCE1AE142F6C4D265BA36CBAAC0860E6C83C26B287461F4FE90C5D2CAF4A87937E12407CC632618086D75FB5A17ED87F8EEE71893A6890E74AA378BD6B91CD4CF264F0826110494D2492F6A45567AB8FF4C28142582D3E66E9D3961881DFA1877E2EC993E31A35017C8291B0C74BCF285F94BC6E8B5D0EDEE7F571BEDDEB32184688CB221D1E42A74657FE9AC83679E51B925D617069FF259975C40D370D0D51F18D1C17358B9C197B00893AEE90BA06517787E8C4884E783F2A4B7633C62E7843B743688FA6296F11A6F4D584C2905EADA2076D289449F5DB07E2788F021D435DD188563CDAA1C89B0E7E87017788634AF18CAD9ADB8BA18E80C5BD0BE1424FF9135B07DD31E1E02B
-20241129003238 2 6 100 3071 5 C94F41FDB4E54DBDD1C7A49F586104E6D74F4CD07A2B9730A4FB5D40C24AB929C55B955144ADC62AEF2DF80D151E4F20E946F69C9B7AC7F01D1A916F3C1D23984DAF12A5CF18C5FDD9922AE0DBFFB31E9EAC765DCF315EBB0524E8B9246BC97169BE71440DF64D5884F63D9ECC8C96E312169E71BC1D25DCE1AE142F6C4D265BA36CBAAC0860E6C83C26B287461F4FE90C5D2CAF4A87937E12407CC632618086D75FB5A17ED87F8EEE71893A6890E74AA378BD6B91CD4CF264F0826110494D2492F6A45567AB8FF4C28142582D3E66E9D3961881DFA1877E2EC993E31A35017C8291B0C74BCF285F94BC6E8B5D0EDEE7F571BEDDEB32184688CB221D1E42A74657FE9AC83679E51B925D617069FF259975C40D370D0D51F18D1C17358B9C197B00893AEE90BA06517787E8C4884E783F2A4B7633C62E7843B743688FA6296F11A6F4D584C2905EADA2076D289449F5DB07E2788F021D435DD188563CDAA1C89B0E7E87017788634AF18CAD9ADB8BA18E80C5BD0BE1424FF9135B07DD31F02307
-20241129003247 2 6 100 3071 2 C94F41FDB4E54DBDD1C7A49F586104E6D74F4CD07A2B9730A4FB5D40C24AB929C55B955144ADC62AEF2DF80D151E4F20E946F69C9B7AC7F01D1A916F3C1D23984DAF12A5CF18C5FDD9922AE0DBFFB31E9EAC765DCF315EBB0524E8B9246BC97169BE71440DF64D5884F63D9ECC8C96E312169E71BC1D25DCE1AE142F6C4D265BA36CBAAC0860E6C83C26B287461F4FE90C5D2CAF4A87937E12407CC632618086D75FB5A17ED87F8EEE71893A6890E74AA378BD6B91CD4CF264F0826110494D2492F6A45567AB8FF4C28142582D3E66E9D3961881DFA1877E2EC993E31A35017C8291B0C74BCF285F94BC6E8B5D0EDEE7F571BEDDEB32184688CB221D1E42A74657FE9AC83679E51B925D617069FF259975C40D370D0D51F18D1C17358B9C197B00893AEE90BA06517787E8C4884E783F2A4B7633C62E7843B743688FA6296F11A6F4D584C2905EADA2076D289449F5DB07E2788F021D435DD188563CDAA1C89B0E7E87017788634AF18CAD9ADB8BA18E80C5BD0BE1424FF9135B07DD32089003
-20241129003331 2 6 100 3071 2 C94F41FDB4E54DBDD1C7A49F586104E6D74F4CD07A2B9730A4FB5D40C24AB929C55B955144ADC62AEF2DF80D151E4F20E946F69C9B7AC7F01D1A916F3C1D23984DAF12A5CF18C5FDD9922AE0DBFFB31E9EAC765DCF315EBB0524E8B9246BC97169BE71440DF64D5884F63D9ECC8C96E312169E71BC1D25DCE1AE142F6C4D265BA36CBAAC0860E6C83C26B287461F4FE90C5D2CAF4A87937E12407CC632618086D75FB5A17ED87F8EEE71893A6890E74AA378BD6B91CD4CF264F0826110494D2492F6A45567AB8FF4C28142582D3E66E9D3961881DFA1877E2EC993E31A35017C8291B0C74BCF285F94BC6E8B5D0EDEE7F571BEDDEB32184688CB221D1E42A74657FE9AC83679E51B925D617069FF259975C40D370D0D51F18D1C17358B9C197B00893AEE90BA06517787E8C4884E783F2A4B7633C62E7843B743688FA6296F11A6F4D584C2905EADA2076D289449F5DB07E2788F021D435DD188563CDAA1C89B0E7E87017788634AF18CAD9ADB8BA18E80C5BD0BE1424FF9135B07DD328EF3EB
-20241129003450 2 6 100 3071 5 C94F41FDB4E54DBDD1C7A49F586104E6D74F4CD07A2B9730A4FB5D40C24AB929C55B955144ADC62AEF2DF80D151E4F20E946F69C9B7AC7F01D1A916F3C1D23984DAF12A5CF18C5FDD9922AE0DBFFB31E9EAC765DCF315EBB0524E8B9246BC97169BE71440DF64D5884F63D9ECC8C96E312169E71BC1D25DCE1AE142F6C4D265BA36CBAAC0860E6C83C26B287461F4FE90C5D2CAF4A87937E12407CC632618086D75FB5A17ED87F8EEE71893A6890E74AA378BD6B91CD4CF264F0826110494D2492F6A45567AB8FF4C28142582D3E66E9D3961881DFA1877E2EC993E31A35017C8291B0C74BCF285F94BC6E8B5D0EDEE7F571BEDDEB32184688CB221D1E42A74657FE9AC83679E51B925D617069FF259975C40D370D0D51F18D1C17358B9C197B00893AEE90BA06517787E8C4884E783F2A4B7633C62E7843B743688FA6296F11A6F4D584C2905EADA2076D289449F5DB07E2788F021D435DD188563CDAA1C89B0E7E87017788634AF18CAD9ADB8BA18E80C5BD0BE1424FF9135B07DD3388738F
-20241129003549 2 6 100 3071 5 C94F41FDB4E54DBDD1C7A49F586104E6D74F4CD07A2B9730A4FB5D40C24AB929C55B955144ADC62AEF2DF80D151E4F20E946F69C9B7AC7F01D1A916F3C1D23984DAF12A5CF18C5FDD9922AE0DBFFB31E9EAC765DCF315EBB0524E8B9246BC97169BE71440DF64D5884F63D9ECC8C96E312169E71BC1D25DCE1AE142F6C4D265BA36CBAAC0860E6C83C26B287461F4FE90C5D2CAF4A87937E12407CC632618086D75FB5A17ED87F8EEE71893A6890E74AA378BD6B91CD4CF264F0826110494D2492F6A45567AB8FF4C28142582D3E66E9D3961881DFA1877E2EC993E31A35017C8291B0C74BCF285F94BC6E8B5D0EDEE7F571BEDDEB32184688CB221D1E42A74657FE9AC83679E51B925D617069FF259975C40D370D0D51F18D1C17358B9C197B00893AEE90BA06517787E8C4884E783F2A4B7633C62E7843B743688FA6296F11A6F4D584C2905EADA2076D289449F5DB07E2788F021D435DD188563CDAA1C89B0E7E87017788634AF18CAD9ADB8BA18E80C5BD0BE1424FF9135B07DD344433C7
-20241129003558 2 6 100 3071 2 C94F41FDB4E54DBDD1C7A49F586104E6D74F4CD07A2B9730A4FB5D40C24AB929C55B955144ADC62AEF2DF80D151E4F20E946F69C9B7AC7F01D1A916F3C1D23984DAF12A5CF18C5FDD9922AE0DBFFB31E9EAC765DCF315EBB0524E8B9246BC97169BE71440DF64D5884F63D9ECC8C96E312169E71BC1D25DCE1AE142F6C4D265BA36CBAAC0860E6C83C26B287461F4FE90C5D2CAF4A87937E12407CC632618086D75FB5A17ED87F8EEE71893A6890E74AA378BD6B91CD4CF264F0826110494D2492F6A45567AB8FF4C28142582D3E66E9D3961881DFA1877E2EC993E31A35017C8291B0C74BCF285F94BC6E8B5D0EDEE7F571BEDDEB32184688CB221D1E42A74657FE9AC83679E51B925D617069FF259975C40D370D0D51F18D1C17358B9C197B00893AEE90BA06517787E8C4884E783F2A4B7633C62E7843B743688FA6296F11A6F4D584C2905EADA2076D289449F5DB07E2788F021D435DD188563CDAA1C89B0E7E87017788634AF18CAD9ADB8BA18E80C5BD0BE1424FF9135B07DD345EB43B
-20241129003708 2 6 100 3071 2 C94F41FDB4E54DBDD1C7A49F586104E6D74F4CD07A2B9730A4FB5D40C24AB929C55B955144ADC62AEF2DF80D151E4F20E946F69C9B7AC7F01D1A916F3C1D23984DAF12A5CF18C5FDD9922AE0DBFFB31E9EAC765DCF315EBB0524E8B9246BC97169BE71440DF64D5884F63D9ECC8C96E312169E71BC1D25DCE1AE142F6C4D265BA36CBAAC0860E6C83C26B287461F4FE90C5D2CAF4A87937E12407CC632618086D75FB5A17ED87F8EEE71893A6890E74AA378BD6B91CD4CF264F0826110494D2492F6A45567AB8FF4C28142582D3E66E9D3961881DFA1877E2EC993E31A35017C8291B0C74BCF285F94BC6E8B5D0EDEE7F571BEDDEB32184688CB221D1E42A74657FE9AC83679E51B925D617069FF259975C40D370D0D51F18D1C17358B9C197B00893AEE90BA06517787E8C4884E783F2A4B7633C62E7843B743688FA6296F11A6F4D584C2905EADA2076D289449F5DB07E2788F021D435DD188563CDAA1C89B0E7E87017788634AF18CAD9ADB8BA18E80C5BD0BE1424FF9135B07DD353F77AB
-20241129003723 2 6 100 3071 5 C94F41FDB4E54DBDD1C7A49F586104E6D74F4CD07A2B9730A4FB5D40C24AB929C55B955144ADC62AEF2DF80D151E4F20E946F69C9B7AC7F01D1A916F3C1D23984DAF12A5CF18C5FDD9922AE0DBFFB31E9EAC765DCF315EBB0524E8B9246BC97169BE71440DF64D5884F63D9ECC8C96E312169E71BC1D25DCE1AE142F6C4D265BA36CBAAC0860E6C83C26B287461F4FE90C5D2CAF4A87937E12407CC632618086D75FB5A17ED87F8EEE71893A6890E74AA378BD6B91CD4CF264F0826110494D2492F6A45567AB8FF4C28142582D3E66E9D3961881DFA1877E2EC993E31A35017C8291B0C74BCF285F94BC6E8B5D0EDEE7F571BEDDEB32184688CB221D1E42A74657FE9AC83679E51B925D617069FF259975C40D370D0D51F18D1C17358B9C197B00893AEE90BA06517787E8C4884E783F2A4B7633C62E7843B743688FA6296F11A6F4D584C2905EADA2076D289449F5DB07E2788F021D435DD188563CDAA1C89B0E7E87017788634AF18CAD9ADB8BA18E80C5BD0BE1424FF9135B07DD356DF4FF
-20241129003747 2 6 100 3071 2 C94F41FDB4E54DBDD1C7A49F586104E6D74F4CD07A2B9730A4FB5D40C24AB929C55B955144ADC62AEF2DF80D151E4F20E946F69C9B7AC7F01D1A916F3C1D23984DAF12A5CF18C5FDD9922AE0DBFFB31E9EAC765DCF315EBB0524E8B9246BC97169BE71440DF64D5884F63D9ECC8C96E312169E71BC1D25DCE1AE142F6C4D265BA36CBAAC0860E6C83C26B287461F4FE90C5D2CAF4A87937E12407CC632618086D75FB5A17ED87F8EEE71893A6890E74AA378BD6B91CD4CF264F0826110494D2492F6A45567AB8FF4C28142582D3E66E9D3961881DFA1877E2EC993E31A35017C8291B0C74BCF285F94BC6E8B5D0EDEE7F571BEDDEB32184688CB221D1E42A74657FE9AC83679E51B925D617069FF259975C40D370D0D51F18D1C17358B9C197B00893AEE90BA06517787E8C4884E783F2A4B7633C62E7843B743688FA6296F11A6F4D584C2905EADA2076D289449F5DB07E2788F021D435DD188563CDAA1C89B0E7E87017788634AF18CAD9ADB8BA18E80C5BD0BE1424FF9135B07DD35B352CB
-20241129003812 2 6 100 3071 2 C94F41FDB4E54DBDD1C7A49F586104E6D74F4CD07A2B9730A4FB5D40C24AB929C55B955144ADC62AEF2DF80D151E4F20E946F69C9B7AC7F01D1A916F3C1D23984DAF12A5CF18C5FDD9922AE0DBFFB31E9EAC765DCF315EBB0524E8B9246BC97169BE71440DF64D5884F63D9ECC8C96E312169E71BC1D25DCE1AE142F6C4D265BA36CBAAC0860E6C83C26B287461F4FE90C5D2CAF4A87937E12407CC632618086D75FB5A17ED87F8EEE71893A6890E74AA378BD6B91CD4CF264F0826110494D2492F6A45567AB8FF4C28142582D3E66E9D3961881DFA1877E2EC993E31A35017C8291B0C74BCF285F94BC6E8B5D0EDEE7F571BEDDEB32184688CB221D1E42A74657FE9AC83679E51B925D617069FF259975C40D370D0D51F18D1C17358B9C197B00893AEE90BA06517787E8C4884E783F2A4B7633C62E7843B743688FA6296F11A6F4D584C2905EADA2076D289449F5DB07E2788F021D435DD188563CDAA1C89B0E7E87017788634AF18CAD9ADB8BA18E80C5BD0BE1424FF9135B07DD36020023
-20241129003842 2 6 100 3071 5 C94F41FDB4E54DBDD1C7A49F586104E6D74F4CD07A2B9730A4FB5D40C24AB929C55B955144ADC62AEF2DF80D151E4F20E946F69C9B7AC7F01D1A916F3C1D23984DAF12A5CF18C5FDD9922AE0DBFFB31E9EAC765DCF315EBB0524E8B9246BC97169BE71440DF64D5884F63D9ECC8C96E312169E71BC1D25DCE1AE142F6C4D265BA36CBAAC0860E6C83C26B287461F4FE90C5D2CAF4A87937E12407CC632618086D75FB5A17ED87F8EEE71893A6890E74AA378BD6B91CD4CF264F0826110494D2492F6A45567AB8FF4C28142582D3E66E9D3961881DFA1877E2EC993E31A35017C8291B0C74BCF285F94BC6E8B5D0EDEE7F571BEDDEB32184688CB221D1E42A74657FE9AC83679E51B925D617069FF259975C40D370D0D51F18D1C17358B9C197B00893AEE90BA06517787E8C4884E783F2A4B7633C62E7843B743688FA6296F11A6F4D584C2905EADA2076D289449F5DB07E2788F021D435DD188563CDAA1C89B0E7E87017788634AF18CAD9ADB8BA18E80C5BD0BE1424FF9135B07DD3660A2C7
-20241129003859 2 6 100 3071 2 C94F41FDB4E54DBDD1C7A49F586104E6D74F4CD07A2B9730A4FB5D40C24AB929C55B955144ADC62AEF2DF80D151E4F20E946F69C9B7AC7F01D1A916F3C1D23984DAF12A5CF18C5FDD9922AE0DBFFB31E9EAC765DCF315EBB0524E8B9246BC97169BE71440DF64D5884F63D9ECC8C96E312169E71BC1D25DCE1AE142F6C4D265BA36CBAAC0860E6C83C26B287461F4FE90C5D2CAF4A87937E12407CC632618086D75FB5A17ED87F8EEE71893A6890E74AA378BD6B91CD4CF264F0826110494D2492F6A45567AB8FF4C28142582D3E66E9D3961881DFA1877E2EC993E31A35017C8291B0C74BCF285F94BC6E8B5D0EDEE7F571BEDDEB32184688CB221D1E42A74657FE9AC83679E51B925D617069FF259975C40D370D0D51F18D1C17358B9C197B00893AEE90BA06517787E8C4884E783F2A4B7633C62E7843B743688FA6296F11A6F4D584C2905EADA2076D289449F5DB07E2788F021D435DD188563CDAA1C89B0E7E87017788634AF18CAD9ADB8BA18E80C5BD0BE1424FF9135B07DD368F747B
-20241129003902 2 6 100 3071 2 C94F41FDB4E54DBDD1C7A49F586104E6D74F4CD07A2B9730A4FB5D40C24AB929C55B955144ADC62AEF2DF80D151E4F20E946F69C9B7AC7F01D1A916F3C1D23984DAF12A5CF18C5FDD9922AE0DBFFB31E9EAC765DCF315EBB0524E8B9246BC97169BE71440DF64D5884F63D9ECC8C96E312169E71BC1D25DCE1AE142F6C4D265BA36CBAAC0860E6C83C26B287461F4FE90C5D2CAF4A87937E12407CC632618086D75FB5A17ED87F8EEE71893A6890E74AA378BD6B91CD4CF264F0826110494D2492F6A45567AB8FF4C28142582D3E66E9D3961881DFA1877E2EC993E31A35017C8291B0C74BCF285F94BC6E8B5D0EDEE7F571BEDDEB32184688CB221D1E42A74657FE9AC83679E51B925D617069FF259975C40D370D0D51F18D1C17358B9C197B00893AEE90BA06517787E8C4884E783F2A4B7633C62E7843B743688FA6296F11A6F4D584C2905EADA2076D289449F5DB07E2788F021D435DD188563CDAA1C89B0E7E87017788634AF18CAD9ADB8BA18E80C5BD0BE1424FF9135B07DD3695A29B
-20241129003921 2 6 100 3071 2 C94F41FDB4E54DBDD1C7A49F586104E6D74F4CD07A2B9730A4FB5D40C24AB929C55B955144ADC62AEF2DF80D151E4F20E946F69C9B7AC7F01D1A916F3C1D23984DAF12A5CF18C5FDD9922AE0DBFFB31E9EAC765DCF315EBB0524E8B9246BC97169BE71440DF64D5884F63D9ECC8C96E312169E71BC1D25DCE1AE142F6C4D265BA36CBAAC0860E6C83C26B287461F4FE90C5D2CAF4A87937E12407CC632618086D75FB5A17ED87F8EEE71893A6890E74AA378BD6B91CD4CF264F0826110494D2492F6A45567AB8FF4C28142582D3E66E9D3961881DFA1877E2EC993E31A35017C8291B0C74BCF285F94BC6E8B5D0EDEE7F571BEDDEB32184688CB221D1E42A74657FE9AC83679E51B925D617069FF259975C40D370D0D51F18D1C17358B9C197B00893AEE90BA06517787E8C4884E783F2A4B7633C62E7843B743688FA6296F11A6F4D584C2905EADA2076D289449F5DB07E2788F021D435DD188563CDAA1C89B0E7E87017788634AF18CAD9ADB8BA18E80C5BD0BE1424FF9135B07DD36C9F673
-20241129004005 2 6 100 3071 5 C94F41FDB4E54DBDD1C7A49F586104E6D74F4CD07A2B9730A4FB5D40C24AB929C55B955144ADC62AEF2DF80D151E4F20E946F69C9B7AC7F01D1A916F3C1D23984DAF12A5CF18C5FDD9922AE0DBFFB31E9EAC765DCF315EBB0524E8B9246BC97169BE71440DF64D5884F63D9ECC8C96E312169E71BC1D25DCE1AE142F6C4D265BA36CBAAC0860E6C83C26B287461F4FE90C5D2CAF4A87937E12407CC632618086D75FB5A17ED87F8EEE71893A6890E74AA378BD6B91CD4CF264F0826110494D2492F6A45567AB8FF4C28142582D3E66E9D3961881DFA1877E2EC993E31A35017C8291B0C74BCF285F94BC6E8B5D0EDEE7F571BEDDEB32184688CB221D1E42A74657FE9AC83679E51B925D617069FF259975C40D370D0D51F18D1C17358B9C197B00893AEE90BA06517787E8C4884E783F2A4B7633C62E7843B743688FA6296F11A6F4D584C2905EADA2076D289449F5DB07E2788F021D435DD188563CDAA1C89B0E7E87017788634AF18CAD9ADB8BA18E80C5BD0BE1424FF9135B07DD3753CA0F
-20241129004008 2 6 100 3071 2 C94F41FDB4E54DBDD1C7A49F586104E6D74F4CD07A2B9730A4FB5D40C24AB929C55B955144ADC62AEF2DF80D151E4F20E946F69C9B7AC7F01D1A916F3C1D23984DAF12A5CF18C5FDD9922AE0DBFFB31E9EAC765DCF315EBB0524E8B9246BC97169BE71440DF64D5884F63D9ECC8C96E312169E71BC1D25DCE1AE142F6C4D265BA36CBAAC0860E6C83C26B287461F4FE90C5D2CAF4A87937E12407CC632618086D75FB5A17ED87F8EEE71893A6890E74AA378BD6B91CD4CF264F0826110494D2492F6A45567AB8FF4C28142582D3E66E9D3961881DFA1877E2EC993E31A35017C8291B0C74BCF285F94BC6E8B5D0EDEE7F571BEDDEB32184688CB221D1E42A74657FE9AC83679E51B925D617069FF259975C40D370D0D51F18D1C17358B9C197B00893AEE90BA06517787E8C4884E783F2A4B7633C62E7843B743688FA6296F11A6F4D584C2905EADA2076D289449F5DB07E2788F021D435DD188563CDAA1C89B0E7E87017788634AF18CAD9ADB8BA18E80C5BD0BE1424FF9135B07DD3758F683
-20241129004208 2 6 100 3071 2 C94F41FDB4E54DBDD1C7A49F586104E6D74F4CD07A2B9730A4FB5D40C24AB929C55B955144ADC62AEF2DF80D151E4F20E946F69C9B7AC7F01D1A916F3C1D23984DAF12A5CF18C5FDD9922AE0DBFFB31E9EAC765DCF315EBB0524E8B9246BC97169BE71440DF64D5884F63D9ECC8C96E312169E71BC1D25DCE1AE142F6C4D265BA36CBAAC0860E6C83C26B287461F4FE90C5D2CAF4A87937E12407CC632618086D75FB5A17ED87F8EEE71893A6890E74AA378BD6B91CD4CF264F0826110494D2492F6A45567AB8FF4C28142582D3E66E9D3961881DFA1877E2EC993E31A35017C8291B0C74BCF285F94BC6E8B5D0EDEE7F571BEDDEB32184688CB221D1E42A74657FE9AC83679E51B925D617069FF259975C40D370D0D51F18D1C17358B9C197B00893AEE90BA06517787E8C4884E783F2A4B7633C62E7843B743688FA6296F11A6F4D584C2905EADA2076D289449F5DB07E2788F021D435DD188563CDAA1C89B0E7E87017788634AF18CAD9ADB8BA18E80C5BD0BE1424FF9135B07DD38E3CD3B
-20241129004221 2 6 100 3071 2 C94F41FDB4E54DBDD1C7A49F586104E6D74F4CD07A2B9730A4FB5D40C24AB929C55B955144ADC62AEF2DF80D151E4F20E946F69C9B7AC7F01D1A916F3C1D23984DAF12A5CF18C5FDD9922AE0DBFFB31E9EAC765DCF315EBB0524E8B9246BC97169BE71440DF64D5884F63D9ECC8C96E312169E71BC1D25DCE1AE142F6C4D265BA36CBAAC0860E6C83C26B287461F4FE90C5D2CAF4A87937E12407CC632618086D75FB5A17ED87F8EEE71893A6890E74AA378BD6B91CD4CF264F0826110494D2492F6A45567AB8FF4C28142582D3E66E9D3961881DFA1877E2EC993E31A35017C8291B0C74BCF285F94BC6E8B5D0EDEE7F571BEDDEB32184688CB221D1E42A74657FE9AC83679E51B925D617069FF259975C40D370D0D51F18D1C17358B9C197B00893AEE90BA06517787E8C4884E783F2A4B7633C62E7843B743688FA6296F11A6F4D584C2905EADA2076D289449F5DB07E2788F021D435DD188563CDAA1C89B0E7E87017788634AF18CAD9ADB8BA18E80C5BD0BE1424FF9135B07DD390C377B
-20241129004322 2 6 100 3071 2 C94F41FDB4E54DBDD1C7A49F586104E6D74F4CD07A2B9730A4FB5D40C24AB929C55B955144ADC62AEF2DF80D151E4F20E946F69C9B7AC7F01D1A916F3C1D23984DAF12A5CF18C5FDD9922AE0DBFFB31E9EAC765DCF315EBB0524E8B9246BC97169BE71440DF64D5884F63D9ECC8C96E312169E71BC1D25DCE1AE142F6C4D265BA36CBAAC0860E6C83C26B287461F4FE90C5D2CAF4A87937E12407CC632618086D75FB5A17ED87F8EEE71893A6890E74AA378BD6B91CD4CF264F0826110494D2492F6A45567AB8FF4C28142582D3E66E9D3961881DFA1877E2EC993E31A35017C8291B0C74BCF285F94BC6E8B5D0EDEE7F571BEDDEB32184688CB221D1E42A74657FE9AC83679E51B925D617069FF259975C40D370D0D51F18D1C17358B9C197B00893AEE90BA06517787E8C4884E783F2A4B7633C62E7843B743688FA6296F11A6F4D584C2905EADA2076D289449F5DB07E2788F021D435DD188563CDAA1C89B0E7E87017788634AF18CAD9ADB8BA18E80C5BD0BE1424FF9135B07DD39CE5ACB
-20241129004335 2 6 100 3071 2 C94F41FDB4E54DBDD1C7A49F586104E6D74F4CD07A2B9730A4FB5D40C24AB929C55B955144ADC62AEF2DF80D151E4F20E946F69C9B7AC7F01D1A916F3C1D23984DAF12A5CF18C5FDD9922AE0DBFFB31E9EAC765DCF315EBB0524E8B9246BC97169BE71440DF64D5884F63D9ECC8C96E312169E71BC1D25DCE1AE142F6C4D265BA36CBAAC0860E6C83C26B287461F4FE90C5D2CAF4A87937E12407CC632618086D75FB5A17ED87F8EEE71893A6890E74AA378BD6B91CD4CF264F0826110494D2492F6A45567AB8FF4C28142582D3E66E9D3961881DFA1877E2EC993E31A35017C8291B0C74BCF285F94BC6E8B5D0EDEE7F571BEDDEB32184688CB221D1E42A74657FE9AC83679E51B925D617069FF259975C40D370D0D51F18D1C17358B9C197B00893AEE90BA06517787E8C4884E783F2A4B7633C62E7843B743688FA6296F11A6F4D584C2905EADA2076D289449F5DB07E2788F021D435DD188563CDAA1C89B0E7E87017788634AF18CAD9ADB8BA18E80C5BD0BE1424FF9135B07DD39EC486B
-20241129004341 2 6 100 3071 5 C94F41FDB4E54DBDD1C7A49F586104E6D74F4CD07A2B9730A4FB5D40C24AB929C55B955144ADC62AEF2DF80D151E4F20E946F69C9B7AC7F01D1A916F3C1D23984DAF12A5CF18C5FDD9922AE0DBFFB31E9EAC765DCF315EBB0524E8B9246BC97169BE71440DF64D5884F63D9ECC8C96E312169E71BC1D25DCE1AE142F6C4D265BA36CBAAC0860E6C83C26B287461F4FE90C5D2CAF4A87937E12407CC632618086D75FB5A17ED87F8EEE71893A6890E74AA378BD6B91CD4CF264F0826110494D2492F6A45567AB8FF4C28142582D3E66E9D3961881DFA1877E2EC993E31A35017C8291B0C74BCF285F94BC6E8B5D0EDEE7F571BEDDEB32184688CB221D1E42A74657FE9AC83679E51B925D617069FF259975C40D370D0D51F18D1C17358B9C197B00893AEE90BA06517787E8C4884E783F2A4B7633C62E7843B743688FA6296F11A6F4D584C2905EADA2076D289449F5DB07E2788F021D435DD188563CDAA1C89B0E7E87017788634AF18CAD9ADB8BA18E80C5BD0BE1424FF9135B07DD39F7B37F
-20241129004348 2 6 100 3071 5 C94F41FDB4E54DBDD1C7A49F586104E6D74F4CD07A2B9730A4FB5D40C24AB929C55B955144ADC62AEF2DF80D151E4F20E946F69C9B7AC7F01D1A916F3C1D23984DAF12A5CF18C5FDD9922AE0DBFFB31E9EAC765DCF315EBB0524E8B9246BC97169BE71440DF64D5884F63D9ECC8C96E312169E71BC1D25DCE1AE142F6C4D265BA36CBAAC0860E6C83C26B287461F4FE90C5D2CAF4A87937E12407CC632618086D75FB5A17ED87F8EEE71893A6890E74AA378BD6B91CD4CF264F0826110494D2492F6A45567AB8FF4C28142582D3E66E9D3961881DFA1877E2EC993E31A35017C8291B0C74BCF285F94BC6E8B5D0EDEE7F571BEDDEB32184688CB221D1E42A74657FE9AC83679E51B925D617069FF259975C40D370D0D51F18D1C17358B9C197B00893AEE90BA06517787E8C4884E783F2A4B7633C62E7843B743688FA6296F11A6F4D584C2905EADA2076D289449F5DB07E2788F021D435DD188563CDAA1C89B0E7E87017788634AF18CAD9ADB8BA18E80C5BD0BE1424FF9135B07DD3A089907
-20241129004413 2 6 100 3071 2 C94F41FDB4E54DBDD1C7A49F586104E6D74F4CD07A2B9730A4FB5D40C24AB929C55B955144ADC62AEF2DF80D151E4F20E946F69C9B7AC7F01D1A916F3C1D23984DAF12A5CF18C5FDD9922AE0DBFFB31E9EAC765DCF315EBB0524E8B9246BC97169BE71440DF64D5884F63D9ECC8C96E312169E71BC1D25DCE1AE142F6C4D265BA36CBAAC0860E6C83C26B287461F4FE90C5D2CAF4A87937E12407CC632618086D75FB5A17ED87F8EEE71893A6890E74AA378BD6B91CD4CF264F0826110494D2492F6A45567AB8FF4C28142582D3E66E9D3961881DFA1877E2EC993E31A35017C8291B0C74BCF285F94BC6E8B5D0EDEE7F571BEDDEB32184688CB221D1E42A74657FE9AC83679E51B925D617069FF259975C40D370D0D51F18D1C17358B9C197B00893AEE90BA06517787E8C4884E783F2A4B7633C62E7843B743688FA6296F11A6F4D584C2905EADA2076D289449F5DB07E2788F021D435DD188563CDAA1C89B0E7E87017788634AF18CAD9ADB8BA18E80C5BD0BE1424FF9135B07DD3A5136DB
-20241129004447 2 6 100 3071 2 C94F41FDB4E54DBDD1C7A49F586104E6D74F4CD07A2B9730A4FB5D40C24AB929C55B955144ADC62AEF2DF80D151E4F20E946F69C9B7AC7F01D1A916F3C1D23984DAF12A5CF18C5FDD9922AE0DBFFB31E9EAC765DCF315EBB0524E8B9246BC97169BE71440DF64D5884F63D9ECC8C96E312169E71BC1D25DCE1AE142F6C4D265BA36CBAAC0860E6C83C26B287461F4FE90C5D2CAF4A87937E12407CC632618086D75FB5A17ED87F8EEE71893A6890E74AA378BD6B91CD4CF264F0826110494D2492F6A45567AB8FF4C28142582D3E66E9D3961881DFA1877E2EC993E31A35017C8291B0C74BCF285F94BC6E8B5D0EDEE7F571BEDDEB32184688CB221D1E42A74657FE9AC83679E51B925D617069FF259975C40D370D0D51F18D1C17358B9C197B00893AEE90BA06517787E8C4884E783F2A4B7633C62E7843B743688FA6296F11A6F4D584C2905EADA2076D289449F5DB07E2788F021D435DD188563CDAA1C89B0E7E87017788634AF18CAD9ADB8BA18E80C5BD0BE1424FF9135B07DD3ABE89AB
-20241129004614 2 6 100 3071 2 C94F41FDB4E54DBDD1C7A49F586104E6D74F4CD07A2B9730A4FB5D40C24AB929C55B955144ADC62AEF2DF80D151E4F20E946F69C9B7AC7F01D1A916F3C1D23984DAF12A5CF18C5FDD9922AE0DBFFB31E9EAC765DCF315EBB0524E8B9246BC97169BE71440DF64D5884F63D9ECC8C96E312169E71BC1D25DCE1AE142F6C4D265BA36CBAAC0860E6C83C26B287461F4FE90C5D2CAF4A87937E12407CC632618086D75FB5A17ED87F8EEE71893A6890E74AA378BD6B91CD4CF264F0826110494D2492F6A45567AB8FF4C28142582D3E66E9D3961881DFA1877E2EC993E31A35017C8291B0C74BCF285F94BC6E8B5D0EDEE7F571BEDDEB32184688CB221D1E42A74657FE9AC83679E51B925D617069FF259975C40D370D0D51F18D1C17358B9C197B00893AEE90BA06517787E8C4884E783F2A4B7633C62E7843B743688FA6296F11A6F4D584C2905EADA2076D289449F5DB07E2788F021D435DD188563CDAA1C89B0E7E87017788634AF18CAD9ADB8BA18E80C5BD0BE1424FF9135B07DD3BD9A0DB
-20241129004627 2 6 100 3071 2 C94F41FDB4E54DBDD1C7A49F586104E6D74F4CD07A2B9730A4FB5D40C24AB929C55B955144ADC62AEF2DF80D151E4F20E946F69C9B7AC7F01D1A916F3C1D23984DAF12A5CF18C5FDD9922AE0DBFFB31E9EAC765DCF315EBB0524E8B9246BC97169BE71440DF64D5884F63D9ECC8C96E312169E71BC1D25DCE1AE142F6C4D265BA36CBAAC0860E6C83C26B287461F4FE90C5D2CAF4A87937E12407CC632618086D75FB5A17ED87F8EEE71893A6890E74AA378BD6B91CD4CF264F0826110494D2492F6A45567AB8FF4C28142582D3E66E9D3961881DFA1877E2EC993E31A35017C8291B0C74BCF285F94BC6E8B5D0EDEE7F571BEDDEB32184688CB221D1E42A74657FE9AC83679E51B925D617069FF259975C40D370D0D51F18D1C17358B9C197B00893AEE90BA06517787E8C4884E783F2A4B7633C62E7843B743688FA6296F11A6F4D584C2905EADA2076D289449F5DB07E2788F021D435DD188563CDAA1C89B0E7E87017788634AF18CAD9ADB8BA18E80C5BD0BE1424FF9135B07DD3BFC1AC3
-20241129004630 2 6 100 3071 2 C94F41FDB4E54DBDD1C7A49F586104E6D74F4CD07A2B9730A4FB5D40C24AB929C55B955144ADC62AEF2DF80D151E4F20E946F69C9B7AC7F01D1A916F3C1D23984DAF12A5CF18C5FDD9922AE0DBFFB31E9EAC765DCF315EBB0524E8B9246BC97169BE71440DF64D5884F63D9ECC8C96E312169E71BC1D25DCE1AE142F6C4D265BA36CBAAC0860E6C83C26B287461F4FE90C5D2CAF4A87937E12407CC632618086D75FB5A17ED87F8EEE71893A6890E74AA378BD6B91CD4CF264F0826110494D2492F6A45567AB8FF4C28142582D3E66E9D3961881DFA1877E2EC993E31A35017C8291B0C74BCF285F94BC6E8B5D0EDEE7F571BEDDEB32184688CB221D1E42A74657FE9AC83679E51B925D617069FF259975C40D370D0D51F18D1C17358B9C197B00893AEE90BA06517787E8C4884E783F2A4B7633C62E7843B743688FA6296F11A6F4D584C2905EADA2076D289449F5DB07E2788F021D435DD188563CDAA1C89B0E7E87017788634AF18CAD9ADB8BA18E80C5BD0BE1424FF9135B07DD3BFE5DDB
-20241129004648 2 6 100 3071 2 C94F41FDB4E54DBDD1C7A49F586104E6D74F4CD07A2B9730A4FB5D40C24AB929C55B955144ADC62AEF2DF80D151E4F20E946F69C9B7AC7F01D1A916F3C1D23984DAF12A5CF18C5FDD9922AE0DBFFB31E9EAC765DCF315EBB0524E8B9246BC97169BE71440DF64D5884F63D9ECC8C96E312169E71BC1D25DCE1AE142F6C4D265BA36CBAAC0860E6C83C26B287461F4FE90C5D2CAF4A87937E12407CC632618086D75FB5A17ED87F8EEE71893A6890E74AA378BD6B91CD4CF264F0826110494D2492F6A45567AB8FF4C28142582D3E66E9D3961881DFA1877E2EC993E31A35017C8291B0C74BCF285F94BC6E8B5D0EDEE7F571BEDDEB32184688CB221D1E42A74657FE9AC83679E51B925D617069FF259975C40D370D0D51F18D1C17358B9C197B00893AEE90BA06517787E8C4884E783F2A4B7633C62E7843B743688FA6296F11A6F4D584C2905EADA2076D289449F5DB07E2788F021D435DD188563CDAA1C89B0E7E87017788634AF18CAD9ADB8BA18E80C5BD0BE1424FF9135B07DD3C3863FB
-20241129004754 2 6 100 3071 5 C94F41FDB4E54DBDD1C7A49F586104E6D74F4CD07A2B9730A4FB5D40C24AB929C55B955144ADC62AEF2DF80D151E4F20E946F69C9B7AC7F01D1A916F3C1D23984DAF12A5CF18C5FDD9922AE0DBFFB31E9EAC765DCF315EBB0524E8B9246BC97169BE71440DF64D5884F63D9ECC8C96E312169E71BC1D25DCE1AE142F6C4D265BA36CBAAC0860E6C83C26B287461F4FE90C5D2CAF4A87937E12407CC632618086D75FB5A17ED87F8EEE71893A6890E74AA378BD6B91CD4CF264F0826110494D2492F6A45567AB8FF4C28142582D3E66E9D3961881DFA1877E2EC993E31A35017C8291B0C74BCF285F94BC6E8B5D0EDEE7F571BEDDEB32184688CB221D1E42A74657FE9AC83679E51B925D617069FF259975C40D370D0D51F18D1C17358B9C197B00893AEE90BA06517787E8C4884E783F2A4B7633C62E7843B743688FA6296F11A6F4D584C2905EADA2076D289449F5DB07E2788F021D435DD188563CDAA1C89B0E7E87017788634AF18CAD9ADB8BA18E80C5BD0BE1424FF9135B07DD3D09984F
-20241129004835 2 6 100 3071 2 C94F41FDB4E54DBDD1C7A49F586104E6D74F4CD07A2B9730A4FB5D40C24AB929C55B955144ADC62AEF2DF80D151E4F20E946F69C9B7AC7F01D1A916F3C1D23984DAF12A5CF18C5FDD9922AE0DBFFB31E9EAC765DCF315EBB0524E8B9246BC97169BE71440DF64D5884F63D9ECC8C96E312169E71BC1D25DCE1AE142F6C4D265BA36CBAAC0860E6C83C26B287461F4FE90C5D2CAF4A87937E12407CC632618086D75FB5A17ED87F8EEE71893A6890E74AA378BD6B91CD4CF264F0826110494D2492F6A45567AB8FF4C28142582D3E66E9D3961881DFA1877E2EC993E31A35017C8291B0C74BCF285F94BC6E8B5D0EDEE7F571BEDDEB32184688CB221D1E42A74657FE9AC83679E51B925D617069FF259975C40D370D0D51F18D1C17358B9C197B00893AEE90BA06517787E8C4884E783F2A4B7633C62E7843B743688FA6296F11A6F4D584C2905EADA2076D289449F5DB07E2788F021D435DD188563CDAA1C89B0E7E87017788634AF18CAD9ADB8BA18E80C5BD0BE1424FF9135B07DD3D875973
-20241129004842 2 6 100 3071 2 C94F41FDB4E54DBDD1C7A49F586104E6D74F4CD07A2B9730A4FB5D40C24AB929C55B955144ADC62AEF2DF80D151E4F20E946F69C9B7AC7F01D1A916F3C1D23984DAF12A5CF18C5FDD9922AE0DBFFB31E9EAC765DCF315EBB0524E8B9246BC97169BE71440DF64D5884F63D9ECC8C96E312169E71BC1D25DCE1AE142F6C4D265BA36CBAAC0860E6C83C26B287461F4FE90C5D2CAF4A87937E12407CC632618086D75FB5A17ED87F8EEE71893A6890E74AA378BD6B91CD4CF264F0826110494D2492F6A45567AB8FF4C28142582D3E66E9D3961881DFA1877E2EC993E31A35017C8291B0C74BCF285F94BC6E8B5D0EDEE7F571BEDDEB32184688CB221D1E42A74657FE9AC83679E51B925D617069FF259975C40D370D0D51F18D1C17358B9C197B00893AEE90BA06517787E8C4884E783F2A4B7633C62E7843B743688FA6296F11A6F4D584C2905EADA2076D289449F5DB07E2788F021D435DD188563CDAA1C89B0E7E87017788634AF18CAD9ADB8BA18E80C5BD0BE1424FF9135B07DD3D958953
-20241129004906 2 6 100 3071 2 C94F41FDB4E54DBDD1C7A49F586104E6D74F4CD07A2B9730A4FB5D40C24AB929C55B955144ADC62AEF2DF80D151E4F20E946F69C9B7AC7F01D1A916F3C1D23984DAF12A5CF18C5FDD9922AE0DBFFB31E9EAC765DCF315EBB0524E8B9246BC97169BE71440DF64D5884F63D9ECC8C96E312169E71BC1D25DCE1AE142F6C4D265BA36CBAAC0860E6C83C26B287461F4FE90C5D2CAF4A87937E12407CC632618086D75FB5A17ED87F8EEE71893A6890E74AA378BD6B91CD4CF264F0826110494D2492F6A45567AB8FF4C28142582D3E66E9D3961881DFA1877E2EC993E31A35017C8291B0C74BCF285F94BC6E8B5D0EDEE7F571BEDDEB32184688CB221D1E42A74657FE9AC83679E51B925D617069FF259975C40D370D0D51F18D1C17358B9C197B00893AEE90BA06517787E8C4884E783F2A4B7633C62E7843B743688FA6296F11A6F4D584C2905EADA2076D289449F5DB07E2788F021D435DD188563CDAA1C89B0E7E87017788634AF18CAD9ADB8BA18E80C5BD0BE1424FF9135B07DD3DDF57FB
-20241129005005 2 6 100 3071 2 C94F41FDB4E54DBDD1C7A49F586104E6D74F4CD07A2B9730A4FB5D40C24AB929C55B955144ADC62AEF2DF80D151E4F20E946F69C9B7AC7F01D1A916F3C1D23984DAF12A5CF18C5FDD9922AE0DBFFB31E9EAC765DCF315EBB0524E8B9246BC97169BE71440DF64D5884F63D9ECC8C96E312169E71BC1D25DCE1AE142F6C4D265BA36CBAAC0860E6C83C26B287461F4FE90C5D2CAF4A87937E12407CC632618086D75FB5A17ED87F8EEE71893A6890E74AA378BD6B91CD4CF264F0826110494D2492F6A45567AB8FF4C28142582D3E66E9D3961881DFA1877E2EC993E31A35017C8291B0C74BCF285F94BC6E8B5D0EDEE7F571BEDDEB32184688CB221D1E42A74657FE9AC83679E51B925D617069FF259975C40D370D0D51F18D1C17358B9C197B00893AEE90BA06517787E8C4884E783F2A4B7633C62E7843B743688FA6296F11A6F4D584C2905EADA2076D289449F5DB07E2788F021D435DD188563CDAA1C89B0E7E87017788634AF18CAD9ADB8BA18E80C5BD0BE1424FF9135B07DD3E9E3063
-20241129005036 2 6 100 3071 2 C94F41FDB4E54DBDD1C7A49F586104E6D74F4CD07A2B9730A4FB5D40C24AB929C55B955144ADC62AEF2DF80D151E4F20E946F69C9B7AC7F01D1A916F3C1D23984DAF12A5CF18C5FDD9922AE0DBFFB31E9EAC765DCF315EBB0524E8B9246BC97169BE71440DF64D5884F63D9ECC8C96E312169E71BC1D25DCE1AE142F6C4D265BA36CBAAC0860E6C83C26B287461F4FE90C5D2CAF4A87937E12407CC632618086D75FB5A17ED87F8EEE71893A6890E74AA378BD6B91CD4CF264F0826110494D2492F6A45567AB8FF4C28142582D3E66E9D3961881DFA1877E2EC993E31A35017C8291B0C74BCF285F94BC6E8B5D0EDEE7F571BEDDEB32184688CB221D1E42A74657FE9AC83679E51B925D617069FF259975C40D370D0D51F18D1C17358B9C197B00893AEE90BA06517787E8C4884E783F2A4B7633C62E7843B743688FA6296F11A6F4D584C2905EADA2076D289449F5DB07E2788F021D435DD188563CDAA1C89B0E7E87017788634AF18CAD9ADB8BA18E80C5BD0BE1424FF9135B07DD3EFEEAC3
-20241129005052 2 6 100 3071 2 C94F41FDB4E54DBDD1C7A49F586104E6D74F4CD07A2B9730A4FB5D40C24AB929C55B955144ADC62AEF2DF80D151E4F20E946F69C9B7AC7F01D1A916F3C1D23984DAF12A5CF18C5FDD9922AE0DBFFB31E9EAC765DCF315EBB0524E8B9246BC97169BE71440DF64D5884F63D9ECC8C96E312169E71BC1D25DCE1AE142F6C4D265BA36CBAAC0860E6C83C26B287461F4FE90C5D2CAF4A87937E12407CC632618086D75FB5A17ED87F8EEE71893A6890E74AA378BD6B91CD4CF264F0826110494D2492F6A45567AB8FF4C28142582D3E66E9D3961881DFA1877E2EC993E31A35017C8291B0C74BCF285F94BC6E8B5D0EDEE7F571BEDDEB32184688CB221D1E42A74657FE9AC83679E51B925D617069FF259975C40D370D0D51F18D1C17358B9C197B00893AEE90BA06517787E8C4884E783F2A4B7633C62E7843B743688FA6296F11A6F4D584C2905EADA2076D289449F5DB07E2788F021D435DD188563CDAA1C89B0E7E87017788634AF18CAD9ADB8BA18E80C5BD0BE1424FF9135B07DD3F2A5E03
-20241129005537 2 6 100 3071 5 C94F41FDB4E54DBDD1C7A49F586104E6D74F4CD07A2B9730A4FB5D40C24AB929C55B955144ADC62AEF2DF80D151E4F20E946F69C9B7AC7F01D1A916F3C1D23984DAF12A5CF18C5FDD9922AE0DBFFB31E9EAC765DCF315EBB0524E8B9246BC97169BE71440DF64D5884F63D9ECC8C96E312169E71BC1D25DCE1AE142F6C4D265BA36CBAAC0860E6C83C26B287461F4FE90C5D2CAF4A87937E12407CC632618086D75FB5A17ED87F8EEE71893A6890E74AA378BD6B91CD4CF264F0826110494D2492F6A45567AB8FF4C28142582D3E66E9D3961881DFA1877E2EC993E31A35017C8291B0C74BCF285F94BC6E8B5D0EDEE7F571BEDDEB32184688CB221D1E42A74657FE9AC83679E51B925D617069FF259975C40D370D0D51F18D1C17358B9C197B00893AEE90BA06517787E8C4884E783F2A4B7633C62E7843B743688FA6296F11A6F4D584C2905EADA2076D289449F5DB07E2788F021D435DD188563CDAA1C89B0E7E87017788634AF18CAD9ADB8BA18E80C5BD0BE1424FF9135B07DD42DD9C2F
-20241129005637 2 6 100 3071 5 F72B9D5B478FC38253834B862A5C515BA6212BAD106C43D243A9D021FF22434E6A1EA03FBACFA23A6FC66FE5C68B40013BA6D15844D35AA2127408DE731CCA98380661EE30E2480E9DB14A8EB484BF564838B45678ECB78800E41E499307253A0E4462C7E119ECAA096D496FF72C5CB823C5C38CC165B9EE0B5307005F9FE72FE34EF3C2EF456A3A4561245680205533E2C2DC31816DDFFB036922109B985F291F7ADDCA11FADD48E7D20C9F8D0E8AE073C4DD7269B1EF46ACC81BE52A053EFE3BEAB1BFA3822A10ABF2C95B27D406BF960FAA48A79D332A7138AAAB8828B1BD11BCE47ACFE934887A2B2DC6C7061EF8412B4912925FD5A9CE787C434B3FD5B39FA863EDA542574E22331F98E74F69283A9A8F9330FE597B1EE96E37C8DEBB0E861213F3BF5281F3753CC16B2AF1EAB12540517E0482FDF47C92B66C4CD5FA5C8725956DB4C5F435EFC44D2ABD17A078687DD7716CAC4683729BD6211E0CBADA144F28932906724F3B96501D1A897C088607B522F8C7586DAFC64CB14E5B5E8F
-20241129005819 2 6 100 3071 2 F72B9D5B478FC38253834B862A5C515BA6212BAD106C43D243A9D021FF22434E6A1EA03FBACFA23A6FC66FE5C68B40013BA6D15844D35AA2127408DE731CCA98380661EE30E2480E9DB14A8EB484BF564838B45678ECB78800E41E499307253A0E4462C7E119ECAA096D496FF72C5CB823C5C38CC165B9EE0B5307005F9FE72FE34EF3C2EF456A3A4561245680205533E2C2DC31816DDFFB036922109B985F291F7ADDCA11FADD48E7D20C9F8D0E8AE073C4DD7269B1EF46ACC81BE52A053EFE3BEAB1BFA3822A10ABF2C95B27D406BF960FAA48A79D332A7138AAAB8828B1BD11BCE47ACFE934887A2B2DC6C7061EF8412B4912925FD5A9CE787C434B3FD5B39FA863EDA542574E22331F98E74F69283A9A8F9330FE597B1EE96E37C8DEBB0E861213F3BF5281F3753CC16B2AF1EAB12540517E0482FDF47C92B66C4CD5FA5C8725956DB4C5F435EFC44D2ABD17A078687DD7716CAC4683729BD6211E0CBADA144F28932906724F3B96501D1A897C088607B522F8C7586DAFC64CB14FA714FB
-20241129010001 2 6 100 3071 2 F72B9D5B478FC38253834B862A5C515BA6212BAD106C43D243A9D021FF22434E6A1EA03FBACFA23A6FC66FE5C68B40013BA6D15844D35AA2127408DE731CCA98380661EE30E2480E9DB14A8EB484BF564838B45678ECB78800E41E499307253A0E4462C7E119ECAA096D496FF72C5CB823C5C38CC165B9EE0B5307005F9FE72FE34EF3C2EF456A3A4561245680205533E2C2DC31816DDFFB036922109B985F291F7ADDCA11FADD48E7D20C9F8D0E8AE073C4DD7269B1EF46ACC81BE52A053EFE3BEAB1BFA3822A10ABF2C95B27D406BF960FAA48A79D332A7138AAAB8828B1BD11BCE47ACFE934887A2B2DC6C7061EF8412B4912925FD5A9CE787C434B3FD5B39FA863EDA542574E22331F98E74F69283A9A8F9330FE597B1EE96E37C8DEBB0E861213F3BF5281F3753CC16B2AF1EAB12540517E0482FDF47C92B66C4CD5FA5C8725956DB4C5F435EFC44D2ABD17A078687DD7716CAC4683729BD6211E0CBADA144F28932906724F3B96501D1A897C088607B522F8C7586DAFC64CB150F56483
-20241129010010 2 6 100 3071 2 F72B9D5B478FC38253834B862A5C515BA6212BAD106C43D243A9D021FF22434E6A1EA03FBACFA23A6FC66FE5C68B40013BA6D15844D35AA2127408DE731CCA98380661EE30E2480E9DB14A8EB484BF564838B45678ECB78800E41E499307253A0E4462C7E119ECAA096D496FF72C5CB823C5C38CC165B9EE0B5307005F9FE72FE34EF3C2EF456A3A4561245680205533E2C2DC31816DDFFB036922109B985F291F7ADDCA11FADD48E7D20C9F8D0E8AE073C4DD7269B1EF46ACC81BE52A053EFE3BEAB1BFA3822A10ABF2C95B27D406BF960FAA48A79D332A7138AAAB8828B1BD11BCE47ACFE934887A2B2DC6C7061EF8412B4912925FD5A9CE787C434B3FD5B39FA863EDA542574E22331F98E74F69283A9A8F9330FE597B1EE96E37C8DEBB0E861213F3BF5281F3753CC16B2AF1EAB12540517E0482FDF47C92B66C4CD5FA5C8725956DB4C5F435EFC44D2ABD17A078687DD7716CAC4683729BD6211E0CBADA144F28932906724F3B96501D1A897C088607B522F8C7586DAFC64CB1510A25CB
-20241129010049 2 6 100 3071 2 F72B9D5B478FC38253834B862A5C515BA6212BAD106C43D243A9D021FF22434E6A1EA03FBACFA23A6FC66FE5C68B40013BA6D15844D35AA2127408DE731CCA98380661EE30E2480E9DB14A8EB484BF564838B45678ECB78800E41E499307253A0E4462C7E119ECAA096D496FF72C5CB823C5C38CC165B9EE0B5307005F9FE72FE34EF3C2EF456A3A4561245680205533E2C2DC31816DDFFB036922109B985F291F7ADDCA11FADD48E7D20C9F8D0E8AE073C4DD7269B1EF46ACC81BE52A053EFE3BEAB1BFA3822A10ABF2C95B27D406BF960FAA48A79D332A7138AAAB8828B1BD11BCE47ACFE934887A2B2DC6C7061EF8412B4912925FD5A9CE787C434B3FD5B39FA863EDA542574E22331F98E74F69283A9A8F9330FE597B1EE96E37C8DEBB0E861213F3BF5281F3753CC16B2AF1EAB12540517E0482FDF47C92B66C4CD5FA5C8725956DB4C5F435EFC44D2ABD17A078687DD7716CAC4683729BD6211E0CBADA144F28932906724F3B96501D1A897C088607B522F8C7586DAFC64CB15189B8EB
-20241129010057 2 6 100 3071 2 F72B9D5B478FC38253834B862A5C515BA6212BAD106C43D243A9D021FF22434E6A1EA03FBACFA23A6FC66FE5C68B40013BA6D15844D35AA2127408DE731CCA98380661EE30E2480E9DB14A8EB484BF564838B45678ECB78800E41E499307253A0E4462C7E119ECAA096D496FF72C5CB823C5C38CC165B9EE0B5307005F9FE72FE34EF3C2EF456A3A4561245680205533E2C2DC31816DDFFB036922109B985F291F7ADDCA11FADD48E7D20C9F8D0E8AE073C4DD7269B1EF46ACC81BE52A053EFE3BEAB1BFA3822A10ABF2C95B27D406BF960FAA48A79D332A7138AAAB8828B1BD11BCE47ACFE934887A2B2DC6C7061EF8412B4912925FD5A9CE787C434B3FD5B39FA863EDA542574E22331F98E74F69283A9A8F9330FE597B1EE96E37C8DEBB0E861213F3BF5281F3753CC16B2AF1EAB12540517E0482FDF47C92B66C4CD5FA5C8725956DB4C5F435EFC44D2ABD17A078687DD7716CAC4683729BD6211E0CBADA144F28932906724F3B96501D1A897C088607B522F8C7586DAFC64CB1519DABAB
-20241129010104 2 6 100 3071 2 F72B9D5B478FC38253834B862A5C515BA6212BAD106C43D243A9D021FF22434E6A1EA03FBACFA23A6FC66FE5C68B40013BA6D15844D35AA2127408DE731CCA98380661EE30E2480E9DB14A8EB484BF564838B45678ECB78800E41E499307253A0E4462C7E119ECAA096D496FF72C5CB823C5C38CC165B9EE0B5307005F9FE72FE34EF3C2EF456A3A4561245680205533E2C2DC31816DDFFB036922109B985F291F7ADDCA11FADD48E7D20C9F8D0E8AE073C4DD7269B1EF46ACC81BE52A053EFE3BEAB1BFA3822A10ABF2C95B27D406BF960FAA48A79D332A7138AAAB8828B1BD11BCE47ACFE934887A2B2DC6C7061EF8412B4912925FD5A9CE787C434B3FD5B39FA863EDA542574E22331F98E74F69283A9A8F9330FE597B1EE96E37C8DEBB0E861213F3BF5281F3753CC16B2AF1EAB12540517E0482FDF47C92B66C4CD5FA5C8725956DB4C5F435EFC44D2ABD17A078687DD7716CAC4683729BD6211E0CBADA144F28932906724F3B96501D1A897C088607B522F8C7586DAFC64CB151AE01C3
-20241129010114 2 6 100 3071 5 F72B9D5B478FC38253834B862A5C515BA6212BAD106C43D243A9D021FF22434E6A1EA03FBACFA23A6FC66FE5C68B40013BA6D15844D35AA2127408DE731CCA98380661EE30E2480E9DB14A8EB484BF564838B45678ECB78800E41E499307253A0E4462C7E119ECAA096D496FF72C5CB823C5C38CC165B9EE0B5307005F9FE72FE34EF3C2EF456A3A4561245680205533E2C2DC31816DDFFB036922109B985F291F7ADDCA11FADD48E7D20C9F8D0E8AE073C4DD7269B1EF46ACC81BE52A053EFE3BEAB1BFA3822A10ABF2C95B27D406BF960FAA48A79D332A7138AAAB8828B1BD11BCE47ACFE934887A2B2DC6C7061EF8412B4912925FD5A9CE787C434B3FD5B39FA863EDA542574E22331F98E74F69283A9A8F9330FE597B1EE96E37C8DEBB0E861213F3BF5281F3753CC16B2AF1EAB12540517E0482FDF47C92B66C4CD5FA5C8725956DB4C5F435EFC44D2ABD17A078687DD7716CAC4683729BD6211E0CBADA144F28932906724F3B96501D1A897C088607B522F8C7586DAFC64CB151C91AA7
-20241129010216 2 6 100 3071 5 F72B9D5B478FC38253834B862A5C515BA6212BAD106C43D243A9D021FF22434E6A1EA03FBACFA23A6FC66FE5C68B40013BA6D15844D35AA2127408DE731CCA98380661EE30E2480E9DB14A8EB484BF564838B45678ECB78800E41E499307253A0E4462C7E119ECAA096D496FF72C5CB823C5C38CC165B9EE0B5307005F9FE72FE34EF3C2EF456A3A4561245680205533E2C2DC31816DDFFB036922109B985F291F7ADDCA11FADD48E7D20C9F8D0E8AE073C4DD7269B1EF46ACC81BE52A053EFE3BEAB1BFA3822A10ABF2C95B27D406BF960FAA48A79D332A7138AAAB8828B1BD11BCE47ACFE934887A2B2DC6C7061EF8412B4912925FD5A9CE787C434B3FD5B39FA863EDA542574E22331F98E74F69283A9A8F9330FE597B1EE96E37C8DEBB0E861213F3BF5281F3753CC16B2AF1EAB12540517E0482FDF47C92B66C4CD5FA5C8725956DB4C5F435EFC44D2ABD17A078687DD7716CAC4683729BD6211E0CBADA144F28932906724F3B96501D1A897C088607B522F8C7586DAFC64CB1528CD42F
-20241129010239 2 6 100 3071 2 F72B9D5B478FC38253834B862A5C515BA6212BAD106C43D243A9D021FF22434E6A1EA03FBACFA23A6FC66FE5C68B40013BA6D15844D35AA2127408DE731CCA98380661EE30E2480E9DB14A8EB484BF564838B45678ECB78800E41E499307253A0E4462C7E119ECAA096D496FF72C5CB823C5C38CC165B9EE0B5307005F9FE72FE34EF3C2EF456A3A4561245680205533E2C2DC31816DDFFB036922109B985F291F7ADDCA11FADD48E7D20C9F8D0E8AE073C4DD7269B1EF46ACC81BE52A053EFE3BEAB1BFA3822A10ABF2C95B27D406BF960FAA48A79D332A7138AAAB8828B1BD11BCE47ACFE934887A2B2DC6C7061EF8412B4912925FD5A9CE787C434B3FD5B39FA863EDA542574E22331F98E74F69283A9A8F9330FE597B1EE96E37C8DEBB0E861213F3BF5281F3753CC16B2AF1EAB12540517E0482FDF47C92B66C4CD5FA5C8725956DB4C5F435EFC44D2ABD17A078687DD7716CAC4683729BD6211E0CBADA144F28932906724F3B96501D1A897C088607B522F8C7586DAFC64CB152D65F33
-20241129010312 2 6 100 3071 5 F72B9D5B478FC38253834B862A5C515BA6212BAD106C43D243A9D021FF22434E6A1EA03FBACFA23A6FC66FE5C68B40013BA6D15844D35AA2127408DE731CCA98380661EE30E2480E9DB14A8EB484BF564838B45678ECB78800E41E499307253A0E4462C7E119ECAA096D496FF72C5CB823C5C38CC165B9EE0B5307005F9FE72FE34EF3C2EF456A3A4561245680205533E2C2DC31816DDFFB036922109B985F291F7ADDCA11FADD48E7D20C9F8D0E8AE073C4DD7269B1EF46ACC81BE52A053EFE3BEAB1BFA3822A10ABF2C95B27D406BF960FAA48A79D332A7138AAAB8828B1BD11BCE47ACFE934887A2B2DC6C7061EF8412B4912925FD5A9CE787C434B3FD5B39FA863EDA542574E22331F98E74F69283A9A8F9330FE597B1EE96E37C8DEBB0E861213F3BF5281F3753CC16B2AF1EAB12540517E0482FDF47C92B66C4CD5FA5C8725956DB4C5F435EFC44D2ABD17A078687DD7716CAC4683729BD6211E0CBADA144F28932906724F3B96501D1A897C088607B522F8C7586DAFC64CB1533E97D7
-20241129010433 2 6 100 3071 5 F72B9D5B478FC38253834B862A5C515BA6212BAD106C43D243A9D021FF22434E6A1EA03FBACFA23A6FC66FE5C68B40013BA6D15844D35AA2127408DE731CCA98380661EE30E2480E9DB14A8EB484BF564838B45678ECB78800E41E499307253A0E4462C7E119ECAA096D496FF72C5CB823C5C38CC165B9EE0B5307005F9FE72FE34EF3C2EF456A3A4561245680205533E2C2DC31816DDFFB036922109B985F291F7ADDCA11FADD48E7D20C9F8D0E8AE073C4DD7269B1EF46ACC81BE52A053EFE3BEAB1BFA3822A10ABF2C95B27D406BF960FAA48A79D332A7138AAAB8828B1BD11BCE47ACFE934887A2B2DC6C7061EF8412B4912925FD5A9CE787C434B3FD5B39FA863EDA542574E22331F98E74F69283A9A8F9330FE597B1EE96E37C8DEBB0E861213F3BF5281F3753CC16B2AF1EAB12540517E0482FDF47C92B66C4CD5FA5C8725956DB4C5F435EFC44D2ABD17A078687DD7716CAC4683729BD6211E0CBADA144F28932906724F3B96501D1A897C088607B522F8C7586DAFC64CB1544811A7
-20241129010523 2 6 100 3071 5 F72B9D5B478FC38253834B862A5C515BA6212BAD106C43D243A9D021FF22434E6A1EA03FBACFA23A6FC66FE5C68B40013BA6D15844D35AA2127408DE731CCA98380661EE30E2480E9DB14A8EB484BF564838B45678ECB78800E41E499307253A0E4462C7E119ECAA096D496FF72C5CB823C5C38CC165B9EE0B5307005F9FE72FE34EF3C2EF456A3A4561245680205533E2C2DC31816DDFFB036922109B985F291F7ADDCA11FADD48E7D20C9F8D0E8AE073C4DD7269B1EF46ACC81BE52A053EFE3BEAB1BFA3822A10ABF2C95B27D406BF960FAA48A79D332A7138AAAB8828B1BD11BCE47ACFE934887A2B2DC6C7061EF8412B4912925FD5A9CE787C434B3FD5B39FA863EDA542574E22331F98E74F69283A9A8F9330FE597B1EE96E37C8DEBB0E861213F3BF5281F3753CC16B2AF1EAB12540517E0482FDF47C92B66C4CD5FA5C8725956DB4C5F435EFC44D2ABD17A078687DD7716CAC4683729BD6211E0CBADA144F28932906724F3B96501D1A897C088607B522F8C7586DAFC64CB154E65E7F
-20241129010605 2 6 100 3071 2 F72B9D5B478FC38253834B862A5C515BA6212BAD106C43D243A9D021FF22434E6A1EA03FBACFA23A6FC66FE5C68B40013BA6D15844D35AA2127408DE731CCA98380661EE30E2480E9DB14A8EB484BF564838B45678ECB78800E41E499307253A0E4462C7E119ECAA096D496FF72C5CB823C5C38CC165B9EE0B5307005F9FE72FE34EF3C2EF456A3A4561245680205533E2C2DC31816DDFFB036922109B985F291F7ADDCA11FADD48E7D20C9F8D0E8AE073C4DD7269B1EF46ACC81BE52A053EFE3BEAB1BFA3822A10ABF2C95B27D406BF960FAA48A79D332A7138AAAB8828B1BD11BCE47ACFE934887A2B2DC6C7061EF8412B4912925FD5A9CE787C434B3FD5B39FA863EDA542574E22331F98E74F69283A9A8F9330FE597B1EE96E37C8DEBB0E861213F3BF5281F3753CC16B2AF1EAB12540517E0482FDF47C92B66C4CD5FA5C8725956DB4C5F435EFC44D2ABD17A078687DD7716CAC4683729BD6211E0CBADA144F28932906724F3B96501D1A897C088607B522F8C7586DAFC64CB1556C058B
-20241129010625 2 6 100 3071 5 F72B9D5B478FC38253834B862A5C515BA6212BAD106C43D243A9D021FF22434E6A1EA03FBACFA23A6FC66FE5C68B40013BA6D15844D35AA2127408DE731CCA98380661EE30E2480E9DB14A8EB484BF564838B45678ECB78800E41E499307253A0E4462C7E119ECAA096D496FF72C5CB823C5C38CC165B9EE0B5307005F9FE72FE34EF3C2EF456A3A4561245680205533E2C2DC31816DDFFB036922109B985F291F7ADDCA11FADD48E7D20C9F8D0E8AE073C4DD7269B1EF46ACC81BE52A053EFE3BEAB1BFA3822A10ABF2C95B27D406BF960FAA48A79D332A7138AAAB8828B1BD11BCE47ACFE934887A2B2DC6C7061EF8412B4912925FD5A9CE787C434B3FD5B39FA863EDA542574E22331F98E74F69283A9A8F9330FE597B1EE96E37C8DEBB0E861213F3BF5281F3753CC16B2AF1EAB12540517E0482FDF47C92B66C4CD5FA5C8725956DB4C5F435EFC44D2ABD17A078687DD7716CAC4683729BD6211E0CBADA144F28932906724F3B96501D1A897C088607B522F8C7586DAFC64CB155A73F37
-20241129010718 2 6 100 3071 5 F72B9D5B478FC38253834B862A5C515BA6212BAD106C43D243A9D021FF22434E6A1EA03FBACFA23A6FC66FE5C68B40013BA6D15844D35AA2127408DE731CCA98380661EE30E2480E9DB14A8EB484BF564838B45678ECB78800E41E499307253A0E4462C7E119ECAA096D496FF72C5CB823C5C38CC165B9EE0B5307005F9FE72FE34EF3C2EF456A3A4561245680205533E2C2DC31816DDFFB036922109B985F291F7ADDCA11FADD48E7D20C9F8D0E8AE073C4DD7269B1EF46ACC81BE52A053EFE3BEAB1BFA3822A10ABF2C95B27D406BF960FAA48A79D332A7138AAAB8828B1BD11BCE47ACFE934887A2B2DC6C7061EF8412B4912925FD5A9CE787C434B3FD5B39FA863EDA542574E22331F98E74F69283A9A8F9330FE597B1EE96E37C8DEBB0E861213F3BF5281F3753CC16B2AF1EAB12540517E0482FDF47C92B66C4CD5FA5C8725956DB4C5F435EFC44D2ABD17A078687DD7716CAC4683729BD6211E0CBADA144F28932906724F3B96501D1A897C088607B522F8C7586DAFC64CB156533A8F
-20241129010827 2 6 100 3071 2 F72B9D5B478FC38253834B862A5C515BA6212BAD106C43D243A9D021FF22434E6A1EA03FBACFA23A6FC66FE5C68B40013BA6D15844D35AA2127408DE731CCA98380661EE30E2480E9DB14A8EB484BF564838B45678ECB78800E41E499307253A0E4462C7E119ECAA096D496FF72C5CB823C5C38CC165B9EE0B5307005F9FE72FE34EF3C2EF456A3A4561245680205533E2C2DC31816DDFFB036922109B985F291F7ADDCA11FADD48E7D20C9F8D0E8AE073C4DD7269B1EF46ACC81BE52A053EFE3BEAB1BFA3822A10ABF2C95B27D406BF960FAA48A79D332A7138AAAB8828B1BD11BCE47ACFE934887A2B2DC6C7061EF8412B4912925FD5A9CE787C434B3FD5B39FA863EDA542574E22331F98E74F69283A9A8F9330FE597B1EE96E37C8DEBB0E861213F3BF5281F3753CC16B2AF1EAB12540517E0482FDF47C92B66C4CD5FA5C8725956DB4C5F435EFC44D2ABD17A078687DD7716CAC4683729BD6211E0CBADA144F28932906724F3B96501D1A897C088607B522F8C7586DAFC64CB15733560B
-20241129010830 2 6 100 3071 2 F72B9D5B478FC38253834B862A5C515BA6212BAD106C43D243A9D021FF22434E6A1EA03FBACFA23A6FC66FE5C68B40013BA6D15844D35AA2127408DE731CCA98380661EE30E2480E9DB14A8EB484BF564838B45678ECB78800E41E499307253A0E4462C7E119ECAA096D496FF72C5CB823C5C38CC165B9EE0B5307005F9FE72FE34EF3C2EF456A3A4561245680205533E2C2DC31816DDFFB036922109B985F291F7ADDCA11FADD48E7D20C9F8D0E8AE073C4DD7269B1EF46ACC81BE52A053EFE3BEAB1BFA3822A10ABF2C95B27D406BF960FAA48A79D332A7138AAAB8828B1BD11BCE47ACFE934887A2B2DC6C7061EF8412B4912925FD5A9CE787C434B3FD5B39FA863EDA542574E22331F98E74F69283A9A8F9330FE597B1EE96E37C8DEBB0E861213F3BF5281F3753CC16B2AF1EAB12540517E0482FDF47C92B66C4CD5FA5C8725956DB4C5F435EFC44D2ABD17A078687DD7716CAC4683729BD6211E0CBADA144F28932906724F3B96501D1A897C088607B522F8C7586DAFC64CB15735A50B
-20241129011308 2 6 100 3071 5 F72B9D5B478FC38253834B862A5C515BA6212BAD106C43D243A9D021FF22434E6A1EA03FBACFA23A6FC66FE5C68B40013BA6D15844D35AA2127408DE731CCA98380661EE30E2480E9DB14A8EB484BF564838B45678ECB78800E41E499307253A0E4462C7E119ECAA096D496FF72C5CB823C5C38CC165B9EE0B5307005F9FE72FE34EF3C2EF456A3A4561245680205533E2C2DC31816DDFFB036922109B985F291F7ADDCA11FADD48E7D20C9F8D0E8AE073C4DD7269B1EF46ACC81BE52A053EFE3BEAB1BFA3822A10ABF2C95B27D406BF960FAA48A79D332A7138AAAB8828B1BD11BCE47ACFE934887A2B2DC6C7061EF8412B4912925FD5A9CE787C434B3FD5B39FA863EDA542574E22331F98E74F69283A9A8F9330FE597B1EE96E37C8DEBB0E861213F3BF5281F3753CC16B2AF1EAB12540517E0482FDF47C92B66C4CD5FA5C8725956DB4C5F435EFC44D2ABD17A078687DD7716CAC4683729BD6211E0CBADA144F28932906724F3B96501D1A897C088607B522F8C7586DAFC64CB15AD92877
-20241129011325 2 6 100 3071 5 F72B9D5B478FC38253834B862A5C515BA6212BAD106C43D243A9D021FF22434E6A1EA03FBACFA23A6FC66FE5C68B40013BA6D15844D35AA2127408DE731CCA98380661EE30E2480E9DB14A8EB484BF564838B45678ECB78800E41E499307253A0E4462C7E119ECAA096D496FF72C5CB823C5C38CC165B9EE0B5307005F9FE72FE34EF3C2EF456A3A4561245680205533E2C2DC31816DDFFB036922109B985F291F7ADDCA11FADD48E7D20C9F8D0E8AE073C4DD7269B1EF46ACC81BE52A053EFE3BEAB1BFA3822A10ABF2C95B27D406BF960FAA48A79D332A7138AAAB8828B1BD11BCE47ACFE934887A2B2DC6C7061EF8412B4912925FD5A9CE787C434B3FD5B39FA863EDA542574E22331F98E74F69283A9A8F9330FE597B1EE96E37C8DEBB0E861213F3BF5281F3753CC16B2AF1EAB12540517E0482FDF47C92B66C4CD5FA5C8725956DB4C5F435EFC44D2ABD17A078687DD7716CAC4683729BD6211E0CBADA144F28932906724F3B96501D1A897C088607B522F8C7586DAFC64CB15B0BC97F
-20241129011417 2 6 100 3071 2 F72B9D5B478FC38253834B862A5C515BA6212BAD106C43D243A9D021FF22434E6A1EA03FBACFA23A6FC66FE5C68B40013BA6D15844D35AA2127408DE731CCA98380661EE30E2480E9DB14A8EB484BF564838B45678ECB78800E41E499307253A0E4462C7E119ECAA096D496FF72C5CB823C5C38CC165B9EE0B5307005F9FE72FE34EF3C2EF456A3A4561245680205533E2C2DC31816DDFFB036922109B985F291F7ADDCA11FADD48E7D20C9F8D0E8AE073C4DD7269B1EF46ACC81BE52A053EFE3BEAB1BFA3822A10ABF2C95B27D406BF960FAA48A79D332A7138AAAB8828B1BD11BCE47ACFE934887A2B2DC6C7061EF8412B4912925FD5A9CE787C434B3FD5B39FA863EDA542574E22331F98E74F69283A9A8F9330FE597B1EE96E37C8DEBB0E861213F3BF5281F3753CC16B2AF1EAB12540517E0482FDF47C92B66C4CD5FA5C8725956DB4C5F435EFC44D2ABD17A078687DD7716CAC4683729BD6211E0CBADA144F28932906724F3B96501D1A897C088607B522F8C7586DAFC64CB15BB2F9E3
-20241129011431 2 6 100 3071 2 F72B9D5B478FC38253834B862A5C515BA6212BAD106C43D243A9D021FF22434E6A1EA03FBACFA23A6FC66FE5C68B40013BA6D15844D35AA2127408DE731CCA98380661EE30E2480E9DB14A8EB484BF564838B45678ECB78800E41E499307253A0E4462C7E119ECAA096D496FF72C5CB823C5C38CC165B9EE0B5307005F9FE72FE34EF3C2EF456A3A4561245680205533E2C2DC31816DDFFB036922109B985F291F7ADDCA11FADD48E7D20C9F8D0E8AE073C4DD7269B1EF46ACC81BE52A053EFE3BEAB1BFA3822A10ABF2C95B27D406BF960FAA48A79D332A7138AAAB8828B1BD11BCE47ACFE934887A2B2DC6C7061EF8412B4912925FD5A9CE787C434B3FD5B39FA863EDA542574E22331F98E74F69283A9A8F9330FE597B1EE96E37C8DEBB0E861213F3BF5281F3753CC16B2AF1EAB12540517E0482FDF47C92B66C4CD5FA5C8725956DB4C5F435EFC44D2ABD17A078687DD7716CAC4683729BD6211E0CBADA144F28932906724F3B96501D1A897C088607B522F8C7586DAFC64CB15BDC12E3
-20241129011445 2 6 100 3071 2 F72B9D5B478FC38253834B862A5C515BA6212BAD106C43D243A9D021FF22434E6A1EA03FBACFA23A6FC66FE5C68B40013BA6D15844D35AA2127408DE731CCA98380661EE30E2480E9DB14A8EB484BF564838B45678ECB78800E41E499307253A0E4462C7E119ECAA096D496FF72C5CB823C5C38CC165B9EE0B5307005F9FE72FE34EF3C2EF456A3A4561245680205533E2C2DC31816DDFFB036922109B985F291F7ADDCA11FADD48E7D20C9F8D0E8AE073C4DD7269B1EF46ACC81BE52A053EFE3BEAB1BFA3822A10ABF2C95B27D406BF960FAA48A79D332A7138AAAB8828B1BD11BCE47ACFE934887A2B2DC6C7061EF8412B4912925FD5A9CE787C434B3FD5B39FA863EDA542574E22331F98E74F69283A9A8F9330FE597B1EE96E37C8DEBB0E861213F3BF5281F3753CC16B2AF1EAB12540517E0482FDF47C92B66C4CD5FA5C8725956DB4C5F435EFC44D2ABD17A078687DD7716CAC4683729BD6211E0CBADA144F28932906724F3B96501D1A897C088607B522F8C7586DAFC64CB15C01B8F3
-20241129011511 2 6 100 3071 5 F72B9D5B478FC38253834B862A5C515BA6212BAD106C43D243A9D021FF22434E6A1EA03FBACFA23A6FC66FE5C68B40013BA6D15844D35AA2127408DE731CCA98380661EE30E2480E9DB14A8EB484BF564838B45678ECB78800E41E499307253A0E4462C7E119ECAA096D496FF72C5CB823C5C38CC165B9EE0B5307005F9FE72FE34EF3C2EF456A3A4561245680205533E2C2DC31816DDFFB036922109B985F291F7ADDCA11FADD48E7D20C9F8D0E8AE073C4DD7269B1EF46ACC81BE52A053EFE3BEAB1BFA3822A10ABF2C95B27D406BF960FAA48A79D332A7138AAAB8828B1BD11BCE47ACFE934887A2B2DC6C7061EF8412B4912925FD5A9CE787C434B3FD5B39FA863EDA542574E22331F98E74F69283A9A8F9330FE597B1EE96E37C8DEBB0E861213F3BF5281F3753CC16B2AF1EAB12540517E0482FDF47C92B66C4CD5FA5C8725956DB4C5F435EFC44D2ABD17A078687DD7716CAC4683729BD6211E0CBADA144F28932906724F3B96501D1A897C088607B522F8C7586DAFC64CB15C508C4F
-20241129011527 2 6 100 3071 2 F72B9D5B478FC38253834B862A5C515BA6212BAD106C43D243A9D021FF22434E6A1EA03FBACFA23A6FC66FE5C68B40013BA6D15844D35AA2127408DE731CCA98380661EE30E2480E9DB14A8EB484BF564838B45678ECB78800E41E499307253A0E4462C7E119ECAA096D496FF72C5CB823C5C38CC165B9EE0B5307005F9FE72FE34EF3C2EF456A3A4561245680205533E2C2DC31816DDFFB036922109B985F291F7ADDCA11FADD48E7D20C9F8D0E8AE073C4DD7269B1EF46ACC81BE52A053EFE3BEAB1BFA3822A10ABF2C95B27D406BF960FAA48A79D332A7138AAAB8828B1BD11BCE47ACFE934887A2B2DC6C7061EF8412B4912925FD5A9CE787C434B3FD5B39FA863EDA542574E22331F98E74F69283A9A8F9330FE597B1EE96E37C8DEBB0E861213F3BF5281F3753CC16B2AF1EAB12540517E0482FDF47C92B66C4CD5FA5C8725956DB4C5F435EFC44D2ABD17A078687DD7716CAC4683729BD6211E0CBADA144F28932906724F3B96501D1A897C088607B522F8C7586DAFC64CB15C8110EB
-20241129011531 2 6 100 3071 2 F72B9D5B478FC38253834B862A5C515BA6212BAD106C43D243A9D021FF22434E6A1EA03FBACFA23A6FC66FE5C68B40013BA6D15844D35AA2127408DE731CCA98380661EE30E2480E9DB14A8EB484BF564838B45678ECB78800E41E499307253A0E4462C7E119ECAA096D496FF72C5CB823C5C38CC165B9EE0B5307005F9FE72FE34EF3C2EF456A3A4561245680205533E2C2DC31816DDFFB036922109B985F291F7ADDCA11FADD48E7D20C9F8D0E8AE073C4DD7269B1EF46ACC81BE52A053EFE3BEAB1BFA3822A10ABF2C95B27D406BF960FAA48A79D332A7138AAAB8828B1BD11BCE47ACFE934887A2B2DC6C7061EF8412B4912925FD5A9CE787C434B3FD5B39FA863EDA542574E22331F98E74F69283A9A8F9330FE597B1EE96E37C8DEBB0E861213F3BF5281F3753CC16B2AF1EAB12540517E0482FDF47C92B66C4CD5FA5C8725956DB4C5F435EFC44D2ABD17A078687DD7716CAC4683729BD6211E0CBADA144F28932906724F3B96501D1A897C088607B522F8C7586DAFC64CB15C85C703
-20241129011741 2 6 100 3071 2 F72B9D5B478FC38253834B862A5C515BA6212BAD106C43D243A9D021FF22434E6A1EA03FBACFA23A6FC66FE5C68B40013BA6D15844D35AA2127408DE731CCA98380661EE30E2480E9DB14A8EB484BF564838B45678ECB78800E41E499307253A0E4462C7E119ECAA096D496FF72C5CB823C5C38CC165B9EE0B5307005F9FE72FE34EF3C2EF456A3A4561245680205533E2C2DC31816DDFFB036922109B985F291F7ADDCA11FADD48E7D20C9F8D0E8AE073C4DD7269B1EF46ACC81BE52A053EFE3BEAB1BFA3822A10ABF2C95B27D406BF960FAA48A79D332A7138AAAB8828B1BD11BCE47ACFE934887A2B2DC6C7061EF8412B4912925FD5A9CE787C434B3FD5B39FA863EDA542574E22331F98E74F69283A9A8F9330FE597B1EE96E37C8DEBB0E861213F3BF5281F3753CC16B2AF1EAB12540517E0482FDF47C92B66C4CD5FA5C8725956DB4C5F435EFC44D2ABD17A078687DD7716CAC4683729BD6211E0CBADA144F28932906724F3B96501D1A897C088607B522F8C7586DAFC64CB15E32BC9B
-20241129011800 2 6 100 3071 2 F72B9D5B478FC38253834B862A5C515BA6212BAD106C43D243A9D021FF22434E6A1EA03FBACFA23A6FC66FE5C68B40013BA6D15844D35AA2127408DE731CCA98380661EE30E2480E9DB14A8EB484BF564838B45678ECB78800E41E499307253A0E4462C7E119ECAA096D496FF72C5CB823C5C38CC165B9EE0B5307005F9FE72FE34EF3C2EF456A3A4561245680205533E2C2DC31816DDFFB036922109B985F291F7ADDCA11FADD48E7D20C9F8D0E8AE073C4DD7269B1EF46ACC81BE52A053EFE3BEAB1BFA3822A10ABF2C95B27D406BF960FAA48A79D332A7138AAAB8828B1BD11BCE47ACFE934887A2B2DC6C7061EF8412B4912925FD5A9CE787C434B3FD5B39FA863EDA542574E22331F98E74F69283A9A8F9330FE597B1EE96E37C8DEBB0E861213F3BF5281F3753CC16B2AF1EAB12540517E0482FDF47C92B66C4CD5FA5C8725956DB4C5F435EFC44D2ABD17A078687DD7716CAC4683729BD6211E0CBADA144F28932906724F3B96501D1A897C088607B522F8C7586DAFC64CB15E6A8F93
-20241129011821 2 6 100 3071 5 F72B9D5B478FC38253834B862A5C515BA6212BAD106C43D243A9D021FF22434E6A1EA03FBACFA23A6FC66FE5C68B40013BA6D15844D35AA2127408DE731CCA98380661EE30E2480E9DB14A8EB484BF564838B45678ECB78800E41E499307253A0E4462C7E119ECAA096D496FF72C5CB823C5C38CC165B9EE0B5307005F9FE72FE34EF3C2EF456A3A4561245680205533E2C2DC31816DDFFB036922109B985F291F7ADDCA11FADD48E7D20C9F8D0E8AE073C4DD7269B1EF46ACC81BE52A053EFE3BEAB1BFA3822A10ABF2C95B27D406BF960FAA48A79D332A7138AAAB8828B1BD11BCE47ACFE934887A2B2DC6C7061EF8412B4912925FD5A9CE787C434B3FD5B39FA863EDA542574E22331F98E74F69283A9A8F9330FE597B1EE96E37C8DEBB0E861213F3BF5281F3753CC16B2AF1EAB12540517E0482FDF47C92B66C4CD5FA5C8725956DB4C5F435EFC44D2ABD17A078687DD7716CAC4683729BD6211E0CBADA144F28932906724F3B96501D1A897C088607B522F8C7586DAFC64CB15EACC9EF
-20241129011823 2 6 100 3071 5 F72B9D5B478FC38253834B862A5C515BA6212BAD106C43D243A9D021FF22434E6A1EA03FBACFA23A6FC66FE5C68B40013BA6D15844D35AA2127408DE731CCA98380661EE30E2480E9DB14A8EB484BF564838B45678ECB78800E41E499307253A0E4462C7E119ECAA096D496FF72C5CB823C5C38CC165B9EE0B5307005F9FE72FE34EF3C2EF456A3A4561245680205533E2C2DC31816DDFFB036922109B985F291F7ADDCA11FADD48E7D20C9F8D0E8AE073C4DD7269B1EF46ACC81BE52A053EFE3BEAB1BFA3822A10ABF2C95B27D406BF960FAA48A79D332A7138AAAB8828B1BD11BCE47ACFE934887A2B2DC6C7061EF8412B4912925FD5A9CE787C434B3FD5B39FA863EDA542574E22331F98E74F69283A9A8F9330FE597B1EE96E37C8DEBB0E861213F3BF5281F3753CC16B2AF1EAB12540517E0482FDF47C92B66C4CD5FA5C8725956DB4C5F435EFC44D2ABD17A078687DD7716CAC4683729BD6211E0CBADA144F28932906724F3B96501D1A897C088607B522F8C7586DAFC64CB15EAE50DF
-20241129011852 2 6 100 3071 2 F72B9D5B478FC38253834B862A5C515BA6212BAD106C43D243A9D021FF22434E6A1EA03FBACFA23A6FC66FE5C68B40013BA6D15844D35AA2127408DE731CCA98380661EE30E2480E9DB14A8EB484BF564838B45678ECB78800E41E499307253A0E4462C7E119ECAA096D496FF72C5CB823C5C38CC165B9EE0B5307005F9FE72FE34EF3C2EF456A3A4561245680205533E2C2DC31816DDFFB036922109B985F291F7ADDCA11FADD48E7D20C9F8D0E8AE073C4DD7269B1EF46ACC81BE52A053EFE3BEAB1BFA3822A10ABF2C95B27D406BF960FAA48A79D332A7138AAAB8828B1BD11BCE47ACFE934887A2B2DC6C7061EF8412B4912925FD5A9CE787C434B3FD5B39FA863EDA542574E22331F98E74F69283A9A8F9330FE597B1EE96E37C8DEBB0E861213F3BF5281F3753CC16B2AF1EAB12540517E0482FDF47C92B66C4CD5FA5C8725956DB4C5F435EFC44D2ABD17A078687DD7716CAC4683729BD6211E0CBADA144F28932906724F3B96501D1A897C088607B522F8C7586DAFC64CB15F060CCB
-20241129011901 2 6 100 3071 2 F72B9D5B478FC38253834B862A5C515BA6212BAD106C43D243A9D021FF22434E6A1EA03FBACFA23A6FC66FE5C68B40013BA6D15844D35AA2127408DE731CCA98380661EE30E2480E9DB14A8EB484BF564838B45678ECB78800E41E499307253A0E4462C7E119ECAA096D496FF72C5CB823C5C38CC165B9EE0B5307005F9FE72FE34EF3C2EF456A3A4561245680205533E2C2DC31816DDFFB036922109B985F291F7ADDCA11FADD48E7D20C9F8D0E8AE073C4DD7269B1EF46ACC81BE52A053EFE3BEAB1BFA3822A10ABF2C95B27D406BF960FAA48A79D332A7138AAAB8828B1BD11BCE47ACFE934887A2B2DC6C7061EF8412B4912925FD5A9CE787C434B3FD5B39FA863EDA542574E22331F98E74F69283A9A8F9330FE597B1EE96E37C8DEBB0E861213F3BF5281F3753CC16B2AF1EAB12540517E0482FDF47C92B66C4CD5FA5C8725956DB4C5F435EFC44D2ABD17A078687DD7716CAC4683729BD6211E0CBADA144F28932906724F3B96501D1A897C088607B522F8C7586DAFC64CB15F1D181B
-20241129011909 2 6 100 3071 2 F72B9D5B478FC38253834B862A5C515BA6212BAD106C43D243A9D021FF22434E6A1EA03FBACFA23A6FC66FE5C68B40013BA6D15844D35AA2127408DE731CCA98380661EE30E2480E9DB14A8EB484BF564838B45678ECB78800E41E499307253A0E4462C7E119ECAA096D496FF72C5CB823C5C38CC165B9EE0B5307005F9FE72FE34EF3C2EF456A3A4561245680205533E2C2DC31816DDFFB036922109B985F291F7ADDCA11FADD48E7D20C9F8D0E8AE073C4DD7269B1EF46ACC81BE52A053EFE3BEAB1BFA3822A10ABF2C95B27D406BF960FAA48A79D332A7138AAAB8828B1BD11BCE47ACFE934887A2B2DC6C7061EF8412B4912925FD5A9CE787C434B3FD5B39FA863EDA542574E22331F98E74F69283A9A8F9330FE597B1EE96E37C8DEBB0E861213F3BF5281F3753CC16B2AF1EAB12540517E0482FDF47C92B66C4CD5FA5C8725956DB4C5F435EFC44D2ABD17A078687DD7716CAC4683729BD6211E0CBADA144F28932906724F3B96501D1A897C088607B522F8C7586DAFC64CB15F313CBB
-20241129011934 2 6 100 3071 2 F72B9D5B478FC38253834B862A5C515BA6212BAD106C43D243A9D021FF22434E6A1EA03FBACFA23A6FC66FE5C68B40013BA6D15844D35AA2127408DE731CCA98380661EE30E2480E9DB14A8EB484BF564838B45678ECB78800E41E499307253A0E4462C7E119ECAA096D496FF72C5CB823C5C38CC165B9EE0B5307005F9FE72FE34EF3C2EF456A3A4561245680205533E2C2DC31816DDFFB036922109B985F291F7ADDCA11FADD48E7D20C9F8D0E8AE073C4DD7269B1EF46ACC81BE52A053EFE3BEAB1BFA3822A10ABF2C95B27D406BF960FAA48A79D332A7138AAAB8828B1BD11BCE47ACFE934887A2B2DC6C7061EF8412B4912925FD5A9CE787C434B3FD5B39FA863EDA542574E22331F98E74F69283A9A8F9330FE597B1EE96E37C8DEBB0E861213F3BF5281F3753CC16B2AF1EAB12540517E0482FDF47C92B66C4CD5FA5C8725956DB4C5F435EFC44D2ABD17A078687DD7716CAC4683729BD6211E0CBADA144F28932906724F3B96501D1A897C088607B522F8C7586DAFC64CB15F7E3BAB
-20241129011958 2 6 100 3071 2 F72B9D5B478FC38253834B862A5C515BA6212BAD106C43D243A9D021FF22434E6A1EA03FBACFA23A6FC66FE5C68B40013BA6D15844D35AA2127408DE731CCA98380661EE30E2480E9DB14A8EB484BF564838B45678ECB78800E41E499307253A0E4462C7E119ECAA096D496FF72C5CB823C5C38CC165B9EE0B5307005F9FE72FE34EF3C2EF456A3A4561245680205533E2C2DC31816DDFFB036922109B985F291F7ADDCA11FADD48E7D20C9F8D0E8AE073C4DD7269B1EF46ACC81BE52A053EFE3BEAB1BFA3822A10ABF2C95B27D406BF960FAA48A79D332A7138AAAB8828B1BD11BCE47ACFE934887A2B2DC6C7061EF8412B4912925FD5A9CE787C434B3FD5B39FA863EDA542574E22331F98E74F69283A9A8F9330FE597B1EE96E37C8DEBB0E861213F3BF5281F3753CC16B2AF1EAB12540517E0482FDF47C92B66C4CD5FA5C8725956DB4C5F435EFC44D2ABD17A078687DD7716CAC4683729BD6211E0CBADA144F28932906724F3B96501D1A897C088607B522F8C7586DAFC64CB15FCAB1D3
-20241129012819 2 6 100 4095 5 D14DC7A20FAA787E8E505E1CCA5C3EC8C5344CE26B9E5E776858C7048EECCB2CE278073BA42E21E4512A91D9A94F6460E86A914FC8D560A29DDC6B3E45CA1F9E8C5C52057BAF6A992E0C04192CEDF05010493D9CED8F97D3891C7DB13865BCD4BC19EA746AFB39E7AC2D60A32D9B77EECFFA53E7022137B7587E5D18E2B100845108104A79B878405B8900A0837BE74494F45DF726B88990607580414CEA1358A78BF832447919460F37395E69BC30E81983D60BB71D4E86164317138B99B545416467AA1F8592A16CEA1B050D2554487A749408A8339FFCA98A5F23D4EEF7A4254C6E56BFD6B95AD3C822B83324BEC5DD85A7064C6233899F7C6D00749D9DEDBAD9ED72CCC9CF154EF3989752DF907B24E587CD6B29A22846CD1B9623A3AEF69D191E8C048046FBCA2BC2C2A0883C8738F72D612745419080B7D72D8EC2E696CF5CB5EB6F23A9BBFF4BDD129970E881DBAA81E2F1A1445C773D4445ED516D1D954C64593DF72B7B31810B7493B8334F57E79FB26554EE1B4E7B7BDAA2C707D8E4798549DB60AE0A064CA8C6AA36021EB1657E72810E676D0F312325F2FAF956DC336D6B8E1496553362292D98225D61A74827C43FD4B4E0242B19FECBA7C102940C24AC56BB287C739608441EAA2EAA6DE0D1323E6D45204A1FF07BC3D3A48F954597EE865531D8A32C1DC2A3A48C8A0D47BE16919C3DF9E0514CE61ABEADA7
-20241129013011 2 6 100 4095 2 D14DC7A20FAA787E8E505E1CCA5C3EC8C5344CE26B9E5E776858C7048EECCB2CE278073BA42E21E4512A91D9A94F6460E86A914FC8D560A29DDC6B3E45CA1F9E8C5C52057BAF6A992E0C04192CEDF05010493D9CED8F97D3891C7DB13865BCD4BC19EA746AFB39E7AC2D60A32D9B77EECFFA53E7022137B7587E5D18E2B100845108104A79B878405B8900A0837BE74494F45DF726B88990607580414CEA1358A78BF832447919460F37395E69BC30E81983D60BB71D4E86164317138B99B545416467AA1F8592A16CEA1B050D2554487A749408A8339FFCA98A5F23D4EEF7A4254C6E56BFD6B95AD3C822B83324BEC5DD85A7064C6233899F7C6D00749D9DEDBAD9ED72CCC9CF154EF3989752DF907B24E587CD6B29A22846CD1B9623A3AEF69D191E8C048046FBCA2BC2C2A0883C8738F72D612745419080B7D72D8EC2E696CF5CB5EB6F23A9BBFF4BDD129970E881DBAA81E2F1A1445C773D4445ED516D1D954C64593DF72B7B31810B7493B8334F57E79FB26554EE1B4E7B7BDAA2C707D8E4798549DB60AE0A064CA8C6AA36021EB1657E72810E676D0F312325F2FAF956DC336D6B8E1496553362292D98225D61A74827C43FD4B4E0242B19FECBA7C102940C24AC56BB287C739608441EAA2EAA6DE0D1323E6D45204A1FF07BC3D3A48F954597EE865531D8A32C1DC2A3A48C8A0D47BE16919C3DF9E0514CE61B67DAEB
-20241129013110 2 6 100 4095 2 D14DC7A20FAA787E8E505E1CCA5C3EC8C5344CE26B9E5E776858C7048EECCB2CE278073BA42E21E4512A91D9A94F6460E86A914FC8D560A29DDC6B3E45CA1F9E8C5C52057BAF6A992E0C04192CEDF05010493D9CED8F97D3891C7DB13865BCD4BC19EA746AFB39E7AC2D60A32D9B77EECFFA53E7022137B7587E5D18E2B100845108104A79B878405B8900A0837BE74494F45DF726B88990607580414CEA1358A78BF832447919460F37395E69BC30E81983D60BB71D4E86164317138B99B545416467AA1F8592A16CEA1B050D2554487A749408A8339FFCA98A5F23D4EEF7A4254C6E56BFD6B95AD3C822B83324BEC5DD85A7064C6233899F7C6D00749D9DEDBAD9ED72CCC9CF154EF3989752DF907B24E587CD6B29A22846CD1B9623A3AEF69D191E8C048046FBCA2BC2C2A0883C8738F72D612745419080B7D72D8EC2E696CF5CB5EB6F23A9BBFF4BDD129970E881DBAA81E2F1A1445C773D4445ED516D1D954C64593DF72B7B31810B7493B8334F57E79FB26554EE1B4E7B7BDAA2C707D8E4798549DB60AE0A064CA8C6AA36021EB1657E72810E676D0F312325F2FAF956DC336D6B8E1496553362292D98225D61A74827C43FD4B4E0242B19FECBA7C102940C24AC56BB287C739608441EAA2EAA6DE0D1323E6D45204A1FF07BC3D3A48F954597EE865531D8A32C1DC2A3A48C8A0D47BE16919C3DF9E0514CE61BBE4D2B
-20241129013508 2 6 100 4095 5 D14DC7A20FAA787E8E505E1CCA5C3EC8C5344CE26B9E5E776858C7048EECCB2CE278073BA42E21E4512A91D9A94F6460E86A914FC8D560A29DDC6B3E45CA1F9E8C5C52057BAF6A992E0C04192CEDF05010493D9CED8F97D3891C7DB13865BCD4BC19EA746AFB39E7AC2D60A32D9B77EECFFA53E7022137B7587E5D18E2B100845108104A79B878405B8900A0837BE74494F45DF726B88990607580414CEA1358A78BF832447919460F37395E69BC30E81983D60BB71D4E86164317138B99B545416467AA1F8592A16CEA1B050D2554487A749408A8339FFCA98A5F23D4EEF7A4254C6E56BFD6B95AD3C822B83324BEC5DD85A7064C6233899F7C6D00749D9DEDBAD9ED72CCC9CF154EF3989752DF907B24E587CD6B29A22846CD1B9623A3AEF69D191E8C048046FBCA2BC2C2A0883C8738F72D612745419080B7D72D8EC2E696CF5CB5EB6F23A9BBFF4BDD129970E881DBAA81E2F1A1445C773D4445ED516D1D954C64593DF72B7B31810B7493B8334F57E79FB26554EE1B4E7B7BDAA2C707D8E4798549DB60AE0A064CA8C6AA36021EB1657E72810E676D0F312325F2FAF956DC336D6B8E1496553362292D98225D61A74827C43FD4B4E0242B19FECBA7C102940C24AC56BB287C739608441EAA2EAA6DE0D1323E6D45204A1FF07BC3D3A48F954597EE865531D8A32C1DC2A3A48C8A0D47BE16919C3DF9E0514CE61D3A05EF
-20241129013753 2 6 100 4095 5 D14DC7A20FAA787E8E505E1CCA5C3EC8C5344CE26B9E5E776858C7048EECCB2CE278073BA42E21E4512A91D9A94F6460E86A914FC8D560A29DDC6B3E45CA1F9E8C5C52057BAF6A992E0C04192CEDF05010493D9CED8F97D3891C7DB13865BCD4BC19EA746AFB39E7AC2D60A32D9B77EECFFA53E7022137B7587E5D18E2B100845108104A79B878405B8900A0837BE74494F45DF726B88990607580414CEA1358A78BF832447919460F37395E69BC30E81983D60BB71D4E86164317138B99B545416467AA1F8592A16CEA1B050D2554487A749408A8339FFCA98A5F23D4EEF7A4254C6E56BFD6B95AD3C822B83324BEC5DD85A7064C6233899F7C6D00749D9DEDBAD9ED72CCC9CF154EF3989752DF907B24E587CD6B29A22846CD1B9623A3AEF69D191E8C048046FBCA2BC2C2A0883C8738F72D612745419080B7D72D8EC2E696CF5CB5EB6F23A9BBFF4BDD129970E881DBAA81E2F1A1445C773D4445ED516D1D954C64593DF72B7B31810B7493B8334F57E79FB26554EE1B4E7B7BDAA2C707D8E4798549DB60AE0A064CA8C6AA36021EB1657E72810E676D0F312325F2FAF956DC336D6B8E1496553362292D98225D61A74827C43FD4B4E0242B19FECBA7C102940C24AC56BB287C739608441EAA2EAA6DE0D1323E6D45204A1FF07BC3D3A48F954597EE865531D8A32C1DC2A3A48C8A0D47BE16919C3DF9E0514CE61E425677
-20241129014404 2 6 100 4095 5 D14DC7A20FAA787E8E505E1CCA5C3EC8C5344CE26B9E5E776858C7048EECCB2CE278073BA42E21E4512A91D9A94F6460E86A914FC8D560A29DDC6B3E45CA1F9E8C5C52057BAF6A992E0C04192CEDF05010493D9CED8F97D3891C7DB13865BCD4BC19EA746AFB39E7AC2D60A32D9B77EECFFA53E7022137B7587E5D18E2B100845108104A79B878405B8900A0837BE74494F45DF726B88990607580414CEA1358A78BF832447919460F37395E69BC30E81983D60BB71D4E86164317138B99B545416467AA1F8592A16CEA1B050D2554487A749408A8339FFCA98A5F23D4EEF7A4254C6E56BFD6B95AD3C822B83324BEC5DD85A7064C6233899F7C6D00749D9DEDBAD9ED72CCC9CF154EF3989752DF907B24E587CD6B29A22846CD1B9623A3AEF69D191E8C048046FBCA2BC2C2A0883C8738F72D612745419080B7D72D8EC2E696CF5CB5EB6F23A9BBFF4BDD129970E881DBAA81E2F1A1445C773D4445ED516D1D954C64593DF72B7B31810B7493B8334F57E79FB26554EE1B4E7B7BDAA2C707D8E4798549DB60AE0A064CA8C6AA36021EB1657E72810E676D0F312325F2FAF956DC336D6B8E1496553362292D98225D61A74827C43FD4B4E0242B19FECBA7C102940C24AC56BB287C739608441EAA2EAA6DE0D1323E6D45204A1FF07BC3D3A48F954597EE865531D8A32C1DC2A3A48C8A0D47BE16919C3DF9E0514CE6208D8717
-20241129014416 2 6 100 4095 2 D14DC7A20FAA787E8E505E1CCA5C3EC8C5344CE26B9E5E776858C7048EECCB2CE278073BA42E21E4512A91D9A94F6460E86A914FC8D560A29DDC6B3E45CA1F9E8C5C52057BAF6A992E0C04192CEDF05010493D9CED8F97D3891C7DB13865BCD4BC19EA746AFB39E7AC2D60A32D9B77EECFFA53E7022137B7587E5D18E2B100845108104A79B878405B8900A0837BE74494F45DF726B88990607580414CEA1358A78BF832447919460F37395E69BC30E81983D60BB71D4E86164317138B99B545416467AA1F8592A16CEA1B050D2554487A749408A8339FFCA98A5F23D4EEF7A4254C6E56BFD6B95AD3C822B83324BEC5DD85A7064C6233899F7C6D00749D9DEDBAD9ED72CCC9CF154EF3989752DF907B24E587CD6B29A22846CD1B9623A3AEF69D191E8C048046FBCA2BC2C2A0883C8738F72D612745419080B7D72D8EC2E696CF5CB5EB6F23A9BBFF4BDD129970E881DBAA81E2F1A1445C773D4445ED516D1D954C64593DF72B7B31810B7493B8334F57E79FB26554EE1B4E7B7BDAA2C707D8E4798549DB60AE0A064CA8C6AA36021EB1657E72810E676D0F312325F2FAF956DC336D6B8E1496553362292D98225D61A74827C43FD4B4E0242B19FECBA7C102940C24AC56BB287C739608441EAA2EAA6DE0D1323E6D45204A1FF07BC3D3A48F954597EE865531D8A32C1DC2A3A48C8A0D47BE16919C3DF9E0514CE6209BD93B
-20241129014459 2 6 100 4095 5 D14DC7A20FAA787E8E505E1CCA5C3EC8C5344CE26B9E5E776858C7048EECCB2CE278073BA42E21E4512A91D9A94F6460E86A914FC8D560A29DDC6B3E45CA1F9E8C5C52057BAF6A992E0C04192CEDF05010493D9CED8F97D3891C7DB13865BCD4BC19EA746AFB39E7AC2D60A32D9B77EECFFA53E7022137B7587E5D18E2B100845108104A79B878405B8900A0837BE74494F45DF726B88990607580414CEA1358A78BF832447919460F37395E69BC30E81983D60BB71D4E86164317138B99B545416467AA1F8592A16CEA1B050D2554487A749408A8339FFCA98A5F23D4EEF7A4254C6E56BFD6B95AD3C822B83324BEC5DD85A7064C6233899F7C6D00749D9DEDBAD9ED72CCC9CF154EF3989752DF907B24E587CD6B29A22846CD1B9623A3AEF69D191E8C048046FBCA2BC2C2A0883C8738F72D612745419080B7D72D8EC2E696CF5CB5EB6F23A9BBFF4BDD129970E881DBAA81E2F1A1445C773D4445ED516D1D954C64593DF72B7B31810B7493B8334F57E79FB26554EE1B4E7B7BDAA2C707D8E4798549DB60AE0A064CA8C6AA36021EB1657E72810E676D0F312325F2FAF956DC336D6B8E1496553362292D98225D61A74827C43FD4B4E0242B19FECBA7C102940C24AC56BB287C739608441EAA2EAA6DE0D1323E6D45204A1FF07BC3D3A48F954597EE865531D8A32C1DC2A3A48C8A0D47BE16919C3DF9E0514CE620D787FF
-20241129015136 2 6 100 4095 5 D14DC7A20FAA787E8E505E1CCA5C3EC8C5344CE26B9E5E776858C7048EECCB2CE278073BA42E21E4512A91D9A94F6460E86A914FC8D560A29DDC6B3E45CA1F9E8C5C52057BAF6A992E0C04192CEDF05010493D9CED8F97D3891C7DB13865BCD4BC19EA746AFB39E7AC2D60A32D9B77EECFFA53E7022137B7587E5D18E2B100845108104A79B878405B8900A0837BE74494F45DF726B88990607580414CEA1358A78BF832447919460F37395E69BC30E81983D60BB71D4E86164317138B99B545416467AA1F8592A16CEA1B050D2554487A749408A8339FFCA98A5F23D4EEF7A4254C6E56BFD6B95AD3C822B83324BEC5DD85A7064C6233899F7C6D00749D9DEDBAD9ED72CCC9CF154EF3989752DF907B24E587CD6B29A22846CD1B9623A3AEF69D191E8C048046FBCA2BC2C2A0883C8738F72D612745419080B7D72D8EC2E696CF5CB5EB6F23A9BBFF4BDD129970E881DBAA81E2F1A1445C773D4445ED516D1D954C64593DF72B7B31810B7493B8334F57E79FB26554EE1B4E7B7BDAA2C707D8E4798549DB60AE0A064CA8C6AA36021EB1657E72810E676D0F312325F2FAF956DC336D6B8E1496553362292D98225D61A74827C43FD4B4E0242B19FECBA7C102940C24AC56BB287C739608441EAA2EAA6DE0D1323E6D45204A1FF07BC3D3A48F954597EE865531D8A32C1DC2A3A48C8A0D47BE16919C3DF9E0514CE6235DF3D7
-20241129015320 2 6 100 4095 5 D14DC7A20FAA787E8E505E1CCA5C3EC8C5344CE26B9E5E776858C7048EECCB2CE278073BA42E21E4512A91D9A94F6460E86A914FC8D560A29DDC6B3E45CA1F9E8C5C52057BAF6A992E0C04192CEDF05010493D9CED8F97D3891C7DB13865BCD4BC19EA746AFB39E7AC2D60A32D9B77EECFFA53E7022137B7587E5D18E2B100845108104A79B878405B8900A0837BE74494F45DF726B88990607580414CEA1358A78BF832447919460F37395E69BC30E81983D60BB71D4E86164317138B99B545416467AA1F8592A16CEA1B050D2554487A749408A8339FFCA98A5F23D4EEF7A4254C6E56BFD6B95AD3C822B83324BEC5DD85A7064C6233899F7C6D00749D9DEDBAD9ED72CCC9CF154EF3989752DF907B24E587CD6B29A22846CD1B9623A3AEF69D191E8C048046FBCA2BC2C2A0883C8738F72D612745419080B7D72D8EC2E696CF5CB5EB6F23A9BBFF4BDD129970E881DBAA81E2F1A1445C773D4445ED516D1D954C64593DF72B7B31810B7493B8334F57E79FB26554EE1B4E7B7BDAA2C707D8E4798549DB60AE0A064CA8C6AA36021EB1657E72810E676D0F312325F2FAF956DC336D6B8E1496553362292D98225D61A74827C43FD4B4E0242B19FECBA7C102940C24AC56BB287C739608441EAA2EAA6DE0D1323E6D45204A1FF07BC3D3A48F954597EE865531D8A32C1DC2A3A48C8A0D47BE16919C3DF9E0514CE6240443EF
-20241129015547 2 6 100 4095 5 D14DC7A20FAA787E8E505E1CCA5C3EC8C5344CE26B9E5E776858C7048EECCB2CE278073BA42E21E4512A91D9A94F6460E86A914FC8D560A29DDC6B3E45CA1F9E8C5C52057BAF6A992E0C04192CEDF05010493D9CED8F97D3891C7DB13865BCD4BC19EA746AFB39E7AC2D60A32D9B77EECFFA53E7022137B7587E5D18E2B100845108104A79B878405B8900A0837BE74494F45DF726B88990607580414CEA1358A78BF832447919460F37395E69BC30E81983D60BB71D4E86164317138B99B545416467AA1F8592A16CEA1B050D2554487A749408A8339FFCA98A5F23D4EEF7A4254C6E56BFD6B95AD3C822B83324BEC5DD85A7064C6233899F7C6D00749D9DEDBAD9ED72CCC9CF154EF3989752DF907B24E587CD6B29A22846CD1B9623A3AEF69D191E8C048046FBCA2BC2C2A0883C8738F72D612745419080B7D72D8EC2E696CF5CB5EB6F23A9BBFF4BDD129970E881DBAA81E2F1A1445C773D4445ED516D1D954C64593DF72B7B31810B7493B8334F57E79FB26554EE1B4E7B7BDAA2C707D8E4798549DB60AE0A064CA8C6AA36021EB1657E72810E676D0F312325F2FAF956DC336D6B8E1496553362292D98225D61A74827C43FD4B4E0242B19FECBA7C102940C24AC56BB287C739608441EAA2EAA6DE0D1323E6D45204A1FF07BC3D3A48F954597EE865531D8A32C1DC2A3A48C8A0D47BE16919C3DF9E0514CE624F1AF5F
-20241129015908 2 6 100 4095 2 D14DC7A20FAA787E8E505E1CCA5C3EC8C5344CE26B9E5E776858C7048EECCB2CE278073BA42E21E4512A91D9A94F6460E86A914FC8D560A29DDC6B3E45CA1F9E8C5C52057BAF6A992E0C04192CEDF05010493D9CED8F97D3891C7DB13865BCD4BC19EA746AFB39E7AC2D60A32D9B77EECFFA53E7022137B7587E5D18E2B100845108104A79B878405B8900A0837BE74494F45DF726B88990607580414CEA1358A78BF832447919460F37395E69BC30E81983D60BB71D4E86164317138B99B545416467AA1F8592A16CEA1B050D2554487A749408A8339FFCA98A5F23D4EEF7A4254C6E56BFD6B95AD3C822B83324BEC5DD85A7064C6233899F7C6D00749D9DEDBAD9ED72CCC9CF154EF3989752DF907B24E587CD6B29A22846CD1B9623A3AEF69D191E8C048046FBCA2BC2C2A0883C8738F72D612745419080B7D72D8EC2E696CF5CB5EB6F23A9BBFF4BDD129970E881DBAA81E2F1A1445C773D4445ED516D1D954C64593DF72B7B31810B7493B8334F57E79FB26554EE1B4E7B7BDAA2C707D8E4798549DB60AE0A064CA8C6AA36021EB1657E72810E676D0F312325F2FAF956DC336D6B8E1496553362292D98225D61A74827C43FD4B4E0242B19FECBA7C102940C24AC56BB287C739608441EAA2EAA6DE0D1323E6D45204A1FF07BC3D3A48F954597EE865531D8A32C1DC2A3A48C8A0D47BE16919C3DF9E0514CE626346E0B
-20241129020133 2 6 100 4095 2 D14DC7A20FAA787E8E505E1CCA5C3EC8C5344CE26B9E5E776858C7048EECCB2CE278073BA42E21E4512A91D9A94F6460E86A914FC8D560A29DDC6B3E45CA1F9E8C5C52057BAF6A992E0C04192CEDF05010493D9CED8F97D3891C7DB13865BCD4BC19EA746AFB39E7AC2D60A32D9B77EECFFA53E7022137B7587E5D18E2B100845108104A79B878405B8900A0837BE74494F45DF726B88990607580414CEA1358A78BF832447919460F37395E69BC30E81983D60BB71D4E86164317138B99B545416467AA1F8592A16CEA1B050D2554487A749408A8339FFCA98A5F23D4EEF7A4254C6E56BFD6B95AD3C822B83324BEC5DD85A7064C6233899F7C6D00749D9DEDBAD9ED72CCC9CF154EF3989752DF907B24E587CD6B29A22846CD1B9623A3AEF69D191E8C048046FBCA2BC2C2A0883C8738F72D612745419080B7D72D8EC2E696CF5CB5EB6F23A9BBFF4BDD129970E881DBAA81E2F1A1445C773D4445ED516D1D954C64593DF72B7B31810B7493B8334F57E79FB26554EE1B4E7B7BDAA2C707D8E4798549DB60AE0A064CA8C6AA36021EB1657E72810E676D0F312325F2FAF956DC336D6B8E1496553362292D98225D61A74827C43FD4B4E0242B19FECBA7C102940C24AC56BB287C739608441EAA2EAA6DE0D1323E6D45204A1FF07BC3D3A48F954597EE865531D8A32C1DC2A3A48C8A0D47BE16919C3DF9E0514CE6271DA71B
-20241129020353 2 6 100 4095 2 D14DC7A20FAA787E8E505E1CCA5C3EC8C5344CE26B9E5E776858C7048EECCB2CE278073BA42E21E4512A91D9A94F6460E86A914FC8D560A29DDC6B3E45CA1F9E8C5C52057BAF6A992E0C04192CEDF05010493D9CED8F97D3891C7DB13865BCD4BC19EA746AFB39E7AC2D60A32D9B77EECFFA53E7022137B7587E5D18E2B100845108104A79B878405B8900A0837BE74494F45DF726B88990607580414CEA1358A78BF832447919460F37395E69BC30E81983D60BB71D4E86164317138B99B545416467AA1F8592A16CEA1B050D2554487A749408A8339FFCA98A5F23D4EEF7A4254C6E56BFD6B95AD3C822B83324BEC5DD85A7064C6233899F7C6D00749D9DEDBAD9ED72CCC9CF154EF3989752DF907B24E587CD6B29A22846CD1B9623A3AEF69D191E8C048046FBCA2BC2C2A0883C8738F72D612745419080B7D72D8EC2E696CF5CB5EB6F23A9BBFF4BDD129970E881DBAA81E2F1A1445C773D4445ED516D1D954C64593DF72B7B31810B7493B8334F57E79FB26554EE1B4E7B7BDAA2C707D8E4798549DB60AE0A064CA8C6AA36021EB1657E72810E676D0F312325F2FAF956DC336D6B8E1496553362292D98225D61A74827C43FD4B4E0242B19FECBA7C102940C24AC56BB287C739608441EAA2EAA6DE0D1323E6D45204A1FF07BC3D3A48F954597EE865531D8A32C1DC2A3A48C8A0D47BE16919C3DF9E0514CE627F5147B
-20241129020617 2 6 100 4095 2 D14DC7A20FAA787E8E505E1CCA5C3EC8C5344CE26B9E5E776858C7048EECCB2CE278073BA42E21E4512A91D9A94F6460E86A914FC8D560A29DDC6B3E45CA1F9E8C5C52057BAF6A992E0C04192CEDF05010493D9CED8F97D3891C7DB13865BCD4BC19EA746AFB39E7AC2D60A32D9B77EECFFA53E7022137B7587E5D18E2B100845108104A79B878405B8900A0837BE74494F45DF726B88990607580414CEA1358A78BF832447919460F37395E69BC30E81983D60BB71D4E86164317138B99B545416467AA1F8592A16CEA1B050D2554487A749408A8339FFCA98A5F23D4EEF7A4254C6E56BFD6B95AD3C822B83324BEC5DD85A7064C6233899F7C6D00749D9DEDBAD9ED72CCC9CF154EF3989752DF907B24E587CD6B29A22846CD1B9623A3AEF69D191E8C048046FBCA2BC2C2A0883C8738F72D612745419080B7D72D8EC2E696CF5CB5EB6F23A9BBFF4BDD129970E881DBAA81E2F1A1445C773D4445ED516D1D954C64593DF72B7B31810B7493B8334F57E79FB26554EE1B4E7B7BDAA2C707D8E4798549DB60AE0A064CA8C6AA36021EB1657E72810E676D0F312325F2FAF956DC336D6B8E1496553362292D98225D61A74827C43FD4B4E0242B19FECBA7C102940C24AC56BB287C739608441EAA2EAA6DE0D1323E6D45204A1FF07BC3D3A48F954597EE865531D8A32C1DC2A3A48C8A0D47BE16919C3DF9E0514CE628DC3E63
-20241129021223 2 6 100 4095 2 D14DC7A20FAA787E8E505E1CCA5C3EC8C5344CE26B9E5E776858C7048EECCB2CE278073BA42E21E4512A91D9A94F6460E86A914FC8D560A29DDC6B3E45CA1F9E8C5C52057BAF6A992E0C04192CEDF05010493D9CED8F97D3891C7DB13865BCD4BC19EA746AFB39E7AC2D60A32D9B77EECFFA53E7022137B7587E5D18E2B100845108104A79B878405B8900A0837BE74494F45DF726B88990607580414CEA1358A78BF832447919460F37395E69BC30E81983D60BB71D4E86164317138B99B545416467AA1F8592A16CEA1B050D2554487A749408A8339FFCA98A5F23D4EEF7A4254C6E56BFD6B95AD3C822B83324BEC5DD85A7064C6233899F7C6D00749D9DEDBAD9ED72CCC9CF154EF3989752DF907B24E587CD6B29A22846CD1B9623A3AEF69D191E8C048046FBCA2BC2C2A0883C8738F72D612745419080B7D72D8EC2E696CF5CB5EB6F23A9BBFF4BDD129970E881DBAA81E2F1A1445C773D4445ED516D1D954C64593DF72B7B31810B7493B8334F57E79FB26554EE1B4E7B7BDAA2C707D8E4798549DB60AE0A064CA8C6AA36021EB1657E72810E676D0F312325F2FAF956DC336D6B8E1496553362292D98225D61A74827C43FD4B4E0242B19FECBA7C102940C24AC56BB287C739608441EAA2EAA6DE0D1323E6D45204A1FF07BC3D3A48F954597EE865531D8A32C1DC2A3A48C8A0D47BE16919C3DF9E0514CE62B25B8A3
-20241129021913 2 6 100 4095 5 D14DC7A20FAA787E8E505E1CCA5C3EC8C5344CE26B9E5E776858C7048EECCB2CE278073BA42E21E4512A91D9A94F6460E86A914FC8D560A29DDC6B3E45CA1F9E8C5C52057BAF6A992E0C04192CEDF05010493D9CED8F97D3891C7DB13865BCD4BC19EA746AFB39E7AC2D60A32D9B77EECFFA53E7022137B7587E5D18E2B100845108104A79B878405B8900A0837BE74494F45DF726B88990607580414CEA1358A78BF832447919460F37395E69BC30E81983D60BB71D4E86164317138B99B545416467AA1F8592A16CEA1B050D2554487A749408A8339FFCA98A5F23D4EEF7A4254C6E56BFD6B95AD3C822B83324BEC5DD85A7064C6233899F7C6D00749D9DEDBAD9ED72CCC9CF154EF3989752DF907B24E587CD6B29A22846CD1B9623A3AEF69D191E8C048046FBCA2BC2C2A0883C8738F72D612745419080B7D72D8EC2E696CF5CB5EB6F23A9BBFF4BDD129970E881DBAA81E2F1A1445C773D4445ED516D1D954C64593DF72B7B31810B7493B8334F57E79FB26554EE1B4E7B7BDAA2C707D8E4798549DB60AE0A064CA8C6AA36021EB1657E72810E676D0F312325F2FAF956DC336D6B8E1496553362292D98225D61A74827C43FD4B4E0242B19FECBA7C102940C24AC56BB287C739608441EAA2EAA6DE0D1323E6D45204A1FF07BC3D3A48F954597EE865531D8A32C1DC2A3A48C8A0D47BE16919C3DF9E0514CE62DC6E86F
-20241129021949 2 6 100 4095 2 D14DC7A20FAA787E8E505E1CCA5C3EC8C5344CE26B9E5E776858C7048EECCB2CE278073BA42E21E4512A91D9A94F6460E86A914FC8D560A29DDC6B3E45CA1F9E8C5C52057BAF6A992E0C04192CEDF05010493D9CED8F97D3891C7DB13865BCD4BC19EA746AFB39E7AC2D60A32D9B77EECFFA53E7022137B7587E5D18E2B100845108104A79B878405B8900A0837BE74494F45DF726B88990607580414CEA1358A78BF832447919460F37395E69BC30E81983D60BB71D4E86164317138B99B545416467AA1F8592A16CEA1B050D2554487A749408A8339FFCA98A5F23D4EEF7A4254C6E56BFD6B95AD3C822B83324BEC5DD85A7064C6233899F7C6D00749D9DEDBAD9ED72CCC9CF154EF3989752DF907B24E587CD6B29A22846CD1B9623A3AEF69D191E8C048046FBCA2BC2C2A0883C8738F72D612745419080B7D72D8EC2E696CF5CB5EB6F23A9BBFF4BDD129970E881DBAA81E2F1A1445C773D4445ED516D1D954C64593DF72B7B31810B7493B8334F57E79FB26554EE1B4E7B7BDAA2C707D8E4798549DB60AE0A064CA8C6AA36021EB1657E72810E676D0F312325F2FAF956DC336D6B8E1496553362292D98225D61A74827C43FD4B4E0242B19FECBA7C102940C24AC56BB287C739608441EAA2EAA6DE0D1323E6D45204A1FF07BC3D3A48F954597EE865531D8A32C1DC2A3A48C8A0D47BE16919C3DF9E0514CE62DFA5673
-20241129022203 2 6 100 4095 5 D14DC7A20FAA787E8E505E1CCA5C3EC8C5344CE26B9E5E776858C7048EECCB2CE278073BA42E21E4512A91D9A94F6460E86A914FC8D560A29DDC6B3E45CA1F9E8C5C52057BAF6A992E0C04192CEDF05010493D9CED8F97D3891C7DB13865BCD4BC19EA746AFB39E7AC2D60A32D9B77EECFFA53E7022137B7587E5D18E2B100845108104A79B878405B8900A0837BE74494F45DF726B88990607580414CEA1358A78BF832447919460F37395E69BC30E81983D60BB71D4E86164317138B99B545416467AA1F8592A16CEA1B050D2554487A749408A8339FFCA98A5F23D4EEF7A4254C6E56BFD6B95AD3C822B83324BEC5DD85A7064C6233899F7C6D00749D9DEDBAD9ED72CCC9CF154EF3989752DF907B24E587CD6B29A22846CD1B9623A3AEF69D191E8C048046FBCA2BC2C2A0883C8738F72D612745419080B7D72D8EC2E696CF5CB5EB6F23A9BBFF4BDD129970E881DBAA81E2F1A1445C773D4445ED516D1D954C64593DF72B7B31810B7493B8334F57E79FB26554EE1B4E7B7BDAA2C707D8E4798549DB60AE0A064CA8C6AA36021EB1657E72810E676D0F312325F2FAF956DC336D6B8E1496553362292D98225D61A74827C43FD4B4E0242B19FECBA7C102940C24AC56BB287C739608441EAA2EAA6DE0D1323E6D45204A1FF07BC3D3A48F954597EE865531D8A32C1DC2A3A48C8A0D47BE16919C3DF9E0514CE62ED03D1F
-20241129022443 2 6 100 4095 5 D14DC7A20FAA787E8E505E1CCA5C3EC8C5344CE26B9E5E776858C7048EECCB2CE278073BA42E21E4512A91D9A94F6460E86A914FC8D560A29DDC6B3E45CA1F9E8C5C52057BAF6A992E0C04192CEDF05010493D9CED8F97D3891C7DB13865BCD4BC19EA746AFB39E7AC2D60A32D9B77EECFFA53E7022137B7587E5D18E2B100845108104A79B878405B8900A0837BE74494F45DF726B88990607580414CEA1358A78BF832447919460F37395E69BC30E81983D60BB71D4E86164317138B99B545416467AA1F8592A16CEA1B050D2554487A749408A8339FFCA98A5F23D4EEF7A4254C6E56BFD6B95AD3C822B83324BEC5DD85A7064C6233899F7C6D00749D9DEDBAD9ED72CCC9CF154EF3989752DF907B24E587CD6B29A22846CD1B9623A3AEF69D191E8C048046FBCA2BC2C2A0883C8738F72D612745419080B7D72D8EC2E696CF5CB5EB6F23A9BBFF4BDD129970E881DBAA81E2F1A1445C773D4445ED516D1D954C64593DF72B7B31810B7493B8334F57E79FB26554EE1B4E7B7BDAA2C707D8E4798549DB60AE0A064CA8C6AA36021EB1657E72810E676D0F312325F2FAF956DC336D6B8E1496553362292D98225D61A74827C43FD4B4E0242B19FECBA7C102940C24AC56BB287C739608441EAA2EAA6DE0D1323E6D45204A1FF07BC3D3A48F954597EE865531D8A32C1DC2A3A48C8A0D47BE16919C3DF9E0514CE62FC9341F
-20241129022708 2 6 100 4095 2 D14DC7A20FAA787E8E505E1CCA5C3EC8C5344CE26B9E5E776858C7048EECCB2CE278073BA42E21E4512A91D9A94F6460E86A914FC8D560A29DDC6B3E45CA1F9E8C5C52057BAF6A992E0C04192CEDF05010493D9CED8F97D3891C7DB13865BCD4BC19EA746AFB39E7AC2D60A32D9B77EECFFA53E7022137B7587E5D18E2B100845108104A79B878405B8900A0837BE74494F45DF726B88990607580414CEA1358A78BF832447919460F37395E69BC30E81983D60BB71D4E86164317138B99B545416467AA1F8592A16CEA1B050D2554487A749408A8339FFCA98A5F23D4EEF7A4254C6E56BFD6B95AD3C822B83324BEC5DD85A7064C6233899F7C6D00749D9DEDBAD9ED72CCC9CF154EF3989752DF907B24E587CD6B29A22846CD1B9623A3AEF69D191E8C048046FBCA2BC2C2A0883C8738F72D612745419080B7D72D8EC2E696CF5CB5EB6F23A9BBFF4BDD129970E881DBAA81E2F1A1445C773D4445ED516D1D954C64593DF72B7B31810B7493B8334F57E79FB26554EE1B4E7B7BDAA2C707D8E4798549DB60AE0A064CA8C6AA36021EB1657E72810E676D0F312325F2FAF956DC336D6B8E1496553362292D98225D61A74827C43FD4B4E0242B19FECBA7C102940C24AC56BB287C739608441EAA2EAA6DE0D1323E6D45204A1FF07BC3D3A48F954597EE865531D8A32C1DC2A3A48C8A0D47BE16919C3DF9E0514CE630ACA413
-20241129023102 2 6 100 4095 5 D14DC7A20FAA787E8E505E1CCA5C3EC8C5344CE26B9E5E776858C7048EECCB2CE278073BA42E21E4512A91D9A94F6460E86A914FC8D560A29DDC6B3E45CA1F9E8C5C52057BAF6A992E0C04192CEDF05010493D9CED8F97D3891C7DB13865BCD4BC19EA746AFB39E7AC2D60A32D9B77EECFFA53E7022137B7587E5D18E2B100845108104A79B878405B8900A0837BE74494F45DF726B88990607580414CEA1358A78BF832447919460F37395E69BC30E81983D60BB71D4E86164317138B99B545416467AA1F8592A16CEA1B050D2554487A749408A8339FFCA98A5F23D4EEF7A4254C6E56BFD6B95AD3C822B83324BEC5DD85A7064C6233899F7C6D00749D9DEDBAD9ED72CCC9CF154EF3989752DF907B24E587CD6B29A22846CD1B9623A3AEF69D191E8C048046FBCA2BC2C2A0883C8738F72D612745419080B7D72D8EC2E696CF5CB5EB6F23A9BBFF4BDD129970E881DBAA81E2F1A1445C773D4445ED516D1D954C64593DF72B7B31810B7493B8334F57E79FB26554EE1B4E7B7BDAA2C707D8E4798549DB60AE0A064CA8C6AA36021EB1657E72810E676D0F312325F2FAF956DC336D6B8E1496553362292D98225D61A74827C43FD4B4E0242B19FECBA7C102940C24AC56BB287C739608441EAA2EAA6DE0D1323E6D45204A1FF07BC3D3A48F954597EE865531D8A32C1DC2A3A48C8A0D47BE16919C3DF9E0514CE6322B2317
-20241129023226 2 6 100 4095 2 D14DC7A20FAA787E8E505E1CCA5C3EC8C5344CE26B9E5E776858C7048EECCB2CE278073BA42E21E4512A91D9A94F6460E86A914FC8D560A29DDC6B3E45CA1F9E8C5C52057BAF6A992E0C04192CEDF05010493D9CED8F97D3891C7DB13865BCD4BC19EA746AFB39E7AC2D60A32D9B77EECFFA53E7022137B7587E5D18E2B100845108104A79B878405B8900A0837BE74494F45DF726B88990607580414CEA1358A78BF832447919460F37395E69BC30E81983D60BB71D4E86164317138B99B545416467AA1F8592A16CEA1B050D2554487A749408A8339FFCA98A5F23D4EEF7A4254C6E56BFD6B95AD3C822B83324BEC5DD85A7064C6233899F7C6D00749D9DEDBAD9ED72CCC9CF154EF3989752DF907B24E587CD6B29A22846CD1B9623A3AEF69D191E8C048046FBCA2BC2C2A0883C8738F72D612745419080B7D72D8EC2E696CF5CB5EB6F23A9BBFF4BDD129970E881DBAA81E2F1A1445C773D4445ED516D1D954C64593DF72B7B31810B7493B8334F57E79FB26554EE1B4E7B7BDAA2C707D8E4798549DB60AE0A064CA8C6AA36021EB1657E72810E676D0F312325F2FAF956DC336D6B8E1496553362292D98225D61A74827C43FD4B4E0242B19FECBA7C102940C24AC56BB287C739608441EAA2EAA6DE0D1323E6D45204A1FF07BC3D3A48F954597EE865531D8A32C1DC2A3A48C8A0D47BE16919C3DF9E0514CE632AFA783
-20241129023234 2 6 100 4095 5 D14DC7A20FAA787E8E505E1CCA5C3EC8C5344CE26B9E5E776858C7048EECCB2CE278073BA42E21E4512A91D9A94F6460E86A914FC8D560A29DDC6B3E45CA1F9E8C5C52057BAF6A992E0C04192CEDF05010493D9CED8F97D3891C7DB13865BCD4BC19EA746AFB39E7AC2D60A32D9B77EECFFA53E7022137B7587E5D18E2B100845108104A79B878405B8900A0837BE74494F45DF726B88990607580414CEA1358A78BF832447919460F37395E69BC30E81983D60BB71D4E86164317138B99B545416467AA1F8592A16CEA1B050D2554487A749408A8339FFCA98A5F23D4EEF7A4254C6E56BFD6B95AD3C822B83324BEC5DD85A7064C6233899F7C6D00749D9DEDBAD9ED72CCC9CF154EF3989752DF907B24E587CD6B29A22846CD1B9623A3AEF69D191E8C048046FBCA2BC2C2A0883C8738F72D612745419080B7D72D8EC2E696CF5CB5EB6F23A9BBFF4BDD129970E881DBAA81E2F1A1445C773D4445ED516D1D954C64593DF72B7B31810B7493B8334F57E79FB26554EE1B4E7B7BDAA2C707D8E4798549DB60AE0A064CA8C6AA36021EB1657E72810E676D0F312325F2FAF956DC336D6B8E1496553362292D98225D61A74827C43FD4B4E0242B19FECBA7C102940C24AC56BB287C739608441EAA2EAA6DE0D1323E6D45204A1FF07BC3D3A48F954597EE865531D8A32C1DC2A3A48C8A0D47BE16919C3DF9E0514CE632B59A57
-20241129023429 2 6 100 4095 5 D14DC7A20FAA787E8E505E1CCA5C3EC8C5344CE26B9E5E776858C7048EECCB2CE278073BA42E21E4512A91D9A94F6460E86A914FC8D560A29DDC6B3E45CA1F9E8C5C52057BAF6A992E0C04192CEDF05010493D9CED8F97D3891C7DB13865BCD4BC19EA746AFB39E7AC2D60A32D9B77EECFFA53E7022137B7587E5D18E2B100845108104A79B878405B8900A0837BE74494F45DF726B88990607580414CEA1358A78BF832447919460F37395E69BC30E81983D60BB71D4E86164317138B99B545416467AA1F8592A16CEA1B050D2554487A749408A8339FFCA98A5F23D4EEF7A4254C6E56BFD6B95AD3C822B83324BEC5DD85A7064C6233899F7C6D00749D9DEDBAD9ED72CCC9CF154EF3989752DF907B24E587CD6B29A22846CD1B9623A3AEF69D191E8C048046FBCA2BC2C2A0883C8738F72D612745419080B7D72D8EC2E696CF5CB5EB6F23A9BBFF4BDD129970E881DBAA81E2F1A1445C773D4445ED516D1D954C64593DF72B7B31810B7493B8334F57E79FB26554EE1B4E7B7BDAA2C707D8E4798549DB60AE0A064CA8C6AA36021EB1657E72810E676D0F312325F2FAF956DC336D6B8E1496553362292D98225D61A74827C43FD4B4E0242B19FECBA7C102940C24AC56BB287C739608441EAA2EAA6DE0D1323E6D45204A1FF07BC3D3A48F954597EE865531D8A32C1DC2A3A48C8A0D47BE16919C3DF9E0514CE633681547
-20241129023526 2 6 100 4095 2 D14DC7A20FAA787E8E505E1CCA5C3EC8C5344CE26B9E5E776858C7048EECCB2CE278073BA42E21E4512A91D9A94F6460E86A914FC8D560A29DDC6B3E45CA1F9E8C5C52057BAF6A992E0C04192CEDF05010493D9CED8F97D3891C7DB13865BCD4BC19EA746AFB39E7AC2D60A32D9B77EECFFA53E7022137B7587E5D18E2B100845108104A79B878405B8900A0837BE74494F45DF726B88990607580414CEA1358A78BF832447919460F37395E69BC30E81983D60BB71D4E86164317138B99B545416467AA1F8592A16CEA1B050D2554487A749408A8339FFCA98A5F23D4EEF7A4254C6E56BFD6B95AD3C822B83324BEC5DD85A7064C6233899F7C6D00749D9DEDBAD9ED72CCC9CF154EF3989752DF907B24E587CD6B29A22846CD1B9623A3AEF69D191E8C048046FBCA2BC2C2A0883C8738F72D612745419080B7D72D8EC2E696CF5CB5EB6F23A9BBFF4BDD129970E881DBAA81E2F1A1445C773D4445ED516D1D954C64593DF72B7B31810B7493B8334F57E79FB26554EE1B4E7B7BDAA2C707D8E4798549DB60AE0A064CA8C6AA36021EB1657E72810E676D0F312325F2FAF956DC336D6B8E1496553362292D98225D61A74827C43FD4B4E0242B19FECBA7C102940C24AC56BB287C739608441EAA2EAA6DE0D1323E6D45204A1FF07BC3D3A48F954597EE865531D8A32C1DC2A3A48C8A0D47BE16919C3DF9E0514CE633BFD83B
-20241129023744 2 6 100 4095 2 D14DC7A20FAA787E8E505E1CCA5C3EC8C5344CE26B9E5E776858C7048EECCB2CE278073BA42E21E4512A91D9A94F6460E86A914FC8D560A29DDC6B3E45CA1F9E8C5C52057BAF6A992E0C04192CEDF05010493D9CED8F97D3891C7DB13865BCD4BC19EA746AFB39E7AC2D60A32D9B77EECFFA53E7022137B7587E5D18E2B100845108104A79B878405B8900A0837BE74494F45DF726B88990607580414CEA1358A78BF832447919460F37395E69BC30E81983D60BB71D4E86164317138B99B545416467AA1F8592A16CEA1B050D2554487A749408A8339FFCA98A5F23D4EEF7A4254C6E56BFD6B95AD3C822B83324BEC5DD85A7064C6233899F7C6D00749D9DEDBAD9ED72CCC9CF154EF3989752DF907B24E587CD6B29A22846CD1B9623A3AEF69D191E8C048046FBCA2BC2C2A0883C8738F72D612745419080B7D72D8EC2E696CF5CB5EB6F23A9BBFF4BDD129970E881DBAA81E2F1A1445C773D4445ED516D1D954C64593DF72B7B31810B7493B8334F57E79FB26554EE1B4E7B7BDAA2C707D8E4798549DB60AE0A064CA8C6AA36021EB1657E72810E676D0F312325F2FAF956DC336D6B8E1496553362292D98225D61A74827C43FD4B4E0242B19FECBA7C102940C24AC56BB287C739608441EAA2EAA6DE0D1323E6D45204A1FF07BC3D3A48F954597EE865531D8A32C1DC2A3A48C8A0D47BE16919C3DF9E0514CE634998373
-20241129023820 2 6 100 4095 5 D14DC7A20FAA787E8E505E1CCA5C3EC8C5344CE26B9E5E776858C7048EECCB2CE278073BA42E21E4512A91D9A94F6460E86A914FC8D560A29DDC6B3E45CA1F9E8C5C52057BAF6A992E0C04192CEDF05010493D9CED8F97D3891C7DB13865BCD4BC19EA746AFB39E7AC2D60A32D9B77EECFFA53E7022137B7587E5D18E2B100845108104A79B878405B8900A0837BE74494F45DF726B88990607580414CEA1358A78BF832447919460F37395E69BC30E81983D60BB71D4E86164317138B99B545416467AA1F8592A16CEA1B050D2554487A749408A8339FFCA98A5F23D4EEF7A4254C6E56BFD6B95AD3C822B83324BEC5DD85A7064C6233899F7C6D00749D9DEDBAD9ED72CCC9CF154EF3989752DF907B24E587CD6B29A22846CD1B9623A3AEF69D191E8C048046FBCA2BC2C2A0883C8738F72D612745419080B7D72D8EC2E696CF5CB5EB6F23A9BBFF4BDD129970E881DBAA81E2F1A1445C773D4445ED516D1D954C64593DF72B7B31810B7493B8334F57E79FB26554EE1B4E7B7BDAA2C707D8E4798549DB60AE0A064CA8C6AA36021EB1657E72810E676D0F312325F2FAF956DC336D6B8E1496553362292D98225D61A74827C43FD4B4E0242B19FECBA7C102940C24AC56BB287C739608441EAA2EAA6DE0D1323E6D45204A1FF07BC3D3A48F954597EE865531D8A32C1DC2A3A48C8A0D47BE16919C3DF9E0514CE634CA05CF
-20241129023919 2 6 100 4095 2 D14DC7A20FAA787E8E505E1CCA5C3EC8C5344CE26B9E5E776858C7048EECCB2CE278073BA42E21E4512A91D9A94F6460E86A914FC8D560A29DDC6B3E45CA1F9E8C5C52057BAF6A992E0C04192CEDF05010493D9CED8F97D3891C7DB13865BCD4BC19EA746AFB39E7AC2D60A32D9B77EECFFA53E7022137B7587E5D18E2B100845108104A79B878405B8900A0837BE74494F45DF726B88990607580414CEA1358A78BF832447919460F37395E69BC30E81983D60BB71D4E86164317138B99B545416467AA1F8592A16CEA1B050D2554487A749408A8339FFCA98A5F23D4EEF7A4254C6E56BFD6B95AD3C822B83324BEC5DD85A7064C6233899F7C6D00749D9DEDBAD9ED72CCC9CF154EF3989752DF907B24E587CD6B29A22846CD1B9623A3AEF69D191E8C048046FBCA2BC2C2A0883C8738F72D612745419080B7D72D8EC2E696CF5CB5EB6F23A9BBFF4BDD129970E881DBAA81E2F1A1445C773D4445ED516D1D954C64593DF72B7B31810B7493B8334F57E79FB26554EE1B4E7B7BDAA2C707D8E4798549DB60AE0A064CA8C6AA36021EB1657E72810E676D0F312325F2FAF956DC336D6B8E1496553362292D98225D61A74827C43FD4B4E0242B19FECBA7C102940C24AC56BB287C739608441EAA2EAA6DE0D1323E6D45204A1FF07BC3D3A48F954597EE865531D8A32C1DC2A3A48C8A0D47BE16919C3DF9E0514CE635285DD3
-20241129024116 2 6 100 4095 5 D14DC7A20FAA787E8E505E1CCA5C3EC8C5344CE26B9E5E776858C7048EECCB2CE278073BA42E21E4512A91D9A94F6460E86A914FC8D560A29DDC6B3E45CA1F9E8C5C52057BAF6A992E0C04192CEDF05010493D9CED8F97D3891C7DB13865BCD4BC19EA746AFB39E7AC2D60A32D9B77EECFFA53E7022137B7587E5D18E2B100845108104A79B878405B8900A0837BE74494F45DF726B88990607580414CEA1358A78BF832447919460F37395E69BC30E81983D60BB71D4E86164317138B99B545416467AA1F8592A16CEA1B050D2554487A749408A8339FFCA98A5F23D4EEF7A4254C6E56BFD6B95AD3C822B83324BEC5DD85A7064C6233899F7C6D00749D9DEDBAD9ED72CCC9CF154EF3989752DF907B24E587CD6B29A22846CD1B9623A3AEF69D191E8C048046FBCA2BC2C2A0883C8738F72D612745419080B7D72D8EC2E696CF5CB5EB6F23A9BBFF4BDD129970E881DBAA81E2F1A1445C773D4445ED516D1D954C64593DF72B7B31810B7493B8334F57E79FB26554EE1B4E7B7BDAA2C707D8E4798549DB60AE0A064CA8C6AA36021EB1657E72810E676D0F312325F2FAF956DC336D6B8E1496553362292D98225D61A74827C43FD4B4E0242B19FECBA7C102940C24AC56BB287C739608441EAA2EAA6DE0D1323E6D45204A1FF07BC3D3A48F954597EE865531D8A32C1DC2A3A48C8A0D47BE16919C3DF9E0514CE635E04407
-20241129024436 2 6 100 4095 5 D14DC7A20FAA787E8E505E1CCA5C3EC8C5344CE26B9E5E776858C7048EECCB2CE278073BA42E21E4512A91D9A94F6460E86A914FC8D560A29DDC6B3E45CA1F9E8C5C52057BAF6A992E0C04192CEDF05010493D9CED8F97D3891C7DB13865BCD4BC19EA746AFB39E7AC2D60A32D9B77EECFFA53E7022137B7587E5D18E2B100845108104A79B878405B8900A0837BE74494F45DF726B88990607580414CEA1358A78BF832447919460F37395E69BC30E81983D60BB71D4E86164317138B99B545416467AA1F8592A16CEA1B050D2554487A749408A8339FFCA98A5F23D4EEF7A4254C6E56BFD6B95AD3C822B83324BEC5DD85A7064C6233899F7C6D00749D9DEDBAD9ED72CCC9CF154EF3989752DF907B24E587CD6B29A22846CD1B9623A3AEF69D191E8C048046FBCA2BC2C2A0883C8738F72D612745419080B7D72D8EC2E696CF5CB5EB6F23A9BBFF4BDD129970E881DBAA81E2F1A1445C773D4445ED516D1D954C64593DF72B7B31810B7493B8334F57E79FB26554EE1B4E7B7BDAA2C707D8E4798549DB60AE0A064CA8C6AA36021EB1657E72810E676D0F312325F2FAF956DC336D6B8E1496553362292D98225D61A74827C43FD4B4E0242B19FECBA7C102940C24AC56BB287C739608441EAA2EAA6DE0D1323E6D45204A1FF07BC3D3A48F954597EE865531D8A32C1DC2A3A48C8A0D47BE16919C3DF9E0514CE637222687
-20241129024611 2 6 100 4095 5 D14DC7A20FAA787E8E505E1CCA5C3EC8C5344CE26B9E5E776858C7048EECCB2CE278073BA42E21E4512A91D9A94F6460E86A914FC8D560A29DDC6B3E45CA1F9E8C5C52057BAF6A992E0C04192CEDF05010493D9CED8F97D3891C7DB13865BCD4BC19EA746AFB39E7AC2D60A32D9B77EECFFA53E7022137B7587E5D18E2B100845108104A79B878405B8900A0837BE74494F45DF726B88990607580414CEA1358A78BF832447919460F37395E69BC30E81983D60BB71D4E86164317138B99B545416467AA1F8592A16CEA1B050D2554487A749408A8339FFCA98A5F23D4EEF7A4254C6E56BFD6B95AD3C822B83324BEC5DD85A7064C6233899F7C6D00749D9DEDBAD9ED72CCC9CF154EF3989752DF907B24E587CD6B29A22846CD1B9623A3AEF69D191E8C048046FBCA2BC2C2A0883C8738F72D612745419080B7D72D8EC2E696CF5CB5EB6F23A9BBFF4BDD129970E881DBAA81E2F1A1445C773D4445ED516D1D954C64593DF72B7B31810B7493B8334F57E79FB26554EE1B4E7B7BDAA2C707D8E4798549DB60AE0A064CA8C6AA36021EB1657E72810E676D0F312325F2FAF956DC336D6B8E1496553362292D98225D61A74827C43FD4B4E0242B19FECBA7C102940C24AC56BB287C739608441EAA2EAA6DE0D1323E6D45204A1FF07BC3D3A48F954597EE865531D8A32C1DC2A3A48C8A0D47BE16919C3DF9E0514CE637B833A7
-20241129024935 2 6 100 4095 2 D14DC7A20FAA787E8E505E1CCA5C3EC8C5344CE26B9E5E776858C7048EECCB2CE278073BA42E21E4512A91D9A94F6460E86A914FC8D560A29DDC6B3E45CA1F9E8C5C52057BAF6A992E0C04192CEDF05010493D9CED8F97D3891C7DB13865BCD4BC19EA746AFB39E7AC2D60A32D9B77EECFFA53E7022137B7587E5D18E2B100845108104A79B878405B8900A0837BE74494F45DF726B88990607580414CEA1358A78BF832447919460F37395E69BC30E81983D60BB71D4E86164317138B99B545416467AA1F8592A16CEA1B050D2554487A749408A8339FFCA98A5F23D4EEF7A4254C6E56BFD6B95AD3C822B83324BEC5DD85A7064C6233899F7C6D00749D9DEDBAD9ED72CCC9CF154EF3989752DF907B24E587CD6B29A22846CD1B9623A3AEF69D191E8C048046FBCA2BC2C2A0883C8738F72D612745419080B7D72D8EC2E696CF5CB5EB6F23A9BBFF4BDD129970E881DBAA81E2F1A1445C773D4445ED516D1D954C64593DF72B7B31810B7493B8334F57E79FB26554EE1B4E7B7BDAA2C707D8E4798549DB60AE0A064CA8C6AA36021EB1657E72810E676D0F312325F2FAF956DC336D6B8E1496553362292D98225D61A74827C43FD4B4E0242B19FECBA7C102940C24AC56BB287C739608441EAA2EAA6DE0D1323E6D45204A1FF07BC3D3A48F954597EE865531D8A32C1DC2A3A48C8A0D47BE16919C3DF9E0514CE63905717B
-20241129025344 2 6 100 4095 2 F32300D8DFCB79ECFB80E433E6CFA1923915D80120F52648A7AE7E8058B5DB869F2B3A9DD940E53B7D74E3214FA03234F8B026AFF16B646B39F003882F1DC17D3F6DBB89283A01B4C22168A354D6D2FDBDE3F2B0C91E9472AF1DB386DD34477F47CB24D4AFB71BB283A9760CF4EC582F1401A4F259D4AADE2BC7648A6920207DFB149BB7A4483D5E22D9DC627A8A4954C18AAAEF921CE0C597C11C95EC7C8888050124D01C43E6A33A02DACDB2EEE70920BAF2A296EB38CEADCB98CC7789BA309A5AD7916B9F7F86B0D808346E28447C4E3F31C5BC319D29A0D338EE8FC88BC9288C75004CC278BB218AA86929360079EAA71628FEFB796FFFBAD3764F677FECC0F274582ED2E371ACB500F35F378DDEDB0FA32B1B55699E41EBE958E6614811999433D934CCD54A03CC4BF359798F90EC809CFA6E58C1CE68B5AF397E8E35951F9CC4BCD0EC8655486543B4CF7605CE15969A2D88E8CD6BCA82671A06FC54397840BBA9DB2750B0F1FBC61ECF6E514450A7E06C6E6BBBB2CFA5E045335F04A5C407EC6467D471226ED2CB3AE9FBA9E956F8F3D05A911F9CD131BC3D95A10792097AC1C4339F8C12E40ABD274A25CF26EF286187E91261273E39856C471D861056EC3F6F5E58EB727134F9BFB870C8DD6978F247EAF67C1368BCB0BA105CDDC2BA067EBAC9C00DC15F1667664AA2A688D45E843F62467892EE9348FD87AD5A3B
-20241129025405 2 6 100 4095 5 F32300D8DFCB79ECFB80E433E6CFA1923915D80120F52648A7AE7E8058B5DB869F2B3A9DD940E53B7D74E3214FA03234F8B026AFF16B646B39F003882F1DC17D3F6DBB89283A01B4C22168A354D6D2FDBDE3F2B0C91E9472AF1DB386DD34477F47CB24D4AFB71BB283A9760CF4EC582F1401A4F259D4AADE2BC7648A6920207DFB149BB7A4483D5E22D9DC627A8A4954C18AAAEF921CE0C597C11C95EC7C8888050124D01C43E6A33A02DACDB2EEE70920BAF2A296EB38CEADCB98CC7789BA309A5AD7916B9F7F86B0D808346E28447C4E3F31C5BC319D29A0D338EE8FC88BC9288C75004CC278BB218AA86929360079EAA71628FEFB796FFFBAD3764F677FECC0F274582ED2E371ACB500F35F378DDEDB0FA32B1B55699E41EBE958E6614811999433D934CCD54A03CC4BF359798F90EC809CFA6E58C1CE68B5AF397E8E35951F9CC4BCD0EC8655486543B4CF7605CE15969A2D88E8CD6BCA82671A06FC54397840BBA9DB2750B0F1FBC61ECF6E514450A7E06C6E6BBBB2CFA5E045335F04A5C407EC6467D471226ED2CB3AE9FBA9E956F8F3D05A911F9CD131BC3D95A10792097AC1C4339F8C12E40ABD274A25CF26EF286187E91261273E39856C471D861056EC3F6F5E58EB727134F9BFB870C8DD6978F247EAF67C1368BCB0BA105CDDC2BA067EBAC9C00DC15F1667664AA2A688D45E843F62467892EE9348FD87C61B07
-20241129025445 2 6 100 4095 2 F32300D8DFCB79ECFB80E433E6CFA1923915D80120F52648A7AE7E8058B5DB869F2B3A9DD940E53B7D74E3214FA03234F8B026AFF16B646B39F003882F1DC17D3F6DBB89283A01B4C22168A354D6D2FDBDE3F2B0C91E9472AF1DB386DD34477F47CB24D4AFB71BB283A9760CF4EC582F1401A4F259D4AADE2BC7648A6920207DFB149BB7A4483D5E22D9DC627A8A4954C18AAAEF921CE0C597C11C95EC7C8888050124D01C43E6A33A02DACDB2EEE70920BAF2A296EB38CEADCB98CC7789BA309A5AD7916B9F7F86B0D808346E28447C4E3F31C5BC319D29A0D338EE8FC88BC9288C75004CC278BB218AA86929360079EAA71628FEFB796FFFBAD3764F677FECC0F274582ED2E371ACB500F35F378DDEDB0FA32B1B55699E41EBE958E6614811999433D934CCD54A03CC4BF359798F90EC809CFA6E58C1CE68B5AF397E8E35951F9CC4BCD0EC8655486543B4CF7605CE15969A2D88E8CD6BCA82671A06FC54397840BBA9DB2750B0F1FBC61ECF6E514450A7E06C6E6BBBB2CFA5E045335F04A5C407EC6467D471226ED2CB3AE9FBA9E956F8F3D05A911F9CD131BC3D95A10792097AC1C4339F8C12E40ABD274A25CF26EF286187E91261273E39856C471D861056EC3F6F5E58EB727134F9BFB870C8DD6978F247EAF67C1368BCB0BA105CDDC2BA067EBAC9C00DC15F1667664AA2A688D45E843F62467892EE9348FD88010893
-20241129025701 2 6 100 4095 2 F32300D8DFCB79ECFB80E433E6CFA1923915D80120F52648A7AE7E8058B5DB869F2B3A9DD940E53B7D74E3214FA03234F8B026AFF16B646B39F003882F1DC17D3F6DBB89283A01B4C22168A354D6D2FDBDE3F2B0C91E9472AF1DB386DD34477F47CB24D4AFB71BB283A9760CF4EC582F1401A4F259D4AADE2BC7648A6920207DFB149BB7A4483D5E22D9DC627A8A4954C18AAAEF921CE0C597C11C95EC7C8888050124D01C43E6A33A02DACDB2EEE70920BAF2A296EB38CEADCB98CC7789BA309A5AD7916B9F7F86B0D808346E28447C4E3F31C5BC319D29A0D338EE8FC88BC9288C75004CC278BB218AA86929360079EAA71628FEFB796FFFBAD3764F677FECC0F274582ED2E371ACB500F35F378DDEDB0FA32B1B55699E41EBE958E6614811999433D934CCD54A03CC4BF359798F90EC809CFA6E58C1CE68B5AF397E8E35951F9CC4BCD0EC8655486543B4CF7605CE15969A2D88E8CD6BCA82671A06FC54397840BBA9DB2750B0F1FBC61ECF6E514450A7E06C6E6BBBB2CFA5E045335F04A5C407EC6467D471226ED2CB3AE9FBA9E956F8F3D05A911F9CD131BC3D95A10792097AC1C4339F8C12E40ABD274A25CF26EF286187E91261273E39856C471D861056EC3F6F5E58EB727134F9BFB870C8DD6978F247EAF67C1368BCB0BA105CDDC2BA067EBAC9C00DC15F1667664AA2A688D45E843F62467892EE9348FD88DA8ABB
-20241129025807 2 6 100 4095 2 F32300D8DFCB79ECFB80E433E6CFA1923915D80120F52648A7AE7E8058B5DB869F2B3A9DD940E53B7D74E3214FA03234F8B026AFF16B646B39F003882F1DC17D3F6DBB89283A01B4C22168A354D6D2FDBDE3F2B0C91E9472AF1DB386DD34477F47CB24D4AFB71BB283A9760CF4EC582F1401A4F259D4AADE2BC7648A6920207DFB149BB7A4483D5E22D9DC627A8A4954C18AAAEF921CE0C597C11C95EC7C8888050124D01C43E6A33A02DACDB2EEE70920BAF2A296EB38CEADCB98CC7789BA309A5AD7916B9F7F86B0D808346E28447C4E3F31C5BC319D29A0D338EE8FC88BC9288C75004CC278BB218AA86929360079EAA71628FEFB796FFFBAD3764F677FECC0F274582ED2E371ACB500F35F378DDEDB0FA32B1B55699E41EBE958E6614811999433D934CCD54A03CC4BF359798F90EC809CFA6E58C1CE68B5AF397E8E35951F9CC4BCD0EC8655486543B4CF7605CE15969A2D88E8CD6BCA82671A06FC54397840BBA9DB2750B0F1FBC61ECF6E514450A7E06C6E6BBBB2CFA5E045335F04A5C407EC6467D471226ED2CB3AE9FBA9E956F8F3D05A911F9CD131BC3D95A10792097AC1C4339F8C12E40ABD274A25CF26EF286187E91261273E39856C471D861056EC3F6F5E58EB727134F9BFB870C8DD6978F247EAF67C1368BCB0BA105CDDC2BA067EBAC9C00DC15F1667664AA2A688D45E843F62467892EE9348FD893E4473
-20241129025930 2 6 100 4095 5 F32300D8DFCB79ECFB80E433E6CFA1923915D80120F52648A7AE7E8058B5DB869F2B3A9DD940E53B7D74E3214FA03234F8B026AFF16B646B39F003882F1DC17D3F6DBB89283A01B4C22168A354D6D2FDBDE3F2B0C91E9472AF1DB386DD34477F47CB24D4AFB71BB283A9760CF4EC582F1401A4F259D4AADE2BC7648A6920207DFB149BB7A4483D5E22D9DC627A8A4954C18AAAEF921CE0C597C11C95EC7C8888050124D01C43E6A33A02DACDB2EEE70920BAF2A296EB38CEADCB98CC7789BA309A5AD7916B9F7F86B0D808346E28447C4E3F31C5BC319D29A0D338EE8FC88BC9288C75004CC278BB218AA86929360079EAA71628FEFB796FFFBAD3764F677FECC0F274582ED2E371ACB500F35F378DDEDB0FA32B1B55699E41EBE958E6614811999433D934CCD54A03CC4BF359798F90EC809CFA6E58C1CE68B5AF397E8E35951F9CC4BCD0EC8655486543B4CF7605CE15969A2D88E8CD6BCA82671A06FC54397840BBA9DB2750B0F1FBC61ECF6E514450A7E06C6E6BBBB2CFA5E045335F04A5C407EC6467D471226ED2CB3AE9FBA9E956F8F3D05A911F9CD131BC3D95A10792097AC1C4339F8C12E40ABD274A25CF26EF286187E91261273E39856C471D861056EC3F6F5E58EB727134F9BFB870C8DD6978F247EAF67C1368BCB0BA105CDDC2BA067EBAC9C00DC15F1667664AA2A688D45E843F62467892EE9348FD89BD17B7
-20241129025947 2 6 100 4095 2 F32300D8DFCB79ECFB80E433E6CFA1923915D80120F52648A7AE7E8058B5DB869F2B3A9DD940E53B7D74E3214FA03234F8B026AFF16B646B39F003882F1DC17D3F6DBB89283A01B4C22168A354D6D2FDBDE3F2B0C91E9472AF1DB386DD34477F47CB24D4AFB71BB283A9760CF4EC582F1401A4F259D4AADE2BC7648A6920207DFB149BB7A4483D5E22D9DC627A8A4954C18AAAEF921CE0C597C11C95EC7C8888050124D01C43E6A33A02DACDB2EEE70920BAF2A296EB38CEADCB98CC7789BA309A5AD7916B9F7F86B0D808346E28447C4E3F31C5BC319D29A0D338EE8FC88BC9288C75004CC278BB218AA86929360079EAA71628FEFB796FFFBAD3764F677FECC0F274582ED2E371ACB500F35F378DDEDB0FA32B1B55699E41EBE958E6614811999433D934CCD54A03CC4BF359798F90EC809CFA6E58C1CE68B5AF397E8E35951F9CC4BCD0EC8655486543B4CF7605CE15969A2D88E8CD6BCA82671A06FC54397840BBA9DB2750B0F1FBC61ECF6E514450A7E06C6E6BBBB2CFA5E045335F04A5C407EC6467D471226ED2CB3AE9FBA9E956F8F3D05A911F9CD131BC3D95A10792097AC1C4339F8C12E40ABD274A25CF26EF286187E91261273E39856C471D861056EC3F6F5E58EB727134F9BFB870C8DD6978F247EAF67C1368BCB0BA105CDDC2BA067EBAC9C00DC15F1667664AA2A688D45E843F62467892EE9348FD89D220C3
-20241129030824 2 6 100 4095 2 F32300D8DFCB79ECFB80E433E6CFA1923915D80120F52648A7AE7E8058B5DB869F2B3A9DD940E53B7D74E3214FA03234F8B026AFF16B646B39F003882F1DC17D3F6DBB89283A01B4C22168A354D6D2FDBDE3F2B0C91E9472AF1DB386DD34477F47CB24D4AFB71BB283A9760CF4EC582F1401A4F259D4AADE2BC7648A6920207DFB149BB7A4483D5E22D9DC627A8A4954C18AAAEF921CE0C597C11C95EC7C8888050124D01C43E6A33A02DACDB2EEE70920BAF2A296EB38CEADCB98CC7789BA309A5AD7916B9F7F86B0D808346E28447C4E3F31C5BC319D29A0D338EE8FC88BC9288C75004CC278BB218AA86929360079EAA71628FEFB796FFFBAD3764F677FECC0F274582ED2E371ACB500F35F378DDEDB0FA32B1B55699E41EBE958E6614811999433D934CCD54A03CC4BF359798F90EC809CFA6E58C1CE68B5AF397E8E35951F9CC4BCD0EC8655486543B4CF7605CE15969A2D88E8CD6BCA82671A06FC54397840BBA9DB2750B0F1FBC61ECF6E514450A7E06C6E6BBBB2CFA5E045335F04A5C407EC6467D471226ED2CB3AE9FBA9E956F8F3D05A911F9CD131BC3D95A10792097AC1C4339F8C12E40ABD274A25CF26EF286187E91261273E39856C471D861056EC3F6F5E58EB727134F9BFB870C8DD6978F247EAF67C1368BCB0BA105CDDC2BA067EBAC9C00DC15F1667664AA2A688D45E843F62467892EE9348FD8D22E89B
-20241129031329 2 6 100 4095 2 F32300D8DFCB79ECFB80E433E6CFA1923915D80120F52648A7AE7E8058B5DB869F2B3A9DD940E53B7D74E3214FA03234F8B026AFF16B646B39F003882F1DC17D3F6DBB89283A01B4C22168A354D6D2FDBDE3F2B0C91E9472AF1DB386DD34477F47CB24D4AFB71BB283A9760CF4EC582F1401A4F259D4AADE2BC7648A6920207DFB149BB7A4483D5E22D9DC627A8A4954C18AAAEF921CE0C597C11C95EC7C8888050124D01C43E6A33A02DACDB2EEE70920BAF2A296EB38CEADCB98CC7789BA309A5AD7916B9F7F86B0D808346E28447C4E3F31C5BC319D29A0D338EE8FC88BC9288C75004CC278BB218AA86929360079EAA71628FEFB796FFFBAD3764F677FECC0F274582ED2E371ACB500F35F378DDEDB0FA32B1B55699E41EBE958E6614811999433D934CCD54A03CC4BF359798F90EC809CFA6E58C1CE68B5AF397E8E35951F9CC4BCD0EC8655486543B4CF7605CE15969A2D88E8CD6BCA82671A06FC54397840BBA9DB2750B0F1FBC61ECF6E514450A7E06C6E6BBBB2CFA5E045335F04A5C407EC6467D471226ED2CB3AE9FBA9E956F8F3D05A911F9CD131BC3D95A10792097AC1C4339F8C12E40ABD274A25CF26EF286187E91261273E39856C471D861056EC3F6F5E58EB727134F9BFB870C8DD6978F247EAF67C1368BCB0BA105CDDC2BA067EBAC9C00DC15F1667664AA2A688D45E843F62467892EE9348FD8F0BC07B
-20241129031515 2 6 100 4095 5 F32300D8DFCB79ECFB80E433E6CFA1923915D80120F52648A7AE7E8058B5DB869F2B3A9DD940E53B7D74E3214FA03234F8B026AFF16B646B39F003882F1DC17D3F6DBB89283A01B4C22168A354D6D2FDBDE3F2B0C91E9472AF1DB386DD34477F47CB24D4AFB71BB283A9760CF4EC582F1401A4F259D4AADE2BC7648A6920207DFB149BB7A4483D5E22D9DC627A8A4954C18AAAEF921CE0C597C11C95EC7C8888050124D01C43E6A33A02DACDB2EEE70920BAF2A296EB38CEADCB98CC7789BA309A5AD7916B9F7F86B0D808346E28447C4E3F31C5BC319D29A0D338EE8FC88BC9288C75004CC278BB218AA86929360079EAA71628FEFB796FFFBAD3764F677FECC0F274582ED2E371ACB500F35F378DDEDB0FA32B1B55699E41EBE958E6614811999433D934CCD54A03CC4BF359798F90EC809CFA6E58C1CE68B5AF397E8E35951F9CC4BCD0EC8655486543B4CF7605CE15969A2D88E8CD6BCA82671A06FC54397840BBA9DB2750B0F1FBC61ECF6E514450A7E06C6E6BBBB2CFA5E045335F04A5C407EC6467D471226ED2CB3AE9FBA9E956F8F3D05A911F9CD131BC3D95A10792097AC1C4339F8C12E40ABD274A25CF26EF286187E91261273E39856C471D861056EC3F6F5E58EB727134F9BFB870C8DD6978F247EAF67C1368BCB0BA105CDDC2BA067EBAC9C00DC15F1667664AA2A688D45E843F62467892EE9348FD8FB3CF27
-20241129031807 2 6 100 4095 5 F32300D8DFCB79ECFB80E433E6CFA1923915D80120F52648A7AE7E8058B5DB869F2B3A9DD940E53B7D74E3214FA03234F8B026AFF16B646B39F003882F1DC17D3F6DBB89283A01B4C22168A354D6D2FDBDE3F2B0C91E9472AF1DB386DD34477F47CB24D4AFB71BB283A9760CF4EC582F1401A4F259D4AADE2BC7648A6920207DFB149BB7A4483D5E22D9DC627A8A4954C18AAAEF921CE0C597C11C95EC7C8888050124D01C43E6A33A02DACDB2EEE70920BAF2A296EB38CEADCB98CC7789BA309A5AD7916B9F7F86B0D808346E28447C4E3F31C5BC319D29A0D338EE8FC88BC9288C75004CC278BB218AA86929360079EAA71628FEFB796FFFBAD3764F677FECC0F274582ED2E371ACB500F35F378DDEDB0FA32B1B55699E41EBE958E6614811999433D934CCD54A03CC4BF359798F90EC809CFA6E58C1CE68B5AF397E8E35951F9CC4BCD0EC8655486543B4CF7605CE15969A2D88E8CD6BCA82671A06FC54397840BBA9DB2750B0F1FBC61ECF6E514450A7E06C6E6BBBB2CFA5E045335F04A5C407EC6467D471226ED2CB3AE9FBA9E956F8F3D05A911F9CD131BC3D95A10792097AC1C4339F8C12E40ABD274A25CF26EF286187E91261273E39856C471D861056EC3F6F5E58EB727134F9BFB870C8DD6978F247EAF67C1368BCB0BA105CDDC2BA067EBAC9C00DC15F1667664AA2A688D45E843F62467892EE9348FD90C1CCE7
-20241129032416 2 6 100 4095 2 F32300D8DFCB79ECFB80E433E6CFA1923915D80120F52648A7AE7E8058B5DB869F2B3A9DD940E53B7D74E3214FA03234F8B026AFF16B646B39F003882F1DC17D3F6DBB89283A01B4C22168A354D6D2FDBDE3F2B0C91E9472AF1DB386DD34477F47CB24D4AFB71BB283A9760CF4EC582F1401A4F259D4AADE2BC7648A6920207DFB149BB7A4483D5E22D9DC627A8A4954C18AAAEF921CE0C597C11C95EC7C8888050124D01C43E6A33A02DACDB2EEE70920BAF2A296EB38CEADCB98CC7789BA309A5AD7916B9F7F86B0D808346E28447C4E3F31C5BC319D29A0D338EE8FC88BC9288C75004CC278BB218AA86929360079EAA71628FEFB796FFFBAD3764F677FECC0F274582ED2E371ACB500F35F378DDEDB0FA32B1B55699E41EBE958E6614811999433D934CCD54A03CC4BF359798F90EC809CFA6E58C1CE68B5AF397E8E35951F9CC4BCD0EC8655486543B4CF7605CE15969A2D88E8CD6BCA82671A06FC54397840BBA9DB2750B0F1FBC61ECF6E514450A7E06C6E6BBBB2CFA5E045335F04A5C407EC6467D471226ED2CB3AE9FBA9E956F8F3D05A911F9CD131BC3D95A10792097AC1C4339F8C12E40ABD274A25CF26EF286187E91261273E39856C471D861056EC3F6F5E58EB727134F9BFB870C8DD6978F247EAF67C1368BCB0BA105CDDC2BA067EBAC9C00DC15F1667664AA2A688D45E843F62467892EE9348FD9313280B
-20241129032613 2 6 100 4095 5 F32300D8DFCB79ECFB80E433E6CFA1923915D80120F52648A7AE7E8058B5DB869F2B3A9DD940E53B7D74E3214FA03234F8B026AFF16B646B39F003882F1DC17D3F6DBB89283A01B4C22168A354D6D2FDBDE3F2B0C91E9472AF1DB386DD34477F47CB24D4AFB71BB283A9760CF4EC582F1401A4F259D4AADE2BC7648A6920207DFB149BB7A4483D5E22D9DC627A8A4954C18AAAEF921CE0C597C11C95EC7C8888050124D01C43E6A33A02DACDB2EEE70920BAF2A296EB38CEADCB98CC7789BA309A5AD7916B9F7F86B0D808346E28447C4E3F31C5BC319D29A0D338EE8FC88BC9288C75004CC278BB218AA86929360079EAA71628FEFB796FFFBAD3764F677FECC0F274582ED2E371ACB500F35F378DDEDB0FA32B1B55699E41EBE958E6614811999433D934CCD54A03CC4BF359798F90EC809CFA6E58C1CE68B5AF397E8E35951F9CC4BCD0EC8655486543B4CF7605CE15969A2D88E8CD6BCA82671A06FC54397840BBA9DB2750B0F1FBC61ECF6E514450A7E06C6E6BBBB2CFA5E045335F04A5C407EC6467D471226ED2CB3AE9FBA9E956F8F3D05A911F9CD131BC3D95A10792097AC1C4339F8C12E40ABD274A25CF26EF286187E91261273E39856C471D861056EC3F6F5E58EB727134F9BFB870C8DD6978F247EAF67C1368BCB0BA105CDDC2BA067EBAC9C00DC15F1667664AA2A688D45E843F62467892EE9348FD93CCA2C7
-20241129032705 2 6 100 4095 5 F32300D8DFCB79ECFB80E433E6CFA1923915D80120F52648A7AE7E8058B5DB869F2B3A9DD940E53B7D74E3214FA03234F8B026AFF16B646B39F003882F1DC17D3F6DBB89283A01B4C22168A354D6D2FDBDE3F2B0C91E9472AF1DB386DD34477F47CB24D4AFB71BB283A9760CF4EC582F1401A4F259D4AADE2BC7648A6920207DFB149BB7A4483D5E22D9DC627A8A4954C18AAAEF921CE0C597C11C95EC7C8888050124D01C43E6A33A02DACDB2EEE70920BAF2A296EB38CEADCB98CC7789BA309A5AD7916B9F7F86B0D808346E28447C4E3F31C5BC319D29A0D338EE8FC88BC9288C75004CC278BB218AA86929360079EAA71628FEFB796FFFBAD3764F677FECC0F274582ED2E371ACB500F35F378DDEDB0FA32B1B55699E41EBE958E6614811999433D934CCD54A03CC4BF359798F90EC809CFA6E58C1CE68B5AF397E8E35951F9CC4BCD0EC8655486543B4CF7605CE15969A2D88E8CD6BCA82671A06FC54397840BBA9DB2750B0F1FBC61ECF6E514450A7E06C6E6BBBB2CFA5E045335F04A5C407EC6467D471226ED2CB3AE9FBA9E956F8F3D05A911F9CD131BC3D95A10792097AC1C4339F8C12E40ABD274A25CF26EF286187E91261273E39856C471D861056EC3F6F5E58EB727134F9BFB870C8DD6978F247EAF67C1368BCB0BA105CDDC2BA067EBAC9C00DC15F1667664AA2A688D45E843F62467892EE9348FD941819BF
-20241129033035 2 6 100 4095 5 F32300D8DFCB79ECFB80E433E6CFA1923915D80120F52648A7AE7E8058B5DB869F2B3A9DD940E53B7D74E3214FA03234F8B026AFF16B646B39F003882F1DC17D3F6DBB89283A01B4C22168A354D6D2FDBDE3F2B0C91E9472AF1DB386DD34477F47CB24D4AFB71BB283A9760CF4EC582F1401A4F259D4AADE2BC7648A6920207DFB149BB7A4483D5E22D9DC627A8A4954C18AAAEF921CE0C597C11C95EC7C8888050124D01C43E6A33A02DACDB2EEE70920BAF2A296EB38CEADCB98CC7789BA309A5AD7916B9F7F86B0D808346E28447C4E3F31C5BC319D29A0D338EE8FC88BC9288C75004CC278BB218AA86929360079EAA71628FEFB796FFFBAD3764F677FECC0F274582ED2E371ACB500F35F378DDEDB0FA32B1B55699E41EBE958E6614811999433D934CCD54A03CC4BF359798F90EC809CFA6E58C1CE68B5AF397E8E35951F9CC4BCD0EC8655486543B4CF7605CE15969A2D88E8CD6BCA82671A06FC54397840BBA9DB2750B0F1FBC61ECF6E514450A7E06C6E6BBBB2CFA5E045335F04A5C407EC6467D471226ED2CB3AE9FBA9E956F8F3D05A911F9CD131BC3D95A10792097AC1C4339F8C12E40ABD274A25CF26EF286187E91261273E39856C471D861056EC3F6F5E58EB727134F9BFB870C8DD6978F247EAF67C1368BCB0BA105CDDC2BA067EBAC9C00DC15F1667664AA2A688D45E843F62467892EE9348FD9564B557
-20241129033357 2 6 100 4095 2 F32300D8DFCB79ECFB80E433E6CFA1923915D80120F52648A7AE7E8058B5DB869F2B3A9DD940E53B7D74E3214FA03234F8B026AFF16B646B39F003882F1DC17D3F6DBB89283A01B4C22168A354D6D2FDBDE3F2B0C91E9472AF1DB386DD34477F47CB24D4AFB71BB283A9760CF4EC582F1401A4F259D4AADE2BC7648A6920207DFB149BB7A4483D5E22D9DC627A8A4954C18AAAEF921CE0C597C11C95EC7C8888050124D01C43E6A33A02DACDB2EEE70920BAF2A296EB38CEADCB98CC7789BA309A5AD7916B9F7F86B0D808346E28447C4E3F31C5BC319D29A0D338EE8FC88BC9288C75004CC278BB218AA86929360079EAA71628FEFB796FFFBAD3764F677FECC0F274582ED2E371ACB500F35F378DDEDB0FA32B1B55699E41EBE958E6614811999433D934CCD54A03CC4BF359798F90EC809CFA6E58C1CE68B5AF397E8E35951F9CC4BCD0EC8655486543B4CF7605CE15969A2D88E8CD6BCA82671A06FC54397840BBA9DB2750B0F1FBC61ECF6E514450A7E06C6E6BBBB2CFA5E045335F04A5C407EC6467D471226ED2CB3AE9FBA9E956F8F3D05A911F9CD131BC3D95A10792097AC1C4339F8C12E40ABD274A25CF26EF286187E91261273E39856C471D861056EC3F6F5E58EB727134F9BFB870C8DD6978F247EAF67C1368BCB0BA105CDDC2BA067EBAC9C00DC15F1667664AA2A688D45E843F62467892EE9348FD96B187EB
-20241129033421 2 6 100 4095 2 F32300D8DFCB79ECFB80E433E6CFA1923915D80120F52648A7AE7E8058B5DB869F2B3A9DD940E53B7D74E3214FA03234F8B026AFF16B646B39F003882F1DC17D3F6DBB89283A01B4C22168A354D6D2FDBDE3F2B0C91E9472AF1DB386DD34477F47CB24D4AFB71BB283A9760CF4EC582F1401A4F259D4AADE2BC7648A6920207DFB149BB7A4483D5E22D9DC627A8A4954C18AAAEF921CE0C597C11C95EC7C8888050124D01C43E6A33A02DACDB2EEE70920BAF2A296EB38CEADCB98CC7789BA309A5AD7916B9F7F86B0D808346E28447C4E3F31C5BC319D29A0D338EE8FC88BC9288C75004CC278BB218AA86929360079EAA71628FEFB796FFFBAD3764F677FECC0F274582ED2E371ACB500F35F378DDEDB0FA32B1B55699E41EBE958E6614811999433D934CCD54A03CC4BF359798F90EC809CFA6E58C1CE68B5AF397E8E35951F9CC4BCD0EC8655486543B4CF7605CE15969A2D88E8CD6BCA82671A06FC54397840BBA9DB2750B0F1FBC61ECF6E514450A7E06C6E6BBBB2CFA5E045335F04A5C407EC6467D471226ED2CB3AE9FBA9E956F8F3D05A911F9CD131BC3D95A10792097AC1C4339F8C12E40ABD274A25CF26EF286187E91261273E39856C471D861056EC3F6F5E58EB727134F9BFB870C8DD6978F247EAF67C1368BCB0BA105CDDC2BA067EBAC9C00DC15F1667664AA2A688D45E843F62467892EE9348FD96CEF60B
-20241129033539 2 6 100 4095 2 F32300D8DFCB79ECFB80E433E6CFA1923915D80120F52648A7AE7E8058B5DB869F2B3A9DD940E53B7D74E3214FA03234F8B026AFF16B646B39F003882F1DC17D3F6DBB89283A01B4C22168A354D6D2FDBDE3F2B0C91E9472AF1DB386DD34477F47CB24D4AFB71BB283A9760CF4EC582F1401A4F259D4AADE2BC7648A6920207DFB149BB7A4483D5E22D9DC627A8A4954C18AAAEF921CE0C597C11C95EC7C8888050124D01C43E6A33A02DACDB2EEE70920BAF2A296EB38CEADCB98CC7789BA309A5AD7916B9F7F86B0D808346E28447C4E3F31C5BC319D29A0D338EE8FC88BC9288C75004CC278BB218AA86929360079EAA71628FEFB796FFFBAD3764F677FECC0F274582ED2E371ACB500F35F378DDEDB0FA32B1B55699E41EBE958E6614811999433D934CCD54A03CC4BF359798F90EC809CFA6E58C1CE68B5AF397E8E35951F9CC4BCD0EC8655486543B4CF7605CE15969A2D88E8CD6BCA82671A06FC54397840BBA9DB2750B0F1FBC61ECF6E514450A7E06C6E6BBBB2CFA5E045335F04A5C407EC6467D471226ED2CB3AE9FBA9E956F8F3D05A911F9CD131BC3D95A10792097AC1C4339F8C12E40ABD274A25CF26EF286187E91261273E39856C471D861056EC3F6F5E58EB727134F9BFB870C8DD6978F247EAF67C1368BCB0BA105CDDC2BA067EBAC9C00DC15F1667664AA2A688D45E843F62467892EE9348FD974904EB
-20241129033708 2 6 100 4095 2 F32300D8DFCB79ECFB80E433E6CFA1923915D80120F52648A7AE7E8058B5DB869F2B3A9DD940E53B7D74E3214FA03234F8B026AFF16B646B39F003882F1DC17D3F6DBB89283A01B4C22168A354D6D2FDBDE3F2B0C91E9472AF1DB386DD34477F47CB24D4AFB71BB283A9760CF4EC582F1401A4F259D4AADE2BC7648A6920207DFB149BB7A4483D5E22D9DC627A8A4954C18AAAEF921CE0C597C11C95EC7C8888050124D01C43E6A33A02DACDB2EEE70920BAF2A296EB38CEADCB98CC7789BA309A5AD7916B9F7F86B0D808346E28447C4E3F31C5BC319D29A0D338EE8FC88BC9288C75004CC278BB218AA86929360079EAA71628FEFB796FFFBAD3764F677FECC0F274582ED2E371ACB500F35F378DDEDB0FA32B1B55699E41EBE958E6614811999433D934CCD54A03CC4BF359798F90EC809CFA6E58C1CE68B5AF397E8E35951F9CC4BCD0EC8655486543B4CF7605CE15969A2D88E8CD6BCA82671A06FC54397840BBA9DB2750B0F1FBC61ECF6E514450A7E06C6E6BBBB2CFA5E045335F04A5C407EC6467D471226ED2CB3AE9FBA9E956F8F3D05A911F9CD131BC3D95A10792097AC1C4339F8C12E40ABD274A25CF26EF286187E91261273E39856C471D861056EC3F6F5E58EB727134F9BFB870C8DD6978F247EAF67C1368BCB0BA105CDDC2BA067EBAC9C00DC15F1667664AA2A688D45E843F62467892EE9348FD97D1728B
-20241129033818 2 6 100 4095 5 F32300D8DFCB79ECFB80E433E6CFA1923915D80120F52648A7AE7E8058B5DB869F2B3A9DD940E53B7D74E3214FA03234F8B026AFF16B646B39F003882F1DC17D3F6DBB89283A01B4C22168A354D6D2FDBDE3F2B0C91E9472AF1DB386DD34477F47CB24D4AFB71BB283A9760CF4EC582F1401A4F259D4AADE2BC7648A6920207DFB149BB7A4483D5E22D9DC627A8A4954C18AAAEF921CE0C597C11C95EC7C8888050124D01C43E6A33A02DACDB2EEE70920BAF2A296EB38CEADCB98CC7789BA309A5AD7916B9F7F86B0D808346E28447C4E3F31C5BC319D29A0D338EE8FC88BC9288C75004CC278BB218AA86929360079EAA71628FEFB796FFFBAD3764F677FECC0F274582ED2E371ACB500F35F378DDEDB0FA32B1B55699E41EBE958E6614811999433D934CCD54A03CC4BF359798F90EC809CFA6E58C1CE68B5AF397E8E35951F9CC4BCD0EC8655486543B4CF7605CE15969A2D88E8CD6BCA82671A06FC54397840BBA9DB2750B0F1FBC61ECF6E514450A7E06C6E6BBBB2CFA5E045335F04A5C407EC6467D471226ED2CB3AE9FBA9E956F8F3D05A911F9CD131BC3D95A10792097AC1C4339F8C12E40ABD274A25CF26EF286187E91261273E39856C471D861056EC3F6F5E58EB727134F9BFB870C8DD6978F247EAF67C1368BCB0BA105CDDC2BA067EBAC9C00DC15F1667664AA2A688D45E843F62467892EE9348FD983ADCCF
-20241129033844 2 6 100 4095 5 F32300D8DFCB79ECFB80E433E6CFA1923915D80120F52648A7AE7E8058B5DB869F2B3A9DD940E53B7D74E3214FA03234F8B026AFF16B646B39F003882F1DC17D3F6DBB89283A01B4C22168A354D6D2FDBDE3F2B0C91E9472AF1DB386DD34477F47CB24D4AFB71BB283A9760CF4EC582F1401A4F259D4AADE2BC7648A6920207DFB149BB7A4483D5E22D9DC627A8A4954C18AAAEF921CE0C597C11C95EC7C8888050124D01C43E6A33A02DACDB2EEE70920BAF2A296EB38CEADCB98CC7789BA309A5AD7916B9F7F86B0D808346E28447C4E3F31C5BC319D29A0D338EE8FC88BC9288C75004CC278BB218AA86929360079EAA71628FEFB796FFFBAD3764F677FECC0F274582ED2E371ACB500F35F378DDEDB0FA32B1B55699E41EBE958E6614811999433D934CCD54A03CC4BF359798F90EC809CFA6E58C1CE68B5AF397E8E35951F9CC4BCD0EC8655486543B4CF7605CE15969A2D88E8CD6BCA82671A06FC54397840BBA9DB2750B0F1FBC61ECF6E514450A7E06C6E6BBBB2CFA5E045335F04A5C407EC6467D471226ED2CB3AE9FBA9E956F8F3D05A911F9CD131BC3D95A10792097AC1C4339F8C12E40ABD274A25CF26EF286187E91261273E39856C471D861056EC3F6F5E58EB727134F9BFB870C8DD6978F247EAF67C1368BCB0BA105CDDC2BA067EBAC9C00DC15F1667664AA2A688D45E843F62467892EE9348FD985DB957
-20241129033919 2 6 100 4095 5 F32300D8DFCB79ECFB80E433E6CFA1923915D80120F52648A7AE7E8058B5DB869F2B3A9DD940E53B7D74E3214FA03234F8B026AFF16B646B39F003882F1DC17D3F6DBB89283A01B4C22168A354D6D2FDBDE3F2B0C91E9472AF1DB386DD34477F47CB24D4AFB71BB283A9760CF4EC582F1401A4F259D4AADE2BC7648A6920207DFB149BB7A4483D5E22D9DC627A8A4954C18AAAEF921CE0C597C11C95EC7C8888050124D01C43E6A33A02DACDB2EEE70920BAF2A296EB38CEADCB98CC7789BA309A5AD7916B9F7F86B0D808346E28447C4E3F31C5BC319D29A0D338EE8FC88BC9288C75004CC278BB218AA86929360079EAA71628FEFB796FFFBAD3764F677FECC0F274582ED2E371ACB500F35F378DDEDB0FA32B1B55699E41EBE958E6614811999433D934CCD54A03CC4BF359798F90EC809CFA6E58C1CE68B5AF397E8E35951F9CC4BCD0EC8655486543B4CF7605CE15969A2D88E8CD6BCA82671A06FC54397840BBA9DB2750B0F1FBC61ECF6E514450A7E06C6E6BBBB2CFA5E045335F04A5C407EC6467D471226ED2CB3AE9FBA9E956F8F3D05A911F9CD131BC3D95A10792097AC1C4339F8C12E40ABD274A25CF26EF286187E91261273E39856C471D861056EC3F6F5E58EB727134F9BFB870C8DD6978F247EAF67C1368BCB0BA105CDDC2BA067EBAC9C00DC15F1667664AA2A688D45E843F62467892EE9348FD9890287F
-20241129034126 2 6 100 4095 5 F32300D8DFCB79ECFB80E433E6CFA1923915D80120F52648A7AE7E8058B5DB869F2B3A9DD940E53B7D74E3214FA03234F8B026AFF16B646B39F003882F1DC17D3F6DBB89283A01B4C22168A354D6D2FDBDE3F2B0C91E9472AF1DB386DD34477F47CB24D4AFB71BB283A9760CF4EC582F1401A4F259D4AADE2BC7648A6920207DFB149BB7A4483D5E22D9DC627A8A4954C18AAAEF921CE0C597C11C95EC7C8888050124D01C43E6A33A02DACDB2EEE70920BAF2A296EB38CEADCB98CC7789BA309A5AD7916B9F7F86B0D808346E28447C4E3F31C5BC319D29A0D338EE8FC88BC9288C75004CC278BB218AA86929360079EAA71628FEFB796FFFBAD3764F677FECC0F274582ED2E371ACB500F35F378DDEDB0FA32B1B55699E41EBE958E6614811999433D934CCD54A03CC4BF359798F90EC809CFA6E58C1CE68B5AF397E8E35951F9CC4BCD0EC8655486543B4CF7605CE15969A2D88E8CD6BCA82671A06FC54397840BBA9DB2750B0F1FBC61ECF6E514450A7E06C6E6BBBB2CFA5E045335F04A5C407EC6467D471226ED2CB3AE9FBA9E956F8F3D05A911F9CD131BC3D95A10792097AC1C4339F8C12E40ABD274A25CF26EF286187E91261273E39856C471D861056EC3F6F5E58EB727134F9BFB870C8DD6978F247EAF67C1368BCB0BA105CDDC2BA067EBAC9C00DC15F1667664AA2A688D45E843F62467892EE9348FD9958DADF
-20241129034406 2 6 100 4095 2 F32300D8DFCB79ECFB80E433E6CFA1923915D80120F52648A7AE7E8058B5DB869F2B3A9DD940E53B7D74E3214FA03234F8B026AFF16B646B39F003882F1DC17D3F6DBB89283A01B4C22168A354D6D2FDBDE3F2B0C91E9472AF1DB386DD34477F47CB24D4AFB71BB283A9760CF4EC582F1401A4F259D4AADE2BC7648A6920207DFB149BB7A4483D5E22D9DC627A8A4954C18AAAEF921CE0C597C11C95EC7C8888050124D01C43E6A33A02DACDB2EEE70920BAF2A296EB38CEADCB98CC7789BA309A5AD7916B9F7F86B0D808346E28447C4E3F31C5BC319D29A0D338EE8FC88BC9288C75004CC278BB218AA86929360079EAA71628FEFB796FFFBAD3764F677FECC0F274582ED2E371ACB500F35F378DDEDB0FA32B1B55699E41EBE958E6614811999433D934CCD54A03CC4BF359798F90EC809CFA6E58C1CE68B5AF397E8E35951F9CC4BCD0EC8655486543B4CF7605CE15969A2D88E8CD6BCA82671A06FC54397840BBA9DB2750B0F1FBC61ECF6E514450A7E06C6E6BBBB2CFA5E045335F04A5C407EC6467D471226ED2CB3AE9FBA9E956F8F3D05A911F9CD131BC3D95A10792097AC1C4339F8C12E40ABD274A25CF26EF286187E91261273E39856C471D861056EC3F6F5E58EB727134F9BFB870C8DD6978F247EAF67C1368BCB0BA105CDDC2BA067EBAC9C00DC15F1667664AA2A688D45E843F62467892EE9348FD9A557F5B
-20241129034820 2 6 100 4095 5 F32300D8DFCB79ECFB80E433E6CFA1923915D80120F52648A7AE7E8058B5DB869F2B3A9DD940E53B7D74E3214FA03234F8B026AFF16B646B39F003882F1DC17D3F6DBB89283A01B4C22168A354D6D2FDBDE3F2B0C91E9472AF1DB386DD34477F47CB24D4AFB71BB283A9760CF4EC582F1401A4F259D4AADE2BC7648A6920207DFB149BB7A4483D5E22D9DC627A8A4954C18AAAEF921CE0C597C11C95EC7C8888050124D01C43E6A33A02DACDB2EEE70920BAF2A296EB38CEADCB98CC7789BA309A5AD7916B9F7F86B0D808346E28447C4E3F31C5BC319D29A0D338EE8FC88BC9288C75004CC278BB218AA86929360079EAA71628FEFB796FFFBAD3764F677FECC0F274582ED2E371ACB500F35F378DDEDB0FA32B1B55699E41EBE958E6614811999433D934CCD54A03CC4BF359798F90EC809CFA6E58C1CE68B5AF397E8E35951F9CC4BCD0EC8655486543B4CF7605CE15969A2D88E8CD6BCA82671A06FC54397840BBA9DB2750B0F1FBC61ECF6E514450A7E06C6E6BBBB2CFA5E045335F04A5C407EC6467D471226ED2CB3AE9FBA9E956F8F3D05A911F9CD131BC3D95A10792097AC1C4339F8C12E40ABD274A25CF26EF286187E91261273E39856C471D861056EC3F6F5E58EB727134F9BFB870C8DD6978F247EAF67C1368BCB0BA105CDDC2BA067EBAC9C00DC15F1667664AA2A688D45E843F62467892EE9348FD9BEF30FF
-20241129035154 2 6 100 4095 2 F32300D8DFCB79ECFB80E433E6CFA1923915D80120F52648A7AE7E8058B5DB869F2B3A9DD940E53B7D74E3214FA03234F8B026AFF16B646B39F003882F1DC17D3F6DBB89283A01B4C22168A354D6D2FDBDE3F2B0C91E9472AF1DB386DD34477F47CB24D4AFB71BB283A9760CF4EC582F1401A4F259D4AADE2BC7648A6920207DFB149BB7A4483D5E22D9DC627A8A4954C18AAAEF921CE0C597C11C95EC7C8888050124D01C43E6A33A02DACDB2EEE70920BAF2A296EB38CEADCB98CC7789BA309A5AD7916B9F7F86B0D808346E28447C4E3F31C5BC319D29A0D338EE8FC88BC9288C75004CC278BB218AA86929360079EAA71628FEFB796FFFBAD3764F677FECC0F274582ED2E371ACB500F35F378DDEDB0FA32B1B55699E41EBE958E6614811999433D934CCD54A03CC4BF359798F90EC809CFA6E58C1CE68B5AF397E8E35951F9CC4BCD0EC8655486543B4CF7605CE15969A2D88E8CD6BCA82671A06FC54397840BBA9DB2750B0F1FBC61ECF6E514450A7E06C6E6BBBB2CFA5E045335F04A5C407EC6467D471226ED2CB3AE9FBA9E956F8F3D05A911F9CD131BC3D95A10792097AC1C4339F8C12E40ABD274A25CF26EF286187E91261273E39856C471D861056EC3F6F5E58EB727134F9BFB870C8DD6978F247EAF67C1368BCB0BA105CDDC2BA067EBAC9C00DC15F1667664AA2A688D45E843F62467892EE9348FD9D4E229B
-20241129035209 2 6 100 4095 5 F32300D8DFCB79ECFB80E433E6CFA1923915D80120F52648A7AE7E8058B5DB869F2B3A9DD940E53B7D74E3214FA03234F8B026AFF16B646B39F003882F1DC17D3F6DBB89283A01B4C22168A354D6D2FDBDE3F2B0C91E9472AF1DB386DD34477F47CB24D4AFB71BB283A9760CF4EC582F1401A4F259D4AADE2BC7648A6920207DFB149BB7A4483D5E22D9DC627A8A4954C18AAAEF921CE0C597C11C95EC7C8888050124D01C43E6A33A02DACDB2EEE70920BAF2A296EB38CEADCB98CC7789BA309A5AD7916B9F7F86B0D808346E28447C4E3F31C5BC319D29A0D338EE8FC88BC9288C75004CC278BB218AA86929360079EAA71628FEFB796FFFBAD3764F677FECC0F274582ED2E371ACB500F35F378DDEDB0FA32B1B55699E41EBE958E6614811999433D934CCD54A03CC4BF359798F90EC809CFA6E58C1CE68B5AF397E8E35951F9CC4BCD0EC8655486543B4CF7605CE15969A2D88E8CD6BCA82671A06FC54397840BBA9DB2750B0F1FBC61ECF6E514450A7E06C6E6BBBB2CFA5E045335F04A5C407EC6467D471226ED2CB3AE9FBA9E956F8F3D05A911F9CD131BC3D95A10792097AC1C4339F8C12E40ABD274A25CF26EF286187E91261273E39856C471D861056EC3F6F5E58EB727134F9BFB870C8DD6978F247EAF67C1368BCB0BA105CDDC2BA067EBAC9C00DC15F1667664AA2A688D45E843F62467892EE9348FD9D5EE0CF
-20241129035316 2 6 100 4095 5 F32300D8DFCB79ECFB80E433E6CFA1923915D80120F52648A7AE7E8058B5DB869F2B3A9DD940E53B7D74E3214FA03234F8B026AFF16B646B39F003882F1DC17D3F6DBB89283A01B4C22168A354D6D2FDBDE3F2B0C91E9472AF1DB386DD34477F47CB24D4AFB71BB283A9760CF4EC582F1401A4F259D4AADE2BC7648A6920207DFB149BB7A4483D5E22D9DC627A8A4954C18AAAEF921CE0C597C11C95EC7C8888050124D01C43E6A33A02DACDB2EEE70920BAF2A296EB38CEADCB98CC7789BA309A5AD7916B9F7F86B0D808346E28447C4E3F31C5BC319D29A0D338EE8FC88BC9288C75004CC278BB218AA86929360079EAA71628FEFB796FFFBAD3764F677FECC0F274582ED2E371ACB500F35F378DDEDB0FA32B1B55699E41EBE958E6614811999433D934CCD54A03CC4BF359798F90EC809CFA6E58C1CE68B5AF397E8E35951F9CC4BCD0EC8655486543B4CF7605CE15969A2D88E8CD6BCA82671A06FC54397840BBA9DB2750B0F1FBC61ECF6E514450A7E06C6E6BBBB2CFA5E045335F04A5C407EC6467D471226ED2CB3AE9FBA9E956F8F3D05A911F9CD131BC3D95A10792097AC1C4339F8C12E40ABD274A25CF26EF286187E91261273E39856C471D861056EC3F6F5E58EB727134F9BFB870C8DD6978F247EAF67C1368BCB0BA105CDDC2BA067EBAC9C00DC15F1667664AA2A688D45E843F62467892EE9348FD9DC2D03F
-20241129035349 2 6 100 4095 2 F32300D8DFCB79ECFB80E433E6CFA1923915D80120F52648A7AE7E8058B5DB869F2B3A9DD940E53B7D74E3214FA03234F8B026AFF16B646B39F003882F1DC17D3F6DBB89283A01B4C22168A354D6D2FDBDE3F2B0C91E9472AF1DB386DD34477F47CB24D4AFB71BB283A9760CF4EC582F1401A4F259D4AADE2BC7648A6920207DFB149BB7A4483D5E22D9DC627A8A4954C18AAAEF921CE0C597C11C95EC7C8888050124D01C43E6A33A02DACDB2EEE70920BAF2A296EB38CEADCB98CC7789BA309A5AD7916B9F7F86B0D808346E28447C4E3F31C5BC319D29A0D338EE8FC88BC9288C75004CC278BB218AA86929360079EAA71628FEFB796FFFBAD3764F677FECC0F274582ED2E371ACB500F35F378DDEDB0FA32B1B55699E41EBE958E6614811999433D934CCD54A03CC4BF359798F90EC809CFA6E58C1CE68B5AF397E8E35951F9CC4BCD0EC8655486543B4CF7605CE15969A2D88E8CD6BCA82671A06FC54397840BBA9DB2750B0F1FBC61ECF6E514450A7E06C6E6BBBB2CFA5E045335F04A5C407EC6467D471226ED2CB3AE9FBA9E956F8F3D05A911F9CD131BC3D95A10792097AC1C4339F8C12E40ABD274A25CF26EF286187E91261273E39856C471D861056EC3F6F5E58EB727134F9BFB870C8DD6978F247EAF67C1368BCB0BA105CDDC2BA067EBAC9C00DC15F1667664AA2A688D45E843F62467892EE9348FD9DF64ABB
-20241129035856 2 6 100 4095 5 F32300D8DFCB79ECFB80E433E6CFA1923915D80120F52648A7AE7E8058B5DB869F2B3A9DD940E53B7D74E3214FA03234F8B026AFF16B646B39F003882F1DC17D3F6DBB89283A01B4C22168A354D6D2FDBDE3F2B0C91E9472AF1DB386DD34477F47CB24D4AFB71BB283A9760CF4EC582F1401A4F259D4AADE2BC7648A6920207DFB149BB7A4483D5E22D9DC627A8A4954C18AAAEF921CE0C597C11C95EC7C8888050124D01C43E6A33A02DACDB2EEE70920BAF2A296EB38CEADCB98CC7789BA309A5AD7916B9F7F86B0D808346E28447C4E3F31C5BC319D29A0D338EE8FC88BC9288C75004CC278BB218AA86929360079EAA71628FEFB796FFFBAD3764F677FECC0F274582ED2E371ACB500F35F378DDEDB0FA32B1B55699E41EBE958E6614811999433D934CCD54A03CC4BF359798F90EC809CFA6E58C1CE68B5AF397E8E35951F9CC4BCD0EC8655486543B4CF7605CE15969A2D88E8CD6BCA82671A06FC54397840BBA9DB2750B0F1FBC61ECF6E514450A7E06C6E6BBBB2CFA5E045335F04A5C407EC6467D471226ED2CB3AE9FBA9E956F8F3D05A911F9CD131BC3D95A10792097AC1C4339F8C12E40ABD274A25CF26EF286187E91261273E39856C471D861056EC3F6F5E58EB727134F9BFB870C8DD6978F247EAF67C1368BCB0BA105CDDC2BA067EBAC9C00DC15F1667664AA2A688D45E843F62467892EE9348FD9FE86E1F
-20241129040054 2 6 100 4095 2 F32300D8DFCB79ECFB80E433E6CFA1923915D80120F52648A7AE7E8058B5DB869F2B3A9DD940E53B7D74E3214FA03234F8B026AFF16B646B39F003882F1DC17D3F6DBB89283A01B4C22168A354D6D2FDBDE3F2B0C91E9472AF1DB386DD34477F47CB24D4AFB71BB283A9760CF4EC582F1401A4F259D4AADE2BC7648A6920207DFB149BB7A4483D5E22D9DC627A8A4954C18AAAEF921CE0C597C11C95EC7C8888050124D01C43E6A33A02DACDB2EEE70920BAF2A296EB38CEADCB98CC7789BA309A5AD7916B9F7F86B0D808346E28447C4E3F31C5BC319D29A0D338EE8FC88BC9288C75004CC278BB218AA86929360079EAA71628FEFB796FFFBAD3764F677FECC0F274582ED2E371ACB500F35F378DDEDB0FA32B1B55699E41EBE958E6614811999433D934CCD54A03CC4BF359798F90EC809CFA6E58C1CE68B5AF397E8E35951F9CC4BCD0EC8655486543B4CF7605CE15969A2D88E8CD6BCA82671A06FC54397840BBA9DB2750B0F1FBC61ECF6E514450A7E06C6E6BBBB2CFA5E045335F04A5C407EC6467D471226ED2CB3AE9FBA9E956F8F3D05A911F9CD131BC3D95A10792097AC1C4339F8C12E40ABD274A25CF26EF286187E91261273E39856C471D861056EC3F6F5E58EB727134F9BFB870C8DD6978F247EAF67C1368BCB0BA105CDDC2BA067EBAC9C00DC15F1667664AA2A688D45E843F62467892EE9348FDA0A085D3
-20241129040234 2 6 100 4095 2 F32300D8DFCB79ECFB80E433E6CFA1923915D80120F52648A7AE7E8058B5DB869F2B3A9DD940E53B7D74E3214FA03234F8B026AFF16B646B39F003882F1DC17D3F6DBB89283A01B4C22168A354D6D2FDBDE3F2B0C91E9472AF1DB386DD34477F47CB24D4AFB71BB283A9760CF4EC582F1401A4F259D4AADE2BC7648A6920207DFB149BB7A4483D5E22D9DC627A8A4954C18AAAEF921CE0C597C11C95EC7C8888050124D01C43E6A33A02DACDB2EEE70920BAF2A296EB38CEADCB98CC7789BA309A5AD7916B9F7F86B0D808346E28447C4E3F31C5BC319D29A0D338EE8FC88BC9288C75004CC278BB218AA86929360079EAA71628FEFB796FFFBAD3764F677FECC0F274582ED2E371ACB500F35F378DDEDB0FA32B1B55699E41EBE958E6614811999433D934CCD54A03CC4BF359798F90EC809CFA6E58C1CE68B5AF397E8E35951F9CC4BCD0EC8655486543B4CF7605CE15969A2D88E8CD6BCA82671A06FC54397840BBA9DB2750B0F1FBC61ECF6E514450A7E06C6E6BBBB2CFA5E045335F04A5C407EC6467D471226ED2CB3AE9FBA9E956F8F3D05A911F9CD131BC3D95A10792097AC1C4339F8C12E40ABD274A25CF26EF286187E91261273E39856C471D861056EC3F6F5E58EB727134F9BFB870C8DD6978F247EAF67C1368BCB0BA105CDDC2BA067EBAC9C00DC15F1667664AA2A688D45E843F62467892EE9348FDA13D2323
-20241129040334 2 6 100 4095 2 F32300D8DFCB79ECFB80E433E6CFA1923915D80120F52648A7AE7E8058B5DB869F2B3A9DD940E53B7D74E3214FA03234F8B026AFF16B646B39F003882F1DC17D3F6DBB89283A01B4C22168A354D6D2FDBDE3F2B0C91E9472AF1DB386DD34477F47CB24D4AFB71BB283A9760CF4EC582F1401A4F259D4AADE2BC7648A6920207DFB149BB7A4483D5E22D9DC627A8A4954C18AAAEF921CE0C597C11C95EC7C8888050124D01C43E6A33A02DACDB2EEE70920BAF2A296EB38CEADCB98CC7789BA309A5AD7916B9F7F86B0D808346E28447C4E3F31C5BC319D29A0D338EE8FC88BC9288C75004CC278BB218AA86929360079EAA71628FEFB796FFFBAD3764F677FECC0F274582ED2E371ACB500F35F378DDEDB0FA32B1B55699E41EBE958E6614811999433D934CCD54A03CC4BF359798F90EC809CFA6E58C1CE68B5AF397E8E35951F9CC4BCD0EC8655486543B4CF7605CE15969A2D88E8CD6BCA82671A06FC54397840BBA9DB2750B0F1FBC61ECF6E514450A7E06C6E6BBBB2CFA5E045335F04A5C407EC6467D471226ED2CB3AE9FBA9E956F8F3D05A911F9CD131BC3D95A10792097AC1C4339F8C12E40ABD274A25CF26EF286187E91261273E39856C471D861056EC3F6F5E58EB727134F9BFB870C8DD6978F247EAF67C1368BCB0BA105CDDC2BA067EBAC9C00DC15F1667664AA2A688D45E843F62467892EE9348FDA19957FB
-20241129040452 2 6 100 4095 5 F32300D8DFCB79ECFB80E433E6CFA1923915D80120F52648A7AE7E8058B5DB869F2B3A9DD940E53B7D74E3214FA03234F8B026AFF16B646B39F003882F1DC17D3F6DBB89283A01B4C22168A354D6D2FDBDE3F2B0C91E9472AF1DB386DD34477F47CB24D4AFB71BB283A9760CF4EC582F1401A4F259D4AADE2BC7648A6920207DFB149BB7A4483D5E22D9DC627A8A4954C18AAAEF921CE0C597C11C95EC7C8888050124D01C43E6A33A02DACDB2EEE70920BAF2A296EB38CEADCB98CC7789BA309A5AD7916B9F7F86B0D808346E28447C4E3F31C5BC319D29A0D338EE8FC88BC9288C75004CC278BB218AA86929360079EAA71628FEFB796FFFBAD3764F677FECC0F274582ED2E371ACB500F35F378DDEDB0FA32B1B55699E41EBE958E6614811999433D934CCD54A03CC4BF359798F90EC809CFA6E58C1CE68B5AF397E8E35951F9CC4BCD0EC8655486543B4CF7605CE15969A2D88E8CD6BCA82671A06FC54397840BBA9DB2750B0F1FBC61ECF6E514450A7E06C6E6BBBB2CFA5E045335F04A5C407EC6467D471226ED2CB3AE9FBA9E956F8F3D05A911F9CD131BC3D95A10792097AC1C4339F8C12E40ABD274A25CF26EF286187E91261273E39856C471D861056EC3F6F5E58EB727134F9BFB870C8DD6978F247EAF67C1368BCB0BA105CDDC2BA067EBAC9C00DC15F1667664AA2A688D45E843F62467892EE9348FDA2168307
-20241129040614 2 6 100 4095 2 F32300D8DFCB79ECFB80E433E6CFA1923915D80120F52648A7AE7E8058B5DB869F2B3A9DD940E53B7D74E3214FA03234F8B026AFF16B646B39F003882F1DC17D3F6DBB89283A01B4C22168A354D6D2FDBDE3F2B0C91E9472AF1DB386DD34477F47CB24D4AFB71BB283A9760CF4EC582F1401A4F259D4AADE2BC7648A6920207DFB149BB7A4483D5E22D9DC627A8A4954C18AAAEF921CE0C597C11C95EC7C8888050124D01C43E6A33A02DACDB2EEE70920BAF2A296EB38CEADCB98CC7789BA309A5AD7916B9F7F86B0D808346E28447C4E3F31C5BC319D29A0D338EE8FC88BC9288C75004CC278BB218AA86929360079EAA71628FEFB796FFFBAD3764F677FECC0F274582ED2E371ACB500F35F378DDEDB0FA32B1B55699E41EBE958E6614811999433D934CCD54A03CC4BF359798F90EC809CFA6E58C1CE68B5AF397E8E35951F9CC4BCD0EC8655486543B4CF7605CE15969A2D88E8CD6BCA82671A06FC54397840BBA9DB2750B0F1FBC61ECF6E514450A7E06C6E6BBBB2CFA5E045335F04A5C407EC6467D471226ED2CB3AE9FBA9E956F8F3D05A911F9CD131BC3D95A10792097AC1C4339F8C12E40ABD274A25CF26EF286187E91261273E39856C471D861056EC3F6F5E58EB727134F9BFB870C8DD6978F247EAF67C1368BCB0BA105CDDC2BA067EBAC9C00DC15F1667664AA2A688D45E843F62467892EE9348FDA29615EB
-20241129040924 2 6 100 4095 2 F32300D8DFCB79ECFB80E433E6CFA1923915D80120F52648A7AE7E8058B5DB869F2B3A9DD940E53B7D74E3214FA03234F8B026AFF16B646B39F003882F1DC17D3F6DBB89283A01B4C22168A354D6D2FDBDE3F2B0C91E9472AF1DB386DD34477F47CB24D4AFB71BB283A9760CF4EC582F1401A4F259D4AADE2BC7648A6920207DFB149BB7A4483D5E22D9DC627A8A4954C18AAAEF921CE0C597C11C95EC7C8888050124D01C43E6A33A02DACDB2EEE70920BAF2A296EB38CEADCB98CC7789BA309A5AD7916B9F7F86B0D808346E28447C4E3F31C5BC319D29A0D338EE8FC88BC9288C75004CC278BB218AA86929360079EAA71628FEFB796FFFBAD3764F677FECC0F274582ED2E371ACB500F35F378DDEDB0FA32B1B55699E41EBE958E6614811999433D934CCD54A03CC4BF359798F90EC809CFA6E58C1CE68B5AF397E8E35951F9CC4BCD0EC8655486543B4CF7605CE15969A2D88E8CD6BCA82671A06FC54397840BBA9DB2750B0F1FBC61ECF6E514450A7E06C6E6BBBB2CFA5E045335F04A5C407EC6467D471226ED2CB3AE9FBA9E956F8F3D05A911F9CD131BC3D95A10792097AC1C4339F8C12E40ABD274A25CF26EF286187E91261273E39856C471D861056EC3F6F5E58EB727134F9BFB870C8DD6978F247EAF67C1368BCB0BA105CDDC2BA067EBAC9C00DC15F1667664AA2A688D45E843F62467892EE9348FDA3C1BBEB
-20241129041726 2 6 100 4095 2 F32300D8DFCB79ECFB80E433E6CFA1923915D80120F52648A7AE7E8058B5DB869F2B3A9DD940E53B7D74E3214FA03234F8B026AFF16B646B39F003882F1DC17D3F6DBB89283A01B4C22168A354D6D2FDBDE3F2B0C91E9472AF1DB386DD34477F47CB24D4AFB71BB283A9760CF4EC582F1401A4F259D4AADE2BC7648A6920207DFB149BB7A4483D5E22D9DC627A8A4954C18AAAEF921CE0C597C11C95EC7C8888050124D01C43E6A33A02DACDB2EEE70920BAF2A296EB38CEADCB98CC7789BA309A5AD7916B9F7F86B0D808346E28447C4E3F31C5BC319D29A0D338EE8FC88BC9288C75004CC278BB218AA86929360079EAA71628FEFB796FFFBAD3764F677FECC0F274582ED2E371ACB500F35F378DDEDB0FA32B1B55699E41EBE958E6614811999433D934CCD54A03CC4BF359798F90EC809CFA6E58C1CE68B5AF397E8E35951F9CC4BCD0EC8655486543B4CF7605CE15969A2D88E8CD6BCA82671A06FC54397840BBA9DB2750B0F1FBC61ECF6E514450A7E06C6E6BBBB2CFA5E045335F04A5C407EC6467D471226ED2CB3AE9FBA9E956F8F3D05A911F9CD131BC3D95A10792097AC1C4339F8C12E40ABD274A25CF26EF286187E91261273E39856C471D861056EC3F6F5E58EB727134F9BFB870C8DD6978F247EAF67C1368BCB0BA105CDDC2BA067EBAC9C00DC15F1667664AA2A688D45E843F62467892EE9348FDA6CBD37B
-20241129044525 2 6 100 6143 5 DCBE8A152DD5DE612BFCCD18CAB2BDE17391AF9DA865DCC59A1B454144ADE2EB8BE3CDBA7948CD1236CFC25D66DDC0E91095FB7E17715247413BBFD5435223F46488AD93808AF9FAF7D473C7CCE55DAA83B417FC6C09BFF7E332BD4B3BC59CBA4FE035A6C416D32BDCF8C3B9AFC5E1120CFD420023FD8EB207DB965509E2D362B0EB3D8CBD191D2750EBEB05F32C4BE08154D991F08DE4914BC40FAA7172440F2FEFB0FBF604DDA9C18BA9FD55F34218FD5D7CA2AC491CEDC3C5743D143BAF6C06CCAB7E5B22AB4E46CD51962CC7931F4D35581D5DD3047B946044BF7E71955EB63DD546644D7D2A19777DA39A48B4CF5A011A5C41F1BFF7C463F057F2F7AF6F910E7E06398B0AF7EF38CD5BBAE4C5FF42572CFFFCA6A8E9D34F64A7BECDC93216B55C20FAECAF04A8956C4D26DEE34493510BC49144A32A1B0AAE64B50DCA0C27361692242FE3145A6B36B830DEBF9E8A07A886E8DA6F38F3E99906F6AC9317ADF73222C4C75ABD153F1112E01E7CBB49665F213A1C1470CDC442D7CDC72EE2DD80D37251333C34FFDC5C38ADA3F5E52F5A5B2A1224B0CA60211B430E9554F0C4CA672476562C4A182B6707EBE80DFA6247A1F870F74EC81D03558F2718409EBF8E7F2FD2C6AB1F246F7E3FE0D919DB4016A7D76F6378D05EA74766CBB93340F2CBDDF18073F39242F3E9EC88020D1E8F801183C00F0239B2F2B4E8F6B46DBC17F469A857C291C985D8AC2099A6FEDC462B5EAEF737831EA2B6C9D787DC5AC8DA2C2E8F7F676FDA4CDD79E400EED959882C78C279C4D0A5918A0F5FC3B695E0034F7C2665D52D94106744D6B0CD6A66AB3275324EFDC06ECCF431D446446A00818ECDBE77B845699FB4F699825702D00F71373D80452039ECA1237AD2A0DF9112BA1EC90FB9FB87CF4E46BD0319B64F2EFD4B9640469707DB549468781D0BA6F3C49AF035D441173786BB1F2F5DCCE07BBF5536A0EB5B976814ABFDB44B90E55455972701A8F0D8EFB860A082ABA960E704754F61C2E3956922833F3D7E1656476DEE3C4F09244AC15697EA4A73041F03EEDE1F30BF899098A70F33DDF12A47
-20241129045351 2 6 100 6143 2 DCBE8A152DD5DE612BFCCD18CAB2BDE17391AF9DA865DCC59A1B454144ADE2EB8BE3CDBA7948CD1236CFC25D66DDC0E91095FB7E17715247413BBFD5435223F46488AD93808AF9FAF7D473C7CCE55DAA83B417FC6C09BFF7E332BD4B3BC59CBA4FE035A6C416D32BDCF8C3B9AFC5E1120CFD420023FD8EB207DB965509E2D362B0EB3D8CBD191D2750EBEB05F32C4BE08154D991F08DE4914BC40FAA7172440F2FEFB0FBF604DDA9C18BA9FD55F34218FD5D7CA2AC491CEDC3C5743D143BAF6C06CCAB7E5B22AB4E46CD51962CC7931F4D35581D5DD3047B946044BF7E71955EB63DD546644D7D2A19777DA39A48B4CF5A011A5C41F1BFF7C463F057F2F7AF6F910E7E06398B0AF7EF38CD5BBAE4C5FF42572CFFFCA6A8E9D34F64A7BECDC93216B55C20FAECAF04A8956C4D26DEE34493510BC49144A32A1B0AAE64B50DCA0C27361692242FE3145A6B36B830DEBF9E8A07A886E8DA6F38F3E99906F6AC9317ADF73222C4C75ABD153F1112E01E7CBB49665F213A1C1470CDC442D7CDC72EE2DD80D37251333C34FFDC5C38ADA3F5E52F5A5B2A1224B0CA60211B430E9554F0C4CA672476562C4A182B6707EBE80DFA6247A1F870F74EC81D03558F2718409EBF8E7F2FD2C6AB1F246F7E3FE0D919DB4016A7D76F6378D05EA74766CBB93340F2CBDDF18073F39242F3E9EC88020D1E8F801183C00F0239B2F2B4E8F6B46DBC17F469A857C291C985D8AC2099A6FEDC462B5EAEF737831EA2B6C9D787DC5AC8DA2C2E8F7F676FDA4CDD79E400EED959882C78C279C4D0A5918A0F5FC3B695E0034F7C2665D52D94106744D6B0CD6A66AB3275324EFDC06ECCF431D446446A00818ECDBE77B845699FB4F699825702D00F71373D80452039ECA1237AD2A0DF9112BA1EC90FB9FB87CF4E46BD0319B64F2EFD4B9640469707DB549468781D0BA6F3C49AF035D441173786BB1F2F5DCCE07BBF5536A0EB5B976814ABFDB44B90E55455972701A8F0D8EFB860A082ABA960E704754F61C2E3956922833F3D7E1656476DEE3C4F09244AC15697EA4A73041F03EEDE1F30BF899098A70F33DEF75143
-20241129045821 2 6 100 6143 2 DCBE8A152DD5DE612BFCCD18CAB2BDE17391AF9DA865DCC59A1B454144ADE2EB8BE3CDBA7948CD1236CFC25D66DDC0E91095FB7E17715247413BBFD5435223F46488AD93808AF9FAF7D473C7CCE55DAA83B417FC6C09BFF7E332BD4B3BC59CBA4FE035A6C416D32BDCF8C3B9AFC5E1120CFD420023FD8EB207DB965509E2D362B0EB3D8CBD191D2750EBEB05F32C4BE08154D991F08DE4914BC40FAA7172440F2FEFB0FBF604DDA9C18BA9FD55F34218FD5D7CA2AC491CEDC3C5743D143BAF6C06CCAB7E5B22AB4E46CD51962CC7931F4D35581D5DD3047B946044BF7E71955EB63DD546644D7D2A19777DA39A48B4CF5A011A5C41F1BFF7C463F057F2F7AF6F910E7E06398B0AF7EF38CD5BBAE4C5FF42572CFFFCA6A8E9D34F64A7BECDC93216B55C20FAECAF04A8956C4D26DEE34493510BC49144A32A1B0AAE64B50DCA0C27361692242FE3145A6B36B830DEBF9E8A07A886E8DA6F38F3E99906F6AC9317ADF73222C4C75ABD153F1112E01E7CBB49665F213A1C1470CDC442D7CDC72EE2DD80D37251333C34FFDC5C38ADA3F5E52F5A5B2A1224B0CA60211B430E9554F0C4CA672476562C4A182B6707EBE80DFA6247A1F870F74EC81D03558F2718409EBF8E7F2FD2C6AB1F246F7E3FE0D919DB4016A7D76F6378D05EA74766CBB93340F2CBDDF18073F39242F3E9EC88020D1E8F801183C00F0239B2F2B4E8F6B46DBC17F469A857C291C985D8AC2099A6FEDC462B5EAEF737831EA2B6C9D787DC5AC8DA2C2E8F7F676FDA4CDD79E400EED959882C78C279C4D0A5918A0F5FC3B695E0034F7C2665D52D94106744D6B0CD6A66AB3275324EFDC06ECCF431D446446A00818ECDBE77B845699FB4F699825702D00F71373D80452039ECA1237AD2A0DF9112BA1EC90FB9FB87CF4E46BD0319B64F2EFD4B9640469707DB549468781D0BA6F3C49AF035D441173786BB1F2F5DCCE07BBF5536A0EB5B976814ABFDB44B90E55455972701A8F0D8EFB860A082ABA960E704754F61C2E3956922833F3D7E1656476DEE3C4F09244AC15697EA4A73041F03EEDE1F30BF899098A70F33DF7D9E33
-20241129045943 2 6 100 6143 5 DCBE8A152DD5DE612BFCCD18CAB2BDE17391AF9DA865DCC59A1B454144ADE2EB8BE3CDBA7948CD1236CFC25D66DDC0E91095FB7E17715247413BBFD5435223F46488AD93808AF9FAF7D473C7CCE55DAA83B417FC6C09BFF7E332BD4B3BC59CBA4FE035A6C416D32BDCF8C3B9AFC5E1120CFD420023FD8EB207DB965509E2D362B0EB3D8CBD191D2750EBEB05F32C4BE08154D991F08DE4914BC40FAA7172440F2FEFB0FBF604DDA9C18BA9FD55F34218FD5D7CA2AC491CEDC3C5743D143BAF6C06CCAB7E5B22AB4E46CD51962CC7931F4D35581D5DD3047B946044BF7E71955EB63DD546644D7D2A19777DA39A48B4CF5A011A5C41F1BFF7C463F057F2F7AF6F910E7E06398B0AF7EF38CD5BBAE4C5FF42572CFFFCA6A8E9D34F64A7BECDC93216B55C20FAECAF04A8956C4D26DEE34493510BC49144A32A1B0AAE64B50DCA0C27361692242FE3145A6B36B830DEBF9E8A07A886E8DA6F38F3E99906F6AC9317ADF73222C4C75ABD153F1112E01E7CBB49665F213A1C1470CDC442D7CDC72EE2DD80D37251333C34FFDC5C38ADA3F5E52F5A5B2A1224B0CA60211B430E9554F0C4CA672476562C4A182B6707EBE80DFA6247A1F870F74EC81D03558F2718409EBF8E7F2FD2C6AB1F246F7E3FE0D919DB4016A7D76F6378D05EA74766CBB93340F2CBDDF18073F39242F3E9EC88020D1E8F801183C00F0239B2F2B4E8F6B46DBC17F469A857C291C985D8AC2099A6FEDC462B5EAEF737831EA2B6C9D787DC5AC8DA2C2E8F7F676FDA4CDD79E400EED959882C78C279C4D0A5918A0F5FC3B695E0034F7C2665D52D94106744D6B0CD6A66AB3275324EFDC06ECCF431D446446A00818ECDBE77B845699FB4F699825702D00F71373D80452039ECA1237AD2A0DF9112BA1EC90FB9FB87CF4E46BD0319B64F2EFD4B9640469707DB549468781D0BA6F3C49AF035D441173786BB1F2F5DCCE07BBF5536A0EB5B976814ABFDB44B90E55455972701A8F0D8EFB860A082ABA960E704754F61C2E3956922833F3D7E1656476DEE3C4F09244AC15697EA4A73041F03EEDE1F30BF899098A70F33DFA1A9DF
-20241129050501 2 6 100 6143 2 DCBE8A152DD5DE612BFCCD18CAB2BDE17391AF9DA865DCC59A1B454144ADE2EB8BE3CDBA7948CD1236CFC25D66DDC0E91095FB7E17715247413BBFD5435223F46488AD93808AF9FAF7D473C7CCE55DAA83B417FC6C09BFF7E332BD4B3BC59CBA4FE035A6C416D32BDCF8C3B9AFC5E1120CFD420023FD8EB207DB965509E2D362B0EB3D8CBD191D2750EBEB05F32C4BE08154D991F08DE4914BC40FAA7172440F2FEFB0FBF604DDA9C18BA9FD55F34218FD5D7CA2AC491CEDC3C5743D143BAF6C06CCAB7E5B22AB4E46CD51962CC7931F4D35581D5DD3047B946044BF7E71955EB63DD546644D7D2A19777DA39A48B4CF5A011A5C41F1BFF7C463F057F2F7AF6F910E7E06398B0AF7EF38CD5BBAE4C5FF42572CFFFCA6A8E9D34F64A7BECDC93216B55C20FAECAF04A8956C4D26DEE34493510BC49144A32A1B0AAE64B50DCA0C27361692242FE3145A6B36B830DEBF9E8A07A886E8DA6F38F3E99906F6AC9317ADF73222C4C75ABD153F1112E01E7CBB49665F213A1C1470CDC442D7CDC72EE2DD80D37251333C34FFDC5C38ADA3F5E52F5A5B2A1224B0CA60211B430E9554F0C4CA672476562C4A182B6707EBE80DFA6247A1F870F74EC81D03558F2718409EBF8E7F2FD2C6AB1F246F7E3FE0D919DB4016A7D76F6378D05EA74766CBB93340F2CBDDF18073F39242F3E9EC88020D1E8F801183C00F0239B2F2B4E8F6B46DBC17F469A857C291C985D8AC2099A6FEDC462B5EAEF737831EA2B6C9D787DC5AC8DA2C2E8F7F676FDA4CDD79E400EED959882C78C279C4D0A5918A0F5FC3B695E0034F7C2665D52D94106744D6B0CD6A66AB3275324EFDC06ECCF431D446446A00818ECDBE77B845699FB4F699825702D00F71373D80452039ECA1237AD2A0DF9112BA1EC90FB9FB87CF4E46BD0319B64F2EFD4B9640469707DB549468781D0BA6F3C49AF035D441173786BB1F2F5DCCE07BBF5536A0EB5B976814ABFDB44B90E55455972701A8F0D8EFB860A082ABA960E704754F61C2E3956922833F3D7E1656476DEE3C4F09244AC15697EA4A73041F03EEDE1F30BF899098A70F33E044C313
-20241129051930 2 6 100 6143 5 DCBE8A152DD5DE612BFCCD18CAB2BDE17391AF9DA865DCC59A1B454144ADE2EB8BE3CDBA7948CD1236CFC25D66DDC0E91095FB7E17715247413BBFD5435223F46488AD93808AF9FAF7D473C7CCE55DAA83B417FC6C09BFF7E332BD4B3BC59CBA4FE035A6C416D32BDCF8C3B9AFC5E1120CFD420023FD8EB207DB965509E2D362B0EB3D8CBD191D2750EBEB05F32C4BE08154D991F08DE4914BC40FAA7172440F2FEFB0FBF604DDA9C18BA9FD55F34218FD5D7CA2AC491CEDC3C5743D143BAF6C06CCAB7E5B22AB4E46CD51962CC7931F4D35581D5DD3047B946044BF7E71955EB63DD546644D7D2A19777DA39A48B4CF5A011A5C41F1BFF7C463F057F2F7AF6F910E7E06398B0AF7EF38CD5BBAE4C5FF42572CFFFCA6A8E9D34F64A7BECDC93216B55C20FAECAF04A8956C4D26DEE34493510BC49144A32A1B0AAE64B50DCA0C27361692242FE3145A6B36B830DEBF9E8A07A886E8DA6F38F3E99906F6AC9317ADF73222C4C75ABD153F1112E01E7CBB49665F213A1C1470CDC442D7CDC72EE2DD80D37251333C34FFDC5C38ADA3F5E52F5A5B2A1224B0CA60211B430E9554F0C4CA672476562C4A182B6707EBE80DFA6247A1F870F74EC81D03558F2718409EBF8E7F2FD2C6AB1F246F7E3FE0D919DB4016A7D76F6378D05EA74766CBB93340F2CBDDF18073F39242F3E9EC88020D1E8F801183C00F0239B2F2B4E8F6B46DBC17F469A857C291C985D8AC2099A6FEDC462B5EAEF737831EA2B6C9D787DC5AC8DA2C2E8F7F676FDA4CDD79E400EED959882C78C279C4D0A5918A0F5FC3B695E0034F7C2665D52D94106744D6B0CD6A66AB3275324EFDC06ECCF431D446446A00818ECDBE77B845699FB4F699825702D00F71373D80452039ECA1237AD2A0DF9112BA1EC90FB9FB87CF4E46BD0319B64F2EFD4B9640469707DB549468781D0BA6F3C49AF035D441173786BB1F2F5DCCE07BBF5536A0EB5B976814ABFDB44B90E55455972701A8F0D8EFB860A082ABA960E704754F61C2E3956922833F3D7E1656476DEE3C4F09244AC15697EA4A73041F03EEDE1F30BF899098A70F33E20AE0AF
-20241129052029 2 6 100 6143 2 DCBE8A152DD5DE612BFCCD18CAB2BDE17391AF9DA865DCC59A1B454144ADE2EB8BE3CDBA7948CD1236CFC25D66DDC0E91095FB7E17715247413BBFD5435223F46488AD93808AF9FAF7D473C7CCE55DAA83B417FC6C09BFF7E332BD4B3BC59CBA4FE035A6C416D32BDCF8C3B9AFC5E1120CFD420023FD8EB207DB965509E2D362B0EB3D8CBD191D2750EBEB05F32C4BE08154D991F08DE4914BC40FAA7172440F2FEFB0FBF604DDA9C18BA9FD55F34218FD5D7CA2AC491CEDC3C5743D143BAF6C06CCAB7E5B22AB4E46CD51962CC7931F4D35581D5DD3047B946044BF7E71955EB63DD546644D7D2A19777DA39A48B4CF5A011A5C41F1BFF7C463F057F2F7AF6F910E7E06398B0AF7EF38CD5BBAE4C5FF42572CFFFCA6A8E9D34F64A7BECDC93216B55C20FAECAF04A8956C4D26DEE34493510BC49144A32A1B0AAE64B50DCA0C27361692242FE3145A6B36B830DEBF9E8A07A886E8DA6F38F3E99906F6AC9317ADF73222C4C75ABD153F1112E01E7CBB49665F213A1C1470CDC442D7CDC72EE2DD80D37251333C34FFDC5C38ADA3F5E52F5A5B2A1224B0CA60211B430E9554F0C4CA672476562C4A182B6707EBE80DFA6247A1F870F74EC81D03558F2718409EBF8E7F2FD2C6AB1F246F7E3FE0D919DB4016A7D76F6378D05EA74766CBB93340F2CBDDF18073F39242F3E9EC88020D1E8F801183C00F0239B2F2B4E8F6B46DBC17F469A857C291C985D8AC2099A6FEDC462B5EAEF737831EA2B6C9D787DC5AC8DA2C2E8F7F676FDA4CDD79E400EED959882C78C279C4D0A5918A0F5FC3B695E0034F7C2665D52D94106744D6B0CD6A66AB3275324EFDC06ECCF431D446446A00818ECDBE77B845699FB4F699825702D00F71373D80452039ECA1237AD2A0DF9112BA1EC90FB9FB87CF4E46BD0319B64F2EFD4B9640469707DB549468781D0BA6F3C49AF035D441173786BB1F2F5DCCE07BBF5536A0EB5B976814ABFDB44B90E55455972701A8F0D8EFB860A082ABA960E704754F61C2E3956922833F3D7E1656476DEE3C4F09244AC15697EA4A73041F03EEDE1F30BF899098A70F33E221299B
-20241129052420 2 6 100 6143 2 DCBE8A152DD5DE612BFCCD18CAB2BDE17391AF9DA865DCC59A1B454144ADE2EB8BE3CDBA7948CD1236CFC25D66DDC0E91095FB7E17715247413BBFD5435223F46488AD93808AF9FAF7D473C7CCE55DAA83B417FC6C09BFF7E332BD4B3BC59CBA4FE035A6C416D32BDCF8C3B9AFC5E1120CFD420023FD8EB207DB965509E2D362B0EB3D8CBD191D2750EBEB05F32C4BE08154D991F08DE4914BC40FAA7172440F2FEFB0FBF604DDA9C18BA9FD55F34218FD5D7CA2AC491CEDC3C5743D143BAF6C06CCAB7E5B22AB4E46CD51962CC7931F4D35581D5DD3047B946044BF7E71955EB63DD546644D7D2A19777DA39A48B4CF5A011A5C41F1BFF7C463F057F2F7AF6F910E7E06398B0AF7EF38CD5BBAE4C5FF42572CFFFCA6A8E9D34F64A7BECDC93216B55C20FAECAF04A8956C4D26DEE34493510BC49144A32A1B0AAE64B50DCA0C27361692242FE3145A6B36B830DEBF9E8A07A886E8DA6F38F3E99906F6AC9317ADF73222C4C75ABD153F1112E01E7CBB49665F213A1C1470CDC442D7CDC72EE2DD80D37251333C34FFDC5C38ADA3F5E52F5A5B2A1224B0CA60211B430E9554F0C4CA672476562C4A182B6707EBE80DFA6247A1F870F74EC81D03558F2718409EBF8E7F2FD2C6AB1F246F7E3FE0D919DB4016A7D76F6378D05EA74766CBB93340F2CBDDF18073F39242F3E9EC88020D1E8F801183C00F0239B2F2B4E8F6B46DBC17F469A857C291C985D8AC2099A6FEDC462B5EAEF737831EA2B6C9D787DC5AC8DA2C2E8F7F676FDA4CDD79E400EED959882C78C279C4D0A5918A0F5FC3B695E0034F7C2665D52D94106744D6B0CD6A66AB3275324EFDC06ECCF431D446446A00818ECDBE77B845699FB4F699825702D00F71373D80452039ECA1237AD2A0DF9112BA1EC90FB9FB87CF4E46BD0319B64F2EFD4B9640469707DB549468781D0BA6F3C49AF035D441173786BB1F2F5DCCE07BBF5536A0EB5B976814ABFDB44B90E55455972701A8F0D8EFB860A082ABA960E704754F61C2E3956922833F3D7E1656476DEE3C4F09244AC15697EA4A73041F03EEDE1F30BF899098A70F33E294985B
-20241129053040 2 6 100 6143 5 DCBE8A152DD5DE612BFCCD18CAB2BDE17391AF9DA865DCC59A1B454144ADE2EB8BE3CDBA7948CD1236CFC25D66DDC0E91095FB7E17715247413BBFD5435223F46488AD93808AF9FAF7D473C7CCE55DAA83B417FC6C09BFF7E332BD4B3BC59CBA4FE035A6C416D32BDCF8C3B9AFC5E1120CFD420023FD8EB207DB965509E2D362B0EB3D8CBD191D2750EBEB05F32C4BE08154D991F08DE4914BC40FAA7172440F2FEFB0FBF604DDA9C18BA9FD55F34218FD5D7CA2AC491CEDC3C5743D143BAF6C06CCAB7E5B22AB4E46CD51962CC7931F4D35581D5DD3047B946044BF7E71955EB63DD546644D7D2A19777DA39A48B4CF5A011A5C41F1BFF7C463F057F2F7AF6F910E7E06398B0AF7EF38CD5BBAE4C5FF42572CFFFCA6A8E9D34F64A7BECDC93216B55C20FAECAF04A8956C4D26DEE34493510BC49144A32A1B0AAE64B50DCA0C27361692242FE3145A6B36B830DEBF9E8A07A886E8DA6F38F3E99906F6AC9317ADF73222C4C75ABD153F1112E01E7CBB49665F213A1C1470CDC442D7CDC72EE2DD80D37251333C34FFDC5C38ADA3F5E52F5A5B2A1224B0CA60211B430E9554F0C4CA672476562C4A182B6707EBE80DFA6247A1F870F74EC81D03558F2718409EBF8E7F2FD2C6AB1F246F7E3FE0D919DB4016A7D76F6378D05EA74766CBB93340F2CBDDF18073F39242F3E9EC88020D1E8F801183C00F0239B2F2B4E8F6B46DBC17F469A857C291C985D8AC2099A6FEDC462B5EAEF737831EA2B6C9D787DC5AC8DA2C2E8F7F676FDA4CDD79E400EED959882C78C279C4D0A5918A0F5FC3B695E0034F7C2665D52D94106744D6B0CD6A66AB3275324EFDC06ECCF431D446446A00818ECDBE77B845699FB4F699825702D00F71373D80452039ECA1237AD2A0DF9112BA1EC90FB9FB87CF4E46BD0319B64F2EFD4B9640469707DB549468781D0BA6F3C49AF035D441173786BB1F2F5DCCE07BBF5536A0EB5B976814ABFDB44B90E55455972701A8F0D8EFB860A082ABA960E704754F61C2E3956922833F3D7E1656476DEE3C4F09244AC15697EA4A73041F03EEDE1F30BF899098A70F33E35A621F
-20241129053505 2 6 100 6143 2 DCBE8A152DD5DE612BFCCD18CAB2BDE17391AF9DA865DCC59A1B454144ADE2EB8BE3CDBA7948CD1236CFC25D66DDC0E91095FB7E17715247413BBFD5435223F46488AD93808AF9FAF7D473C7CCE55DAA83B417FC6C09BFF7E332BD4B3BC59CBA4FE035A6C416D32BDCF8C3B9AFC5E1120CFD420023FD8EB207DB965509E2D362B0EB3D8CBD191D2750EBEB05F32C4BE08154D991F08DE4914BC40FAA7172440F2FEFB0FBF604DDA9C18BA9FD55F34218FD5D7CA2AC491CEDC3C5743D143BAF6C06CCAB7E5B22AB4E46CD51962CC7931F4D35581D5DD3047B946044BF7E71955EB63DD546644D7D2A19777DA39A48B4CF5A011A5C41F1BFF7C463F057F2F7AF6F910E7E06398B0AF7EF38CD5BBAE4C5FF42572CFFFCA6A8E9D34F64A7BECDC93216B55C20FAECAF04A8956C4D26DEE34493510BC49144A32A1B0AAE64B50DCA0C27361692242FE3145A6B36B830DEBF9E8A07A886E8DA6F38F3E99906F6AC9317ADF73222C4C75ABD153F1112E01E7CBB49665F213A1C1470CDC442D7CDC72EE2DD80D37251333C34FFDC5C38ADA3F5E52F5A5B2A1224B0CA60211B430E9554F0C4CA672476562C4A182B6707EBE80DFA6247A1F870F74EC81D03558F2718409EBF8E7F2FD2C6AB1F246F7E3FE0D919DB4016A7D76F6378D05EA74766CBB93340F2CBDDF18073F39242F3E9EC88020D1E8F801183C00F0239B2F2B4E8F6B46DBC17F469A857C291C985D8AC2099A6FEDC462B5EAEF737831EA2B6C9D787DC5AC8DA2C2E8F7F676FDA4CDD79E400EED959882C78C279C4D0A5918A0F5FC3B695E0034F7C2665D52D94106744D6B0CD6A66AB3275324EFDC06ECCF431D446446A00818ECDBE77B845699FB4F699825702D00F71373D80452039ECA1237AD2A0DF9112BA1EC90FB9FB87CF4E46BD0319B64F2EFD4B9640469707DB549468781D0BA6F3C49AF035D441173786BB1F2F5DCCE07BBF5536A0EB5B976814ABFDB44B90E55455972701A8F0D8EFB860A082ABA960E704754F61C2E3956922833F3D7E1656476DEE3C4F09244AC15697EA4A73041F03EEDE1F30BF899098A70F33E3E2DAAB
-20241129054958 2 6 100 6143 5 DCBE8A152DD5DE612BFCCD18CAB2BDE17391AF9DA865DCC59A1B454144ADE2EB8BE3CDBA7948CD1236CFC25D66DDC0E91095FB7E17715247413BBFD5435223F46488AD93808AF9FAF7D473C7CCE55DAA83B417FC6C09BFF7E332BD4B3BC59CBA4FE035A6C416D32BDCF8C3B9AFC5E1120CFD420023FD8EB207DB965509E2D362B0EB3D8CBD191D2750EBEB05F32C4BE08154D991F08DE4914BC40FAA7172440F2FEFB0FBF604DDA9C18BA9FD55F34218FD5D7CA2AC491CEDC3C5743D143BAF6C06CCAB7E5B22AB4E46CD51962CC7931F4D35581D5DD3047B946044BF7E71955EB63DD546644D7D2A19777DA39A48B4CF5A011A5C41F1BFF7C463F057F2F7AF6F910E7E06398B0AF7EF38CD5BBAE4C5FF42572CFFFCA6A8E9D34F64A7BECDC93216B55C20FAECAF04A8956C4D26DEE34493510BC49144A32A1B0AAE64B50DCA0C27361692242FE3145A6B36B830DEBF9E8A07A886E8DA6F38F3E99906F6AC9317ADF73222C4C75ABD153F1112E01E7CBB49665F213A1C1470CDC442D7CDC72EE2DD80D37251333C34FFDC5C38ADA3F5E52F5A5B2A1224B0CA60211B430E9554F0C4CA672476562C4A182B6707EBE80DFA6247A1F870F74EC81D03558F2718409EBF8E7F2FD2C6AB1F246F7E3FE0D919DB4016A7D76F6378D05EA74766CBB93340F2CBDDF18073F39242F3E9EC88020D1E8F801183C00F0239B2F2B4E8F6B46DBC17F469A857C291C985D8AC2099A6FEDC462B5EAEF737831EA2B6C9D787DC5AC8DA2C2E8F7F676FDA4CDD79E400EED959882C78C279C4D0A5918A0F5FC3B695E0034F7C2665D52D94106744D6B0CD6A66AB3275324EFDC06ECCF431D446446A00818ECDBE77B845699FB4F699825702D00F71373D80452039ECA1237AD2A0DF9112BA1EC90FB9FB87CF4E46BD0319B64F2EFD4B9640469707DB549468781D0BA6F3C49AF035D441173786BB1F2F5DCCE07BBF5536A0EB5B976814ABFDB44B90E55455972701A8F0D8EFB860A082ABA960E704754F61C2E3956922833F3D7E1656476DEE3C4F09244AC15697EA4A73041F03EEDE1F30BF899098A70F33E5C2C407
-20241129060731 2 6 100 6143 2 DCBE8A152DD5DE612BFCCD18CAB2BDE17391AF9DA865DCC59A1B454144ADE2EB8BE3CDBA7948CD1236CFC25D66DDC0E91095FB7E17715247413BBFD5435223F46488AD93808AF9FAF7D473C7CCE55DAA83B417FC6C09BFF7E332BD4B3BC59CBA4FE035A6C416D32BDCF8C3B9AFC5E1120CFD420023FD8EB207DB965509E2D362B0EB3D8CBD191D2750EBEB05F32C4BE08154D991F08DE4914BC40FAA7172440F2FEFB0FBF604DDA9C18BA9FD55F34218FD5D7CA2AC491CEDC3C5743D143BAF6C06CCAB7E5B22AB4E46CD51962CC7931F4D35581D5DD3047B946044BF7E71955EB63DD546644D7D2A19777DA39A48B4CF5A011A5C41F1BFF7C463F057F2F7AF6F910E7E06398B0AF7EF38CD5BBAE4C5FF42572CFFFCA6A8E9D34F64A7BECDC93216B55C20FAECAF04A8956C4D26DEE34493510BC49144A32A1B0AAE64B50DCA0C27361692242FE3145A6B36B830DEBF9E8A07A886E8DA6F38F3E99906F6AC9317ADF73222C4C75ABD153F1112E01E7CBB49665F213A1C1470CDC442D7CDC72EE2DD80D37251333C34FFDC5C38ADA3F5E52F5A5B2A1224B0CA60211B430E9554F0C4CA672476562C4A182B6707EBE80DFA6247A1F870F74EC81D03558F2718409EBF8E7F2FD2C6AB1F246F7E3FE0D919DB4016A7D76F6378D05EA74766CBB93340F2CBDDF18073F39242F3E9EC88020D1E8F801183C00F0239B2F2B4E8F6B46DBC17F469A857C291C985D8AC2099A6FEDC462B5EAEF737831EA2B6C9D787DC5AC8DA2C2E8F7F676FDA4CDD79E400EED959882C78C279C4D0A5918A0F5FC3B695E0034F7C2665D52D94106744D6B0CD6A66AB3275324EFDC06ECCF431D446446A00818ECDBE77B845699FB4F699825702D00F71373D80452039ECA1237AD2A0DF9112BA1EC90FB9FB87CF4E46BD0319B64F2EFD4B9640469707DB549468781D0BA6F3C49AF035D441173786BB1F2F5DCCE07BBF5536A0EB5B976814ABFDB44B90E55455972701A8F0D8EFB860A082ABA960E704754F61C2E3956922833F3D7E1656476DEE3C4F09244AC15697EA4A73041F03EEDE1F30BF899098A70F33E7EF06DB
-20241129060801 2 6 100 6143 2 DCBE8A152DD5DE612BFCCD18CAB2BDE17391AF9DA865DCC59A1B454144ADE2EB8BE3CDBA7948CD1236CFC25D66DDC0E91095FB7E17715247413BBFD5435223F46488AD93808AF9FAF7D473C7CCE55DAA83B417FC6C09BFF7E332BD4B3BC59CBA4FE035A6C416D32BDCF8C3B9AFC5E1120CFD420023FD8EB207DB965509E2D362B0EB3D8CBD191D2750EBEB05F32C4BE08154D991F08DE4914BC40FAA7172440F2FEFB0FBF604DDA9C18BA9FD55F34218FD5D7CA2AC491CEDC3C5743D143BAF6C06CCAB7E5B22AB4E46CD51962CC7931F4D35581D5DD3047B946044BF7E71955EB63DD546644D7D2A19777DA39A48B4CF5A011A5C41F1BFF7C463F057F2F7AF6F910E7E06398B0AF7EF38CD5BBAE4C5FF42572CFFFCA6A8E9D34F64A7BECDC93216B55C20FAECAF04A8956C4D26DEE34493510BC49144A32A1B0AAE64B50DCA0C27361692242FE3145A6B36B830DEBF9E8A07A886E8DA6F38F3E99906F6AC9317ADF73222C4C75ABD153F1112E01E7CBB49665F213A1C1470CDC442D7CDC72EE2DD80D37251333C34FFDC5C38ADA3F5E52F5A5B2A1224B0CA60211B430E9554F0C4CA672476562C4A182B6707EBE80DFA6247A1F870F74EC81D03558F2718409EBF8E7F2FD2C6AB1F246F7E3FE0D919DB4016A7D76F6378D05EA74766CBB93340F2CBDDF18073F39242F3E9EC88020D1E8F801183C00F0239B2F2B4E8F6B46DBC17F469A857C291C985D8AC2099A6FEDC462B5EAEF737831EA2B6C9D787DC5AC8DA2C2E8F7F676FDA4CDD79E400EED959882C78C279C4D0A5918A0F5FC3B695E0034F7C2665D52D94106744D6B0CD6A66AB3275324EFDC06ECCF431D446446A00818ECDBE77B845699FB4F699825702D00F71373D80452039ECA1237AD2A0DF9112BA1EC90FB9FB87CF4E46BD0319B64F2EFD4B9640469707DB549468781D0BA6F3C49AF035D441173786BB1F2F5DCCE07BBF5536A0EB5B976814ABFDB44B90E55455972701A8F0D8EFB860A082ABA960E704754F61C2E3956922833F3D7E1656476DEE3C4F09244AC15697EA4A73041F03EEDE1F30BF899098A70F33E7F7359B
-20241129063045 2 6 100 6143 2 DCBE8A152DD5DE612BFCCD18CAB2BDE17391AF9DA865DCC59A1B454144ADE2EB8BE3CDBA7948CD1236CFC25D66DDC0E91095FB7E17715247413BBFD5435223F46488AD93808AF9FAF7D473C7CCE55DAA83B417FC6C09BFF7E332BD4B3BC59CBA4FE035A6C416D32BDCF8C3B9AFC5E1120CFD420023FD8EB207DB965509E2D362B0EB3D8CBD191D2750EBEB05F32C4BE08154D991F08DE4914BC40FAA7172440F2FEFB0FBF604DDA9C18BA9FD55F34218FD5D7CA2AC491CEDC3C5743D143BAF6C06CCAB7E5B22AB4E46CD51962CC7931F4D35581D5DD3047B946044BF7E71955EB63DD546644D7D2A19777DA39A48B4CF5A011A5C41F1BFF7C463F057F2F7AF6F910E7E06398B0AF7EF38CD5BBAE4C5FF42572CFFFCA6A8E9D34F64A7BECDC93216B55C20FAECAF04A8956C4D26DEE34493510BC49144A32A1B0AAE64B50DCA0C27361692242FE3145A6B36B830DEBF9E8A07A886E8DA6F38F3E99906F6AC9317ADF73222C4C75ABD153F1112E01E7CBB49665F213A1C1470CDC442D7CDC72EE2DD80D37251333C34FFDC5C38ADA3F5E52F5A5B2A1224B0CA60211B430E9554F0C4CA672476562C4A182B6707EBE80DFA6247A1F870F74EC81D03558F2718409EBF8E7F2FD2C6AB1F246F7E3FE0D919DB4016A7D76F6378D05EA74766CBB93340F2CBDDF18073F39242F3E9EC88020D1E8F801183C00F0239B2F2B4E8F6B46DBC17F469A857C291C985D8AC2099A6FEDC462B5EAEF737831EA2B6C9D787DC5AC8DA2C2E8F7F676FDA4CDD79E400EED959882C78C279C4D0A5918A0F5FC3B695E0034F7C2665D52D94106744D6B0CD6A66AB3275324EFDC06ECCF431D446446A00818ECDBE77B845699FB4F699825702D00F71373D80452039ECA1237AD2A0DF9112BA1EC90FB9FB87CF4E46BD0319B64F2EFD4B9640469707DB549468781D0BA6F3C49AF035D441173786BB1F2F5DCCE07BBF5536A0EB5B976814ABFDB44B90E55455972701A8F0D8EFB860A082ABA960E704754F61C2E3956922833F3D7E1656476DEE3C4F09244AC15697EA4A73041F03EEDE1F30BF899098A70F33EAD325DB
-20241129065049 2 6 100 6143 2 DCBE8A152DD5DE612BFCCD18CAB2BDE17391AF9DA865DCC59A1B454144ADE2EB8BE3CDBA7948CD1236CFC25D66DDC0E91095FB7E17715247413BBFD5435223F46488AD93808AF9FAF7D473C7CCE55DAA83B417FC6C09BFF7E332BD4B3BC59CBA4FE035A6C416D32BDCF8C3B9AFC5E1120CFD420023FD8EB207DB965509E2D362B0EB3D8CBD191D2750EBEB05F32C4BE08154D991F08DE4914BC40FAA7172440F2FEFB0FBF604DDA9C18BA9FD55F34218FD5D7CA2AC491CEDC3C5743D143BAF6C06CCAB7E5B22AB4E46CD51962CC7931F4D35581D5DD3047B946044BF7E71955EB63DD546644D7D2A19777DA39A48B4CF5A011A5C41F1BFF7C463F057F2F7AF6F910E7E06398B0AF7EF38CD5BBAE4C5FF42572CFFFCA6A8E9D34F64A7BECDC93216B55C20FAECAF04A8956C4D26DEE34493510BC49144A32A1B0AAE64B50DCA0C27361692242FE3145A6B36B830DEBF9E8A07A886E8DA6F38F3E99906F6AC9317ADF73222C4C75ABD153F1112E01E7CBB49665F213A1C1470CDC442D7CDC72EE2DD80D37251333C34FFDC5C38ADA3F5E52F5A5B2A1224B0CA60211B430E9554F0C4CA672476562C4A182B6707EBE80DFA6247A1F870F74EC81D03558F2718409EBF8E7F2FD2C6AB1F246F7E3FE0D919DB4016A7D76F6378D05EA74766CBB93340F2CBDDF18073F39242F3E9EC88020D1E8F801183C00F0239B2F2B4E8F6B46DBC17F469A857C291C985D8AC2099A6FEDC462B5EAEF737831EA2B6C9D787DC5AC8DA2C2E8F7F676FDA4CDD79E400EED959882C78C279C4D0A5918A0F5FC3B695E0034F7C2665D52D94106744D6B0CD6A66AB3275324EFDC06ECCF431D446446A00818ECDBE77B845699FB4F699825702D00F71373D80452039ECA1237AD2A0DF9112BA1EC90FB9FB87CF4E46BD0319B64F2EFD4B9640469707DB549468781D0BA6F3C49AF035D441173786BB1F2F5DCCE07BBF5536A0EB5B976814ABFDB44B90E55455972701A8F0D8EFB860A082ABA960E704754F61C2E3956922833F3D7E1656476DEE3C4F09244AC15697EA4A73041F03EEDE1F30BF899098A70F33ED529283
-20241129065931 2 6 100 6143 5 DCBE8A152DD5DE612BFCCD18CAB2BDE17391AF9DA865DCC59A1B454144ADE2EB8BE3CDBA7948CD1236CFC25D66DDC0E91095FB7E17715247413BBFD5435223F46488AD93808AF9FAF7D473C7CCE55DAA83B417FC6C09BFF7E332BD4B3BC59CBA4FE035A6C416D32BDCF8C3B9AFC5E1120CFD420023FD8EB207DB965509E2D362B0EB3D8CBD191D2750EBEB05F32C4BE08154D991F08DE4914BC40FAA7172440F2FEFB0FBF604DDA9C18BA9FD55F34218FD5D7CA2AC491CEDC3C5743D143BAF6C06CCAB7E5B22AB4E46CD51962CC7931F4D35581D5DD3047B946044BF7E71955EB63DD546644D7D2A19777DA39A48B4CF5A011A5C41F1BFF7C463F057F2F7AF6F910E7E06398B0AF7EF38CD5BBAE4C5FF42572CFFFCA6A8E9D34F64A7BECDC93216B55C20FAECAF04A8956C4D26DEE34493510BC49144A32A1B0AAE64B50DCA0C27361692242FE3145A6B36B830DEBF9E8A07A886E8DA6F38F3E99906F6AC9317ADF73222C4C75ABD153F1112E01E7CBB49665F213A1C1470CDC442D7CDC72EE2DD80D37251333C34FFDC5C38ADA3F5E52F5A5B2A1224B0CA60211B430E9554F0C4CA672476562C4A182B6707EBE80DFA6247A1F870F74EC81D03558F2718409EBF8E7F2FD2C6AB1F246F7E3FE0D919DB4016A7D76F6378D05EA74766CBB93340F2CBDDF18073F39242F3E9EC88020D1E8F801183C00F0239B2F2B4E8F6B46DBC17F469A857C291C985D8AC2099A6FEDC462B5EAEF737831EA2B6C9D787DC5AC8DA2C2E8F7F676FDA4CDD79E400EED959882C78C279C4D0A5918A0F5FC3B695E0034F7C2665D52D94106744D6B0CD6A66AB3275324EFDC06ECCF431D446446A00818ECDBE77B845699FB4F699825702D00F71373D80452039ECA1237AD2A0DF9112BA1EC90FB9FB87CF4E46BD0319B64F2EFD4B9640469707DB549468781D0BA6F3C49AF035D441173786BB1F2F5DCCE07BBF5536A0EB5B976814ABFDB44B90E55455972701A8F0D8EFB860A082ABA960E704754F61C2E3956922833F3D7E1656476DEE3C4F09244AC15697EA4A73041F03EEDE1F30BF899098A70F33EE615997
-20241129070906 2 6 100 6143 5 DCBE8A152DD5DE612BFCCD18CAB2BDE17391AF9DA865DCC59A1B454144ADE2EB8BE3CDBA7948CD1236CFC25D66DDC0E91095FB7E17715247413BBFD5435223F46488AD93808AF9FAF7D473C7CCE55DAA83B417FC6C09BFF7E332BD4B3BC59CBA4FE035A6C416D32BDCF8C3B9AFC5E1120CFD420023FD8EB207DB965509E2D362B0EB3D8CBD191D2750EBEB05F32C4BE08154D991F08DE4914BC40FAA7172440F2FEFB0FBF604DDA9C18BA9FD55F34218FD5D7CA2AC491CEDC3C5743D143BAF6C06CCAB7E5B22AB4E46CD51962CC7931F4D35581D5DD3047B946044BF7E71955EB63DD546644D7D2A19777DA39A48B4CF5A011A5C41F1BFF7C463F057F2F7AF6F910E7E06398B0AF7EF38CD5BBAE4C5FF42572CFFFCA6A8E9D34F64A7BECDC93216B55C20FAECAF04A8956C4D26DEE34493510BC49144A32A1B0AAE64B50DCA0C27361692242FE3145A6B36B830DEBF9E8A07A886E8DA6F38F3E99906F6AC9317ADF73222C4C75ABD153F1112E01E7CBB49665F213A1C1470CDC442D7CDC72EE2DD80D37251333C34FFDC5C38ADA3F5E52F5A5B2A1224B0CA60211B430E9554F0C4CA672476562C4A182B6707EBE80DFA6247A1F870F74EC81D03558F2718409EBF8E7F2FD2C6AB1F246F7E3FE0D919DB4016A7D76F6378D05EA74766CBB93340F2CBDDF18073F39242F3E9EC88020D1E8F801183C00F0239B2F2B4E8F6B46DBC17F469A857C291C985D8AC2099A6FEDC462B5EAEF737831EA2B6C9D787DC5AC8DA2C2E8F7F676FDA4CDD79E400EED959882C78C279C4D0A5918A0F5FC3B695E0034F7C2665D52D94106744D6B0CD6A66AB3275324EFDC06ECCF431D446446A00818ECDBE77B845699FB4F699825702D00F71373D80452039ECA1237AD2A0DF9112BA1EC90FB9FB87CF4E46BD0319B64F2EFD4B9640469707DB549468781D0BA6F3C49AF035D441173786BB1F2F5DCCE07BBF5536A0EB5B976814ABFDB44B90E55455972701A8F0D8EFB860A082ABA960E704754F61C2E3956922833F3D7E1656476DEE3C4F09244AC15697EA4A73041F03EEDE1F30BF899098A70F33EF8D1D07
-20241129072522 2 6 100 6143 5 DCBE8A152DD5DE612BFCCD18CAB2BDE17391AF9DA865DCC59A1B454144ADE2EB8BE3CDBA7948CD1236CFC25D66DDC0E91095FB7E17715247413BBFD5435223F46488AD93808AF9FAF7D473C7CCE55DAA83B417FC6C09BFF7E332BD4B3BC59CBA4FE035A6C416D32BDCF8C3B9AFC5E1120CFD420023FD8EB207DB965509E2D362B0EB3D8CBD191D2750EBEB05F32C4BE08154D991F08DE4914BC40FAA7172440F2FEFB0FBF604DDA9C18BA9FD55F34218FD5D7CA2AC491CEDC3C5743D143BAF6C06CCAB7E5B22AB4E46CD51962CC7931F4D35581D5DD3047B946044BF7E71955EB63DD546644D7D2A19777DA39A48B4CF5A011A5C41F1BFF7C463F057F2F7AF6F910E7E06398B0AF7EF38CD5BBAE4C5FF42572CFFFCA6A8E9D34F64A7BECDC93216B55C20FAECAF04A8956C4D26DEE34493510BC49144A32A1B0AAE64B50DCA0C27361692242FE3145A6B36B830DEBF9E8A07A886E8DA6F38F3E99906F6AC9317ADF73222C4C75ABD153F1112E01E7CBB49665F213A1C1470CDC442D7CDC72EE2DD80D37251333C34FFDC5C38ADA3F5E52F5A5B2A1224B0CA60211B430E9554F0C4CA672476562C4A182B6707EBE80DFA6247A1F870F74EC81D03558F2718409EBF8E7F2FD2C6AB1F246F7E3FE0D919DB4016A7D76F6378D05EA74766CBB93340F2CBDDF18073F39242F3E9EC88020D1E8F801183C00F0239B2F2B4E8F6B46DBC17F469A857C291C985D8AC2099A6FEDC462B5EAEF737831EA2B6C9D787DC5AC8DA2C2E8F7F676FDA4CDD79E400EED959882C78C279C4D0A5918A0F5FC3B695E0034F7C2665D52D94106744D6B0CD6A66AB3275324EFDC06ECCF431D446446A00818ECDBE77B845699FB4F699825702D00F71373D80452039ECA1237AD2A0DF9112BA1EC90FB9FB87CF4E46BD0319B64F2EFD4B9640469707DB549468781D0BA6F3C49AF035D441173786BB1F2F5DCCE07BBF5536A0EB5B976814ABFDB44B90E55455972701A8F0D8EFB860A082ABA960E704754F61C2E3956922833F3D7E1656476DEE3C4F09244AC15697EA4A73041F03EEDE1F30BF899098A70F33F19250B7
-20241129080348 2 6 100 6143 2 DCBE8A152DD5DE612BFCCD18CAB2BDE17391AF9DA865DCC59A1B454144ADE2EB8BE3CDBA7948CD1236CFC25D66DDC0E91095FB7E17715247413BBFD5435223F46488AD93808AF9FAF7D473C7CCE55DAA83B417FC6C09BFF7E332BD4B3BC59CBA4FE035A6C416D32BDCF8C3B9AFC5E1120CFD420023FD8EB207DB965509E2D362B0EB3D8CBD191D2750EBEB05F32C4BE08154D991F08DE4914BC40FAA7172440F2FEFB0FBF604DDA9C18BA9FD55F34218FD5D7CA2AC491CEDC3C5743D143BAF6C06CCAB7E5B22AB4E46CD51962CC7931F4D35581D5DD3047B946044BF7E71955EB63DD546644D7D2A19777DA39A48B4CF5A011A5C41F1BFF7C463F057F2F7AF6F910E7E06398B0AF7EF38CD5BBAE4C5FF42572CFFFCA6A8E9D34F64A7BECDC93216B55C20FAECAF04A8956C4D26DEE34493510BC49144A32A1B0AAE64B50DCA0C27361692242FE3145A6B36B830DEBF9E8A07A886E8DA6F38F3E99906F6AC9317ADF73222C4C75ABD153F1112E01E7CBB49665F213A1C1470CDC442D7CDC72EE2DD80D37251333C34FFDC5C38ADA3F5E52F5A5B2A1224B0CA60211B430E9554F0C4CA672476562C4A182B6707EBE80DFA6247A1F870F74EC81D03558F2718409EBF8E7F2FD2C6AB1F246F7E3FE0D919DB4016A7D76F6378D05EA74766CBB93340F2CBDDF18073F39242F3E9EC88020D1E8F801183C00F0239B2F2B4E8F6B46DBC17F469A857C291C985D8AC2099A6FEDC462B5EAEF737831EA2B6C9D787DC5AC8DA2C2E8F7F676FDA4CDD79E400EED959882C78C279C4D0A5918A0F5FC3B695E0034F7C2665D52D94106744D6B0CD6A66AB3275324EFDC06ECCF431D446446A00818ECDBE77B845699FB4F699825702D00F71373D80452039ECA1237AD2A0DF9112BA1EC90FB9FB87CF4E46BD0319B64F2EFD4B9640469707DB549468781D0BA6F3C49AF035D441173786BB1F2F5DCCE07BBF5536A0EB5B976814ABFDB44B90E55455972701A8F0D8EFB860A082ABA960E704754F61C2E3956922833F3D7E1656476DEE3C4F09244AC15697EA4A73041F03EEDE1F30BF899098A70F33F6682AF3
-20241129082342 2 6 100 6143 5 DCBE8A152DD5DE612BFCCD18CAB2BDE17391AF9DA865DCC59A1B454144ADE2EB8BE3CDBA7948CD1236CFC25D66DDC0E91095FB7E17715247413BBFD5435223F46488AD93808AF9FAF7D473C7CCE55DAA83B417FC6C09BFF7E332BD4B3BC59CBA4FE035A6C416D32BDCF8C3B9AFC5E1120CFD420023FD8EB207DB965509E2D362B0EB3D8CBD191D2750EBEB05F32C4BE08154D991F08DE4914BC40FAA7172440F2FEFB0FBF604DDA9C18BA9FD55F34218FD5D7CA2AC491CEDC3C5743D143BAF6C06CCAB7E5B22AB4E46CD51962CC7931F4D35581D5DD3047B946044BF7E71955EB63DD546644D7D2A19777DA39A48B4CF5A011A5C41F1BFF7C463F057F2F7AF6F910E7E06398B0AF7EF38CD5BBAE4C5FF42572CFFFCA6A8E9D34F64A7BECDC93216B55C20FAECAF04A8956C4D26DEE34493510BC49144A32A1B0AAE64B50DCA0C27361692242FE3145A6B36B830DEBF9E8A07A886E8DA6F38F3E99906F6AC9317ADF73222C4C75ABD153F1112E01E7CBB49665F213A1C1470CDC442D7CDC72EE2DD80D37251333C34FFDC5C38ADA3F5E52F5A5B2A1224B0CA60211B430E9554F0C4CA672476562C4A182B6707EBE80DFA6247A1F870F74EC81D03558F2718409EBF8E7F2FD2C6AB1F246F7E3FE0D919DB4016A7D76F6378D05EA74766CBB93340F2CBDDF18073F39242F3E9EC88020D1E8F801183C00F0239B2F2B4E8F6B46DBC17F469A857C291C985D8AC2099A6FEDC462B5EAEF737831EA2B6C9D787DC5AC8DA2C2E8F7F676FDA4CDD79E400EED959882C78C279C4D0A5918A0F5FC3B695E0034F7C2665D52D94106744D6B0CD6A66AB3275324EFDC06ECCF431D446446A00818ECDBE77B845699FB4F699825702D00F71373D80452039ECA1237AD2A0DF9112BA1EC90FB9FB87CF4E46BD0319B64F2EFD4B9640469707DB549468781D0BA6F3C49AF035D441173786BB1F2F5DCCE07BBF5536A0EB5B976814ABFDB44B90E55455972701A8F0D8EFB860A082ABA960E704754F61C2E3956922833F3D7E1656476DEE3C4F09244AC15697EA4A73041F03EEDE1F30BF899098A70F33F8DD796F
-20241129082407 2 6 100 6143 2 DCBE8A152DD5DE612BFCCD18CAB2BDE17391AF9DA865DCC59A1B454144ADE2EB8BE3CDBA7948CD1236CFC25D66DDC0E91095FB7E17715247413BBFD5435223F46488AD93808AF9FAF7D473C7CCE55DAA83B417FC6C09BFF7E332BD4B3BC59CBA4FE035A6C416D32BDCF8C3B9AFC5E1120CFD420023FD8EB207DB965509E2D362B0EB3D8CBD191D2750EBEB05F32C4BE08154D991F08DE4914BC40FAA7172440F2FEFB0FBF604DDA9C18BA9FD55F34218FD5D7CA2AC491CEDC3C5743D143BAF6C06CCAB7E5B22AB4E46CD51962CC7931F4D35581D5DD3047B946044BF7E71955EB63DD546644D7D2A19777DA39A48B4CF5A011A5C41F1BFF7C463F057F2F7AF6F910E7E06398B0AF7EF38CD5BBAE4C5FF42572CFFFCA6A8E9D34F64A7BECDC93216B55C20FAECAF04A8956C4D26DEE34493510BC49144A32A1B0AAE64B50DCA0C27361692242FE3145A6B36B830DEBF9E8A07A886E8DA6F38F3E99906F6AC9317ADF73222C4C75ABD153F1112E01E7CBB49665F213A1C1470CDC442D7CDC72EE2DD80D37251333C34FFDC5C38ADA3F5E52F5A5B2A1224B0CA60211B430E9554F0C4CA672476562C4A182B6707EBE80DFA6247A1F870F74EC81D03558F2718409EBF8E7F2FD2C6AB1F246F7E3FE0D919DB4016A7D76F6378D05EA74766CBB93340F2CBDDF18073F39242F3E9EC88020D1E8F801183C00F0239B2F2B4E8F6B46DBC17F469A857C291C985D8AC2099A6FEDC462B5EAEF737831EA2B6C9D787DC5AC8DA2C2E8F7F676FDA4CDD79E400EED959882C78C279C4D0A5918A0F5FC3B695E0034F7C2665D52D94106744D6B0CD6A66AB3275324EFDC06ECCF431D446446A00818ECDBE77B845699FB4F699825702D00F71373D80452039ECA1237AD2A0DF9112BA1EC90FB9FB87CF4E46BD0319B64F2EFD4B9640469707DB549468781D0BA6F3C49AF035D441173786BB1F2F5DCCE07BBF5536A0EB5B976814ABFDB44B90E55455972701A8F0D8EFB860A082ABA960E704754F61C2E3956922833F3D7E1656476DEE3C4F09244AC15697EA4A73041F03EEDE1F30BF899098A70F33F8E28AB3
-20241129082555 2 6 100 6143 2 DCBE8A152DD5DE612BFCCD18CAB2BDE17391AF9DA865DCC59A1B454144ADE2EB8BE3CDBA7948CD1236CFC25D66DDC0E91095FB7E17715247413BBFD5435223F46488AD93808AF9FAF7D473C7CCE55DAA83B417FC6C09BFF7E332BD4B3BC59CBA4FE035A6C416D32BDCF8C3B9AFC5E1120CFD420023FD8EB207DB965509E2D362B0EB3D8CBD191D2750EBEB05F32C4BE08154D991F08DE4914BC40FAA7172440F2FEFB0FBF604DDA9C18BA9FD55F34218FD5D7CA2AC491CEDC3C5743D143BAF6C06CCAB7E5B22AB4E46CD51962CC7931F4D35581D5DD3047B946044BF7E71955EB63DD546644D7D2A19777DA39A48B4CF5A011A5C41F1BFF7C463F057F2F7AF6F910E7E06398B0AF7EF38CD5BBAE4C5FF42572CFFFCA6A8E9D34F64A7BECDC93216B55C20FAECAF04A8956C4D26DEE34493510BC49144A32A1B0AAE64B50DCA0C27361692242FE3145A6B36B830DEBF9E8A07A886E8DA6F38F3E99906F6AC9317ADF73222C4C75ABD153F1112E01E7CBB49665F213A1C1470CDC442D7CDC72EE2DD80D37251333C34FFDC5C38ADA3F5E52F5A5B2A1224B0CA60211B430E9554F0C4CA672476562C4A182B6707EBE80DFA6247A1F870F74EC81D03558F2718409EBF8E7F2FD2C6AB1F246F7E3FE0D919DB4016A7D76F6378D05EA74766CBB93340F2CBDDF18073F39242F3E9EC88020D1E8F801183C00F0239B2F2B4E8F6B46DBC17F469A857C291C985D8AC2099A6FEDC462B5EAEF737831EA2B6C9D787DC5AC8DA2C2E8F7F676FDA4CDD79E400EED959882C78C279C4D0A5918A0F5FC3B695E0034F7C2665D52D94106744D6B0CD6A66AB3275324EFDC06ECCF431D446446A00818ECDBE77B845699FB4F699825702D00F71373D80452039ECA1237AD2A0DF9112BA1EC90FB9FB87CF4E46BD0319B64F2EFD4B9640469707DB549468781D0BA6F3C49AF035D441173786BB1F2F5DCCE07BBF5536A0EB5B976814ABFDB44B90E55455972701A8F0D8EFB860A082ABA960E704754F61C2E3956922833F3D7E1656476DEE3C4F09244AC15697EA4A73041F03EEDE1F30BF899098A70F33F917C303
-20241129082910 2 6 100 6143 2 DCBE8A152DD5DE612BFCCD18CAB2BDE17391AF9DA865DCC59A1B454144ADE2EB8BE3CDBA7948CD1236CFC25D66DDC0E91095FB7E17715247413BBFD5435223F46488AD93808AF9FAF7D473C7CCE55DAA83B417FC6C09BFF7E332BD4B3BC59CBA4FE035A6C416D32BDCF8C3B9AFC5E1120CFD420023FD8EB207DB965509E2D362B0EB3D8CBD191D2750EBEB05F32C4BE08154D991F08DE4914BC40FAA7172440F2FEFB0FBF604DDA9C18BA9FD55F34218FD5D7CA2AC491CEDC3C5743D143BAF6C06CCAB7E5B22AB4E46CD51962CC7931F4D35581D5DD3047B946044BF7E71955EB63DD546644D7D2A19777DA39A48B4CF5A011A5C41F1BFF7C463F057F2F7AF6F910E7E06398B0AF7EF38CD5BBAE4C5FF42572CFFFCA6A8E9D34F64A7BECDC93216B55C20FAECAF04A8956C4D26DEE34493510BC49144A32A1B0AAE64B50DCA0C27361692242FE3145A6B36B830DEBF9E8A07A886E8DA6F38F3E99906F6AC9317ADF73222C4C75ABD153F1112E01E7CBB49665F213A1C1470CDC442D7CDC72EE2DD80D37251333C34FFDC5C38ADA3F5E52F5A5B2A1224B0CA60211B430E9554F0C4CA672476562C4A182B6707EBE80DFA6247A1F870F74EC81D03558F2718409EBF8E7F2FD2C6AB1F246F7E3FE0D919DB4016A7D76F6378D05EA74766CBB93340F2CBDDF18073F39242F3E9EC88020D1E8F801183C00F0239B2F2B4E8F6B46DBC17F469A857C291C985D8AC2099A6FEDC462B5EAEF737831EA2B6C9D787DC5AC8DA2C2E8F7F676FDA4CDD79E400EED959882C78C279C4D0A5918A0F5FC3B695E0034F7C2665D52D94106744D6B0CD6A66AB3275324EFDC06ECCF431D446446A00818ECDBE77B845699FB4F699825702D00F71373D80452039ECA1237AD2A0DF9112BA1EC90FB9FB87CF4E46BD0319B64F2EFD4B9640469707DB549468781D0BA6F3C49AF035D441173786BB1F2F5DCCE07BBF5536A0EB5B976814ABFDB44B90E55455972701A8F0D8EFB860A082ABA960E704754F61C2E3956922833F3D7E1656476DEE3C4F09244AC15697EA4A73041F03EEDE1F30BF899098A70F33F97B2DB3
-20241129083433 2 6 100 6143 5 DCBE8A152DD5DE612BFCCD18CAB2BDE17391AF9DA865DCC59A1B454144ADE2EB8BE3CDBA7948CD1236CFC25D66DDC0E91095FB7E17715247413BBFD5435223F46488AD93808AF9FAF7D473C7CCE55DAA83B417FC6C09BFF7E332BD4B3BC59CBA4FE035A6C416D32BDCF8C3B9AFC5E1120CFD420023FD8EB207DB965509E2D362B0EB3D8CBD191D2750EBEB05F32C4BE08154D991F08DE4914BC40FAA7172440F2FEFB0FBF604DDA9C18BA9FD55F34218FD5D7CA2AC491CEDC3C5743D143BAF6C06CCAB7E5B22AB4E46CD51962CC7931F4D35581D5DD3047B946044BF7E71955EB63DD546644D7D2A19777DA39A48B4CF5A011A5C41F1BFF7C463F057F2F7AF6F910E7E06398B0AF7EF38CD5BBAE4C5FF42572CFFFCA6A8E9D34F64A7BECDC93216B55C20FAECAF04A8956C4D26DEE34493510BC49144A32A1B0AAE64B50DCA0C27361692242FE3145A6B36B830DEBF9E8A07A886E8DA6F38F3E99906F6AC9317ADF73222C4C75ABD153F1112E01E7CBB49665F213A1C1470CDC442D7CDC72EE2DD80D37251333C34FFDC5C38ADA3F5E52F5A5B2A1224B0CA60211B430E9554F0C4CA672476562C4A182B6707EBE80DFA6247A1F870F74EC81D03558F2718409EBF8E7F2FD2C6AB1F246F7E3FE0D919DB4016A7D76F6378D05EA74766CBB93340F2CBDDF18073F39242F3E9EC88020D1E8F801183C00F0239B2F2B4E8F6B46DBC17F469A857C291C985D8AC2099A6FEDC462B5EAEF737831EA2B6C9D787DC5AC8DA2C2E8F7F676FDA4CDD79E400EED959882C78C279C4D0A5918A0F5FC3B695E0034F7C2665D52D94106744D6B0CD6A66AB3275324EFDC06ECCF431D446446A00818ECDBE77B845699FB4F699825702D00F71373D80452039ECA1237AD2A0DF9112BA1EC90FB9FB87CF4E46BD0319B64F2EFD4B9640469707DB549468781D0BA6F3C49AF035D441173786BB1F2F5DCCE07BBF5536A0EB5B976814ABFDB44B90E55455972701A8F0D8EFB860A082ABA960E704754F61C2E3956922833F3D7E1656476DEE3C4F09244AC15697EA4A73041F03EEDE1F30BF899098A70F33FA1DB177
-20241129090902 2 6 100 6143 2 DCBE8A152DD5DE612BFCCD18CAB2BDE17391AF9DA865DCC59A1B454144ADE2EB8BE3CDBA7948CD1236CFC25D66DDC0E91095FB7E17715247413BBFD5435223F46488AD93808AF9FAF7D473C7CCE55DAA83B417FC6C09BFF7E332BD4B3BC59CBA4FE035A6C416D32BDCF8C3B9AFC5E1120CFD420023FD8EB207DB965509E2D362B0EB3D8CBD191D2750EBEB05F32C4BE08154D991F08DE4914BC40FAA7172440F2FEFB0FBF604DDA9C18BA9FD55F34218FD5D7CA2AC491CEDC3C5743D143BAF6C06CCAB7E5B22AB4E46CD51962CC7931F4D35581D5DD3047B946044BF7E71955EB63DD546644D7D2A19777DA39A48B4CF5A011A5C41F1BFF7C463F057F2F7AF6F910E7E06398B0AF7EF38CD5BBAE4C5FF42572CFFFCA6A8E9D34F64A7BECDC93216B55C20FAECAF04A8956C4D26DEE34493510BC49144A32A1B0AAE64B50DCA0C27361692242FE3145A6B36B830DEBF9E8A07A886E8DA6F38F3E99906F6AC9317ADF73222C4C75ABD153F1112E01E7CBB49665F213A1C1470CDC442D7CDC72EE2DD80D37251333C34FFDC5C38ADA3F5E52F5A5B2A1224B0CA60211B430E9554F0C4CA672476562C4A182B6707EBE80DFA6247A1F870F74EC81D03558F2718409EBF8E7F2FD2C6AB1F246F7E3FE0D919DB4016A7D76F6378D05EA74766CBB93340F2CBDDF18073F39242F3E9EC88020D1E8F801183C00F0239B2F2B4E8F6B46DBC17F469A857C291C985D8AC2099A6FEDC462B5EAEF737831EA2B6C9D787DC5AC8DA2C2E8F7F676FDA4CDD79E400EED959882C78C279C4D0A5918A0F5FC3B695E0034F7C2665D52D94106744D6B0CD6A66AB3275324EFDC06ECCF431D446446A00818ECDBE77B845699FB4F699825702D00F71373D80452039ECA1237AD2A0DF9112BA1EC90FB9FB87CF4E46BD0319B64F2EFD4B9640469707DB549468781D0BA6F3C49AF035D441173786BB1F2F5DCCE07BBF5536A0EB5B976814ABFDB44B90E55455972701A8F0D8EFB860A082ABA960E704754F61C2E3956922833F3D7E1656476DEE3C4F09244AC15697EA4A73041F03EEDE1F30BF899098A70F33FE76C9B3
-20241129090942 2 6 100 6143 5 DCBE8A152DD5DE612BFCCD18CAB2BDE17391AF9DA865DCC59A1B454144ADE2EB8BE3CDBA7948CD1236CFC25D66DDC0E91095FB7E17715247413BBFD5435223F46488AD93808AF9FAF7D473C7CCE55DAA83B417FC6C09BFF7E332BD4B3BC59CBA4FE035A6C416D32BDCF8C3B9AFC5E1120CFD420023FD8EB207DB965509E2D362B0EB3D8CBD191D2750EBEB05F32C4BE08154D991F08DE4914BC40FAA7172440F2FEFB0FBF604DDA9C18BA9FD55F34218FD5D7CA2AC491CEDC3C5743D143BAF6C06CCAB7E5B22AB4E46CD51962CC7931F4D35581D5DD3047B946044BF7E71955EB63DD546644D7D2A19777DA39A48B4CF5A011A5C41F1BFF7C463F057F2F7AF6F910E7E06398B0AF7EF38CD5BBAE4C5FF42572CFFFCA6A8E9D34F64A7BECDC93216B55C20FAECAF04A8956C4D26DEE34493510BC49144A32A1B0AAE64B50DCA0C27361692242FE3145A6B36B830DEBF9E8A07A886E8DA6F38F3E99906F6AC9317ADF73222C4C75ABD153F1112E01E7CBB49665F213A1C1470CDC442D7CDC72EE2DD80D37251333C34FFDC5C38ADA3F5E52F5A5B2A1224B0CA60211B430E9554F0C4CA672476562C4A182B6707EBE80DFA6247A1F870F74EC81D03558F2718409EBF8E7F2FD2C6AB1F246F7E3FE0D919DB4016A7D76F6378D05EA74766CBB93340F2CBDDF18073F39242F3E9EC88020D1E8F801183C00F0239B2F2B4E8F6B46DBC17F469A857C291C985D8AC2099A6FEDC462B5EAEF737831EA2B6C9D787DC5AC8DA2C2E8F7F676FDA4CDD79E400EED959882C78C279C4D0A5918A0F5FC3B695E0034F7C2665D52D94106744D6B0CD6A66AB3275324EFDC06ECCF431D446446A00818ECDBE77B845699FB4F699825702D00F71373D80452039ECA1237AD2A0DF9112BA1EC90FB9FB87CF4E46BD0319B64F2EFD4B9640469707DB549468781D0BA6F3C49AF035D441173786BB1F2F5DCCE07BBF5536A0EB5B976814ABFDB44B90E55455972701A8F0D8EFB860A082ABA960E704754F61C2E3956922833F3D7E1656476DEE3C4F09244AC15697EA4A73041F03EEDE1F30BF899098A70F33FE840CCF
-20241129091044 2 6 100 6143 2 DCBE8A152DD5DE612BFCCD18CAB2BDE17391AF9DA865DCC59A1B454144ADE2EB8BE3CDBA7948CD1236CFC25D66DDC0E91095FB7E17715247413BBFD5435223F46488AD93808AF9FAF7D473C7CCE55DAA83B417FC6C09BFF7E332BD4B3BC59CBA4FE035A6C416D32BDCF8C3B9AFC5E1120CFD420023FD8EB207DB965509E2D362B0EB3D8CBD191D2750EBEB05F32C4BE08154D991F08DE4914BC40FAA7172440F2FEFB0FBF604DDA9C18BA9FD55F34218FD5D7CA2AC491CEDC3C5743D143BAF6C06CCAB7E5B22AB4E46CD51962CC7931F4D35581D5DD3047B946044BF7E71955EB63DD546644D7D2A19777DA39A48B4CF5A011A5C41F1BFF7C463F057F2F7AF6F910E7E06398B0AF7EF38CD5BBAE4C5FF42572CFFFCA6A8E9D34F64A7BECDC93216B55C20FAECAF04A8956C4D26DEE34493510BC49144A32A1B0AAE64B50DCA0C27361692242FE3145A6B36B830DEBF9E8A07A886E8DA6F38F3E99906F6AC9317ADF73222C4C75ABD153F1112E01E7CBB49665F213A1C1470CDC442D7CDC72EE2DD80D37251333C34FFDC5C38ADA3F5E52F5A5B2A1224B0CA60211B430E9554F0C4CA672476562C4A182B6707EBE80DFA6247A1F870F74EC81D03558F2718409EBF8E7F2FD2C6AB1F246F7E3FE0D919DB4016A7D76F6378D05EA74766CBB93340F2CBDDF18073F39242F3E9EC88020D1E8F801183C00F0239B2F2B4E8F6B46DBC17F469A857C291C985D8AC2099A6FEDC462B5EAEF737831EA2B6C9D787DC5AC8DA2C2E8F7F676FDA4CDD79E400EED959882C78C279C4D0A5918A0F5FC3B695E0034F7C2665D52D94106744D6B0CD6A66AB3275324EFDC06ECCF431D446446A00818ECDBE77B845699FB4F699825702D00F71373D80452039ECA1237AD2A0DF9112BA1EC90FB9FB87CF4E46BD0319B64F2EFD4B9640469707DB549468781D0BA6F3C49AF035D441173786BB1F2F5DCCE07BBF5536A0EB5B976814ABFDB44B90E55455972701A8F0D8EFB860A082ABA960E704754F61C2E3956922833F3D7E1656476DEE3C4F09244AC15697EA4A73041F03EEDE1F30BF899098A70F33FE9F0AB3
-20241129091214 2 6 100 6143 2 DCBE8A152DD5DE612BFCCD18CAB2BDE17391AF9DA865DCC59A1B454144ADE2EB8BE3CDBA7948CD1236CFC25D66DDC0E91095FB7E17715247413BBFD5435223F46488AD93808AF9FAF7D473C7CCE55DAA83B417FC6C09BFF7E332BD4B3BC59CBA4FE035A6C416D32BDCF8C3B9AFC5E1120CFD420023FD8EB207DB965509E2D362B0EB3D8CBD191D2750EBEB05F32C4BE08154D991F08DE4914BC40FAA7172440F2FEFB0FBF604DDA9C18BA9FD55F34218FD5D7CA2AC491CEDC3C5743D143BAF6C06CCAB7E5B22AB4E46CD51962CC7931F4D35581D5DD3047B946044BF7E71955EB63DD546644D7D2A19777DA39A48B4CF5A011A5C41F1BFF7C463F057F2F7AF6F910E7E06398B0AF7EF38CD5BBAE4C5FF42572CFFFCA6A8E9D34F64A7BECDC93216B55C20FAECAF04A8956C4D26DEE34493510BC49144A32A1B0AAE64B50DCA0C27361692242FE3145A6B36B830DEBF9E8A07A886E8DA6F38F3E99906F6AC9317ADF73222C4C75ABD153F1112E01E7CBB49665F213A1C1470CDC442D7CDC72EE2DD80D37251333C34FFDC5C38ADA3F5E52F5A5B2A1224B0CA60211B430E9554F0C4CA672476562C4A182B6707EBE80DFA6247A1F870F74EC81D03558F2718409EBF8E7F2FD2C6AB1F246F7E3FE0D919DB4016A7D76F6378D05EA74766CBB93340F2CBDDF18073F39242F3E9EC88020D1E8F801183C00F0239B2F2B4E8F6B46DBC17F469A857C291C985D8AC2099A6FEDC462B5EAEF737831EA2B6C9D787DC5AC8DA2C2E8F7F676FDA4CDD79E400EED959882C78C279C4D0A5918A0F5FC3B695E0034F7C2665D52D94106744D6B0CD6A66AB3275324EFDC06ECCF431D446446A00818ECDBE77B845699FB4F699825702D00F71373D80452039ECA1237AD2A0DF9112BA1EC90FB9FB87CF4E46BD0319B64F2EFD4B9640469707DB549468781D0BA6F3C49AF035D441173786BB1F2F5DCCE07BBF5536A0EB5B976814ABFDB44B90E55455972701A8F0D8EFB860A082ABA960E704754F61C2E3956922833F3D7E1656476DEE3C4F09244AC15697EA4A73041F03EEDE1F30BF899098A70F33FEC8962B
-20241129100858 2 6 100 6143 2 DCBE8A152DD5DE612BFCCD18CAB2BDE17391AF9DA865DCC59A1B454144ADE2EB8BE3CDBA7948CD1236CFC25D66DDC0E91095FB7E17715247413BBFD5435223F46488AD93808AF9FAF7D473C7CCE55DAA83B417FC6C09BFF7E332BD4B3BC59CBA4FE035A6C416D32BDCF8C3B9AFC5E1120CFD420023FD8EB207DB965509E2D362B0EB3D8CBD191D2750EBEB05F32C4BE08154D991F08DE4914BC40FAA7172440F2FEFB0FBF604DDA9C18BA9FD55F34218FD5D7CA2AC491CEDC3C5743D143BAF6C06CCAB7E5B22AB4E46CD51962CC7931F4D35581D5DD3047B946044BF7E71955EB63DD546644D7D2A19777DA39A48B4CF5A011A5C41F1BFF7C463F057F2F7AF6F910E7E06398B0AF7EF38CD5BBAE4C5FF42572CFFFCA6A8E9D34F64A7BECDC93216B55C20FAECAF04A8956C4D26DEE34493510BC49144A32A1B0AAE64B50DCA0C27361692242FE3145A6B36B830DEBF9E8A07A886E8DA6F38F3E99906F6AC9317ADF73222C4C75ABD153F1112E01E7CBB49665F213A1C1470CDC442D7CDC72EE2DD80D37251333C34FFDC5C38ADA3F5E52F5A5B2A1224B0CA60211B430E9554F0C4CA672476562C4A182B6707EBE80DFA6247A1F870F74EC81D03558F2718409EBF8E7F2FD2C6AB1F246F7E3FE0D919DB4016A7D76F6378D05EA74766CBB93340F2CBDDF18073F39242F3E9EC88020D1E8F801183C00F0239B2F2B4E8F6B46DBC17F469A857C291C985D8AC2099A6FEDC462B5EAEF737831EA2B6C9D787DC5AC8DA2C2E8F7F676FDA4CDD79E400EED959882C78C279C4D0A5918A0F5FC3B695E0034F7C2665D52D94106744D6B0CD6A66AB3275324EFDC06ECCF431D446446A00818ECDBE77B845699FB4F699825702D00F71373D80452039ECA1237AD2A0DF9112BA1EC90FB9FB87CF4E46BD0319B64F2EFD4B9640469707DB549468781D0BA6F3C49AF035D441173786BB1F2F5DCCE07BBF5536A0EB5B976814ABFDB44B90E55455972701A8F0D8EFB860A082ABA960E704754F61C2E3956922833F3D7E1656476DEE3C4F09244AC15697EA4A73041F03EEDE1F30BF899098A70F3405C51773
-20241129101114 2 6 100 6143 2 DCBE8A152DD5DE612BFCCD18CAB2BDE17391AF9DA865DCC59A1B454144ADE2EB8BE3CDBA7948CD1236CFC25D66DDC0E91095FB7E17715247413BBFD5435223F46488AD93808AF9FAF7D473C7CCE55DAA83B417FC6C09BFF7E332BD4B3BC59CBA4FE035A6C416D32BDCF8C3B9AFC5E1120CFD420023FD8EB207DB965509E2D362B0EB3D8CBD191D2750EBEB05F32C4BE08154D991F08DE4914BC40FAA7172440F2FEFB0FBF604DDA9C18BA9FD55F34218FD5D7CA2AC491CEDC3C5743D143BAF6C06CCAB7E5B22AB4E46CD51962CC7931F4D35581D5DD3047B946044BF7E71955EB63DD546644D7D2A19777DA39A48B4CF5A011A5C41F1BFF7C463F057F2F7AF6F910E7E06398B0AF7EF38CD5BBAE4C5FF42572CFFFCA6A8E9D34F64A7BECDC93216B55C20FAECAF04A8956C4D26DEE34493510BC49144A32A1B0AAE64B50DCA0C27361692242FE3145A6B36B830DEBF9E8A07A886E8DA6F38F3E99906F6AC9317ADF73222C4C75ABD153F1112E01E7CBB49665F213A1C1470CDC442D7CDC72EE2DD80D37251333C34FFDC5C38ADA3F5E52F5A5B2A1224B0CA60211B430E9554F0C4CA672476562C4A182B6707EBE80DFA6247A1F870F74EC81D03558F2718409EBF8E7F2FD2C6AB1F246F7E3FE0D919DB4016A7D76F6378D05EA74766CBB93340F2CBDDF18073F39242F3E9EC88020D1E8F801183C00F0239B2F2B4E8F6B46DBC17F469A857C291C985D8AC2099A6FEDC462B5EAEF737831EA2B6C9D787DC5AC8DA2C2E8F7F676FDA4CDD79E400EED959882C78C279C4D0A5918A0F5FC3B695E0034F7C2665D52D94106744D6B0CD6A66AB3275324EFDC06ECCF431D446446A00818ECDBE77B845699FB4F699825702D00F71373D80452039ECA1237AD2A0DF9112BA1EC90FB9FB87CF4E46BD0319B64F2EFD4B9640469707DB549468781D0BA6F3C49AF035D441173786BB1F2F5DCCE07BBF5536A0EB5B976814ABFDB44B90E55455972701A8F0D8EFB860A082ABA960E704754F61C2E3956922833F3D7E1656476DEE3C4F09244AC15697EA4A73041F03EEDE1F30BF899098A70F3405F7D2BB
-20241129101614 2 6 100 6143 2 DCBE8A152DD5DE612BFCCD18CAB2BDE17391AF9DA865DCC59A1B454144ADE2EB8BE3CDBA7948CD1236CFC25D66DDC0E91095FB7E17715247413BBFD5435223F46488AD93808AF9FAF7D473C7CCE55DAA83B417FC6C09BFF7E332BD4B3BC59CBA4FE035A6C416D32BDCF8C3B9AFC5E1120CFD420023FD8EB207DB965509E2D362B0EB3D8CBD191D2750EBEB05F32C4BE08154D991F08DE4914BC40FAA7172440F2FEFB0FBF604DDA9C18BA9FD55F34218FD5D7CA2AC491CEDC3C5743D143BAF6C06CCAB7E5B22AB4E46CD51962CC7931F4D35581D5DD3047B946044BF7E71955EB63DD546644D7D2A19777DA39A48B4CF5A011A5C41F1BFF7C463F057F2F7AF6F910E7E06398B0AF7EF38CD5BBAE4C5FF42572CFFFCA6A8E9D34F64A7BECDC93216B55C20FAECAF04A8956C4D26DEE34493510BC49144A32A1B0AAE64B50DCA0C27361692242FE3145A6B36B830DEBF9E8A07A886E8DA6F38F3E99906F6AC9317ADF73222C4C75ABD153F1112E01E7CBB49665F213A1C1470CDC442D7CDC72EE2DD80D37251333C34FFDC5C38ADA3F5E52F5A5B2A1224B0CA60211B430E9554F0C4CA672476562C4A182B6707EBE80DFA6247A1F870F74EC81D03558F2718409EBF8E7F2FD2C6AB1F246F7E3FE0D919DB4016A7D76F6378D05EA74766CBB93340F2CBDDF18073F39242F3E9EC88020D1E8F801183C00F0239B2F2B4E8F6B46DBC17F469A857C291C985D8AC2099A6FEDC462B5EAEF737831EA2B6C9D787DC5AC8DA2C2E8F7F676FDA4CDD79E400EED959882C78C279C4D0A5918A0F5FC3B695E0034F7C2665D52D94106744D6B0CD6A66AB3275324EFDC06ECCF431D446446A00818ECDBE77B845699FB4F699825702D00F71373D80452039ECA1237AD2A0DF9112BA1EC90FB9FB87CF4E46BD0319B64F2EFD4B9640469707DB549468781D0BA6F3C49AF035D441173786BB1F2F5DCCE07BBF5536A0EB5B976814ABFDB44B90E55455972701A8F0D8EFB860A082ABA960E704754F61C2E3956922833F3D7E1656476DEE3C4F09244AC15697EA4A73041F03EEDE1F30BF899098A70F34068F4943
-20241129103634 2 6 100 6143 2 DCBE8A152DD5DE612BFCCD18CAB2BDE17391AF9DA865DCC59A1B454144ADE2EB8BE3CDBA7948CD1236CFC25D66DDC0E91095FB7E17715247413BBFD5435223F46488AD93808AF9FAF7D473C7CCE55DAA83B417FC6C09BFF7E332BD4B3BC59CBA4FE035A6C416D32BDCF8C3B9AFC5E1120CFD420023FD8EB207DB965509E2D362B0EB3D8CBD191D2750EBEB05F32C4BE08154D991F08DE4914BC40FAA7172440F2FEFB0FBF604DDA9C18BA9FD55F34218FD5D7CA2AC491CEDC3C5743D143BAF6C06CCAB7E5B22AB4E46CD51962CC7931F4D35581D5DD3047B946044BF7E71955EB63DD546644D7D2A19777DA39A48B4CF5A011A5C41F1BFF7C463F057F2F7AF6F910E7E06398B0AF7EF38CD5BBAE4C5FF42572CFFFCA6A8E9D34F64A7BECDC93216B55C20FAECAF04A8956C4D26DEE34493510BC49144A32A1B0AAE64B50DCA0C27361692242FE3145A6B36B830DEBF9E8A07A886E8DA6F38F3E99906F6AC9317ADF73222C4C75ABD153F1112E01E7CBB49665F213A1C1470CDC442D7CDC72EE2DD80D37251333C34FFDC5C38ADA3F5E52F5A5B2A1224B0CA60211B430E9554F0C4CA672476562C4A182B6707EBE80DFA6247A1F870F74EC81D03558F2718409EBF8E7F2FD2C6AB1F246F7E3FE0D919DB4016A7D76F6378D05EA74766CBB93340F2CBDDF18073F39242F3E9EC88020D1E8F801183C00F0239B2F2B4E8F6B46DBC17F469A857C291C985D8AC2099A6FEDC462B5EAEF737831EA2B6C9D787DC5AC8DA2C2E8F7F676FDA4CDD79E400EED959882C78C279C4D0A5918A0F5FC3B695E0034F7C2665D52D94106744D6B0CD6A66AB3275324EFDC06ECCF431D446446A00818ECDBE77B845699FB4F699825702D00F71373D80452039ECA1237AD2A0DF9112BA1EC90FB9FB87CF4E46BD0319B64F2EFD4B9640469707DB549468781D0BA6F3C49AF035D441173786BB1F2F5DCCE07BBF5536A0EB5B976814ABFDB44B90E55455972701A8F0D8EFB860A082ABA960E704754F61C2E3956922833F3D7E1656476DEE3C4F09244AC15697EA4A73041F03EEDE1F30BF899098A70F340916E6EB
-20241129103953 2 6 100 6143 2 DCBE8A152DD5DE612BFCCD18CAB2BDE17391AF9DA865DCC59A1B454144ADE2EB8BE3CDBA7948CD1236CFC25D66DDC0E91095FB7E17715247413BBFD5435223F46488AD93808AF9FAF7D473C7CCE55DAA83B417FC6C09BFF7E332BD4B3BC59CBA4FE035A6C416D32BDCF8C3B9AFC5E1120CFD420023FD8EB207DB965509E2D362B0EB3D8CBD191D2750EBEB05F32C4BE08154D991F08DE4914BC40FAA7172440F2FEFB0FBF604DDA9C18BA9FD55F34218FD5D7CA2AC491CEDC3C5743D143BAF6C06CCAB7E5B22AB4E46CD51962CC7931F4D35581D5DD3047B946044BF7E71955EB63DD546644D7D2A19777DA39A48B4CF5A011A5C41F1BFF7C463F057F2F7AF6F910E7E06398B0AF7EF38CD5BBAE4C5FF42572CFFFCA6A8E9D34F64A7BECDC93216B55C20FAECAF04A8956C4D26DEE34493510BC49144A32A1B0AAE64B50DCA0C27361692242FE3145A6B36B830DEBF9E8A07A886E8DA6F38F3E99906F6AC9317ADF73222C4C75ABD153F1112E01E7CBB49665F213A1C1470CDC442D7CDC72EE2DD80D37251333C34FFDC5C38ADA3F5E52F5A5B2A1224B0CA60211B430E9554F0C4CA672476562C4A182B6707EBE80DFA6247A1F870F74EC81D03558F2718409EBF8E7F2FD2C6AB1F246F7E3FE0D919DB4016A7D76F6378D05EA74766CBB93340F2CBDDF18073F39242F3E9EC88020D1E8F801183C00F0239B2F2B4E8F6B46DBC17F469A857C291C985D8AC2099A6FEDC462B5EAEF737831EA2B6C9D787DC5AC8DA2C2E8F7F676FDA4CDD79E400EED959882C78C279C4D0A5918A0F5FC3B695E0034F7C2665D52D94106744D6B0CD6A66AB3275324EFDC06ECCF431D446446A00818ECDBE77B845699FB4F699825702D00F71373D80452039ECA1237AD2A0DF9112BA1EC90FB9FB87CF4E46BD0319B64F2EFD4B9640469707DB549468781D0BA6F3C49AF035D441173786BB1F2F5DCCE07BBF5536A0EB5B976814ABFDB44B90E55455972701A8F0D8EFB860A082ABA960E704754F61C2E3956922833F3D7E1656476DEE3C4F09244AC15697EA4A73041F03EEDE1F30BF899098A70F34097696F3
-20241129104959 2 6 100 6143 2 DCBE8A152DD5DE612BFCCD18CAB2BDE17391AF9DA865DCC59A1B454144ADE2EB8BE3CDBA7948CD1236CFC25D66DDC0E91095FB7E17715247413BBFD5435223F46488AD93808AF9FAF7D473C7CCE55DAA83B417FC6C09BFF7E332BD4B3BC59CBA4FE035A6C416D32BDCF8C3B9AFC5E1120CFD420023FD8EB207DB965509E2D362B0EB3D8CBD191D2750EBEB05F32C4BE08154D991F08DE4914BC40FAA7172440F2FEFB0FBF604DDA9C18BA9FD55F34218FD5D7CA2AC491CEDC3C5743D143BAF6C06CCAB7E5B22AB4E46CD51962CC7931F4D35581D5DD3047B946044BF7E71955EB63DD546644D7D2A19777DA39A48B4CF5A011A5C41F1BFF7C463F057F2F7AF6F910E7E06398B0AF7EF38CD5BBAE4C5FF42572CFFFCA6A8E9D34F64A7BECDC93216B55C20FAECAF04A8956C4D26DEE34493510BC49144A32A1B0AAE64B50DCA0C27361692242FE3145A6B36B830DEBF9E8A07A886E8DA6F38F3E99906F6AC9317ADF73222C4C75ABD153F1112E01E7CBB49665F213A1C1470CDC442D7CDC72EE2DD80D37251333C34FFDC5C38ADA3F5E52F5A5B2A1224B0CA60211B430E9554F0C4CA672476562C4A182B6707EBE80DFA6247A1F870F74EC81D03558F2718409EBF8E7F2FD2C6AB1F246F7E3FE0D919DB4016A7D76F6378D05EA74766CBB93340F2CBDDF18073F39242F3E9EC88020D1E8F801183C00F0239B2F2B4E8F6B46DBC17F469A857C291C985D8AC2099A6FEDC462B5EAEF737831EA2B6C9D787DC5AC8DA2C2E8F7F676FDA4CDD79E400EED959882C78C279C4D0A5918A0F5FC3B695E0034F7C2665D52D94106744D6B0CD6A66AB3275324EFDC06ECCF431D446446A00818ECDBE77B845699FB4F699825702D00F71373D80452039ECA1237AD2A0DF9112BA1EC90FB9FB87CF4E46BD0319B64F2EFD4B9640469707DB549468781D0BA6F3C49AF035D441173786BB1F2F5DCCE07BBF5536A0EB5B976814ABFDB44B90E55455972701A8F0D8EFB860A082ABA960E704754F61C2E3956922833F3D7E1656476DEE3C4F09244AC15697EA4A73041F03EEDE1F30BF899098A70F340AAE5B3B
-20241129112051 2 6 100 6143 5 DCBE8A152DD5DE612BFCCD18CAB2BDE17391AF9DA865DCC59A1B454144ADE2EB8BE3CDBA7948CD1236CFC25D66DDC0E91095FB7E17715247413BBFD5435223F46488AD93808AF9FAF7D473C7CCE55DAA83B417FC6C09BFF7E332BD4B3BC59CBA4FE035A6C416D32BDCF8C3B9AFC5E1120CFD420023FD8EB207DB965509E2D362B0EB3D8CBD191D2750EBEB05F32C4BE08154D991F08DE4914BC40FAA7172440F2FEFB0FBF604DDA9C18BA9FD55F34218FD5D7CA2AC491CEDC3C5743D143BAF6C06CCAB7E5B22AB4E46CD51962CC7931F4D35581D5DD3047B946044BF7E71955EB63DD546644D7D2A19777DA39A48B4CF5A011A5C41F1BFF7C463F057F2F7AF6F910E7E06398B0AF7EF38CD5BBAE4C5FF42572CFFFCA6A8E9D34F64A7BECDC93216B55C20FAECAF04A8956C4D26DEE34493510BC49144A32A1B0AAE64B50DCA0C27361692242FE3145A6B36B830DEBF9E8A07A886E8DA6F38F3E99906F6AC9317ADF73222C4C75ABD153F1112E01E7CBB49665F213A1C1470CDC442D7CDC72EE2DD80D37251333C34FFDC5C38ADA3F5E52F5A5B2A1224B0CA60211B430E9554F0C4CA672476562C4A182B6707EBE80DFA6247A1F870F74EC81D03558F2718409EBF8E7F2FD2C6AB1F246F7E3FE0D919DB4016A7D76F6378D05EA74766CBB93340F2CBDDF18073F39242F3E9EC88020D1E8F801183C00F0239B2F2B4E8F6B46DBC17F469A857C291C985D8AC2099A6FEDC462B5EAEF737831EA2B6C9D787DC5AC8DA2C2E8F7F676FDA4CDD79E400EED959882C78C279C4D0A5918A0F5FC3B695E0034F7C2665D52D94106744D6B0CD6A66AB3275324EFDC06ECCF431D446446A00818ECDBE77B845699FB4F699825702D00F71373D80452039ECA1237AD2A0DF9112BA1EC90FB9FB87CF4E46BD0319B64F2EFD4B9640469707DB549468781D0BA6F3C49AF035D441173786BB1F2F5DCCE07BBF5536A0EB5B976814ABFDB44B90E55455972701A8F0D8EFB860A082ABA960E704754F61C2E3956922833F3D7E1656476DEE3C4F09244AC15697EA4A73041F03EEDE1F30BF899098A70F340E9853AF
-20241129124108 2 6 100 6143 2 DCBE8A152DD5DE612BFCCD18CAB2BDE17391AF9DA865DCC59A1B454144ADE2EB8BE3CDBA7948CD1236CFC25D66DDC0E91095FB7E17715247413BBFD5435223F46488AD93808AF9FAF7D473C7CCE55DAA83B417FC6C09BFF7E332BD4B3BC59CBA4FE035A6C416D32BDCF8C3B9AFC5E1120CFD420023FD8EB207DB965509E2D362B0EB3D8CBD191D2750EBEB05F32C4BE08154D991F08DE4914BC40FAA7172440F2FEFB0FBF604DDA9C18BA9FD55F34218FD5D7CA2AC491CEDC3C5743D143BAF6C06CCAB7E5B22AB4E46CD51962CC7931F4D35581D5DD3047B946044BF7E71955EB63DD546644D7D2A19777DA39A48B4CF5A011A5C41F1BFF7C463F057F2F7AF6F910E7E06398B0AF7EF38CD5BBAE4C5FF42572CFFFCA6A8E9D34F64A7BECDC93216B55C20FAECAF04A8956C4D26DEE34493510BC49144A32A1B0AAE64B50DCA0C27361692242FE3145A6B36B830DEBF9E8A07A886E8DA6F38F3E99906F6AC9317ADF73222C4C75ABD153F1112E01E7CBB49665F213A1C1470CDC442D7CDC72EE2DD80D37251333C34FFDC5C38ADA3F5E52F5A5B2A1224B0CA60211B430E9554F0C4CA672476562C4A182B6707EBE80DFA6247A1F870F74EC81D03558F2718409EBF8E7F2FD2C6AB1F246F7E3FE0D919DB4016A7D76F6378D05EA74766CBB93340F2CBDDF18073F39242F3E9EC88020D1E8F801183C00F0239B2F2B4E8F6B46DBC17F469A857C291C985D8AC2099A6FEDC462B5EAEF737831EA2B6C9D787DC5AC8DA2C2E8F7F676FDA4CDD79E400EED959882C78C279C4D0A5918A0F5FC3B695E0034F7C2665D52D94106744D6B0CD6A66AB3275324EFDC06ECCF431D446446A00818ECDBE77B845699FB4F699825702D00F71373D80452039ECA1237AD2A0DF9112BA1EC90FB9FB87CF4E46BD0319B64F2EFD4B9640469707DB549468781D0BA6F3C49AF035D441173786BB1F2F5DCCE07BBF5536A0EB5B976814ABFDB44B90E55455972701A8F0D8EFB860A082ABA960E704754F61C2E3956922833F3D7E1656476DEE3C4F09244AC15697EA4A73041F03EEDE1F30BF899098A70F3418BD011B
-20241129125049 2 6 100 6143 5 DCBE8A152DD5DE612BFCCD18CAB2BDE17391AF9DA865DCC59A1B454144ADE2EB8BE3CDBA7948CD1236CFC25D66DDC0E91095FB7E17715247413BBFD5435223F46488AD93808AF9FAF7D473C7CCE55DAA83B417FC6C09BFF7E332BD4B3BC59CBA4FE035A6C416D32BDCF8C3B9AFC5E1120CFD420023FD8EB207DB965509E2D362B0EB3D8CBD191D2750EBEB05F32C4BE08154D991F08DE4914BC40FAA7172440F2FEFB0FBF604DDA9C18BA9FD55F34218FD5D7CA2AC491CEDC3C5743D143BAF6C06CCAB7E5B22AB4E46CD51962CC7931F4D35581D5DD3047B946044BF7E71955EB63DD546644D7D2A19777DA39A48B4CF5A011A5C41F1BFF7C463F057F2F7AF6F910E7E06398B0AF7EF38CD5BBAE4C5FF42572CFFFCA6A8E9D34F64A7BECDC93216B55C20FAECAF04A8956C4D26DEE34493510BC49144A32A1B0AAE64B50DCA0C27361692242FE3145A6B36B830DEBF9E8A07A886E8DA6F38F3E99906F6AC9317ADF73222C4C75ABD153F1112E01E7CBB49665F213A1C1470CDC442D7CDC72EE2DD80D37251333C34FFDC5C38ADA3F5E52F5A5B2A1224B0CA60211B430E9554F0C4CA672476562C4A182B6707EBE80DFA6247A1F870F74EC81D03558F2718409EBF8E7F2FD2C6AB1F246F7E3FE0D919DB4016A7D76F6378D05EA74766CBB93340F2CBDDF18073F39242F3E9EC88020D1E8F801183C00F0239B2F2B4E8F6B46DBC17F469A857C291C985D8AC2099A6FEDC462B5EAEF737831EA2B6C9D787DC5AC8DA2C2E8F7F676FDA4CDD79E400EED959882C78C279C4D0A5918A0F5FC3B695E0034F7C2665D52D94106744D6B0CD6A66AB3275324EFDC06ECCF431D446446A00818ECDBE77B845699FB4F699825702D00F71373D80452039ECA1237AD2A0DF9112BA1EC90FB9FB87CF4E46BD0319B64F2EFD4B9640469707DB549468781D0BA6F3C49AF035D441173786BB1F2F5DCCE07BBF5536A0EB5B976814ABFDB44B90E55455972701A8F0D8EFB860A082ABA960E704754F61C2E3956922833F3D7E1656476DEE3C4F09244AC15697EA4A73041F03EEDE1F30BF899098A70F3419E8F797
-20241129125233 2 6 100 6143 5 DCBE8A152DD5DE612BFCCD18CAB2BDE17391AF9DA865DCC59A1B454144ADE2EB8BE3CDBA7948CD1236CFC25D66DDC0E91095FB7E17715247413BBFD5435223F46488AD93808AF9FAF7D473C7CCE55DAA83B417FC6C09BFF7E332BD4B3BC59CBA4FE035A6C416D32BDCF8C3B9AFC5E1120CFD420023FD8EB207DB965509E2D362B0EB3D8CBD191D2750EBEB05F32C4BE08154D991F08DE4914BC40FAA7172440F2FEFB0FBF604DDA9C18BA9FD55F34218FD5D7CA2AC491CEDC3C5743D143BAF6C06CCAB7E5B22AB4E46CD51962CC7931F4D35581D5DD3047B946044BF7E71955EB63DD546644D7D2A19777DA39A48B4CF5A011A5C41F1BFF7C463F057F2F7AF6F910E7E06398B0AF7EF38CD5BBAE4C5FF42572CFFFCA6A8E9D34F64A7BECDC93216B55C20FAECAF04A8956C4D26DEE34493510BC49144A32A1B0AAE64B50DCA0C27361692242FE3145A6B36B830DEBF9E8A07A886E8DA6F38F3E99906F6AC9317ADF73222C4C75ABD153F1112E01E7CBB49665F213A1C1470CDC442D7CDC72EE2DD80D37251333C34FFDC5C38ADA3F5E52F5A5B2A1224B0CA60211B430E9554F0C4CA672476562C4A182B6707EBE80DFA6247A1F870F74EC81D03558F2718409EBF8E7F2FD2C6AB1F246F7E3FE0D919DB4016A7D76F6378D05EA74766CBB93340F2CBDDF18073F39242F3E9EC88020D1E8F801183C00F0239B2F2B4E8F6B46DBC17F469A857C291C985D8AC2099A6FEDC462B5EAEF737831EA2B6C9D787DC5AC8DA2C2E8F7F676FDA4CDD79E400EED959882C78C279C4D0A5918A0F5FC3B695E0034F7C2665D52D94106744D6B0CD6A66AB3275324EFDC06ECCF431D446446A00818ECDBE77B845699FB4F699825702D00F71373D80452039ECA1237AD2A0DF9112BA1EC90FB9FB87CF4E46BD0319B64F2EFD4B9640469707DB549468781D0BA6F3C49AF035D441173786BB1F2F5DCCE07BBF5536A0EB5B976814ABFDB44B90E55455972701A8F0D8EFB860A082ABA960E704754F61C2E3956922833F3D7E1656476DEE3C4F09244AC15697EA4A73041F03EEDE1F30BF899098A70F341A1B7937
-20241129130334 2 6 100 6143 2 DCBE8A152DD5DE612BFCCD18CAB2BDE17391AF9DA865DCC59A1B454144ADE2EB8BE3CDBA7948CD1236CFC25D66DDC0E91095FB7E17715247413BBFD5435223F46488AD93808AF9FAF7D473C7CCE55DAA83B417FC6C09BFF7E332BD4B3BC59CBA4FE035A6C416D32BDCF8C3B9AFC5E1120CFD420023FD8EB207DB965509E2D362B0EB3D8CBD191D2750EBEB05F32C4BE08154D991F08DE4914BC40FAA7172440F2FEFB0FBF604DDA9C18BA9FD55F34218FD5D7CA2AC491CEDC3C5743D143BAF6C06CCAB7E5B22AB4E46CD51962CC7931F4D35581D5DD3047B946044BF7E71955EB63DD546644D7D2A19777DA39A48B4CF5A011A5C41F1BFF7C463F057F2F7AF6F910E7E06398B0AF7EF38CD5BBAE4C5FF42572CFFFCA6A8E9D34F64A7BECDC93216B55C20FAECAF04A8956C4D26DEE34493510BC49144A32A1B0AAE64B50DCA0C27361692242FE3145A6B36B830DEBF9E8A07A886E8DA6F38F3E99906F6AC9317ADF73222C4C75ABD153F1112E01E7CBB49665F213A1C1470CDC442D7CDC72EE2DD80D37251333C34FFDC5C38ADA3F5E52F5A5B2A1224B0CA60211B430E9554F0C4CA672476562C4A182B6707EBE80DFA6247A1F870F74EC81D03558F2718409EBF8E7F2FD2C6AB1F246F7E3FE0D919DB4016A7D76F6378D05EA74766CBB93340F2CBDDF18073F39242F3E9EC88020D1E8F801183C00F0239B2F2B4E8F6B46DBC17F469A857C291C985D8AC2099A6FEDC462B5EAEF737831EA2B6C9D787DC5AC8DA2C2E8F7F676FDA4CDD79E400EED959882C78C279C4D0A5918A0F5FC3B695E0034F7C2665D52D94106744D6B0CD6A66AB3275324EFDC06ECCF431D446446A00818ECDBE77B845699FB4F699825702D00F71373D80452039ECA1237AD2A0DF9112BA1EC90FB9FB87CF4E46BD0319B64F2EFD4B9640469707DB549468781D0BA6F3C49AF035D441173786BB1F2F5DCCE07BBF5536A0EB5B976814ABFDB44B90E55455972701A8F0D8EFB860A082ABA960E704754F61C2E3956922833F3D7E1656476DEE3C4F09244AC15697EA4A73041F03EEDE1F30BF899098A70F341B7BA49B
-20241129130855 2 6 100 6143 2 DCBE8A152DD5DE612BFCCD18CAB2BDE17391AF9DA865DCC59A1B454144ADE2EB8BE3CDBA7948CD1236CFC25D66DDC0E91095FB7E17715247413BBFD5435223F46488AD93808AF9FAF7D473C7CCE55DAA83B417FC6C09BFF7E332BD4B3BC59CBA4FE035A6C416D32BDCF8C3B9AFC5E1120CFD420023FD8EB207DB965509E2D362B0EB3D8CBD191D2750EBEB05F32C4BE08154D991F08DE4914BC40FAA7172440F2FEFB0FBF604DDA9C18BA9FD55F34218FD5D7CA2AC491CEDC3C5743D143BAF6C06CCAB7E5B22AB4E46CD51962CC7931F4D35581D5DD3047B946044BF7E71955EB63DD546644D7D2A19777DA39A48B4CF5A011A5C41F1BFF7C463F057F2F7AF6F910E7E06398B0AF7EF38CD5BBAE4C5FF42572CFFFCA6A8E9D34F64A7BECDC93216B55C20FAECAF04A8956C4D26DEE34493510BC49144A32A1B0AAE64B50DCA0C27361692242FE3145A6B36B830DEBF9E8A07A886E8DA6F38F3E99906F6AC9317ADF73222C4C75ABD153F1112E01E7CBB49665F213A1C1470CDC442D7CDC72EE2DD80D37251333C34FFDC5C38ADA3F5E52F5A5B2A1224B0CA60211B430E9554F0C4CA672476562C4A182B6707EBE80DFA6247A1F870F74EC81D03558F2718409EBF8E7F2FD2C6AB1F246F7E3FE0D919DB4016A7D76F6378D05EA74766CBB93340F2CBDDF18073F39242F3E9EC88020D1E8F801183C00F0239B2F2B4E8F6B46DBC17F469A857C291C985D8AC2099A6FEDC462B5EAEF737831EA2B6C9D787DC5AC8DA2C2E8F7F676FDA4CDD79E400EED959882C78C279C4D0A5918A0F5FC3B695E0034F7C2665D52D94106744D6B0CD6A66AB3275324EFDC06ECCF431D446446A00818ECDBE77B845699FB4F699825702D00F71373D80452039ECA1237AD2A0DF9112BA1EC90FB9FB87CF4E46BD0319B64F2EFD4B9640469707DB549468781D0BA6F3C49AF035D441173786BB1F2F5DCCE07BBF5536A0EB5B976814ABFDB44B90E55455972701A8F0D8EFB860A082ABA960E704754F61C2E3956922833F3D7E1656476DEE3C4F09244AC15697EA4A73041F03EEDE1F30BF899098A70F341C2258EB
-20241129130953 2 6 100 6143 5 DCBE8A152DD5DE612BFCCD18CAB2BDE17391AF9DA865DCC59A1B454144ADE2EB8BE3CDBA7948CD1236CFC25D66DDC0E91095FB7E17715247413BBFD5435223F46488AD93808AF9FAF7D473C7CCE55DAA83B417FC6C09BFF7E332BD4B3BC59CBA4FE035A6C416D32BDCF8C3B9AFC5E1120CFD420023FD8EB207DB965509E2D362B0EB3D8CBD191D2750EBEB05F32C4BE08154D991F08DE4914BC40FAA7172440F2FEFB0FBF604DDA9C18BA9FD55F34218FD5D7CA2AC491CEDC3C5743D143BAF6C06CCAB7E5B22AB4E46CD51962CC7931F4D35581D5DD3047B946044BF7E71955EB63DD546644D7D2A19777DA39A48B4CF5A011A5C41F1BFF7C463F057F2F7AF6F910E7E06398B0AF7EF38CD5BBAE4C5FF42572CFFFCA6A8E9D34F64A7BECDC93216B55C20FAECAF04A8956C4D26DEE34493510BC49144A32A1B0AAE64B50DCA0C27361692242FE3145A6B36B830DEBF9E8A07A886E8DA6F38F3E99906F6AC9317ADF73222C4C75ABD153F1112E01E7CBB49665F213A1C1470CDC442D7CDC72EE2DD80D37251333C34FFDC5C38ADA3F5E52F5A5B2A1224B0CA60211B430E9554F0C4CA672476562C4A182B6707EBE80DFA6247A1F870F74EC81D03558F2718409EBF8E7F2FD2C6AB1F246F7E3FE0D919DB4016A7D76F6378D05EA74766CBB93340F2CBDDF18073F39242F3E9EC88020D1E8F801183C00F0239B2F2B4E8F6B46DBC17F469A857C291C985D8AC2099A6FEDC462B5EAEF737831EA2B6C9D787DC5AC8DA2C2E8F7F676FDA4CDD79E400EED959882C78C279C4D0A5918A0F5FC3B695E0034F7C2665D52D94106744D6B0CD6A66AB3275324EFDC06ECCF431D446446A00818ECDBE77B845699FB4F699825702D00F71373D80452039ECA1237AD2A0DF9112BA1EC90FB9FB87CF4E46BD0319B64F2EFD4B9640469707DB549468781D0BA6F3C49AF035D441173786BB1F2F5DCCE07BBF5536A0EB5B976814ABFDB44B90E55455972701A8F0D8EFB860A082ABA960E704754F61C2E3956922833F3D7E1656476DEE3C4F09244AC15697EA4A73041F03EEDE1F30BF899098A70F341C3B9397
-20241129131555 2 6 100 6143 2 DCBE8A152DD5DE612BFCCD18CAB2BDE17391AF9DA865DCC59A1B454144ADE2EB8BE3CDBA7948CD1236CFC25D66DDC0E91095FB7E17715247413BBFD5435223F46488AD93808AF9FAF7D473C7CCE55DAA83B417FC6C09BFF7E332BD4B3BC59CBA4FE035A6C416D32BDCF8C3B9AFC5E1120CFD420023FD8EB207DB965509E2D362B0EB3D8CBD191D2750EBEB05F32C4BE08154D991F08DE4914BC40FAA7172440F2FEFB0FBF604DDA9C18BA9FD55F34218FD5D7CA2AC491CEDC3C5743D143BAF6C06CCAB7E5B22AB4E46CD51962CC7931F4D35581D5DD3047B946044BF7E71955EB63DD546644D7D2A19777DA39A48B4CF5A011A5C41F1BFF7C463F057F2F7AF6F910E7E06398B0AF7EF38CD5BBAE4C5FF42572CFFFCA6A8E9D34F64A7BECDC93216B55C20FAECAF04A8956C4D26DEE34493510BC49144A32A1B0AAE64B50DCA0C27361692242FE3145A6B36B830DEBF9E8A07A886E8DA6F38F3E99906F6AC9317ADF73222C4C75ABD153F1112E01E7CBB49665F213A1C1470CDC442D7CDC72EE2DD80D37251333C34FFDC5C38ADA3F5E52F5A5B2A1224B0CA60211B430E9554F0C4CA672476562C4A182B6707EBE80DFA6247A1F870F74EC81D03558F2718409EBF8E7F2FD2C6AB1F246F7E3FE0D919DB4016A7D76F6378D05EA74766CBB93340F2CBDDF18073F39242F3E9EC88020D1E8F801183C00F0239B2F2B4E8F6B46DBC17F469A857C291C985D8AC2099A6FEDC462B5EAEF737831EA2B6C9D787DC5AC8DA2C2E8F7F676FDA4CDD79E400EED959882C78C279C4D0A5918A0F5FC3B695E0034F7C2665D52D94106744D6B0CD6A66AB3275324EFDC06ECCF431D446446A00818ECDBE77B845699FB4F699825702D00F71373D80452039ECA1237AD2A0DF9112BA1EC90FB9FB87CF4E46BD0319B64F2EFD4B9640469707DB549468781D0BA6F3C49AF035D441173786BB1F2F5DCCE07BBF5536A0EB5B976814ABFDB44B90E55455972701A8F0D8EFB860A082ABA960E704754F61C2E3956922833F3D7E1656476DEE3C4F09244AC15697EA4A73041F03EEDE1F30BF899098A70F341CF54C93
-20241129131844 2 6 100 6143 5 DCBE8A152DD5DE612BFCCD18CAB2BDE17391AF9DA865DCC59A1B454144ADE2EB8BE3CDBA7948CD1236CFC25D66DDC0E91095FB7E17715247413BBFD5435223F46488AD93808AF9FAF7D473C7CCE55DAA83B417FC6C09BFF7E332BD4B3BC59CBA4FE035A6C416D32BDCF8C3B9AFC5E1120CFD420023FD8EB207DB965509E2D362B0EB3D8CBD191D2750EBEB05F32C4BE08154D991F08DE4914BC40FAA7172440F2FEFB0FBF604DDA9C18BA9FD55F34218FD5D7CA2AC491CEDC3C5743D143BAF6C06CCAB7E5B22AB4E46CD51962CC7931F4D35581D5DD3047B946044BF7E71955EB63DD546644D7D2A19777DA39A48B4CF5A011A5C41F1BFF7C463F057F2F7AF6F910E7E06398B0AF7EF38CD5BBAE4C5FF42572CFFFCA6A8E9D34F64A7BECDC93216B55C20FAECAF04A8956C4D26DEE34493510BC49144A32A1B0AAE64B50DCA0C27361692242FE3145A6B36B830DEBF9E8A07A886E8DA6F38F3E99906F6AC9317ADF73222C4C75ABD153F1112E01E7CBB49665F213A1C1470CDC442D7CDC72EE2DD80D37251333C34FFDC5C38ADA3F5E52F5A5B2A1224B0CA60211B430E9554F0C4CA672476562C4A182B6707EBE80DFA6247A1F870F74EC81D03558F2718409EBF8E7F2FD2C6AB1F246F7E3FE0D919DB4016A7D76F6378D05EA74766CBB93340F2CBDDF18073F39242F3E9EC88020D1E8F801183C00F0239B2F2B4E8F6B46DBC17F469A857C291C985D8AC2099A6FEDC462B5EAEF737831EA2B6C9D787DC5AC8DA2C2E8F7F676FDA4CDD79E400EED959882C78C279C4D0A5918A0F5FC3B695E0034F7C2665D52D94106744D6B0CD6A66AB3275324EFDC06ECCF431D446446A00818ECDBE77B845699FB4F699825702D00F71373D80452039ECA1237AD2A0DF9112BA1EC90FB9FB87CF4E46BD0319B64F2EFD4B9640469707DB549468781D0BA6F3C49AF035D441173786BB1F2F5DCCE07BBF5536A0EB5B976814ABFDB44B90E55455972701A8F0D8EFB860A082ABA960E704754F61C2E3956922833F3D7E1656476DEE3C4F09244AC15697EA4A73041F03EEDE1F30BF899098A70F341D474B9F
-20241129132228 2 6 100 6143 5 DCBE8A152DD5DE612BFCCD18CAB2BDE17391AF9DA865DCC59A1B454144ADE2EB8BE3CDBA7948CD1236CFC25D66DDC0E91095FB7E17715247413BBFD5435223F46488AD93808AF9FAF7D473C7CCE55DAA83B417FC6C09BFF7E332BD4B3BC59CBA4FE035A6C416D32BDCF8C3B9AFC5E1120CFD420023FD8EB207DB965509E2D362B0EB3D8CBD191D2750EBEB05F32C4BE08154D991F08DE4914BC40FAA7172440F2FEFB0FBF604DDA9C18BA9FD55F34218FD5D7CA2AC491CEDC3C5743D143BAF6C06CCAB7E5B22AB4E46CD51962CC7931F4D35581D5DD3047B946044BF7E71955EB63DD546644D7D2A19777DA39A48B4CF5A011A5C41F1BFF7C463F057F2F7AF6F910E7E06398B0AF7EF38CD5BBAE4C5FF42572CFFFCA6A8E9D34F64A7BECDC93216B55C20FAECAF04A8956C4D26DEE34493510BC49144A32A1B0AAE64B50DCA0C27361692242FE3145A6B36B830DEBF9E8A07A886E8DA6F38F3E99906F6AC9317ADF73222C4C75ABD153F1112E01E7CBB49665F213A1C1470CDC442D7CDC72EE2DD80D37251333C34FFDC5C38ADA3F5E52F5A5B2A1224B0CA60211B430E9554F0C4CA672476562C4A182B6707EBE80DFA6247A1F870F74EC81D03558F2718409EBF8E7F2FD2C6AB1F246F7E3FE0D919DB4016A7D76F6378D05EA74766CBB93340F2CBDDF18073F39242F3E9EC88020D1E8F801183C00F0239B2F2B4E8F6B46DBC17F469A857C291C985D8AC2099A6FEDC462B5EAEF737831EA2B6C9D787DC5AC8DA2C2E8F7F676FDA4CDD79E400EED959882C78C279C4D0A5918A0F5FC3B695E0034F7C2665D52D94106744D6B0CD6A66AB3275324EFDC06ECCF431D446446A00818ECDBE77B845699FB4F699825702D00F71373D80452039ECA1237AD2A0DF9112BA1EC90FB9FB87CF4E46BD0319B64F2EFD4B9640469707DB549468781D0BA6F3C49AF035D441173786BB1F2F5DCCE07BBF5536A0EB5B976814ABFDB44B90E55455972701A8F0D8EFB860A082ABA960E704754F61C2E3956922833F3D7E1656476DEE3C4F09244AC15697EA4A73041F03EEDE1F30BF899098A70F341DB5BA4F
-20241129134604 2 6 100 6143 2 DCBE8A152DD5DE612BFCCD18CAB2BDE17391AF9DA865DCC59A1B454144ADE2EB8BE3CDBA7948CD1236CFC25D66DDC0E91095FB7E17715247413BBFD5435223F46488AD93808AF9FAF7D473C7CCE55DAA83B417FC6C09BFF7E332BD4B3BC59CBA4FE035A6C416D32BDCF8C3B9AFC5E1120CFD420023FD8EB207DB965509E2D362B0EB3D8CBD191D2750EBEB05F32C4BE08154D991F08DE4914BC40FAA7172440F2FEFB0FBF604DDA9C18BA9FD55F34218FD5D7CA2AC491CEDC3C5743D143BAF6C06CCAB7E5B22AB4E46CD51962CC7931F4D35581D5DD3047B946044BF7E71955EB63DD546644D7D2A19777DA39A48B4CF5A011A5C41F1BFF7C463F057F2F7AF6F910E7E06398B0AF7EF38CD5BBAE4C5FF42572CFFFCA6A8E9D34F64A7BECDC93216B55C20FAECAF04A8956C4D26DEE34493510BC49144A32A1B0AAE64B50DCA0C27361692242FE3145A6B36B830DEBF9E8A07A886E8DA6F38F3E99906F6AC9317ADF73222C4C75ABD153F1112E01E7CBB49665F213A1C1470CDC442D7CDC72EE2DD80D37251333C34FFDC5C38ADA3F5E52F5A5B2A1224B0CA60211B430E9554F0C4CA672476562C4A182B6707EBE80DFA6247A1F870F74EC81D03558F2718409EBF8E7F2FD2C6AB1F246F7E3FE0D919DB4016A7D76F6378D05EA74766CBB93340F2CBDDF18073F39242F3E9EC88020D1E8F801183C00F0239B2F2B4E8F6B46DBC17F469A857C291C985D8AC2099A6FEDC462B5EAEF737831EA2B6C9D787DC5AC8DA2C2E8F7F676FDA4CDD79E400EED959882C78C279C4D0A5918A0F5FC3B695E0034F7C2665D52D94106744D6B0CD6A66AB3275324EFDC06ECCF431D446446A00818ECDBE77B845699FB4F699825702D00F71373D80452039ECA1237AD2A0DF9112BA1EC90FB9FB87CF4E46BD0319B64F2EFD4B9640469707DB549468781D0BA6F3C49AF035D441173786BB1F2F5DCCE07BBF5536A0EB5B976814ABFDB44B90E55455972701A8F0D8EFB860A082ABA960E704754F61C2E3956922833F3D7E1656476DEE3C4F09244AC15697EA4A73041F03EEDE1F30BF899098A70F3420A2EA6B
-20241129135907 2 6 100 6143 5 DCBE8A152DD5DE612BFCCD18CAB2BDE17391AF9DA865DCC59A1B454144ADE2EB8BE3CDBA7948CD1236CFC25D66DDC0E91095FB7E17715247413BBFD5435223F46488AD93808AF9FAF7D473C7CCE55DAA83B417FC6C09BFF7E332BD4B3BC59CBA4FE035A6C416D32BDCF8C3B9AFC5E1120CFD420023FD8EB207DB965509E2D362B0EB3D8CBD191D2750EBEB05F32C4BE08154D991F08DE4914BC40FAA7172440F2FEFB0FBF604DDA9C18BA9FD55F34218FD5D7CA2AC491CEDC3C5743D143BAF6C06CCAB7E5B22AB4E46CD51962CC7931F4D35581D5DD3047B946044BF7E71955EB63DD546644D7D2A19777DA39A48B4CF5A011A5C41F1BFF7C463F057F2F7AF6F910E7E06398B0AF7EF38CD5BBAE4C5FF42572CFFFCA6A8E9D34F64A7BECDC93216B55C20FAECAF04A8956C4D26DEE34493510BC49144A32A1B0AAE64B50DCA0C27361692242FE3145A6B36B830DEBF9E8A07A886E8DA6F38F3E99906F6AC9317ADF73222C4C75ABD153F1112E01E7CBB49665F213A1C1470CDC442D7CDC72EE2DD80D37251333C34FFDC5C38ADA3F5E52F5A5B2A1224B0CA60211B430E9554F0C4CA672476562C4A182B6707EBE80DFA6247A1F870F74EC81D03558F2718409EBF8E7F2FD2C6AB1F246F7E3FE0D919DB4016A7D76F6378D05EA74766CBB93340F2CBDDF18073F39242F3E9EC88020D1E8F801183C00F0239B2F2B4E8F6B46DBC17F469A857C291C985D8AC2099A6FEDC462B5EAEF737831EA2B6C9D787DC5AC8DA2C2E8F7F676FDA4CDD79E400EED959882C78C279C4D0A5918A0F5FC3B695E0034F7C2665D52D94106744D6B0CD6A66AB3275324EFDC06ECCF431D446446A00818ECDBE77B845699FB4F699825702D00F71373D80452039ECA1237AD2A0DF9112BA1EC90FB9FB87CF4E46BD0319B64F2EFD4B9640469707DB549468781D0BA6F3C49AF035D441173786BB1F2F5DCCE07BBF5536A0EB5B976814ABFDB44B90E55455972701A8F0D8EFB860A082ABA960E704754F61C2E3956922833F3D7E1656476DEE3C4F09244AC15697EA4A73041F03EEDE1F30BF899098A70F34223A233F
-20241129143314 2 6 100 6143 2 D530FFAD12BC56C29F02BEFEC6CFD700AE6DA852D7256FC0A8978C13FABF9851425A26917CD40A9919A06A5B17FA05456642891442CCBBBD9BB5B74068213AA6F029B3419F6B2CCB828CF9F6F0069F43A2496921ED8133BF2D9C598486282EB38B3B6E849B7D80B33869CDE1D71379C694BB9C229B5CCE5E96692F81DA73EC38942CE60A81657F34A6B1B536ADEADD76144A209815A88E081E0B96438B11A34E4F8082ACC6DD77D787EEA90E1764F7393D3869707FCFCD4BFEEA3582BBD39C17E2CE70B6A193700A055A50D2F5ED473DD9B4401C2138BAD8FA3331BDD4FF79E230C10B13FFE7CCDB3210F8DB42147BB8349CAEA97EBCBC708B9CE16360D573D3327BBCAA6387234E9A4DCB2E67784408ADB72B2E05643520211C581EBB38E57C2F69C9034143DBAB4C13221D501B892918779C6E9AC5B39F2F412E31EF7F7F0610C2AFE150FA56A5E3CF9DACA6C96F3BC6B57D56B2869019C5114247C080752E4D42B1A0E34302B69B8516E8FB93BE58CC45F6E5ADB47A89A00050A12D560BEEA8997F5A0FA526C107BA34ECB0C678079C6DD4C1F4666BBD45733E019C292A17661B79E6AEED002EF4F6E7F4D569690E140C8BA1BA47E626499E01DA1EACDA4B917507A472DDB03A86734994C4B16551C5DFED3C8C976D15B5BF68CC6C982355930E37F096629E6F3BDC8027C722C12EF76854F1C607341E48FBF8C9064EB48EFDA87E1D111B557FBE7A15A580EDD87AC2CEC0EB25BE057FC20D578DF34632977F4698D58B2025C50AD4AD77D16D32E6157F89F58C692A83279A2EB58F8E448A13AA32B8C3DF07A58100EC4BB319F824446ECDD643C4A7F959CBA4E356A9E5DB7332107B2EB478703BF44383DDF80CA297F5E52A4424AF64B50CAB4E9C95C7288B96F8E77CDC63D07C6394853DF32F926652A12122B5531F90CFDFDAAC5D0642F84CF3901717B652122E8622CF31C06D134AD921EC80D175BBFC45B855EB9ABF001686BC52730F754DBFAE781BB629F1E530632D813AA256D0063202AEEE0AB64C7829C1A6C4702E27C88219FF31500D8F76BEFE4AEF726D6E3B708C7A9949CB
-20241129150941 2 6 100 6143 2 D530FFAD12BC56C29F02BEFEC6CFD700AE6DA852D7256FC0A8978C13FABF9851425A26917CD40A9919A06A5B17FA05456642891442CCBBBD9BB5B74068213AA6F029B3419F6B2CCB828CF9F6F0069F43A2496921ED8133BF2D9C598486282EB38B3B6E849B7D80B33869CDE1D71379C694BB9C229B5CCE5E96692F81DA73EC38942CE60A81657F34A6B1B536ADEADD76144A209815A88E081E0B96438B11A34E4F8082ACC6DD77D787EEA90E1764F7393D3869707FCFCD4BFEEA3582BBD39C17E2CE70B6A193700A055A50D2F5ED473DD9B4401C2138BAD8FA3331BDD4FF79E230C10B13FFE7CCDB3210F8DB42147BB8349CAEA97EBCBC708B9CE16360D573D3327BBCAA6387234E9A4DCB2E67784408ADB72B2E05643520211C581EBB38E57C2F69C9034143DBAB4C13221D501B892918779C6E9AC5B39F2F412E31EF7F7F0610C2AFE150FA56A5E3CF9DACA6C96F3BC6B57D56B2869019C5114247C080752E4D42B1A0E34302B69B8516E8FB93BE58CC45F6E5ADB47A89A00050A12D560BEEA8997F5A0FA526C107BA34ECB0C678079C6DD4C1F4666BBD45733E019C292A17661B79E6AEED002EF4F6E7F4D569690E140C8BA1BA47E626499E01DA1EACDA4B917507A472DDB03A86734994C4B16551C5DFED3C8C976D15B5BF68CC6C982355930E37F096629E6F3BDC8027C722C12EF76854F1C607341E48FBF8C9064EB48EFDA87E1D111B557FBE7A15A580EDD87AC2CEC0EB25BE057FC20D578DF34632977F4698D58B2025C50AD4AD77D16D32E6157F89F58C692A83279A2EB58F8E448A13AA32B8C3DF07A58100EC4BB319F824446ECDD643C4A7F959CBA4E356A9E5DB7332107B2EB478703BF44383DDF80CA297F5E52A4424AF64B50CAB4E9C95C7288B96F8E77CDC63D07C6394853DF32F926652A12122B5531F90CFDFDAAC5D0642F84CF3901717B652122E8622CF31C06D134AD921EC80D175BBFC45B855EB9ABF001686BC52730F754DBFAE781BB629F1E530632D813AA256D0063202AEEE0AB64C7829C1A6C4702E27C88219FF31500D8F76BEFE4AEF726D6E3B708C7F2EAC9B
-20241129152304 2 6 100 6143 2 D530FFAD12BC56C29F02BEFEC6CFD700AE6DA852D7256FC0A8978C13FABF9851425A26917CD40A9919A06A5B17FA05456642891442CCBBBD9BB5B74068213AA6F029B3419F6B2CCB828CF9F6F0069F43A2496921ED8133BF2D9C598486282EB38B3B6E849B7D80B33869CDE1D71379C694BB9C229B5CCE5E96692F81DA73EC38942CE60A81657F34A6B1B536ADEADD76144A209815A88E081E0B96438B11A34E4F8082ACC6DD77D787EEA90E1764F7393D3869707FCFCD4BFEEA3582BBD39C17E2CE70B6A193700A055A50D2F5ED473DD9B4401C2138BAD8FA3331BDD4FF79E230C10B13FFE7CCDB3210F8DB42147BB8349CAEA97EBCBC708B9CE16360D573D3327BBCAA6387234E9A4DCB2E67784408ADB72B2E05643520211C581EBB38E57C2F69C9034143DBAB4C13221D501B892918779C6E9AC5B39F2F412E31EF7F7F0610C2AFE150FA56A5E3CF9DACA6C96F3BC6B57D56B2869019C5114247C080752E4D42B1A0E34302B69B8516E8FB93BE58CC45F6E5ADB47A89A00050A12D560BEEA8997F5A0FA526C107BA34ECB0C678079C6DD4C1F4666BBD45733E019C292A17661B79E6AEED002EF4F6E7F4D569690E140C8BA1BA47E626499E01DA1EACDA4B917507A472DDB03A86734994C4B16551C5DFED3C8C976D15B5BF68CC6C982355930E37F096629E6F3BDC8027C722C12EF76854F1C607341E48FBF8C9064EB48EFDA87E1D111B557FBE7A15A580EDD87AC2CEC0EB25BE057FC20D578DF34632977F4698D58B2025C50AD4AD77D16D32E6157F89F58C692A83279A2EB58F8E448A13AA32B8C3DF07A58100EC4BB319F824446ECDD643C4A7F959CBA4E356A9E5DB7332107B2EB478703BF44383DDF80CA297F5E52A4424AF64B50CAB4E9C95C7288B96F8E77CDC63D07C6394853DF32F926652A12122B5531F90CFDFDAAC5D0642F84CF3901717B652122E8622CF31C06D134AD921EC80D175BBFC45B855EB9ABF001686BC52730F754DBFAE781BB629F1E530632D813AA256D0063202AEEE0AB64C7829C1A6C4702E27C88219FF31500D8F76BEFE4AEF726D6E3B708C80D59DCB
-20241129153351 2 6 100 6143 5 D530FFAD12BC56C29F02BEFEC6CFD700AE6DA852D7256FC0A8978C13FABF9851425A26917CD40A9919A06A5B17FA05456642891442CCBBBD9BB5B74068213AA6F029B3419F6B2CCB828CF9F6F0069F43A2496921ED8133BF2D9C598486282EB38B3B6E849B7D80B33869CDE1D71379C694BB9C229B5CCE5E96692F81DA73EC38942CE60A81657F34A6B1B536ADEADD76144A209815A88E081E0B96438B11A34E4F8082ACC6DD77D787EEA90E1764F7393D3869707FCFCD4BFEEA3582BBD39C17E2CE70B6A193700A055A50D2F5ED473DD9B4401C2138BAD8FA3331BDD4FF79E230C10B13FFE7CCDB3210F8DB42147BB8349CAEA97EBCBC708B9CE16360D573D3327BBCAA6387234E9A4DCB2E67784408ADB72B2E05643520211C581EBB38E57C2F69C9034143DBAB4C13221D501B892918779C6E9AC5B39F2F412E31EF7F7F0610C2AFE150FA56A5E3CF9DACA6C96F3BC6B57D56B2869019C5114247C080752E4D42B1A0E34302B69B8516E8FB93BE58CC45F6E5ADB47A89A00050A12D560BEEA8997F5A0FA526C107BA34ECB0C678079C6DD4C1F4666BBD45733E019C292A17661B79E6AEED002EF4F6E7F4D569690E140C8BA1BA47E626499E01DA1EACDA4B917507A472DDB03A86734994C4B16551C5DFED3C8C976D15B5BF68CC6C982355930E37F096629E6F3BDC8027C722C12EF76854F1C607341E48FBF8C9064EB48EFDA87E1D111B557FBE7A15A580EDD87AC2CEC0EB25BE057FC20D578DF34632977F4698D58B2025C50AD4AD77D16D32E6157F89F58C692A83279A2EB58F8E448A13AA32B8C3DF07A58100EC4BB319F824446ECDD643C4A7F959CBA4E356A9E5DB7332107B2EB478703BF44383DDF80CA297F5E52A4424AF64B50CAB4E9C95C7288B96F8E77CDC63D07C6394853DF32F926652A12122B5531F90CFDFDAAC5D0642F84CF3901717B652122E8622CF31C06D134AD921EC80D175BBFC45B855EB9ABF001686BC52730F754DBFAE781BB629F1E530632D813AA256D0063202AEEE0AB64C7829C1A6C4702E27C88219FF31500D8F76BEFE4AEF726D6E3B708C82259357
-20241129153442 2 6 100 6143 5 D530FFAD12BC56C29F02BEFEC6CFD700AE6DA852D7256FC0A8978C13FABF9851425A26917CD40A9919A06A5B17FA05456642891442CCBBBD9BB5B74068213AA6F029B3419F6B2CCB828CF9F6F0069F43A2496921ED8133BF2D9C598486282EB38B3B6E849B7D80B33869CDE1D71379C694BB9C229B5CCE5E96692F81DA73EC38942CE60A81657F34A6B1B536ADEADD76144A209815A88E081E0B96438B11A34E4F8082ACC6DD77D787EEA90E1764F7393D3869707FCFCD4BFEEA3582BBD39C17E2CE70B6A193700A055A50D2F5ED473DD9B4401C2138BAD8FA3331BDD4FF79E230C10B13FFE7CCDB3210F8DB42147BB8349CAEA97EBCBC708B9CE16360D573D3327BBCAA6387234E9A4DCB2E67784408ADB72B2E05643520211C581EBB38E57C2F69C9034143DBAB4C13221D501B892918779C6E9AC5B39F2F412E31EF7F7F0610C2AFE150FA56A5E3CF9DACA6C96F3BC6B57D56B2869019C5114247C080752E4D42B1A0E34302B69B8516E8FB93BE58CC45F6E5ADB47A89A00050A12D560BEEA8997F5A0FA526C107BA34ECB0C678079C6DD4C1F4666BBD45733E019C292A17661B79E6AEED002EF4F6E7F4D569690E140C8BA1BA47E626499E01DA1EACDA4B917507A472DDB03A86734994C4B16551C5DFED3C8C976D15B5BF68CC6C982355930E37F096629E6F3BDC8027C722C12EF76854F1C607341E48FBF8C9064EB48EFDA87E1D111B557FBE7A15A580EDD87AC2CEC0EB25BE057FC20D578DF34632977F4698D58B2025C50AD4AD77D16D32E6157F89F58C692A83279A2EB58F8E448A13AA32B8C3DF07A58100EC4BB319F824446ECDD643C4A7F959CBA4E356A9E5DB7332107B2EB478703BF44383DDF80CA297F5E52A4424AF64B50CAB4E9C95C7288B96F8E77CDC63D07C6394853DF32F926652A12122B5531F90CFDFDAAC5D0642F84CF3901717B652122E8622CF31C06D134AD921EC80D175BBFC45B855EB9ABF001686BC52730F754DBFAE781BB629F1E530632D813AA256D0063202AEEE0AB64C7829C1A6C4702E27C88219FF31500D8F76BEFE4AEF726D6E3B708C8239CBD7
-20241129154346 2 6 100 6143 2 D530FFAD12BC56C29F02BEFEC6CFD700AE6DA852D7256FC0A8978C13FABF9851425A26917CD40A9919A06A5B17FA05456642891442CCBBBD9BB5B74068213AA6F029B3419F6B2CCB828CF9F6F0069F43A2496921ED8133BF2D9C598486282EB38B3B6E849B7D80B33869CDE1D71379C694BB9C229B5CCE5E96692F81DA73EC38942CE60A81657F34A6B1B536ADEADD76144A209815A88E081E0B96438B11A34E4F8082ACC6DD77D787EEA90E1764F7393D3869707FCFCD4BFEEA3582BBD39C17E2CE70B6A193700A055A50D2F5ED473DD9B4401C2138BAD8FA3331BDD4FF79E230C10B13FFE7CCDB3210F8DB42147BB8349CAEA97EBCBC708B9CE16360D573D3327BBCAA6387234E9A4DCB2E67784408ADB72B2E05643520211C581EBB38E57C2F69C9034143DBAB4C13221D501B892918779C6E9AC5B39F2F412E31EF7F7F0610C2AFE150FA56A5E3CF9DACA6C96F3BC6B57D56B2869019C5114247C080752E4D42B1A0E34302B69B8516E8FB93BE58CC45F6E5ADB47A89A00050A12D560BEEA8997F5A0FA526C107BA34ECB0C678079C6DD4C1F4666BBD45733E019C292A17661B79E6AEED002EF4F6E7F4D569690E140C8BA1BA47E626499E01DA1EACDA4B917507A472DDB03A86734994C4B16551C5DFED3C8C976D15B5BF68CC6C982355930E37F096629E6F3BDC8027C722C12EF76854F1C607341E48FBF8C9064EB48EFDA87E1D111B557FBE7A15A580EDD87AC2CEC0EB25BE057FC20D578DF34632977F4698D58B2025C50AD4AD77D16D32E6157F89F58C692A83279A2EB58F8E448A13AA32B8C3DF07A58100EC4BB319F824446ECDD643C4A7F959CBA4E356A9E5DB7332107B2EB478703BF44383DDF80CA297F5E52A4424AF64B50CAB4E9C95C7288B96F8E77CDC63D07C6394853DF32F926652A12122B5531F90CFDFDAAC5D0642F84CF3901717B652122E8622CF31C06D134AD921EC80D175BBFC45B855EB9ABF001686BC52730F754DBFAE781BB629F1E530632D813AA256D0063202AEEE0AB64C7829C1A6C4702E27C88219FF31500D8F76BEFE4AEF726D6E3B708C835408BB
-20241129154536 2 6 100 6143 5 D530FFAD12BC56C29F02BEFEC6CFD700AE6DA852D7256FC0A8978C13FABF9851425A26917CD40A9919A06A5B17FA05456642891442CCBBBD9BB5B74068213AA6F029B3419F6B2CCB828CF9F6F0069F43A2496921ED8133BF2D9C598486282EB38B3B6E849B7D80B33869CDE1D71379C694BB9C229B5CCE5E96692F81DA73EC38942CE60A81657F34A6B1B536ADEADD76144A209815A88E081E0B96438B11A34E4F8082ACC6DD77D787EEA90E1764F7393D3869707FCFCD4BFEEA3582BBD39C17E2CE70B6A193700A055A50D2F5ED473DD9B4401C2138BAD8FA3331BDD4FF79E230C10B13FFE7CCDB3210F8DB42147BB8349CAEA97EBCBC708B9CE16360D573D3327BBCAA6387234E9A4DCB2E67784408ADB72B2E05643520211C581EBB38E57C2F69C9034143DBAB4C13221D501B892918779C6E9AC5B39F2F412E31EF7F7F0610C2AFE150FA56A5E3CF9DACA6C96F3BC6B57D56B2869019C5114247C080752E4D42B1A0E34302B69B8516E8FB93BE58CC45F6E5ADB47A89A00050A12D560BEEA8997F5A0FA526C107BA34ECB0C678079C6DD4C1F4666BBD45733E019C292A17661B79E6AEED002EF4F6E7F4D569690E140C8BA1BA47E626499E01DA1EACDA4B917507A472DDB03A86734994C4B16551C5DFED3C8C976D15B5BF68CC6C982355930E37F096629E6F3BDC8027C722C12EF76854F1C607341E48FBF8C9064EB48EFDA87E1D111B557FBE7A15A580EDD87AC2CEC0EB25BE057FC20D578DF34632977F4698D58B2025C50AD4AD77D16D32E6157F89F58C692A83279A2EB58F8E448A13AA32B8C3DF07A58100EC4BB319F824446ECDD643C4A7F959CBA4E356A9E5DB7332107B2EB478703BF44383DDF80CA297F5E52A4424AF64B50CAB4E9C95C7288B96F8E77CDC63D07C6394853DF32F926652A12122B5531F90CFDFDAAC5D0642F84CF3901717B652122E8622CF31C06D134AD921EC80D175BBFC45B855EB9ABF001686BC52730F754DBFAE781BB629F1E530632D813AA256D0063202AEEE0AB64C7829C1A6C4702E27C88219FF31500D8F76BEFE4AEF726D6E3B708C8387126F
-20241129161648 2 6 100 6143 5 D530FFAD12BC56C29F02BEFEC6CFD700AE6DA852D7256FC0A8978C13FABF9851425A26917CD40A9919A06A5B17FA05456642891442CCBBBD9BB5B74068213AA6F029B3419F6B2CCB828CF9F6F0069F43A2496921ED8133BF2D9C598486282EB38B3B6E849B7D80B33869CDE1D71379C694BB9C229B5CCE5E96692F81DA73EC38942CE60A81657F34A6B1B536ADEADD76144A209815A88E081E0B96438B11A34E4F8082ACC6DD77D787EEA90E1764F7393D3869707FCFCD4BFEEA3582BBD39C17E2CE70B6A193700A055A50D2F5ED473DD9B4401C2138BAD8FA3331BDD4FF79E230C10B13FFE7CCDB3210F8DB42147BB8349CAEA97EBCBC708B9CE16360D573D3327BBCAA6387234E9A4DCB2E67784408ADB72B2E05643520211C581EBB38E57C2F69C9034143DBAB4C13221D501B892918779C6E9AC5B39F2F412E31EF7F7F0610C2AFE150FA56A5E3CF9DACA6C96F3BC6B57D56B2869019C5114247C080752E4D42B1A0E34302B69B8516E8FB93BE58CC45F6E5ADB47A89A00050A12D560BEEA8997F5A0FA526C107BA34ECB0C678079C6DD4C1F4666BBD45733E019C292A17661B79E6AEED002EF4F6E7F4D569690E140C8BA1BA47E626499E01DA1EACDA4B917507A472DDB03A86734994C4B16551C5DFED3C8C976D15B5BF68CC6C982355930E37F096629E6F3BDC8027C722C12EF76854F1C607341E48FBF8C9064EB48EFDA87E1D111B557FBE7A15A580EDD87AC2CEC0EB25BE057FC20D578DF34632977F4698D58B2025C50AD4AD77D16D32E6157F89F58C692A83279A2EB58F8E448A13AA32B8C3DF07A58100EC4BB319F824446ECDD643C4A7F959CBA4E356A9E5DB7332107B2EB478703BF44383DDF80CA297F5E52A4424AF64B50CAB4E9C95C7288B96F8E77CDC63D07C6394853DF32F926652A12122B5531F90CFDFDAAC5D0642F84CF3901717B652122E8622CF31C06D134AD921EC80D175BBFC45B855EB9ABF001686BC52730F754DBFAE781BB629F1E530632D813AA256D0063202AEEE0AB64C7829C1A6C4702E27C88219FF31500D8F76BEFE4AEF726D6E3B708C87770FCF
-20241129162459 2 6 100 6143 5 D530FFAD12BC56C29F02BEFEC6CFD700AE6DA852D7256FC0A8978C13FABF9851425A26917CD40A9919A06A5B17FA05456642891442CCBBBD9BB5B74068213AA6F029B3419F6B2CCB828CF9F6F0069F43A2496921ED8133BF2D9C598486282EB38B3B6E849B7D80B33869CDE1D71379C694BB9C229B5CCE5E96692F81DA73EC38942CE60A81657F34A6B1B536ADEADD76144A209815A88E081E0B96438B11A34E4F8082ACC6DD77D787EEA90E1764F7393D3869707FCFCD4BFEEA3582BBD39C17E2CE70B6A193700A055A50D2F5ED473DD9B4401C2138BAD8FA3331BDD4FF79E230C10B13FFE7CCDB3210F8DB42147BB8349CAEA97EBCBC708B9CE16360D573D3327BBCAA6387234E9A4DCB2E67784408ADB72B2E05643520211C581EBB38E57C2F69C9034143DBAB4C13221D501B892918779C6E9AC5B39F2F412E31EF7F7F0610C2AFE150FA56A5E3CF9DACA6C96F3BC6B57D56B2869019C5114247C080752E4D42B1A0E34302B69B8516E8FB93BE58CC45F6E5ADB47A89A00050A12D560BEEA8997F5A0FA526C107BA34ECB0C678079C6DD4C1F4666BBD45733E019C292A17661B79E6AEED002EF4F6E7F4D569690E140C8BA1BA47E626499E01DA1EACDA4B917507A472DDB03A86734994C4B16551C5DFED3C8C976D15B5BF68CC6C982355930E37F096629E6F3BDC8027C722C12EF76854F1C607341E48FBF8C9064EB48EFDA87E1D111B557FBE7A15A580EDD87AC2CEC0EB25BE057FC20D578DF34632977F4698D58B2025C50AD4AD77D16D32E6157F89F58C692A83279A2EB58F8E448A13AA32B8C3DF07A58100EC4BB319F824446ECDD643C4A7F959CBA4E356A9E5DB7332107B2EB478703BF44383DDF80CA297F5E52A4424AF64B50CAB4E9C95C7288B96F8E77CDC63D07C6394853DF32F926652A12122B5531F90CFDFDAAC5D0642F84CF3901717B652122E8622CF31C06D134AD921EC80D175BBFC45B855EB9ABF001686BC52730F754DBFAE781BB629F1E530632D813AA256D0063202AEEE0AB64C7829C1A6C4702E27C88219FF31500D8F76BEFE4AEF726D6E3B708C887B826F
-20241129162918 2 6 100 6143 2 D530FFAD12BC56C29F02BEFEC6CFD700AE6DA852D7256FC0A8978C13FABF9851425A26917CD40A9919A06A5B17FA05456642891442CCBBBD9BB5B74068213AA6F029B3419F6B2CCB828CF9F6F0069F43A2496921ED8133BF2D9C598486282EB38B3B6E849B7D80B33869CDE1D71379C694BB9C229B5CCE5E96692F81DA73EC38942CE60A81657F34A6B1B536ADEADD76144A209815A88E081E0B96438B11A34E4F8082ACC6DD77D787EEA90E1764F7393D3869707FCFCD4BFEEA3582BBD39C17E2CE70B6A193700A055A50D2F5ED473DD9B4401C2138BAD8FA3331BDD4FF79E230C10B13FFE7CCDB3210F8DB42147BB8349CAEA97EBCBC708B9CE16360D573D3327BBCAA6387234E9A4DCB2E67784408ADB72B2E05643520211C581EBB38E57C2F69C9034143DBAB4C13221D501B892918779C6E9AC5B39F2F412E31EF7F7F0610C2AFE150FA56A5E3CF9DACA6C96F3BC6B57D56B2869019C5114247C080752E4D42B1A0E34302B69B8516E8FB93BE58CC45F6E5ADB47A89A00050A12D560BEEA8997F5A0FA526C107BA34ECB0C678079C6DD4C1F4666BBD45733E019C292A17661B79E6AEED002EF4F6E7F4D569690E140C8BA1BA47E626499E01DA1EACDA4B917507A472DDB03A86734994C4B16551C5DFED3C8C976D15B5BF68CC6C982355930E37F096629E6F3BDC8027C722C12EF76854F1C607341E48FBF8C9064EB48EFDA87E1D111B557FBE7A15A580EDD87AC2CEC0EB25BE057FC20D578DF34632977F4698D58B2025C50AD4AD77D16D32E6157F89F58C692A83279A2EB58F8E448A13AA32B8C3DF07A58100EC4BB319F824446ECDD643C4A7F959CBA4E356A9E5DB7332107B2EB478703BF44383DDF80CA297F5E52A4424AF64B50CAB4E9C95C7288B96F8E77CDC63D07C6394853DF32F926652A12122B5531F90CFDFDAAC5D0642F84CF3901717B652122E8622CF31C06D134AD921EC80D175BBFC45B855EB9ABF001686BC52730F754DBFAE781BB629F1E530632D813AA256D0063202AEEE0AB64C7829C1A6C4702E27C88219FF31500D8F76BEFE4AEF726D6E3B708C89023DAB
-20241129165526 2 6 100 6143 2 D530FFAD12BC56C29F02BEFEC6CFD700AE6DA852D7256FC0A8978C13FABF9851425A26917CD40A9919A06A5B17FA05456642891442CCBBBD9BB5B74068213AA6F029B3419F6B2CCB828CF9F6F0069F43A2496921ED8133BF2D9C598486282EB38B3B6E849B7D80B33869CDE1D71379C694BB9C229B5CCE5E96692F81DA73EC38942CE60A81657F34A6B1B536ADEADD76144A209815A88E081E0B96438B11A34E4F8082ACC6DD77D787EEA90E1764F7393D3869707FCFCD4BFEEA3582BBD39C17E2CE70B6A193700A055A50D2F5ED473DD9B4401C2138BAD8FA3331BDD4FF79E230C10B13FFE7CCDB3210F8DB42147BB8349CAEA97EBCBC708B9CE16360D573D3327BBCAA6387234E9A4DCB2E67784408ADB72B2E05643520211C581EBB38E57C2F69C9034143DBAB4C13221D501B892918779C6E9AC5B39F2F412E31EF7F7F0610C2AFE150FA56A5E3CF9DACA6C96F3BC6B57D56B2869019C5114247C080752E4D42B1A0E34302B69B8516E8FB93BE58CC45F6E5ADB47A89A00050A12D560BEEA8997F5A0FA526C107BA34ECB0C678079C6DD4C1F4666BBD45733E019C292A17661B79E6AEED002EF4F6E7F4D569690E140C8BA1BA47E626499E01DA1EACDA4B917507A472DDB03A86734994C4B16551C5DFED3C8C976D15B5BF68CC6C982355930E37F096629E6F3BDC8027C722C12EF76854F1C607341E48FBF8C9064EB48EFDA87E1D111B557FBE7A15A580EDD87AC2CEC0EB25BE057FC20D578DF34632977F4698D58B2025C50AD4AD77D16D32E6157F89F58C692A83279A2EB58F8E448A13AA32B8C3DF07A58100EC4BB319F824446ECDD643C4A7F959CBA4E356A9E5DB7332107B2EB478703BF44383DDF80CA297F5E52A4424AF64B50CAB4E9C95C7288B96F8E77CDC63D07C6394853DF32F926652A12122B5531F90CFDFDAAC5D0642F84CF3901717B652122E8622CF31C06D134AD921EC80D175BBFC45B855EB9ABF001686BC52730F754DBFAE781BB629F1E530632D813AA256D0063202AEEE0AB64C7829C1A6C4702E27C88219FF31500D8F76BEFE4AEF726D6E3B708C8C3FAA43
-20241129170725 2 6 100 6143 5 D530FFAD12BC56C29F02BEFEC6CFD700AE6DA852D7256FC0A8978C13FABF9851425A26917CD40A9919A06A5B17FA05456642891442CCBBBD9BB5B74068213AA6F029B3419F6B2CCB828CF9F6F0069F43A2496921ED8133BF2D9C598486282EB38B3B6E849B7D80B33869CDE1D71379C694BB9C229B5CCE5E96692F81DA73EC38942CE60A81657F34A6B1B536ADEADD76144A209815A88E081E0B96438B11A34E4F8082ACC6DD77D787EEA90E1764F7393D3869707FCFCD4BFEEA3582BBD39C17E2CE70B6A193700A055A50D2F5ED473DD9B4401C2138BAD8FA3331BDD4FF79E230C10B13FFE7CCDB3210F8DB42147BB8349CAEA97EBCBC708B9CE16360D573D3327BBCAA6387234E9A4DCB2E67784408ADB72B2E05643520211C581EBB38E57C2F69C9034143DBAB4C13221D501B892918779C6E9AC5B39F2F412E31EF7F7F0610C2AFE150FA56A5E3CF9DACA6C96F3BC6B57D56B2869019C5114247C080752E4D42B1A0E34302B69B8516E8FB93BE58CC45F6E5ADB47A89A00050A12D560BEEA8997F5A0FA526C107BA34ECB0C678079C6DD4C1F4666BBD45733E019C292A17661B79E6AEED002EF4F6E7F4D569690E140C8BA1BA47E626499E01DA1EACDA4B917507A472DDB03A86734994C4B16551C5DFED3C8C976D15B5BF68CC6C982355930E37F096629E6F3BDC8027C722C12EF76854F1C607341E48FBF8C9064EB48EFDA87E1D111B557FBE7A15A580EDD87AC2CEC0EB25BE057FC20D578DF34632977F4698D58B2025C50AD4AD77D16D32E6157F89F58C692A83279A2EB58F8E448A13AA32B8C3DF07A58100EC4BB319F824446ECDD643C4A7F959CBA4E356A9E5DB7332107B2EB478703BF44383DDF80CA297F5E52A4424AF64B50CAB4E9C95C7288B96F8E77CDC63D07C6394853DF32F926652A12122B5531F90CFDFDAAC5D0642F84CF3901717B652122E8622CF31C06D134AD921EC80D175BBFC45B855EB9ABF001686BC52730F754DBFAE781BB629F1E530632D813AA256D0063202AEEE0AB64C7829C1A6C4702E27C88219FF31500D8F76BEFE4AEF726D6E3B708C8DB7E57F
-20241129171144 2 6 100 6143 5 D530FFAD12BC56C29F02BEFEC6CFD700AE6DA852D7256FC0A8978C13FABF9851425A26917CD40A9919A06A5B17FA05456642891442CCBBBD9BB5B74068213AA6F029B3419F6B2CCB828CF9F6F0069F43A2496921ED8133BF2D9C598486282EB38B3B6E849B7D80B33869CDE1D71379C694BB9C229B5CCE5E96692F81DA73EC38942CE60A81657F34A6B1B536ADEADD76144A209815A88E081E0B96438B11A34E4F8082ACC6DD77D787EEA90E1764F7393D3869707FCFCD4BFEEA3582BBD39C17E2CE70B6A193700A055A50D2F5ED473DD9B4401C2138BAD8FA3331BDD4FF79E230C10B13FFE7CCDB3210F8DB42147BB8349CAEA97EBCBC708B9CE16360D573D3327BBCAA6387234E9A4DCB2E67784408ADB72B2E05643520211C581EBB38E57C2F69C9034143DBAB4C13221D501B892918779C6E9AC5B39F2F412E31EF7F7F0610C2AFE150FA56A5E3CF9DACA6C96F3BC6B57D56B2869019C5114247C080752E4D42B1A0E34302B69B8516E8FB93BE58CC45F6E5ADB47A89A00050A12D560BEEA8997F5A0FA526C107BA34ECB0C678079C6DD4C1F4666BBD45733E019C292A17661B79E6AEED002EF4F6E7F4D569690E140C8BA1BA47E626499E01DA1EACDA4B917507A472DDB03A86734994C4B16551C5DFED3C8C976D15B5BF68CC6C982355930E37F096629E6F3BDC8027C722C12EF76854F1C607341E48FBF8C9064EB48EFDA87E1D111B557FBE7A15A580EDD87AC2CEC0EB25BE057FC20D578DF34632977F4698D58B2025C50AD4AD77D16D32E6157F89F58C692A83279A2EB58F8E448A13AA32B8C3DF07A58100EC4BB319F824446ECDD643C4A7F959CBA4E356A9E5DB7332107B2EB478703BF44383DDF80CA297F5E52A4424AF64B50CAB4E9C95C7288B96F8E77CDC63D07C6394853DF32F926652A12122B5531F90CFDFDAAC5D0642F84CF3901717B652122E8622CF31C06D134AD921EC80D175BBFC45B855EB9ABF001686BC52730F754DBFAE781BB629F1E530632D813AA256D0063202AEEE0AB64C7829C1A6C4702E27C88219FF31500D8F76BEFE4AEF726D6E3B708C8E389D1F
-20241129172847 2 6 100 6143 2 D530FFAD12BC56C29F02BEFEC6CFD700AE6DA852D7256FC0A8978C13FABF9851425A26917CD40A9919A06A5B17FA05456642891442CCBBBD9BB5B74068213AA6F029B3419F6B2CCB828CF9F6F0069F43A2496921ED8133BF2D9C598486282EB38B3B6E849B7D80B33869CDE1D71379C694BB9C229B5CCE5E96692F81DA73EC38942CE60A81657F34A6B1B536ADEADD76144A209815A88E081E0B96438B11A34E4F8082ACC6DD77D787EEA90E1764F7393D3869707FCFCD4BFEEA3582BBD39C17E2CE70B6A193700A055A50D2F5ED473DD9B4401C2138BAD8FA3331BDD4FF79E230C10B13FFE7CCDB3210F8DB42147BB8349CAEA97EBCBC708B9CE16360D573D3327BBCAA6387234E9A4DCB2E67784408ADB72B2E05643520211C581EBB38E57C2F69C9034143DBAB4C13221D501B892918779C6E9AC5B39F2F412E31EF7F7F0610C2AFE150FA56A5E3CF9DACA6C96F3BC6B57D56B2869019C5114247C080752E4D42B1A0E34302B69B8516E8FB93BE58CC45F6E5ADB47A89A00050A12D560BEEA8997F5A0FA526C107BA34ECB0C678079C6DD4C1F4666BBD45733E019C292A17661B79E6AEED002EF4F6E7F4D569690E140C8BA1BA47E626499E01DA1EACDA4B917507A472DDB03A86734994C4B16551C5DFED3C8C976D15B5BF68CC6C982355930E37F096629E6F3BDC8027C722C12EF76854F1C607341E48FBF8C9064EB48EFDA87E1D111B557FBE7A15A580EDD87AC2CEC0EB25BE057FC20D578DF34632977F4698D58B2025C50AD4AD77D16D32E6157F89F58C692A83279A2EB58F8E448A13AA32B8C3DF07A58100EC4BB319F824446ECDD643C4A7F959CBA4E356A9E5DB7332107B2EB478703BF44383DDF80CA297F5E52A4424AF64B50CAB4E9C95C7288B96F8E77CDC63D07C6394853DF32F926652A12122B5531F90CFDFDAAC5D0642F84CF3901717B652122E8622CF31C06D134AD921EC80D175BBFC45B855EB9ABF001686BC52730F754DBFAE781BB629F1E530632D813AA256D0063202AEEE0AB64C7829C1A6C4702E27C88219FF31500D8F76BEFE4AEF726D6E3B708C90533393
-20241129173154 2 6 100 6143 2 D530FFAD12BC56C29F02BEFEC6CFD700AE6DA852D7256FC0A8978C13FABF9851425A26917CD40A9919A06A5B17FA05456642891442CCBBBD9BB5B74068213AA6F029B3419F6B2CCB828CF9F6F0069F43A2496921ED8133BF2D9C598486282EB38B3B6E849B7D80B33869CDE1D71379C694BB9C229B5CCE5E96692F81DA73EC38942CE60A81657F34A6B1B536ADEADD76144A209815A88E081E0B96438B11A34E4F8082ACC6DD77D787EEA90E1764F7393D3869707FCFCD4BFEEA3582BBD39C17E2CE70B6A193700A055A50D2F5ED473DD9B4401C2138BAD8FA3331BDD4FF79E230C10B13FFE7CCDB3210F8DB42147BB8349CAEA97EBCBC708B9CE16360D573D3327BBCAA6387234E9A4DCB2E67784408ADB72B2E05643520211C581EBB38E57C2F69C9034143DBAB4C13221D501B892918779C6E9AC5B39F2F412E31EF7F7F0610C2AFE150FA56A5E3CF9DACA6C96F3BC6B57D56B2869019C5114247C080752E4D42B1A0E34302B69B8516E8FB93BE58CC45F6E5ADB47A89A00050A12D560BEEA8997F5A0FA526C107BA34ECB0C678079C6DD4C1F4666BBD45733E019C292A17661B79E6AEED002EF4F6E7F4D569690E140C8BA1BA47E626499E01DA1EACDA4B917507A472DDB03A86734994C4B16551C5DFED3C8C976D15B5BF68CC6C982355930E37F096629E6F3BDC8027C722C12EF76854F1C607341E48FBF8C9064EB48EFDA87E1D111B557FBE7A15A580EDD87AC2CEC0EB25BE057FC20D578DF34632977F4698D58B2025C50AD4AD77D16D32E6157F89F58C692A83279A2EB58F8E448A13AA32B8C3DF07A58100EC4BB319F824446ECDD643C4A7F959CBA4E356A9E5DB7332107B2EB478703BF44383DDF80CA297F5E52A4424AF64B50CAB4E9C95C7288B96F8E77CDC63D07C6394853DF32F926652A12122B5531F90CFDFDAAC5D0642F84CF3901717B652122E8622CF31C06D134AD921EC80D175BBFC45B855EB9ABF001686BC52730F754DBFAE781BB629F1E530632D813AA256D0063202AEEE0AB64C7829C1A6C4702E27C88219FF31500D8F76BEFE4AEF726D6E3B708C90AFE143
-20241129174539 2 6 100 6143 2 D530FFAD12BC56C29F02BEFEC6CFD700AE6DA852D7256FC0A8978C13FABF9851425A26917CD40A9919A06A5B17FA05456642891442CCBBBD9BB5B74068213AA6F029B3419F6B2CCB828CF9F6F0069F43A2496921ED8133BF2D9C598486282EB38B3B6E849B7D80B33869CDE1D71379C694BB9C229B5CCE5E96692F81DA73EC38942CE60A81657F34A6B1B536ADEADD76144A209815A88E081E0B96438B11A34E4F8082ACC6DD77D787EEA90E1764F7393D3869707FCFCD4BFEEA3582BBD39C17E2CE70B6A193700A055A50D2F5ED473DD9B4401C2138BAD8FA3331BDD4FF79E230C10B13FFE7CCDB3210F8DB42147BB8349CAEA97EBCBC708B9CE16360D573D3327BBCAA6387234E9A4DCB2E67784408ADB72B2E05643520211C581EBB38E57C2F69C9034143DBAB4C13221D501B892918779C6E9AC5B39F2F412E31EF7F7F0610C2AFE150FA56A5E3CF9DACA6C96F3BC6B57D56B2869019C5114247C080752E4D42B1A0E34302B69B8516E8FB93BE58CC45F6E5ADB47A89A00050A12D560BEEA8997F5A0FA526C107BA34ECB0C678079C6DD4C1F4666BBD45733E019C292A17661B79E6AEED002EF4F6E7F4D569690E140C8BA1BA47E626499E01DA1EACDA4B917507A472DDB03A86734994C4B16551C5DFED3C8C976D15B5BF68CC6C982355930E37F096629E6F3BDC8027C722C12EF76854F1C607341E48FBF8C9064EB48EFDA87E1D111B557FBE7A15A580EDD87AC2CEC0EB25BE057FC20D578DF34632977F4698D58B2025C50AD4AD77D16D32E6157F89F58C692A83279A2EB58F8E448A13AA32B8C3DF07A58100EC4BB319F824446ECDD643C4A7F959CBA4E356A9E5DB7332107B2EB478703BF44383DDF80CA297F5E52A4424AF64B50CAB4E9C95C7288B96F8E77CDC63D07C6394853DF32F926652A12122B5531F90CFDFDAAC5D0642F84CF3901717B652122E8622CF31C06D134AD921EC80D175BBFC45B855EB9ABF001686BC52730F754DBFAE781BB629F1E530632D813AA256D0063202AEEE0AB64C7829C1A6C4702E27C88219FF31500D8F76BEFE4AEF726D6E3B708C92621483
-20241129180732 2 6 100 6143 5 D530FFAD12BC56C29F02BEFEC6CFD700AE6DA852D7256FC0A8978C13FABF9851425A26917CD40A9919A06A5B17FA05456642891442CCBBBD9BB5B74068213AA6F029B3419F6B2CCB828CF9F6F0069F43A2496921ED8133BF2D9C598486282EB38B3B6E849B7D80B33869CDE1D71379C694BB9C229B5CCE5E96692F81DA73EC38942CE60A81657F34A6B1B536ADEADD76144A209815A88E081E0B96438B11A34E4F8082ACC6DD77D787EEA90E1764F7393D3869707FCFCD4BFEEA3582BBD39C17E2CE70B6A193700A055A50D2F5ED473DD9B4401C2138BAD8FA3331BDD4FF79E230C10B13FFE7CCDB3210F8DB42147BB8349CAEA97EBCBC708B9CE16360D573D3327BBCAA6387234E9A4DCB2E67784408ADB72B2E05643520211C581EBB38E57C2F69C9034143DBAB4C13221D501B892918779C6E9AC5B39F2F412E31EF7F7F0610C2AFE150FA56A5E3CF9DACA6C96F3BC6B57D56B2869019C5114247C080752E4D42B1A0E34302B69B8516E8FB93BE58CC45F6E5ADB47A89A00050A12D560BEEA8997F5A0FA526C107BA34ECB0C678079C6DD4C1F4666BBD45733E019C292A17661B79E6AEED002EF4F6E7F4D569690E140C8BA1BA47E626499E01DA1EACDA4B917507A472DDB03A86734994C4B16551C5DFED3C8C976D15B5BF68CC6C982355930E37F096629E6F3BDC8027C722C12EF76854F1C607341E48FBF8C9064EB48EFDA87E1D111B557FBE7A15A580EDD87AC2CEC0EB25BE057FC20D578DF34632977F4698D58B2025C50AD4AD77D16D32E6157F89F58C692A83279A2EB58F8E448A13AA32B8C3DF07A58100EC4BB319F824446ECDD643C4A7F959CBA4E356A9E5DB7332107B2EB478703BF44383DDF80CA297F5E52A4424AF64B50CAB4E9C95C7288B96F8E77CDC63D07C6394853DF32F926652A12122B5531F90CFDFDAAC5D0642F84CF3901717B652122E8622CF31C06D134AD921EC80D175BBFC45B855EB9ABF001686BC52730F754DBFAE781BB629F1E530632D813AA256D0063202AEEE0AB64C7829C1A6C4702E27C88219FF31500D8F76BEFE4AEF726D6E3B708C951D8D97
-20241129181538 2 6 100 6143 2 D530FFAD12BC56C29F02BEFEC6CFD700AE6DA852D7256FC0A8978C13FABF9851425A26917CD40A9919A06A5B17FA05456642891442CCBBBD9BB5B74068213AA6F029B3419F6B2CCB828CF9F6F0069F43A2496921ED8133BF2D9C598486282EB38B3B6E849B7D80B33869CDE1D71379C694BB9C229B5CCE5E96692F81DA73EC38942CE60A81657F34A6B1B536ADEADD76144A209815A88E081E0B96438B11A34E4F8082ACC6DD77D787EEA90E1764F7393D3869707FCFCD4BFEEA3582BBD39C17E2CE70B6A193700A055A50D2F5ED473DD9B4401C2138BAD8FA3331BDD4FF79E230C10B13FFE7CCDB3210F8DB42147BB8349CAEA97EBCBC708B9CE16360D573D3327BBCAA6387234E9A4DCB2E67784408ADB72B2E05643520211C581EBB38E57C2F69C9034143DBAB4C13221D501B892918779C6E9AC5B39F2F412E31EF7F7F0610C2AFE150FA56A5E3CF9DACA6C96F3BC6B57D56B2869019C5114247C080752E4D42B1A0E34302B69B8516E8FB93BE58CC45F6E5ADB47A89A00050A12D560BEEA8997F5A0FA526C107BA34ECB0C678079C6DD4C1F4666BBD45733E019C292A17661B79E6AEED002EF4F6E7F4D569690E140C8BA1BA47E626499E01DA1EACDA4B917507A472DDB03A86734994C4B16551C5DFED3C8C976D15B5BF68CC6C982355930E37F096629E6F3BDC8027C722C12EF76854F1C607341E48FBF8C9064EB48EFDA87E1D111B557FBE7A15A580EDD87AC2CEC0EB25BE057FC20D578DF34632977F4698D58B2025C50AD4AD77D16D32E6157F89F58C692A83279A2EB58F8E448A13AA32B8C3DF07A58100EC4BB319F824446ECDD643C4A7F959CBA4E356A9E5DB7332107B2EB478703BF44383DDF80CA297F5E52A4424AF64B50CAB4E9C95C7288B96F8E77CDC63D07C6394853DF32F926652A12122B5531F90CFDFDAAC5D0642F84CF3901717B652122E8622CF31C06D134AD921EC80D175BBFC45B855EB9ABF001686BC52730F754DBFAE781BB629F1E530632D813AA256D0063202AEEE0AB64C7829C1A6C4702E27C88219FF31500D8F76BEFE4AEF726D6E3B708C961A0AFB
-20241129182310 2 6 100 6143 5 D530FFAD12BC56C29F02BEFEC6CFD700AE6DA852D7256FC0A8978C13FABF9851425A26917CD40A9919A06A5B17FA05456642891442CCBBBD9BB5B74068213AA6F029B3419F6B2CCB828CF9F6F0069F43A2496921ED8133BF2D9C598486282EB38B3B6E849B7D80B33869CDE1D71379C694BB9C229B5CCE5E96692F81DA73EC38942CE60A81657F34A6B1B536ADEADD76144A209815A88E081E0B96438B11A34E4F8082ACC6DD77D787EEA90E1764F7393D3869707FCFCD4BFEEA3582BBD39C17E2CE70B6A193700A055A50D2F5ED473DD9B4401C2138BAD8FA3331BDD4FF79E230C10B13FFE7CCDB3210F8DB42147BB8349CAEA97EBCBC708B9CE16360D573D3327BBCAA6387234E9A4DCB2E67784408ADB72B2E05643520211C581EBB38E57C2F69C9034143DBAB4C13221D501B892918779C6E9AC5B39F2F412E31EF7F7F0610C2AFE150FA56A5E3CF9DACA6C96F3BC6B57D56B2869019C5114247C080752E4D42B1A0E34302B69B8516E8FB93BE58CC45F6E5ADB47A89A00050A12D560BEEA8997F5A0FA526C107BA34ECB0C678079C6DD4C1F4666BBD45733E019C292A17661B79E6AEED002EF4F6E7F4D569690E140C8BA1BA47E626499E01DA1EACDA4B917507A472DDB03A86734994C4B16551C5DFED3C8C976D15B5BF68CC6C982355930E37F096629E6F3BDC8027C722C12EF76854F1C607341E48FBF8C9064EB48EFDA87E1D111B557FBE7A15A580EDD87AC2CEC0EB25BE057FC20D578DF34632977F4698D58B2025C50AD4AD77D16D32E6157F89F58C692A83279A2EB58F8E448A13AA32B8C3DF07A58100EC4BB319F824446ECDD643C4A7F959CBA4E356A9E5DB7332107B2EB478703BF44383DDF80CA297F5E52A4424AF64B50CAB4E9C95C7288B96F8E77CDC63D07C6394853DF32F926652A12122B5531F90CFDFDAAC5D0642F84CF3901717B652122E8622CF31C06D134AD921EC80D175BBFC45B855EB9ABF001686BC52730F754DBFAE781BB629F1E530632D813AA256D0063202AEEE0AB64C7829C1A6C4702E27C88219FF31500D8F76BEFE4AEF726D6E3B708C97054E47
-20241129183550 2 6 100 6143 5 D530FFAD12BC56C29F02BEFEC6CFD700AE6DA852D7256FC0A8978C13FABF9851425A26917CD40A9919A06A5B17FA05456642891442CCBBBD9BB5B74068213AA6F029B3419F6B2CCB828CF9F6F0069F43A2496921ED8133BF2D9C598486282EB38B3B6E849B7D80B33869CDE1D71379C694BB9C229B5CCE5E96692F81DA73EC38942CE60A81657F34A6B1B536ADEADD76144A209815A88E081E0B96438B11A34E4F8082ACC6DD77D787EEA90E1764F7393D3869707FCFCD4BFEEA3582BBD39C17E2CE70B6A193700A055A50D2F5ED473DD9B4401C2138BAD8FA3331BDD4FF79E230C10B13FFE7CCDB3210F8DB42147BB8349CAEA97EBCBC708B9CE16360D573D3327BBCAA6387234E9A4DCB2E67784408ADB72B2E05643520211C581EBB38E57C2F69C9034143DBAB4C13221D501B892918779C6E9AC5B39F2F412E31EF7F7F0610C2AFE150FA56A5E3CF9DACA6C96F3BC6B57D56B2869019C5114247C080752E4D42B1A0E34302B69B8516E8FB93BE58CC45F6E5ADB47A89A00050A12D560BEEA8997F5A0FA526C107BA34ECB0C678079C6DD4C1F4666BBD45733E019C292A17661B79E6AEED002EF4F6E7F4D569690E140C8BA1BA47E626499E01DA1EACDA4B917507A472DDB03A86734994C4B16551C5DFED3C8C976D15B5BF68CC6C982355930E37F096629E6F3BDC8027C722C12EF76854F1C607341E48FBF8C9064EB48EFDA87E1D111B557FBE7A15A580EDD87AC2CEC0EB25BE057FC20D578DF34632977F4698D58B2025C50AD4AD77D16D32E6157F89F58C692A83279A2EB58F8E448A13AA32B8C3DF07A58100EC4BB319F824446ECDD643C4A7F959CBA4E356A9E5DB7332107B2EB478703BF44383DDF80CA297F5E52A4424AF64B50CAB4E9C95C7288B96F8E77CDC63D07C6394853DF32F926652A12122B5531F90CFDFDAAC5D0642F84CF3901717B652122E8622CF31C06D134AD921EC80D175BBFC45B855EB9ABF001686BC52730F754DBFAE781BB629F1E530632D813AA256D0063202AEEE0AB64C7829C1A6C4702E27C88219FF31500D8F76BEFE4AEF726D6E3B708C989CFDEF
-20241129184809 2 6 100 6143 2 D530FFAD12BC56C29F02BEFEC6CFD700AE6DA852D7256FC0A8978C13FABF9851425A26917CD40A9919A06A5B17FA05456642891442CCBBBD9BB5B74068213AA6F029B3419F6B2CCB828CF9F6F0069F43A2496921ED8133BF2D9C598486282EB38B3B6E849B7D80B33869CDE1D71379C694BB9C229B5CCE5E96692F81DA73EC38942CE60A81657F34A6B1B536ADEADD76144A209815A88E081E0B96438B11A34E4F8082ACC6DD77D787EEA90E1764F7393D3869707FCFCD4BFEEA3582BBD39C17E2CE70B6A193700A055A50D2F5ED473DD9B4401C2138BAD8FA3331BDD4FF79E230C10B13FFE7CCDB3210F8DB42147BB8349CAEA97EBCBC708B9CE16360D573D3327BBCAA6387234E9A4DCB2E67784408ADB72B2E05643520211C581EBB38E57C2F69C9034143DBAB4C13221D501B892918779C6E9AC5B39F2F412E31EF7F7F0610C2AFE150FA56A5E3CF9DACA6C96F3BC6B57D56B2869019C5114247C080752E4D42B1A0E34302B69B8516E8FB93BE58CC45F6E5ADB47A89A00050A12D560BEEA8997F5A0FA526C107BA34ECB0C678079C6DD4C1F4666BBD45733E019C292A17661B79E6AEED002EF4F6E7F4D569690E140C8BA1BA47E626499E01DA1EACDA4B917507A472DDB03A86734994C4B16551C5DFED3C8C976D15B5BF68CC6C982355930E37F096629E6F3BDC8027C722C12EF76854F1C607341E48FBF8C9064EB48EFDA87E1D111B557FBE7A15A580EDD87AC2CEC0EB25BE057FC20D578DF34632977F4698D58B2025C50AD4AD77D16D32E6157F89F58C692A83279A2EB58F8E448A13AA32B8C3DF07A58100EC4BB319F824446ECDD643C4A7F959CBA4E356A9E5DB7332107B2EB478703BF44383DDF80CA297F5E52A4424AF64B50CAB4E9C95C7288B96F8E77CDC63D07C6394853DF32F926652A12122B5531F90CFDFDAAC5D0642F84CF3901717B652122E8622CF31C06D134AD921EC80D175BBFC45B855EB9ABF001686BC52730F754DBFAE781BB629F1E530632D813AA256D0063202AEEE0AB64C7829C1A6C4702E27C88219FF31500D8F76BEFE4AEF726D6E3B708C9A2A2BAB
-20241129185633 2 6 100 6143 2 D530FFAD12BC56C29F02BEFEC6CFD700AE6DA852D7256FC0A8978C13FABF9851425A26917CD40A9919A06A5B17FA05456642891442CCBBBD9BB5B74068213AA6F029B3419F6B2CCB828CF9F6F0069F43A2496921ED8133BF2D9C598486282EB38B3B6E849B7D80B33869CDE1D71379C694BB9C229B5CCE5E96692F81DA73EC38942CE60A81657F34A6B1B536ADEADD76144A209815A88E081E0B96438B11A34E4F8082ACC6DD77D787EEA90E1764F7393D3869707FCFCD4BFEEA3582BBD39C17E2CE70B6A193700A055A50D2F5ED473DD9B4401C2138BAD8FA3331BDD4FF79E230C10B13FFE7CCDB3210F8DB42147BB8349CAEA97EBCBC708B9CE16360D573D3327BBCAA6387234E9A4DCB2E67784408ADB72B2E05643520211C581EBB38E57C2F69C9034143DBAB4C13221D501B892918779C6E9AC5B39F2F412E31EF7F7F0610C2AFE150FA56A5E3CF9DACA6C96F3BC6B57D56B2869019C5114247C080752E4D42B1A0E34302B69B8516E8FB93BE58CC45F6E5ADB47A89A00050A12D560BEEA8997F5A0FA526C107BA34ECB0C678079C6DD4C1F4666BBD45733E019C292A17661B79E6AEED002EF4F6E7F4D569690E140C8BA1BA47E626499E01DA1EACDA4B917507A472DDB03A86734994C4B16551C5DFED3C8C976D15B5BF68CC6C982355930E37F096629E6F3BDC8027C722C12EF76854F1C607341E48FBF8C9064EB48EFDA87E1D111B557FBE7A15A580EDD87AC2CEC0EB25BE057FC20D578DF34632977F4698D58B2025C50AD4AD77D16D32E6157F89F58C692A83279A2EB58F8E448A13AA32B8C3DF07A58100EC4BB319F824446ECDD643C4A7F959CBA4E356A9E5DB7332107B2EB478703BF44383DDF80CA297F5E52A4424AF64B50CAB4E9C95C7288B96F8E77CDC63D07C6394853DF32F926652A12122B5531F90CFDFDAAC5D0642F84CF3901717B652122E8622CF31C06D134AD921EC80D175BBFC45B855EB9ABF001686BC52730F754DBFAE781BB629F1E530632D813AA256D0063202AEEE0AB64C7829C1A6C4702E27C88219FF31500D8F76BEFE4AEF726D6E3B708C9B335EE3
-20241129190213 2 6 100 6143 5 D530FFAD12BC56C29F02BEFEC6CFD700AE6DA852D7256FC0A8978C13FABF9851425A26917CD40A9919A06A5B17FA05456642891442CCBBBD9BB5B74068213AA6F029B3419F6B2CCB828CF9F6F0069F43A2496921ED8133BF2D9C598486282EB38B3B6E849B7D80B33869CDE1D71379C694BB9C229B5CCE5E96692F81DA73EC38942CE60A81657F34A6B1B536ADEADD76144A209815A88E081E0B96438B11A34E4F8082ACC6DD77D787EEA90E1764F7393D3869707FCFCD4BFEEA3582BBD39C17E2CE70B6A193700A055A50D2F5ED473DD9B4401C2138BAD8FA3331BDD4FF79E230C10B13FFE7CCDB3210F8DB42147BB8349CAEA97EBCBC708B9CE16360D573D3327BBCAA6387234E9A4DCB2E67784408ADB72B2E05643520211C581EBB38E57C2F69C9034143DBAB4C13221D501B892918779C6E9AC5B39F2F412E31EF7F7F0610C2AFE150FA56A5E3CF9DACA6C96F3BC6B57D56B2869019C5114247C080752E4D42B1A0E34302B69B8516E8FB93BE58CC45F6E5ADB47A89A00050A12D560BEEA8997F5A0FA526C107BA34ECB0C678079C6DD4C1F4666BBD45733E019C292A17661B79E6AEED002EF4F6E7F4D569690E140C8BA1BA47E626499E01DA1EACDA4B917507A472DDB03A86734994C4B16551C5DFED3C8C976D15B5BF68CC6C982355930E37F096629E6F3BDC8027C722C12EF76854F1C607341E48FBF8C9064EB48EFDA87E1D111B557FBE7A15A580EDD87AC2CEC0EB25BE057FC20D578DF34632977F4698D58B2025C50AD4AD77D16D32E6157F89F58C692A83279A2EB58F8E448A13AA32B8C3DF07A58100EC4BB319F824446ECDD643C4A7F959CBA4E356A9E5DB7332107B2EB478703BF44383DDF80CA297F5E52A4424AF64B50CAB4E9C95C7288B96F8E77CDC63D07C6394853DF32F926652A12122B5531F90CFDFDAAC5D0642F84CF3901717B652122E8622CF31C06D134AD921EC80D175BBFC45B855EB9ABF001686BC52730F754DBFAE781BB629F1E530632D813AA256D0063202AEEE0AB64C7829C1A6C4702E27C88219FF31500D8F76BEFE4AEF726D6E3B708C9BDDE8CF
-20241129203945 2 6 100 6143 2 D530FFAD12BC56C29F02BEFEC6CFD700AE6DA852D7256FC0A8978C13FABF9851425A26917CD40A9919A06A5B17FA05456642891442CCBBBD9BB5B74068213AA6F029B3419F6B2CCB828CF9F6F0069F43A2496921ED8133BF2D9C598486282EB38B3B6E849B7D80B33869CDE1D71379C694BB9C229B5CCE5E96692F81DA73EC38942CE60A81657F34A6B1B536ADEADD76144A209815A88E081E0B96438B11A34E4F8082ACC6DD77D787EEA90E1764F7393D3869707FCFCD4BFEEA3582BBD39C17E2CE70B6A193700A055A50D2F5ED473DD9B4401C2138BAD8FA3331BDD4FF79E230C10B13FFE7CCDB3210F8DB42147BB8349CAEA97EBCBC708B9CE16360D573D3327BBCAA6387234E9A4DCB2E67784408ADB72B2E05643520211C581EBB38E57C2F69C9034143DBAB4C13221D501B892918779C6E9AC5B39F2F412E31EF7F7F0610C2AFE150FA56A5E3CF9DACA6C96F3BC6B57D56B2869019C5114247C080752E4D42B1A0E34302B69B8516E8FB93BE58CC45F6E5ADB47A89A00050A12D560BEEA8997F5A0FA526C107BA34ECB0C678079C6DD4C1F4666BBD45733E019C292A17661B79E6AEED002EF4F6E7F4D569690E140C8BA1BA47E626499E01DA1EACDA4B917507A472DDB03A86734994C4B16551C5DFED3C8C976D15B5BF68CC6C982355930E37F096629E6F3BDC8027C722C12EF76854F1C607341E48FBF8C9064EB48EFDA87E1D111B557FBE7A15A580EDD87AC2CEC0EB25BE057FC20D578DF34632977F4698D58B2025C50AD4AD77D16D32E6157F89F58C692A83279A2EB58F8E448A13AA32B8C3DF07A58100EC4BB319F824446ECDD643C4A7F959CBA4E356A9E5DB7332107B2EB478703BF44383DDF80CA297F5E52A4424AF64B50CAB4E9C95C7288B96F8E77CDC63D07C6394853DF32F926652A12122B5531F90CFDFDAAC5D0642F84CF3901717B652122E8622CF31C06D134AD921EC80D175BBFC45B855EB9ABF001686BC52730F754DBFAE781BB629F1E530632D813AA256D0063202AEEE0AB64C7829C1A6C4702E27C88219FF31500D8F76BEFE4AEF726D6E3B708CA834CF13
-20241129204138 2 6 100 6143 5 D530FFAD12BC56C29F02BEFEC6CFD700AE6DA852D7256FC0A8978C13FABF9851425A26917CD40A9919A06A5B17FA05456642891442CCBBBD9BB5B74068213AA6F029B3419F6B2CCB828CF9F6F0069F43A2496921ED8133BF2D9C598486282EB38B3B6E849B7D80B33869CDE1D71379C694BB9C229B5CCE5E96692F81DA73EC38942CE60A81657F34A6B1B536ADEADD76144A209815A88E081E0B96438B11A34E4F8082ACC6DD77D787EEA90E1764F7393D3869707FCFCD4BFEEA3582BBD39C17E2CE70B6A193700A055A50D2F5ED473DD9B4401C2138BAD8FA3331BDD4FF79E230C10B13FFE7CCDB3210F8DB42147BB8349CAEA97EBCBC708B9CE16360D573D3327BBCAA6387234E9A4DCB2E67784408ADB72B2E05643520211C581EBB38E57C2F69C9034143DBAB4C13221D501B892918779C6E9AC5B39F2F412E31EF7F7F0610C2AFE150FA56A5E3CF9DACA6C96F3BC6B57D56B2869019C5114247C080752E4D42B1A0E34302B69B8516E8FB93BE58CC45F6E5ADB47A89A00050A12D560BEEA8997F5A0FA526C107BA34ECB0C678079C6DD4C1F4666BBD45733E019C292A17661B79E6AEED002EF4F6E7F4D569690E140C8BA1BA47E626499E01DA1EACDA4B917507A472DDB03A86734994C4B16551C5DFED3C8C976D15B5BF68CC6C982355930E37F096629E6F3BDC8027C722C12EF76854F1C607341E48FBF8C9064EB48EFDA87E1D111B557FBE7A15A580EDD87AC2CEC0EB25BE057FC20D578DF34632977F4698D58B2025C50AD4AD77D16D32E6157F89F58C692A83279A2EB58F8E448A13AA32B8C3DF07A58100EC4BB319F824446ECDD643C4A7F959CBA4E356A9E5DB7332107B2EB478703BF44383DDF80CA297F5E52A4424AF64B50CAB4E9C95C7288B96F8E77CDC63D07C6394853DF32F926652A12122B5531F90CFDFDAAC5D0642F84CF3901717B652122E8622CF31C06D134AD921EC80D175BBFC45B855EB9ABF001686BC52730F754DBFAE781BB629F1E530632D813AA256D0063202AEEE0AB64C7829C1A6C4702E27C88219FF31500D8F76BEFE4AEF726D6E3B708CA86A90F7
-20241129205210 2 6 100 6143 5 D530FFAD12BC56C29F02BEFEC6CFD700AE6DA852D7256FC0A8978C13FABF9851425A26917CD40A9919A06A5B17FA05456642891442CCBBBD9BB5B74068213AA6F029B3419F6B2CCB828CF9F6F0069F43A2496921ED8133BF2D9C598486282EB38B3B6E849B7D80B33869CDE1D71379C694BB9C229B5CCE5E96692F81DA73EC38942CE60A81657F34A6B1B536ADEADD76144A209815A88E081E0B96438B11A34E4F8082ACC6DD77D787EEA90E1764F7393D3869707FCFCD4BFEEA3582BBD39C17E2CE70B6A193700A055A50D2F5ED473DD9B4401C2138BAD8FA3331BDD4FF79E230C10B13FFE7CCDB3210F8DB42147BB8349CAEA97EBCBC708B9CE16360D573D3327BBCAA6387234E9A4DCB2E67784408ADB72B2E05643520211C581EBB38E57C2F69C9034143DBAB4C13221D501B892918779C6E9AC5B39F2F412E31EF7F7F0610C2AFE150FA56A5E3CF9DACA6C96F3BC6B57D56B2869019C5114247C080752E4D42B1A0E34302B69B8516E8FB93BE58CC45F6E5ADB47A89A00050A12D560BEEA8997F5A0FA526C107BA34ECB0C678079C6DD4C1F4666BBD45733E019C292A17661B79E6AEED002EF4F6E7F4D569690E140C8BA1BA47E626499E01DA1EACDA4B917507A472DDB03A86734994C4B16551C5DFED3C8C976D15B5BF68CC6C982355930E37F096629E6F3BDC8027C722C12EF76854F1C607341E48FBF8C9064EB48EFDA87E1D111B557FBE7A15A580EDD87AC2CEC0EB25BE057FC20D578DF34632977F4698D58B2025C50AD4AD77D16D32E6157F89F58C692A83279A2EB58F8E448A13AA32B8C3DF07A58100EC4BB319F824446ECDD643C4A7F959CBA4E356A9E5DB7332107B2EB478703BF44383DDF80CA297F5E52A4424AF64B50CAB4E9C95C7288B96F8E77CDC63D07C6394853DF32F926652A12122B5531F90CFDFDAAC5D0642F84CF3901717B652122E8622CF31C06D134AD921EC80D175BBFC45B855EB9ABF001686BC52730F754DBFAE781BB629F1E530632D813AA256D0063202AEEE0AB64C7829C1A6C4702E27C88219FF31500D8F76BEFE4AEF726D6E3B708CA9BFC2E7
-20241129210035 2 6 100 6143 2 D530FFAD12BC56C29F02BEFEC6CFD700AE6DA852D7256FC0A8978C13FABF9851425A26917CD40A9919A06A5B17FA05456642891442CCBBBD9BB5B74068213AA6F029B3419F6B2CCB828CF9F6F0069F43A2496921ED8133BF2D9C598486282EB38B3B6E849B7D80B33869CDE1D71379C694BB9C229B5CCE5E96692F81DA73EC38942CE60A81657F34A6B1B536ADEADD76144A209815A88E081E0B96438B11A34E4F8082ACC6DD77D787EEA90E1764F7393D3869707FCFCD4BFEEA3582BBD39C17E2CE70B6A193700A055A50D2F5ED473DD9B4401C2138BAD8FA3331BDD4FF79E230C10B13FFE7CCDB3210F8DB42147BB8349CAEA97EBCBC708B9CE16360D573D3327BBCAA6387234E9A4DCB2E67784408ADB72B2E05643520211C581EBB38E57C2F69C9034143DBAB4C13221D501B892918779C6E9AC5B39F2F412E31EF7F7F0610C2AFE150FA56A5E3CF9DACA6C96F3BC6B57D56B2869019C5114247C080752E4D42B1A0E34302B69B8516E8FB93BE58CC45F6E5ADB47A89A00050A12D560BEEA8997F5A0FA526C107BA34ECB0C678079C6DD4C1F4666BBD45733E019C292A17661B79E6AEED002EF4F6E7F4D569690E140C8BA1BA47E626499E01DA1EACDA4B917507A472DDB03A86734994C4B16551C5DFED3C8C976D15B5BF68CC6C982355930E37F096629E6F3BDC8027C722C12EF76854F1C607341E48FBF8C9064EB48EFDA87E1D111B557FBE7A15A580EDD87AC2CEC0EB25BE057FC20D578DF34632977F4698D58B2025C50AD4AD77D16D32E6157F89F58C692A83279A2EB58F8E448A13AA32B8C3DF07A58100EC4BB319F824446ECDD643C4A7F959CBA4E356A9E5DB7332107B2EB478703BF44383DDF80CA297F5E52A4424AF64B50CAB4E9C95C7288B96F8E77CDC63D07C6394853DF32F926652A12122B5531F90CFDFDAAC5D0642F84CF3901717B652122E8622CF31C06D134AD921EC80D175BBFC45B855EB9ABF001686BC52730F754DBFAE781BB629F1E530632D813AA256D0063202AEEE0AB64C7829C1A6C4702E27C88219FF31500D8F76BEFE4AEF726D6E3B708CAAC70D2B
-20241129210423 2 6 100 6143 5 D530FFAD12BC56C29F02BEFEC6CFD700AE6DA852D7256FC0A8978C13FABF9851425A26917CD40A9919A06A5B17FA05456642891442CCBBBD9BB5B74068213AA6F029B3419F6B2CCB828CF9F6F0069F43A2496921ED8133BF2D9C598486282EB38B3B6E849B7D80B33869CDE1D71379C694BB9C229B5CCE5E96692F81DA73EC38942CE60A81657F34A6B1B536ADEADD76144A209815A88E081E0B96438B11A34E4F8082ACC6DD77D787EEA90E1764F7393D3869707FCFCD4BFEEA3582BBD39C17E2CE70B6A193700A055A50D2F5ED473DD9B4401C2138BAD8FA3331BDD4FF79E230C10B13FFE7CCDB3210F8DB42147BB8349CAEA97EBCBC708B9CE16360D573D3327BBCAA6387234E9A4DCB2E67784408ADB72B2E05643520211C581EBB38E57C2F69C9034143DBAB4C13221D501B892918779C6E9AC5B39F2F412E31EF7F7F0610C2AFE150FA56A5E3CF9DACA6C96F3BC6B57D56B2869019C5114247C080752E4D42B1A0E34302B69B8516E8FB93BE58CC45F6E5ADB47A89A00050A12D560BEEA8997F5A0FA526C107BA34ECB0C678079C6DD4C1F4666BBD45733E019C292A17661B79E6AEED002EF4F6E7F4D569690E140C8BA1BA47E626499E01DA1EACDA4B917507A472DDB03A86734994C4B16551C5DFED3C8C976D15B5BF68CC6C982355930E37F096629E6F3BDC8027C722C12EF76854F1C607341E48FBF8C9064EB48EFDA87E1D111B557FBE7A15A580EDD87AC2CEC0EB25BE057FC20D578DF34632977F4698D58B2025C50AD4AD77D16D32E6157F89F58C692A83279A2EB58F8E448A13AA32B8C3DF07A58100EC4BB319F824446ECDD643C4A7F959CBA4E356A9E5DB7332107B2EB478703BF44383DDF80CA297F5E52A4424AF64B50CAB4E9C95C7288B96F8E77CDC63D07C6394853DF32F926652A12122B5531F90CFDFDAAC5D0642F84CF3901717B652122E8622CF31C06D134AD921EC80D175BBFC45B855EB9ABF001686BC52730F754DBFAE781BB629F1E530632D813AA256D0063202AEEE0AB64C7829C1A6C4702E27C88219FF31500D8F76BEFE4AEF726D6E3B708CAB389E37
-20241129213344 2 6 100 6143 5 D530FFAD12BC56C29F02BEFEC6CFD700AE6DA852D7256FC0A8978C13FABF9851425A26917CD40A9919A06A5B17FA05456642891442CCBBBD9BB5B74068213AA6F029B3419F6B2CCB828CF9F6F0069F43A2496921ED8133BF2D9C598486282EB38B3B6E849B7D80B33869CDE1D71379C694BB9C229B5CCE5E96692F81DA73EC38942CE60A81657F34A6B1B536ADEADD76144A209815A88E081E0B96438B11A34E4F8082ACC6DD77D787EEA90E1764F7393D3869707FCFCD4BFEEA3582BBD39C17E2CE70B6A193700A055A50D2F5ED473DD9B4401C2138BAD8FA3331BDD4FF79E230C10B13FFE7CCDB3210F8DB42147BB8349CAEA97EBCBC708B9CE16360D573D3327BBCAA6387234E9A4DCB2E67784408ADB72B2E05643520211C581EBB38E57C2F69C9034143DBAB4C13221D501B892918779C6E9AC5B39F2F412E31EF7F7F0610C2AFE150FA56A5E3CF9DACA6C96F3BC6B57D56B2869019C5114247C080752E4D42B1A0E34302B69B8516E8FB93BE58CC45F6E5ADB47A89A00050A12D560BEEA8997F5A0FA526C107BA34ECB0C678079C6DD4C1F4666BBD45733E019C292A17661B79E6AEED002EF4F6E7F4D569690E140C8BA1BA47E626499E01DA1EACDA4B917507A472DDB03A86734994C4B16551C5DFED3C8C976D15B5BF68CC6C982355930E37F096629E6F3BDC8027C722C12EF76854F1C607341E48FBF8C9064EB48EFDA87E1D111B557FBE7A15A580EDD87AC2CEC0EB25BE057FC20D578DF34632977F4698D58B2025C50AD4AD77D16D32E6157F89F58C692A83279A2EB58F8E448A13AA32B8C3DF07A58100EC4BB319F824446ECDD643C4A7F959CBA4E356A9E5DB7332107B2EB478703BF44383DDF80CA297F5E52A4424AF64B50CAB4E9C95C7288B96F8E77CDC63D07C6394853DF32F926652A12122B5531F90CFDFDAAC5D0642F84CF3901717B652122E8622CF31C06D134AD921EC80D175BBFC45B855EB9ABF001686BC52730F754DBFAE781BB629F1E530632D813AA256D0063202AEEE0AB64C7829C1A6C4702E27C88219FF31500D8F76BEFE4AEF726D6E3B708CAEE209F7
-20241129215808 2 6 100 6143 2 D530FFAD12BC56C29F02BEFEC6CFD700AE6DA852D7256FC0A8978C13FABF9851425A26917CD40A9919A06A5B17FA05456642891442CCBBBD9BB5B74068213AA6F029B3419F6B2CCB828CF9F6F0069F43A2496921ED8133BF2D9C598486282EB38B3B6E849B7D80B33869CDE1D71379C694BB9C229B5CCE5E96692F81DA73EC38942CE60A81657F34A6B1B536ADEADD76144A209815A88E081E0B96438B11A34E4F8082ACC6DD77D787EEA90E1764F7393D3869707FCFCD4BFEEA3582BBD39C17E2CE70B6A193700A055A50D2F5ED473DD9B4401C2138BAD8FA3331BDD4FF79E230C10B13FFE7CCDB3210F8DB42147BB8349CAEA97EBCBC708B9CE16360D573D3327BBCAA6387234E9A4DCB2E67784408ADB72B2E05643520211C581EBB38E57C2F69C9034143DBAB4C13221D501B892918779C6E9AC5B39F2F412E31EF7F7F0610C2AFE150FA56A5E3CF9DACA6C96F3BC6B57D56B2869019C5114247C080752E4D42B1A0E34302B69B8516E8FB93BE58CC45F6E5ADB47A89A00050A12D560BEEA8997F5A0FA526C107BA34ECB0C678079C6DD4C1F4666BBD45733E019C292A17661B79E6AEED002EF4F6E7F4D569690E140C8BA1BA47E626499E01DA1EACDA4B917507A472DDB03A86734994C4B16551C5DFED3C8C976D15B5BF68CC6C982355930E37F096629E6F3BDC8027C722C12EF76854F1C607341E48FBF8C9064EB48EFDA87E1D111B557FBE7A15A580EDD87AC2CEC0EB25BE057FC20D578DF34632977F4698D58B2025C50AD4AD77D16D32E6157F89F58C692A83279A2EB58F8E448A13AA32B8C3DF07A58100EC4BB319F824446ECDD643C4A7F959CBA4E356A9E5DB7332107B2EB478703BF44383DDF80CA297F5E52A4424AF64B50CAB4E9C95C7288B96F8E77CDC63D07C6394853DF32F926652A12122B5531F90CFDFDAAC5D0642F84CF3901717B652122E8622CF31C06D134AD921EC80D175BBFC45B855EB9ABF001686BC52730F754DBFAE781BB629F1E530632D813AA256D0063202AEEE0AB64C7829C1A6C4702E27C88219FF31500D8F76BEFE4AEF726D6E3B708CB1F2A1D3
-20241129221635 2 6 100 6143 2 D530FFAD12BC56C29F02BEFEC6CFD700AE6DA852D7256FC0A8978C13FABF9851425A26917CD40A9919A06A5B17FA05456642891442CCBBBD9BB5B74068213AA6F029B3419F6B2CCB828CF9F6F0069F43A2496921ED8133BF2D9C598486282EB38B3B6E849B7D80B33869CDE1D71379C694BB9C229B5CCE5E96692F81DA73EC38942CE60A81657F34A6B1B536ADEADD76144A209815A88E081E0B96438B11A34E4F8082ACC6DD77D787EEA90E1764F7393D3869707FCFCD4BFEEA3582BBD39C17E2CE70B6A193700A055A50D2F5ED473DD9B4401C2138BAD8FA3331BDD4FF79E230C10B13FFE7CCDB3210F8DB42147BB8349CAEA97EBCBC708B9CE16360D573D3327BBCAA6387234E9A4DCB2E67784408ADB72B2E05643520211C581EBB38E57C2F69C9034143DBAB4C13221D501B892918779C6E9AC5B39F2F412E31EF7F7F0610C2AFE150FA56A5E3CF9DACA6C96F3BC6B57D56B2869019C5114247C080752E4D42B1A0E34302B69B8516E8FB93BE58CC45F6E5ADB47A89A00050A12D560BEEA8997F5A0FA526C107BA34ECB0C678079C6DD4C1F4666BBD45733E019C292A17661B79E6AEED002EF4F6E7F4D569690E140C8BA1BA47E626499E01DA1EACDA4B917507A472DDB03A86734994C4B16551C5DFED3C8C976D15B5BF68CC6C982355930E37F096629E6F3BDC8027C722C12EF76854F1C607341E48FBF8C9064EB48EFDA87E1D111B557FBE7A15A580EDD87AC2CEC0EB25BE057FC20D578DF34632977F4698D58B2025C50AD4AD77D16D32E6157F89F58C692A83279A2EB58F8E448A13AA32B8C3DF07A58100EC4BB319F824446ECDD643C4A7F959CBA4E356A9E5DB7332107B2EB478703BF44383DDF80CA297F5E52A4424AF64B50CAB4E9C95C7288B96F8E77CDC63D07C6394853DF32F926652A12122B5531F90CFDFDAAC5D0642F84CF3901717B652122E8622CF31C06D134AD921EC80D175BBFC45B855EB9ABF001686BC52730F754DBFAE781BB629F1E530632D813AA256D0063202AEEE0AB64C7829C1A6C4702E27C88219FF31500D8F76BEFE4AEF726D6E3B708CB440830B
-20241129222503 2 6 100 6143 5 D530FFAD12BC56C29F02BEFEC6CFD700AE6DA852D7256FC0A8978C13FABF9851425A26917CD40A9919A06A5B17FA05456642891442CCBBBD9BB5B74068213AA6F029B3419F6B2CCB828CF9F6F0069F43A2496921ED8133BF2D9C598486282EB38B3B6E849B7D80B33869CDE1D71379C694BB9C229B5CCE5E96692F81DA73EC38942CE60A81657F34A6B1B536ADEADD76144A209815A88E081E0B96438B11A34E4F8082ACC6DD77D787EEA90E1764F7393D3869707FCFCD4BFEEA3582BBD39C17E2CE70B6A193700A055A50D2F5ED473DD9B4401C2138BAD8FA3331BDD4FF79E230C10B13FFE7CCDB3210F8DB42147BB8349CAEA97EBCBC708B9CE16360D573D3327BBCAA6387234E9A4DCB2E67784408ADB72B2E05643520211C581EBB38E57C2F69C9034143DBAB4C13221D501B892918779C6E9AC5B39F2F412E31EF7F7F0610C2AFE150FA56A5E3CF9DACA6C96F3BC6B57D56B2869019C5114247C080752E4D42B1A0E34302B69B8516E8FB93BE58CC45F6E5ADB47A89A00050A12D560BEEA8997F5A0FA526C107BA34ECB0C678079C6DD4C1F4666BBD45733E019C292A17661B79E6AEED002EF4F6E7F4D569690E140C8BA1BA47E626499E01DA1EACDA4B917507A472DDB03A86734994C4B16551C5DFED3C8C976D15B5BF68CC6C982355930E37F096629E6F3BDC8027C722C12EF76854F1C607341E48FBF8C9064EB48EFDA87E1D111B557FBE7A15A580EDD87AC2CEC0EB25BE057FC20D578DF34632977F4698D58B2025C50AD4AD77D16D32E6157F89F58C692A83279A2EB58F8E448A13AA32B8C3DF07A58100EC4BB319F824446ECDD643C4A7F959CBA4E356A9E5DB7332107B2EB478703BF44383DDF80CA297F5E52A4424AF64B50CAB4E9C95C7288B96F8E77CDC63D07C6394853DF32F926652A12122B5531F90CFDFDAAC5D0642F84CF3901717B652122E8622CF31C06D134AD921EC80D175BBFC45B855EB9ABF001686BC52730F754DBFAE781BB629F1E530632D813AA256D0063202AEEE0AB64C7829C1A6C4702E27C88219FF31500D8F76BEFE4AEF726D6E3B708CB545F1FF
-20241129233015 2 6 100 6143 5 D530FFAD12BC56C29F02BEFEC6CFD700AE6DA852D7256FC0A8978C13FABF9851425A26917CD40A9919A06A5B17FA05456642891442CCBBBD9BB5B74068213AA6F029B3419F6B2CCB828CF9F6F0069F43A2496921ED8133BF2D9C598486282EB38B3B6E849B7D80B33869CDE1D71379C694BB9C229B5CCE5E96692F81DA73EC38942CE60A81657F34A6B1B536ADEADD76144A209815A88E081E0B96438B11A34E4F8082ACC6DD77D787EEA90E1764F7393D3869707FCFCD4BFEEA3582BBD39C17E2CE70B6A193700A055A50D2F5ED473DD9B4401C2138BAD8FA3331BDD4FF79E230C10B13FFE7CCDB3210F8DB42147BB8349CAEA97EBCBC708B9CE16360D573D3327BBCAA6387234E9A4DCB2E67784408ADB72B2E05643520211C581EBB38E57C2F69C9034143DBAB4C13221D501B892918779C6E9AC5B39F2F412E31EF7F7F0610C2AFE150FA56A5E3CF9DACA6C96F3BC6B57D56B2869019C5114247C080752E4D42B1A0E34302B69B8516E8FB93BE58CC45F6E5ADB47A89A00050A12D560BEEA8997F5A0FA526C107BA34ECB0C678079C6DD4C1F4666BBD45733E019C292A17661B79E6AEED002EF4F6E7F4D569690E140C8BA1BA47E626499E01DA1EACDA4B917507A472DDB03A86734994C4B16551C5DFED3C8C976D15B5BF68CC6C982355930E37F096629E6F3BDC8027C722C12EF76854F1C607341E48FBF8C9064EB48EFDA87E1D111B557FBE7A15A580EDD87AC2CEC0EB25BE057FC20D578DF34632977F4698D58B2025C50AD4AD77D16D32E6157F89F58C692A83279A2EB58F8E448A13AA32B8C3DF07A58100EC4BB319F824446ECDD643C4A7F959CBA4E356A9E5DB7332107B2EB478703BF44383DDF80CA297F5E52A4424AF64B50CAB4E9C95C7288B96F8E77CDC63D07C6394853DF32F926652A12122B5531F90CFDFDAAC5D0642F84CF3901717B652122E8622CF31C06D134AD921EC80D175BBFC45B855EB9ABF001686BC52730F754DBFAE781BB629F1E530632D813AA256D0063202AEEE0AB64C7829C1A6C4702E27C88219FF31500D8F76BEFE4AEF726D6E3B708CBD76AB7F
-20241129234110 2 6 100 6143 2 D530FFAD12BC56C29F02BEFEC6CFD700AE6DA852D7256FC0A8978C13FABF9851425A26917CD40A9919A06A5B17FA05456642891442CCBBBD9BB5B74068213AA6F029B3419F6B2CCB828CF9F6F0069F43A2496921ED8133BF2D9C598486282EB38B3B6E849B7D80B33869CDE1D71379C694BB9C229B5CCE5E96692F81DA73EC38942CE60A81657F34A6B1B536ADEADD76144A209815A88E081E0B96438B11A34E4F8082ACC6DD77D787EEA90E1764F7393D3869707FCFCD4BFEEA3582BBD39C17E2CE70B6A193700A055A50D2F5ED473DD9B4401C2138BAD8FA3331BDD4FF79E230C10B13FFE7CCDB3210F8DB42147BB8349CAEA97EBCBC708B9CE16360D573D3327BBCAA6387234E9A4DCB2E67784408ADB72B2E05643520211C581EBB38E57C2F69C9034143DBAB4C13221D501B892918779C6E9AC5B39F2F412E31EF7F7F0610C2AFE150FA56A5E3CF9DACA6C96F3BC6B57D56B2869019C5114247C080752E4D42B1A0E34302B69B8516E8FB93BE58CC45F6E5ADB47A89A00050A12D560BEEA8997F5A0FA526C107BA34ECB0C678079C6DD4C1F4666BBD45733E019C292A17661B79E6AEED002EF4F6E7F4D569690E140C8BA1BA47E626499E01DA1EACDA4B917507A472DDB03A86734994C4B16551C5DFED3C8C976D15B5BF68CC6C982355930E37F096629E6F3BDC8027C722C12EF76854F1C607341E48FBF8C9064EB48EFDA87E1D111B557FBE7A15A580EDD87AC2CEC0EB25BE057FC20D578DF34632977F4698D58B2025C50AD4AD77D16D32E6157F89F58C692A83279A2EB58F8E448A13AA32B8C3DF07A58100EC4BB319F824446ECDD643C4A7F959CBA4E356A9E5DB7332107B2EB478703BF44383DDF80CA297F5E52A4424AF64B50CAB4E9C95C7288B96F8E77CDC63D07C6394853DF32F926652A12122B5531F90CFDFDAAC5D0642F84CF3901717B652122E8622CF31C06D134AD921EC80D175BBFC45B855EB9ABF001686BC52730F754DBFAE781BB629F1E530632D813AA256D0063202AEEE0AB64C7829C1A6C4702E27C88219FF31500D8F76BEFE4AEF726D6E3B708CBED26FD3
-20241130004028 2 6 100 7679 2 C4FD13B23C1EF3F1B888E9E24F6E6F0D1E538D5C17287A04247451367BAAC3EB0FF3633A10C1B2BEA19F91DA18C0C52A465FA0F0371A2189AC36BFEA58F33B013352F321A0B71BF61553330EC7735E66BF920F0AB9C918AC6796F3B2C5CC7B0E9F6695400B692026845D93807363115D8E1EF92072B84941DE896DC222F2493FA43169DC5C94E9F7C645CDDC38AC8C8F8790A2078B755BF65EB099CA5682E186E7DE95CBCF7036B0BFC761137EB0B297A140C1683E9A14E78F31935D873DFB2CC33563980FD7C6EB609427A9A63D9A7ECE43889783FAF17D129A4F00A7DBA8FAFCBDD57FA7599C944D03297B7106E02A82D695E8BC0ACC860295F357FD2F60CC4A09E49450CF735A8756174A8E1458E3BE2BEA10F38D2C30E6AD7DBFA6835328A64BDFCA2318E1753C922D3AA467BB770C03BE0D3381E31655F4969009A35E4CF90B1EF5CB71A7BE424E952AEF1368142BB6E5AEECB9F7EC2034179009B7E57DF234CDDC3818BE6E637DAC7F44B109BCAA519CA77B27E4A119712A325ACC29E82C5A3E43CDED00A550ABF99495C802578A6ACB7DBCCCECD3A3857F01A9582671D87C9407409355199D627D316938076334BCDEC6635E0D6696A53E2475AAF9412167245779FA0C89CC3C08BF90313C68710D0153A3B8FA06862B6670E9498296D2C1840812D51FFEADDAE3D714A6EA7D0DAF18C134A0E26AAA99AB8B605E5FAC1814D13F5BCA134DBCF40B5C21F39EF9B4089A759876E5F22DEAF3C64DAA159B9AFEB76109429E3E42FF8DB74EF84954405C4D7B826CFBE041FF996CB053ED44BD32742681CCC843CBD031CD9DDF299EF150378F87B5F67768C77A69F779AABC032BCC3031DDAD83701E475D16040D1E064208D99313C4047BA2AA44E15CF631E4337A47318F34060DAE2ED3FB2F77F26CAF51805D86F82786B8CED61C0A0A7A8CBECD9AE3FDD266BDA632E6F6095A8E2C82A709EF2ACE20D66CC6709A5EF4EBFBA3B020BD15A5451673CA3780A459C277EEA72A1C9EF8502281BF903B2409971DC1F215C899CBBDED194CAB8A5EBB2273E3B67AEEE9A18CD03A1CC46312AAE59AEA0EFB0E5EAC8A62D6C49DC5B5D5CAC7B12CC2B293ED1D258149C6E8ADFB311328C1D5ACD4A92DFC71E9575A62920166893D715358DAE87159E39267079FA5D2EF41D756E01E0D9701BE7F715E4DCEF5667576A883DC034E36022AB62707C4E9FF9C7400BD29770FC07C66BB041F17204A63B6A52177F32B1E8AF15A818E946421552673488AA76253A5CCAEF2368C6464A36DEA011A56FFACF5F592099BADEFA4B7A72059FF1869864BDDBD14B4D32460CFD30E78C4F057F011C6132BC003
-20241130023838 2 6 100 7679 5 C4FD13B23C1EF3F1B888E9E24F6E6F0D1E538D5C17287A04247451367BAAC3EB0FF3633A10C1B2BEA19F91DA18C0C52A465FA0F0371A2189AC36BFEA58F33B013352F321A0B71BF61553330EC7735E66BF920F0AB9C918AC6796F3B2C5CC7B0E9F6695400B692026845D93807363115D8E1EF92072B84941DE896DC222F2493FA43169DC5C94E9F7C645CDDC38AC8C8F8790A2078B755BF65EB099CA5682E186E7DE95CBCF7036B0BFC761137EB0B297A140C1683E9A14E78F31935D873DFB2CC33563980FD7C6EB609427A9A63D9A7ECE43889783FAF17D129A4F00A7DBA8FAFCBDD57FA7599C944D03297B7106E02A82D695E8BC0ACC860295F357FD2F60CC4A09E49450CF735A8756174A8E1458E3BE2BEA10F38D2C30E6AD7DBFA6835328A64BDFCA2318E1753C922D3AA467BB770C03BE0D3381E31655F4969009A35E4CF90B1EF5CB71A7BE424E952AEF1368142BB6E5AEECB9F7EC2034179009B7E57DF234CDDC3818BE6E637DAC7F44B109BCAA519CA77B27E4A119712A325ACC29E82C5A3E43CDED00A550ABF99495C802578A6ACB7DBCCCECD3A3857F01A9582671D87C9407409355199D627D316938076334BCDEC6635E0D6696A53E2475AAF9412167245779FA0C89CC3C08BF90313C68710D0153A3B8FA06862B6670E9498296D2C1840812D51FFEADDAE3D714A6EA7D0DAF18C134A0E26AAA99AB8B605E5FAC1814D13F5BCA134DBCF40B5C21F39EF9B4089A759876E5F22DEAF3C64DAA159B9AFEB76109429E3E42FF8DB74EF84954405C4D7B826CFBE041FF996CB053ED44BD32742681CCC843CBD031CD9DDF299EF150378F87B5F67768C77A69F779AABC032BCC3031DDAD83701E475D16040D1E064208D99313C4047BA2AA44E15CF631E4337A47318F34060DAE2ED3FB2F77F26CAF51805D86F82786B8CED61C0A0A7A8CBECD9AE3FDD266BDA632E6F6095A8E2C82A709EF2ACE20D66CC6709A5EF4EBFBA3B020BD15A5451673CA3780A459C277EEA72A1C9EF8502281BF903B2409971DC1F215C899CBBDED194CAB8A5EBB2273E3B67AEEE9A18CD03A1CC46312AAE59AEA0EFB0E5EAC8A62D6C49DC5B5D5CAC7B12CC2B293ED1D258149C6E8ADFB311328C1D5ACD4A92DFC71E9575A62920166893D715358DAE87159E39267079FA5D2EF41D756E01E0D9701BE7F715E4DCEF5667576A883DC034E36022AB62707C4E9FF9C7400BD29770FC07C66BB041F17204A63B6A52177F32B1E8AF15A818E946421552673488AA76253A5CCAEF2368C6464A36DEA011A56FFACF5F592099BADEFA4B7A72059FF1869864BDDBD14B4D32460CFD30E78C4F057F011C61B09AE47
-20241130030155 2 6 100 7679 2 C4FD13B23C1EF3F1B888E9E24F6E6F0D1E538D5C17287A04247451367BAAC3EB0FF3633A10C1B2BEA19F91DA18C0C52A465FA0F0371A2189AC36BFEA58F33B013352F321A0B71BF61553330EC7735E66BF920F0AB9C918AC6796F3B2C5CC7B0E9F6695400B692026845D93807363115D8E1EF92072B84941DE896DC222F2493FA43169DC5C94E9F7C645CDDC38AC8C8F8790A2078B755BF65EB099CA5682E186E7DE95CBCF7036B0BFC761137EB0B297A140C1683E9A14E78F31935D873DFB2CC33563980FD7C6EB609427A9A63D9A7ECE43889783FAF17D129A4F00A7DBA8FAFCBDD57FA7599C944D03297B7106E02A82D695E8BC0ACC860295F357FD2F60CC4A09E49450CF735A8756174A8E1458E3BE2BEA10F38D2C30E6AD7DBFA6835328A64BDFCA2318E1753C922D3AA467BB770C03BE0D3381E31655F4969009A35E4CF90B1EF5CB71A7BE424E952AEF1368142BB6E5AEECB9F7EC2034179009B7E57DF234CDDC3818BE6E637DAC7F44B109BCAA519CA77B27E4A119712A325ACC29E82C5A3E43CDED00A550ABF99495C802578A6ACB7DBCCCECD3A3857F01A9582671D87C9407409355199D627D316938076334BCDEC6635E0D6696A53E2475AAF9412167245779FA0C89CC3C08BF90313C68710D0153A3B8FA06862B6670E9498296D2C1840812D51FFEADDAE3D714A6EA7D0DAF18C134A0E26AAA99AB8B605E5FAC1814D13F5BCA134DBCF40B5C21F39EF9B4089A759876E5F22DEAF3C64DAA159B9AFEB76109429E3E42FF8DB74EF84954405C4D7B826CFBE041FF996CB053ED44BD32742681CCC843CBD031CD9DDF299EF150378F87B5F67768C77A69F779AABC032BCC3031DDAD83701E475D16040D1E064208D99313C4047BA2AA44E15CF631E4337A47318F34060DAE2ED3FB2F77F26CAF51805D86F82786B8CED61C0A0A7A8CBECD9AE3FDD266BDA632E6F6095A8E2C82A709EF2ACE20D66CC6709A5EF4EBFBA3B020BD15A5451673CA3780A459C277EEA72A1C9EF8502281BF903B2409971DC1F215C899CBBDED194CAB8A5EBB2273E3B67AEEE9A18CD03A1CC46312AAE59AEA0EFB0E5EAC8A62D6C49DC5B5D5CAC7B12CC2B293ED1D258149C6E8ADFB311328C1D5ACD4A92DFC71E9575A62920166893D715358DAE87159E39267079FA5D2EF41D756E01E0D9701BE7F715E4DCEF5667576A883DC034E36022AB62707C4E9FF9C7400BD29770FC07C66BB041F17204A63B6A52177F32B1E8AF15A818E946421552673488AA76253A5CCAEF2368C6464A36DEA011A56FFACF5F592099BADEFA4B7A72059FF1869864BDDBD14B4D32460CFD30E78C4F057F011C61C91151B
-20241130032532 2 6 100 7679 2 C4FD13B23C1EF3F1B888E9E24F6E6F0D1E538D5C17287A04247451367BAAC3EB0FF3633A10C1B2BEA19F91DA18C0C52A465FA0F0371A2189AC36BFEA58F33B013352F321A0B71BF61553330EC7735E66BF920F0AB9C918AC6796F3B2C5CC7B0E9F6695400B692026845D93807363115D8E1EF92072B84941DE896DC222F2493FA43169DC5C94E9F7C645CDDC38AC8C8F8790A2078B755BF65EB099CA5682E186E7DE95CBCF7036B0BFC761137EB0B297A140C1683E9A14E78F31935D873DFB2CC33563980FD7C6EB609427A9A63D9A7ECE43889783FAF17D129A4F00A7DBA8FAFCBDD57FA7599C944D03297B7106E02A82D695E8BC0ACC860295F357FD2F60CC4A09E49450CF735A8756174A8E1458E3BE2BEA10F38D2C30E6AD7DBFA6835328A64BDFCA2318E1753C922D3AA467BB770C03BE0D3381E31655F4969009A35E4CF90B1EF5CB71A7BE424E952AEF1368142BB6E5AEECB9F7EC2034179009B7E57DF234CDDC3818BE6E637DAC7F44B109BCAA519CA77B27E4A119712A325ACC29E82C5A3E43CDED00A550ABF99495C802578A6ACB7DBCCCECD3A3857F01A9582671D87C9407409355199D627D316938076334BCDEC6635E0D6696A53E2475AAF9412167245779FA0C89CC3C08BF90313C68710D0153A3B8FA06862B6670E9498296D2C1840812D51FFEADDAE3D714A6EA7D0DAF18C134A0E26AAA99AB8B605E5FAC1814D13F5BCA134DBCF40B5C21F39EF9B4089A759876E5F22DEAF3C64DAA159B9AFEB76109429E3E42FF8DB74EF84954405C4D7B826CFBE041FF996CB053ED44BD32742681CCC843CBD031CD9DDF299EF150378F87B5F67768C77A69F779AABC032BCC3031DDAD83701E475D16040D1E064208D99313C4047BA2AA44E15CF631E4337A47318F34060DAE2ED3FB2F77F26CAF51805D86F82786B8CED61C0A0A7A8CBECD9AE3FDD266BDA632E6F6095A8E2C82A709EF2ACE20D66CC6709A5EF4EBFBA3B020BD15A5451673CA3780A459C277EEA72A1C9EF8502281BF903B2409971DC1F215C899CBBDED194CAB8A5EBB2273E3B67AEEE9A18CD03A1CC46312AAE59AEA0EFB0E5EAC8A62D6C49DC5B5D5CAC7B12CC2B293ED1D258149C6E8ADFB311328C1D5ACD4A92DFC71E9575A62920166893D715358DAE87159E39267079FA5D2EF41D756E01E0D9701BE7F715E4DCEF5667576A883DC034E36022AB62707C4E9FF9C7400BD29770FC07C66BB041F17204A63B6A52177F32B1E8AF15A818E946421552673488AA76253A5CCAEF2368C6464A36DEA011A56FFACF5F592099BADEFA4B7A72059FF1869864BDDBD14B4D32460CFD30E78C4F057F011C61E1854B3
-20241130035131 2 6 100 7679 2 C4FD13B23C1EF3F1B888E9E24F6E6F0D1E538D5C17287A04247451367BAAC3EB0FF3633A10C1B2BEA19F91DA18C0C52A465FA0F0371A2189AC36BFEA58F33B013352F321A0B71BF61553330EC7735E66BF920F0AB9C918AC6796F3B2C5CC7B0E9F6695400B692026845D93807363115D8E1EF92072B84941DE896DC222F2493FA43169DC5C94E9F7C645CDDC38AC8C8F8790A2078B755BF65EB099CA5682E186E7DE95CBCF7036B0BFC761137EB0B297A140C1683E9A14E78F31935D873DFB2CC33563980FD7C6EB609427A9A63D9A7ECE43889783FAF17D129A4F00A7DBA8FAFCBDD57FA7599C944D03297B7106E02A82D695E8BC0ACC860295F357FD2F60CC4A09E49450CF735A8756174A8E1458E3BE2BEA10F38D2C30E6AD7DBFA6835328A64BDFCA2318E1753C922D3AA467BB770C03BE0D3381E31655F4969009A35E4CF90B1EF5CB71A7BE424E952AEF1368142BB6E5AEECB9F7EC2034179009B7E57DF234CDDC3818BE6E637DAC7F44B109BCAA519CA77B27E4A119712A325ACC29E82C5A3E43CDED00A550ABF99495C802578A6ACB7DBCCCECD3A3857F01A9582671D87C9407409355199D627D316938076334BCDEC6635E0D6696A53E2475AAF9412167245779FA0C89CC3C08BF90313C68710D0153A3B8FA06862B6670E9498296D2C1840812D51FFEADDAE3D714A6EA7D0DAF18C134A0E26AAA99AB8B605E5FAC1814D13F5BCA134DBCF40B5C21F39EF9B4089A759876E5F22DEAF3C64DAA159B9AFEB76109429E3E42FF8DB74EF84954405C4D7B826CFBE041FF996CB053ED44BD32742681CCC843CBD031CD9DDF299EF150378F87B5F67768C77A69F779AABC032BCC3031DDAD83701E475D16040D1E064208D99313C4047BA2AA44E15CF631E4337A47318F34060DAE2ED3FB2F77F26CAF51805D86F82786B8CED61C0A0A7A8CBECD9AE3FDD266BDA632E6F6095A8E2C82A709EF2ACE20D66CC6709A5EF4EBFBA3B020BD15A5451673CA3780A459C277EEA72A1C9EF8502281BF903B2409971DC1F215C899CBBDED194CAB8A5EBB2273E3B67AEEE9A18CD03A1CC46312AAE59AEA0EFB0E5EAC8A62D6C49DC5B5D5CAC7B12CC2B293ED1D258149C6E8ADFB311328C1D5ACD4A92DFC71E9575A62920166893D715358DAE87159E39267079FA5D2EF41D756E01E0D9701BE7F715E4DCEF5667576A883DC034E36022AB62707C4E9FF9C7400BD29770FC07C66BB041F17204A63B6A52177F32B1E8AF15A818E946421552673488AA76253A5CCAEF2368C6464A36DEA011A56FFACF5F592099BADEFA4B7A72059FF1869864BDDBD14B4D32460CFD30E78C4F057F011C61FD56C8B
-20241130035951 2 6 100 7679 5 C4FD13B23C1EF3F1B888E9E24F6E6F0D1E538D5C17287A04247451367BAAC3EB0FF3633A10C1B2BEA19F91DA18C0C52A465FA0F0371A2189AC36BFEA58F33B013352F321A0B71BF61553330EC7735E66BF920F0AB9C918AC6796F3B2C5CC7B0E9F6695400B692026845D93807363115D8E1EF92072B84941DE896DC222F2493FA43169DC5C94E9F7C645CDDC38AC8C8F8790A2078B755BF65EB099CA5682E186E7DE95CBCF7036B0BFC761137EB0B297A140C1683E9A14E78F31935D873DFB2CC33563980FD7C6EB609427A9A63D9A7ECE43889783FAF17D129A4F00A7DBA8FAFCBDD57FA7599C944D03297B7106E02A82D695E8BC0ACC860295F357FD2F60CC4A09E49450CF735A8756174A8E1458E3BE2BEA10F38D2C30E6AD7DBFA6835328A64BDFCA2318E1753C922D3AA467BB770C03BE0D3381E31655F4969009A35E4CF90B1EF5CB71A7BE424E952AEF1368142BB6E5AEECB9F7EC2034179009B7E57DF234CDDC3818BE6E637DAC7F44B109BCAA519CA77B27E4A119712A325ACC29E82C5A3E43CDED00A550ABF99495C802578A6ACB7DBCCCECD3A3857F01A9582671D87C9407409355199D627D316938076334BCDEC6635E0D6696A53E2475AAF9412167245779FA0C89CC3C08BF90313C68710D0153A3B8FA06862B6670E9498296D2C1840812D51FFEADDAE3D714A6EA7D0DAF18C134A0E26AAA99AB8B605E5FAC1814D13F5BCA134DBCF40B5C21F39EF9B4089A759876E5F22DEAF3C64DAA159B9AFEB76109429E3E42FF8DB74EF84954405C4D7B826CFBE041FF996CB053ED44BD32742681CCC843CBD031CD9DDF299EF150378F87B5F67768C77A69F779AABC032BCC3031DDAD83701E475D16040D1E064208D99313C4047BA2AA44E15CF631E4337A47318F34060DAE2ED3FB2F77F26CAF51805D86F82786B8CED61C0A0A7A8CBECD9AE3FDD266BDA632E6F6095A8E2C82A709EF2ACE20D66CC6709A5EF4EBFBA3B020BD15A5451673CA3780A459C277EEA72A1C9EF8502281BF903B2409971DC1F215C899CBBDED194CAB8A5EBB2273E3B67AEEE9A18CD03A1CC46312AAE59AEA0EFB0E5EAC8A62D6C49DC5B5D5CAC7B12CC2B293ED1D258149C6E8ADFB311328C1D5ACD4A92DFC71E9575A62920166893D715358DAE87159E39267079FA5D2EF41D756E01E0D9701BE7F715E4DCEF5667576A883DC034E36022AB62707C4E9FF9C7400BD29770FC07C66BB041F17204A63B6A52177F32B1E8AF15A818E946421552673488AA76253A5CCAEF2368C6464A36DEA011A56FFACF5F592099BADEFA4B7A72059FF1869864BDDBD14B4D32460CFD30E78C4F057F011C6205D0C3F
-20241130040156 2 6 100 7679 2 C4FD13B23C1EF3F1B888E9E24F6E6F0D1E538D5C17287A04247451367BAAC3EB0FF3633A10C1B2BEA19F91DA18C0C52A465FA0F0371A2189AC36BFEA58F33B013352F321A0B71BF61553330EC7735E66BF920F0AB9C918AC6796F3B2C5CC7B0E9F6695400B692026845D93807363115D8E1EF92072B84941DE896DC222F2493FA43169DC5C94E9F7C645CDDC38AC8C8F8790A2078B755BF65EB099CA5682E186E7DE95CBCF7036B0BFC761137EB0B297A140C1683E9A14E78F31935D873DFB2CC33563980FD7C6EB609427A9A63D9A7ECE43889783FAF17D129A4F00A7DBA8FAFCBDD57FA7599C944D03297B7106E02A82D695E8BC0ACC860295F357FD2F60CC4A09E49450CF735A8756174A8E1458E3BE2BEA10F38D2C30E6AD7DBFA6835328A64BDFCA2318E1753C922D3AA467BB770C03BE0D3381E31655F4969009A35E4CF90B1EF5CB71A7BE424E952AEF1368142BB6E5AEECB9F7EC2034179009B7E57DF234CDDC3818BE6E637DAC7F44B109BCAA519CA77B27E4A119712A325ACC29E82C5A3E43CDED00A550ABF99495C802578A6ACB7DBCCCECD3A3857F01A9582671D87C9407409355199D627D316938076334BCDEC6635E0D6696A53E2475AAF9412167245779FA0C89CC3C08BF90313C68710D0153A3B8FA06862B6670E9498296D2C1840812D51FFEADDAE3D714A6EA7D0DAF18C134A0E26AAA99AB8B605E5FAC1814D13F5BCA134DBCF40B5C21F39EF9B4089A759876E5F22DEAF3C64DAA159B9AFEB76109429E3E42FF8DB74EF84954405C4D7B826CFBE041FF996CB053ED44BD32742681CCC843CBD031CD9DDF299EF150378F87B5F67768C77A69F779AABC032BCC3031DDAD83701E475D16040D1E064208D99313C4047BA2AA44E15CF631E4337A47318F34060DAE2ED3FB2F77F26CAF51805D86F82786B8CED61C0A0A7A8CBECD9AE3FDD266BDA632E6F6095A8E2C82A709EF2ACE20D66CC6709A5EF4EBFBA3B020BD15A5451673CA3780A459C277EEA72A1C9EF8502281BF903B2409971DC1F215C899CBBDED194CAB8A5EBB2273E3B67AEEE9A18CD03A1CC46312AAE59AEA0EFB0E5EAC8A62D6C49DC5B5D5CAC7B12CC2B293ED1D258149C6E8ADFB311328C1D5ACD4A92DFC71E9575A62920166893D715358DAE87159E39267079FA5D2EF41D756E01E0D9701BE7F715E4DCEF5667576A883DC034E36022AB62707C4E9FF9C7400BD29770FC07C66BB041F17204A63B6A52177F32B1E8AF15A818E946421552673488AA76253A5CCAEF2368C6464A36DEA011A56FFACF5F592099BADEFA4B7A72059FF1869864BDDBD14B4D32460CFD30E78C4F057F011C6207AF313
-20241130042927 2 6 100 7679 2 C4FD13B23C1EF3F1B888E9E24F6E6F0D1E538D5C17287A04247451367BAAC3EB0FF3633A10C1B2BEA19F91DA18C0C52A465FA0F0371A2189AC36BFEA58F33B013352F321A0B71BF61553330EC7735E66BF920F0AB9C918AC6796F3B2C5CC7B0E9F6695400B692026845D93807363115D8E1EF92072B84941DE896DC222F2493FA43169DC5C94E9F7C645CDDC38AC8C8F8790A2078B755BF65EB099CA5682E186E7DE95CBCF7036B0BFC761137EB0B297A140C1683E9A14E78F31935D873DFB2CC33563980FD7C6EB609427A9A63D9A7ECE43889783FAF17D129A4F00A7DBA8FAFCBDD57FA7599C944D03297B7106E02A82D695E8BC0ACC860295F357FD2F60CC4A09E49450CF735A8756174A8E1458E3BE2BEA10F38D2C30E6AD7DBFA6835328A64BDFCA2318E1753C922D3AA467BB770C03BE0D3381E31655F4969009A35E4CF90B1EF5CB71A7BE424E952AEF1368142BB6E5AEECB9F7EC2034179009B7E57DF234CDDC3818BE6E637DAC7F44B109BCAA519CA77B27E4A119712A325ACC29E82C5A3E43CDED00A550ABF99495C802578A6ACB7DBCCCECD3A3857F01A9582671D87C9407409355199D627D316938076334BCDEC6635E0D6696A53E2475AAF9412167245779FA0C89CC3C08BF90313C68710D0153A3B8FA06862B6670E9498296D2C1840812D51FFEADDAE3D714A6EA7D0DAF18C134A0E26AAA99AB8B605E5FAC1814D13F5BCA134DBCF40B5C21F39EF9B4089A759876E5F22DEAF3C64DAA159B9AFEB76109429E3E42FF8DB74EF84954405C4D7B826CFBE041FF996CB053ED44BD32742681CCC843CBD031CD9DDF299EF150378F87B5F67768C77A69F779AABC032BCC3031DDAD83701E475D16040D1E064208D99313C4047BA2AA44E15CF631E4337A47318F34060DAE2ED3FB2F77F26CAF51805D86F82786B8CED61C0A0A7A8CBECD9AE3FDD266BDA632E6F6095A8E2C82A709EF2ACE20D66CC6709A5EF4EBFBA3B020BD15A5451673CA3780A459C277EEA72A1C9EF8502281BF903B2409971DC1F215C899CBBDED194CAB8A5EBB2273E3B67AEEE9A18CD03A1CC46312AAE59AEA0EFB0E5EAC8A62D6C49DC5B5D5CAC7B12CC2B293ED1D258149C6E8ADFB311328C1D5ACD4A92DFC71E9575A62920166893D715358DAE87159E39267079FA5D2EF41D756E01E0D9701BE7F715E4DCEF5667576A883DC034E36022AB62707C4E9FF9C7400BD29770FC07C66BB041F17204A63B6A52177F32B1E8AF15A818E946421552673488AA76253A5CCAEF2368C6464A36DEA011A56FFACF5F592099BADEFA4B7A72059FF1869864BDDBD14B4D32460CFD30E78C4F057F011C6224FB4F3
-20241130043039 2 6 100 7679 5 C4FD13B23C1EF3F1B888E9E24F6E6F0D1E538D5C17287A04247451367BAAC3EB0FF3633A10C1B2BEA19F91DA18C0C52A465FA0F0371A2189AC36BFEA58F33B013352F321A0B71BF61553330EC7735E66BF920F0AB9C918AC6796F3B2C5CC7B0E9F6695400B692026845D93807363115D8E1EF92072B84941DE896DC222F2493FA43169DC5C94E9F7C645CDDC38AC8C8F8790A2078B755BF65EB099CA5682E186E7DE95CBCF7036B0BFC761137EB0B297A140C1683E9A14E78F31935D873DFB2CC33563980FD7C6EB609427A9A63D9A7ECE43889783FAF17D129A4F00A7DBA8FAFCBDD57FA7599C944D03297B7106E02A82D695E8BC0ACC860295F357FD2F60CC4A09E49450CF735A8756174A8E1458E3BE2BEA10F38D2C30E6AD7DBFA6835328A64BDFCA2318E1753C922D3AA467BB770C03BE0D3381E31655F4969009A35E4CF90B1EF5CB71A7BE424E952AEF1368142BB6E5AEECB9F7EC2034179009B7E57DF234CDDC3818BE6E637DAC7F44B109BCAA519CA77B27E4A119712A325ACC29E82C5A3E43CDED00A550ABF99495C802578A6ACB7DBCCCECD3A3857F01A9582671D87C9407409355199D627D316938076334BCDEC6635E0D6696A53E2475AAF9412167245779FA0C89CC3C08BF90313C68710D0153A3B8FA06862B6670E9498296D2C1840812D51FFEADDAE3D714A6EA7D0DAF18C134A0E26AAA99AB8B605E5FAC1814D13F5BCA134DBCF40B5C21F39EF9B4089A759876E5F22DEAF3C64DAA159B9AFEB76109429E3E42FF8DB74EF84954405C4D7B826CFBE041FF996CB053ED44BD32742681CCC843CBD031CD9DDF299EF150378F87B5F67768C77A69F779AABC032BCC3031DDAD83701E475D16040D1E064208D99313C4047BA2AA44E15CF631E4337A47318F34060DAE2ED3FB2F77F26CAF51805D86F82786B8CED61C0A0A7A8CBECD9AE3FDD266BDA632E6F6095A8E2C82A709EF2ACE20D66CC6709A5EF4EBFBA3B020BD15A5451673CA3780A459C277EEA72A1C9EF8502281BF903B2409971DC1F215C899CBBDED194CAB8A5EBB2273E3B67AEEE9A18CD03A1CC46312AAE59AEA0EFB0E5EAC8A62D6C49DC5B5D5CAC7B12CC2B293ED1D258149C6E8ADFB311328C1D5ACD4A92DFC71E9575A62920166893D715358DAE87159E39267079FA5D2EF41D756E01E0D9701BE7F715E4DCEF5667576A883DC034E36022AB62707C4E9FF9C7400BD29770FC07C66BB041F17204A63B6A52177F32B1E8AF15A818E946421552673488AA76253A5CCAEF2368C6464A36DEA011A56FFACF5F592099BADEFA4B7A72059FF1869864BDDBD14B4D32460CFD30E78C4F057F011C6225C64C7
-20241130054524 2 6 100 7679 2 C4FD13B23C1EF3F1B888E9E24F6E6F0D1E538D5C17287A04247451367BAAC3EB0FF3633A10C1B2BEA19F91DA18C0C52A465FA0F0371A2189AC36BFEA58F33B013352F321A0B71BF61553330EC7735E66BF920F0AB9C918AC6796F3B2C5CC7B0E9F6695400B692026845D93807363115D8E1EF92072B84941DE896DC222F2493FA43169DC5C94E9F7C645CDDC38AC8C8F8790A2078B755BF65EB099CA5682E186E7DE95CBCF7036B0BFC761137EB0B297A140C1683E9A14E78F31935D873DFB2CC33563980FD7C6EB609427A9A63D9A7ECE43889783FAF17D129A4F00A7DBA8FAFCBDD57FA7599C944D03297B7106E02A82D695E8BC0ACC860295F357FD2F60CC4A09E49450CF735A8756174A8E1458E3BE2BEA10F38D2C30E6AD7DBFA6835328A64BDFCA2318E1753C922D3AA467BB770C03BE0D3381E31655F4969009A35E4CF90B1EF5CB71A7BE424E952AEF1368142BB6E5AEECB9F7EC2034179009B7E57DF234CDDC3818BE6E637DAC7F44B109BCAA519CA77B27E4A119712A325ACC29E82C5A3E43CDED00A550ABF99495C802578A6ACB7DBCCCECD3A3857F01A9582671D87C9407409355199D627D316938076334BCDEC6635E0D6696A53E2475AAF9412167245779FA0C89CC3C08BF90313C68710D0153A3B8FA06862B6670E9498296D2C1840812D51FFEADDAE3D714A6EA7D0DAF18C134A0E26AAA99AB8B605E5FAC1814D13F5BCA134DBCF40B5C21F39EF9B4089A759876E5F22DEAF3C64DAA159B9AFEB76109429E3E42FF8DB74EF84954405C4D7B826CFBE041FF996CB053ED44BD32742681CCC843CBD031CD9DDF299EF150378F87B5F67768C77A69F779AABC032BCC3031DDAD83701E475D16040D1E064208D99313C4047BA2AA44E15CF631E4337A47318F34060DAE2ED3FB2F77F26CAF51805D86F82786B8CED61C0A0A7A8CBECD9AE3FDD266BDA632E6F6095A8E2C82A709EF2ACE20D66CC6709A5EF4EBFBA3B020BD15A5451673CA3780A459C277EEA72A1C9EF8502281BF903B2409971DC1F215C899CBBDED194CAB8A5EBB2273E3B67AEEE9A18CD03A1CC46312AAE59AEA0EFB0E5EAC8A62D6C49DC5B5D5CAC7B12CC2B293ED1D258149C6E8ADFB311328C1D5ACD4A92DFC71E9575A62920166893D715358DAE87159E39267079FA5D2EF41D756E01E0D9701BE7F715E4DCEF5667576A883DC034E36022AB62707C4E9FF9C7400BD29770FC07C66BB041F17204A63B6A52177F32B1E8AF15A818E946421552673488AA76253A5CCAEF2368C6464A36DEA011A56FFACF5F592099BADEFA4B7A72059FF1869864BDDBD14B4D32460CFD30E78C4F057F011C62750439B
-20241130063335 2 6 100 7679 5 C4FD13B23C1EF3F1B888E9E24F6E6F0D1E538D5C17287A04247451367BAAC3EB0FF3633A10C1B2BEA19F91DA18C0C52A465FA0F0371A2189AC36BFEA58F33B013352F321A0B71BF61553330EC7735E66BF920F0AB9C918AC6796F3B2C5CC7B0E9F6695400B692026845D93807363115D8E1EF92072B84941DE896DC222F2493FA43169DC5C94E9F7C645CDDC38AC8C8F8790A2078B755BF65EB099CA5682E186E7DE95CBCF7036B0BFC761137EB0B297A140C1683E9A14E78F31935D873DFB2CC33563980FD7C6EB609427A9A63D9A7ECE43889783FAF17D129A4F00A7DBA8FAFCBDD57FA7599C944D03297B7106E02A82D695E8BC0ACC860295F357FD2F60CC4A09E49450CF735A8756174A8E1458E3BE2BEA10F38D2C30E6AD7DBFA6835328A64BDFCA2318E1753C922D3AA467BB770C03BE0D3381E31655F4969009A35E4CF90B1EF5CB71A7BE424E952AEF1368142BB6E5AEECB9F7EC2034179009B7E57DF234CDDC3818BE6E637DAC7F44B109BCAA519CA77B27E4A119712A325ACC29E82C5A3E43CDED00A550ABF99495C802578A6ACB7DBCCCECD3A3857F01A9582671D87C9407409355199D627D316938076334BCDEC6635E0D6696A53E2475AAF9412167245779FA0C89CC3C08BF90313C68710D0153A3B8FA06862B6670E9498296D2C1840812D51FFEADDAE3D714A6EA7D0DAF18C134A0E26AAA99AB8B605E5FAC1814D13F5BCA134DBCF40B5C21F39EF9B4089A759876E5F22DEAF3C64DAA159B9AFEB76109429E3E42FF8DB74EF84954405C4D7B826CFBE041FF996CB053ED44BD32742681CCC843CBD031CD9DDF299EF150378F87B5F67768C77A69F779AABC032BCC3031DDAD83701E475D16040D1E064208D99313C4047BA2AA44E15CF631E4337A47318F34060DAE2ED3FB2F77F26CAF51805D86F82786B8CED61C0A0A7A8CBECD9AE3FDD266BDA632E6F6095A8E2C82A709EF2ACE20D66CC6709A5EF4EBFBA3B020BD15A5451673CA3780A459C277EEA72A1C9EF8502281BF903B2409971DC1F215C899CBBDED194CAB8A5EBB2273E3B67AEEE9A18CD03A1CC46312AAE59AEA0EFB0E5EAC8A62D6C49DC5B5D5CAC7B12CC2B293ED1D258149C6E8ADFB311328C1D5ACD4A92DFC71E9575A62920166893D715358DAE87159E39267079FA5D2EF41D756E01E0D9701BE7F715E4DCEF5667576A883DC034E36022AB62707C4E9FF9C7400BD29770FC07C66BB041F17204A63B6A52177F32B1E8AF15A818E946421552673488AA76253A5CCAEF2368C6464A36DEA011A56FFACF5F592099BADEFA4B7A72059FF1869864BDDBD14B4D32460CFD30E78C4F057F011C62A7BB5C7
-20241130074248 2 6 100 7679 2 C4FD13B23C1EF3F1B888E9E24F6E6F0D1E538D5C17287A04247451367BAAC3EB0FF3633A10C1B2BEA19F91DA18C0C52A465FA0F0371A2189AC36BFEA58F33B013352F321A0B71BF61553330EC7735E66BF920F0AB9C918AC6796F3B2C5CC7B0E9F6695400B692026845D93807363115D8E1EF92072B84941DE896DC222F2493FA43169DC5C94E9F7C645CDDC38AC8C8F8790A2078B755BF65EB099CA5682E186E7DE95CBCF7036B0BFC761137EB0B297A140C1683E9A14E78F31935D873DFB2CC33563980FD7C6EB609427A9A63D9A7ECE43889783FAF17D129A4F00A7DBA8FAFCBDD57FA7599C944D03297B7106E02A82D695E8BC0ACC860295F357FD2F60CC4A09E49450CF735A8756174A8E1458E3BE2BEA10F38D2C30E6AD7DBFA6835328A64BDFCA2318E1753C922D3AA467BB770C03BE0D3381E31655F4969009A35E4CF90B1EF5CB71A7BE424E952AEF1368142BB6E5AEECB9F7EC2034179009B7E57DF234CDDC3818BE6E637DAC7F44B109BCAA519CA77B27E4A119712A325ACC29E82C5A3E43CDED00A550ABF99495C802578A6ACB7DBCCCECD3A3857F01A9582671D87C9407409355199D627D316938076334BCDEC6635E0D6696A53E2475AAF9412167245779FA0C89CC3C08BF90313C68710D0153A3B8FA06862B6670E9498296D2C1840812D51FFEADDAE3D714A6EA7D0DAF18C134A0E26AAA99AB8B605E5FAC1814D13F5BCA134DBCF40B5C21F39EF9B4089A759876E5F22DEAF3C64DAA159B9AFEB76109429E3E42FF8DB74EF84954405C4D7B826CFBE041FF996CB053ED44BD32742681CCC843CBD031CD9DDF299EF150378F87B5F67768C77A69F779AABC032BCC3031DDAD83701E475D16040D1E064208D99313C4047BA2AA44E15CF631E4337A47318F34060DAE2ED3FB2F77F26CAF51805D86F82786B8CED61C0A0A7A8CBECD9AE3FDD266BDA632E6F6095A8E2C82A709EF2ACE20D66CC6709A5EF4EBFBA3B020BD15A5451673CA3780A459C277EEA72A1C9EF8502281BF903B2409971DC1F215C899CBBDED194CAB8A5EBB2273E3B67AEEE9A18CD03A1CC46312AAE59AEA0EFB0E5EAC8A62D6C49DC5B5D5CAC7B12CC2B293ED1D258149C6E8ADFB311328C1D5ACD4A92DFC71E9575A62920166893D715358DAE87159E39267079FA5D2EF41D756E01E0D9701BE7F715E4DCEF5667576A883DC034E36022AB62707C4E9FF9C7400BD29770FC07C66BB041F17204A63B6A52177F32B1E8AF15A818E946421552673488AA76253A5CCAEF2368C6464A36DEA011A56FFACF5F592099BADEFA4B7A72059FF1869864BDDBD14B4D32460CFD30E78C4F057F011C62F113613
-20241130074437 2 6 100 7679 2 C4FD13B23C1EF3F1B888E9E24F6E6F0D1E538D5C17287A04247451367BAAC3EB0FF3633A10C1B2BEA19F91DA18C0C52A465FA0F0371A2189AC36BFEA58F33B013352F321A0B71BF61553330EC7735E66BF920F0AB9C918AC6796F3B2C5CC7B0E9F6695400B692026845D93807363115D8E1EF92072B84941DE896DC222F2493FA43169DC5C94E9F7C645CDDC38AC8C8F8790A2078B755BF65EB099CA5682E186E7DE95CBCF7036B0BFC761137EB0B297A140C1683E9A14E78F31935D873DFB2CC33563980FD7C6EB609427A9A63D9A7ECE43889783FAF17D129A4F00A7DBA8FAFCBDD57FA7599C944D03297B7106E02A82D695E8BC0ACC860295F357FD2F60CC4A09E49450CF735A8756174A8E1458E3BE2BEA10F38D2C30E6AD7DBFA6835328A64BDFCA2318E1753C922D3AA467BB770C03BE0D3381E31655F4969009A35E4CF90B1EF5CB71A7BE424E952AEF1368142BB6E5AEECB9F7EC2034179009B7E57DF234CDDC3818BE6E637DAC7F44B109BCAA519CA77B27E4A119712A325ACC29E82C5A3E43CDED00A550ABF99495C802578A6ACB7DBCCCECD3A3857F01A9582671D87C9407409355199D627D316938076334BCDEC6635E0D6696A53E2475AAF9412167245779FA0C89CC3C08BF90313C68710D0153A3B8FA06862B6670E9498296D2C1840812D51FFEADDAE3D714A6EA7D0DAF18C134A0E26AAA99AB8B605E5FAC1814D13F5BCA134DBCF40B5C21F39EF9B4089A759876E5F22DEAF3C64DAA159B9AFEB76109429E3E42FF8DB74EF84954405C4D7B826CFBE041FF996CB053ED44BD32742681CCC843CBD031CD9DDF299EF150378F87B5F67768C77A69F779AABC032BCC3031DDAD83701E475D16040D1E064208D99313C4047BA2AA44E15CF631E4337A47318F34060DAE2ED3FB2F77F26CAF51805D86F82786B8CED61C0A0A7A8CBECD9AE3FDD266BDA632E6F6095A8E2C82A709EF2ACE20D66CC6709A5EF4EBFBA3B020BD15A5451673CA3780A459C277EEA72A1C9EF8502281BF903B2409971DC1F215C899CBBDED194CAB8A5EBB2273E3B67AEEE9A18CD03A1CC46312AAE59AEA0EFB0E5EAC8A62D6C49DC5B5D5CAC7B12CC2B293ED1D258149C6E8ADFB311328C1D5ACD4A92DFC71E9575A62920166893D715358DAE87159E39267079FA5D2EF41D756E01E0D9701BE7F715E4DCEF5667576A883DC034E36022AB62707C4E9FF9C7400BD29770FC07C66BB041F17204A63B6A52177F32B1E8AF15A818E946421552673488AA76253A5CCAEF2368C6464A36DEA011A56FFACF5F592099BADEFA4B7A72059FF1869864BDDBD14B4D32460CFD30E78C4F057F011C62F28387B
-20241130083311 2 6 100 7679 2 C4FD13B23C1EF3F1B888E9E24F6E6F0D1E538D5C17287A04247451367BAAC3EB0FF3633A10C1B2BEA19F91DA18C0C52A465FA0F0371A2189AC36BFEA58F33B013352F321A0B71BF61553330EC7735E66BF920F0AB9C918AC6796F3B2C5CC7B0E9F6695400B692026845D93807363115D8E1EF92072B84941DE896DC222F2493FA43169DC5C94E9F7C645CDDC38AC8C8F8790A2078B755BF65EB099CA5682E186E7DE95CBCF7036B0BFC761137EB0B297A140C1683E9A14E78F31935D873DFB2CC33563980FD7C6EB609427A9A63D9A7ECE43889783FAF17D129A4F00A7DBA8FAFCBDD57FA7599C944D03297B7106E02A82D695E8BC0ACC860295F357FD2F60CC4A09E49450CF735A8756174A8E1458E3BE2BEA10F38D2C30E6AD7DBFA6835328A64BDFCA2318E1753C922D3AA467BB770C03BE0D3381E31655F4969009A35E4CF90B1EF5CB71A7BE424E952AEF1368142BB6E5AEECB9F7EC2034179009B7E57DF234CDDC3818BE6E637DAC7F44B109BCAA519CA77B27E4A119712A325ACC29E82C5A3E43CDED00A550ABF99495C802578A6ACB7DBCCCECD3A3857F01A9582671D87C9407409355199D627D316938076334BCDEC6635E0D6696A53E2475AAF9412167245779FA0C89CC3C08BF90313C68710D0153A3B8FA06862B6670E9498296D2C1840812D51FFEADDAE3D714A6EA7D0DAF18C134A0E26AAA99AB8B605E5FAC1814D13F5BCA134DBCF40B5C21F39EF9B4089A759876E5F22DEAF3C64DAA159B9AFEB76109429E3E42FF8DB74EF84954405C4D7B826CFBE041FF996CB053ED44BD32742681CCC843CBD031CD9DDF299EF150378F87B5F67768C77A69F779AABC032BCC3031DDAD83701E475D16040D1E064208D99313C4047BA2AA44E15CF631E4337A47318F34060DAE2ED3FB2F77F26CAF51805D86F82786B8CED61C0A0A7A8CBECD9AE3FDD266BDA632E6F6095A8E2C82A709EF2ACE20D66CC6709A5EF4EBFBA3B020BD15A5451673CA3780A459C277EEA72A1C9EF8502281BF903B2409971DC1F215C899CBBDED194CAB8A5EBB2273E3B67AEEE9A18CD03A1CC46312AAE59AEA0EFB0E5EAC8A62D6C49DC5B5D5CAC7B12CC2B293ED1D258149C6E8ADFB311328C1D5ACD4A92DFC71E9575A62920166893D715358DAE87159E39267079FA5D2EF41D756E01E0D9701BE7F715E4DCEF5667576A883DC034E36022AB62707C4E9FF9C7400BD29770FC07C66BB041F17204A63B6A52177F32B1E8AF15A818E946421552673488AA76253A5CCAEF2368C6464A36DEA011A56FFACF5F592099BADEFA4B7A72059FF1869864BDDBD14B4D32460CFD30E78C4F057F011C6325DE613
-20241130093434 2 6 100 7679 5 C4FD13B23C1EF3F1B888E9E24F6E6F0D1E538D5C17287A04247451367BAAC3EB0FF3633A10C1B2BEA19F91DA18C0C52A465FA0F0371A2189AC36BFEA58F33B013352F321A0B71BF61553330EC7735E66BF920F0AB9C918AC6796F3B2C5CC7B0E9F6695400B692026845D93807363115D8E1EF92072B84941DE896DC222F2493FA43169DC5C94E9F7C645CDDC38AC8C8F8790A2078B755BF65EB099CA5682E186E7DE95CBCF7036B0BFC761137EB0B297A140C1683E9A14E78F31935D873DFB2CC33563980FD7C6EB609427A9A63D9A7ECE43889783FAF17D129A4F00A7DBA8FAFCBDD57FA7599C944D03297B7106E02A82D695E8BC0ACC860295F357FD2F60CC4A09E49450CF735A8756174A8E1458E3BE2BEA10F38D2C30E6AD7DBFA6835328A64BDFCA2318E1753C922D3AA467BB770C03BE0D3381E31655F4969009A35E4CF90B1EF5CB71A7BE424E952AEF1368142BB6E5AEECB9F7EC2034179009B7E57DF234CDDC3818BE6E637DAC7F44B109BCAA519CA77B27E4A119712A325ACC29E82C5A3E43CDED00A550ABF99495C802578A6ACB7DBCCCECD3A3857F01A9582671D87C9407409355199D627D316938076334BCDEC6635E0D6696A53E2475AAF9412167245779FA0C89CC3C08BF90313C68710D0153A3B8FA06862B6670E9498296D2C1840812D51FFEADDAE3D714A6EA7D0DAF18C134A0E26AAA99AB8B605E5FAC1814D13F5BCA134DBCF40B5C21F39EF9B4089A759876E5F22DEAF3C64DAA159B9AFEB76109429E3E42FF8DB74EF84954405C4D7B826CFBE041FF996CB053ED44BD32742681CCC843CBD031CD9DDF299EF150378F87B5F67768C77A69F779AABC032BCC3031DDAD83701E475D16040D1E064208D99313C4047BA2AA44E15CF631E4337A47318F34060DAE2ED3FB2F77F26CAF51805D86F82786B8CED61C0A0A7A8CBECD9AE3FDD266BDA632E6F6095A8E2C82A709EF2ACE20D66CC6709A5EF4EBFBA3B020BD15A5451673CA3780A459C277EEA72A1C9EF8502281BF903B2409971DC1F215C899CBBDED194CAB8A5EBB2273E3B67AEEE9A18CD03A1CC46312AAE59AEA0EFB0E5EAC8A62D6C49DC5B5D5CAC7B12CC2B293ED1D258149C6E8ADFB311328C1D5ACD4A92DFC71E9575A62920166893D715358DAE87159E39267079FA5D2EF41D756E01E0D9701BE7F715E4DCEF5667576A883DC034E36022AB62707C4E9FF9C7400BD29770FC07C66BB041F17204A63B6A52177F32B1E8AF15A818E946421552673488AA76253A5CCAEF2368C6464A36DEA011A56FFACF5F592099BADEFA4B7A72059FF1869864BDDBD14B4D32460CFD30E78C4F057F011C636728027
-20241130105425 2 6 100 7679 2 C4FD13B23C1EF3F1B888E9E24F6E6F0D1E538D5C17287A04247451367BAAC3EB0FF3633A10C1B2BEA19F91DA18C0C52A465FA0F0371A2189AC36BFEA58F33B013352F321A0B71BF61553330EC7735E66BF920F0AB9C918AC6796F3B2C5CC7B0E9F6695400B692026845D93807363115D8E1EF92072B84941DE896DC222F2493FA43169DC5C94E9F7C645CDDC38AC8C8F8790A2078B755BF65EB099CA5682E186E7DE95CBCF7036B0BFC761137EB0B297A140C1683E9A14E78F31935D873DFB2CC33563980FD7C6EB609427A9A63D9A7ECE43889783FAF17D129A4F00A7DBA8FAFCBDD57FA7599C944D03297B7106E02A82D695E8BC0ACC860295F357FD2F60CC4A09E49450CF735A8756174A8E1458E3BE2BEA10F38D2C30E6AD7DBFA6835328A64BDFCA2318E1753C922D3AA467BB770C03BE0D3381E31655F4969009A35E4CF90B1EF5CB71A7BE424E952AEF1368142BB6E5AEECB9F7EC2034179009B7E57DF234CDDC3818BE6E637DAC7F44B109BCAA519CA77B27E4A119712A325ACC29E82C5A3E43CDED00A550ABF99495C802578A6ACB7DBCCCECD3A3857F01A9582671D87C9407409355199D627D316938076334BCDEC6635E0D6696A53E2475AAF9412167245779FA0C89CC3C08BF90313C68710D0153A3B8FA06862B6670E9498296D2C1840812D51FFEADDAE3D714A6EA7D0DAF18C134A0E26AAA99AB8B605E5FAC1814D13F5BCA134DBCF40B5C21F39EF9B4089A759876E5F22DEAF3C64DAA159B9AFEB76109429E3E42FF8DB74EF84954405C4D7B826CFBE041FF996CB053ED44BD32742681CCC843CBD031CD9DDF299EF150378F87B5F67768C77A69F779AABC032BCC3031DDAD83701E475D16040D1E064208D99313C4047BA2AA44E15CF631E4337A47318F34060DAE2ED3FB2F77F26CAF51805D86F82786B8CED61C0A0A7A8CBECD9AE3FDD266BDA632E6F6095A8E2C82A709EF2ACE20D66CC6709A5EF4EBFBA3B020BD15A5451673CA3780A459C277EEA72A1C9EF8502281BF903B2409971DC1F215C899CBBDED194CAB8A5EBB2273E3B67AEEE9A18CD03A1CC46312AAE59AEA0EFB0E5EAC8A62D6C49DC5B5D5CAC7B12CC2B293ED1D258149C6E8ADFB311328C1D5ACD4A92DFC71E9575A62920166893D715358DAE87159E39267079FA5D2EF41D756E01E0D9701BE7F715E4DCEF5667576A883DC034E36022AB62707C4E9FF9C7400BD29770FC07C66BB041F17204A63B6A52177F32B1E8AF15A818E946421552673488AA76253A5CCAEF2368C6464A36DEA011A56FFACF5F592099BADEFA4B7A72059FF1869864BDDBD14B4D32460CFD30E78C4F057F011C63BCFA3E3
-20241130105534 2 6 100 7679 5 C4FD13B23C1EF3F1B888E9E24F6E6F0D1E538D5C17287A04247451367BAAC3EB0FF3633A10C1B2BEA19F91DA18C0C52A465FA0F0371A2189AC36BFEA58F33B013352F321A0B71BF61553330EC7735E66BF920F0AB9C918AC6796F3B2C5CC7B0E9F6695400B692026845D93807363115D8E1EF92072B84941DE896DC222F2493FA43169DC5C94E9F7C645CDDC38AC8C8F8790A2078B755BF65EB099CA5682E186E7DE95CBCF7036B0BFC761137EB0B297A140C1683E9A14E78F31935D873DFB2CC33563980FD7C6EB609427A9A63D9A7ECE43889783FAF17D129A4F00A7DBA8FAFCBDD57FA7599C944D03297B7106E02A82D695E8BC0ACC860295F357FD2F60CC4A09E49450CF735A8756174A8E1458E3BE2BEA10F38D2C30E6AD7DBFA6835328A64BDFCA2318E1753C922D3AA467BB770C03BE0D3381E31655F4969009A35E4CF90B1EF5CB71A7BE424E952AEF1368142BB6E5AEECB9F7EC2034179009B7E57DF234CDDC3818BE6E637DAC7F44B109BCAA519CA77B27E4A119712A325ACC29E82C5A3E43CDED00A550ABF99495C802578A6ACB7DBCCCECD3A3857F01A9582671D87C9407409355199D627D316938076334BCDEC6635E0D6696A53E2475AAF9412167245779FA0C89CC3C08BF90313C68710D0153A3B8FA06862B6670E9498296D2C1840812D51FFEADDAE3D714A6EA7D0DAF18C134A0E26AAA99AB8B605E5FAC1814D13F5BCA134DBCF40B5C21F39EF9B4089A759876E5F22DEAF3C64DAA159B9AFEB76109429E3E42FF8DB74EF84954405C4D7B826CFBE041FF996CB053ED44BD32742681CCC843CBD031CD9DDF299EF150378F87B5F67768C77A69F779AABC032BCC3031DDAD83701E475D16040D1E064208D99313C4047BA2AA44E15CF631E4337A47318F34060DAE2ED3FB2F77F26CAF51805D86F82786B8CED61C0A0A7A8CBECD9AE3FDD266BDA632E6F6095A8E2C82A709EF2ACE20D66CC6709A5EF4EBFBA3B020BD15A5451673CA3780A459C277EEA72A1C9EF8502281BF903B2409971DC1F215C899CBBDED194CAB8A5EBB2273E3B67AEEE9A18CD03A1CC46312AAE59AEA0EFB0E5EAC8A62D6C49DC5B5D5CAC7B12CC2B293ED1D258149C6E8ADFB311328C1D5ACD4A92DFC71E9575A62920166893D715358DAE87159E39267079FA5D2EF41D756E01E0D9701BE7F715E4DCEF5667576A883DC034E36022AB62707C4E9FF9C7400BD29770FC07C66BB041F17204A63B6A52177F32B1E8AF15A818E946421552673488AA76253A5CCAEF2368C6464A36DEA011A56FFACF5F592099BADEFA4B7A72059FF1869864BDDBD14B4D32460CFD30E78C4F057F011C63BDA41EF
-20241130105809 2 6 100 7679 2 C4FD13B23C1EF3F1B888E9E24F6E6F0D1E538D5C17287A04247451367BAAC3EB0FF3633A10C1B2BEA19F91DA18C0C52A465FA0F0371A2189AC36BFEA58F33B013352F321A0B71BF61553330EC7735E66BF920F0AB9C918AC6796F3B2C5CC7B0E9F6695400B692026845D93807363115D8E1EF92072B84941DE896DC222F2493FA43169DC5C94E9F7C645CDDC38AC8C8F8790A2078B755BF65EB099CA5682E186E7DE95CBCF7036B0BFC761137EB0B297A140C1683E9A14E78F31935D873DFB2CC33563980FD7C6EB609427A9A63D9A7ECE43889783FAF17D129A4F00A7DBA8FAFCBDD57FA7599C944D03297B7106E02A82D695E8BC0ACC860295F357FD2F60CC4A09E49450CF735A8756174A8E1458E3BE2BEA10F38D2C30E6AD7DBFA6835328A64BDFCA2318E1753C922D3AA467BB770C03BE0D3381E31655F4969009A35E4CF90B1EF5CB71A7BE424E952AEF1368142BB6E5AEECB9F7EC2034179009B7E57DF234CDDC3818BE6E637DAC7F44B109BCAA519CA77B27E4A119712A325ACC29E82C5A3E43CDED00A550ABF99495C802578A6ACB7DBCCCECD3A3857F01A9582671D87C9407409355199D627D316938076334BCDEC6635E0D6696A53E2475AAF9412167245779FA0C89CC3C08BF90313C68710D0153A3B8FA06862B6670E9498296D2C1840812D51FFEADDAE3D714A6EA7D0DAF18C134A0E26AAA99AB8B605E5FAC1814D13F5BCA134DBCF40B5C21F39EF9B4089A759876E5F22DEAF3C64DAA159B9AFEB76109429E3E42FF8DB74EF84954405C4D7B826CFBE041FF996CB053ED44BD32742681CCC843CBD031CD9DDF299EF150378F87B5F67768C77A69F779AABC032BCC3031DDAD83701E475D16040D1E064208D99313C4047BA2AA44E15CF631E4337A47318F34060DAE2ED3FB2F77F26CAF51805D86F82786B8CED61C0A0A7A8CBECD9AE3FDD266BDA632E6F6095A8E2C82A709EF2ACE20D66CC6709A5EF4EBFBA3B020BD15A5451673CA3780A459C277EEA72A1C9EF8502281BF903B2409971DC1F215C899CBBDED194CAB8A5EBB2273E3B67AEEE9A18CD03A1CC46312AAE59AEA0EFB0E5EAC8A62D6C49DC5B5D5CAC7B12CC2B293ED1D258149C6E8ADFB311328C1D5ACD4A92DFC71E9575A62920166893D715358DAE87159E39267079FA5D2EF41D756E01E0D9701BE7F715E4DCEF5667576A883DC034E36022AB62707C4E9FF9C7400BD29770FC07C66BB041F17204A63B6A52177F32B1E8AF15A818E946421552673488AA76253A5CCAEF2368C6464A36DEA011A56FFACF5F592099BADEFA4B7A72059FF1869864BDDBD14B4D32460CFD30E78C4F057F011C63BFFF55B
-20241130123724 2 6 100 7679 2 C4FD13B23C1EF3F1B888E9E24F6E6F0D1E538D5C17287A04247451367BAAC3EB0FF3633A10C1B2BEA19F91DA18C0C52A465FA0F0371A2189AC36BFEA58F33B013352F321A0B71BF61553330EC7735E66BF920F0AB9C918AC6796F3B2C5CC7B0E9F6695400B692026845D93807363115D8E1EF92072B84941DE896DC222F2493FA43169DC5C94E9F7C645CDDC38AC8C8F8790A2078B755BF65EB099CA5682E186E7DE95CBCF7036B0BFC761137EB0B297A140C1683E9A14E78F31935D873DFB2CC33563980FD7C6EB609427A9A63D9A7ECE43889783FAF17D129A4F00A7DBA8FAFCBDD57FA7599C944D03297B7106E02A82D695E8BC0ACC860295F357FD2F60CC4A09E49450CF735A8756174A8E1458E3BE2BEA10F38D2C30E6AD7DBFA6835328A64BDFCA2318E1753C922D3AA467BB770C03BE0D3381E31655F4969009A35E4CF90B1EF5CB71A7BE424E952AEF1368142BB6E5AEECB9F7EC2034179009B7E57DF234CDDC3818BE6E637DAC7F44B109BCAA519CA77B27E4A119712A325ACC29E82C5A3E43CDED00A550ABF99495C802578A6ACB7DBCCCECD3A3857F01A9582671D87C9407409355199D627D316938076334BCDEC6635E0D6696A53E2475AAF9412167245779FA0C89CC3C08BF90313C68710D0153A3B8FA06862B6670E9498296D2C1840812D51FFEADDAE3D714A6EA7D0DAF18C134A0E26AAA99AB8B605E5FAC1814D13F5BCA134DBCF40B5C21F39EF9B4089A759876E5F22DEAF3C64DAA159B9AFEB76109429E3E42FF8DB74EF84954405C4D7B826CFBE041FF996CB053ED44BD32742681CCC843CBD031CD9DDF299EF150378F87B5F67768C77A69F779AABC032BCC3031DDAD83701E475D16040D1E064208D99313C4047BA2AA44E15CF631E4337A47318F34060DAE2ED3FB2F77F26CAF51805D86F82786B8CED61C0A0A7A8CBECD9AE3FDD266BDA632E6F6095A8E2C82A709EF2ACE20D66CC6709A5EF4EBFBA3B020BD15A5451673CA3780A459C277EEA72A1C9EF8502281BF903B2409971DC1F215C899CBBDED194CAB8A5EBB2273E3B67AEEE9A18CD03A1CC46312AAE59AEA0EFB0E5EAC8A62D6C49DC5B5D5CAC7B12CC2B293ED1D258149C6E8ADFB311328C1D5ACD4A92DFC71E9575A62920166893D715358DAE87159E39267079FA5D2EF41D756E01E0D9701BE7F715E4DCEF5667576A883DC034E36022AB62707C4E9FF9C7400BD29770FC07C66BB041F17204A63B6A52177F32B1E8AF15A818E946421552673488AA76253A5CCAEF2368C6464A36DEA011A56FFACF5F592099BADEFA4B7A72059FF1869864BDDBD14B4D32460CFD30E78C4F057F011C642A90F43
-20241130131041 2 6 100 7679 5 C4FD13B23C1EF3F1B888E9E24F6E6F0D1E538D5C17287A04247451367BAAC3EB0FF3633A10C1B2BEA19F91DA18C0C52A465FA0F0371A2189AC36BFEA58F33B013352F321A0B71BF61553330EC7735E66BF920F0AB9C918AC6796F3B2C5CC7B0E9F6695400B692026845D93807363115D8E1EF92072B84941DE896DC222F2493FA43169DC5C94E9F7C645CDDC38AC8C8F8790A2078B755BF65EB099CA5682E186E7DE95CBCF7036B0BFC761137EB0B297A140C1683E9A14E78F31935D873DFB2CC33563980FD7C6EB609427A9A63D9A7ECE43889783FAF17D129A4F00A7DBA8FAFCBDD57FA7599C944D03297B7106E02A82D695E8BC0ACC860295F357FD2F60CC4A09E49450CF735A8756174A8E1458E3BE2BEA10F38D2C30E6AD7DBFA6835328A64BDFCA2318E1753C922D3AA467BB770C03BE0D3381E31655F4969009A35E4CF90B1EF5CB71A7BE424E952AEF1368142BB6E5AEECB9F7EC2034179009B7E57DF234CDDC3818BE6E637DAC7F44B109BCAA519CA77B27E4A119712A325ACC29E82C5A3E43CDED00A550ABF99495C802578A6ACB7DBCCCECD3A3857F01A9582671D87C9407409355199D627D316938076334BCDEC6635E0D6696A53E2475AAF9412167245779FA0C89CC3C08BF90313C68710D0153A3B8FA06862B6670E9498296D2C1840812D51FFEADDAE3D714A6EA7D0DAF18C134A0E26AAA99AB8B605E5FAC1814D13F5BCA134DBCF40B5C21F39EF9B4089A759876E5F22DEAF3C64DAA159B9AFEB76109429E3E42FF8DB74EF84954405C4D7B826CFBE041FF996CB053ED44BD32742681CCC843CBD031CD9DDF299EF150378F87B5F67768C77A69F779AABC032BCC3031DDAD83701E475D16040D1E064208D99313C4047BA2AA44E15CF631E4337A47318F34060DAE2ED3FB2F77F26CAF51805D86F82786B8CED61C0A0A7A8CBECD9AE3FDD266BDA632E6F6095A8E2C82A709EF2ACE20D66CC6709A5EF4EBFBA3B020BD15A5451673CA3780A459C277EEA72A1C9EF8502281BF903B2409971DC1F215C899CBBDED194CAB8A5EBB2273E3B67AEEE9A18CD03A1CC46312AAE59AEA0EFB0E5EAC8A62D6C49DC5B5D5CAC7B12CC2B293ED1D258149C6E8ADFB311328C1D5ACD4A92DFC71E9575A62920166893D715358DAE87159E39267079FA5D2EF41D756E01E0D9701BE7F715E4DCEF5667576A883DC034E36022AB62707C4E9FF9C7400BD29770FC07C66BB041F17204A63B6A52177F32B1E8AF15A818E946421552673488AA76253A5CCAEF2368C6464A36DEA011A56FFACF5F592099BADEFA4B7A72059FF1869864BDDBD14B4D32460CFD30E78C4F057F011C644DFE51F
-20241130150424 2 6 100 7679 2 C4FD13B23C1EF3F1B888E9E24F6E6F0D1E538D5C17287A04247451367BAAC3EB0FF3633A10C1B2BEA19F91DA18C0C52A465FA0F0371A2189AC36BFEA58F33B013352F321A0B71BF61553330EC7735E66BF920F0AB9C918AC6796F3B2C5CC7B0E9F6695400B692026845D93807363115D8E1EF92072B84941DE896DC222F2493FA43169DC5C94E9F7C645CDDC38AC8C8F8790A2078B755BF65EB099CA5682E186E7DE95CBCF7036B0BFC761137EB0B297A140C1683E9A14E78F31935D873DFB2CC33563980FD7C6EB609427A9A63D9A7ECE43889783FAF17D129A4F00A7DBA8FAFCBDD57FA7599C944D03297B7106E02A82D695E8BC0ACC860295F357FD2F60CC4A09E49450CF735A8756174A8E1458E3BE2BEA10F38D2C30E6AD7DBFA6835328A64BDFCA2318E1753C922D3AA467BB770C03BE0D3381E31655F4969009A35E4CF90B1EF5CB71A7BE424E952AEF1368142BB6E5AEECB9F7EC2034179009B7E57DF234CDDC3818BE6E637DAC7F44B109BCAA519CA77B27E4A119712A325ACC29E82C5A3E43CDED00A550ABF99495C802578A6ACB7DBCCCECD3A3857F01A9582671D87C9407409355199D627D316938076334BCDEC6635E0D6696A53E2475AAF9412167245779FA0C89CC3C08BF90313C68710D0153A3B8FA06862B6670E9498296D2C1840812D51FFEADDAE3D714A6EA7D0DAF18C134A0E26AAA99AB8B605E5FAC1814D13F5BCA134DBCF40B5C21F39EF9B4089A759876E5F22DEAF3C64DAA159B9AFEB76109429E3E42FF8DB74EF84954405C4D7B826CFBE041FF996CB053ED44BD32742681CCC843CBD031CD9DDF299EF150378F87B5F67768C77A69F779AABC032BCC3031DDAD83701E475D16040D1E064208D99313C4047BA2AA44E15CF631E4337A47318F34060DAE2ED3FB2F77F26CAF51805D86F82786B8CED61C0A0A7A8CBECD9AE3FDD266BDA632E6F6095A8E2C82A709EF2ACE20D66CC6709A5EF4EBFBA3B020BD15A5451673CA3780A459C277EEA72A1C9EF8502281BF903B2409971DC1F215C899CBBDED194CAB8A5EBB2273E3B67AEEE9A18CD03A1CC46312AAE59AEA0EFB0E5EAC8A62D6C49DC5B5D5CAC7B12CC2B293ED1D258149C6E8ADFB311328C1D5ACD4A92DFC71E9575A62920166893D715358DAE87159E39267079FA5D2EF41D756E01E0D9701BE7F715E4DCEF5667576A883DC034E36022AB62707C4E9FF9C7400BD29770FC07C66BB041F17204A63B6A52177F32B1E8AF15A818E946421552673488AA76253A5CCAEF2368C6464A36DEA011A56FFACF5F592099BADEFA4B7A72059FF1869864BDDBD14B4D32460CFD30E78C4F057F011C64C717C8B
-20241130162824 2 6 100 7679 2 C4FD13B23C1EF3F1B888E9E24F6E6F0D1E538D5C17287A04247451367BAAC3EB0FF3633A10C1B2BEA19F91DA18C0C52A465FA0F0371A2189AC36BFEA58F33B013352F321A0B71BF61553330EC7735E66BF920F0AB9C918AC6796F3B2C5CC7B0E9F6695400B692026845D93807363115D8E1EF92072B84941DE896DC222F2493FA43169DC5C94E9F7C645CDDC38AC8C8F8790A2078B755BF65EB099CA5682E186E7DE95CBCF7036B0BFC761137EB0B297A140C1683E9A14E78F31935D873DFB2CC33563980FD7C6EB609427A9A63D9A7ECE43889783FAF17D129A4F00A7DBA8FAFCBDD57FA7599C944D03297B7106E02A82D695E8BC0ACC860295F357FD2F60CC4A09E49450CF735A8756174A8E1458E3BE2BEA10F38D2C30E6AD7DBFA6835328A64BDFCA2318E1753C922D3AA467BB770C03BE0D3381E31655F4969009A35E4CF90B1EF5CB71A7BE424E952AEF1368142BB6E5AEECB9F7EC2034179009B7E57DF234CDDC3818BE6E637DAC7F44B109BCAA519CA77B27E4A119712A325ACC29E82C5A3E43CDED00A550ABF99495C802578A6ACB7DBCCCECD3A3857F01A9582671D87C9407409355199D627D316938076334BCDEC6635E0D6696A53E2475AAF9412167245779FA0C89CC3C08BF90313C68710D0153A3B8FA06862B6670E9498296D2C1840812D51FFEADDAE3D714A6EA7D0DAF18C134A0E26AAA99AB8B605E5FAC1814D13F5BCA134DBCF40B5C21F39EF9B4089A759876E5F22DEAF3C64DAA159B9AFEB76109429E3E42FF8DB74EF84954405C4D7B826CFBE041FF996CB053ED44BD32742681CCC843CBD031CD9DDF299EF150378F87B5F67768C77A69F779AABC032BCC3031DDAD83701E475D16040D1E064208D99313C4047BA2AA44E15CF631E4337A47318F34060DAE2ED3FB2F77F26CAF51805D86F82786B8CED61C0A0A7A8CBECD9AE3FDD266BDA632E6F6095A8E2C82A709EF2ACE20D66CC6709A5EF4EBFBA3B020BD15A5451673CA3780A459C277EEA72A1C9EF8502281BF903B2409971DC1F215C899CBBDED194CAB8A5EBB2273E3B67AEEE9A18CD03A1CC46312AAE59AEA0EFB0E5EAC8A62D6C49DC5B5D5CAC7B12CC2B293ED1D258149C6E8ADFB311328C1D5ACD4A92DFC71E9575A62920166893D715358DAE87159E39267079FA5D2EF41D756E01E0D9701BE7F715E4DCEF5667576A883DC034E36022AB62707C4E9FF9C7400BD29770FC07C66BB041F17204A63B6A52177F32B1E8AF15A818E946421552673488AA76253A5CCAEF2368C6464A36DEA011A56FFACF5F592099BADEFA4B7A72059FF1869864BDDBD14B4D32460CFD30E78C4F057F011C65210D3FB
-20241130172212 2 6 100 7679 5 C4FD13B23C1EF3F1B888E9E24F6E6F0D1E538D5C17287A04247451367BAAC3EB0FF3633A10C1B2BEA19F91DA18C0C52A465FA0F0371A2189AC36BFEA58F33B013352F321A0B71BF61553330EC7735E66BF920F0AB9C918AC6796F3B2C5CC7B0E9F6695400B692026845D93807363115D8E1EF92072B84941DE896DC222F2493FA43169DC5C94E9F7C645CDDC38AC8C8F8790A2078B755BF65EB099CA5682E186E7DE95CBCF7036B0BFC761137EB0B297A140C1683E9A14E78F31935D873DFB2CC33563980FD7C6EB609427A9A63D9A7ECE43889783FAF17D129A4F00A7DBA8FAFCBDD57FA7599C944D03297B7106E02A82D695E8BC0ACC860295F357FD2F60CC4A09E49450CF735A8756174A8E1458E3BE2BEA10F38D2C30E6AD7DBFA6835328A64BDFCA2318E1753C922D3AA467BB770C03BE0D3381E31655F4969009A35E4CF90B1EF5CB71A7BE424E952AEF1368142BB6E5AEECB9F7EC2034179009B7E57DF234CDDC3818BE6E637DAC7F44B109BCAA519CA77B27E4A119712A325ACC29E82C5A3E43CDED00A550ABF99495C802578A6ACB7DBCCCECD3A3857F01A9582671D87C9407409355199D627D316938076334BCDEC6635E0D6696A53E2475AAF9412167245779FA0C89CC3C08BF90313C68710D0153A3B8FA06862B6670E9498296D2C1840812D51FFEADDAE3D714A6EA7D0DAF18C134A0E26AAA99AB8B605E5FAC1814D13F5BCA134DBCF40B5C21F39EF9B4089A759876E5F22DEAF3C64DAA159B9AFEB76109429E3E42FF8DB74EF84954405C4D7B826CFBE041FF996CB053ED44BD32742681CCC843CBD031CD9DDF299EF150378F87B5F67768C77A69F779AABC032BCC3031DDAD83701E475D16040D1E064208D99313C4047BA2AA44E15CF631E4337A47318F34060DAE2ED3FB2F77F26CAF51805D86F82786B8CED61C0A0A7A8CBECD9AE3FDD266BDA632E6F6095A8E2C82A709EF2ACE20D66CC6709A5EF4EBFBA3B020BD15A5451673CA3780A459C277EEA72A1C9EF8502281BF903B2409971DC1F215C899CBBDED194CAB8A5EBB2273E3B67AEEE9A18CD03A1CC46312AAE59AEA0EFB0E5EAC8A62D6C49DC5B5D5CAC7B12CC2B293ED1D258149C6E8ADFB311328C1D5ACD4A92DFC71E9575A62920166893D715358DAE87159E39267079FA5D2EF41D756E01E0D9701BE7F715E4DCEF5667576A883DC034E36022AB62707C4E9FF9C7400BD29770FC07C66BB041F17204A63B6A52177F32B1E8AF15A818E946421552673488AA76253A5CCAEF2368C6464A36DEA011A56FFACF5F592099BADEFA4B7A72059FF1869864BDDBD14B4D32460CFD30E78C4F057F011C655A47F4F
-20241130174557 2 6 100 7679 2 C4FD13B23C1EF3F1B888E9E24F6E6F0D1E538D5C17287A04247451367BAAC3EB0FF3633A10C1B2BEA19F91DA18C0C52A465FA0F0371A2189AC36BFEA58F33B013352F321A0B71BF61553330EC7735E66BF920F0AB9C918AC6796F3B2C5CC7B0E9F6695400B692026845D93807363115D8E1EF92072B84941DE896DC222F2493FA43169DC5C94E9F7C645CDDC38AC8C8F8790A2078B755BF65EB099CA5682E186E7DE95CBCF7036B0BFC761137EB0B297A140C1683E9A14E78F31935D873DFB2CC33563980FD7C6EB609427A9A63D9A7ECE43889783FAF17D129A4F00A7DBA8FAFCBDD57FA7599C944D03297B7106E02A82D695E8BC0ACC860295F357FD2F60CC4A09E49450CF735A8756174A8E1458E3BE2BEA10F38D2C30E6AD7DBFA6835328A64BDFCA2318E1753C922D3AA467BB770C03BE0D3381E31655F4969009A35E4CF90B1EF5CB71A7BE424E952AEF1368142BB6E5AEECB9F7EC2034179009B7E57DF234CDDC3818BE6E637DAC7F44B109BCAA519CA77B27E4A119712A325ACC29E82C5A3E43CDED00A550ABF99495C802578A6ACB7DBCCCECD3A3857F01A9582671D87C9407409355199D627D316938076334BCDEC6635E0D6696A53E2475AAF9412167245779FA0C89CC3C08BF90313C68710D0153A3B8FA06862B6670E9498296D2C1840812D51FFEADDAE3D714A6EA7D0DAF18C134A0E26AAA99AB8B605E5FAC1814D13F5BCA134DBCF40B5C21F39EF9B4089A759876E5F22DEAF3C64DAA159B9AFEB76109429E3E42FF8DB74EF84954405C4D7B826CFBE041FF996CB053ED44BD32742681CCC843CBD031CD9DDF299EF150378F87B5F67768C77A69F779AABC032BCC3031DDAD83701E475D16040D1E064208D99313C4047BA2AA44E15CF631E4337A47318F34060DAE2ED3FB2F77F26CAF51805D86F82786B8CED61C0A0A7A8CBECD9AE3FDD266BDA632E6F6095A8E2C82A709EF2ACE20D66CC6709A5EF4EBFBA3B020BD15A5451673CA3780A459C277EEA72A1C9EF8502281BF903B2409971DC1F215C899CBBDED194CAB8A5EBB2273E3B67AEEE9A18CD03A1CC46312AAE59AEA0EFB0E5EAC8A62D6C49DC5B5D5CAC7B12CC2B293ED1D258149C6E8ADFB311328C1D5ACD4A92DFC71E9575A62920166893D715358DAE87159E39267079FA5D2EF41D756E01E0D9701BE7F715E4DCEF5667576A883DC034E36022AB62707C4E9FF9C7400BD29770FC07C66BB041F17204A63B6A52177F32B1E8AF15A818E946421552673488AA76253A5CCAEF2368C6464A36DEA011A56FFACF5F592099BADEFA4B7A72059FF1869864BDDBD14B4D32460CFD30E78C4F057F011C657367ECB
-20241130215425 2 6 100 7679 5 C4FD13B23C1EF3F1B888E9E24F6E6F0D1E538D5C17287A04247451367BAAC3EB0FF3633A10C1B2BEA19F91DA18C0C52A465FA0F0371A2189AC36BFEA58F33B013352F321A0B71BF61553330EC7735E66BF920F0AB9C918AC6796F3B2C5CC7B0E9F6695400B692026845D93807363115D8E1EF92072B84941DE896DC222F2493FA43169DC5C94E9F7C645CDDC38AC8C8F8790A2078B755BF65EB099CA5682E186E7DE95CBCF7036B0BFC761137EB0B297A140C1683E9A14E78F31935D873DFB2CC33563980FD7C6EB609427A9A63D9A7ECE43889783FAF17D129A4F00A7DBA8FAFCBDD57FA7599C944D03297B7106E02A82D695E8BC0ACC860295F357FD2F60CC4A09E49450CF735A8756174A8E1458E3BE2BEA10F38D2C30E6AD7DBFA6835328A64BDFCA2318E1753C922D3AA467BB770C03BE0D3381E31655F4969009A35E4CF90B1EF5CB71A7BE424E952AEF1368142BB6E5AEECB9F7EC2034179009B7E57DF234CDDC3818BE6E637DAC7F44B109BCAA519CA77B27E4A119712A325ACC29E82C5A3E43CDED00A550ABF99495C802578A6ACB7DBCCCECD3A3857F01A9582671D87C9407409355199D627D316938076334BCDEC6635E0D6696A53E2475AAF9412167245779FA0C89CC3C08BF90313C68710D0153A3B8FA06862B6670E9498296D2C1840812D51FFEADDAE3D714A6EA7D0DAF18C134A0E26AAA99AB8B605E5FAC1814D13F5BCA134DBCF40B5C21F39EF9B4089A759876E5F22DEAF3C64DAA159B9AFEB76109429E3E42FF8DB74EF84954405C4D7B826CFBE041FF996CB053ED44BD32742681CCC843CBD031CD9DDF299EF150378F87B5F67768C77A69F779AABC032BCC3031DDAD83701E475D16040D1E064208D99313C4047BA2AA44E15CF631E4337A47318F34060DAE2ED3FB2F77F26CAF51805D86F82786B8CED61C0A0A7A8CBECD9AE3FDD266BDA632E6F6095A8E2C82A709EF2ACE20D66CC6709A5EF4EBFBA3B020BD15A5451673CA3780A459C277EEA72A1C9EF8502281BF903B2409971DC1F215C899CBBDED194CAB8A5EBB2273E3B67AEEE9A18CD03A1CC46312AAE59AEA0EFB0E5EAC8A62D6C49DC5B5D5CAC7B12CC2B293ED1D258149C6E8ADFB311328C1D5ACD4A92DFC71E9575A62920166893D715358DAE87159E39267079FA5D2EF41D756E01E0D9701BE7F715E4DCEF5667576A883DC034E36022AB62707C4E9FF9C7400BD29770FC07C66BB041F17204A63B6A52177F32B1E8AF15A818E946421552673488AA76253A5CCAEF2368C6464A36DEA011A56FFACF5F592099BADEFA4B7A72059FF1869864BDDBD14B4D32460CFD30E78C4F057F011C66800A377
-20241130230337 2 6 100 7679 5 C4FD13B23C1EF3F1B888E9E24F6E6F0D1E538D5C17287A04247451367BAAC3EB0FF3633A10C1B2BEA19F91DA18C0C52A465FA0F0371A2189AC36BFEA58F33B013352F321A0B71BF61553330EC7735E66BF920F0AB9C918AC6796F3B2C5CC7B0E9F6695400B692026845D93807363115D8E1EF92072B84941DE896DC222F2493FA43169DC5C94E9F7C645CDDC38AC8C8F8790A2078B755BF65EB099CA5682E186E7DE95CBCF7036B0BFC761137EB0B297A140C1683E9A14E78F31935D873DFB2CC33563980FD7C6EB609427A9A63D9A7ECE43889783FAF17D129A4F00A7DBA8FAFCBDD57FA7599C944D03297B7106E02A82D695E8BC0ACC860295F357FD2F60CC4A09E49450CF735A8756174A8E1458E3BE2BEA10F38D2C30E6AD7DBFA6835328A64BDFCA2318E1753C922D3AA467BB770C03BE0D3381E31655F4969009A35E4CF90B1EF5CB71A7BE424E952AEF1368142BB6E5AEECB9F7EC2034179009B7E57DF234CDDC3818BE6E637DAC7F44B109BCAA519CA77B27E4A119712A325ACC29E82C5A3E43CDED00A550ABF99495C802578A6ACB7DBCCCECD3A3857F01A9582671D87C9407409355199D627D316938076334BCDEC6635E0D6696A53E2475AAF9412167245779FA0C89CC3C08BF90313C68710D0153A3B8FA06862B6670E9498296D2C1840812D51FFEADDAE3D714A6EA7D0DAF18C134A0E26AAA99AB8B605E5FAC1814D13F5BCA134DBCF40B5C21F39EF9B4089A759876E5F22DEAF3C64DAA159B9AFEB76109429E3E42FF8DB74EF84954405C4D7B826CFBE041FF996CB053ED44BD32742681CCC843CBD031CD9DDF299EF150378F87B5F67768C77A69F779AABC032BCC3031DDAD83701E475D16040D1E064208D99313C4047BA2AA44E15CF631E4337A47318F34060DAE2ED3FB2F77F26CAF51805D86F82786B8CED61C0A0A7A8CBECD9AE3FDD266BDA632E6F6095A8E2C82A709EF2ACE20D66CC6709A5EF4EBFBA3B020BD15A5451673CA3780A459C277EEA72A1C9EF8502281BF903B2409971DC1F215C899CBBDED194CAB8A5EBB2273E3B67AEEE9A18CD03A1CC46312AAE59AEA0EFB0E5EAC8A62D6C49DC5B5D5CAC7B12CC2B293ED1D258149C6E8ADFB311328C1D5ACD4A92DFC71E9575A62920166893D715358DAE87159E39267079FA5D2EF41D756E01E0D9701BE7F715E4DCEF5667576A883DC034E36022AB62707C4E9FF9C7400BD29770FC07C66BB041F17204A63B6A52177F32B1E8AF15A818E946421552673488AA76253A5CCAEF2368C6464A36DEA011A56FFACF5F592099BADEFA4B7A72059FF1869864BDDBD14B4D32460CFD30E78C4F057F011C66C9D27F7
-20241201025521 2 6 100 7679 5 C4FD13B23C1EF3F1B888E9E24F6E6F0D1E538D5C17287A04247451367BAAC3EB0FF3633A10C1B2BEA19F91DA18C0C52A465FA0F0371A2189AC36BFEA58F33B013352F321A0B71BF61553330EC7735E66BF920F0AB9C918AC6796F3B2C5CC7B0E9F6695400B692026845D93807363115D8E1EF92072B84941DE896DC222F2493FA43169DC5C94E9F7C645CDDC38AC8C8F8790A2078B755BF65EB099CA5682E186E7DE95CBCF7036B0BFC761137EB0B297A140C1683E9A14E78F31935D873DFB2CC33563980FD7C6EB609427A9A63D9A7ECE43889783FAF17D129A4F00A7DBA8FAFCBDD57FA7599C944D03297B7106E02A82D695E8BC0ACC860295F357FD2F60CC4A09E49450CF735A8756174A8E1458E3BE2BEA10F38D2C30E6AD7DBFA6835328A64BDFCA2318E1753C922D3AA467BB770C03BE0D3381E31655F4969009A35E4CF90B1EF5CB71A7BE424E952AEF1368142BB6E5AEECB9F7EC2034179009B7E57DF234CDDC3818BE6E637DAC7F44B109BCAA519CA77B27E4A119712A325ACC29E82C5A3E43CDED00A550ABF99495C802578A6ACB7DBCCCECD3A3857F01A9582671D87C9407409355199D627D316938076334BCDEC6635E0D6696A53E2475AAF9412167245779FA0C89CC3C08BF90313C68710D0153A3B8FA06862B6670E9498296D2C1840812D51FFEADDAE3D714A6EA7D0DAF18C134A0E26AAA99AB8B605E5FAC1814D13F5BCA134DBCF40B5C21F39EF9B4089A759876E5F22DEAF3C64DAA159B9AFEB76109429E3E42FF8DB74EF84954405C4D7B826CFBE041FF996CB053ED44BD32742681CCC843CBD031CD9DDF299EF150378F87B5F67768C77A69F779AABC032BCC3031DDAD83701E475D16040D1E064208D99313C4047BA2AA44E15CF631E4337A47318F34060DAE2ED3FB2F77F26CAF51805D86F82786B8CED61C0A0A7A8CBECD9AE3FDD266BDA632E6F6095A8E2C82A709EF2ACE20D66CC6709A5EF4EBFBA3B020BD15A5451673CA3780A459C277EEA72A1C9EF8502281BF903B2409971DC1F215C899CBBDED194CAB8A5EBB2273E3B67AEEE9A18CD03A1CC46312AAE59AEA0EFB0E5EAC8A62D6C49DC5B5D5CAC7B12CC2B293ED1D258149C6E8ADFB311328C1D5ACD4A92DFC71E9575A62920166893D715358DAE87159E39267079FA5D2EF41D756E01E0D9701BE7F715E4DCEF5667576A883DC034E36022AB62707C4E9FF9C7400BD29770FC07C66BB041F17204A63B6A52177F32B1E8AF15A818E946421552673488AA76253A5CCAEF2368C6464A36DEA011A56FFACF5F592099BADEFA4B7A72059FF1869864BDDBD14B4D32460CFD30E78C4F057F011C67C131CEF
-20241201034250 2 6 100 7679 5 C4FD13B23C1EF3F1B888E9E24F6E6F0D1E538D5C17287A04247451367BAAC3EB0FF3633A10C1B2BEA19F91DA18C0C52A465FA0F0371A2189AC36BFEA58F33B013352F321A0B71BF61553330EC7735E66BF920F0AB9C918AC6796F3B2C5CC7B0E9F6695400B692026845D93807363115D8E1EF92072B84941DE896DC222F2493FA43169DC5C94E9F7C645CDDC38AC8C8F8790A2078B755BF65EB099CA5682E186E7DE95CBCF7036B0BFC761137EB0B297A140C1683E9A14E78F31935D873DFB2CC33563980FD7C6EB609427A9A63D9A7ECE43889783FAF17D129A4F00A7DBA8FAFCBDD57FA7599C944D03297B7106E02A82D695E8BC0ACC860295F357FD2F60CC4A09E49450CF735A8756174A8E1458E3BE2BEA10F38D2C30E6AD7DBFA6835328A64BDFCA2318E1753C922D3AA467BB770C03BE0D3381E31655F4969009A35E4CF90B1EF5CB71A7BE424E952AEF1368142BB6E5AEECB9F7EC2034179009B7E57DF234CDDC3818BE6E637DAC7F44B109BCAA519CA77B27E4A119712A325ACC29E82C5A3E43CDED00A550ABF99495C802578A6ACB7DBCCCECD3A3857F01A9582671D87C9407409355199D627D316938076334BCDEC6635E0D6696A53E2475AAF9412167245779FA0C89CC3C08BF90313C68710D0153A3B8FA06862B6670E9498296D2C1840812D51FFEADDAE3D714A6EA7D0DAF18C134A0E26AAA99AB8B605E5FAC1814D13F5BCA134DBCF40B5C21F39EF9B4089A759876E5F22DEAF3C64DAA159B9AFEB76109429E3E42FF8DB74EF84954405C4D7B826CFBE041FF996CB053ED44BD32742681CCC843CBD031CD9DDF299EF150378F87B5F67768C77A69F779AABC032BCC3031DDAD83701E475D16040D1E064208D99313C4047BA2AA44E15CF631E4337A47318F34060DAE2ED3FB2F77F26CAF51805D86F82786B8CED61C0A0A7A8CBECD9AE3FDD266BDA632E6F6095A8E2C82A709EF2ACE20D66CC6709A5EF4EBFBA3B020BD15A5451673CA3780A459C277EEA72A1C9EF8502281BF903B2409971DC1F215C899CBBDED194CAB8A5EBB2273E3B67AEEE9A18CD03A1CC46312AAE59AEA0EFB0E5EAC8A62D6C49DC5B5D5CAC7B12CC2B293ED1D258149C6E8ADFB311328C1D5ACD4A92DFC71E9575A62920166893D715358DAE87159E39267079FA5D2EF41D756E01E0D9701BE7F715E4DCEF5667576A883DC034E36022AB62707C4E9FF9C7400BD29770FC07C66BB041F17204A63B6A52177F32B1E8AF15A818E946421552673488AA76253A5CCAEF2368C6464A36DEA011A56FFACF5F592099BADEFA4B7A72059FF1869864BDDBD14B4D32460CFD30E78C4F057F011C67F375247
-20241201035354 2 6 100 7679 2 C4FD13B23C1EF3F1B888E9E24F6E6F0D1E538D5C17287A04247451367BAAC3EB0FF3633A10C1B2BEA19F91DA18C0C52A465FA0F0371A2189AC36BFEA58F33B013352F321A0B71BF61553330EC7735E66BF920F0AB9C918AC6796F3B2C5CC7B0E9F6695400B692026845D93807363115D8E1EF92072B84941DE896DC222F2493FA43169DC5C94E9F7C645CDDC38AC8C8F8790A2078B755BF65EB099CA5682E186E7DE95CBCF7036B0BFC761137EB0B297A140C1683E9A14E78F31935D873DFB2CC33563980FD7C6EB609427A9A63D9A7ECE43889783FAF17D129A4F00A7DBA8FAFCBDD57FA7599C944D03297B7106E02A82D695E8BC0ACC860295F357FD2F60CC4A09E49450CF735A8756174A8E1458E3BE2BEA10F38D2C30E6AD7DBFA6835328A64BDFCA2318E1753C922D3AA467BB770C03BE0D3381E31655F4969009A35E4CF90B1EF5CB71A7BE424E952AEF1368142BB6E5AEECB9F7EC2034179009B7E57DF234CDDC3818BE6E637DAC7F44B109BCAA519CA77B27E4A119712A325ACC29E82C5A3E43CDED00A550ABF99495C802578A6ACB7DBCCCECD3A3857F01A9582671D87C9407409355199D627D316938076334BCDEC6635E0D6696A53E2475AAF9412167245779FA0C89CC3C08BF90313C68710D0153A3B8FA06862B6670E9498296D2C1840812D51FFEADDAE3D714A6EA7D0DAF18C134A0E26AAA99AB8B605E5FAC1814D13F5BCA134DBCF40B5C21F39EF9B4089A759876E5F22DEAF3C64DAA159B9AFEB76109429E3E42FF8DB74EF84954405C4D7B826CFBE041FF996CB053ED44BD32742681CCC843CBD031CD9DDF299EF150378F87B5F67768C77A69F779AABC032BCC3031DDAD83701E475D16040D1E064208D99313C4047BA2AA44E15CF631E4337A47318F34060DAE2ED3FB2F77F26CAF51805D86F82786B8CED61C0A0A7A8CBECD9AE3FDD266BDA632E6F6095A8E2C82A709EF2ACE20D66CC6709A5EF4EBFBA3B020BD15A5451673CA3780A459C277EEA72A1C9EF8502281BF903B2409971DC1F215C899CBBDED194CAB8A5EBB2273E3B67AEEE9A18CD03A1CC46312AAE59AEA0EFB0E5EAC8A62D6C49DC5B5D5CAC7B12CC2B293ED1D258149C6E8ADFB311328C1D5ACD4A92DFC71E9575A62920166893D715358DAE87159E39267079FA5D2EF41D756E01E0D9701BE7F715E4DCEF5667576A883DC034E36022AB62707C4E9FF9C7400BD29770FC07C66BB041F17204A63B6A52177F32B1E8AF15A818E946421552673488AA76253A5CCAEF2368C6464A36DEA011A56FFACF5F592099BADEFA4B7A72059FF1869864BDDBD14B4D32460CFD30E78C4F057F011C67FEC05DB
-20241201043654 2 6 100 7679 2 F02D40B37C40876939E4D2A62AF7EC21A676D8E2B04081BA98E23F464A47514FB40DC99F7B8046B48CD3052C7AC080E4B496C16ED18695CA27493A129088F5829BBEAD02DFD521829FFD8B1120330E2BBA10C55A1EAD0641006827DA4725BFD2A2559C363C33BC78C2D83B4A075099EC57634D0AD4AEDA3302441B7005C728C0371B51877A97B442C5E3C3D53C244EFF3B65CDCCB0C017723F1EBD0B91E220116ACF14703268A11B7FC7564F7BEDBFFB3CE046261DD9D83E6078CD7AB5AC97595EF53D6C4C56D24588C6D130C0CD2C967AB90C31497186A06A93FB9338D4F30E0104BC8EFF2518D0644174BD1FF1FD7BAC2AAFF151D733A14F456A189ECA2D5F11D7C3AF1DA06192D36251B050E1AC576E3C369678D12823870FFC6E5809903382F9FBE36156F294C94FF5369E8D24D085A326870A998A10683495CEF15EFF0A45C781B5156B82D9AA07852040A96A0D5ACDF094B9DD91EA893382F95A6B72F0A2090F036A1B23CF9CF544753EA5B9ED86FA52EBB4C5421C5B485AE932F5837822C91257EC4953ACA79F2D94261DC40B3D44CB44056D4025EC459563865000B8C5F5D7724ED27CA4A8ADE299E5C898F4BD09F430781A68C261E4FA0BA2FEE567434B057C5D5F2899A1547B780B91315CC631C0552DB403DF53A6059BE895242FDA4AE1F6C5129E3643DF1A20C28BBF4328B4E623DCBC1149CE838BBC4A9944A6B6ACB4AA29B50FC7AFFAB0075BB4CC190F15B2C17847560F1B4C591EFE90D5AAA307A3FCC091DF44E3B219F7EE86EA01704D652983CE0D475896C1EB94E09314D386233D706FE0F5415BAF51746F3E8A6AC74E6F68CCF665CCEC4BE0B9CE19308C0423491F5914EA8ABE6081F38282D4994A4B640DCE56F4D616CED59B80938E4E7C486AB64E7C740FCD6ADB5494906520FD66A02069D3C11085157142CDDBFB004023C5CDFCCEAC5296636A77C127DEC4182A36D6A34D980F778452271C80CABAFE15A629302EFE9CD9105353B719581D4DD2E1BCF9411A4CCB0D010B5954291453E761A3B9EAF533119EEF1C30C4E53FEFAF2D2300162786963D54ECE0376CC797CBBDD757B596FAB26716ECEA7C47FB6C6DC6A80FC435D5CADB36D5ACB6760CAC6272B61E64A920EC7D4E5FBD680B2B906F1CF78EFD380A47692E1DC6C06AC21255E65C3757E32C301B5ACD8BA136FEE7C19B858D8B60595946BF1D0520912ACD17E397C9FC156C741AD1104F403B363B4E6B4AD06E8C60928CCD6AB3FE6AEFECBC57DB5CFF431A2D44533D9A92C483B56AE56698F02622D3A65E09B6EBFDFD5DCAF34E09DEDA100B40DD4C40ADCEF30787E527C4F613A08BDED0D77EFCE3
-20241201045113 2 6 100 7679 2 F02D40B37C40876939E4D2A62AF7EC21A676D8E2B04081BA98E23F464A47514FB40DC99F7B8046B48CD3052C7AC080E4B496C16ED18695CA27493A129088F5829BBEAD02DFD521829FFD8B1120330E2BBA10C55A1EAD0641006827DA4725BFD2A2559C363C33BC78C2D83B4A075099EC57634D0AD4AEDA3302441B7005C728C0371B51877A97B442C5E3C3D53C244EFF3B65CDCCB0C017723F1EBD0B91E220116ACF14703268A11B7FC7564F7BEDBFFB3CE046261DD9D83E6078CD7AB5AC97595EF53D6C4C56D24588C6D130C0CD2C967AB90C31497186A06A93FB9338D4F30E0104BC8EFF2518D0644174BD1FF1FD7BAC2AAFF151D733A14F456A189ECA2D5F11D7C3AF1DA06192D36251B050E1AC576E3C369678D12823870FFC6E5809903382F9FBE36156F294C94FF5369E8D24D085A326870A998A10683495CEF15EFF0A45C781B5156B82D9AA07852040A96A0D5ACDF094B9DD91EA893382F95A6B72F0A2090F036A1B23CF9CF544753EA5B9ED86FA52EBB4C5421C5B485AE932F5837822C91257EC4953ACA79F2D94261DC40B3D44CB44056D4025EC459563865000B8C5F5D7724ED27CA4A8ADE299E5C898F4BD09F430781A68C261E4FA0BA2FEE567434B057C5D5F2899A1547B780B91315CC631C0552DB403DF53A6059BE895242FDA4AE1F6C5129E3643DF1A20C28BBF4328B4E623DCBC1149CE838BBC4A9944A6B6ACB4AA29B50FC7AFFAB0075BB4CC190F15B2C17847560F1B4C591EFE90D5AAA307A3FCC091DF44E3B219F7EE86EA01704D652983CE0D475896C1EB94E09314D386233D706FE0F5415BAF51746F3E8A6AC74E6F68CCF665CCEC4BE0B9CE19308C0423491F5914EA8ABE6081F38282D4994A4B640DCE56F4D616CED59B80938E4E7C486AB64E7C740FCD6ADB5494906520FD66A02069D3C11085157142CDDBFB004023C5CDFCCEAC5296636A77C127DEC4182A36D6A34D980F778452271C80CABAFE15A629302EFE9CD9105353B719581D4DD2E1BCF9411A4CCB0D010B5954291453E761A3B9EAF533119EEF1C30C4E53FEFAF2D2300162786963D54ECE0376CC797CBBDD757B596FAB26716ECEA7C47FB6C6DC6A80FC435D5CADB36D5ACB6760CAC6272B61E64A920EC7D4E5FBD680B2B906F1CF78EFD380A47692E1DC6C06AC21255E65C3757E32C301B5ACD8BA136FEE7C19B858D8B60595946BF1D0520912ACD17E397C9FC156C741AD1104F403B363B4E6B4AD06E8C60928CCD6AB3FE6AEFECBC57DB5CFF431A2D44533D9A92C483B56AE56698F02622D3A65E09B6EBFDFD5DCAF34E09DEDA100B40DD4C40ADCEF30787E527C4F613A08BDED0D867EE3B
-20241201061048 2 6 100 7679 5 F02D40B37C40876939E4D2A62AF7EC21A676D8E2B04081BA98E23F464A47514FB40DC99F7B8046B48CD3052C7AC080E4B496C16ED18695CA27493A129088F5829BBEAD02DFD521829FFD8B1120330E2BBA10C55A1EAD0641006827DA4725BFD2A2559C363C33BC78C2D83B4A075099EC57634D0AD4AEDA3302441B7005C728C0371B51877A97B442C5E3C3D53C244EFF3B65CDCCB0C017723F1EBD0B91E220116ACF14703268A11B7FC7564F7BEDBFFB3CE046261DD9D83E6078CD7AB5AC97595EF53D6C4C56D24588C6D130C0CD2C967AB90C31497186A06A93FB9338D4F30E0104BC8EFF2518D0644174BD1FF1FD7BAC2AAFF151D733A14F456A189ECA2D5F11D7C3AF1DA06192D36251B050E1AC576E3C369678D12823870FFC6E5809903382F9FBE36156F294C94FF5369E8D24D085A326870A998A10683495CEF15EFF0A45C781B5156B82D9AA07852040A96A0D5ACDF094B9DD91EA893382F95A6B72F0A2090F036A1B23CF9CF544753EA5B9ED86FA52EBB4C5421C5B485AE932F5837822C91257EC4953ACA79F2D94261DC40B3D44CB44056D4025EC459563865000B8C5F5D7724ED27CA4A8ADE299E5C898F4BD09F430781A68C261E4FA0BA2FEE567434B057C5D5F2899A1547B780B91315CC631C0552DB403DF53A6059BE895242FDA4AE1F6C5129E3643DF1A20C28BBF4328B4E623DCBC1149CE838BBC4A9944A6B6ACB4AA29B50FC7AFFAB0075BB4CC190F15B2C17847560F1B4C591EFE90D5AAA307A3FCC091DF44E3B219F7EE86EA01704D652983CE0D475896C1EB94E09314D386233D706FE0F5415BAF51746F3E8A6AC74E6F68CCF665CCEC4BE0B9CE19308C0423491F5914EA8ABE6081F38282D4994A4B640DCE56F4D616CED59B80938E4E7C486AB64E7C740FCD6ADB5494906520FD66A02069D3C11085157142CDDBFB004023C5CDFCCEAC5296636A77C127DEC4182A36D6A34D980F778452271C80CABAFE15A629302EFE9CD9105353B719581D4DD2E1BCF9411A4CCB0D010B5954291453E761A3B9EAF533119EEF1C30C4E53FEFAF2D2300162786963D54ECE0376CC797CBBDD757B596FAB26716ECEA7C47FB6C6DC6A80FC435D5CADB36D5ACB6760CAC6272B61E64A920EC7D4E5FBD680B2B906F1CF78EFD380A47692E1DC6C06AC21255E65C3757E32C301B5ACD8BA136FEE7C19B858D8B60595946BF1D0520912ACD17E397C9FC156C741AD1104F403B363B4E6B4AD06E8C60928CCD6AB3FE6AEFECBC57DB5CFF431A2D44533D9A92C483B56AE56698F02622D3A65E09B6EBFDFD5DCAF34E09DEDA100B40DD4C40ADCEF30787E527C4F613A08BDED0DDAE0C8F
-20241201072458 2 6 100 7679 5 F02D40B37C40876939E4D2A62AF7EC21A676D8E2B04081BA98E23F464A47514FB40DC99F7B8046B48CD3052C7AC080E4B496C16ED18695CA27493A129088F5829BBEAD02DFD521829FFD8B1120330E2BBA10C55A1EAD0641006827DA4725BFD2A2559C363C33BC78C2D83B4A075099EC57634D0AD4AEDA3302441B7005C728C0371B51877A97B442C5E3C3D53C244EFF3B65CDCCB0C017723F1EBD0B91E220116ACF14703268A11B7FC7564F7BEDBFFB3CE046261DD9D83E6078CD7AB5AC97595EF53D6C4C56D24588C6D130C0CD2C967AB90C31497186A06A93FB9338D4F30E0104BC8EFF2518D0644174BD1FF1FD7BAC2AAFF151D733A14F456A189ECA2D5F11D7C3AF1DA06192D36251B050E1AC576E3C369678D12823870FFC6E5809903382F9FBE36156F294C94FF5369E8D24D085A326870A998A10683495CEF15EFF0A45C781B5156B82D9AA07852040A96A0D5ACDF094B9DD91EA893382F95A6B72F0A2090F036A1B23CF9CF544753EA5B9ED86FA52EBB4C5421C5B485AE932F5837822C91257EC4953ACA79F2D94261DC40B3D44CB44056D4025EC459563865000B8C5F5D7724ED27CA4A8ADE299E5C898F4BD09F430781A68C261E4FA0BA2FEE567434B057C5D5F2899A1547B780B91315CC631C0552DB403DF53A6059BE895242FDA4AE1F6C5129E3643DF1A20C28BBF4328B4E623DCBC1149CE838BBC4A9944A6B6ACB4AA29B50FC7AFFAB0075BB4CC190F15B2C17847560F1B4C591EFE90D5AAA307A3FCC091DF44E3B219F7EE86EA01704D652983CE0D475896C1EB94E09314D386233D706FE0F5415BAF51746F3E8A6AC74E6F68CCF665CCEC4BE0B9CE19308C0423491F5914EA8ABE6081F38282D4994A4B640DCE56F4D616CED59B80938E4E7C486AB64E7C740FCD6ADB5494906520FD66A02069D3C11085157142CDDBFB004023C5CDFCCEAC5296636A77C127DEC4182A36D6A34D980F778452271C80CABAFE15A629302EFE9CD9105353B719581D4DD2E1BCF9411A4CCB0D010B5954291453E761A3B9EAF533119EEF1C30C4E53FEFAF2D2300162786963D54ECE0376CC797CBBDD757B596FAB26716ECEA7C47FB6C6DC6A80FC435D5CADB36D5ACB6760CAC6272B61E64A920EC7D4E5FBD680B2B906F1CF78EFD380A47692E1DC6C06AC21255E65C3757E32C301B5ACD8BA136FEE7C19B858D8B60595946BF1D0520912ACD17E397C9FC156C741AD1104F403B363B4E6B4AD06E8C60928CCD6AB3FE6AEFECBC57DB5CFF431A2D44533D9A92C483B56AE56698F02622D3A65E09B6EBFDFD5DCAF34E09DEDA100B40DD4C40ADCEF30787E527C4F613A08BDED0E29A61DF
-20241201073945 2 6 100 7679 2 F02D40B37C40876939E4D2A62AF7EC21A676D8E2B04081BA98E23F464A47514FB40DC99F7B8046B48CD3052C7AC080E4B496C16ED18695CA27493A129088F5829BBEAD02DFD521829FFD8B1120330E2BBA10C55A1EAD0641006827DA4725BFD2A2559C363C33BC78C2D83B4A075099EC57634D0AD4AEDA3302441B7005C728C0371B51877A97B442C5E3C3D53C244EFF3B65CDCCB0C017723F1EBD0B91E220116ACF14703268A11B7FC7564F7BEDBFFB3CE046261DD9D83E6078CD7AB5AC97595EF53D6C4C56D24588C6D130C0CD2C967AB90C31497186A06A93FB9338D4F30E0104BC8EFF2518D0644174BD1FF1FD7BAC2AAFF151D733A14F456A189ECA2D5F11D7C3AF1DA06192D36251B050E1AC576E3C369678D12823870FFC6E5809903382F9FBE36156F294C94FF5369E8D24D085A326870A998A10683495CEF15EFF0A45C781B5156B82D9AA07852040A96A0D5ACDF094B9DD91EA893382F95A6B72F0A2090F036A1B23CF9CF544753EA5B9ED86FA52EBB4C5421C5B485AE932F5837822C91257EC4953ACA79F2D94261DC40B3D44CB44056D4025EC459563865000B8C5F5D7724ED27CA4A8ADE299E5C898F4BD09F430781A68C261E4FA0BA2FEE567434B057C5D5F2899A1547B780B91315CC631C0552DB403DF53A6059BE895242FDA4AE1F6C5129E3643DF1A20C28BBF4328B4E623DCBC1149CE838BBC4A9944A6B6ACB4AA29B50FC7AFFAB0075BB4CC190F15B2C17847560F1B4C591EFE90D5AAA307A3FCC091DF44E3B219F7EE86EA01704D652983CE0D475896C1EB94E09314D386233D706FE0F5415BAF51746F3E8A6AC74E6F68CCF665CCEC4BE0B9CE19308C0423491F5914EA8ABE6081F38282D4994A4B640DCE56F4D616CED59B80938E4E7C486AB64E7C740FCD6ADB5494906520FD66A02069D3C11085157142CDDBFB004023C5CDFCCEAC5296636A77C127DEC4182A36D6A34D980F778452271C80CABAFE15A629302EFE9CD9105353B719581D4DD2E1BCF9411A4CCB0D010B5954291453E761A3B9EAF533119EEF1C30C4E53FEFAF2D2300162786963D54ECE0376CC797CBBDD757B596FAB26716ECEA7C47FB6C6DC6A80FC435D5CADB36D5ACB6760CAC6272B61E64A920EC7D4E5FBD680B2B906F1CF78EFD380A47692E1DC6C06AC21255E65C3757E32C301B5ACD8BA136FEE7C19B858D8B60595946BF1D0520912ACD17E397C9FC156C741AD1104F403B363B4E6B4AD06E8C60928CCD6AB3FE6AEFECBC57DB5CFF431A2D44533D9A92C483B56AE56698F02622D3A65E09B6EBFDFD5DCAF34E09DEDA100B40DD4C40ADCEF30787E527C4F613A08BDED0E39422AB
-20241201081137 2 6 100 7679 2 F02D40B37C40876939E4D2A62AF7EC21A676D8E2B04081BA98E23F464A47514FB40DC99F7B8046B48CD3052C7AC080E4B496C16ED18695CA27493A129088F5829BBEAD02DFD521829FFD8B1120330E2BBA10C55A1EAD0641006827DA4725BFD2A2559C363C33BC78C2D83B4A075099EC57634D0AD4AEDA3302441B7005C728C0371B51877A97B442C5E3C3D53C244EFF3B65CDCCB0C017723F1EBD0B91E220116ACF14703268A11B7FC7564F7BEDBFFB3CE046261DD9D83E6078CD7AB5AC97595EF53D6C4C56D24588C6D130C0CD2C967AB90C31497186A06A93FB9338D4F30E0104BC8EFF2518D0644174BD1FF1FD7BAC2AAFF151D733A14F456A189ECA2D5F11D7C3AF1DA06192D36251B050E1AC576E3C369678D12823870FFC6E5809903382F9FBE36156F294C94FF5369E8D24D085A326870A998A10683495CEF15EFF0A45C781B5156B82D9AA07852040A96A0D5ACDF094B9DD91EA893382F95A6B72F0A2090F036A1B23CF9CF544753EA5B9ED86FA52EBB4C5421C5B485AE932F5837822C91257EC4953ACA79F2D94261DC40B3D44CB44056D4025EC459563865000B8C5F5D7724ED27CA4A8ADE299E5C898F4BD09F430781A68C261E4FA0BA2FEE567434B057C5D5F2899A1547B780B91315CC631C0552DB403DF53A6059BE895242FDA4AE1F6C5129E3643DF1A20C28BBF4328B4E623DCBC1149CE838BBC4A9944A6B6ACB4AA29B50FC7AFFAB0075BB4CC190F15B2C17847560F1B4C591EFE90D5AAA307A3FCC091DF44E3B219F7EE86EA01704D652983CE0D475896C1EB94E09314D386233D706FE0F5415BAF51746F3E8A6AC74E6F68CCF665CCEC4BE0B9CE19308C0423491F5914EA8ABE6081F38282D4994A4B640DCE56F4D616CED59B80938E4E7C486AB64E7C740FCD6ADB5494906520FD66A02069D3C11085157142CDDBFB004023C5CDFCCEAC5296636A77C127DEC4182A36D6A34D980F778452271C80CABAFE15A629302EFE9CD9105353B719581D4DD2E1BCF9411A4CCB0D010B5954291453E761A3B9EAF533119EEF1C30C4E53FEFAF2D2300162786963D54ECE0376CC797CBBDD757B596FAB26716ECEA7C47FB6C6DC6A80FC435D5CADB36D5ACB6760CAC6272B61E64A920EC7D4E5FBD680B2B906F1CF78EFD380A47692E1DC6C06AC21255E65C3757E32C301B5ACD8BA136FEE7C19B858D8B60595946BF1D0520912ACD17E397C9FC156C741AD1104F403B363B4E6B4AD06E8C60928CCD6AB3FE6AEFECBC57DB5CFF431A2D44533D9A92C483B56AE56698F02622D3A65E09B6EBFDFD5DCAF34E09DEDA100B40DD4C40ADCEF30787E527C4F613A08BDED0E5B1C16B
-20241201084445 2 6 100 7679 2 F02D40B37C40876939E4D2A62AF7EC21A676D8E2B04081BA98E23F464A47514FB40DC99F7B8046B48CD3052C7AC080E4B496C16ED18695CA27493A129088F5829BBEAD02DFD521829FFD8B1120330E2BBA10C55A1EAD0641006827DA4725BFD2A2559C363C33BC78C2D83B4A075099EC57634D0AD4AEDA3302441B7005C728C0371B51877A97B442C5E3C3D53C244EFF3B65CDCCB0C017723F1EBD0B91E220116ACF14703268A11B7FC7564F7BEDBFFB3CE046261DD9D83E6078CD7AB5AC97595EF53D6C4C56D24588C6D130C0CD2C967AB90C31497186A06A93FB9338D4F30E0104BC8EFF2518D0644174BD1FF1FD7BAC2AAFF151D733A14F456A189ECA2D5F11D7C3AF1DA06192D36251B050E1AC576E3C369678D12823870FFC6E5809903382F9FBE36156F294C94FF5369E8D24D085A326870A998A10683495CEF15EFF0A45C781B5156B82D9AA07852040A96A0D5ACDF094B9DD91EA893382F95A6B72F0A2090F036A1B23CF9CF544753EA5B9ED86FA52EBB4C5421C5B485AE932F5837822C91257EC4953ACA79F2D94261DC40B3D44CB44056D4025EC459563865000B8C5F5D7724ED27CA4A8ADE299E5C898F4BD09F430781A68C261E4FA0BA2FEE567434B057C5D5F2899A1547B780B91315CC631C0552DB403DF53A6059BE895242FDA4AE1F6C5129E3643DF1A20C28BBF4328B4E623DCBC1149CE838BBC4A9944A6B6ACB4AA29B50FC7AFFAB0075BB4CC190F15B2C17847560F1B4C591EFE90D5AAA307A3FCC091DF44E3B219F7EE86EA01704D652983CE0D475896C1EB94E09314D386233D706FE0F5415BAF51746F3E8A6AC74E6F68CCF665CCEC4BE0B9CE19308C0423491F5914EA8ABE6081F38282D4994A4B640DCE56F4D616CED59B80938E4E7C486AB64E7C740FCD6ADB5494906520FD66A02069D3C11085157142CDDBFB004023C5CDFCCEAC5296636A77C127DEC4182A36D6A34D980F778452271C80CABAFE15A629302EFE9CD9105353B719581D4DD2E1BCF9411A4CCB0D010B5954291453E761A3B9EAF533119EEF1C30C4E53FEFAF2D2300162786963D54ECE0376CC797CBBDD757B596FAB26716ECEA7C47FB6C6DC6A80FC435D5CADB36D5ACB6760CAC6272B61E64A920EC7D4E5FBD680B2B906F1CF78EFD380A47692E1DC6C06AC21255E65C3757E32C301B5ACD8BA136FEE7C19B858D8B60595946BF1D0520912ACD17E397C9FC156C741AD1104F403B363B4E6B4AD06E8C60928CCD6AB3FE6AEFECBC57DB5CFF431A2D44533D9A92C483B56AE56698F02622D3A65E09B6EBFDFD5DCAF34E09DEDA100B40DD4C40ADCEF30787E527C4F613A08BDED0E7E0CB7B
-20241201085943 2 6 100 7679 2 F02D40B37C40876939E4D2A62AF7EC21A676D8E2B04081BA98E23F464A47514FB40DC99F7B8046B48CD3052C7AC080E4B496C16ED18695CA27493A129088F5829BBEAD02DFD521829FFD8B1120330E2BBA10C55A1EAD0641006827DA4725BFD2A2559C363C33BC78C2D83B4A075099EC57634D0AD4AEDA3302441B7005C728C0371B51877A97B442C5E3C3D53C244EFF3B65CDCCB0C017723F1EBD0B91E220116ACF14703268A11B7FC7564F7BEDBFFB3CE046261DD9D83E6078CD7AB5AC97595EF53D6C4C56D24588C6D130C0CD2C967AB90C31497186A06A93FB9338D4F30E0104BC8EFF2518D0644174BD1FF1FD7BAC2AAFF151D733A14F456A189ECA2D5F11D7C3AF1DA06192D36251B050E1AC576E3C369678D12823870FFC6E5809903382F9FBE36156F294C94FF5369E8D24D085A326870A998A10683495CEF15EFF0A45C781B5156B82D9AA07852040A96A0D5ACDF094B9DD91EA893382F95A6B72F0A2090F036A1B23CF9CF544753EA5B9ED86FA52EBB4C5421C5B485AE932F5837822C91257EC4953ACA79F2D94261DC40B3D44CB44056D4025EC459563865000B8C5F5D7724ED27CA4A8ADE299E5C898F4BD09F430781A68C261E4FA0BA2FEE567434B057C5D5F2899A1547B780B91315CC631C0552DB403DF53A6059BE895242FDA4AE1F6C5129E3643DF1A20C28BBF4328B4E623DCBC1149CE838BBC4A9944A6B6ACB4AA29B50FC7AFFAB0075BB4CC190F15B2C17847560F1B4C591EFE90D5AAA307A3FCC091DF44E3B219F7EE86EA01704D652983CE0D475896C1EB94E09314D386233D706FE0F5415BAF51746F3E8A6AC74E6F68CCF665CCEC4BE0B9CE19308C0423491F5914EA8ABE6081F38282D4994A4B640DCE56F4D616CED59B80938E4E7C486AB64E7C740FCD6ADB5494906520FD66A02069D3C11085157142CDDBFB004023C5CDFCCEAC5296636A77C127DEC4182A36D6A34D980F778452271C80CABAFE15A629302EFE9CD9105353B719581D4DD2E1BCF9411A4CCB0D010B5954291453E761A3B9EAF533119EEF1C30C4E53FEFAF2D2300162786963D54ECE0376CC797CBBDD757B596FAB26716ECEA7C47FB6C6DC6A80FC435D5CADB36D5ACB6760CAC6272B61E64A920EC7D4E5FBD680B2B906F1CF78EFD380A47692E1DC6C06AC21255E65C3757E32C301B5ACD8BA136FEE7C19B858D8B60595946BF1D0520912ACD17E397C9FC156C741AD1104F403B363B4E6B4AD06E8C60928CCD6AB3FE6AEFECBC57DB5CFF431A2D44533D9A92C483B56AE56698F02622D3A65E09B6EBFDFD5DCAF34E09DEDA100B40DD4C40ADCEF30787E527C4F613A08BDED0E8D1F5CB
-20241201092406 2 6 100 7679 2 F02D40B37C40876939E4D2A62AF7EC21A676D8E2B04081BA98E23F464A47514FB40DC99F7B8046B48CD3052C7AC080E4B496C16ED18695CA27493A129088F5829BBEAD02DFD521829FFD8B1120330E2BBA10C55A1EAD0641006827DA4725BFD2A2559C363C33BC78C2D83B4A075099EC57634D0AD4AEDA3302441B7005C728C0371B51877A97B442C5E3C3D53C244EFF3B65CDCCB0C017723F1EBD0B91E220116ACF14703268A11B7FC7564F7BEDBFFB3CE046261DD9D83E6078CD7AB5AC97595EF53D6C4C56D24588C6D130C0CD2C967AB90C31497186A06A93FB9338D4F30E0104BC8EFF2518D0644174BD1FF1FD7BAC2AAFF151D733A14F456A189ECA2D5F11D7C3AF1DA06192D36251B050E1AC576E3C369678D12823870FFC6E5809903382F9FBE36156F294C94FF5369E8D24D085A326870A998A10683495CEF15EFF0A45C781B5156B82D9AA07852040A96A0D5ACDF094B9DD91EA893382F95A6B72F0A2090F036A1B23CF9CF544753EA5B9ED86FA52EBB4C5421C5B485AE932F5837822C91257EC4953ACA79F2D94261DC40B3D44CB44056D4025EC459563865000B8C5F5D7724ED27CA4A8ADE299E5C898F4BD09F430781A68C261E4FA0BA2FEE567434B057C5D5F2899A1547B780B91315CC631C0552DB403DF53A6059BE895242FDA4AE1F6C5129E3643DF1A20C28BBF4328B4E623DCBC1149CE838BBC4A9944A6B6ACB4AA29B50FC7AFFAB0075BB4CC190F15B2C17847560F1B4C591EFE90D5AAA307A3FCC091DF44E3B219F7EE86EA01704D652983CE0D475896C1EB94E09314D386233D706FE0F5415BAF51746F3E8A6AC74E6F68CCF665CCEC4BE0B9CE19308C0423491F5914EA8ABE6081F38282D4994A4B640DCE56F4D616CED59B80938E4E7C486AB64E7C740FCD6ADB5494906520FD66A02069D3C11085157142CDDBFB004023C5CDFCCEAC5296636A77C127DEC4182A36D6A34D980F778452271C80CABAFE15A629302EFE9CD9105353B719581D4DD2E1BCF9411A4CCB0D010B5954291453E761A3B9EAF533119EEF1C30C4E53FEFAF2D2300162786963D54ECE0376CC797CBBDD757B596FAB26716ECEA7C47FB6C6DC6A80FC435D5CADB36D5ACB6760CAC6272B61E64A920EC7D4E5FBD680B2B906F1CF78EFD380A47692E1DC6C06AC21255E65C3757E32C301B5ACD8BA136FEE7C19B858D8B60595946BF1D0520912ACD17E397C9FC156C741AD1104F403B363B4E6B4AD06E8C60928CCD6AB3FE6AEFECBC57DB5CFF431A2D44533D9A92C483B56AE56698F02622D3A65E09B6EBFDFD5DCAF34E09DEDA100B40DD4C40ADCEF30787E527C4F613A08BDED0EA661BD3
-20241201094424 2 6 100 7679 2 F02D40B37C40876939E4D2A62AF7EC21A676D8E2B04081BA98E23F464A47514FB40DC99F7B8046B48CD3052C7AC080E4B496C16ED18695CA27493A129088F5829BBEAD02DFD521829FFD8B1120330E2BBA10C55A1EAD0641006827DA4725BFD2A2559C363C33BC78C2D83B4A075099EC57634D0AD4AEDA3302441B7005C728C0371B51877A97B442C5E3C3D53C244EFF3B65CDCCB0C017723F1EBD0B91E220116ACF14703268A11B7FC7564F7BEDBFFB3CE046261DD9D83E6078CD7AB5AC97595EF53D6C4C56D24588C6D130C0CD2C967AB90C31497186A06A93FB9338D4F30E0104BC8EFF2518D0644174BD1FF1FD7BAC2AAFF151D733A14F456A189ECA2D5F11D7C3AF1DA06192D36251B050E1AC576E3C369678D12823870FFC6E5809903382F9FBE36156F294C94FF5369E8D24D085A326870A998A10683495CEF15EFF0A45C781B5156B82D9AA07852040A96A0D5ACDF094B9DD91EA893382F95A6B72F0A2090F036A1B23CF9CF544753EA5B9ED86FA52EBB4C5421C5B485AE932F5837822C91257EC4953ACA79F2D94261DC40B3D44CB44056D4025EC459563865000B8C5F5D7724ED27CA4A8ADE299E5C898F4BD09F430781A68C261E4FA0BA2FEE567434B057C5D5F2899A1547B780B91315CC631C0552DB403DF53A6059BE895242FDA4AE1F6C5129E3643DF1A20C28BBF4328B4E623DCBC1149CE838BBC4A9944A6B6ACB4AA29B50FC7AFFAB0075BB4CC190F15B2C17847560F1B4C591EFE90D5AAA307A3FCC091DF44E3B219F7EE86EA01704D652983CE0D475896C1EB94E09314D386233D706FE0F5415BAF51746F3E8A6AC74E6F68CCF665CCEC4BE0B9CE19308C0423491F5914EA8ABE6081F38282D4994A4B640DCE56F4D616CED59B80938E4E7C486AB64E7C740FCD6ADB5494906520FD66A02069D3C11085157142CDDBFB004023C5CDFCCEAC5296636A77C127DEC4182A36D6A34D980F778452271C80CABAFE15A629302EFE9CD9105353B719581D4DD2E1BCF9411A4CCB0D010B5954291453E761A3B9EAF533119EEF1C30C4E53FEFAF2D2300162786963D54ECE0376CC797CBBDD757B596FAB26716ECEA7C47FB6C6DC6A80FC435D5CADB36D5ACB6760CAC6272B61E64A920EC7D4E5FBD680B2B906F1CF78EFD380A47692E1DC6C06AC21255E65C3757E32C301B5ACD8BA136FEE7C19B858D8B60595946BF1D0520912ACD17E397C9FC156C741AD1104F403B363B4E6B4AD06E8C60928CCD6AB3FE6AEFECBC57DB5CFF431A2D44533D9A92C483B56AE56698F02622D3A65E09B6EBFDFD5DCAF34E09DEDA100B40DD4C40ADCEF30787E527C4F613A08BDED0EBB93913
-20241201104106 2 6 100 7679 5 F02D40B37C40876939E4D2A62AF7EC21A676D8E2B04081BA98E23F464A47514FB40DC99F7B8046B48CD3052C7AC080E4B496C16ED18695CA27493A129088F5829BBEAD02DFD521829FFD8B1120330E2BBA10C55A1EAD0641006827DA4725BFD2A2559C363C33BC78C2D83B4A075099EC57634D0AD4AEDA3302441B7005C728C0371B51877A97B442C5E3C3D53C244EFF3B65CDCCB0C017723F1EBD0B91E220116ACF14703268A11B7FC7564F7BEDBFFB3CE046261DD9D83E6078CD7AB5AC97595EF53D6C4C56D24588C6D130C0CD2C967AB90C31497186A06A93FB9338D4F30E0104BC8EFF2518D0644174BD1FF1FD7BAC2AAFF151D733A14F456A189ECA2D5F11D7C3AF1DA06192D36251B050E1AC576E3C369678D12823870FFC6E5809903382F9FBE36156F294C94FF5369E8D24D085A326870A998A10683495CEF15EFF0A45C781B5156B82D9AA07852040A96A0D5ACDF094B9DD91EA893382F95A6B72F0A2090F036A1B23CF9CF544753EA5B9ED86FA52EBB4C5421C5B485AE932F5837822C91257EC4953ACA79F2D94261DC40B3D44CB44056D4025EC459563865000B8C5F5D7724ED27CA4A8ADE299E5C898F4BD09F430781A68C261E4FA0BA2FEE567434B057C5D5F2899A1547B780B91315CC631C0552DB403DF53A6059BE895242FDA4AE1F6C5129E3643DF1A20C28BBF4328B4E623DCBC1149CE838BBC4A9944A6B6ACB4AA29B50FC7AFFAB0075BB4CC190F15B2C17847560F1B4C591EFE90D5AAA307A3FCC091DF44E3B219F7EE86EA01704D652983CE0D475896C1EB94E09314D386233D706FE0F5415BAF51746F3E8A6AC74E6F68CCF665CCEC4BE0B9CE19308C0423491F5914EA8ABE6081F38282D4994A4B640DCE56F4D616CED59B80938E4E7C486AB64E7C740FCD6ADB5494906520FD66A02069D3C11085157142CDDBFB004023C5CDFCCEAC5296636A77C127DEC4182A36D6A34D980F778452271C80CABAFE15A629302EFE9CD9105353B719581D4DD2E1BCF9411A4CCB0D010B5954291453E761A3B9EAF533119EEF1C30C4E53FEFAF2D2300162786963D54ECE0376CC797CBBDD757B596FAB26716ECEA7C47FB6C6DC6A80FC435D5CADB36D5ACB6760CAC6272B61E64A920EC7D4E5FBD680B2B906F1CF78EFD380A47692E1DC6C06AC21255E65C3757E32C301B5ACD8BA136FEE7C19B858D8B60595946BF1D0520912ACD17E397C9FC156C741AD1104F403B363B4E6B4AD06E8C60928CCD6AB3FE6AEFECBC57DB5CFF431A2D44533D9A92C483B56AE56698F02622D3A65E09B6EBFDFD5DCAF34E09DEDA100B40DD4C40ADCEF30787E527C4F613A08BDED0EF85D8F7
-20241201104452 2 6 100 7679 5 F02D40B37C40876939E4D2A62AF7EC21A676D8E2B04081BA98E23F464A47514FB40DC99F7B8046B48CD3052C7AC080E4B496C16ED18695CA27493A129088F5829BBEAD02DFD521829FFD8B1120330E2BBA10C55A1EAD0641006827DA4725BFD2A2559C363C33BC78C2D83B4A075099EC57634D0AD4AEDA3302441B7005C728C0371B51877A97B442C5E3C3D53C244EFF3B65CDCCB0C017723F1EBD0B91E220116ACF14703268A11B7FC7564F7BEDBFFB3CE046261DD9D83E6078CD7AB5AC97595EF53D6C4C56D24588C6D130C0CD2C967AB90C31497186A06A93FB9338D4F30E0104BC8EFF2518D0644174BD1FF1FD7BAC2AAFF151D733A14F456A189ECA2D5F11D7C3AF1DA06192D36251B050E1AC576E3C369678D12823870FFC6E5809903382F9FBE36156F294C94FF5369E8D24D085A326870A998A10683495CEF15EFF0A45C781B5156B82D9AA07852040A96A0D5ACDF094B9DD91EA893382F95A6B72F0A2090F036A1B23CF9CF544753EA5B9ED86FA52EBB4C5421C5B485AE932F5837822C91257EC4953ACA79F2D94261DC40B3D44CB44056D4025EC459563865000B8C5F5D7724ED27CA4A8ADE299E5C898F4BD09F430781A68C261E4FA0BA2FEE567434B057C5D5F2899A1547B780B91315CC631C0552DB403DF53A6059BE895242FDA4AE1F6C5129E3643DF1A20C28BBF4328B4E623DCBC1149CE838BBC4A9944A6B6ACB4AA29B50FC7AFFAB0075BB4CC190F15B2C17847560F1B4C591EFE90D5AAA307A3FCC091DF44E3B219F7EE86EA01704D652983CE0D475896C1EB94E09314D386233D706FE0F5415BAF51746F3E8A6AC74E6F68CCF665CCEC4BE0B9CE19308C0423491F5914EA8ABE6081F38282D4994A4B640DCE56F4D616CED59B80938E4E7C486AB64E7C740FCD6ADB5494906520FD66A02069D3C11085157142CDDBFB004023C5CDFCCEAC5296636A77C127DEC4182A36D6A34D980F778452271C80CABAFE15A629302EFE9CD9105353B719581D4DD2E1BCF9411A4CCB0D010B5954291453E761A3B9EAF533119EEF1C30C4E53FEFAF2D2300162786963D54ECE0376CC797CBBDD757B596FAB26716ECEA7C47FB6C6DC6A80FC435D5CADB36D5ACB6760CAC6272B61E64A920EC7D4E5FBD680B2B906F1CF78EFD380A47692E1DC6C06AC21255E65C3757E32C301B5ACD8BA136FEE7C19B858D8B60595946BF1D0520912ACD17E397C9FC156C741AD1104F403B363B4E6B4AD06E8C60928CCD6AB3FE6AEFECBC57DB5CFF431A2D44533D9A92C483B56AE56698F02622D3A65E09B6EBFDFD5DCAF34E09DEDA100B40DD4C40ADCEF30787E527C4F613A08BDED0EFBC6D8F
-20241201115450 2 6 100 7679 2 F02D40B37C40876939E4D2A62AF7EC21A676D8E2B04081BA98E23F464A47514FB40DC99F7B8046B48CD3052C7AC080E4B496C16ED18695CA27493A129088F5829BBEAD02DFD521829FFD8B1120330E2BBA10C55A1EAD0641006827DA4725BFD2A2559C363C33BC78C2D83B4A075099EC57634D0AD4AEDA3302441B7005C728C0371B51877A97B442C5E3C3D53C244EFF3B65CDCCB0C017723F1EBD0B91E220116ACF14703268A11B7FC7564F7BEDBFFB3CE046261DD9D83E6078CD7AB5AC97595EF53D6C4C56D24588C6D130C0CD2C967AB90C31497186A06A93FB9338D4F30E0104BC8EFF2518D0644174BD1FF1FD7BAC2AAFF151D733A14F456A189ECA2D5F11D7C3AF1DA06192D36251B050E1AC576E3C369678D12823870FFC6E5809903382F9FBE36156F294C94FF5369E8D24D085A326870A998A10683495CEF15EFF0A45C781B5156B82D9AA07852040A96A0D5ACDF094B9DD91EA893382F95A6B72F0A2090F036A1B23CF9CF544753EA5B9ED86FA52EBB4C5421C5B485AE932F5837822C91257EC4953ACA79F2D94261DC40B3D44CB44056D4025EC459563865000B8C5F5D7724ED27CA4A8ADE299E5C898F4BD09F430781A68C261E4FA0BA2FEE567434B057C5D5F2899A1547B780B91315CC631C0552DB403DF53A6059BE895242FDA4AE1F6C5129E3643DF1A20C28BBF4328B4E623DCBC1149CE838BBC4A9944A6B6ACB4AA29B50FC7AFFAB0075BB4CC190F15B2C17847560F1B4C591EFE90D5AAA307A3FCC091DF44E3B219F7EE86EA01704D652983CE0D475896C1EB94E09314D386233D706FE0F5415BAF51746F3E8A6AC74E6F68CCF665CCEC4BE0B9CE19308C0423491F5914EA8ABE6081F38282D4994A4B640DCE56F4D616CED59B80938E4E7C486AB64E7C740FCD6ADB5494906520FD66A02069D3C11085157142CDDBFB004023C5CDFCCEAC5296636A77C127DEC4182A36D6A34D980F778452271C80CABAFE15A629302EFE9CD9105353B719581D4DD2E1BCF9411A4CCB0D010B5954291453E761A3B9EAF533119EEF1C30C4E53FEFAF2D2300162786963D54ECE0376CC797CBBDD757B596FAB26716ECEA7C47FB6C6DC6A80FC435D5CADB36D5ACB6760CAC6272B61E64A920EC7D4E5FBD680B2B906F1CF78EFD380A47692E1DC6C06AC21255E65C3757E32C301B5ACD8BA136FEE7C19B858D8B60595946BF1D0520912ACD17E397C9FC156C741AD1104F403B363B4E6B4AD06E8C60928CCD6AB3FE6AEFECBC57DB5CFF431A2D44533D9A92C483B56AE56698F02622D3A65E09B6EBFDFD5DCAF34E09DEDA100B40DD4C40ADCEF30787E527C4F613A08BDED0F464B243
-20241201120212 2 6 100 7679 5 F02D40B37C40876939E4D2A62AF7EC21A676D8E2B04081BA98E23F464A47514FB40DC99F7B8046B48CD3052C7AC080E4B496C16ED18695CA27493A129088F5829BBEAD02DFD521829FFD8B1120330E2BBA10C55A1EAD0641006827DA4725BFD2A2559C363C33BC78C2D83B4A075099EC57634D0AD4AEDA3302441B7005C728C0371B51877A97B442C5E3C3D53C244EFF3B65CDCCB0C017723F1EBD0B91E220116ACF14703268A11B7FC7564F7BEDBFFB3CE046261DD9D83E6078CD7AB5AC97595EF53D6C4C56D24588C6D130C0CD2C967AB90C31497186A06A93FB9338D4F30E0104BC8EFF2518D0644174BD1FF1FD7BAC2AAFF151D733A14F456A189ECA2D5F11D7C3AF1DA06192D36251B050E1AC576E3C369678D12823870FFC6E5809903382F9FBE36156F294C94FF5369E8D24D085A326870A998A10683495CEF15EFF0A45C781B5156B82D9AA07852040A96A0D5ACDF094B9DD91EA893382F95A6B72F0A2090F036A1B23CF9CF544753EA5B9ED86FA52EBB4C5421C5B485AE932F5837822C91257EC4953ACA79F2D94261DC40B3D44CB44056D4025EC459563865000B8C5F5D7724ED27CA4A8ADE299E5C898F4BD09F430781A68C261E4FA0BA2FEE567434B057C5D5F2899A1547B780B91315CC631C0552DB403DF53A6059BE895242FDA4AE1F6C5129E3643DF1A20C28BBF4328B4E623DCBC1149CE838BBC4A9944A6B6ACB4AA29B50FC7AFFAB0075BB4CC190F15B2C17847560F1B4C591EFE90D5AAA307A3FCC091DF44E3B219F7EE86EA01704D652983CE0D475896C1EB94E09314D386233D706FE0F5415BAF51746F3E8A6AC74E6F68CCF665CCEC4BE0B9CE19308C0423491F5914EA8ABE6081F38282D4994A4B640DCE56F4D616CED59B80938E4E7C486AB64E7C740FCD6ADB5494906520FD66A02069D3C11085157142CDDBFB004023C5CDFCCEAC5296636A77C127DEC4182A36D6A34D980F778452271C80CABAFE15A629302EFE9CD9105353B719581D4DD2E1BCF9411A4CCB0D010B5954291453E761A3B9EAF533119EEF1C30C4E53FEFAF2D2300162786963D54ECE0376CC797CBBDD757B596FAB26716ECEA7C47FB6C6DC6A80FC435D5CADB36D5ACB6760CAC6272B61E64A920EC7D4E5FBD680B2B906F1CF78EFD380A47692E1DC6C06AC21255E65C3757E32C301B5ACD8BA136FEE7C19B858D8B60595946BF1D0520912ACD17E397C9FC156C741AD1104F403B363B4E6B4AD06E8C60928CCD6AB3FE6AEFECBC57DB5CFF431A2D44533D9A92C483B56AE56698F02622D3A65E09B6EBFDFD5DCAF34E09DEDA100B40DD4C40ADCEF30787E527C4F613A08BDED0F4DBBAFF
-20241201123240 2 6 100 7679 2 F02D40B37C40876939E4D2A62AF7EC21A676D8E2B04081BA98E23F464A47514FB40DC99F7B8046B48CD3052C7AC080E4B496C16ED18695CA27493A129088F5829BBEAD02DFD521829FFD8B1120330E2BBA10C55A1EAD0641006827DA4725BFD2A2559C363C33BC78C2D83B4A075099EC57634D0AD4AEDA3302441B7005C728C0371B51877A97B442C5E3C3D53C244EFF3B65CDCCB0C017723F1EBD0B91E220116ACF14703268A11B7FC7564F7BEDBFFB3CE046261DD9D83E6078CD7AB5AC97595EF53D6C4C56D24588C6D130C0CD2C967AB90C31497186A06A93FB9338D4F30E0104BC8EFF2518D0644174BD1FF1FD7BAC2AAFF151D733A14F456A189ECA2D5F11D7C3AF1DA06192D36251B050E1AC576E3C369678D12823870FFC6E5809903382F9FBE36156F294C94FF5369E8D24D085A326870A998A10683495CEF15EFF0A45C781B5156B82D9AA07852040A96A0D5ACDF094B9DD91EA893382F95A6B72F0A2090F036A1B23CF9CF544753EA5B9ED86FA52EBB4C5421C5B485AE932F5837822C91257EC4953ACA79F2D94261DC40B3D44CB44056D4025EC459563865000B8C5F5D7724ED27CA4A8ADE299E5C898F4BD09F430781A68C261E4FA0BA2FEE567434B057C5D5F2899A1547B780B91315CC631C0552DB403DF53A6059BE895242FDA4AE1F6C5129E3643DF1A20C28BBF4328B4E623DCBC1149CE838BBC4A9944A6B6ACB4AA29B50FC7AFFAB0075BB4CC190F15B2C17847560F1B4C591EFE90D5AAA307A3FCC091DF44E3B219F7EE86EA01704D652983CE0D475896C1EB94E09314D386233D706FE0F5415BAF51746F3E8A6AC74E6F68CCF665CCEC4BE0B9CE19308C0423491F5914EA8ABE6081F38282D4994A4B640DCE56F4D616CED59B80938E4E7C486AB64E7C740FCD6ADB5494906520FD66A02069D3C11085157142CDDBFB004023C5CDFCCEAC5296636A77C127DEC4182A36D6A34D980F778452271C80CABAFE15A629302EFE9CD9105353B719581D4DD2E1BCF9411A4CCB0D010B5954291453E761A3B9EAF533119EEF1C30C4E53FEFAF2D2300162786963D54ECE0376CC797CBBDD757B596FAB26716ECEA7C47FB6C6DC6A80FC435D5CADB36D5ACB6760CAC6272B61E64A920EC7D4E5FBD680B2B906F1CF78EFD380A47692E1DC6C06AC21255E65C3757E32C301B5ACD8BA136FEE7C19B858D8B60595946BF1D0520912ACD17E397C9FC156C741AD1104F403B363B4E6B4AD06E8C60928CCD6AB3FE6AEFECBC57DB5CFF431A2D44533D9A92C483B56AE56698F02622D3A65E09B6EBFDFD5DCAF34E09DEDA100B40DD4C40ADCEF30787E527C4F613A08BDED0F6DA27E3
-20241201130824 2 6 100 7679 5 F02D40B37C40876939E4D2A62AF7EC21A676D8E2B04081BA98E23F464A47514FB40DC99F7B8046B48CD3052C7AC080E4B496C16ED18695CA27493A129088F5829BBEAD02DFD521829FFD8B1120330E2BBA10C55A1EAD0641006827DA4725BFD2A2559C363C33BC78C2D83B4A075099EC57634D0AD4AEDA3302441B7005C728C0371B51877A97B442C5E3C3D53C244EFF3B65CDCCB0C017723F1EBD0B91E220116ACF14703268A11B7FC7564F7BEDBFFB3CE046261DD9D83E6078CD7AB5AC97595EF53D6C4C56D24588C6D130C0CD2C967AB90C31497186A06A93FB9338D4F30E0104BC8EFF2518D0644174BD1FF1FD7BAC2AAFF151D733A14F456A189ECA2D5F11D7C3AF1DA06192D36251B050E1AC576E3C369678D12823870FFC6E5809903382F9FBE36156F294C94FF5369E8D24D085A326870A998A10683495CEF15EFF0A45C781B5156B82D9AA07852040A96A0D5ACDF094B9DD91EA893382F95A6B72F0A2090F036A1B23CF9CF544753EA5B9ED86FA52EBB4C5421C5B485AE932F5837822C91257EC4953ACA79F2D94261DC40B3D44CB44056D4025EC459563865000B8C5F5D7724ED27CA4A8ADE299E5C898F4BD09F430781A68C261E4FA0BA2FEE567434B057C5D5F2899A1547B780B91315CC631C0552DB403DF53A6059BE895242FDA4AE1F6C5129E3643DF1A20C28BBF4328B4E623DCBC1149CE838BBC4A9944A6B6ACB4AA29B50FC7AFFAB0075BB4CC190F15B2C17847560F1B4C591EFE90D5AAA307A3FCC091DF44E3B219F7EE86EA01704D652983CE0D475896C1EB94E09314D386233D706FE0F5415BAF51746F3E8A6AC74E6F68CCF665CCEC4BE0B9CE19308C0423491F5914EA8ABE6081F38282D4994A4B640DCE56F4D616CED59B80938E4E7C486AB64E7C740FCD6ADB5494906520FD66A02069D3C11085157142CDDBFB004023C5CDFCCEAC5296636A77C127DEC4182A36D6A34D980F778452271C80CABAFE15A629302EFE9CD9105353B719581D4DD2E1BCF9411A4CCB0D010B5954291453E761A3B9EAF533119EEF1C30C4E53FEFAF2D2300162786963D54ECE0376CC797CBBDD757B596FAB26716ECEA7C47FB6C6DC6A80FC435D5CADB36D5ACB6760CAC6272B61E64A920EC7D4E5FBD680B2B906F1CF78EFD380A47692E1DC6C06AC21255E65C3757E32C301B5ACD8BA136FEE7C19B858D8B60595946BF1D0520912ACD17E397C9FC156C741AD1104F403B363B4E6B4AD06E8C60928CCD6AB3FE6AEFECBC57DB5CFF431A2D44533D9A92C483B56AE56698F02622D3A65E09B6EBFDFD5DCAF34E09DEDA100B40DD4C40ADCEF30787E527C4F613A08BDED0F939BADF
-20241201171234 2 6 100 7679 2 F02D40B37C40876939E4D2A62AF7EC21A676D8E2B04081BA98E23F464A47514FB40DC99F7B8046B48CD3052C7AC080E4B496C16ED18695CA27493A129088F5829BBEAD02DFD521829FFD8B1120330E2BBA10C55A1EAD0641006827DA4725BFD2A2559C363C33BC78C2D83B4A075099EC57634D0AD4AEDA3302441B7005C728C0371B51877A97B442C5E3C3D53C244EFF3B65CDCCB0C017723F1EBD0B91E220116ACF14703268A11B7FC7564F7BEDBFFB3CE046261DD9D83E6078CD7AB5AC97595EF53D6C4C56D24588C6D130C0CD2C967AB90C31497186A06A93FB9338D4F30E0104BC8EFF2518D0644174BD1FF1FD7BAC2AAFF151D733A14F456A189ECA2D5F11D7C3AF1DA06192D36251B050E1AC576E3C369678D12823870FFC6E5809903382F9FBE36156F294C94FF5369E8D24D085A326870A998A10683495CEF15EFF0A45C781B5156B82D9AA07852040A96A0D5ACDF094B9DD91EA893382F95A6B72F0A2090F036A1B23CF9CF544753EA5B9ED86FA52EBB4C5421C5B485AE932F5837822C91257EC4953ACA79F2D94261DC40B3D44CB44056D4025EC459563865000B8C5F5D7724ED27CA4A8ADE299E5C898F4BD09F430781A68C261E4FA0BA2FEE567434B057C5D5F2899A1547B780B91315CC631C0552DB403DF53A6059BE895242FDA4AE1F6C5129E3643DF1A20C28BBF4328B4E623DCBC1149CE838BBC4A9944A6B6ACB4AA29B50FC7AFFAB0075BB4CC190F15B2C17847560F1B4C591EFE90D5AAA307A3FCC091DF44E3B219F7EE86EA01704D652983CE0D475896C1EB94E09314D386233D706FE0F5415BAF51746F3E8A6AC74E6F68CCF665CCEC4BE0B9CE19308C0423491F5914EA8ABE6081F38282D4994A4B640DCE56F4D616CED59B80938E4E7C486AB64E7C740FCD6ADB5494906520FD66A02069D3C11085157142CDDBFB004023C5CDFCCEAC5296636A77C127DEC4182A36D6A34D980F778452271C80CABAFE15A629302EFE9CD9105353B719581D4DD2E1BCF9411A4CCB0D010B5954291453E761A3B9EAF533119EEF1C30C4E53FEFAF2D2300162786963D54ECE0376CC797CBBDD757B596FAB26716ECEA7C47FB6C6DC6A80FC435D5CADB36D5ACB6760CAC6272B61E64A920EC7D4E5FBD680B2B906F1CF78EFD380A47692E1DC6C06AC21255E65C3757E32C301B5ACD8BA136FEE7C19B858D8B60595946BF1D0520912ACD17E397C9FC156C741AD1104F403B363B4E6B4AD06E8C60928CCD6AB3FE6AEFECBC57DB5CFF431A2D44533D9A92C483B56AE56698F02622D3A65E09B6EBFDFD5DCAF34E09DEDA100B40DD4C40ADCEF30787E527C4F613A08BDED109A1419B
-20241201182756 2 6 100 7679 2 F02D40B37C40876939E4D2A62AF7EC21A676D8E2B04081BA98E23F464A47514FB40DC99F7B8046B48CD3052C7AC080E4B496C16ED18695CA27493A129088F5829BBEAD02DFD521829FFD8B1120330E2BBA10C55A1EAD0641006827DA4725BFD2A2559C363C33BC78C2D83B4A075099EC57634D0AD4AEDA3302441B7005C728C0371B51877A97B442C5E3C3D53C244EFF3B65CDCCB0C017723F1EBD0B91E220116ACF14703268A11B7FC7564F7BEDBFFB3CE046261DD9D83E6078CD7AB5AC97595EF53D6C4C56D24588C6D130C0CD2C967AB90C31497186A06A93FB9338D4F30E0104BC8EFF2518D0644174BD1FF1FD7BAC2AAFF151D733A14F456A189ECA2D5F11D7C3AF1DA06192D36251B050E1AC576E3C369678D12823870FFC6E5809903382F9FBE36156F294C94FF5369E8D24D085A326870A998A10683495CEF15EFF0A45C781B5156B82D9AA07852040A96A0D5ACDF094B9DD91EA893382F95A6B72F0A2090F036A1B23CF9CF544753EA5B9ED86FA52EBB4C5421C5B485AE932F5837822C91257EC4953ACA79F2D94261DC40B3D44CB44056D4025EC459563865000B8C5F5D7724ED27CA4A8ADE299E5C898F4BD09F430781A68C261E4FA0BA2FEE567434B057C5D5F2899A1547B780B91315CC631C0552DB403DF53A6059BE895242FDA4AE1F6C5129E3643DF1A20C28BBF4328B4E623DCBC1149CE838BBC4A9944A6B6ACB4AA29B50FC7AFFAB0075BB4CC190F15B2C17847560F1B4C591EFE90D5AAA307A3FCC091DF44E3B219F7EE86EA01704D652983CE0D475896C1EB94E09314D386233D706FE0F5415BAF51746F3E8A6AC74E6F68CCF665CCEC4BE0B9CE19308C0423491F5914EA8ABE6081F38282D4994A4B640DCE56F4D616CED59B80938E4E7C486AB64E7C740FCD6ADB5494906520FD66A02069D3C11085157142CDDBFB004023C5CDFCCEAC5296636A77C127DEC4182A36D6A34D980F778452271C80CABAFE15A629302EFE9CD9105353B719581D4DD2E1BCF9411A4CCB0D010B5954291453E761A3B9EAF533119EEF1C30C4E53FEFAF2D2300162786963D54ECE0376CC797CBBDD757B596FAB26716ECEA7C47FB6C6DC6A80FC435D5CADB36D5ACB6760CAC6272B61E64A920EC7D4E5FBD680B2B906F1CF78EFD380A47692E1DC6C06AC21255E65C3757E32C301B5ACD8BA136FEE7C19B858D8B60595946BF1D0520912ACD17E397C9FC156C741AD1104F403B363B4E6B4AD06E8C60928CCD6AB3FE6AEFECBC57DB5CFF431A2D44533D9A92C483B56AE56698F02622D3A65E09B6EBFDFD5DCAF34E09DEDA100B40DD4C40ADCEF30787E527C4F613A08BDED10EB1D8A3
-20241201190812 2 6 100 7679 5 F02D40B37C40876939E4D2A62AF7EC21A676D8E2B04081BA98E23F464A47514FB40DC99F7B8046B48CD3052C7AC080E4B496C16ED18695CA27493A129088F5829BBEAD02DFD521829FFD8B1120330E2BBA10C55A1EAD0641006827DA4725BFD2A2559C363C33BC78C2D83B4A075099EC57634D0AD4AEDA3302441B7005C728C0371B51877A97B442C5E3C3D53C244EFF3B65CDCCB0C017723F1EBD0B91E220116ACF14703268A11B7FC7564F7BEDBFFB3CE046261DD9D83E6078CD7AB5AC97595EF53D6C4C56D24588C6D130C0CD2C967AB90C31497186A06A93FB9338D4F30E0104BC8EFF2518D0644174BD1FF1FD7BAC2AAFF151D733A14F456A189ECA2D5F11D7C3AF1DA06192D36251B050E1AC576E3C369678D12823870FFC6E5809903382F9FBE36156F294C94FF5369E8D24D085A326870A998A10683495CEF15EFF0A45C781B5156B82D9AA07852040A96A0D5ACDF094B9DD91EA893382F95A6B72F0A2090F036A1B23CF9CF544753EA5B9ED86FA52EBB4C5421C5B485AE932F5837822C91257EC4953ACA79F2D94261DC40B3D44CB44056D4025EC459563865000B8C5F5D7724ED27CA4A8ADE299E5C898F4BD09F430781A68C261E4FA0BA2FEE567434B057C5D5F2899A1547B780B91315CC631C0552DB403DF53A6059BE895242FDA4AE1F6C5129E3643DF1A20C28BBF4328B4E623DCBC1149CE838BBC4A9944A6B6ACB4AA29B50FC7AFFAB0075BB4CC190F15B2C17847560F1B4C591EFE90D5AAA307A3FCC091DF44E3B219F7EE86EA01704D652983CE0D475896C1EB94E09314D386233D706FE0F5415BAF51746F3E8A6AC74E6F68CCF665CCEC4BE0B9CE19308C0423491F5914EA8ABE6081F38282D4994A4B640DCE56F4D616CED59B80938E4E7C486AB64E7C740FCD6ADB5494906520FD66A02069D3C11085157142CDDBFB004023C5CDFCCEAC5296636A77C127DEC4182A36D6A34D980F778452271C80CABAFE15A629302EFE9CD9105353B719581D4DD2E1BCF9411A4CCB0D010B5954291453E761A3B9EAF533119EEF1C30C4E53FEFAF2D2300162786963D54ECE0376CC797CBBDD757B596FAB26716ECEA7C47FB6C6DC6A80FC435D5CADB36D5ACB6760CAC6272B61E64A920EC7D4E5FBD680B2B906F1CF78EFD380A47692E1DC6C06AC21255E65C3757E32C301B5ACD8BA136FEE7C19B858D8B60595946BF1D0520912ACD17E397C9FC156C741AD1104F403B363B4E6B4AD06E8C60928CCD6AB3FE6AEFECBC57DB5CFF431A2D44533D9A92C483B56AE56698F02622D3A65E09B6EBFDFD5DCAF34E09DEDA100B40DD4C40ADCEF30787E527C4F613A08BDED11163FE8F
-20241201191642 2 6 100 7679 2 F02D40B37C40876939E4D2A62AF7EC21A676D8E2B04081BA98E23F464A47514FB40DC99F7B8046B48CD3052C7AC080E4B496C16ED18695CA27493A129088F5829BBEAD02DFD521829FFD8B1120330E2BBA10C55A1EAD0641006827DA4725BFD2A2559C363C33BC78C2D83B4A075099EC57634D0AD4AEDA3302441B7005C728C0371B51877A97B442C5E3C3D53C244EFF3B65CDCCB0C017723F1EBD0B91E220116ACF14703268A11B7FC7564F7BEDBFFB3CE046261DD9D83E6078CD7AB5AC97595EF53D6C4C56D24588C6D130C0CD2C967AB90C31497186A06A93FB9338D4F30E0104BC8EFF2518D0644174BD1FF1FD7BAC2AAFF151D733A14F456A189ECA2D5F11D7C3AF1DA06192D36251B050E1AC576E3C369678D12823870FFC6E5809903382F9FBE36156F294C94FF5369E8D24D085A326870A998A10683495CEF15EFF0A45C781B5156B82D9AA07852040A96A0D5ACDF094B9DD91EA893382F95A6B72F0A2090F036A1B23CF9CF544753EA5B9ED86FA52EBB4C5421C5B485AE932F5837822C91257EC4953ACA79F2D94261DC40B3D44CB44056D4025EC459563865000B8C5F5D7724ED27CA4A8ADE299E5C898F4BD09F430781A68C261E4FA0BA2FEE567434B057C5D5F2899A1547B780B91315CC631C0552DB403DF53A6059BE895242FDA4AE1F6C5129E3643DF1A20C28BBF4328B4E623DCBC1149CE838BBC4A9944A6B6ACB4AA29B50FC7AFFAB0075BB4CC190F15B2C17847560F1B4C591EFE90D5AAA307A3FCC091DF44E3B219F7EE86EA01704D652983CE0D475896C1EB94E09314D386233D706FE0F5415BAF51746F3E8A6AC74E6F68CCF665CCEC4BE0B9CE19308C0423491F5914EA8ABE6081F38282D4994A4B640DCE56F4D616CED59B80938E4E7C486AB64E7C740FCD6ADB5494906520FD66A02069D3C11085157142CDDBFB004023C5CDFCCEAC5296636A77C127DEC4182A36D6A34D980F778452271C80CABAFE15A629302EFE9CD9105353B719581D4DD2E1BCF9411A4CCB0D010B5954291453E761A3B9EAF533119EEF1C30C4E53FEFAF2D2300162786963D54ECE0376CC797CBBDD757B596FAB26716ECEA7C47FB6C6DC6A80FC435D5CADB36D5ACB6760CAC6272B61E64A920EC7D4E5FBD680B2B906F1CF78EFD380A47692E1DC6C06AC21255E65C3757E32C301B5ACD8BA136FEE7C19B858D8B60595946BF1D0520912ACD17E397C9FC156C741AD1104F403B363B4E6B4AD06E8C60928CCD6AB3FE6AEFECBC57DB5CFF431A2D44533D9A92C483B56AE56698F02622D3A65E09B6EBFDFD5DCAF34E09DEDA100B40DD4C40ADCEF30787E527C4F613A08BDED111F0947B
-20241201195706 2 6 100 7679 2 F02D40B37C40876939E4D2A62AF7EC21A676D8E2B04081BA98E23F464A47514FB40DC99F7B8046B48CD3052C7AC080E4B496C16ED18695CA27493A129088F5829BBEAD02DFD521829FFD8B1120330E2BBA10C55A1EAD0641006827DA4725BFD2A2559C363C33BC78C2D83B4A075099EC57634D0AD4AEDA3302441B7005C728C0371B51877A97B442C5E3C3D53C244EFF3B65CDCCB0C017723F1EBD0B91E220116ACF14703268A11B7FC7564F7BEDBFFB3CE046261DD9D83E6078CD7AB5AC97595EF53D6C4C56D24588C6D130C0CD2C967AB90C31497186A06A93FB9338D4F30E0104BC8EFF2518D0644174BD1FF1FD7BAC2AAFF151D733A14F456A189ECA2D5F11D7C3AF1DA06192D36251B050E1AC576E3C369678D12823870FFC6E5809903382F9FBE36156F294C94FF5369E8D24D085A326870A998A10683495CEF15EFF0A45C781B5156B82D9AA07852040A96A0D5ACDF094B9DD91EA893382F95A6B72F0A2090F036A1B23CF9CF544753EA5B9ED86FA52EBB4C5421C5B485AE932F5837822C91257EC4953ACA79F2D94261DC40B3D44CB44056D4025EC459563865000B8C5F5D7724ED27CA4A8ADE299E5C898F4BD09F430781A68C261E4FA0BA2FEE567434B057C5D5F2899A1547B780B91315CC631C0552DB403DF53A6059BE895242FDA4AE1F6C5129E3643DF1A20C28BBF4328B4E623DCBC1149CE838BBC4A9944A6B6ACB4AA29B50FC7AFFAB0075BB4CC190F15B2C17847560F1B4C591EFE90D5AAA307A3FCC091DF44E3B219F7EE86EA01704D652983CE0D475896C1EB94E09314D386233D706FE0F5415BAF51746F3E8A6AC74E6F68CCF665CCEC4BE0B9CE19308C0423491F5914EA8ABE6081F38282D4994A4B640DCE56F4D616CED59B80938E4E7C486AB64E7C740FCD6ADB5494906520FD66A02069D3C11085157142CDDBFB004023C5CDFCCEAC5296636A77C127DEC4182A36D6A34D980F778452271C80CABAFE15A629302EFE9CD9105353B719581D4DD2E1BCF9411A4CCB0D010B5954291453E761A3B9EAF533119EEF1C30C4E53FEFAF2D2300162786963D54ECE0376CC797CBBDD757B596FAB26716ECEA7C47FB6C6DC6A80FC435D5CADB36D5ACB6760CAC6272B61E64A920EC7D4E5FBD680B2B906F1CF78EFD380A47692E1DC6C06AC21255E65C3757E32C301B5ACD8BA136FEE7C19B858D8B60595946BF1D0520912ACD17E397C9FC156C741AD1104F403B363B4E6B4AD06E8C60928CCD6AB3FE6AEFECBC57DB5CFF431A2D44533D9A92C483B56AE56698F02622D3A65E09B6EBFDFD5DCAF34E09DEDA100B40DD4C40ADCEF30787E527C4F613A08BDED11498BEA3
-20241201200433 2 6 100 7679 5 F02D40B37C40876939E4D2A62AF7EC21A676D8E2B04081BA98E23F464A47514FB40DC99F7B8046B48CD3052C7AC080E4B496C16ED18695CA27493A129088F5829BBEAD02DFD521829FFD8B1120330E2BBA10C55A1EAD0641006827DA4725BFD2A2559C363C33BC78C2D83B4A075099EC57634D0AD4AEDA3302441B7005C728C0371B51877A97B442C5E3C3D53C244EFF3B65CDCCB0C017723F1EBD0B91E220116ACF14703268A11B7FC7564F7BEDBFFB3CE046261DD9D83E6078CD7AB5AC97595EF53D6C4C56D24588C6D130C0CD2C967AB90C31497186A06A93FB9338D4F30E0104BC8EFF2518D0644174BD1FF1FD7BAC2AAFF151D733A14F456A189ECA2D5F11D7C3AF1DA06192D36251B050E1AC576E3C369678D12823870FFC6E5809903382F9FBE36156F294C94FF5369E8D24D085A326870A998A10683495CEF15EFF0A45C781B5156B82D9AA07852040A96A0D5ACDF094B9DD91EA893382F95A6B72F0A2090F036A1B23CF9CF544753EA5B9ED86FA52EBB4C5421C5B485AE932F5837822C91257EC4953ACA79F2D94261DC40B3D44CB44056D4025EC459563865000B8C5F5D7724ED27CA4A8ADE299E5C898F4BD09F430781A68C261E4FA0BA2FEE567434B057C5D5F2899A1547B780B91315CC631C0552DB403DF53A6059BE895242FDA4AE1F6C5129E3643DF1A20C28BBF4328B4E623DCBC1149CE838BBC4A9944A6B6ACB4AA29B50FC7AFFAB0075BB4CC190F15B2C17847560F1B4C591EFE90D5AAA307A3FCC091DF44E3B219F7EE86EA01704D652983CE0D475896C1EB94E09314D386233D706FE0F5415BAF51746F3E8A6AC74E6F68CCF665CCEC4BE0B9CE19308C0423491F5914EA8ABE6081F38282D4994A4B640DCE56F4D616CED59B80938E4E7C486AB64E7C740FCD6ADB5494906520FD66A02069D3C11085157142CDDBFB004023C5CDFCCEAC5296636A77C127DEC4182A36D6A34D980F778452271C80CABAFE15A629302EFE9CD9105353B719581D4DD2E1BCF9411A4CCB0D010B5954291453E761A3B9EAF533119EEF1C30C4E53FEFAF2D2300162786963D54ECE0376CC797CBBDD757B596FAB26716ECEA7C47FB6C6DC6A80FC435D5CADB36D5ACB6760CAC6272B61E64A920EC7D4E5FBD680B2B906F1CF78EFD380A47692E1DC6C06AC21255E65C3757E32C301B5ACD8BA136FEE7C19B858D8B60595946BF1D0520912ACD17E397C9FC156C741AD1104F403B363B4E6B4AD06E8C60928CCD6AB3FE6AEFECBC57DB5CFF431A2D44533D9A92C483B56AE56698F02622D3A65E09B6EBFDFD5DCAF34E09DEDA100B40DD4C40ADCEF30787E527C4F613A08BDED115134B17
-20241201200527 2 6 100 7679 5 F02D40B37C40876939E4D2A62AF7EC21A676D8E2B04081BA98E23F464A47514FB40DC99F7B8046B48CD3052C7AC080E4B496C16ED18695CA27493A129088F5829BBEAD02DFD521829FFD8B1120330E2BBA10C55A1EAD0641006827DA4725BFD2A2559C363C33BC78C2D83B4A075099EC57634D0AD4AEDA3302441B7005C728C0371B51877A97B442C5E3C3D53C244EFF3B65CDCCB0C017723F1EBD0B91E220116ACF14703268A11B7FC7564F7BEDBFFB3CE046261DD9D83E6078CD7AB5AC97595EF53D6C4C56D24588C6D130C0CD2C967AB90C31497186A06A93FB9338D4F30E0104BC8EFF2518D0644174BD1FF1FD7BAC2AAFF151D733A14F456A189ECA2D5F11D7C3AF1DA06192D36251B050E1AC576E3C369678D12823870FFC6E5809903382F9FBE36156F294C94FF5369E8D24D085A326870A998A10683495CEF15EFF0A45C781B5156B82D9AA07852040A96A0D5ACDF094B9DD91EA893382F95A6B72F0A2090F036A1B23CF9CF544753EA5B9ED86FA52EBB4C5421C5B485AE932F5837822C91257EC4953ACA79F2D94261DC40B3D44CB44056D4025EC459563865000B8C5F5D7724ED27CA4A8ADE299E5C898F4BD09F430781A68C261E4FA0BA2FEE567434B057C5D5F2899A1547B780B91315CC631C0552DB403DF53A6059BE895242FDA4AE1F6C5129E3643DF1A20C28BBF4328B4E623DCBC1149CE838BBC4A9944A6B6ACB4AA29B50FC7AFFAB0075BB4CC190F15B2C17847560F1B4C591EFE90D5AAA307A3FCC091DF44E3B219F7EE86EA01704D652983CE0D475896C1EB94E09314D386233D706FE0F5415BAF51746F3E8A6AC74E6F68CCF665CCEC4BE0B9CE19308C0423491F5914EA8ABE6081F38282D4994A4B640DCE56F4D616CED59B80938E4E7C486AB64E7C740FCD6ADB5494906520FD66A02069D3C11085157142CDDBFB004023C5CDFCCEAC5296636A77C127DEC4182A36D6A34D980F778452271C80CABAFE15A629302EFE9CD9105353B719581D4DD2E1BCF9411A4CCB0D010B5954291453E761A3B9EAF533119EEF1C30C4E53FEFAF2D2300162786963D54ECE0376CC797CBBDD757B596FAB26716ECEA7C47FB6C6DC6A80FC435D5CADB36D5ACB6760CAC6272B61E64A920EC7D4E5FBD680B2B906F1CF78EFD380A47692E1DC6C06AC21255E65C3757E32C301B5ACD8BA136FEE7C19B858D8B60595946BF1D0520912ACD17E397C9FC156C741AD1104F403B363B4E6B4AD06E8C60928CCD6AB3FE6AEFECBC57DB5CFF431A2D44533D9A92C483B56AE56698F02622D3A65E09B6EBFDFD5DCAF34E09DEDA100B40DD4C40ADCEF30787E527C4F613A08BDED1151A85B7
-20241201205110 2 6 100 7679 5 F02D40B37C40876939E4D2A62AF7EC21A676D8E2B04081BA98E23F464A47514FB40DC99F7B8046B48CD3052C7AC080E4B496C16ED18695CA27493A129088F5829BBEAD02DFD521829FFD8B1120330E2BBA10C55A1EAD0641006827DA4725BFD2A2559C363C33BC78C2D83B4A075099EC57634D0AD4AEDA3302441B7005C728C0371B51877A97B442C5E3C3D53C244EFF3B65CDCCB0C017723F1EBD0B91E220116ACF14703268A11B7FC7564F7BEDBFFB3CE046261DD9D83E6078CD7AB5AC97595EF53D6C4C56D24588C6D130C0CD2C967AB90C31497186A06A93FB9338D4F30E0104BC8EFF2518D0644174BD1FF1FD7BAC2AAFF151D733A14F456A189ECA2D5F11D7C3AF1DA06192D36251B050E1AC576E3C369678D12823870FFC6E5809903382F9FBE36156F294C94FF5369E8D24D085A326870A998A10683495CEF15EFF0A45C781B5156B82D9AA07852040A96A0D5ACDF094B9DD91EA893382F95A6B72F0A2090F036A1B23CF9CF544753EA5B9ED86FA52EBB4C5421C5B485AE932F5837822C91257EC4953ACA79F2D94261DC40B3D44CB44056D4025EC459563865000B8C5F5D7724ED27CA4A8ADE299E5C898F4BD09F430781A68C261E4FA0BA2FEE567434B057C5D5F2899A1547B780B91315CC631C0552DB403DF53A6059BE895242FDA4AE1F6C5129E3643DF1A20C28BBF4328B4E623DCBC1149CE838BBC4A9944A6B6ACB4AA29B50FC7AFFAB0075BB4CC190F15B2C17847560F1B4C591EFE90D5AAA307A3FCC091DF44E3B219F7EE86EA01704D652983CE0D475896C1EB94E09314D386233D706FE0F5415BAF51746F3E8A6AC74E6F68CCF665CCEC4BE0B9CE19308C0423491F5914EA8ABE6081F38282D4994A4B640DCE56F4D616CED59B80938E4E7C486AB64E7C740FCD6ADB5494906520FD66A02069D3C11085157142CDDBFB004023C5CDFCCEAC5296636A77C127DEC4182A36D6A34D980F778452271C80CABAFE15A629302EFE9CD9105353B719581D4DD2E1BCF9411A4CCB0D010B5954291453E761A3B9EAF533119EEF1C30C4E53FEFAF2D2300162786963D54ECE0376CC797CBBDD757B596FAB26716ECEA7C47FB6C6DC6A80FC435D5CADB36D5ACB6760CAC6272B61E64A920EC7D4E5FBD680B2B906F1CF78EFD380A47692E1DC6C06AC21255E65C3757E32C301B5ACD8BA136FEE7C19B858D8B60595946BF1D0520912ACD17E397C9FC156C741AD1104F403B363B4E6B4AD06E8C60928CCD6AB3FE6AEFECBC57DB5CFF431A2D44533D9A92C483B56AE56698F02622D3A65E09B6EBFDFD5DCAF34E09DEDA100B40DD4C40ADCEF30787E527C4F613A08BDED1181F734F
-20241201205604 2 6 100 7679 5 F02D40B37C40876939E4D2A62AF7EC21A676D8E2B04081BA98E23F464A47514FB40DC99F7B8046B48CD3052C7AC080E4B496C16ED18695CA27493A129088F5829BBEAD02DFD521829FFD8B1120330E2BBA10C55A1EAD0641006827DA4725BFD2A2559C363C33BC78C2D83B4A075099EC57634D0AD4AEDA3302441B7005C728C0371B51877A97B442C5E3C3D53C244EFF3B65CDCCB0C017723F1EBD0B91E220116ACF14703268A11B7FC7564F7BEDBFFB3CE046261DD9D83E6078CD7AB5AC97595EF53D6C4C56D24588C6D130C0CD2C967AB90C31497186A06A93FB9338D4F30E0104BC8EFF2518D0644174BD1FF1FD7BAC2AAFF151D733A14F456A189ECA2D5F11D7C3AF1DA06192D36251B050E1AC576E3C369678D12823870FFC6E5809903382F9FBE36156F294C94FF5369E8D24D085A326870A998A10683495CEF15EFF0A45C781B5156B82D9AA07852040A96A0D5ACDF094B9DD91EA893382F95A6B72F0A2090F036A1B23CF9CF544753EA5B9ED86FA52EBB4C5421C5B485AE932F5837822C91257EC4953ACA79F2D94261DC40B3D44CB44056D4025EC459563865000B8C5F5D7724ED27CA4A8ADE299E5C898F4BD09F430781A68C261E4FA0BA2FEE567434B057C5D5F2899A1547B780B91315CC631C0552DB403DF53A6059BE895242FDA4AE1F6C5129E3643DF1A20C28BBF4328B4E623DCBC1149CE838BBC4A9944A6B6ACB4AA29B50FC7AFFAB0075BB4CC190F15B2C17847560F1B4C591EFE90D5AAA307A3FCC091DF44E3B219F7EE86EA01704D652983CE0D475896C1EB94E09314D386233D706FE0F5415BAF51746F3E8A6AC74E6F68CCF665CCEC4BE0B9CE19308C0423491F5914EA8ABE6081F38282D4994A4B640DCE56F4D616CED59B80938E4E7C486AB64E7C740FCD6ADB5494906520FD66A02069D3C11085157142CDDBFB004023C5CDFCCEAC5296636A77C127DEC4182A36D6A34D980F778452271C80CABAFE15A629302EFE9CD9105353B719581D4DD2E1BCF9411A4CCB0D010B5954291453E761A3B9EAF533119EEF1C30C4E53FEFAF2D2300162786963D54ECE0376CC797CBBDD757B596FAB26716ECEA7C47FB6C6DC6A80FC435D5CADB36D5ACB6760CAC6272B61E64A920EC7D4E5FBD680B2B906F1CF78EFD380A47692E1DC6C06AC21255E65C3757E32C301B5ACD8BA136FEE7C19B858D8B60595946BF1D0520912ACD17E397C9FC156C741AD1104F403B363B4E6B4AD06E8C60928CCD6AB3FE6AEFECBC57DB5CFF431A2D44533D9A92C483B56AE56698F02622D3A65E09B6EBFDFD5DCAF34E09DEDA100B40DD4C40ADCEF30787E527C4F613A08BDED1186965DF
-20241201232404 2 6 100 7679 5 F02D40B37C40876939E4D2A62AF7EC21A676D8E2B04081BA98E23F464A47514FB40DC99F7B8046B48CD3052C7AC080E4B496C16ED18695CA27493A129088F5829BBEAD02DFD521829FFD8B1120330E2BBA10C55A1EAD0641006827DA4725BFD2A2559C363C33BC78C2D83B4A075099EC57634D0AD4AEDA3302441B7005C728C0371B51877A97B442C5E3C3D53C244EFF3B65CDCCB0C017723F1EBD0B91E220116ACF14703268A11B7FC7564F7BEDBFFB3CE046261DD9D83E6078CD7AB5AC97595EF53D6C4C56D24588C6D130C0CD2C967AB90C31497186A06A93FB9338D4F30E0104BC8EFF2518D0644174BD1FF1FD7BAC2AAFF151D733A14F456A189ECA2D5F11D7C3AF1DA06192D36251B050E1AC576E3C369678D12823870FFC6E5809903382F9FBE36156F294C94FF5369E8D24D085A326870A998A10683495CEF15EFF0A45C781B5156B82D9AA07852040A96A0D5ACDF094B9DD91EA893382F95A6B72F0A2090F036A1B23CF9CF544753EA5B9ED86FA52EBB4C5421C5B485AE932F5837822C91257EC4953ACA79F2D94261DC40B3D44CB44056D4025EC459563865000B8C5F5D7724ED27CA4A8ADE299E5C898F4BD09F430781A68C261E4FA0BA2FEE567434B057C5D5F2899A1547B780B91315CC631C0552DB403DF53A6059BE895242FDA4AE1F6C5129E3643DF1A20C28BBF4328B4E623DCBC1149CE838BBC4A9944A6B6ACB4AA29B50FC7AFFAB0075BB4CC190F15B2C17847560F1B4C591EFE90D5AAA307A3FCC091DF44E3B219F7EE86EA01704D652983CE0D475896C1EB94E09314D386233D706FE0F5415BAF51746F3E8A6AC74E6F68CCF665CCEC4BE0B9CE19308C0423491F5914EA8ABE6081F38282D4994A4B640DCE56F4D616CED59B80938E4E7C486AB64E7C740FCD6ADB5494906520FD66A02069D3C11085157142CDDBFB004023C5CDFCCEAC5296636A77C127DEC4182A36D6A34D980F778452271C80CABAFE15A629302EFE9CD9105353B719581D4DD2E1BCF9411A4CCB0D010B5954291453E761A3B9EAF533119EEF1C30C4E53FEFAF2D2300162786963D54ECE0376CC797CBBDD757B596FAB26716ECEA7C47FB6C6DC6A80FC435D5CADB36D5ACB6760CAC6272B61E64A920EC7D4E5FBD680B2B906F1CF78EFD380A47692E1DC6C06AC21255E65C3757E32C301B5ACD8BA136FEE7C19B858D8B60595946BF1D0520912ACD17E397C9FC156C741AD1104F403B363B4E6B4AD06E8C60928CCD6AB3FE6AEFECBC57DB5CFF431A2D44533D9A92C483B56AE56698F02622D3A65E09B6EBFDFD5DCAF34E09DEDA100B40DD4C40ADCEF30787E527C4F613A08BDED1224C1B97
-20241202014307 2 6 100 7679 5 F02D40B37C40876939E4D2A62AF7EC21A676D8E2B04081BA98E23F464A47514FB40DC99F7B8046B48CD3052C7AC080E4B496C16ED18695CA27493A129088F5829BBEAD02DFD521829FFD8B1120330E2BBA10C55A1EAD0641006827DA4725BFD2A2559C363C33BC78C2D83B4A075099EC57634D0AD4AEDA3302441B7005C728C0371B51877A97B442C5E3C3D53C244EFF3B65CDCCB0C017723F1EBD0B91E220116ACF14703268A11B7FC7564F7BEDBFFB3CE046261DD9D83E6078CD7AB5AC97595EF53D6C4C56D24588C6D130C0CD2C967AB90C31497186A06A93FB9338D4F30E0104BC8EFF2518D0644174BD1FF1FD7BAC2AAFF151D733A14F456A189ECA2D5F11D7C3AF1DA06192D36251B050E1AC576E3C369678D12823870FFC6E5809903382F9FBE36156F294C94FF5369E8D24D085A326870A998A10683495CEF15EFF0A45C781B5156B82D9AA07852040A96A0D5ACDF094B9DD91EA893382F95A6B72F0A2090F036A1B23CF9CF544753EA5B9ED86FA52EBB4C5421C5B485AE932F5837822C91257EC4953ACA79F2D94261DC40B3D44CB44056D4025EC459563865000B8C5F5D7724ED27CA4A8ADE299E5C898F4BD09F430781A68C261E4FA0BA2FEE567434B057C5D5F2899A1547B780B91315CC631C0552DB403DF53A6059BE895242FDA4AE1F6C5129E3643DF1A20C28BBF4328B4E623DCBC1149CE838BBC4A9944A6B6ACB4AA29B50FC7AFFAB0075BB4CC190F15B2C17847560F1B4C591EFE90D5AAA307A3FCC091DF44E3B219F7EE86EA01704D652983CE0D475896C1EB94E09314D386233D706FE0F5415BAF51746F3E8A6AC74E6F68CCF665CCEC4BE0B9CE19308C0423491F5914EA8ABE6081F38282D4994A4B640DCE56F4D616CED59B80938E4E7C486AB64E7C740FCD6ADB5494906520FD66A02069D3C11085157142CDDBFB004023C5CDFCCEAC5296636A77C127DEC4182A36D6A34D980F778452271C80CABAFE15A629302EFE9CD9105353B719581D4DD2E1BCF9411A4CCB0D010B5954291453E761A3B9EAF533119EEF1C30C4E53FEFAF2D2300162786963D54ECE0376CC797CBBDD757B596FAB26716ECEA7C47FB6C6DC6A80FC435D5CADB36D5ACB6760CAC6272B61E64A920EC7D4E5FBD680B2B906F1CF78EFD380A47692E1DC6C06AC21255E65C3757E32C301B5ACD8BA136FEE7C19B858D8B60595946BF1D0520912ACD17E397C9FC156C741AD1104F403B363B4E6B4AD06E8C60928CCD6AB3FE6AEFECBC57DB5CFF431A2D44533D9A92C483B56AE56698F02622D3A65E09B6EBFDFD5DCAF34E09DEDA100B40DD4C40ADCEF30787E527C4F613A08BDED12B98711F
-20241202022245 2 6 100 7679 5 F02D40B37C40876939E4D2A62AF7EC21A676D8E2B04081BA98E23F464A47514FB40DC99F7B8046B48CD3052C7AC080E4B496C16ED18695CA27493A129088F5829BBEAD02DFD521829FFD8B1120330E2BBA10C55A1EAD0641006827DA4725BFD2A2559C363C33BC78C2D83B4A075099EC57634D0AD4AEDA3302441B7005C728C0371B51877A97B442C5E3C3D53C244EFF3B65CDCCB0C017723F1EBD0B91E220116ACF14703268A11B7FC7564F7BEDBFFB3CE046261DD9D83E6078CD7AB5AC97595EF53D6C4C56D24588C6D130C0CD2C967AB90C31497186A06A93FB9338D4F30E0104BC8EFF2518D0644174BD1FF1FD7BAC2AAFF151D733A14F456A189ECA2D5F11D7C3AF1DA06192D36251B050E1AC576E3C369678D12823870FFC6E5809903382F9FBE36156F294C94FF5369E8D24D085A326870A998A10683495CEF15EFF0A45C781B5156B82D9AA07852040A96A0D5ACDF094B9DD91EA893382F95A6B72F0A2090F036A1B23CF9CF544753EA5B9ED86FA52EBB4C5421C5B485AE932F5837822C91257EC4953ACA79F2D94261DC40B3D44CB44056D4025EC459563865000B8C5F5D7724ED27CA4A8ADE299E5C898F4BD09F430781A68C261E4FA0BA2FEE567434B057C5D5F2899A1547B780B91315CC631C0552DB403DF53A6059BE895242FDA4AE1F6C5129E3643DF1A20C28BBF4328B4E623DCBC1149CE838BBC4A9944A6B6ACB4AA29B50FC7AFFAB0075BB4CC190F15B2C17847560F1B4C591EFE90D5AAA307A3FCC091DF44E3B219F7EE86EA01704D652983CE0D475896C1EB94E09314D386233D706FE0F5415BAF51746F3E8A6AC74E6F68CCF665CCEC4BE0B9CE19308C0423491F5914EA8ABE6081F38282D4994A4B640DCE56F4D616CED59B80938E4E7C486AB64E7C740FCD6ADB5494906520FD66A02069D3C11085157142CDDBFB004023C5CDFCCEAC5296636A77C127DEC4182A36D6A34D980F778452271C80CABAFE15A629302EFE9CD9105353B719581D4DD2E1BCF9411A4CCB0D010B5954291453E761A3B9EAF533119EEF1C30C4E53FEFAF2D2300162786963D54ECE0376CC797CBBDD757B596FAB26716ECEA7C47FB6C6DC6A80FC435D5CADB36D5ACB6760CAC6272B61E64A920EC7D4E5FBD680B2B906F1CF78EFD380A47692E1DC6C06AC21255E65C3757E32C301B5ACD8BA136FEE7C19B858D8B60595946BF1D0520912ACD17E397C9FC156C741AD1104F403B363B4E6B4AD06E8C60928CCD6AB3FE6AEFECBC57DB5CFF431A2D44533D9A92C483B56AE56698F02622D3A65E09B6EBFDFD5DCAF34E09DEDA100B40DD4C40ADCEF30787E527C4F613A08BDED12E394097
-20241202032328 2 6 100 7679 2 F02D40B37C40876939E4D2A62AF7EC21A676D8E2B04081BA98E23F464A47514FB40DC99F7B8046B48CD3052C7AC080E4B496C16ED18695CA27493A129088F5829BBEAD02DFD521829FFD8B1120330E2BBA10C55A1EAD0641006827DA4725BFD2A2559C363C33BC78C2D83B4A075099EC57634D0AD4AEDA3302441B7005C728C0371B51877A97B442C5E3C3D53C244EFF3B65CDCCB0C017723F1EBD0B91E220116ACF14703268A11B7FC7564F7BEDBFFB3CE046261DD9D83E6078CD7AB5AC97595EF53D6C4C56D24588C6D130C0CD2C967AB90C31497186A06A93FB9338D4F30E0104BC8EFF2518D0644174BD1FF1FD7BAC2AAFF151D733A14F456A189ECA2D5F11D7C3AF1DA06192D36251B050E1AC576E3C369678D12823870FFC6E5809903382F9FBE36156F294C94FF5369E8D24D085A326870A998A10683495CEF15EFF0A45C781B5156B82D9AA07852040A96A0D5ACDF094B9DD91EA893382F95A6B72F0A2090F036A1B23CF9CF544753EA5B9ED86FA52EBB4C5421C5B485AE932F5837822C91257EC4953ACA79F2D94261DC40B3D44CB44056D4025EC459563865000B8C5F5D7724ED27CA4A8ADE299E5C898F4BD09F430781A68C261E4FA0BA2FEE567434B057C5D5F2899A1547B780B91315CC631C0552DB403DF53A6059BE895242FDA4AE1F6C5129E3643DF1A20C28BBF4328B4E623DCBC1149CE838BBC4A9944A6B6ACB4AA29B50FC7AFFAB0075BB4CC190F15B2C17847560F1B4C591EFE90D5AAA307A3FCC091DF44E3B219F7EE86EA01704D652983CE0D475896C1EB94E09314D386233D706FE0F5415BAF51746F3E8A6AC74E6F68CCF665CCEC4BE0B9CE19308C0423491F5914EA8ABE6081F38282D4994A4B640DCE56F4D616CED59B80938E4E7C486AB64E7C740FCD6ADB5494906520FD66A02069D3C11085157142CDDBFB004023C5CDFCCEAC5296636A77C127DEC4182A36D6A34D980F778452271C80CABAFE15A629302EFE9CD9105353B719581D4DD2E1BCF9411A4CCB0D010B5954291453E761A3B9EAF533119EEF1C30C4E53FEFAF2D2300162786963D54ECE0376CC797CBBDD757B596FAB26716ECEA7C47FB6C6DC6A80FC435D5CADB36D5ACB6760CAC6272B61E64A920EC7D4E5FBD680B2B906F1CF78EFD380A47692E1DC6C06AC21255E65C3757E32C301B5ACD8BA136FEE7C19B858D8B60595946BF1D0520912ACD17E397C9FC156C741AD1104F403B363B4E6B4AD06E8C60928CCD6AB3FE6AEFECBC57DB5CFF431A2D44533D9A92C483B56AE56698F02622D3A65E09B6EBFDFD5DCAF34E09DEDA100B40DD4C40ADCEF30787E527C4F613A08BDED1324BD55B
-20241202042741 2 6 100 7679 5 F02D40B37C40876939E4D2A62AF7EC21A676D8E2B04081BA98E23F464A47514FB40DC99F7B8046B48CD3052C7AC080E4B496C16ED18695CA27493A129088F5829BBEAD02DFD521829FFD8B1120330E2BBA10C55A1EAD0641006827DA4725BFD2A2559C363C33BC78C2D83B4A075099EC57634D0AD4AEDA3302441B7005C728C0371B51877A97B442C5E3C3D53C244EFF3B65CDCCB0C017723F1EBD0B91E220116ACF14703268A11B7FC7564F7BEDBFFB3CE046261DD9D83E6078CD7AB5AC97595EF53D6C4C56D24588C6D130C0CD2C967AB90C31497186A06A93FB9338D4F30E0104BC8EFF2518D0644174BD1FF1FD7BAC2AAFF151D733A14F456A189ECA2D5F11D7C3AF1DA06192D36251B050E1AC576E3C369678D12823870FFC6E5809903382F9FBE36156F294C94FF5369E8D24D085A326870A998A10683495CEF15EFF0A45C781B5156B82D9AA07852040A96A0D5ACDF094B9DD91EA893382F95A6B72F0A2090F036A1B23CF9CF544753EA5B9ED86FA52EBB4C5421C5B485AE932F5837822C91257EC4953ACA79F2D94261DC40B3D44CB44056D4025EC459563865000B8C5F5D7724ED27CA4A8ADE299E5C898F4BD09F430781A68C261E4FA0BA2FEE567434B057C5D5F2899A1547B780B91315CC631C0552DB403DF53A6059BE895242FDA4AE1F6C5129E3643DF1A20C28BBF4328B4E623DCBC1149CE838BBC4A9944A6B6ACB4AA29B50FC7AFFAB0075BB4CC190F15B2C17847560F1B4C591EFE90D5AAA307A3FCC091DF44E3B219F7EE86EA01704D652983CE0D475896C1EB94E09314D386233D706FE0F5415BAF51746F3E8A6AC74E6F68CCF665CCEC4BE0B9CE19308C0423491F5914EA8ABE6081F38282D4994A4B640DCE56F4D616CED59B80938E4E7C486AB64E7C740FCD6ADB5494906520FD66A02069D3C11085157142CDDBFB004023C5CDFCCEAC5296636A77C127DEC4182A36D6A34D980F778452271C80CABAFE15A629302EFE9CD9105353B719581D4DD2E1BCF9411A4CCB0D010B5954291453E761A3B9EAF533119EEF1C30C4E53FEFAF2D2300162786963D54ECE0376CC797CBBDD757B596FAB26716ECEA7C47FB6C6DC6A80FC435D5CADB36D5ACB6760CAC6272B61E64A920EC7D4E5FBD680B2B906F1CF78EFD380A47692E1DC6C06AC21255E65C3757E32C301B5ACD8BA136FEE7C19B858D8B60595946BF1D0520912ACD17E397C9FC156C741AD1104F403B363B4E6B4AD06E8C60928CCD6AB3FE6AEFECBC57DB5CFF431A2D44533D9A92C483B56AE56698F02622D3A65E09B6EBFDFD5DCAF34E09DEDA100B40DD4C40ADCEF30787E527C4F613A08BDED1368D4BB7
-20241202043950 2 6 100 7679 2 F02D40B37C40876939E4D2A62AF7EC21A676D8E2B04081BA98E23F464A47514FB40DC99F7B8046B48CD3052C7AC080E4B496C16ED18695CA27493A129088F5829BBEAD02DFD521829FFD8B1120330E2BBA10C55A1EAD0641006827DA4725BFD2A2559C363C33BC78C2D83B4A075099EC57634D0AD4AEDA3302441B7005C728C0371B51877A97B442C5E3C3D53C244EFF3B65CDCCB0C017723F1EBD0B91E220116ACF14703268A11B7FC7564F7BEDBFFB3CE046261DD9D83E6078CD7AB5AC97595EF53D6C4C56D24588C6D130C0CD2C967AB90C31497186A06A93FB9338D4F30E0104BC8EFF2518D0644174BD1FF1FD7BAC2AAFF151D733A14F456A189ECA2D5F11D7C3AF1DA06192D36251B050E1AC576E3C369678D12823870FFC6E5809903382F9FBE36156F294C94FF5369E8D24D085A326870A998A10683495CEF15EFF0A45C781B5156B82D9AA07852040A96A0D5ACDF094B9DD91EA893382F95A6B72F0A2090F036A1B23CF9CF544753EA5B9ED86FA52EBB4C5421C5B485AE932F5837822C91257EC4953ACA79F2D94261DC40B3D44CB44056D4025EC459563865000B8C5F5D7724ED27CA4A8ADE299E5C898F4BD09F430781A68C261E4FA0BA2FEE567434B057C5D5F2899A1547B780B91315CC631C0552DB403DF53A6059BE895242FDA4AE1F6C5129E3643DF1A20C28BBF4328B4E623DCBC1149CE838BBC4A9944A6B6ACB4AA29B50FC7AFFAB0075BB4CC190F15B2C17847560F1B4C591EFE90D5AAA307A3FCC091DF44E3B219F7EE86EA01704D652983CE0D475896C1EB94E09314D386233D706FE0F5415BAF51746F3E8A6AC74E6F68CCF665CCEC4BE0B9CE19308C0423491F5914EA8ABE6081F38282D4994A4B640DCE56F4D616CED59B80938E4E7C486AB64E7C740FCD6ADB5494906520FD66A02069D3C11085157142CDDBFB004023C5CDFCCEAC5296636A77C127DEC4182A36D6A34D980F778452271C80CABAFE15A629302EFE9CD9105353B719581D4DD2E1BCF9411A4CCB0D010B5954291453E761A3B9EAF533119EEF1C30C4E53FEFAF2D2300162786963D54ECE0376CC797CBBDD757B596FAB26716ECEA7C47FB6C6DC6A80FC435D5CADB36D5ACB6760CAC6272B61E64A920EC7D4E5FBD680B2B906F1CF78EFD380A47692E1DC6C06AC21255E65C3757E32C301B5ACD8BA136FEE7C19B858D8B60595946BF1D0520912ACD17E397C9FC156C741AD1104F403B363B4E6B4AD06E8C60928CCD6AB3FE6AEFECBC57DB5CFF431A2D44533D9A92C483B56AE56698F02622D3A65E09B6EBFDFD5DCAF34E09DEDA100B40DD4C40ADCEF30787E527C4F613A08BDED1375589FB
-20241202051314 2 6 100 7679 2 F02D40B37C40876939E4D2A62AF7EC21A676D8E2B04081BA98E23F464A47514FB40DC99F7B8046B48CD3052C7AC080E4B496C16ED18695CA27493A129088F5829BBEAD02DFD521829FFD8B1120330E2BBA10C55A1EAD0641006827DA4725BFD2A2559C363C33BC78C2D83B4A075099EC57634D0AD4AEDA3302441B7005C728C0371B51877A97B442C5E3C3D53C244EFF3B65CDCCB0C017723F1EBD0B91E220116ACF14703268A11B7FC7564F7BEDBFFB3CE046261DD9D83E6078CD7AB5AC97595EF53D6C4C56D24588C6D130C0CD2C967AB90C31497186A06A93FB9338D4F30E0104BC8EFF2518D0644174BD1FF1FD7BAC2AAFF151D733A14F456A189ECA2D5F11D7C3AF1DA06192D36251B050E1AC576E3C369678D12823870FFC6E5809903382F9FBE36156F294C94FF5369E8D24D085A326870A998A10683495CEF15EFF0A45C781B5156B82D9AA07852040A96A0D5ACDF094B9DD91EA893382F95A6B72F0A2090F036A1B23CF9CF544753EA5B9ED86FA52EBB4C5421C5B485AE932F5837822C91257EC4953ACA79F2D94261DC40B3D44CB44056D4025EC459563865000B8C5F5D7724ED27CA4A8ADE299E5C898F4BD09F430781A68C261E4FA0BA2FEE567434B057C5D5F2899A1547B780B91315CC631C0552DB403DF53A6059BE895242FDA4AE1F6C5129E3643DF1A20C28BBF4328B4E623DCBC1149CE838BBC4A9944A6B6ACB4AA29B50FC7AFFAB0075BB4CC190F15B2C17847560F1B4C591EFE90D5AAA307A3FCC091DF44E3B219F7EE86EA01704D652983CE0D475896C1EB94E09314D386233D706FE0F5415BAF51746F3E8A6AC74E6F68CCF665CCEC4BE0B9CE19308C0423491F5914EA8ABE6081F38282D4994A4B640DCE56F4D616CED59B80938E4E7C486AB64E7C740FCD6ADB5494906520FD66A02069D3C11085157142CDDBFB004023C5CDFCCEAC5296636A77C127DEC4182A36D6A34D980F778452271C80CABAFE15A629302EFE9CD9105353B719581D4DD2E1BCF9411A4CCB0D010B5954291453E761A3B9EAF533119EEF1C30C4E53FEFAF2D2300162786963D54ECE0376CC797CBBDD757B596FAB26716ECEA7C47FB6C6DC6A80FC435D5CADB36D5ACB6760CAC6272B61E64A920EC7D4E5FBD680B2B906F1CF78EFD380A47692E1DC6C06AC21255E65C3757E32C301B5ACD8BA136FEE7C19B858D8B60595946BF1D0520912ACD17E397C9FC156C741AD1104F403B363B4E6B4AD06E8C60928CCD6AB3FE6AEFECBC57DB5CFF431A2D44533D9A92C483B56AE56698F02622D3A65E09B6EBFDFD5DCAF34E09DEDA100B40DD4C40ADCEF30787E527C4F613A08BDED1398AB80B
-20241202054231 2 6 100 7679 2 F02D40B37C40876939E4D2A62AF7EC21A676D8E2B04081BA98E23F464A47514FB40DC99F7B8046B48CD3052C7AC080E4B496C16ED18695CA27493A129088F5829BBEAD02DFD521829FFD8B1120330E2BBA10C55A1EAD0641006827DA4725BFD2A2559C363C33BC78C2D83B4A075099EC57634D0AD4AEDA3302441B7005C728C0371B51877A97B442C5E3C3D53C244EFF3B65CDCCB0C017723F1EBD0B91E220116ACF14703268A11B7FC7564F7BEDBFFB3CE046261DD9D83E6078CD7AB5AC97595EF53D6C4C56D24588C6D130C0CD2C967AB90C31497186A06A93FB9338D4F30E0104BC8EFF2518D0644174BD1FF1FD7BAC2AAFF151D733A14F456A189ECA2D5F11D7C3AF1DA06192D36251B050E1AC576E3C369678D12823870FFC6E5809903382F9FBE36156F294C94FF5369E8D24D085A326870A998A10683495CEF15EFF0A45C781B5156B82D9AA07852040A96A0D5ACDF094B9DD91EA893382F95A6B72F0A2090F036A1B23CF9CF544753EA5B9ED86FA52EBB4C5421C5B485AE932F5837822C91257EC4953ACA79F2D94261DC40B3D44CB44056D4025EC459563865000B8C5F5D7724ED27CA4A8ADE299E5C898F4BD09F430781A68C261E4FA0BA2FEE567434B057C5D5F2899A1547B780B91315CC631C0552DB403DF53A6059BE895242FDA4AE1F6C5129E3643DF1A20C28BBF4328B4E623DCBC1149CE838BBC4A9944A6B6ACB4AA29B50FC7AFFAB0075BB4CC190F15B2C17847560F1B4C591EFE90D5AAA307A3FCC091DF44E3B219F7EE86EA01704D652983CE0D475896C1EB94E09314D386233D706FE0F5415BAF51746F3E8A6AC74E6F68CCF665CCEC4BE0B9CE19308C0423491F5914EA8ABE6081F38282D4994A4B640DCE56F4D616CED59B80938E4E7C486AB64E7C740FCD6ADB5494906520FD66A02069D3C11085157142CDDBFB004023C5CDFCCEAC5296636A77C127DEC4182A36D6A34D980F778452271C80CABAFE15A629302EFE9CD9105353B719581D4DD2E1BCF9411A4CCB0D010B5954291453E761A3B9EAF533119EEF1C30C4E53FEFAF2D2300162786963D54ECE0376CC797CBBDD757B596FAB26716ECEA7C47FB6C6DC6A80FC435D5CADB36D5ACB6760CAC6272B61E64A920EC7D4E5FBD680B2B906F1CF78EFD380A47692E1DC6C06AC21255E65C3757E32C301B5ACD8BA136FEE7C19B858D8B60595946BF1D0520912ACD17E397C9FC156C741AD1104F403B363B4E6B4AD06E8C60928CCD6AB3FE6AEFECBC57DB5CFF431A2D44533D9A92C483B56AE56698F02622D3A65E09B6EBFDFD5DCAF34E09DEDA100B40DD4C40ADCEF30787E527C4F613A08BDED13B77C653
-20241202054750 2 6 100 7679 5 F02D40B37C40876939E4D2A62AF7EC21A676D8E2B04081BA98E23F464A47514FB40DC99F7B8046B48CD3052C7AC080E4B496C16ED18695CA27493A129088F5829BBEAD02DFD521829FFD8B1120330E2BBA10C55A1EAD0641006827DA4725BFD2A2559C363C33BC78C2D83B4A075099EC57634D0AD4AEDA3302441B7005C728C0371B51877A97B442C5E3C3D53C244EFF3B65CDCCB0C017723F1EBD0B91E220116ACF14703268A11B7FC7564F7BEDBFFB3CE046261DD9D83E6078CD7AB5AC97595EF53D6C4C56D24588C6D130C0CD2C967AB90C31497186A06A93FB9338D4F30E0104BC8EFF2518D0644174BD1FF1FD7BAC2AAFF151D733A14F456A189ECA2D5F11D7C3AF1DA06192D36251B050E1AC576E3C369678D12823870FFC6E5809903382F9FBE36156F294C94FF5369E8D24D085A326870A998A10683495CEF15EFF0A45C781B5156B82D9AA07852040A96A0D5ACDF094B9DD91EA893382F95A6B72F0A2090F036A1B23CF9CF544753EA5B9ED86FA52EBB4C5421C5B485AE932F5837822C91257EC4953ACA79F2D94261DC40B3D44CB44056D4025EC459563865000B8C5F5D7724ED27CA4A8ADE299E5C898F4BD09F430781A68C261E4FA0BA2FEE567434B057C5D5F2899A1547B780B91315CC631C0552DB403DF53A6059BE895242FDA4AE1F6C5129E3643DF1A20C28BBF4328B4E623DCBC1149CE838BBC4A9944A6B6ACB4AA29B50FC7AFFAB0075BB4CC190F15B2C17847560F1B4C591EFE90D5AAA307A3FCC091DF44E3B219F7EE86EA01704D652983CE0D475896C1EB94E09314D386233D706FE0F5415BAF51746F3E8A6AC74E6F68CCF665CCEC4BE0B9CE19308C0423491F5914EA8ABE6081F38282D4994A4B640DCE56F4D616CED59B80938E4E7C486AB64E7C740FCD6ADB5494906520FD66A02069D3C11085157142CDDBFB004023C5CDFCCEAC5296636A77C127DEC4182A36D6A34D980F778452271C80CABAFE15A629302EFE9CD9105353B719581D4DD2E1BCF9411A4CCB0D010B5954291453E761A3B9EAF533119EEF1C30C4E53FEFAF2D2300162786963D54ECE0376CC797CBBDD757B596FAB26716ECEA7C47FB6C6DC6A80FC435D5CADB36D5ACB6760CAC6272B61E64A920EC7D4E5FBD680B2B906F1CF78EFD380A47692E1DC6C06AC21255E65C3757E32C301B5ACD8BA136FEE7C19B858D8B60595946BF1D0520912ACD17E397C9FC156C741AD1104F403B363B4E6B4AD06E8C60928CCD6AB3FE6AEFECBC57DB5CFF431A2D44533D9A92C483B56AE56698F02622D3A65E09B6EBFDFD5DCAF34E09DEDA100B40DD4C40ADCEF30787E527C4F613A08BDED13BCC7297
-20241202061721 2 6 100 7679 2 F02D40B37C40876939E4D2A62AF7EC21A676D8E2B04081BA98E23F464A47514FB40DC99F7B8046B48CD3052C7AC080E4B496C16ED18695CA27493A129088F5829BBEAD02DFD521829FFD8B1120330E2BBA10C55A1EAD0641006827DA4725BFD2A2559C363C33BC78C2D83B4A075099EC57634D0AD4AEDA3302441B7005C728C0371B51877A97B442C5E3C3D53C244EFF3B65CDCCB0C017723F1EBD0B91E220116ACF14703268A11B7FC7564F7BEDBFFB3CE046261DD9D83E6078CD7AB5AC97595EF53D6C4C56D24588C6D130C0CD2C967AB90C31497186A06A93FB9338D4F30E0104BC8EFF2518D0644174BD1FF1FD7BAC2AAFF151D733A14F456A189ECA2D5F11D7C3AF1DA06192D36251B050E1AC576E3C369678D12823870FFC6E5809903382F9FBE36156F294C94FF5369E8D24D085A326870A998A10683495CEF15EFF0A45C781B5156B82D9AA07852040A96A0D5ACDF094B9DD91EA893382F95A6B72F0A2090F036A1B23CF9CF544753EA5B9ED86FA52EBB4C5421C5B485AE932F5837822C91257EC4953ACA79F2D94261DC40B3D44CB44056D4025EC459563865000B8C5F5D7724ED27CA4A8ADE299E5C898F4BD09F430781A68C261E4FA0BA2FEE567434B057C5D5F2899A1547B780B91315CC631C0552DB403DF53A6059BE895242FDA4AE1F6C5129E3643DF1A20C28BBF4328B4E623DCBC1149CE838BBC4A9944A6B6ACB4AA29B50FC7AFFAB0075BB4CC190F15B2C17847560F1B4C591EFE90D5AAA307A3FCC091DF44E3B219F7EE86EA01704D652983CE0D475896C1EB94E09314D386233D706FE0F5415BAF51746F3E8A6AC74E6F68CCF665CCEC4BE0B9CE19308C0423491F5914EA8ABE6081F38282D4994A4B640DCE56F4D616CED59B80938E4E7C486AB64E7C740FCD6ADB5494906520FD66A02069D3C11085157142CDDBFB004023C5CDFCCEAC5296636A77C127DEC4182A36D6A34D980F778452271C80CABAFE15A629302EFE9CD9105353B719581D4DD2E1BCF9411A4CCB0D010B5954291453E761A3B9EAF533119EEF1C30C4E53FEFAF2D2300162786963D54ECE0376CC797CBBDD757B596FAB26716ECEA7C47FB6C6DC6A80FC435D5CADB36D5ACB6760CAC6272B61E64A920EC7D4E5FBD680B2B906F1CF78EFD380A47692E1DC6C06AC21255E65C3757E32C301B5ACD8BA136FEE7C19B858D8B60595946BF1D0520912ACD17E397C9FC156C741AD1104F403B363B4E6B4AD06E8C60928CCD6AB3FE6AEFECBC57DB5CFF431A2D44533D9A92C483B56AE56698F02622D3A65E09B6EBFDFD5DCAF34E09DEDA100B40DD4C40ADCEF30787E527C4F613A08BDED13DC0C9B3
-20241202074137 2 6 100 7679 2 F02D40B37C40876939E4D2A62AF7EC21A676D8E2B04081BA98E23F464A47514FB40DC99F7B8046B48CD3052C7AC080E4B496C16ED18695CA27493A129088F5829BBEAD02DFD521829FFD8B1120330E2BBA10C55A1EAD0641006827DA4725BFD2A2559C363C33BC78C2D83B4A075099EC57634D0AD4AEDA3302441B7005C728C0371B51877A97B442C5E3C3D53C244EFF3B65CDCCB0C017723F1EBD0B91E220116ACF14703268A11B7FC7564F7BEDBFFB3CE046261DD9D83E6078CD7AB5AC97595EF53D6C4C56D24588C6D130C0CD2C967AB90C31497186A06A93FB9338D4F30E0104BC8EFF2518D0644174BD1FF1FD7BAC2AAFF151D733A14F456A189ECA2D5F11D7C3AF1DA06192D36251B050E1AC576E3C369678D12823870FFC6E5809903382F9FBE36156F294C94FF5369E8D24D085A326870A998A10683495CEF15EFF0A45C781B5156B82D9AA07852040A96A0D5ACDF094B9DD91EA893382F95A6B72F0A2090F036A1B23CF9CF544753EA5B9ED86FA52EBB4C5421C5B485AE932F5837822C91257EC4953ACA79F2D94261DC40B3D44CB44056D4025EC459563865000B8C5F5D7724ED27CA4A8ADE299E5C898F4BD09F430781A68C261E4FA0BA2FEE567434B057C5D5F2899A1547B780B91315CC631C0552DB403DF53A6059BE895242FDA4AE1F6C5129E3643DF1A20C28BBF4328B4E623DCBC1149CE838BBC4A9944A6B6ACB4AA29B50FC7AFFAB0075BB4CC190F15B2C17847560F1B4C591EFE90D5AAA307A3FCC091DF44E3B219F7EE86EA01704D652983CE0D475896C1EB94E09314D386233D706FE0F5415BAF51746F3E8A6AC74E6F68CCF665CCEC4BE0B9CE19308C0423491F5914EA8ABE6081F38282D4994A4B640DCE56F4D616CED59B80938E4E7C486AB64E7C740FCD6ADB5494906520FD66A02069D3C11085157142CDDBFB004023C5CDFCCEAC5296636A77C127DEC4182A36D6A34D980F778452271C80CABAFE15A629302EFE9CD9105353B719581D4DD2E1BCF9411A4CCB0D010B5954291453E761A3B9EAF533119EEF1C30C4E53FEFAF2D2300162786963D54ECE0376CC797CBBDD757B596FAB26716ECEA7C47FB6C6DC6A80FC435D5CADB36D5ACB6760CAC6272B61E64A920EC7D4E5FBD680B2B906F1CF78EFD380A47692E1DC6C06AC21255E65C3757E32C301B5ACD8BA136FEE7C19B858D8B60595946BF1D0520912ACD17E397C9FC156C741AD1104F403B363B4E6B4AD06E8C60928CCD6AB3FE6AEFECBC57DB5CFF431A2D44533D9A92C483B56AE56698F02622D3A65E09B6EBFDFD5DCAF34E09DEDA100B40DD4C40ADCEF30787E527C4F613A08BDED1435661B3
-20241202074315 2 6 100 7679 2 F02D40B37C40876939E4D2A62AF7EC21A676D8E2B04081BA98E23F464A47514FB40DC99F7B8046B48CD3052C7AC080E4B496C16ED18695CA27493A129088F5829BBEAD02DFD521829FFD8B1120330E2BBA10C55A1EAD0641006827DA4725BFD2A2559C363C33BC78C2D83B4A075099EC57634D0AD4AEDA3302441B7005C728C0371B51877A97B442C5E3C3D53C244EFF3B65CDCCB0C017723F1EBD0B91E220116ACF14703268A11B7FC7564F7BEDBFFB3CE046261DD9D83E6078CD7AB5AC97595EF53D6C4C56D24588C6D130C0CD2C967AB90C31497186A06A93FB9338D4F30E0104BC8EFF2518D0644174BD1FF1FD7BAC2AAFF151D733A14F456A189ECA2D5F11D7C3AF1DA06192D36251B050E1AC576E3C369678D12823870FFC6E5809903382F9FBE36156F294C94FF5369E8D24D085A326870A998A10683495CEF15EFF0A45C781B5156B82D9AA07852040A96A0D5ACDF094B9DD91EA893382F95A6B72F0A2090F036A1B23CF9CF544753EA5B9ED86FA52EBB4C5421C5B485AE932F5837822C91257EC4953ACA79F2D94261DC40B3D44CB44056D4025EC459563865000B8C5F5D7724ED27CA4A8ADE299E5C898F4BD09F430781A68C261E4FA0BA2FEE567434B057C5D5F2899A1547B780B91315CC631C0552DB403DF53A6059BE895242FDA4AE1F6C5129E3643DF1A20C28BBF4328B4E623DCBC1149CE838BBC4A9944A6B6ACB4AA29B50FC7AFFAB0075BB4CC190F15B2C17847560F1B4C591EFE90D5AAA307A3FCC091DF44E3B219F7EE86EA01704D652983CE0D475896C1EB94E09314D386233D706FE0F5415BAF51746F3E8A6AC74E6F68CCF665CCEC4BE0B9CE19308C0423491F5914EA8ABE6081F38282D4994A4B640DCE56F4D616CED59B80938E4E7C486AB64E7C740FCD6ADB5494906520FD66A02069D3C11085157142CDDBFB004023C5CDFCCEAC5296636A77C127DEC4182A36D6A34D980F778452271C80CABAFE15A629302EFE9CD9105353B719581D4DD2E1BCF9411A4CCB0D010B5954291453E761A3B9EAF533119EEF1C30C4E53FEFAF2D2300162786963D54ECE0376CC797CBBDD757B596FAB26716ECEA7C47FB6C6DC6A80FC435D5CADB36D5ACB6760CAC6272B61E64A920EC7D4E5FBD680B2B906F1CF78EFD380A47692E1DC6C06AC21255E65C3757E32C301B5ACD8BA136FEE7C19B858D8B60595946BF1D0520912ACD17E397C9FC156C741AD1104F403B363B4E6B4AD06E8C60928CCD6AB3FE6AEFECBC57DB5CFF431A2D44533D9A92C483B56AE56698F02622D3A65E09B6EBFDFD5DCAF34E09DEDA100B40DD4C40ADCEF30787E527C4F613A08BDED14369BF1B
-20241202081741 2 6 100 7679 2 F02D40B37C40876939E4D2A62AF7EC21A676D8E2B04081BA98E23F464A47514FB40DC99F7B8046B48CD3052C7AC080E4B496C16ED18695CA27493A129088F5829BBEAD02DFD521829FFD8B1120330E2BBA10C55A1EAD0641006827DA4725BFD2A2559C363C33BC78C2D83B4A075099EC57634D0AD4AEDA3302441B7005C728C0371B51877A97B442C5E3C3D53C244EFF3B65CDCCB0C017723F1EBD0B91E220116ACF14703268A11B7FC7564F7BEDBFFB3CE046261DD9D83E6078CD7AB5AC97595EF53D6C4C56D24588C6D130C0CD2C967AB90C31497186A06A93FB9338D4F30E0104BC8EFF2518D0644174BD1FF1FD7BAC2AAFF151D733A14F456A189ECA2D5F11D7C3AF1DA06192D36251B050E1AC576E3C369678D12823870FFC6E5809903382F9FBE36156F294C94FF5369E8D24D085A326870A998A10683495CEF15EFF0A45C781B5156B82D9AA07852040A96A0D5ACDF094B9DD91EA893382F95A6B72F0A2090F036A1B23CF9CF544753EA5B9ED86FA52EBB4C5421C5B485AE932F5837822C91257EC4953ACA79F2D94261DC40B3D44CB44056D4025EC459563865000B8C5F5D7724ED27CA4A8ADE299E5C898F4BD09F430781A68C261E4FA0BA2FEE567434B057C5D5F2899A1547B780B91315CC631C0552DB403DF53A6059BE895242FDA4AE1F6C5129E3643DF1A20C28BBF4328B4E623DCBC1149CE838BBC4A9944A6B6ACB4AA29B50FC7AFFAB0075BB4CC190F15B2C17847560F1B4C591EFE90D5AAA307A3FCC091DF44E3B219F7EE86EA01704D652983CE0D475896C1EB94E09314D386233D706FE0F5415BAF51746F3E8A6AC74E6F68CCF665CCEC4BE0B9CE19308C0423491F5914EA8ABE6081F38282D4994A4B640DCE56F4D616CED59B80938E4E7C486AB64E7C740FCD6ADB5494906520FD66A02069D3C11085157142CDDBFB004023C5CDFCCEAC5296636A77C127DEC4182A36D6A34D980F778452271C80CABAFE15A629302EFE9CD9105353B719581D4DD2E1BCF9411A4CCB0D010B5954291453E761A3B9EAF533119EEF1C30C4E53FEFAF2D2300162786963D54ECE0376CC797CBBDD757B596FAB26716ECEA7C47FB6C6DC6A80FC435D5CADB36D5ACB6760CAC6272B61E64A920EC7D4E5FBD680B2B906F1CF78EFD380A47692E1DC6C06AC21255E65C3757E32C301B5ACD8BA136FEE7C19B858D8B60595946BF1D0520912ACD17E397C9FC156C741AD1104F403B363B4E6B4AD06E8C60928CCD6AB3FE6AEFECBC57DB5CFF431A2D44533D9A92C483B56AE56698F02622D3A65E09B6EBFDFD5DCAF34E09DEDA100B40DD4C40ADCEF30787E527C4F613A08BDED145AABB1B
-20241202082834 2 6 100 7679 2 F02D40B37C40876939E4D2A62AF7EC21A676D8E2B04081BA98E23F464A47514FB40DC99F7B8046B48CD3052C7AC080E4B496C16ED18695CA27493A129088F5829BBEAD02DFD521829FFD8B1120330E2BBA10C55A1EAD0641006827DA4725BFD2A2559C363C33BC78C2D83B4A075099EC57634D0AD4AEDA3302441B7005C728C0371B51877A97B442C5E3C3D53C244EFF3B65CDCCB0C017723F1EBD0B91E220116ACF14703268A11B7FC7564F7BEDBFFB3CE046261DD9D83E6078CD7AB5AC97595EF53D6C4C56D24588C6D130C0CD2C967AB90C31497186A06A93FB9338D4F30E0104BC8EFF2518D0644174BD1FF1FD7BAC2AAFF151D733A14F456A189ECA2D5F11D7C3AF1DA06192D36251B050E1AC576E3C369678D12823870FFC6E5809903382F9FBE36156F294C94FF5369E8D24D085A326870A998A10683495CEF15EFF0A45C781B5156B82D9AA07852040A96A0D5ACDF094B9DD91EA893382F95A6B72F0A2090F036A1B23CF9CF544753EA5B9ED86FA52EBB4C5421C5B485AE932F5837822C91257EC4953ACA79F2D94261DC40B3D44CB44056D4025EC459563865000B8C5F5D7724ED27CA4A8ADE299E5C898F4BD09F430781A68C261E4FA0BA2FEE567434B057C5D5F2899A1547B780B91315CC631C0552DB403DF53A6059BE895242FDA4AE1F6C5129E3643DF1A20C28BBF4328B4E623DCBC1149CE838BBC4A9944A6B6ACB4AA29B50FC7AFFAB0075BB4CC190F15B2C17847560F1B4C591EFE90D5AAA307A3FCC091DF44E3B219F7EE86EA01704D652983CE0D475896C1EB94E09314D386233D706FE0F5415BAF51746F3E8A6AC74E6F68CCF665CCEC4BE0B9CE19308C0423491F5914EA8ABE6081F38282D4994A4B640DCE56F4D616CED59B80938E4E7C486AB64E7C740FCD6ADB5494906520FD66A02069D3C11085157142CDDBFB004023C5CDFCCEAC5296636A77C127DEC4182A36D6A34D980F778452271C80CABAFE15A629302EFE9CD9105353B719581D4DD2E1BCF9411A4CCB0D010B5954291453E761A3B9EAF533119EEF1C30C4E53FEFAF2D2300162786963D54ECE0376CC797CBBDD757B596FAB26716ECEA7C47FB6C6DC6A80FC435D5CADB36D5ACB6760CAC6272B61E64A920EC7D4E5FBD680B2B906F1CF78EFD380A47692E1DC6C06AC21255E65C3757E32C301B5ACD8BA136FEE7C19B858D8B60595946BF1D0520912ACD17E397C9FC156C741AD1104F403B363B4E6B4AD06E8C60928CCD6AB3FE6AEFECBC57DB5CFF431A2D44533D9A92C483B56AE56698F02622D3A65E09B6EBFDFD5DCAF34E09DEDA100B40DD4C40ADCEF30787E527C4F613A08BDED1465C7B4B
-20241202090408 2 6 100 8191 2 C3301F39F3E2DCD097FBF5454401BF52BF4745AFD35F3DEBDFB34DE2518B0F7BB10DE2FDBE6C35E1B63AA67E9FC179EB3DB8A0FA7E01618BB625B3EC326A001A253FB737B2461999BAB5A5FBCA4AFAD88A8BCBEB5990D4E25225F203B2CE75A3A1C23BFFD78E697275BDB6B6153AA3C21D2063047D44EDDF0483220CD672280D4D67C4726EA476A5C094B7E8DBE62B760EBA6B62C200D456A99E87875B4B2FFF4AA87661D89CAF8CA36D9CE00E0C3BDA443B7CCC3EA892F524AD10DD6960196EC4497E1DDC9F5C13BAED9A8F240196633AB9EC597D0A2FFEEE9320147E73FB295039605EA79376C00D1C60EB421D1BF2BD36A9B68A32E5F5003F0C984E1A57B3C8A261E451D912FCBF27924078BAB0879F85B78D097B2651A17AD9266B39E7AF73DAE54319B2902E0A0D11653B38EDA14B9DE8431E9382AC7EF5F1705C05239DDEA7F533234FA640D2E1EE392D23BF46D57D6FD0E167174E6242F5455DC299BB03BF2EBAEDB14539E9025B84BF66C185AD45C6B1FBF47E3C17D4A1F2C99DCA7151039D71DB7BD2E025E67C2ABB9A2DE6D9C5150651385B270511AA50E8728707B1E0920F3A83DEC0F733090CE96DCACDB93CD756AB1F572DA2BBF4908C17E905848C09CF31424833D1D4894FCB6BD93162EC74E836A523E97F35152EBA28AF63DEC47A32C09E0F0451A4D60949C8CDB07642F5A705075F4A1380B327596C319A135C9C43BBAF2D25C90030BA43FC55701B2854ABFEA710D98AFB8341E46778616A9E9B31CF11652B47A76A99F096BDB35C9CFA78E47CFC980E5E8683E1E13AA3FCA5171C07B5E27C1A5002C02643DC760431C2750A29E838F6ED5A892146D8015F5879DA988DF030BB2FA4D501FB7F0AD9A82ED3C48B70979428C39DB04116DCC8337567B6DB4A0DFE0C704B3F46983BBF092847AED87699EE88AEB27756850D008583CD37FC8521968EB1D17FC42D742B7E6756303412A3AD011DD5CE2BA1A4E3B0B2EBB68736C76B02164C41204734B731DF4C00C937CFB49D4648A7808A34E6162526240AB221071C6C2669DB4787AF7D516F4E72EF81C7D907A37634E8CEC5BF4B3502A6A05224B269B29A8E44603DB2A890F9B64BC94AEC7D2923DC52985CC18E123C7D6CC3DEF885725E0BD2D3EC0466DBE2E94350368068E5FC1CFB6BAC40F47600EB8520A8E29E855D96B556002207CA234BE3620189767ED74ABA3D1A1CF3F66864312B7502C37C9543A36F24FD38A25137128FFE4C6CC7C078AEF1F799DA7F3E3BA0E19F21A707E66EE95189BDD74EDF32E0F18052384A2A180D90545EF1B9F2710074BC8AED5F7625C0851C34E9F3AE5C57BE65862CEE2891052CC442574EBFAAE1BEC7AB63F25C80951AD65A41089DE526946D858146E446FCAD6915BD59B0D112255083A711279990F87453A6D8F7D057055217F474B4AD895B
-20241202092818 2 6 100 8191 2 C3301F39F3E2DCD097FBF5454401BF52BF4745AFD35F3DEBDFB34DE2518B0F7BB10DE2FDBE6C35E1B63AA67E9FC179EB3DB8A0FA7E01618BB625B3EC326A001A253FB737B2461999BAB5A5FBCA4AFAD88A8BCBEB5990D4E25225F203B2CE75A3A1C23BFFD78E697275BDB6B6153AA3C21D2063047D44EDDF0483220CD672280D4D67C4726EA476A5C094B7E8DBE62B760EBA6B62C200D456A99E87875B4B2FFF4AA87661D89CAF8CA36D9CE00E0C3BDA443B7CCC3EA892F524AD10DD6960196EC4497E1DDC9F5C13BAED9A8F240196633AB9EC597D0A2FFEEE9320147E73FB295039605EA79376C00D1C60EB421D1BF2BD36A9B68A32E5F5003F0C984E1A57B3C8A261E451D912FCBF27924078BAB0879F85B78D097B2651A17AD9266B39E7AF73DAE54319B2902E0A0D11653B38EDA14B9DE8431E9382AC7EF5F1705C05239DDEA7F533234FA640D2E1EE392D23BF46D57D6FD0E167174E6242F5455DC299BB03BF2EBAEDB14539E9025B84BF66C185AD45C6B1FBF47E3C17D4A1F2C99DCA7151039D71DB7BD2E025E67C2ABB9A2DE6D9C5150651385B270511AA50E8728707B1E0920F3A83DEC0F733090CE96DCACDB93CD756AB1F572DA2BBF4908C17E905848C09CF31424833D1D4894FCB6BD93162EC74E836A523E97F35152EBA28AF63DEC47A32C09E0F0451A4D60949C8CDB07642F5A705075F4A1380B327596C319A135C9C43BBAF2D25C90030BA43FC55701B2854ABFEA710D98AFB8341E46778616A9E9B31CF11652B47A76A99F096BDB35C9CFA78E47CFC980E5E8683E1E13AA3FCA5171C07B5E27C1A5002C02643DC760431C2750A29E838F6ED5A892146D8015F5879DA988DF030BB2FA4D501FB7F0AD9A82ED3C48B70979428C39DB04116DCC8337567B6DB4A0DFE0C704B3F46983BBF092847AED87699EE88AEB27756850D008583CD37FC8521968EB1D17FC42D742B7E6756303412A3AD011DD5CE2BA1A4E3B0B2EBB68736C76B02164C41204734B731DF4C00C937CFB49D4648A7808A34E6162526240AB221071C6C2669DB4787AF7D516F4E72EF81C7D907A37634E8CEC5BF4B3502A6A05224B269B29A8E44603DB2A890F9B64BC94AEC7D2923DC52985CC18E123C7D6CC3DEF885725E0BD2D3EC0466DBE2E94350368068E5FC1CFB6BAC40F47600EB8520A8E29E855D96B556002207CA234BE3620189767ED74ABA3D1A1CF3F66864312B7502C37C9543A36F24FD38A25137128FFE4C6CC7C078AEF1F799DA7F3E3BA0E19F21A707E66EE95189BDD74EDF32E0F18052384A2A180D90545EF1B9F2710074BC8AED5F7625C0851C34E9F3AE5C57BE65862CEE2891052CC442574EBFAAE1BEC7AB63F25C80951AD65A41089DE526946D858146E446FCAD6915BD59B0D112255083A711279990F87453A6D8F7D057055217F474B5FD49CB
-20241202101356 2 6 100 8191 5 C3301F39F3E2DCD097FBF5454401BF52BF4745AFD35F3DEBDFB34DE2518B0F7BB10DE2FDBE6C35E1B63AA67E9FC179EB3DB8A0FA7E01618BB625B3EC326A001A253FB737B2461999BAB5A5FBCA4AFAD88A8BCBEB5990D4E25225F203B2CE75A3A1C23BFFD78E697275BDB6B6153AA3C21D2063047D44EDDF0483220CD672280D4D67C4726EA476A5C094B7E8DBE62B760EBA6B62C200D456A99E87875B4B2FFF4AA87661D89CAF8CA36D9CE00E0C3BDA443B7CCC3EA892F524AD10DD6960196EC4497E1DDC9F5C13BAED9A8F240196633AB9EC597D0A2FFEEE9320147E73FB295039605EA79376C00D1C60EB421D1BF2BD36A9B68A32E5F5003F0C984E1A57B3C8A261E451D912FCBF27924078BAB0879F85B78D097B2651A17AD9266B39E7AF73DAE54319B2902E0A0D11653B38EDA14B9DE8431E9382AC7EF5F1705C05239DDEA7F533234FA640D2E1EE392D23BF46D57D6FD0E167174E6242F5455DC299BB03BF2EBAEDB14539E9025B84BF66C185AD45C6B1FBF47E3C17D4A1F2C99DCA7151039D71DB7BD2E025E67C2ABB9A2DE6D9C5150651385B270511AA50E8728707B1E0920F3A83DEC0F733090CE96DCACDB93CD756AB1F572DA2BBF4908C17E905848C09CF31424833D1D4894FCB6BD93162EC74E836A523E97F35152EBA28AF63DEC47A32C09E0F0451A4D60949C8CDB07642F5A705075F4A1380B327596C319A135C9C43BBAF2D25C90030BA43FC55701B2854ABFEA710D98AFB8341E46778616A9E9B31CF11652B47A76A99F096BDB35C9CFA78E47CFC980E5E8683E1E13AA3FCA5171C07B5E27C1A5002C02643DC760431C2750A29E838F6ED5A892146D8015F5879DA988DF030BB2FA4D501FB7F0AD9A82ED3C48B70979428C39DB04116DCC8337567B6DB4A0DFE0C704B3F46983BBF092847AED87699EE88AEB27756850D008583CD37FC8521968EB1D17FC42D742B7E6756303412A3AD011DD5CE2BA1A4E3B0B2EBB68736C76B02164C41204734B731DF4C00C937CFB49D4648A7808A34E6162526240AB221071C6C2669DB4787AF7D516F4E72EF81C7D907A37634E8CEC5BF4B3502A6A05224B269B29A8E44603DB2A890F9B64BC94AEC7D2923DC52985CC18E123C7D6CC3DEF885725E0BD2D3EC0466DBE2E94350368068E5FC1CFB6BAC40F47600EB8520A8E29E855D96B556002207CA234BE3620189767ED74ABA3D1A1CF3F66864312B7502C37C9543A36F24FD38A25137128FFE4C6CC7C078AEF1F799DA7F3E3BA0E19F21A707E66EE95189BDD74EDF32E0F18052384A2A180D90545EF1B9F2710074BC8AED5F7625C0851C34E9F3AE5C57BE65862CEE2891052CC442574EBFAAE1BEC7AB63F25C80951AD65A41089DE526946D858146E446FCAD6915BD59B0D112255083A711279990F87453A6D8F7D057055217F474B8749EB7
-20241202105709 2 6 100 8191 2 C3301F39F3E2DCD097FBF5454401BF52BF4745AFD35F3DEBDFB34DE2518B0F7BB10DE2FDBE6C35E1B63AA67E9FC179EB3DB8A0FA7E01618BB625B3EC326A001A253FB737B2461999BAB5A5FBCA4AFAD88A8BCBEB5990D4E25225F203B2CE75A3A1C23BFFD78E697275BDB6B6153AA3C21D2063047D44EDDF0483220CD672280D4D67C4726EA476A5C094B7E8DBE62B760EBA6B62C200D456A99E87875B4B2FFF4AA87661D89CAF8CA36D9CE00E0C3BDA443B7CCC3EA892F524AD10DD6960196EC4497E1DDC9F5C13BAED9A8F240196633AB9EC597D0A2FFEEE9320147E73FB295039605EA79376C00D1C60EB421D1BF2BD36A9B68A32E5F5003F0C984E1A57B3C8A261E451D912FCBF27924078BAB0879F85B78D097B2651A17AD9266B39E7AF73DAE54319B2902E0A0D11653B38EDA14B9DE8431E9382AC7EF5F1705C05239DDEA7F533234FA640D2E1EE392D23BF46D57D6FD0E167174E6242F5455DC299BB03BF2EBAEDB14539E9025B84BF66C185AD45C6B1FBF47E3C17D4A1F2C99DCA7151039D71DB7BD2E025E67C2ABB9A2DE6D9C5150651385B270511AA50E8728707B1E0920F3A83DEC0F733090CE96DCACDB93CD756AB1F572DA2BBF4908C17E905848C09CF31424833D1D4894FCB6BD93162EC74E836A523E97F35152EBA28AF63DEC47A32C09E0F0451A4D60949C8CDB07642F5A705075F4A1380B327596C319A135C9C43BBAF2D25C90030BA43FC55701B2854ABFEA710D98AFB8341E46778616A9E9B31CF11652B47A76A99F096BDB35C9CFA78E47CFC980E5E8683E1E13AA3FCA5171C07B5E27C1A5002C02643DC760431C2750A29E838F6ED5A892146D8015F5879DA988DF030BB2FA4D501FB7F0AD9A82ED3C48B70979428C39DB04116DCC8337567B6DB4A0DFE0C704B3F46983BBF092847AED87699EE88AEB27756850D008583CD37FC8521968EB1D17FC42D742B7E6756303412A3AD011DD5CE2BA1A4E3B0B2EBB68736C76B02164C41204734B731DF4C00C937CFB49D4648A7808A34E6162526240AB221071C6C2669DB4787AF7D516F4E72EF81C7D907A37634E8CEC5BF4B3502A6A05224B269B29A8E44603DB2A890F9B64BC94AEC7D2923DC52985CC18E123C7D6CC3DEF885725E0BD2D3EC0466DBE2E94350368068E5FC1CFB6BAC40F47600EB8520A8E29E855D96B556002207CA234BE3620189767ED74ABA3D1A1CF3F66864312B7502C37C9543A36F24FD38A25137128FFE4C6CC7C078AEF1F799DA7F3E3BA0E19F21A707E66EE95189BDD74EDF32E0F18052384A2A180D90545EF1B9F2710074BC8AED5F7625C0851C34E9F3AE5C57BE65862CEE2891052CC442574EBFAAE1BEC7AB63F25C80951AD65A41089DE526946D858146E446FCAD6915BD59B0D112255083A711279990F87453A6D8F7D057055217F474BACEBBE3
-20241202110503 2 6 100 8191 2 C3301F39F3E2DCD097FBF5454401BF52BF4745AFD35F3DEBDFB34DE2518B0F7BB10DE2FDBE6C35E1B63AA67E9FC179EB3DB8A0FA7E01618BB625B3EC326A001A253FB737B2461999BAB5A5FBCA4AFAD88A8BCBEB5990D4E25225F203B2CE75A3A1C23BFFD78E697275BDB6B6153AA3C21D2063047D44EDDF0483220CD672280D4D67C4726EA476A5C094B7E8DBE62B760EBA6B62C200D456A99E87875B4B2FFF4AA87661D89CAF8CA36D9CE00E0C3BDA443B7CCC3EA892F524AD10DD6960196EC4497E1DDC9F5C13BAED9A8F240196633AB9EC597D0A2FFEEE9320147E73FB295039605EA79376C00D1C60EB421D1BF2BD36A9B68A32E5F5003F0C984E1A57B3C8A261E451D912FCBF27924078BAB0879F85B78D097B2651A17AD9266B39E7AF73DAE54319B2902E0A0D11653B38EDA14B9DE8431E9382AC7EF5F1705C05239DDEA7F533234FA640D2E1EE392D23BF46D57D6FD0E167174E6242F5455DC299BB03BF2EBAEDB14539E9025B84BF66C185AD45C6B1FBF47E3C17D4A1F2C99DCA7151039D71DB7BD2E025E67C2ABB9A2DE6D9C5150651385B270511AA50E8728707B1E0920F3A83DEC0F733090CE96DCACDB93CD756AB1F572DA2BBF4908C17E905848C09CF31424833D1D4894FCB6BD93162EC74E836A523E97F35152EBA28AF63DEC47A32C09E0F0451A4D60949C8CDB07642F5A705075F4A1380B327596C319A135C9C43BBAF2D25C90030BA43FC55701B2854ABFEA710D98AFB8341E46778616A9E9B31CF11652B47A76A99F096BDB35C9CFA78E47CFC980E5E8683E1E13AA3FCA5171C07B5E27C1A5002C02643DC760431C2750A29E838F6ED5A892146D8015F5879DA988DF030BB2FA4D501FB7F0AD9A82ED3C48B70979428C39DB04116DCC8337567B6DB4A0DFE0C704B3F46983BBF092847AED87699EE88AEB27756850D008583CD37FC8521968EB1D17FC42D742B7E6756303412A3AD011DD5CE2BA1A4E3B0B2EBB68736C76B02164C41204734B731DF4C00C937CFB49D4648A7808A34E6162526240AB221071C6C2669DB4787AF7D516F4E72EF81C7D907A37634E8CEC5BF4B3502A6A05224B269B29A8E44603DB2A890F9B64BC94AEC7D2923DC52985CC18E123C7D6CC3DEF885725E0BD2D3EC0466DBE2E94350368068E5FC1CFB6BAC40F47600EB8520A8E29E855D96B556002207CA234BE3620189767ED74ABA3D1A1CF3F66864312B7502C37C9543A36F24FD38A25137128FFE4C6CC7C078AEF1F799DA7F3E3BA0E19F21A707E66EE95189BDD74EDF32E0F18052384A2A180D90545EF1B9F2710074BC8AED5F7625C0851C34E9F3AE5C57BE65862CEE2891052CC442574EBFAAE1BEC7AB63F25C80951AD65A41089DE526946D858146E446FCAD6915BD59B0D112255083A711279990F87453A6D8F7D057055217F474BB359FFB
-20241202111809 2 6 100 8191 5 C3301F39F3E2DCD097FBF5454401BF52BF4745AFD35F3DEBDFB34DE2518B0F7BB10DE2FDBE6C35E1B63AA67E9FC179EB3DB8A0FA7E01618BB625B3EC326A001A253FB737B2461999BAB5A5FBCA4AFAD88A8BCBEB5990D4E25225F203B2CE75A3A1C23BFFD78E697275BDB6B6153AA3C21D2063047D44EDDF0483220CD672280D4D67C4726EA476A5C094B7E8DBE62B760EBA6B62C200D456A99E87875B4B2FFF4AA87661D89CAF8CA36D9CE00E0C3BDA443B7CCC3EA892F524AD10DD6960196EC4497E1DDC9F5C13BAED9A8F240196633AB9EC597D0A2FFEEE9320147E73FB295039605EA79376C00D1C60EB421D1BF2BD36A9B68A32E5F5003F0C984E1A57B3C8A261E451D912FCBF27924078BAB0879F85B78D097B2651A17AD9266B39E7AF73DAE54319B2902E0A0D11653B38EDA14B9DE8431E9382AC7EF5F1705C05239DDEA7F533234FA640D2E1EE392D23BF46D57D6FD0E167174E6242F5455DC299BB03BF2EBAEDB14539E9025B84BF66C185AD45C6B1FBF47E3C17D4A1F2C99DCA7151039D71DB7BD2E025E67C2ABB9A2DE6D9C5150651385B270511AA50E8728707B1E0920F3A83DEC0F733090CE96DCACDB93CD756AB1F572DA2BBF4908C17E905848C09CF31424833D1D4894FCB6BD93162EC74E836A523E97F35152EBA28AF63DEC47A32C09E0F0451A4D60949C8CDB07642F5A705075F4A1380B327596C319A135C9C43BBAF2D25C90030BA43FC55701B2854ABFEA710D98AFB8341E46778616A9E9B31CF11652B47A76A99F096BDB35C9CFA78E47CFC980E5E8683E1E13AA3FCA5171C07B5E27C1A5002C02643DC760431C2750A29E838F6ED5A892146D8015F5879DA988DF030BB2FA4D501FB7F0AD9A82ED3C48B70979428C39DB04116DCC8337567B6DB4A0DFE0C704B3F46983BBF092847AED87699EE88AEB27756850D008583CD37FC8521968EB1D17FC42D742B7E6756303412A3AD011DD5CE2BA1A4E3B0B2EBB68736C76B02164C41204734B731DF4C00C937CFB49D4648A7808A34E6162526240AB221071C6C2669DB4787AF7D516F4E72EF81C7D907A37634E8CEC5BF4B3502A6A05224B269B29A8E44603DB2A890F9B64BC94AEC7D2923DC52985CC18E123C7D6CC3DEF885725E0BD2D3EC0466DBE2E94350368068E5FC1CFB6BAC40F47600EB8520A8E29E855D96B556002207CA234BE3620189767ED74ABA3D1A1CF3F66864312B7502C37C9543A36F24FD38A25137128FFE4C6CC7C078AEF1F799DA7F3E3BA0E19F21A707E66EE95189BDD74EDF32E0F18052384A2A180D90545EF1B9F2710074BC8AED5F7625C0851C34E9F3AE5C57BE65862CEE2891052CC442574EBFAAE1BEC7AB63F25C80951AD65A41089DE526946D858146E446FCAD6915BD59B0D112255083A711279990F87453A6D8F7D057055217F474BBDFE367
-20241202113338 2 6 100 8191 5 C3301F39F3E2DCD097FBF5454401BF52BF4745AFD35F3DEBDFB34DE2518B0F7BB10DE2FDBE6C35E1B63AA67E9FC179EB3DB8A0FA7E01618BB625B3EC326A001A253FB737B2461999BAB5A5FBCA4AFAD88A8BCBEB5990D4E25225F203B2CE75A3A1C23BFFD78E697275BDB6B6153AA3C21D2063047D44EDDF0483220CD672280D4D67C4726EA476A5C094B7E8DBE62B760EBA6B62C200D456A99E87875B4B2FFF4AA87661D89CAF8CA36D9CE00E0C3BDA443B7CCC3EA892F524AD10DD6960196EC4497E1DDC9F5C13BAED9A8F240196633AB9EC597D0A2FFEEE9320147E73FB295039605EA79376C00D1C60EB421D1BF2BD36A9B68A32E5F5003F0C984E1A57B3C8A261E451D912FCBF27924078BAB0879F85B78D097B2651A17AD9266B39E7AF73DAE54319B2902E0A0D11653B38EDA14B9DE8431E9382AC7EF5F1705C05239DDEA7F533234FA640D2E1EE392D23BF46D57D6FD0E167174E6242F5455DC299BB03BF2EBAEDB14539E9025B84BF66C185AD45C6B1FBF47E3C17D4A1F2C99DCA7151039D71DB7BD2E025E67C2ABB9A2DE6D9C5150651385B270511AA50E8728707B1E0920F3A83DEC0F733090CE96DCACDB93CD756AB1F572DA2BBF4908C17E905848C09CF31424833D1D4894FCB6BD93162EC74E836A523E97F35152EBA28AF63DEC47A32C09E0F0451A4D60949C8CDB07642F5A705075F4A1380B327596C319A135C9C43BBAF2D25C90030BA43FC55701B2854ABFEA710D98AFB8341E46778616A9E9B31CF11652B47A76A99F096BDB35C9CFA78E47CFC980E5E8683E1E13AA3FCA5171C07B5E27C1A5002C02643DC760431C2750A29E838F6ED5A892146D8015F5879DA988DF030BB2FA4D501FB7F0AD9A82ED3C48B70979428C39DB04116DCC8337567B6DB4A0DFE0C704B3F46983BBF092847AED87699EE88AEB27756850D008583CD37FC8521968EB1D17FC42D742B7E6756303412A3AD011DD5CE2BA1A4E3B0B2EBB68736C76B02164C41204734B731DF4C00C937CFB49D4648A7808A34E6162526240AB221071C6C2669DB4787AF7D516F4E72EF81C7D907A37634E8CEC5BF4B3502A6A05224B269B29A8E44603DB2A890F9B64BC94AEC7D2923DC52985CC18E123C7D6CC3DEF885725E0BD2D3EC0466DBE2E94350368068E5FC1CFB6BAC40F47600EB8520A8E29E855D96B556002207CA234BE3620189767ED74ABA3D1A1CF3F66864312B7502C37C9543A36F24FD38A25137128FFE4C6CC7C078AEF1F799DA7F3E3BA0E19F21A707E66EE95189BDD74EDF32E0F18052384A2A180D90545EF1B9F2710074BC8AED5F7625C0851C34E9F3AE5C57BE65862CEE2891052CC442574EBFAAE1BEC7AB63F25C80951AD65A41089DE526946D858146E446FCAD6915BD59B0D112255083A711279990F87453A6D8F7D057055217F474BCAC42D7
-20241202114109 2 6 100 8191 2 C3301F39F3E2DCD097FBF5454401BF52BF4745AFD35F3DEBDFB34DE2518B0F7BB10DE2FDBE6C35E1B63AA67E9FC179EB3DB8A0FA7E01618BB625B3EC326A001A253FB737B2461999BAB5A5FBCA4AFAD88A8BCBEB5990D4E25225F203B2CE75A3A1C23BFFD78E697275BDB6B6153AA3C21D2063047D44EDDF0483220CD672280D4D67C4726EA476A5C094B7E8DBE62B760EBA6B62C200D456A99E87875B4B2FFF4AA87661D89CAF8CA36D9CE00E0C3BDA443B7CCC3EA892F524AD10DD6960196EC4497E1DDC9F5C13BAED9A8F240196633AB9EC597D0A2FFEEE9320147E73FB295039605EA79376C00D1C60EB421D1BF2BD36A9B68A32E5F5003F0C984E1A57B3C8A261E451D912FCBF27924078BAB0879F85B78D097B2651A17AD9266B39E7AF73DAE54319B2902E0A0D11653B38EDA14B9DE8431E9382AC7EF5F1705C05239DDEA7F533234FA640D2E1EE392D23BF46D57D6FD0E167174E6242F5455DC299BB03BF2EBAEDB14539E9025B84BF66C185AD45C6B1FBF47E3C17D4A1F2C99DCA7151039D71DB7BD2E025E67C2ABB9A2DE6D9C5150651385B270511AA50E8728707B1E0920F3A83DEC0F733090CE96DCACDB93CD756AB1F572DA2BBF4908C17E905848C09CF31424833D1D4894FCB6BD93162EC74E836A523E97F35152EBA28AF63DEC47A32C09E0F0451A4D60949C8CDB07642F5A705075F4A1380B327596C319A135C9C43BBAF2D25C90030BA43FC55701B2854ABFEA710D98AFB8341E46778616A9E9B31CF11652B47A76A99F096BDB35C9CFA78E47CFC980E5E8683E1E13AA3FCA5171C07B5E27C1A5002C02643DC760431C2750A29E838F6ED5A892146D8015F5879DA988DF030BB2FA4D501FB7F0AD9A82ED3C48B70979428C39DB04116DCC8337567B6DB4A0DFE0C704B3F46983BBF092847AED87699EE88AEB27756850D008583CD37FC8521968EB1D17FC42D742B7E6756303412A3AD011DD5CE2BA1A4E3B0B2EBB68736C76B02164C41204734B731DF4C00C937CFB49D4648A7808A34E6162526240AB221071C6C2669DB4787AF7D516F4E72EF81C7D907A37634E8CEC5BF4B3502A6A05224B269B29A8E44603DB2A890F9B64BC94AEC7D2923DC52985CC18E123C7D6CC3DEF885725E0BD2D3EC0466DBE2E94350368068E5FC1CFB6BAC40F47600EB8520A8E29E855D96B556002207CA234BE3620189767ED74ABA3D1A1CF3F66864312B7502C37C9543A36F24FD38A25137128FFE4C6CC7C078AEF1F799DA7F3E3BA0E19F21A707E66EE95189BDD74EDF32E0F18052384A2A180D90545EF1B9F2710074BC8AED5F7625C0851C34E9F3AE5C57BE65862CEE2891052CC442574EBFAAE1BEC7AB63F25C80951AD65A41089DE526946D858146E446FCAD6915BD59B0D112255083A711279990F87453A6D8F7D057055217F474BD0F195B
-20241202140045 2 6 100 8191 2 C3301F39F3E2DCD097FBF5454401BF52BF4745AFD35F3DEBDFB34DE2518B0F7BB10DE2FDBE6C35E1B63AA67E9FC179EB3DB8A0FA7E01618BB625B3EC326A001A253FB737B2461999BAB5A5FBCA4AFAD88A8BCBEB5990D4E25225F203B2CE75A3A1C23BFFD78E697275BDB6B6153AA3C21D2063047D44EDDF0483220CD672280D4D67C4726EA476A5C094B7E8DBE62B760EBA6B62C200D456A99E87875B4B2FFF4AA87661D89CAF8CA36D9CE00E0C3BDA443B7CCC3EA892F524AD10DD6960196EC4497E1DDC9F5C13BAED9A8F240196633AB9EC597D0A2FFEEE9320147E73FB295039605EA79376C00D1C60EB421D1BF2BD36A9B68A32E5F5003F0C984E1A57B3C8A261E451D912FCBF27924078BAB0879F85B78D097B2651A17AD9266B39E7AF73DAE54319B2902E0A0D11653B38EDA14B9DE8431E9382AC7EF5F1705C05239DDEA7F533234FA640D2E1EE392D23BF46D57D6FD0E167174E6242F5455DC299BB03BF2EBAEDB14539E9025B84BF66C185AD45C6B1FBF47E3C17D4A1F2C99DCA7151039D71DB7BD2E025E67C2ABB9A2DE6D9C5150651385B270511AA50E8728707B1E0920F3A83DEC0F733090CE96DCACDB93CD756AB1F572DA2BBF4908C17E905848C09CF31424833D1D4894FCB6BD93162EC74E836A523E97F35152EBA28AF63DEC47A32C09E0F0451A4D60949C8CDB07642F5A705075F4A1380B327596C319A135C9C43BBAF2D25C90030BA43FC55701B2854ABFEA710D98AFB8341E46778616A9E9B31CF11652B47A76A99F096BDB35C9CFA78E47CFC980E5E8683E1E13AA3FCA5171C07B5E27C1A5002C02643DC760431C2750A29E838F6ED5A892146D8015F5879DA988DF030BB2FA4D501FB7F0AD9A82ED3C48B70979428C39DB04116DCC8337567B6DB4A0DFE0C704B3F46983BBF092847AED87699EE88AEB27756850D008583CD37FC8521968EB1D17FC42D742B7E6756303412A3AD011DD5CE2BA1A4E3B0B2EBB68736C76B02164C41204734B731DF4C00C937CFB49D4648A7808A34E6162526240AB221071C6C2669DB4787AF7D516F4E72EF81C7D907A37634E8CEC5BF4B3502A6A05224B269B29A8E44603DB2A890F9B64BC94AEC7D2923DC52985CC18E123C7D6CC3DEF885725E0BD2D3EC0466DBE2E94350368068E5FC1CFB6BAC40F47600EB8520A8E29E855D96B556002207CA234BE3620189767ED74ABA3D1A1CF3F66864312B7502C37C9543A36F24FD38A25137128FFE4C6CC7C078AEF1F799DA7F3E3BA0E19F21A707E66EE95189BDD74EDF32E0F18052384A2A180D90545EF1B9F2710074BC8AED5F7625C0851C34E9F3AE5C57BE65862CEE2891052CC442574EBFAAE1BEC7AB63F25C80951AD65A41089DE526946D858146E446FCAD6915BD59B0D112255083A711279990F87453A6D8F7D057055217F474C4C2C8C3
-20241202145509 2 6 100 8191 2 C3301F39F3E2DCD097FBF5454401BF52BF4745AFD35F3DEBDFB34DE2518B0F7BB10DE2FDBE6C35E1B63AA67E9FC179EB3DB8A0FA7E01618BB625B3EC326A001A253FB737B2461999BAB5A5FBCA4AFAD88A8BCBEB5990D4E25225F203B2CE75A3A1C23BFFD78E697275BDB6B6153AA3C21D2063047D44EDDF0483220CD672280D4D67C4726EA476A5C094B7E8DBE62B760EBA6B62C200D456A99E87875B4B2FFF4AA87661D89CAF8CA36D9CE00E0C3BDA443B7CCC3EA892F524AD10DD6960196EC4497E1DDC9F5C13BAED9A8F240196633AB9EC597D0A2FFEEE9320147E73FB295039605EA79376C00D1C60EB421D1BF2BD36A9B68A32E5F5003F0C984E1A57B3C8A261E451D912FCBF27924078BAB0879F85B78D097B2651A17AD9266B39E7AF73DAE54319B2902E0A0D11653B38EDA14B9DE8431E9382AC7EF5F1705C05239DDEA7F533234FA640D2E1EE392D23BF46D57D6FD0E167174E6242F5455DC299BB03BF2EBAEDB14539E9025B84BF66C185AD45C6B1FBF47E3C17D4A1F2C99DCA7151039D71DB7BD2E025E67C2ABB9A2DE6D9C5150651385B270511AA50E8728707B1E0920F3A83DEC0F733090CE96DCACDB93CD756AB1F572DA2BBF4908C17E905848C09CF31424833D1D4894FCB6BD93162EC74E836A523E97F35152EBA28AF63DEC47A32C09E0F0451A4D60949C8CDB07642F5A705075F4A1380B327596C319A135C9C43BBAF2D25C90030BA43FC55701B2854ABFEA710D98AFB8341E46778616A9E9B31CF11652B47A76A99F096BDB35C9CFA78E47CFC980E5E8683E1E13AA3FCA5171C07B5E27C1A5002C02643DC760431C2750A29E838F6ED5A892146D8015F5879DA988DF030BB2FA4D501FB7F0AD9A82ED3C48B70979428C39DB04116DCC8337567B6DB4A0DFE0C704B3F46983BBF092847AED87699EE88AEB27756850D008583CD37FC8521968EB1D17FC42D742B7E6756303412A3AD011DD5CE2BA1A4E3B0B2EBB68736C76B02164C41204734B731DF4C00C937CFB49D4648A7808A34E6162526240AB221071C6C2669DB4787AF7D516F4E72EF81C7D907A37634E8CEC5BF4B3502A6A05224B269B29A8E44603DB2A890F9B64BC94AEC7D2923DC52985CC18E123C7D6CC3DEF885725E0BD2D3EC0466DBE2E94350368068E5FC1CFB6BAC40F47600EB8520A8E29E855D96B556002207CA234BE3620189767ED74ABA3D1A1CF3F66864312B7502C37C9543A36F24FD38A25137128FFE4C6CC7C078AEF1F799DA7F3E3BA0E19F21A707E66EE95189BDD74EDF32E0F18052384A2A180D90545EF1B9F2710074BC8AED5F7625C0851C34E9F3AE5C57BE65862CEE2891052CC442574EBFAAE1BEC7AB63F25C80951AD65A41089DE526946D858146E446FCAD6915BD59B0D112255083A711279990F87453A6D8F7D057055217F474C7B5B2B3
-20241202180737 2 6 100 8191 5 C3301F39F3E2DCD097FBF5454401BF52BF4745AFD35F3DEBDFB34DE2518B0F7BB10DE2FDBE6C35E1B63AA67E9FC179EB3DB8A0FA7E01618BB625B3EC326A001A253FB737B2461999BAB5A5FBCA4AFAD88A8BCBEB5990D4E25225F203B2CE75A3A1C23BFFD78E697275BDB6B6153AA3C21D2063047D44EDDF0483220CD672280D4D67C4726EA476A5C094B7E8DBE62B760EBA6B62C200D456A99E87875B4B2FFF4AA87661D89CAF8CA36D9CE00E0C3BDA443B7CCC3EA892F524AD10DD6960196EC4497E1DDC9F5C13BAED9A8F240196633AB9EC597D0A2FFEEE9320147E73FB295039605EA79376C00D1C60EB421D1BF2BD36A9B68A32E5F5003F0C984E1A57B3C8A261E451D912FCBF27924078BAB0879F85B78D097B2651A17AD9266B39E7AF73DAE54319B2902E0A0D11653B38EDA14B9DE8431E9382AC7EF5F1705C05239DDEA7F533234FA640D2E1EE392D23BF46D57D6FD0E167174E6242F5455DC299BB03BF2EBAEDB14539E9025B84BF66C185AD45C6B1FBF47E3C17D4A1F2C99DCA7151039D71DB7BD2E025E67C2ABB9A2DE6D9C5150651385B270511AA50E8728707B1E0920F3A83DEC0F733090CE96DCACDB93CD756AB1F572DA2BBF4908C17E905848C09CF31424833D1D4894FCB6BD93162EC74E836A523E97F35152EBA28AF63DEC47A32C09E0F0451A4D60949C8CDB07642F5A705075F4A1380B327596C319A135C9C43BBAF2D25C90030BA43FC55701B2854ABFEA710D98AFB8341E46778616A9E9B31CF11652B47A76A99F096BDB35C9CFA78E47CFC980E5E8683E1E13AA3FCA5171C07B5E27C1A5002C02643DC760431C2750A29E838F6ED5A892146D8015F5879DA988DF030BB2FA4D501FB7F0AD9A82ED3C48B70979428C39DB04116DCC8337567B6DB4A0DFE0C704B3F46983BBF092847AED87699EE88AEB27756850D008583CD37FC8521968EB1D17FC42D742B7E6756303412A3AD011DD5CE2BA1A4E3B0B2EBB68736C76B02164C41204734B731DF4C00C937CFB49D4648A7808A34E6162526240AB221071C6C2669DB4787AF7D516F4E72EF81C7D907A37634E8CEC5BF4B3502A6A05224B269B29A8E44603DB2A890F9B64BC94AEC7D2923DC52985CC18E123C7D6CC3DEF885725E0BD2D3EC0466DBE2E94350368068E5FC1CFB6BAC40F47600EB8520A8E29E855D96B556002207CA234BE3620189767ED74ABA3D1A1CF3F66864312B7502C37C9543A36F24FD38A25137128FFE4C6CC7C078AEF1F799DA7F3E3BA0E19F21A707E66EE95189BDD74EDF32E0F18052384A2A180D90545EF1B9F2710074BC8AED5F7625C0851C34E9F3AE5C57BE65862CEE2891052CC442574EBFAAE1BEC7AB63F25C80951AD65A41089DE526946D858146E446FCAD6915BD59B0D112255083A711279990F87453A6D8F7D057055217F474D23791E7
-20241202190603 2 6 100 8191 5 C3301F39F3E2DCD097FBF5454401BF52BF4745AFD35F3DEBDFB34DE2518B0F7BB10DE2FDBE6C35E1B63AA67E9FC179EB3DB8A0FA7E01618BB625B3EC326A001A253FB737B2461999BAB5A5FBCA4AFAD88A8BCBEB5990D4E25225F203B2CE75A3A1C23BFFD78E697275BDB6B6153AA3C21D2063047D44EDDF0483220CD672280D4D67C4726EA476A5C094B7E8DBE62B760EBA6B62C200D456A99E87875B4B2FFF4AA87661D89CAF8CA36D9CE00E0C3BDA443B7CCC3EA892F524AD10DD6960196EC4497E1DDC9F5C13BAED9A8F240196633AB9EC597D0A2FFEEE9320147E73FB295039605EA79376C00D1C60EB421D1BF2BD36A9B68A32E5F5003F0C984E1A57B3C8A261E451D912FCBF27924078BAB0879F85B78D097B2651A17AD9266B39E7AF73DAE54319B2902E0A0D11653B38EDA14B9DE8431E9382AC7EF5F1705C05239DDEA7F533234FA640D2E1EE392D23BF46D57D6FD0E167174E6242F5455DC299BB03BF2EBAEDB14539E9025B84BF66C185AD45C6B1FBF47E3C17D4A1F2C99DCA7151039D71DB7BD2E025E67C2ABB9A2DE6D9C5150651385B270511AA50E8728707B1E0920F3A83DEC0F733090CE96DCACDB93CD756AB1F572DA2BBF4908C17E905848C09CF31424833D1D4894FCB6BD93162EC74E836A523E97F35152EBA28AF63DEC47A32C09E0F0451A4D60949C8CDB07642F5A705075F4A1380B327596C319A135C9C43BBAF2D25C90030BA43FC55701B2854ABFEA710D98AFB8341E46778616A9E9B31CF11652B47A76A99F096BDB35C9CFA78E47CFC980E5E8683E1E13AA3FCA5171C07B5E27C1A5002C02643DC760431C2750A29E838F6ED5A892146D8015F5879DA988DF030BB2FA4D501FB7F0AD9A82ED3C48B70979428C39DB04116DCC8337567B6DB4A0DFE0C704B3F46983BBF092847AED87699EE88AEB27756850D008583CD37FC8521968EB1D17FC42D742B7E6756303412A3AD011DD5CE2BA1A4E3B0B2EBB68736C76B02164C41204734B731DF4C00C937CFB49D4648A7808A34E6162526240AB221071C6C2669DB4787AF7D516F4E72EF81C7D907A37634E8CEC5BF4B3502A6A05224B269B29A8E44603DB2A890F9B64BC94AEC7D2923DC52985CC18E123C7D6CC3DEF885725E0BD2D3EC0466DBE2E94350368068E5FC1CFB6BAC40F47600EB8520A8E29E855D96B556002207CA234BE3620189767ED74ABA3D1A1CF3F66864312B7502C37C9543A36F24FD38A25137128FFE4C6CC7C078AEF1F799DA7F3E3BA0E19F21A707E66EE95189BDD74EDF32E0F18052384A2A180D90545EF1B9F2710074BC8AED5F7625C0851C34E9F3AE5C57BE65862CEE2891052CC442574EBFAAE1BEC7AB63F25C80951AD65A41089DE526946D858146E446FCAD6915BD59B0D112255083A711279990F87453A6D8F7D057055217F474D562B49F
-20241202192303 2 6 100 8191 5 C3301F39F3E2DCD097FBF5454401BF52BF4745AFD35F3DEBDFB34DE2518B0F7BB10DE2FDBE6C35E1B63AA67E9FC179EB3DB8A0FA7E01618BB625B3EC326A001A253FB737B2461999BAB5A5FBCA4AFAD88A8BCBEB5990D4E25225F203B2CE75A3A1C23BFFD78E697275BDB6B6153AA3C21D2063047D44EDDF0483220CD672280D4D67C4726EA476A5C094B7E8DBE62B760EBA6B62C200D456A99E87875B4B2FFF4AA87661D89CAF8CA36D9CE00E0C3BDA443B7CCC3EA892F524AD10DD6960196EC4497E1DDC9F5C13BAED9A8F240196633AB9EC597D0A2FFEEE9320147E73FB295039605EA79376C00D1C60EB421D1BF2BD36A9B68A32E5F5003F0C984E1A57B3C8A261E451D912FCBF27924078BAB0879F85B78D097B2651A17AD9266B39E7AF73DAE54319B2902E0A0D11653B38EDA14B9DE8431E9382AC7EF5F1705C05239DDEA7F533234FA640D2E1EE392D23BF46D57D6FD0E167174E6242F5455DC299BB03BF2EBAEDB14539E9025B84BF66C185AD45C6B1FBF47E3C17D4A1F2C99DCA7151039D71DB7BD2E025E67C2ABB9A2DE6D9C5150651385B270511AA50E8728707B1E0920F3A83DEC0F733090CE96DCACDB93CD756AB1F572DA2BBF4908C17E905848C09CF31424833D1D4894FCB6BD93162EC74E836A523E97F35152EBA28AF63DEC47A32C09E0F0451A4D60949C8CDB07642F5A705075F4A1380B327596C319A135C9C43BBAF2D25C90030BA43FC55701B2854ABFEA710D98AFB8341E46778616A9E9B31CF11652B47A76A99F096BDB35C9CFA78E47CFC980E5E8683E1E13AA3FCA5171C07B5E27C1A5002C02643DC760431C2750A29E838F6ED5A892146D8015F5879DA988DF030BB2FA4D501FB7F0AD9A82ED3C48B70979428C39DB04116DCC8337567B6DB4A0DFE0C704B3F46983BBF092847AED87699EE88AEB27756850D008583CD37FC8521968EB1D17FC42D742B7E6756303412A3AD011DD5CE2BA1A4E3B0B2EBB68736C76B02164C41204734B731DF4C00C937CFB49D4648A7808A34E6162526240AB221071C6C2669DB4787AF7D516F4E72EF81C7D907A37634E8CEC5BF4B3502A6A05224B269B29A8E44603DB2A890F9B64BC94AEC7D2923DC52985CC18E123C7D6CC3DEF885725E0BD2D3EC0466DBE2E94350368068E5FC1CFB6BAC40F47600EB8520A8E29E855D96B556002207CA234BE3620189767ED74ABA3D1A1CF3F66864312B7502C37C9543A36F24FD38A25137128FFE4C6CC7C078AEF1F799DA7F3E3BA0E19F21A707E66EE95189BDD74EDF32E0F18052384A2A180D90545EF1B9F2710074BC8AED5F7625C0851C34E9F3AE5C57BE65862CEE2891052CC442574EBFAAE1BEC7AB63F25C80951AD65A41089DE526946D858146E446FCAD6915BD59B0D112255083A711279990F87453A6D8F7D057055217F474D64A0887
-20241202194604 2 6 100 8191 2 C3301F39F3E2DCD097FBF5454401BF52BF4745AFD35F3DEBDFB34DE2518B0F7BB10DE2FDBE6C35E1B63AA67E9FC179EB3DB8A0FA7E01618BB625B3EC326A001A253FB737B2461999BAB5A5FBCA4AFAD88A8BCBEB5990D4E25225F203B2CE75A3A1C23BFFD78E697275BDB6B6153AA3C21D2063047D44EDDF0483220CD672280D4D67C4726EA476A5C094B7E8DBE62B760EBA6B62C200D456A99E87875B4B2FFF4AA87661D89CAF8CA36D9CE00E0C3BDA443B7CCC3EA892F524AD10DD6960196EC4497E1DDC9F5C13BAED9A8F240196633AB9EC597D0A2FFEEE9320147E73FB295039605EA79376C00D1C60EB421D1BF2BD36A9B68A32E5F5003F0C984E1A57B3C8A261E451D912FCBF27924078BAB0879F85B78D097B2651A17AD9266B39E7AF73DAE54319B2902E0A0D11653B38EDA14B9DE8431E9382AC7EF5F1705C05239DDEA7F533234FA640D2E1EE392D23BF46D57D6FD0E167174E6242F5455DC299BB03BF2EBAEDB14539E9025B84BF66C185AD45C6B1FBF47E3C17D4A1F2C99DCA7151039D71DB7BD2E025E67C2ABB9A2DE6D9C5150651385B270511AA50E8728707B1E0920F3A83DEC0F733090CE96DCACDB93CD756AB1F572DA2BBF4908C17E905848C09CF31424833D1D4894FCB6BD93162EC74E836A523E97F35152EBA28AF63DEC47A32C09E0F0451A4D60949C8CDB07642F5A705075F4A1380B327596C319A135C9C43BBAF2D25C90030BA43FC55701B2854ABFEA710D98AFB8341E46778616A9E9B31CF11652B47A76A99F096BDB35C9CFA78E47CFC980E5E8683E1E13AA3FCA5171C07B5E27C1A5002C02643DC760431C2750A29E838F6ED5A892146D8015F5879DA988DF030BB2FA4D501FB7F0AD9A82ED3C48B70979428C39DB04116DCC8337567B6DB4A0DFE0C704B3F46983BBF092847AED87699EE88AEB27756850D008583CD37FC8521968EB1D17FC42D742B7E6756303412A3AD011DD5CE2BA1A4E3B0B2EBB68736C76B02164C41204734B731DF4C00C937CFB49D4648A7808A34E6162526240AB221071C6C2669DB4787AF7D516F4E72EF81C7D907A37634E8CEC5BF4B3502A6A05224B269B29A8E44603DB2A890F9B64BC94AEC7D2923DC52985CC18E123C7D6CC3DEF885725E0BD2D3EC0466DBE2E94350368068E5FC1CFB6BAC40F47600EB8520A8E29E855D96B556002207CA234BE3620189767ED74ABA3D1A1CF3F66864312B7502C37C9543A36F24FD38A25137128FFE4C6CC7C078AEF1F799DA7F3E3BA0E19F21A707E66EE95189BDD74EDF32E0F18052384A2A180D90545EF1B9F2710074BC8AED5F7625C0851C34E9F3AE5C57BE65862CEE2891052CC442574EBFAAE1BEC7AB63F25C80951AD65A41089DE526946D858146E446FCAD6915BD59B0D112255083A711279990F87453A6D8F7D057055217F474D788F30B
-20241202202723 2 6 100 8191 5 C3301F39F3E2DCD097FBF5454401BF52BF4745AFD35F3DEBDFB34DE2518B0F7BB10DE2FDBE6C35E1B63AA67E9FC179EB3DB8A0FA7E01618BB625B3EC326A001A253FB737B2461999BAB5A5FBCA4AFAD88A8BCBEB5990D4E25225F203B2CE75A3A1C23BFFD78E697275BDB6B6153AA3C21D2063047D44EDDF0483220CD672280D4D67C4726EA476A5C094B7E8DBE62B760EBA6B62C200D456A99E87875B4B2FFF4AA87661D89CAF8CA36D9CE00E0C3BDA443B7CCC3EA892F524AD10DD6960196EC4497E1DDC9F5C13BAED9A8F240196633AB9EC597D0A2FFEEE9320147E73FB295039605EA79376C00D1C60EB421D1BF2BD36A9B68A32E5F5003F0C984E1A57B3C8A261E451D912FCBF27924078BAB0879F85B78D097B2651A17AD9266B39E7AF73DAE54319B2902E0A0D11653B38EDA14B9DE8431E9382AC7EF5F1705C05239DDEA7F533234FA640D2E1EE392D23BF46D57D6FD0E167174E6242F5455DC299BB03BF2EBAEDB14539E9025B84BF66C185AD45C6B1FBF47E3C17D4A1F2C99DCA7151039D71DB7BD2E025E67C2ABB9A2DE6D9C5150651385B270511AA50E8728707B1E0920F3A83DEC0F733090CE96DCACDB93CD756AB1F572DA2BBF4908C17E905848C09CF31424833D1D4894FCB6BD93162EC74E836A523E97F35152EBA28AF63DEC47A32C09E0F0451A4D60949C8CDB07642F5A705075F4A1380B327596C319A135C9C43BBAF2D25C90030BA43FC55701B2854ABFEA710D98AFB8341E46778616A9E9B31CF11652B47A76A99F096BDB35C9CFA78E47CFC980E5E8683E1E13AA3FCA5171C07B5E27C1A5002C02643DC760431C2750A29E838F6ED5A892146D8015F5879DA988DF030BB2FA4D501FB7F0AD9A82ED3C48B70979428C39DB04116DCC8337567B6DB4A0DFE0C704B3F46983BBF092847AED87699EE88AEB27756850D008583CD37FC8521968EB1D17FC42D742B7E6756303412A3AD011DD5CE2BA1A4E3B0B2EBB68736C76B02164C41204734B731DF4C00C937CFB49D4648A7808A34E6162526240AB221071C6C2669DB4787AF7D516F4E72EF81C7D907A37634E8CEC5BF4B3502A6A05224B269B29A8E44603DB2A890F9B64BC94AEC7D2923DC52985CC18E123C7D6CC3DEF885725E0BD2D3EC0466DBE2E94350368068E5FC1CFB6BAC40F47600EB8520A8E29E855D96B556002207CA234BE3620189767ED74ABA3D1A1CF3F66864312B7502C37C9543A36F24FD38A25137128FFE4C6CC7C078AEF1F799DA7F3E3BA0E19F21A707E66EE95189BDD74EDF32E0F18052384A2A180D90545EF1B9F2710074BC8AED5F7625C0851C34E9F3AE5C57BE65862CEE2891052CC442574EBFAAE1BEC7AB63F25C80951AD65A41089DE526946D858146E446FCAD6915BD59B0D112255083A711279990F87453A6D8F7D057055217F474D9CE5387
-20241202210310 2 6 100 8191 5 C3301F39F3E2DCD097FBF5454401BF52BF4745AFD35F3DEBDFB34DE2518B0F7BB10DE2FDBE6C35E1B63AA67E9FC179EB3DB8A0FA7E01618BB625B3EC326A001A253FB737B2461999BAB5A5FBCA4AFAD88A8BCBEB5990D4E25225F203B2CE75A3A1C23BFFD78E697275BDB6B6153AA3C21D2063047D44EDDF0483220CD672280D4D67C4726EA476A5C094B7E8DBE62B760EBA6B62C200D456A99E87875B4B2FFF4AA87661D89CAF8CA36D9CE00E0C3BDA443B7CCC3EA892F524AD10DD6960196EC4497E1DDC9F5C13BAED9A8F240196633AB9EC597D0A2FFEEE9320147E73FB295039605EA79376C00D1C60EB421D1BF2BD36A9B68A32E5F5003F0C984E1A57B3C8A261E451D912FCBF27924078BAB0879F85B78D097B2651A17AD9266B39E7AF73DAE54319B2902E0A0D11653B38EDA14B9DE8431E9382AC7EF5F1705C05239DDEA7F533234FA640D2E1EE392D23BF46D57D6FD0E167174E6242F5455DC299BB03BF2EBAEDB14539E9025B84BF66C185AD45C6B1FBF47E3C17D4A1F2C99DCA7151039D71DB7BD2E025E67C2ABB9A2DE6D9C5150651385B270511AA50E8728707B1E0920F3A83DEC0F733090CE96DCACDB93CD756AB1F572DA2BBF4908C17E905848C09CF31424833D1D4894FCB6BD93162EC74E836A523E97F35152EBA28AF63DEC47A32C09E0F0451A4D60949C8CDB07642F5A705075F4A1380B327596C319A135C9C43BBAF2D25C90030BA43FC55701B2854ABFEA710D98AFB8341E46778616A9E9B31CF11652B47A76A99F096BDB35C9CFA78E47CFC980E5E8683E1E13AA3FCA5171C07B5E27C1A5002C02643DC760431C2750A29E838F6ED5A892146D8015F5879DA988DF030BB2FA4D501FB7F0AD9A82ED3C48B70979428C39DB04116DCC8337567B6DB4A0DFE0C704B3F46983BBF092847AED87699EE88AEB27756850D008583CD37FC8521968EB1D17FC42D742B7E6756303412A3AD011DD5CE2BA1A4E3B0B2EBB68736C76B02164C41204734B731DF4C00C937CFB49D4648A7808A34E6162526240AB221071C6C2669DB4787AF7D516F4E72EF81C7D907A37634E8CEC5BF4B3502A6A05224B269B29A8E44603DB2A890F9B64BC94AEC7D2923DC52985CC18E123C7D6CC3DEF885725E0BD2D3EC0466DBE2E94350368068E5FC1CFB6BAC40F47600EB8520A8E29E855D96B556002207CA234BE3620189767ED74ABA3D1A1CF3F66864312B7502C37C9543A36F24FD38A25137128FFE4C6CC7C078AEF1F799DA7F3E3BA0E19F21A707E66EE95189BDD74EDF32E0F18052384A2A180D90545EF1B9F2710074BC8AED5F7625C0851C34E9F3AE5C57BE65862CEE2891052CC442574EBFAAE1BEC7AB63F25C80951AD65A41089DE526946D858146E446FCAD6915BD59B0D112255083A711279990F87453A6D8F7D057055217F474DBCBA17F
-20241202232141 2 6 100 8191 5 C3301F39F3E2DCD097FBF5454401BF52BF4745AFD35F3DEBDFB34DE2518B0F7BB10DE2FDBE6C35E1B63AA67E9FC179EB3DB8A0FA7E01618BB625B3EC326A001A253FB737B2461999BAB5A5FBCA4AFAD88A8BCBEB5990D4E25225F203B2CE75A3A1C23BFFD78E697275BDB6B6153AA3C21D2063047D44EDDF0483220CD672280D4D67C4726EA476A5C094B7E8DBE62B760EBA6B62C200D456A99E87875B4B2FFF4AA87661D89CAF8CA36D9CE00E0C3BDA443B7CCC3EA892F524AD10DD6960196EC4497E1DDC9F5C13BAED9A8F240196633AB9EC597D0A2FFEEE9320147E73FB295039605EA79376C00D1C60EB421D1BF2BD36A9B68A32E5F5003F0C984E1A57B3C8A261E451D912FCBF27924078BAB0879F85B78D097B2651A17AD9266B39E7AF73DAE54319B2902E0A0D11653B38EDA14B9DE8431E9382AC7EF5F1705C05239DDEA7F533234FA640D2E1EE392D23BF46D57D6FD0E167174E6242F5455DC299BB03BF2EBAEDB14539E9025B84BF66C185AD45C6B1FBF47E3C17D4A1F2C99DCA7151039D71DB7BD2E025E67C2ABB9A2DE6D9C5150651385B270511AA50E8728707B1E0920F3A83DEC0F733090CE96DCACDB93CD756AB1F572DA2BBF4908C17E905848C09CF31424833D1D4894FCB6BD93162EC74E836A523E97F35152EBA28AF63DEC47A32C09E0F0451A4D60949C8CDB07642F5A705075F4A1380B327596C319A135C9C43BBAF2D25C90030BA43FC55701B2854ABFEA710D98AFB8341E46778616A9E9B31CF11652B47A76A99F096BDB35C9CFA78E47CFC980E5E8683E1E13AA3FCA5171C07B5E27C1A5002C02643DC760431C2750A29E838F6ED5A892146D8015F5879DA988DF030BB2FA4D501FB7F0AD9A82ED3C48B70979428C39DB04116DCC8337567B6DB4A0DFE0C704B3F46983BBF092847AED87699EE88AEB27756850D008583CD37FC8521968EB1D17FC42D742B7E6756303412A3AD011DD5CE2BA1A4E3B0B2EBB68736C76B02164C41204734B731DF4C00C937CFB49D4648A7808A34E6162526240AB221071C6C2669DB4787AF7D516F4E72EF81C7D907A37634E8CEC5BF4B3502A6A05224B269B29A8E44603DB2A890F9B64BC94AEC7D2923DC52985CC18E123C7D6CC3DEF885725E0BD2D3EC0466DBE2E94350368068E5FC1CFB6BAC40F47600EB8520A8E29E855D96B556002207CA234BE3620189767ED74ABA3D1A1CF3F66864312B7502C37C9543A36F24FD38A25137128FFE4C6CC7C078AEF1F799DA7F3E3BA0E19F21A707E66EE95189BDD74EDF32E0F18052384A2A180D90545EF1B9F2710074BC8AED5F7625C0851C34E9F3AE5C57BE65862CEE2891052CC442574EBFAAE1BEC7AB63F25C80951AD65A41089DE526946D858146E446FCAD6915BD59B0D112255083A711279990F87453A6D8F7D057055217F474E3833667
-20241202234441 2 6 100 8191 2 C3301F39F3E2DCD097FBF5454401BF52BF4745AFD35F3DEBDFB34DE2518B0F7BB10DE2FDBE6C35E1B63AA67E9FC179EB3DB8A0FA7E01618BB625B3EC326A001A253FB737B2461999BAB5A5FBCA4AFAD88A8BCBEB5990D4E25225F203B2CE75A3A1C23BFFD78E697275BDB6B6153AA3C21D2063047D44EDDF0483220CD672280D4D67C4726EA476A5C094B7E8DBE62B760EBA6B62C200D456A99E87875B4B2FFF4AA87661D89CAF8CA36D9CE00E0C3BDA443B7CCC3EA892F524AD10DD6960196EC4497E1DDC9F5C13BAED9A8F240196633AB9EC597D0A2FFEEE9320147E73FB295039605EA79376C00D1C60EB421D1BF2BD36A9B68A32E5F5003F0C984E1A57B3C8A261E451D912FCBF27924078BAB0879F85B78D097B2651A17AD9266B39E7AF73DAE54319B2902E0A0D11653B38EDA14B9DE8431E9382AC7EF5F1705C05239DDEA7F533234FA640D2E1EE392D23BF46D57D6FD0E167174E6242F5455DC299BB03BF2EBAEDB14539E9025B84BF66C185AD45C6B1FBF47E3C17D4A1F2C99DCA7151039D71DB7BD2E025E67C2ABB9A2DE6D9C5150651385B270511AA50E8728707B1E0920F3A83DEC0F733090CE96DCACDB93CD756AB1F572DA2BBF4908C17E905848C09CF31424833D1D4894FCB6BD93162EC74E836A523E97F35152EBA28AF63DEC47A32C09E0F0451A4D60949C8CDB07642F5A705075F4A1380B327596C319A135C9C43BBAF2D25C90030BA43FC55701B2854ABFEA710D98AFB8341E46778616A9E9B31CF11652B47A76A99F096BDB35C9CFA78E47CFC980E5E8683E1E13AA3FCA5171C07B5E27C1A5002C02643DC760431C2750A29E838F6ED5A892146D8015F5879DA988DF030BB2FA4D501FB7F0AD9A82ED3C48B70979428C39DB04116DCC8337567B6DB4A0DFE0C704B3F46983BBF092847AED87699EE88AEB27756850D008583CD37FC8521968EB1D17FC42D742B7E6756303412A3AD011DD5CE2BA1A4E3B0B2EBB68736C76B02164C41204734B731DF4C00C937CFB49D4648A7808A34E6162526240AB221071C6C2669DB4787AF7D516F4E72EF81C7D907A37634E8CEC5BF4B3502A6A05224B269B29A8E44603DB2A890F9B64BC94AEC7D2923DC52985CC18E123C7D6CC3DEF885725E0BD2D3EC0466DBE2E94350368068E5FC1CFB6BAC40F47600EB8520A8E29E855D96B556002207CA234BE3620189767ED74ABA3D1A1CF3F66864312B7502C37C9543A36F24FD38A25137128FFE4C6CC7C078AEF1F799DA7F3E3BA0E19F21A707E66EE95189BDD74EDF32E0F18052384A2A180D90545EF1B9F2710074BC8AED5F7625C0851C34E9F3AE5C57BE65862CEE2891052CC442574EBFAAE1BEC7AB63F25C80951AD65A41089DE526946D858146E446FCAD6915BD59B0D112255083A711279990F87453A6D8F7D057055217F474E4C55853
-20241202234813 2 6 100 8191 5 C3301F39F3E2DCD097FBF5454401BF52BF4745AFD35F3DEBDFB34DE2518B0F7BB10DE2FDBE6C35E1B63AA67E9FC179EB3DB8A0FA7E01618BB625B3EC326A001A253FB737B2461999BAB5A5FBCA4AFAD88A8BCBEB5990D4E25225F203B2CE75A3A1C23BFFD78E697275BDB6B6153AA3C21D2063047D44EDDF0483220CD672280D4D67C4726EA476A5C094B7E8DBE62B760EBA6B62C200D456A99E87875B4B2FFF4AA87661D89CAF8CA36D9CE00E0C3BDA443B7CCC3EA892F524AD10DD6960196EC4497E1DDC9F5C13BAED9A8F240196633AB9EC597D0A2FFEEE9320147E73FB295039605EA79376C00D1C60EB421D1BF2BD36A9B68A32E5F5003F0C984E1A57B3C8A261E451D912FCBF27924078BAB0879F85B78D097B2651A17AD9266B39E7AF73DAE54319B2902E0A0D11653B38EDA14B9DE8431E9382AC7EF5F1705C05239DDEA7F533234FA640D2E1EE392D23BF46D57D6FD0E167174E6242F5455DC299BB03BF2EBAEDB14539E9025B84BF66C185AD45C6B1FBF47E3C17D4A1F2C99DCA7151039D71DB7BD2E025E67C2ABB9A2DE6D9C5150651385B270511AA50E8728707B1E0920F3A83DEC0F733090CE96DCACDB93CD756AB1F572DA2BBF4908C17E905848C09CF31424833D1D4894FCB6BD93162EC74E836A523E97F35152EBA28AF63DEC47A32C09E0F0451A4D60949C8CDB07642F5A705075F4A1380B327596C319A135C9C43BBAF2D25C90030BA43FC55701B2854ABFEA710D98AFB8341E46778616A9E9B31CF11652B47A76A99F096BDB35C9CFA78E47CFC980E5E8683E1E13AA3FCA5171C07B5E27C1A5002C02643DC760431C2750A29E838F6ED5A892146D8015F5879DA988DF030BB2FA4D501FB7F0AD9A82ED3C48B70979428C39DB04116DCC8337567B6DB4A0DFE0C704B3F46983BBF092847AED87699EE88AEB27756850D008583CD37FC8521968EB1D17FC42D742B7E6756303412A3AD011DD5CE2BA1A4E3B0B2EBB68736C76B02164C41204734B731DF4C00C937CFB49D4648A7808A34E6162526240AB221071C6C2669DB4787AF7D516F4E72EF81C7D907A37634E8CEC5BF4B3502A6A05224B269B29A8E44603DB2A890F9B64BC94AEC7D2923DC52985CC18E123C7D6CC3DEF885725E0BD2D3EC0466DBE2E94350368068E5FC1CFB6BAC40F47600EB8520A8E29E855D96B556002207CA234BE3620189767ED74ABA3D1A1CF3F66864312B7502C37C9543A36F24FD38A25137128FFE4C6CC7C078AEF1F799DA7F3E3BA0E19F21A707E66EE95189BDD74EDF32E0F18052384A2A180D90545EF1B9F2710074BC8AED5F7625C0851C34E9F3AE5C57BE65862CEE2891052CC442574EBFAAE1BEC7AB63F25C80951AD65A41089DE526946D858146E446FCAD6915BD59B0D112255083A711279990F87453A6D8F7D057055217F474E4ED7847
-20241203020245 2 6 100 8191 5 C3301F39F3E2DCD097FBF5454401BF52BF4745AFD35F3DEBDFB34DE2518B0F7BB10DE2FDBE6C35E1B63AA67E9FC179EB3DB8A0FA7E01618BB625B3EC326A001A253FB737B2461999BAB5A5FBCA4AFAD88A8BCBEB5990D4E25225F203B2CE75A3A1C23BFFD78E697275BDB6B6153AA3C21D2063047D44EDDF0483220CD672280D4D67C4726EA476A5C094B7E8DBE62B760EBA6B62C200D456A99E87875B4B2FFF4AA87661D89CAF8CA36D9CE00E0C3BDA443B7CCC3EA892F524AD10DD6960196EC4497E1DDC9F5C13BAED9A8F240196633AB9EC597D0A2FFEEE9320147E73FB295039605EA79376C00D1C60EB421D1BF2BD36A9B68A32E5F5003F0C984E1A57B3C8A261E451D912FCBF27924078BAB0879F85B78D097B2651A17AD9266B39E7AF73DAE54319B2902E0A0D11653B38EDA14B9DE8431E9382AC7EF5F1705C05239DDEA7F533234FA640D2E1EE392D23BF46D57D6FD0E167174E6242F5455DC299BB03BF2EBAEDB14539E9025B84BF66C185AD45C6B1FBF47E3C17D4A1F2C99DCA7151039D71DB7BD2E025E67C2ABB9A2DE6D9C5150651385B270511AA50E8728707B1E0920F3A83DEC0F733090CE96DCACDB93CD756AB1F572DA2BBF4908C17E905848C09CF31424833D1D4894FCB6BD93162EC74E836A523E97F35152EBA28AF63DEC47A32C09E0F0451A4D60949C8CDB07642F5A705075F4A1380B327596C319A135C9C43BBAF2D25C90030BA43FC55701B2854ABFEA710D98AFB8341E46778616A9E9B31CF11652B47A76A99F096BDB35C9CFA78E47CFC980E5E8683E1E13AA3FCA5171C07B5E27C1A5002C02643DC760431C2750A29E838F6ED5A892146D8015F5879DA988DF030BB2FA4D501FB7F0AD9A82ED3C48B70979428C39DB04116DCC8337567B6DB4A0DFE0C704B3F46983BBF092847AED87699EE88AEB27756850D008583CD37FC8521968EB1D17FC42D742B7E6756303412A3AD011DD5CE2BA1A4E3B0B2EBB68736C76B02164C41204734B731DF4C00C937CFB49D4648A7808A34E6162526240AB221071C6C2669DB4787AF7D516F4E72EF81C7D907A37634E8CEC5BF4B3502A6A05224B269B29A8E44603DB2A890F9B64BC94AEC7D2923DC52985CC18E123C7D6CC3DEF885725E0BD2D3EC0466DBE2E94350368068E5FC1CFB6BAC40F47600EB8520A8E29E855D96B556002207CA234BE3620189767ED74ABA3D1A1CF3F66864312B7502C37C9543A36F24FD38A25137128FFE4C6CC7C078AEF1F799DA7F3E3BA0E19F21A707E66EE95189BDD74EDF32E0F18052384A2A180D90545EF1B9F2710074BC8AED5F7625C0851C34E9F3AE5C57BE65862CEE2891052CC442574EBFAAE1BEC7AB63F25C80951AD65A41089DE526946D858146E446FCAD6915BD59B0D112255083A711279990F87453A6D8F7D057055217F474EC649497
-20241203022338 2 6 100 8191 5 C3301F39F3E2DCD097FBF5454401BF52BF4745AFD35F3DEBDFB34DE2518B0F7BB10DE2FDBE6C35E1B63AA67E9FC179EB3DB8A0FA7E01618BB625B3EC326A001A253FB737B2461999BAB5A5FBCA4AFAD88A8BCBEB5990D4E25225F203B2CE75A3A1C23BFFD78E697275BDB6B6153AA3C21D2063047D44EDDF0483220CD672280D4D67C4726EA476A5C094B7E8DBE62B760EBA6B62C200D456A99E87875B4B2FFF4AA87661D89CAF8CA36D9CE00E0C3BDA443B7CCC3EA892F524AD10DD6960196EC4497E1DDC9F5C13BAED9A8F240196633AB9EC597D0A2FFEEE9320147E73FB295039605EA79376C00D1C60EB421D1BF2BD36A9B68A32E5F5003F0C984E1A57B3C8A261E451D912FCBF27924078BAB0879F85B78D097B2651A17AD9266B39E7AF73DAE54319B2902E0A0D11653B38EDA14B9DE8431E9382AC7EF5F1705C05239DDEA7F533234FA640D2E1EE392D23BF46D57D6FD0E167174E6242F5455DC299BB03BF2EBAEDB14539E9025B84BF66C185AD45C6B1FBF47E3C17D4A1F2C99DCA7151039D71DB7BD2E025E67C2ABB9A2DE6D9C5150651385B270511AA50E8728707B1E0920F3A83DEC0F733090CE96DCACDB93CD756AB1F572DA2BBF4908C17E905848C09CF31424833D1D4894FCB6BD93162EC74E836A523E97F35152EBA28AF63DEC47A32C09E0F0451A4D60949C8CDB07642F5A705075F4A1380B327596C319A135C9C43BBAF2D25C90030BA43FC55701B2854ABFEA710D98AFB8341E46778616A9E9B31CF11652B47A76A99F096BDB35C9CFA78E47CFC980E5E8683E1E13AA3FCA5171C07B5E27C1A5002C02643DC760431C2750A29E838F6ED5A892146D8015F5879DA988DF030BB2FA4D501FB7F0AD9A82ED3C48B70979428C39DB04116DCC8337567B6DB4A0DFE0C704B3F46983BBF092847AED87699EE88AEB27756850D008583CD37FC8521968EB1D17FC42D742B7E6756303412A3AD011DD5CE2BA1A4E3B0B2EBB68736C76B02164C41204734B731DF4C00C937CFB49D4648A7808A34E6162526240AB221071C6C2669DB4787AF7D516F4E72EF81C7D907A37634E8CEC5BF4B3502A6A05224B269B29A8E44603DB2A890F9B64BC94AEC7D2923DC52985CC18E123C7D6CC3DEF885725E0BD2D3EC0466DBE2E94350368068E5FC1CFB6BAC40F47600EB8520A8E29E855D96B556002207CA234BE3620189767ED74ABA3D1A1CF3F66864312B7502C37C9543A36F24FD38A25137128FFE4C6CC7C078AEF1F799DA7F3E3BA0E19F21A707E66EE95189BDD74EDF32E0F18052384A2A180D90545EF1B9F2710074BC8AED5F7625C0851C34E9F3AE5C57BE65862CEE2891052CC442574EBFAAE1BEC7AB63F25C80951AD65A41089DE526946D858146E446FCAD6915BD59B0D112255083A711279990F87453A6D8F7D057055217F474ED8847BF
-20241203022652 2 6 100 8191 2 C3301F39F3E2DCD097FBF5454401BF52BF4745AFD35F3DEBDFB34DE2518B0F7BB10DE2FDBE6C35E1B63AA67E9FC179EB3DB8A0FA7E01618BB625B3EC326A001A253FB737B2461999BAB5A5FBCA4AFAD88A8BCBEB5990D4E25225F203B2CE75A3A1C23BFFD78E697275BDB6B6153AA3C21D2063047D44EDDF0483220CD672280D4D67C4726EA476A5C094B7E8DBE62B760EBA6B62C200D456A99E87875B4B2FFF4AA87661D89CAF8CA36D9CE00E0C3BDA443B7CCC3EA892F524AD10DD6960196EC4497E1DDC9F5C13BAED9A8F240196633AB9EC597D0A2FFEEE9320147E73FB295039605EA79376C00D1C60EB421D1BF2BD36A9B68A32E5F5003F0C984E1A57B3C8A261E451D912FCBF27924078BAB0879F85B78D097B2651A17AD9266B39E7AF73DAE54319B2902E0A0D11653B38EDA14B9DE8431E9382AC7EF5F1705C05239DDEA7F533234FA640D2E1EE392D23BF46D57D6FD0E167174E6242F5455DC299BB03BF2EBAEDB14539E9025B84BF66C185AD45C6B1FBF47E3C17D4A1F2C99DCA7151039D71DB7BD2E025E67C2ABB9A2DE6D9C5150651385B270511AA50E8728707B1E0920F3A83DEC0F733090CE96DCACDB93CD756AB1F572DA2BBF4908C17E905848C09CF31424833D1D4894FCB6BD93162EC74E836A523E97F35152EBA28AF63DEC47A32C09E0F0451A4D60949C8CDB07642F5A705075F4A1380B327596C319A135C9C43BBAF2D25C90030BA43FC55701B2854ABFEA710D98AFB8341E46778616A9E9B31CF11652B47A76A99F096BDB35C9CFA78E47CFC980E5E8683E1E13AA3FCA5171C07B5E27C1A5002C02643DC760431C2750A29E838F6ED5A892146D8015F5879DA988DF030BB2FA4D501FB7F0AD9A82ED3C48B70979428C39DB04116DCC8337567B6DB4A0DFE0C704B3F46983BBF092847AED87699EE88AEB27756850D008583CD37FC8521968EB1D17FC42D742B7E6756303412A3AD011DD5CE2BA1A4E3B0B2EBB68736C76B02164C41204734B731DF4C00C937CFB49D4648A7808A34E6162526240AB221071C6C2669DB4787AF7D516F4E72EF81C7D907A37634E8CEC5BF4B3502A6A05224B269B29A8E44603DB2A890F9B64BC94AEC7D2923DC52985CC18E123C7D6CC3DEF885725E0BD2D3EC0466DBE2E94350368068E5FC1CFB6BAC40F47600EB8520A8E29E855D96B556002207CA234BE3620189767ED74ABA3D1A1CF3F66864312B7502C37C9543A36F24FD38A25137128FFE4C6CC7C078AEF1F799DA7F3E3BA0E19F21A707E66EE95189BDD74EDF32E0F18052384A2A180D90545EF1B9F2710074BC8AED5F7625C0851C34E9F3AE5C57BE65862CEE2891052CC442574EBFAAE1BEC7AB63F25C80951AD65A41089DE526946D858146E446FCAD6915BD59B0D112255083A711279990F87453A6D8F7D057055217F474EDAC6223
-20241203031204 2 6 100 8191 2 C3301F39F3E2DCD097FBF5454401BF52BF4745AFD35F3DEBDFB34DE2518B0F7BB10DE2FDBE6C35E1B63AA67E9FC179EB3DB8A0FA7E01618BB625B3EC326A001A253FB737B2461999BAB5A5FBCA4AFAD88A8BCBEB5990D4E25225F203B2CE75A3A1C23BFFD78E697275BDB6B6153AA3C21D2063047D44EDDF0483220CD672280D4D67C4726EA476A5C094B7E8DBE62B760EBA6B62C200D456A99E87875B4B2FFF4AA87661D89CAF8CA36D9CE00E0C3BDA443B7CCC3EA892F524AD10DD6960196EC4497E1DDC9F5C13BAED9A8F240196633AB9EC597D0A2FFEEE9320147E73FB295039605EA79376C00D1C60EB421D1BF2BD36A9B68A32E5F5003F0C984E1A57B3C8A261E451D912FCBF27924078BAB0879F85B78D097B2651A17AD9266B39E7AF73DAE54319B2902E0A0D11653B38EDA14B9DE8431E9382AC7EF5F1705C05239DDEA7F533234FA640D2E1EE392D23BF46D57D6FD0E167174E6242F5455DC299BB03BF2EBAEDB14539E9025B84BF66C185AD45C6B1FBF47E3C17D4A1F2C99DCA7151039D71DB7BD2E025E67C2ABB9A2DE6D9C5150651385B270511AA50E8728707B1E0920F3A83DEC0F733090CE96DCACDB93CD756AB1F572DA2BBF4908C17E905848C09CF31424833D1D4894FCB6BD93162EC74E836A523E97F35152EBA28AF63DEC47A32C09E0F0451A4D60949C8CDB07642F5A705075F4A1380B327596C319A135C9C43BBAF2D25C90030BA43FC55701B2854ABFEA710D98AFB8341E46778616A9E9B31CF11652B47A76A99F096BDB35C9CFA78E47CFC980E5E8683E1E13AA3FCA5171C07B5E27C1A5002C02643DC760431C2750A29E838F6ED5A892146D8015F5879DA988DF030BB2FA4D501FB7F0AD9A82ED3C48B70979428C39DB04116DCC8337567B6DB4A0DFE0C704B3F46983BBF092847AED87699EE88AEB27756850D008583CD37FC8521968EB1D17FC42D742B7E6756303412A3AD011DD5CE2BA1A4E3B0B2EBB68736C76B02164C41204734B731DF4C00C937CFB49D4648A7808A34E6162526240AB221071C6C2669DB4787AF7D516F4E72EF81C7D907A37634E8CEC5BF4B3502A6A05224B269B29A8E44603DB2A890F9B64BC94AEC7D2923DC52985CC18E123C7D6CC3DEF885725E0BD2D3EC0466DBE2E94350368068E5FC1CFB6BAC40F47600EB8520A8E29E855D96B556002207CA234BE3620189767ED74ABA3D1A1CF3F66864312B7502C37C9543A36F24FD38A25137128FFE4C6CC7C078AEF1F799DA7F3E3BA0E19F21A707E66EE95189BDD74EDF32E0F18052384A2A180D90545EF1B9F2710074BC8AED5F7625C0851C34E9F3AE5C57BE65862CEE2891052CC442574EBFAAE1BEC7AB63F25C80951AD65A41089DE526946D858146E446FCAD6915BD59B0D112255083A711279990F87453A6D8F7D057055217F474F0205823
-20241203043100 2 6 100 8191 2 C3301F39F3E2DCD097FBF5454401BF52BF4745AFD35F3DEBDFB34DE2518B0F7BB10DE2FDBE6C35E1B63AA67E9FC179EB3DB8A0FA7E01618BB625B3EC326A001A253FB737B2461999BAB5A5FBCA4AFAD88A8BCBEB5990D4E25225F203B2CE75A3A1C23BFFD78E697275BDB6B6153AA3C21D2063047D44EDDF0483220CD672280D4D67C4726EA476A5C094B7E8DBE62B760EBA6B62C200D456A99E87875B4B2FFF4AA87661D89CAF8CA36D9CE00E0C3BDA443B7CCC3EA892F524AD10DD6960196EC4497E1DDC9F5C13BAED9A8F240196633AB9EC597D0A2FFEEE9320147E73FB295039605EA79376C00D1C60EB421D1BF2BD36A9B68A32E5F5003F0C984E1A57B3C8A261E451D912FCBF27924078BAB0879F85B78D097B2651A17AD9266B39E7AF73DAE54319B2902E0A0D11653B38EDA14B9DE8431E9382AC7EF5F1705C05239DDEA7F533234FA640D2E1EE392D23BF46D57D6FD0E167174E6242F5455DC299BB03BF2EBAEDB14539E9025B84BF66C185AD45C6B1FBF47E3C17D4A1F2C99DCA7151039D71DB7BD2E025E67C2ABB9A2DE6D9C5150651385B270511AA50E8728707B1E0920F3A83DEC0F733090CE96DCACDB93CD756AB1F572DA2BBF4908C17E905848C09CF31424833D1D4894FCB6BD93162EC74E836A523E97F35152EBA28AF63DEC47A32C09E0F0451A4D60949C8CDB07642F5A705075F4A1380B327596C319A135C9C43BBAF2D25C90030BA43FC55701B2854ABFEA710D98AFB8341E46778616A9E9B31CF11652B47A76A99F096BDB35C9CFA78E47CFC980E5E8683E1E13AA3FCA5171C07B5E27C1A5002C02643DC760431C2750A29E838F6ED5A892146D8015F5879DA988DF030BB2FA4D501FB7F0AD9A82ED3C48B70979428C39DB04116DCC8337567B6DB4A0DFE0C704B3F46983BBF092847AED87699EE88AEB27756850D008583CD37FC8521968EB1D17FC42D742B7E6756303412A3AD011DD5CE2BA1A4E3B0B2EBB68736C76B02164C41204734B731DF4C00C937CFB49D4648A7808A34E6162526240AB221071C6C2669DB4787AF7D516F4E72EF81C7D907A37634E8CEC5BF4B3502A6A05224B269B29A8E44603DB2A890F9B64BC94AEC7D2923DC52985CC18E123C7D6CC3DEF885725E0BD2D3EC0466DBE2E94350368068E5FC1CFB6BAC40F47600EB8520A8E29E855D96B556002207CA234BE3620189767ED74ABA3D1A1CF3F66864312B7502C37C9543A36F24FD38A25137128FFE4C6CC7C078AEF1F799DA7F3E3BA0E19F21A707E66EE95189BDD74EDF32E0F18052384A2A180D90545EF1B9F2710074BC8AED5F7625C0851C34E9F3AE5C57BE65862CEE2891052CC442574EBFAAE1BEC7AB63F25C80951AD65A41089DE526946D858146E446FCAD6915BD59B0D112255083A711279990F87453A6D8F7D057055217F474F484158B
-20241203044332 2 6 100 8191 2 C3301F39F3E2DCD097FBF5454401BF52BF4745AFD35F3DEBDFB34DE2518B0F7BB10DE2FDBE6C35E1B63AA67E9FC179EB3DB8A0FA7E01618BB625B3EC326A001A253FB737B2461999BAB5A5FBCA4AFAD88A8BCBEB5990D4E25225F203B2CE75A3A1C23BFFD78E697275BDB6B6153AA3C21D2063047D44EDDF0483220CD672280D4D67C4726EA476A5C094B7E8DBE62B760EBA6B62C200D456A99E87875B4B2FFF4AA87661D89CAF8CA36D9CE00E0C3BDA443B7CCC3EA892F524AD10DD6960196EC4497E1DDC9F5C13BAED9A8F240196633AB9EC597D0A2FFEEE9320147E73FB295039605EA79376C00D1C60EB421D1BF2BD36A9B68A32E5F5003F0C984E1A57B3C8A261E451D912FCBF27924078BAB0879F85B78D097B2651A17AD9266B39E7AF73DAE54319B2902E0A0D11653B38EDA14B9DE8431E9382AC7EF5F1705C05239DDEA7F533234FA640D2E1EE392D23BF46D57D6FD0E167174E6242F5455DC299BB03BF2EBAEDB14539E9025B84BF66C185AD45C6B1FBF47E3C17D4A1F2C99DCA7151039D71DB7BD2E025E67C2ABB9A2DE6D9C5150651385B270511AA50E8728707B1E0920F3A83DEC0F733090CE96DCACDB93CD756AB1F572DA2BBF4908C17E905848C09CF31424833D1D4894FCB6BD93162EC74E836A523E97F35152EBA28AF63DEC47A32C09E0F0451A4D60949C8CDB07642F5A705075F4A1380B327596C319A135C9C43BBAF2D25C90030BA43FC55701B2854ABFEA710D98AFB8341E46778616A9E9B31CF11652B47A76A99F096BDB35C9CFA78E47CFC980E5E8683E1E13AA3FCA5171C07B5E27C1A5002C02643DC760431C2750A29E838F6ED5A892146D8015F5879DA988DF030BB2FA4D501FB7F0AD9A82ED3C48B70979428C39DB04116DCC8337567B6DB4A0DFE0C704B3F46983BBF092847AED87699EE88AEB27756850D008583CD37FC8521968EB1D17FC42D742B7E6756303412A3AD011DD5CE2BA1A4E3B0B2EBB68736C76B02164C41204734B731DF4C00C937CFB49D4648A7808A34E6162526240AB221071C6C2669DB4787AF7D516F4E72EF81C7D907A37634E8CEC5BF4B3502A6A05224B269B29A8E44603DB2A890F9B64BC94AEC7D2923DC52985CC18E123C7D6CC3DEF885725E0BD2D3EC0466DBE2E94350368068E5FC1CFB6BAC40F47600EB8520A8E29E855D96B556002207CA234BE3620189767ED74ABA3D1A1CF3F66864312B7502C37C9543A36F24FD38A25137128FFE4C6CC7C078AEF1F799DA7F3E3BA0E19F21A707E66EE95189BDD74EDF32E0F18052384A2A180D90545EF1B9F2710074BC8AED5F7625C0851C34E9F3AE5C57BE65862CEE2891052CC442574EBFAAE1BEC7AB63F25C80951AD65A41089DE526946D858146E446FCAD6915BD59B0D112255083A711279990F87453A6D8F7D057055217F474F537BA23
-20241203051425 2 6 100 8191 2 C3301F39F3E2DCD097FBF5454401BF52BF4745AFD35F3DEBDFB34DE2518B0F7BB10DE2FDBE6C35E1B63AA67E9FC179EB3DB8A0FA7E01618BB625B3EC326A001A253FB737B2461999BAB5A5FBCA4AFAD88A8BCBEB5990D4E25225F203B2CE75A3A1C23BFFD78E697275BDB6B6153AA3C21D2063047D44EDDF0483220CD672280D4D67C4726EA476A5C094B7E8DBE62B760EBA6B62C200D456A99E87875B4B2FFF4AA87661D89CAF8CA36D9CE00E0C3BDA443B7CCC3EA892F524AD10DD6960196EC4497E1DDC9F5C13BAED9A8F240196633AB9EC597D0A2FFEEE9320147E73FB295039605EA79376C00D1C60EB421D1BF2BD36A9B68A32E5F5003F0C984E1A57B3C8A261E451D912FCBF27924078BAB0879F85B78D097B2651A17AD9266B39E7AF73DAE54319B2902E0A0D11653B38EDA14B9DE8431E9382AC7EF5F1705C05239DDEA7F533234FA640D2E1EE392D23BF46D57D6FD0E167174E6242F5455DC299BB03BF2EBAEDB14539E9025B84BF66C185AD45C6B1FBF47E3C17D4A1F2C99DCA7151039D71DB7BD2E025E67C2ABB9A2DE6D9C5150651385B270511AA50E8728707B1E0920F3A83DEC0F733090CE96DCACDB93CD756AB1F572DA2BBF4908C17E905848C09CF31424833D1D4894FCB6BD93162EC74E836A523E97F35152EBA28AF63DEC47A32C09E0F0451A4D60949C8CDB07642F5A705075F4A1380B327596C319A135C9C43BBAF2D25C90030BA43FC55701B2854ABFEA710D98AFB8341E46778616A9E9B31CF11652B47A76A99F096BDB35C9CFA78E47CFC980E5E8683E1E13AA3FCA5171C07B5E27C1A5002C02643DC760431C2750A29E838F6ED5A892146D8015F5879DA988DF030BB2FA4D501FB7F0AD9A82ED3C48B70979428C39DB04116DCC8337567B6DB4A0DFE0C704B3F46983BBF092847AED87699EE88AEB27756850D008583CD37FC8521968EB1D17FC42D742B7E6756303412A3AD011DD5CE2BA1A4E3B0B2EBB68736C76B02164C41204734B731DF4C00C937CFB49D4648A7808A34E6162526240AB221071C6C2669DB4787AF7D516F4E72EF81C7D907A37634E8CEC5BF4B3502A6A05224B269B29A8E44603DB2A890F9B64BC94AEC7D2923DC52985CC18E123C7D6CC3DEF885725E0BD2D3EC0466DBE2E94350368068E5FC1CFB6BAC40F47600EB8520A8E29E855D96B556002207CA234BE3620189767ED74ABA3D1A1CF3F66864312B7502C37C9543A36F24FD38A25137128FFE4C6CC7C078AEF1F799DA7F3E3BA0E19F21A707E66EE95189BDD74EDF32E0F18052384A2A180D90545EF1B9F2710074BC8AED5F7625C0851C34E9F3AE5C57BE65862CEE2891052CC442574EBFAAE1BEC7AB63F25C80951AD65A41089DE526946D858146E446FCAD6915BD59B0D112255083A711279990F87453A6D8F7D057055217F474F6E6415B
-20241203055801 2 6 100 8191 5 C3301F39F3E2DCD097FBF5454401BF52BF4745AFD35F3DEBDFB34DE2518B0F7BB10DE2FDBE6C35E1B63AA67E9FC179EB3DB8A0FA7E01618BB625B3EC326A001A253FB737B2461999BAB5A5FBCA4AFAD88A8BCBEB5990D4E25225F203B2CE75A3A1C23BFFD78E697275BDB6B6153AA3C21D2063047D44EDDF0483220CD672280D4D67C4726EA476A5C094B7E8DBE62B760EBA6B62C200D456A99E87875B4B2FFF4AA87661D89CAF8CA36D9CE00E0C3BDA443B7CCC3EA892F524AD10DD6960196EC4497E1DDC9F5C13BAED9A8F240196633AB9EC597D0A2FFEEE9320147E73FB295039605EA79376C00D1C60EB421D1BF2BD36A9B68A32E5F5003F0C984E1A57B3C8A261E451D912FCBF27924078BAB0879F85B78D097B2651A17AD9266B39E7AF73DAE54319B2902E0A0D11653B38EDA14B9DE8431E9382AC7EF5F1705C05239DDEA7F533234FA640D2E1EE392D23BF46D57D6FD0E167174E6242F5455DC299BB03BF2EBAEDB14539E9025B84BF66C185AD45C6B1FBF47E3C17D4A1F2C99DCA7151039D71DB7BD2E025E67C2ABB9A2DE6D9C5150651385B270511AA50E8728707B1E0920F3A83DEC0F733090CE96DCACDB93CD756AB1F572DA2BBF4908C17E905848C09CF31424833D1D4894FCB6BD93162EC74E836A523E97F35152EBA28AF63DEC47A32C09E0F0451A4D60949C8CDB07642F5A705075F4A1380B327596C319A135C9C43BBAF2D25C90030BA43FC55701B2854ABFEA710D98AFB8341E46778616A9E9B31CF11652B47A76A99F096BDB35C9CFA78E47CFC980E5E8683E1E13AA3FCA5171C07B5E27C1A5002C02643DC760431C2750A29E838F6ED5A892146D8015F5879DA988DF030BB2FA4D501FB7F0AD9A82ED3C48B70979428C39DB04116DCC8337567B6DB4A0DFE0C704B3F46983BBF092847AED87699EE88AEB27756850D008583CD37FC8521968EB1D17FC42D742B7E6756303412A3AD011DD5CE2BA1A4E3B0B2EBB68736C76B02164C41204734B731DF4C00C937CFB49D4648A7808A34E6162526240AB221071C6C2669DB4787AF7D516F4E72EF81C7D907A37634E8CEC5BF4B3502A6A05224B269B29A8E44603DB2A890F9B64BC94AEC7D2923DC52985CC18E123C7D6CC3DEF885725E0BD2D3EC0466DBE2E94350368068E5FC1CFB6BAC40F47600EB8520A8E29E855D96B556002207CA234BE3620189767ED74ABA3D1A1CF3F66864312B7502C37C9543A36F24FD38A25137128FFE4C6CC7C078AEF1F799DA7F3E3BA0E19F21A707E66EE95189BDD74EDF32E0F18052384A2A180D90545EF1B9F2710074BC8AED5F7625C0851C34E9F3AE5C57BE65862CEE2891052CC442574EBFAAE1BEC7AB63F25C80951AD65A41089DE526946D858146E446FCAD6915BD59B0D112255083A711279990F87453A6D8F7D057055217F474F953468F
-20241203062624 2 6 100 8191 5 C3301F39F3E2DCD097FBF5454401BF52BF4745AFD35F3DEBDFB34DE2518B0F7BB10DE2FDBE6C35E1B63AA67E9FC179EB3DB8A0FA7E01618BB625B3EC326A001A253FB737B2461999BAB5A5FBCA4AFAD88A8BCBEB5990D4E25225F203B2CE75A3A1C23BFFD78E697275BDB6B6153AA3C21D2063047D44EDDF0483220CD672280D4D67C4726EA476A5C094B7E8DBE62B760EBA6B62C200D456A99E87875B4B2FFF4AA87661D89CAF8CA36D9CE00E0C3BDA443B7CCC3EA892F524AD10DD6960196EC4497E1DDC9F5C13BAED9A8F240196633AB9EC597D0A2FFEEE9320147E73FB295039605EA79376C00D1C60EB421D1BF2BD36A9B68A32E5F5003F0C984E1A57B3C8A261E451D912FCBF27924078BAB0879F85B78D097B2651A17AD9266B39E7AF73DAE54319B2902E0A0D11653B38EDA14B9DE8431E9382AC7EF5F1705C05239DDEA7F533234FA640D2E1EE392D23BF46D57D6FD0E167174E6242F5455DC299BB03BF2EBAEDB14539E9025B84BF66C185AD45C6B1FBF47E3C17D4A1F2C99DCA7151039D71DB7BD2E025E67C2ABB9A2DE6D9C5150651385B270511AA50E8728707B1E0920F3A83DEC0F733090CE96DCACDB93CD756AB1F572DA2BBF4908C17E905848C09CF31424833D1D4894FCB6BD93162EC74E836A523E97F35152EBA28AF63DEC47A32C09E0F0451A4D60949C8CDB07642F5A705075F4A1380B327596C319A135C9C43BBAF2D25C90030BA43FC55701B2854ABFEA710D98AFB8341E46778616A9E9B31CF11652B47A76A99F096BDB35C9CFA78E47CFC980E5E8683E1E13AA3FCA5171C07B5E27C1A5002C02643DC760431C2750A29E838F6ED5A892146D8015F5879DA988DF030BB2FA4D501FB7F0AD9A82ED3C48B70979428C39DB04116DCC8337567B6DB4A0DFE0C704B3F46983BBF092847AED87699EE88AEB27756850D008583CD37FC8521968EB1D17FC42D742B7E6756303412A3AD011DD5CE2BA1A4E3B0B2EBB68736C76B02164C41204734B731DF4C00C937CFB49D4648A7808A34E6162526240AB221071C6C2669DB4787AF7D516F4E72EF81C7D907A37634E8CEC5BF4B3502A6A05224B269B29A8E44603DB2A890F9B64BC94AEC7D2923DC52985CC18E123C7D6CC3DEF885725E0BD2D3EC0466DBE2E94350368068E5FC1CFB6BAC40F47600EB8520A8E29E855D96B556002207CA234BE3620189767ED74ABA3D1A1CF3F66864312B7502C37C9543A36F24FD38A25137128FFE4C6CC7C078AEF1F799DA7F3E3BA0E19F21A707E66EE95189BDD74EDF32E0F18052384A2A180D90545EF1B9F2710074BC8AED5F7625C0851C34E9F3AE5C57BE65862CEE2891052CC442574EBFAAE1BEC7AB63F25C80951AD65A41089DE526946D858146E446FCAD6915BD59B0D112255083A711279990F87453A6D8F7D057055217F474FAD661D7
-20241203075312 2 6 100 8191 2 C3301F39F3E2DCD097FBF5454401BF52BF4745AFD35F3DEBDFB34DE2518B0F7BB10DE2FDBE6C35E1B63AA67E9FC179EB3DB8A0FA7E01618BB625B3EC326A001A253FB737B2461999BAB5A5FBCA4AFAD88A8BCBEB5990D4E25225F203B2CE75A3A1C23BFFD78E697275BDB6B6153AA3C21D2063047D44EDDF0483220CD672280D4D67C4726EA476A5C094B7E8DBE62B760EBA6B62C200D456A99E87875B4B2FFF4AA87661D89CAF8CA36D9CE00E0C3BDA443B7CCC3EA892F524AD10DD6960196EC4497E1DDC9F5C13BAED9A8F240196633AB9EC597D0A2FFEEE9320147E73FB295039605EA79376C00D1C60EB421D1BF2BD36A9B68A32E5F5003F0C984E1A57B3C8A261E451D912FCBF27924078BAB0879F85B78D097B2651A17AD9266B39E7AF73DAE54319B2902E0A0D11653B38EDA14B9DE8431E9382AC7EF5F1705C05239DDEA7F533234FA640D2E1EE392D23BF46D57D6FD0E167174E6242F5455DC299BB03BF2EBAEDB14539E9025B84BF66C185AD45C6B1FBF47E3C17D4A1F2C99DCA7151039D71DB7BD2E025E67C2ABB9A2DE6D9C5150651385B270511AA50E8728707B1E0920F3A83DEC0F733090CE96DCACDB93CD756AB1F572DA2BBF4908C17E905848C09CF31424833D1D4894FCB6BD93162EC74E836A523E97F35152EBA28AF63DEC47A32C09E0F0451A4D60949C8CDB07642F5A705075F4A1380B327596C319A135C9C43BBAF2D25C90030BA43FC55701B2854ABFEA710D98AFB8341E46778616A9E9B31CF11652B47A76A99F096BDB35C9CFA78E47CFC980E5E8683E1E13AA3FCA5171C07B5E27C1A5002C02643DC760431C2750A29E838F6ED5A892146D8015F5879DA988DF030BB2FA4D501FB7F0AD9A82ED3C48B70979428C39DB04116DCC8337567B6DB4A0DFE0C704B3F46983BBF092847AED87699EE88AEB27756850D008583CD37FC8521968EB1D17FC42D742B7E6756303412A3AD011DD5CE2BA1A4E3B0B2EBB68736C76B02164C41204734B731DF4C00C937CFB49D4648A7808A34E6162526240AB221071C6C2669DB4787AF7D516F4E72EF81C7D907A37634E8CEC5BF4B3502A6A05224B269B29A8E44603DB2A890F9B64BC94AEC7D2923DC52985CC18E123C7D6CC3DEF885725E0BD2D3EC0466DBE2E94350368068E5FC1CFB6BAC40F47600EB8520A8E29E855D96B556002207CA234BE3620189767ED74ABA3D1A1CF3F66864312B7502C37C9543A36F24FD38A25137128FFE4C6CC7C078AEF1F799DA7F3E3BA0E19F21A707E66EE95189BDD74EDF32E0F18052384A2A180D90545EF1B9F2710074BC8AED5F7625C0851C34E9F3AE5C57BE65862CEE2891052CC442574EBFAAE1BEC7AB63F25C80951AD65A41089DE526946D858146E446FCAD6915BD59B0D112255083A711279990F87453A6D8F7D057055217F474FFA46B5B
-20241203095857 2 6 100 8191 2 C3301F39F3E2DCD097FBF5454401BF52BF4745AFD35F3DEBDFB34DE2518B0F7BB10DE2FDBE6C35E1B63AA67E9FC179EB3DB8A0FA7E01618BB625B3EC326A001A253FB737B2461999BAB5A5FBCA4AFAD88A8BCBEB5990D4E25225F203B2CE75A3A1C23BFFD78E697275BDB6B6153AA3C21D2063047D44EDDF0483220CD672280D4D67C4726EA476A5C094B7E8DBE62B760EBA6B62C200D456A99E87875B4B2FFF4AA87661D89CAF8CA36D9CE00E0C3BDA443B7CCC3EA892F524AD10DD6960196EC4497E1DDC9F5C13BAED9A8F240196633AB9EC597D0A2FFEEE9320147E73FB295039605EA79376C00D1C60EB421D1BF2BD36A9B68A32E5F5003F0C984E1A57B3C8A261E451D912FCBF27924078BAB0879F85B78D097B2651A17AD9266B39E7AF73DAE54319B2902E0A0D11653B38EDA14B9DE8431E9382AC7EF5F1705C05239DDEA7F533234FA640D2E1EE392D23BF46D57D6FD0E167174E6242F5455DC299BB03BF2EBAEDB14539E9025B84BF66C185AD45C6B1FBF47E3C17D4A1F2C99DCA7151039D71DB7BD2E025E67C2ABB9A2DE6D9C5150651385B270511AA50E8728707B1E0920F3A83DEC0F733090CE96DCACDB93CD756AB1F572DA2BBF4908C17E905848C09CF31424833D1D4894FCB6BD93162EC74E836A523E97F35152EBA28AF63DEC47A32C09E0F0451A4D60949C8CDB07642F5A705075F4A1380B327596C319A135C9C43BBAF2D25C90030BA43FC55701B2854ABFEA710D98AFB8341E46778616A9E9B31CF11652B47A76A99F096BDB35C9CFA78E47CFC980E5E8683E1E13AA3FCA5171C07B5E27C1A5002C02643DC760431C2750A29E838F6ED5A892146D8015F5879DA988DF030BB2FA4D501FB7F0AD9A82ED3C48B70979428C39DB04116DCC8337567B6DB4A0DFE0C704B3F46983BBF092847AED87699EE88AEB27756850D008583CD37FC8521968EB1D17FC42D742B7E6756303412A3AD011DD5CE2BA1A4E3B0B2EBB68736C76B02164C41204734B731DF4C00C937CFB49D4648A7808A34E6162526240AB221071C6C2669DB4787AF7D516F4E72EF81C7D907A37634E8CEC5BF4B3502A6A05224B269B29A8E44603DB2A890F9B64BC94AEC7D2923DC52985CC18E123C7D6CC3DEF885725E0BD2D3EC0466DBE2E94350368068E5FC1CFB6BAC40F47600EB8520A8E29E855D96B556002207CA234BE3620189767ED74ABA3D1A1CF3F66864312B7502C37C9543A36F24FD38A25137128FFE4C6CC7C078AEF1F799DA7F3E3BA0E19F21A707E66EE95189BDD74EDF32E0F18052384A2A180D90545EF1B9F2710074BC8AED5F7625C0851C34E9F3AE5C57BE65862CEE2891052CC442574EBFAAE1BEC7AB63F25C80951AD65A41089DE526946D858146E446FCAD6915BD59B0D112255083A711279990F87453A6D8F7D057055217F4750696836B
-20241203111915 2 6 100 8191 2 C3301F39F3E2DCD097FBF5454401BF52BF4745AFD35F3DEBDFB34DE2518B0F7BB10DE2FDBE6C35E1B63AA67E9FC179EB3DB8A0FA7E01618BB625B3EC326A001A253FB737B2461999BAB5A5FBCA4AFAD88A8BCBEB5990D4E25225F203B2CE75A3A1C23BFFD78E697275BDB6B6153AA3C21D2063047D44EDDF0483220CD672280D4D67C4726EA476A5C094B7E8DBE62B760EBA6B62C200D456A99E87875B4B2FFF4AA87661D89CAF8CA36D9CE00E0C3BDA443B7CCC3EA892F524AD10DD6960196EC4497E1DDC9F5C13BAED9A8F240196633AB9EC597D0A2FFEEE9320147E73FB295039605EA79376C00D1C60EB421D1BF2BD36A9B68A32E5F5003F0C984E1A57B3C8A261E451D912FCBF27924078BAB0879F85B78D097B2651A17AD9266B39E7AF73DAE54319B2902E0A0D11653B38EDA14B9DE8431E9382AC7EF5F1705C05239DDEA7F533234FA640D2E1EE392D23BF46D57D6FD0E167174E6242F5455DC299BB03BF2EBAEDB14539E9025B84BF66C185AD45C6B1FBF47E3C17D4A1F2C99DCA7151039D71DB7BD2E025E67C2ABB9A2DE6D9C5150651385B270511AA50E8728707B1E0920F3A83DEC0F733090CE96DCACDB93CD756AB1F572DA2BBF4908C17E905848C09CF31424833D1D4894FCB6BD93162EC74E836A523E97F35152EBA28AF63DEC47A32C09E0F0451A4D60949C8CDB07642F5A705075F4A1380B327596C319A135C9C43BBAF2D25C90030BA43FC55701B2854ABFEA710D98AFB8341E46778616A9E9B31CF11652B47A76A99F096BDB35C9CFA78E47CFC980E5E8683E1E13AA3FCA5171C07B5E27C1A5002C02643DC760431C2750A29E838F6ED5A892146D8015F5879DA988DF030BB2FA4D501FB7F0AD9A82ED3C48B70979428C39DB04116DCC8337567B6DB4A0DFE0C704B3F46983BBF092847AED87699EE88AEB27756850D008583CD37FC8521968EB1D17FC42D742B7E6756303412A3AD011DD5CE2BA1A4E3B0B2EBB68736C76B02164C41204734B731DF4C00C937CFB49D4648A7808A34E6162526240AB221071C6C2669DB4787AF7D516F4E72EF81C7D907A37634E8CEC5BF4B3502A6A05224B269B29A8E44603DB2A890F9B64BC94AEC7D2923DC52985CC18E123C7D6CC3DEF885725E0BD2D3EC0466DBE2E94350368068E5FC1CFB6BAC40F47600EB8520A8E29E855D96B556002207CA234BE3620189767ED74ABA3D1A1CF3F66864312B7502C37C9543A36F24FD38A25137128FFE4C6CC7C078AEF1F799DA7F3E3BA0E19F21A707E66EE95189BDD74EDF32E0F18052384A2A180D90545EF1B9F2710074BC8AED5F7625C0851C34E9F3AE5C57BE65862CEE2891052CC442574EBFAAE1BEC7AB63F25C80951AD65A41089DE526946D858146E446FCAD6915BD59B0D112255083A711279990F87453A6D8F7D057055217F4750B055A7B
-20241203151709 2 6 100 8191 2 C3301F39F3E2DCD097FBF5454401BF52BF4745AFD35F3DEBDFB34DE2518B0F7BB10DE2FDBE6C35E1B63AA67E9FC179EB3DB8A0FA7E01618BB625B3EC326A001A253FB737B2461999BAB5A5FBCA4AFAD88A8BCBEB5990D4E25225F203B2CE75A3A1C23BFFD78E697275BDB6B6153AA3C21D2063047D44EDDF0483220CD672280D4D67C4726EA476A5C094B7E8DBE62B760EBA6B62C200D456A99E87875B4B2FFF4AA87661D89CAF8CA36D9CE00E0C3BDA443B7CCC3EA892F524AD10DD6960196EC4497E1DDC9F5C13BAED9A8F240196633AB9EC597D0A2FFEEE9320147E73FB295039605EA79376C00D1C60EB421D1BF2BD36A9B68A32E5F5003F0C984E1A57B3C8A261E451D912FCBF27924078BAB0879F85B78D097B2651A17AD9266B39E7AF73DAE54319B2902E0A0D11653B38EDA14B9DE8431E9382AC7EF5F1705C05239DDEA7F533234FA640D2E1EE392D23BF46D57D6FD0E167174E6242F5455DC299BB03BF2EBAEDB14539E9025B84BF66C185AD45C6B1FBF47E3C17D4A1F2C99DCA7151039D71DB7BD2E025E67C2ABB9A2DE6D9C5150651385B270511AA50E8728707B1E0920F3A83DEC0F733090CE96DCACDB93CD756AB1F572DA2BBF4908C17E905848C09CF31424833D1D4894FCB6BD93162EC74E836A523E97F35152EBA28AF63DEC47A32C09E0F0451A4D60949C8CDB07642F5A705075F4A1380B327596C319A135C9C43BBAF2D25C90030BA43FC55701B2854ABFEA710D98AFB8341E46778616A9E9B31CF11652B47A76A99F096BDB35C9CFA78E47CFC980E5E8683E1E13AA3FCA5171C07B5E27C1A5002C02643DC760431C2750A29E838F6ED5A892146D8015F5879DA988DF030BB2FA4D501FB7F0AD9A82ED3C48B70979428C39DB04116DCC8337567B6DB4A0DFE0C704B3F46983BBF092847AED87699EE88AEB27756850D008583CD37FC8521968EB1D17FC42D742B7E6756303412A3AD011DD5CE2BA1A4E3B0B2EBB68736C76B02164C41204734B731DF4C00C937CFB49D4648A7808A34E6162526240AB221071C6C2669DB4787AF7D516F4E72EF81C7D907A37634E8CEC5BF4B3502A6A05224B269B29A8E44603DB2A890F9B64BC94AEC7D2923DC52985CC18E123C7D6CC3DEF885725E0BD2D3EC0466DBE2E94350368068E5FC1CFB6BAC40F47600EB8520A8E29E855D96B556002207CA234BE3620189767ED74ABA3D1A1CF3F66864312B7502C37C9543A36F24FD38A25137128FFE4C6CC7C078AEF1F799DA7F3E3BA0E19F21A707E66EE95189BDD74EDF32E0F18052384A2A180D90545EF1B9F2710074BC8AED5F7625C0851C34E9F3AE5C57BE65862CEE2891052CC442574EBFAAE1BEC7AB63F25C80951AD65A41089DE526946D858146E446FCAD6915BD59B0D112255083A711279990F87453A6D8F7D057055217F4751817A103
-20241203162310 2 6 100 8191 5 C3301F39F3E2DCD097FBF5454401BF52BF4745AFD35F3DEBDFB34DE2518B0F7BB10DE2FDBE6C35E1B63AA67E9FC179EB3DB8A0FA7E01618BB625B3EC326A001A253FB737B2461999BAB5A5FBCA4AFAD88A8BCBEB5990D4E25225F203B2CE75A3A1C23BFFD78E697275BDB6B6153AA3C21D2063047D44EDDF0483220CD672280D4D67C4726EA476A5C094B7E8DBE62B760EBA6B62C200D456A99E87875B4B2FFF4AA87661D89CAF8CA36D9CE00E0C3BDA443B7CCC3EA892F524AD10DD6960196EC4497E1DDC9F5C13BAED9A8F240196633AB9EC597D0A2FFEEE9320147E73FB295039605EA79376C00D1C60EB421D1BF2BD36A9B68A32E5F5003F0C984E1A57B3C8A261E451D912FCBF27924078BAB0879F85B78D097B2651A17AD9266B39E7AF73DAE54319B2902E0A0D11653B38EDA14B9DE8431E9382AC7EF5F1705C05239DDEA7F533234FA640D2E1EE392D23BF46D57D6FD0E167174E6242F5455DC299BB03BF2EBAEDB14539E9025B84BF66C185AD45C6B1FBF47E3C17D4A1F2C99DCA7151039D71DB7BD2E025E67C2ABB9A2DE6D9C5150651385B270511AA50E8728707B1E0920F3A83DEC0F733090CE96DCACDB93CD756AB1F572DA2BBF4908C17E905848C09CF31424833D1D4894FCB6BD93162EC74E836A523E97F35152EBA28AF63DEC47A32C09E0F0451A4D60949C8CDB07642F5A705075F4A1380B327596C319A135C9C43BBAF2D25C90030BA43FC55701B2854ABFEA710D98AFB8341E46778616A9E9B31CF11652B47A76A99F096BDB35C9CFA78E47CFC980E5E8683E1E13AA3FCA5171C07B5E27C1A5002C02643DC760431C2750A29E838F6ED5A892146D8015F5879DA988DF030BB2FA4D501FB7F0AD9A82ED3C48B70979428C39DB04116DCC8337567B6DB4A0DFE0C704B3F46983BBF092847AED87699EE88AEB27756850D008583CD37FC8521968EB1D17FC42D742B7E6756303412A3AD011DD5CE2BA1A4E3B0B2EBB68736C76B02164C41204734B731DF4C00C937CFB49D4648A7808A34E6162526240AB221071C6C2669DB4787AF7D516F4E72EF81C7D907A37634E8CEC5BF4B3502A6A05224B269B29A8E44603DB2A890F9B64BC94AEC7D2923DC52985CC18E123C7D6CC3DEF885725E0BD2D3EC0466DBE2E94350368068E5FC1CFB6BAC40F47600EB8520A8E29E855D96B556002207CA234BE3620189767ED74ABA3D1A1CF3F66864312B7502C37C9543A36F24FD38A25137128FFE4C6CC7C078AEF1F799DA7F3E3BA0E19F21A707E66EE95189BDD74EDF32E0F18052384A2A180D90545EF1B9F2710074BC8AED5F7625C0851C34E9F3AE5C57BE65862CEE2891052CC442574EBFAAE1BEC7AB63F25C80951AD65A41089DE526946D858146E446FCAD6915BD59B0D112255083A711279990F87453A6D8F7D057055217F4751BBFB51F
-20241203173052 2 6 100 8191 5 C3301F39F3E2DCD097FBF5454401BF52BF4745AFD35F3DEBDFB34DE2518B0F7BB10DE2FDBE6C35E1B63AA67E9FC179EB3DB8A0FA7E01618BB625B3EC326A001A253FB737B2461999BAB5A5FBCA4AFAD88A8BCBEB5990D4E25225F203B2CE75A3A1C23BFFD78E697275BDB6B6153AA3C21D2063047D44EDDF0483220CD672280D4D67C4726EA476A5C094B7E8DBE62B760EBA6B62C200D456A99E87875B4B2FFF4AA87661D89CAF8CA36D9CE00E0C3BDA443B7CCC3EA892F524AD10DD6960196EC4497E1DDC9F5C13BAED9A8F240196633AB9EC597D0A2FFEEE9320147E73FB295039605EA79376C00D1C60EB421D1BF2BD36A9B68A32E5F5003F0C984E1A57B3C8A261E451D912FCBF27924078BAB0879F85B78D097B2651A17AD9266B39E7AF73DAE54319B2902E0A0D11653B38EDA14B9DE8431E9382AC7EF5F1705C05239DDEA7F533234FA640D2E1EE392D23BF46D57D6FD0E167174E6242F5455DC299BB03BF2EBAEDB14539E9025B84BF66C185AD45C6B1FBF47E3C17D4A1F2C99DCA7151039D71DB7BD2E025E67C2ABB9A2DE6D9C5150651385B270511AA50E8728707B1E0920F3A83DEC0F733090CE96DCACDB93CD756AB1F572DA2BBF4908C17E905848C09CF31424833D1D4894FCB6BD93162EC74E836A523E97F35152EBA28AF63DEC47A32C09E0F0451A4D60949C8CDB07642F5A705075F4A1380B327596C319A135C9C43BBAF2D25C90030BA43FC55701B2854ABFEA710D98AFB8341E46778616A9E9B31CF11652B47A76A99F096BDB35C9CFA78E47CFC980E5E8683E1E13AA3FCA5171C07B5E27C1A5002C02643DC760431C2750A29E838F6ED5A892146D8015F5879DA988DF030BB2FA4D501FB7F0AD9A82ED3C48B70979428C39DB04116DCC8337567B6DB4A0DFE0C704B3F46983BBF092847AED87699EE88AEB27756850D008583CD37FC8521968EB1D17FC42D742B7E6756303412A3AD011DD5CE2BA1A4E3B0B2EBB68736C76B02164C41204734B731DF4C00C937CFB49D4648A7808A34E6162526240AB221071C6C2669DB4787AF7D516F4E72EF81C7D907A37634E8CEC5BF4B3502A6A05224B269B29A8E44603DB2A890F9B64BC94AEC7D2923DC52985CC18E123C7D6CC3DEF885725E0BD2D3EC0466DBE2E94350368068E5FC1CFB6BAC40F47600EB8520A8E29E855D96B556002207CA234BE3620189767ED74ABA3D1A1CF3F66864312B7502C37C9543A36F24FD38A25137128FFE4C6CC7C078AEF1F799DA7F3E3BA0E19F21A707E66EE95189BDD74EDF32E0F18052384A2A180D90545EF1B9F2710074BC8AED5F7625C0851C34E9F3AE5C57BE65862CEE2891052CC442574EBFAAE1BEC7AB63F25C80951AD65A41089DE526946D858146E446FCAD6915BD59B0D112255083A711279990F87453A6D8F7D057055217F4751F72906F
-20241203182303 2 6 100 8191 2 C3301F39F3E2DCD097FBF5454401BF52BF4745AFD35F3DEBDFB34DE2518B0F7BB10DE2FDBE6C35E1B63AA67E9FC179EB3DB8A0FA7E01618BB625B3EC326A001A253FB737B2461999BAB5A5FBCA4AFAD88A8BCBEB5990D4E25225F203B2CE75A3A1C23BFFD78E697275BDB6B6153AA3C21D2063047D44EDDF0483220CD672280D4D67C4726EA476A5C094B7E8DBE62B760EBA6B62C200D456A99E87875B4B2FFF4AA87661D89CAF8CA36D9CE00E0C3BDA443B7CCC3EA892F524AD10DD6960196EC4497E1DDC9F5C13BAED9A8F240196633AB9EC597D0A2FFEEE9320147E73FB295039605EA79376C00D1C60EB421D1BF2BD36A9B68A32E5F5003F0C984E1A57B3C8A261E451D912FCBF27924078BAB0879F85B78D097B2651A17AD9266B39E7AF73DAE54319B2902E0A0D11653B38EDA14B9DE8431E9382AC7EF5F1705C05239DDEA7F533234FA640D2E1EE392D23BF46D57D6FD0E167174E6242F5455DC299BB03BF2EBAEDB14539E9025B84BF66C185AD45C6B1FBF47E3C17D4A1F2C99DCA7151039D71DB7BD2E025E67C2ABB9A2DE6D9C5150651385B270511AA50E8728707B1E0920F3A83DEC0F733090CE96DCACDB93CD756AB1F572DA2BBF4908C17E905848C09CF31424833D1D4894FCB6BD93162EC74E836A523E97F35152EBA28AF63DEC47A32C09E0F0451A4D60949C8CDB07642F5A705075F4A1380B327596C319A135C9C43BBAF2D25C90030BA43FC55701B2854ABFEA710D98AFB8341E46778616A9E9B31CF11652B47A76A99F096BDB35C9CFA78E47CFC980E5E8683E1E13AA3FCA5171C07B5E27C1A5002C02643DC760431C2750A29E838F6ED5A892146D8015F5879DA988DF030BB2FA4D501FB7F0AD9A82ED3C48B70979428C39DB04116DCC8337567B6DB4A0DFE0C704B3F46983BBF092847AED87699EE88AEB27756850D008583CD37FC8521968EB1D17FC42D742B7E6756303412A3AD011DD5CE2BA1A4E3B0B2EBB68736C76B02164C41204734B731DF4C00C937CFB49D4648A7808A34E6162526240AB221071C6C2669DB4787AF7D516F4E72EF81C7D907A37634E8CEC5BF4B3502A6A05224B269B29A8E44603DB2A890F9B64BC94AEC7D2923DC52985CC18E123C7D6CC3DEF885725E0BD2D3EC0466DBE2E94350368068E5FC1CFB6BAC40F47600EB8520A8E29E855D96B556002207CA234BE3620189767ED74ABA3D1A1CF3F66864312B7502C37C9543A36F24FD38A25137128FFE4C6CC7C078AEF1F799DA7F3E3BA0E19F21A707E66EE95189BDD74EDF32E0F18052384A2A180D90545EF1B9F2710074BC8AED5F7625C0851C34E9F3AE5C57BE65862CEE2891052CC442574EBFAAE1BEC7AB63F25C80951AD65A41089DE526946D858146E446FCAD6915BD59B0D112255083A711279990F87453A6D8F7D057055217F475224CDDDB
-20241203194121 2 6 100 8191 5 C3301F39F3E2DCD097FBF5454401BF52BF4745AFD35F3DEBDFB34DE2518B0F7BB10DE2FDBE6C35E1B63AA67E9FC179EB3DB8A0FA7E01618BB625B3EC326A001A253FB737B2461999BAB5A5FBCA4AFAD88A8BCBEB5990D4E25225F203B2CE75A3A1C23BFFD78E697275BDB6B6153AA3C21D2063047D44EDDF0483220CD672280D4D67C4726EA476A5C094B7E8DBE62B760EBA6B62C200D456A99E87875B4B2FFF4AA87661D89CAF8CA36D9CE00E0C3BDA443B7CCC3EA892F524AD10DD6960196EC4497E1DDC9F5C13BAED9A8F240196633AB9EC597D0A2FFEEE9320147E73FB295039605EA79376C00D1C60EB421D1BF2BD36A9B68A32E5F5003F0C984E1A57B3C8A261E451D912FCBF27924078BAB0879F85B78D097B2651A17AD9266B39E7AF73DAE54319B2902E0A0D11653B38EDA14B9DE8431E9382AC7EF5F1705C05239DDEA7F533234FA640D2E1EE392D23BF46D57D6FD0E167174E6242F5455DC299BB03BF2EBAEDB14539E9025B84BF66C185AD45C6B1FBF47E3C17D4A1F2C99DCA7151039D71DB7BD2E025E67C2ABB9A2DE6D9C5150651385B270511AA50E8728707B1E0920F3A83DEC0F733090CE96DCACDB93CD756AB1F572DA2BBF4908C17E905848C09CF31424833D1D4894FCB6BD93162EC74E836A523E97F35152EBA28AF63DEC47A32C09E0F0451A4D60949C8CDB07642F5A705075F4A1380B327596C319A135C9C43BBAF2D25C90030BA43FC55701B2854ABFEA710D98AFB8341E46778616A9E9B31CF11652B47A76A99F096BDB35C9CFA78E47CFC980E5E8683E1E13AA3FCA5171C07B5E27C1A5002C02643DC760431C2750A29E838F6ED5A892146D8015F5879DA988DF030BB2FA4D501FB7F0AD9A82ED3C48B70979428C39DB04116DCC8337567B6DB4A0DFE0C704B3F46983BBF092847AED87699EE88AEB27756850D008583CD37FC8521968EB1D17FC42D742B7E6756303412A3AD011DD5CE2BA1A4E3B0B2EBB68736C76B02164C41204734B731DF4C00C937CFB49D4648A7808A34E6162526240AB221071C6C2669DB4787AF7D516F4E72EF81C7D907A37634E8CEC5BF4B3502A6A05224B269B29A8E44603DB2A890F9B64BC94AEC7D2923DC52985CC18E123C7D6CC3DEF885725E0BD2D3EC0466DBE2E94350368068E5FC1CFB6BAC40F47600EB8520A8E29E855D96B556002207CA234BE3620189767ED74ABA3D1A1CF3F66864312B7502C37C9543A36F24FD38A25137128FFE4C6CC7C078AEF1F799DA7F3E3BA0E19F21A707E66EE95189BDD74EDF32E0F18052384A2A180D90545EF1B9F2710074BC8AED5F7625C0851C34E9F3AE5C57BE65862CEE2891052CC442574EBFAAE1BEC7AB63F25C80951AD65A41089DE526946D858146E446FCAD6915BD59B0D112255083A711279990F87453A6D8F7D057055217F47526993A97
-20241203203340 2 6 100 8191 2 C3301F39F3E2DCD097FBF5454401BF52BF4745AFD35F3DEBDFB34DE2518B0F7BB10DE2FDBE6C35E1B63AA67E9FC179EB3DB8A0FA7E01618BB625B3EC326A001A253FB737B2461999BAB5A5FBCA4AFAD88A8BCBEB5990D4E25225F203B2CE75A3A1C23BFFD78E697275BDB6B6153AA3C21D2063047D44EDDF0483220CD672280D4D67C4726EA476A5C094B7E8DBE62B760EBA6B62C200D456A99E87875B4B2FFF4AA87661D89CAF8CA36D9CE00E0C3BDA443B7CCC3EA892F524AD10DD6960196EC4497E1DDC9F5C13BAED9A8F240196633AB9EC597D0A2FFEEE9320147E73FB295039605EA79376C00D1C60EB421D1BF2BD36A9B68A32E5F5003F0C984E1A57B3C8A261E451D912FCBF27924078BAB0879F85B78D097B2651A17AD9266B39E7AF73DAE54319B2902E0A0D11653B38EDA14B9DE8431E9382AC7EF5F1705C05239DDEA7F533234FA640D2E1EE392D23BF46D57D6FD0E167174E6242F5455DC299BB03BF2EBAEDB14539E9025B84BF66C185AD45C6B1FBF47E3C17D4A1F2C99DCA7151039D71DB7BD2E025E67C2ABB9A2DE6D9C5150651385B270511AA50E8728707B1E0920F3A83DEC0F733090CE96DCACDB93CD756AB1F572DA2BBF4908C17E905848C09CF31424833D1D4894FCB6BD93162EC74E836A523E97F35152EBA28AF63DEC47A32C09E0F0451A4D60949C8CDB07642F5A705075F4A1380B327596C319A135C9C43BBAF2D25C90030BA43FC55701B2854ABFEA710D98AFB8341E46778616A9E9B31CF11652B47A76A99F096BDB35C9CFA78E47CFC980E5E8683E1E13AA3FCA5171C07B5E27C1A5002C02643DC760431C2750A29E838F6ED5A892146D8015F5879DA988DF030BB2FA4D501FB7F0AD9A82ED3C48B70979428C39DB04116DCC8337567B6DB4A0DFE0C704B3F46983BBF092847AED87699EE88AEB27756850D008583CD37FC8521968EB1D17FC42D742B7E6756303412A3AD011DD5CE2BA1A4E3B0B2EBB68736C76B02164C41204734B731DF4C00C937CFB49D4648A7808A34E6162526240AB221071C6C2669DB4787AF7D516F4E72EF81C7D907A37634E8CEC5BF4B3502A6A05224B269B29A8E44603DB2A890F9B64BC94AEC7D2923DC52985CC18E123C7D6CC3DEF885725E0BD2D3EC0466DBE2E94350368068E5FC1CFB6BAC40F47600EB8520A8E29E855D96B556002207CA234BE3620189767ED74ABA3D1A1CF3F66864312B7502C37C9543A36F24FD38A25137128FFE4C6CC7C078AEF1F799DA7F3E3BA0E19F21A707E66EE95189BDD74EDF32E0F18052384A2A180D90545EF1B9F2710074BC8AED5F7625C0851C34E9F3AE5C57BE65862CEE2891052CC442574EBFAAE1BEC7AB63F25C80951AD65A41089DE526946D858146E446FCAD6915BD59B0D112255083A711279990F87453A6D8F7D057055217F475298312DB
-20241203203518 2 6 100 8191 5 C3301F39F3E2DCD097FBF5454401BF52BF4745AFD35F3DEBDFB34DE2518B0F7BB10DE2FDBE6C35E1B63AA67E9FC179EB3DB8A0FA7E01618BB625B3EC326A001A253FB737B2461999BAB5A5FBCA4AFAD88A8BCBEB5990D4E25225F203B2CE75A3A1C23BFFD78E697275BDB6B6153AA3C21D2063047D44EDDF0483220CD672280D4D67C4726EA476A5C094B7E8DBE62B760EBA6B62C200D456A99E87875B4B2FFF4AA87661D89CAF8CA36D9CE00E0C3BDA443B7CCC3EA892F524AD10DD6960196EC4497E1DDC9F5C13BAED9A8F240196633AB9EC597D0A2FFEEE9320147E73FB295039605EA79376C00D1C60EB421D1BF2BD36A9B68A32E5F5003F0C984E1A57B3C8A261E451D912FCBF27924078BAB0879F85B78D097B2651A17AD9266B39E7AF73DAE54319B2902E0A0D11653B38EDA14B9DE8431E9382AC7EF5F1705C05239DDEA7F533234FA640D2E1EE392D23BF46D57D6FD0E167174E6242F5455DC299BB03BF2EBAEDB14539E9025B84BF66C185AD45C6B1FBF47E3C17D4A1F2C99DCA7151039D71DB7BD2E025E67C2ABB9A2DE6D9C5150651385B270511AA50E8728707B1E0920F3A83DEC0F733090CE96DCACDB93CD756AB1F572DA2BBF4908C17E905848C09CF31424833D1D4894FCB6BD93162EC74E836A523E97F35152EBA28AF63DEC47A32C09E0F0451A4D60949C8CDB07642F5A705075F4A1380B327596C319A135C9C43BBAF2D25C90030BA43FC55701B2854ABFEA710D98AFB8341E46778616A9E9B31CF11652B47A76A99F096BDB35C9CFA78E47CFC980E5E8683E1E13AA3FCA5171C07B5E27C1A5002C02643DC760431C2750A29E838F6ED5A892146D8015F5879DA988DF030BB2FA4D501FB7F0AD9A82ED3C48B70979428C39DB04116DCC8337567B6DB4A0DFE0C704B3F46983BBF092847AED87699EE88AEB27756850D008583CD37FC8521968EB1D17FC42D742B7E6756303412A3AD011DD5CE2BA1A4E3B0B2EBB68736C76B02164C41204734B731DF4C00C937CFB49D4648A7808A34E6162526240AB221071C6C2669DB4787AF7D516F4E72EF81C7D907A37634E8CEC5BF4B3502A6A05224B269B29A8E44603DB2A890F9B64BC94AEC7D2923DC52985CC18E123C7D6CC3DEF885725E0BD2D3EC0466DBE2E94350368068E5FC1CFB6BAC40F47600EB8520A8E29E855D96B556002207CA234BE3620189767ED74ABA3D1A1CF3F66864312B7502C37C9543A36F24FD38A25137128FFE4C6CC7C078AEF1F799DA7F3E3BA0E19F21A707E66EE95189BDD74EDF32E0F18052384A2A180D90545EF1B9F2710074BC8AED5F7625C0851C34E9F3AE5C57BE65862CEE2891052CC442574EBFAAE1BEC7AB63F25C80951AD65A41089DE526946D858146E446FCAD6915BD59B0D112255083A711279990F87453A6D8F7D057055217F475299334C7
-20241203220054 2 6 100 8191 5 C3301F39F3E2DCD097FBF5454401BF52BF4745AFD35F3DEBDFB34DE2518B0F7BB10DE2FDBE6C35E1B63AA67E9FC179EB3DB8A0FA7E01618BB625B3EC326A001A253FB737B2461999BAB5A5FBCA4AFAD88A8BCBEB5990D4E25225F203B2CE75A3A1C23BFFD78E697275BDB6B6153AA3C21D2063047D44EDDF0483220CD672280D4D67C4726EA476A5C094B7E8DBE62B760EBA6B62C200D456A99E87875B4B2FFF4AA87661D89CAF8CA36D9CE00E0C3BDA443B7CCC3EA892F524AD10DD6960196EC4497E1DDC9F5C13BAED9A8F240196633AB9EC597D0A2FFEEE9320147E73FB295039605EA79376C00D1C60EB421D1BF2BD36A9B68A32E5F5003F0C984E1A57B3C8A261E451D912FCBF27924078BAB0879F85B78D097B2651A17AD9266B39E7AF73DAE54319B2902E0A0D11653B38EDA14B9DE8431E9382AC7EF5F1705C05239DDEA7F533234FA640D2E1EE392D23BF46D57D6FD0E167174E6242F5455DC299BB03BF2EBAEDB14539E9025B84BF66C185AD45C6B1FBF47E3C17D4A1F2C99DCA7151039D71DB7BD2E025E67C2ABB9A2DE6D9C5150651385B270511AA50E8728707B1E0920F3A83DEC0F733090CE96DCACDB93CD756AB1F572DA2BBF4908C17E905848C09CF31424833D1D4894FCB6BD93162EC74E836A523E97F35152EBA28AF63DEC47A32C09E0F0451A4D60949C8CDB07642F5A705075F4A1380B327596C319A135C9C43BBAF2D25C90030BA43FC55701B2854ABFEA710D98AFB8341E46778616A9E9B31CF11652B47A76A99F096BDB35C9CFA78E47CFC980E5E8683E1E13AA3FCA5171C07B5E27C1A5002C02643DC760431C2750A29E838F6ED5A892146D8015F5879DA988DF030BB2FA4D501FB7F0AD9A82ED3C48B70979428C39DB04116DCC8337567B6DB4A0DFE0C704B3F46983BBF092847AED87699EE88AEB27756850D008583CD37FC8521968EB1D17FC42D742B7E6756303412A3AD011DD5CE2BA1A4E3B0B2EBB68736C76B02164C41204734B731DF4C00C937CFB49D4648A7808A34E6162526240AB221071C6C2669DB4787AF7D516F4E72EF81C7D907A37634E8CEC5BF4B3502A6A05224B269B29A8E44603DB2A890F9B64BC94AEC7D2923DC52985CC18E123C7D6CC3DEF885725E0BD2D3EC0466DBE2E94350368068E5FC1CFB6BAC40F47600EB8520A8E29E855D96B556002207CA234BE3620189767ED74ABA3D1A1CF3F66864312B7502C37C9543A36F24FD38A25137128FFE4C6CC7C078AEF1F799DA7F3E3BA0E19F21A707E66EE95189BDD74EDF32E0F18052384A2A180D90545EF1B9F2710074BC8AED5F7625C0851C34E9F3AE5C57BE65862CEE2891052CC442574EBFAAE1BEC7AB63F25C80951AD65A41089DE526946D858146E446FCAD6915BD59B0D112255083A711279990F87453A6D8F7D057055217F4752E4DBDDF
-20241203220341 2 6 100 8191 2 C3301F39F3E2DCD097FBF5454401BF52BF4745AFD35F3DEBDFB34DE2518B0F7BB10DE2FDBE6C35E1B63AA67E9FC179EB3DB8A0FA7E01618BB625B3EC326A001A253FB737B2461999BAB5A5FBCA4AFAD88A8BCBEB5990D4E25225F203B2CE75A3A1C23BFFD78E697275BDB6B6153AA3C21D2063047D44EDDF0483220CD672280D4D67C4726EA476A5C094B7E8DBE62B760EBA6B62C200D456A99E87875B4B2FFF4AA87661D89CAF8CA36D9CE00E0C3BDA443B7CCC3EA892F524AD10DD6960196EC4497E1DDC9F5C13BAED9A8F240196633AB9EC597D0A2FFEEE9320147E73FB295039605EA79376C00D1C60EB421D1BF2BD36A9B68A32E5F5003F0C984E1A57B3C8A261E451D912FCBF27924078BAB0879F85B78D097B2651A17AD9266B39E7AF73DAE54319B2902E0A0D11653B38EDA14B9DE8431E9382AC7EF5F1705C05239DDEA7F533234FA640D2E1EE392D23BF46D57D6FD0E167174E6242F5455DC299BB03BF2EBAEDB14539E9025B84BF66C185AD45C6B1FBF47E3C17D4A1F2C99DCA7151039D71DB7BD2E025E67C2ABB9A2DE6D9C5150651385B270511AA50E8728707B1E0920F3A83DEC0F733090CE96DCACDB93CD756AB1F572DA2BBF4908C17E905848C09CF31424833D1D4894FCB6BD93162EC74E836A523E97F35152EBA28AF63DEC47A32C09E0F0451A4D60949C8CDB07642F5A705075F4A1380B327596C319A135C9C43BBAF2D25C90030BA43FC55701B2854ABFEA710D98AFB8341E46778616A9E9B31CF11652B47A76A99F096BDB35C9CFA78E47CFC980E5E8683E1E13AA3FCA5171C07B5E27C1A5002C02643DC760431C2750A29E838F6ED5A892146D8015F5879DA988DF030BB2FA4D501FB7F0AD9A82ED3C48B70979428C39DB04116DCC8337567B6DB4A0DFE0C704B3F46983BBF092847AED87699EE88AEB27756850D008583CD37FC8521968EB1D17FC42D742B7E6756303412A3AD011DD5CE2BA1A4E3B0B2EBB68736C76B02164C41204734B731DF4C00C937CFB49D4648A7808A34E6162526240AB221071C6C2669DB4787AF7D516F4E72EF81C7D907A37634E8CEC5BF4B3502A6A05224B269B29A8E44603DB2A890F9B64BC94AEC7D2923DC52985CC18E123C7D6CC3DEF885725E0BD2D3EC0466DBE2E94350368068E5FC1CFB6BAC40F47600EB8520A8E29E855D96B556002207CA234BE3620189767ED74ABA3D1A1CF3F66864312B7502C37C9543A36F24FD38A25137128FFE4C6CC7C078AEF1F799DA7F3E3BA0E19F21A707E66EE95189BDD74EDF32E0F18052384A2A180D90545EF1B9F2710074BC8AED5F7625C0851C34E9F3AE5C57BE65862CEE2891052CC442574EBFAAE1BEC7AB63F25C80951AD65A41089DE526946D858146E446FCAD6915BD59B0D112255083A711279990F87453A6D8F7D057055217F4752E6D1DC3
-20241203221452 2 6 100 8191 2 C3301F39F3E2DCD097FBF5454401BF52BF4745AFD35F3DEBDFB34DE2518B0F7BB10DE2FDBE6C35E1B63AA67E9FC179EB3DB8A0FA7E01618BB625B3EC326A001A253FB737B2461999BAB5A5FBCA4AFAD88A8BCBEB5990D4E25225F203B2CE75A3A1C23BFFD78E697275BDB6B6153AA3C21D2063047D44EDDF0483220CD672280D4D67C4726EA476A5C094B7E8DBE62B760EBA6B62C200D456A99E87875B4B2FFF4AA87661D89CAF8CA36D9CE00E0C3BDA443B7CCC3EA892F524AD10DD6960196EC4497E1DDC9F5C13BAED9A8F240196633AB9EC597D0A2FFEEE9320147E73FB295039605EA79376C00D1C60EB421D1BF2BD36A9B68A32E5F5003F0C984E1A57B3C8A261E451D912FCBF27924078BAB0879F85B78D097B2651A17AD9266B39E7AF73DAE54319B2902E0A0D11653B38EDA14B9DE8431E9382AC7EF5F1705C05239DDEA7F533234FA640D2E1EE392D23BF46D57D6FD0E167174E6242F5455DC299BB03BF2EBAEDB14539E9025B84BF66C185AD45C6B1FBF47E3C17D4A1F2C99DCA7151039D71DB7BD2E025E67C2ABB9A2DE6D9C5150651385B270511AA50E8728707B1E0920F3A83DEC0F733090CE96DCACDB93CD756AB1F572DA2BBF4908C17E905848C09CF31424833D1D4894FCB6BD93162EC74E836A523E97F35152EBA28AF63DEC47A32C09E0F0451A4D60949C8CDB07642F5A705075F4A1380B327596C319A135C9C43BBAF2D25C90030BA43FC55701B2854ABFEA710D98AFB8341E46778616A9E9B31CF11652B47A76A99F096BDB35C9CFA78E47CFC980E5E8683E1E13AA3FCA5171C07B5E27C1A5002C02643DC760431C2750A29E838F6ED5A892146D8015F5879DA988DF030BB2FA4D501FB7F0AD9A82ED3C48B70979428C39DB04116DCC8337567B6DB4A0DFE0C704B3F46983BBF092847AED87699EE88AEB27756850D008583CD37FC8521968EB1D17FC42D742B7E6756303412A3AD011DD5CE2BA1A4E3B0B2EBB68736C76B02164C41204734B731DF4C00C937CFB49D4648A7808A34E6162526240AB221071C6C2669DB4787AF7D516F4E72EF81C7D907A37634E8CEC5BF4B3502A6A05224B269B29A8E44603DB2A890F9B64BC94AEC7D2923DC52985CC18E123C7D6CC3DEF885725E0BD2D3EC0466DBE2E94350368068E5FC1CFB6BAC40F47600EB8520A8E29E855D96B556002207CA234BE3620189767ED74ABA3D1A1CF3F66864312B7502C37C9543A36F24FD38A25137128FFE4C6CC7C078AEF1F799DA7F3E3BA0E19F21A707E66EE95189BDD74EDF32E0F18052384A2A180D90545EF1B9F2710074BC8AED5F7625C0851C34E9F3AE5C57BE65862CEE2891052CC442574EBFAAE1BEC7AB63F25C80951AD65A41089DE526946D858146E446FCAD6915BD59B0D112255083A711279990F87453A6D8F7D057055217F4752F062A3B
-20241203224318 2 6 100 8191 5 C3301F39F3E2DCD097FBF5454401BF52BF4745AFD35F3DEBDFB34DE2518B0F7BB10DE2FDBE6C35E1B63AA67E9FC179EB3DB8A0FA7E01618BB625B3EC326A001A253FB737B2461999BAB5A5FBCA4AFAD88A8BCBEB5990D4E25225F203B2CE75A3A1C23BFFD78E697275BDB6B6153AA3C21D2063047D44EDDF0483220CD672280D4D67C4726EA476A5C094B7E8DBE62B760EBA6B62C200D456A99E87875B4B2FFF4AA87661D89CAF8CA36D9CE00E0C3BDA443B7CCC3EA892F524AD10DD6960196EC4497E1DDC9F5C13BAED9A8F240196633AB9EC597D0A2FFEEE9320147E73FB295039605EA79376C00D1C60EB421D1BF2BD36A9B68A32E5F5003F0C984E1A57B3C8A261E451D912FCBF27924078BAB0879F85B78D097B2651A17AD9266B39E7AF73DAE54319B2902E0A0D11653B38EDA14B9DE8431E9382AC7EF5F1705C05239DDEA7F533234FA640D2E1EE392D23BF46D57D6FD0E167174E6242F5455DC299BB03BF2EBAEDB14539E9025B84BF66C185AD45C6B1FBF47E3C17D4A1F2C99DCA7151039D71DB7BD2E025E67C2ABB9A2DE6D9C5150651385B270511AA50E8728707B1E0920F3A83DEC0F733090CE96DCACDB93CD756AB1F572DA2BBF4908C17E905848C09CF31424833D1D4894FCB6BD93162EC74E836A523E97F35152EBA28AF63DEC47A32C09E0F0451A4D60949C8CDB07642F5A705075F4A1380B327596C319A135C9C43BBAF2D25C90030BA43FC55701B2854ABFEA710D98AFB8341E46778616A9E9B31CF11652B47A76A99F096BDB35C9CFA78E47CFC980E5E8683E1E13AA3FCA5171C07B5E27C1A5002C02643DC760431C2750A29E838F6ED5A892146D8015F5879DA988DF030BB2FA4D501FB7F0AD9A82ED3C48B70979428C39DB04116DCC8337567B6DB4A0DFE0C704B3F46983BBF092847AED87699EE88AEB27756850D008583CD37FC8521968EB1D17FC42D742B7E6756303412A3AD011DD5CE2BA1A4E3B0B2EBB68736C76B02164C41204734B731DF4C00C937CFB49D4648A7808A34E6162526240AB221071C6C2669DB4787AF7D516F4E72EF81C7D907A37634E8CEC5BF4B3502A6A05224B269B29A8E44603DB2A890F9B64BC94AEC7D2923DC52985CC18E123C7D6CC3DEF885725E0BD2D3EC0466DBE2E94350368068E5FC1CFB6BAC40F47600EB8520A8E29E855D96B556002207CA234BE3620189767ED74ABA3D1A1CF3F66864312B7502C37C9543A36F24FD38A25137128FFE4C6CC7C078AEF1F799DA7F3E3BA0E19F21A707E66EE95189BDD74EDF32E0F18052384A2A180D90545EF1B9F2710074BC8AED5F7625C0851C34E9F3AE5C57BE65862CEE2891052CC442574EBFAAE1BEC7AB63F25C80951AD65A41089DE526946D858146E446FCAD6915BD59B0D112255083A711279990F87453A6D8F7D057055217F4753098A4FF
-20241204023709 2 6 100 8191 2 DC5E734609D91DA7E5180C89891C148715345D3A56F96DDFF41EE0B90992E9901E55850A78D9DF296A83F5AAF22675720E58E1F6D01F3B45315B818EF9CE880CE92F022763911796D4F86361BEB151ACB400BA017186C1DDCDE5F1853260ECF1082E072C2B7E2FD33E51B5076675269EC247AAE3DF3C1E6853E5D0E58FF7268255E91A9BF6FD43750F114BCA5DC70176ECACAF59C812798941D04FFFF200B53F9843066568A5EF6B324692239A9DC94383C53DA447D942BD51E17F51C22106DC3A2FC7A8942E20E5DA369D19124D184A96589E66EE15C4A8E4CB0FBB6B5E629875DEB3C6AAF622ABC4A4057E0B95533A03C94C514D2129CD6ECE739D9E3A98A54461DF577CC508BF4D5EE7FBE6178B248E3F51C59FE57BFBDE33DD833D0CF22DB22AE0F4F9F03EEF8E0E1DB0EDF7BB4C755148AD2D3FECED23DE1F028A3A6396D7F8F721D11023BD58335ADE175939E140A92C7B532A3D77168E566B7AADEA6F137A158AF3D2608FD4C1081018C1BC2B860A2830A097BDAFA96A3D5B5E1130D2C0778837C63ACBE958573B4ADAC2AE629D17728313AB9064D890006B2F0EC1869E35480B96651B9B3837B876190D5F1876A151A87C58A1CE2A9AD0744BE4CF955BFA9FA5653300FF6ECD64667ECD836D61DC3675048A8EB5AE945B50CB699F7FB4E36167515A2054199687DEC77D5117DF28B63F383403C49097F23AA4DE5857A0D865AFC7E4D0994B46386C20A41E9B41963CD425A82B30C4EE72FB3EFACD6C4090D740E44C196E51F41894FDB26142B72EF1E65A676C30EFB65C937C0F64CDEC167ECC16F0CAA3C932F3DD5C6F7A1EB073F03F2CB9F2059BE75EBAE32FA3170B5FA93D69CAB8275935686242E1F43ED23FE8784A0AD694442D35193DAAF5F7DA49B267B716C38F36C92AE7986DF8126904B11EA74323F3AB3AF436D64AC41996529AB95876EE4DF3739130460A50E2EC8463F2306454F08745CE40938858B6237A5D38B33FD6541BB98EFB39A7B0B501B7943FF594DF0964BF535CBD35105E35BA14C40E62D57F3B110AE82CD7F9FF73C3A28740C8EB397494F6D7CF5F0F147385424D70B276C6AD849E56C9985115EAF2CCF3D3A6C828F2A303178EC48BB08F36AF3800739E841F7B758FF06EFA10F6467E98DA4B1B302EFED0EF5A7D3AD74100E41C168ACBBF10EC5FFC497B43409D02D942C144408C32C83ED49334BC48FD1D446FDEBB71CA1F9276F3180ECA057E4B8F19FAFE368D0097EE2A5736D72BE661382939491A244B068D26A071E55E25DF2C8706ADEFD8245BC97A691AB57A8D39CE24469E9CC69198F4F795CACCB45053F464CA0C2F04C71E9CD6BB6D378E917C413B7FADEACD41A7A43E9A1FC04576658DBF7420A35252A899B51F9ED9B2D0B5534A696C2465C950EF5880636D96CC963AF6C314D00834969C4569DF3BDB
-20241204025228 2 6 100 8191 5 DC5E734609D91DA7E5180C89891C148715345D3A56F96DDFF41EE0B90992E9901E55850A78D9DF296A83F5AAF22675720E58E1F6D01F3B45315B818EF9CE880CE92F022763911796D4F86361BEB151ACB400BA017186C1DDCDE5F1853260ECF1082E072C2B7E2FD33E51B5076675269EC247AAE3DF3C1E6853E5D0E58FF7268255E91A9BF6FD43750F114BCA5DC70176ECACAF59C812798941D04FFFF200B53F9843066568A5EF6B324692239A9DC94383C53DA447D942BD51E17F51C22106DC3A2FC7A8942E20E5DA369D19124D184A96589E66EE15C4A8E4CB0FBB6B5E629875DEB3C6AAF622ABC4A4057E0B95533A03C94C514D2129CD6ECE739D9E3A98A54461DF577CC508BF4D5EE7FBE6178B248E3F51C59FE57BFBDE33DD833D0CF22DB22AE0F4F9F03EEF8E0E1DB0EDF7BB4C755148AD2D3FECED23DE1F028A3A6396D7F8F721D11023BD58335ADE175939E140A92C7B532A3D77168E566B7AADEA6F137A158AF3D2608FD4C1081018C1BC2B860A2830A097BDAFA96A3D5B5E1130D2C0778837C63ACBE958573B4ADAC2AE629D17728313AB9064D890006B2F0EC1869E35480B96651B9B3837B876190D5F1876A151A87C58A1CE2A9AD0744BE4CF955BFA9FA5653300FF6ECD64667ECD836D61DC3675048A8EB5AE945B50CB699F7FB4E36167515A2054199687DEC77D5117DF28B63F383403C49097F23AA4DE5857A0D865AFC7E4D0994B46386C20A41E9B41963CD425A82B30C4EE72FB3EFACD6C4090D740E44C196E51F41894FDB26142B72EF1E65A676C30EFB65C937C0F64CDEC167ECC16F0CAA3C932F3DD5C6F7A1EB073F03F2CB9F2059BE75EBAE32FA3170B5FA93D69CAB8275935686242E1F43ED23FE8784A0AD694442D35193DAAF5F7DA49B267B716C38F36C92AE7986DF8126904B11EA74323F3AB3AF436D64AC41996529AB95876EE4DF3739130460A50E2EC8463F2306454F08745CE40938858B6237A5D38B33FD6541BB98EFB39A7B0B501B7943FF594DF0964BF535CBD35105E35BA14C40E62D57F3B110AE82CD7F9FF73C3A28740C8EB397494F6D7CF5F0F147385424D70B276C6AD849E56C9985115EAF2CCF3D3A6C828F2A303178EC48BB08F36AF3800739E841F7B758FF06EFA10F6467E98DA4B1B302EFED0EF5A7D3AD74100E41C168ACBBF10EC5FFC497B43409D02D942C144408C32C83ED49334BC48FD1D446FDEBB71CA1F9276F3180ECA057E4B8F19FAFE368D0097EE2A5736D72BE661382939491A244B068D26A071E55E25DF2C8706ADEFD8245BC97A691AB57A8D39CE24469E9CC69198F4F795CACCB45053F464CA0C2F04C71E9CD6BB6D378E917C413B7FADEACD41A7A43E9A1FC04576658DBF7420A35252A899B51F9ED9B2D0B5534A696C2465C950EF5880636D96CC963AF6C314D00834969C456AB453E7
-20241204030908 2 6 100 8191 5 DC5E734609D91DA7E5180C89891C148715345D3A56F96DDFF41EE0B90992E9901E55850A78D9DF296A83F5AAF22675720E58E1F6D01F3B45315B818EF9CE880CE92F022763911796D4F86361BEB151ACB400BA017186C1DDCDE5F1853260ECF1082E072C2B7E2FD33E51B5076675269EC247AAE3DF3C1E6853E5D0E58FF7268255E91A9BF6FD43750F114BCA5DC70176ECACAF59C812798941D04FFFF200B53F9843066568A5EF6B324692239A9DC94383C53DA447D942BD51E17F51C22106DC3A2FC7A8942E20E5DA369D19124D184A96589E66EE15C4A8E4CB0FBB6B5E629875DEB3C6AAF622ABC4A4057E0B95533A03C94C514D2129CD6ECE739D9E3A98A54461DF577CC508BF4D5EE7FBE6178B248E3F51C59FE57BFBDE33DD833D0CF22DB22AE0F4F9F03EEF8E0E1DB0EDF7BB4C755148AD2D3FECED23DE1F028A3A6396D7F8F721D11023BD58335ADE175939E140A92C7B532A3D77168E566B7AADEA6F137A158AF3D2608FD4C1081018C1BC2B860A2830A097BDAFA96A3D5B5E1130D2C0778837C63ACBE958573B4ADAC2AE629D17728313AB9064D890006B2F0EC1869E35480B96651B9B3837B876190D5F1876A151A87C58A1CE2A9AD0744BE4CF955BFA9FA5653300FF6ECD64667ECD836D61DC3675048A8EB5AE945B50CB699F7FB4E36167515A2054199687DEC77D5117DF28B63F383403C49097F23AA4DE5857A0D865AFC7E4D0994B46386C20A41E9B41963CD425A82B30C4EE72FB3EFACD6C4090D740E44C196E51F41894FDB26142B72EF1E65A676C30EFB65C937C0F64CDEC167ECC16F0CAA3C932F3DD5C6F7A1EB073F03F2CB9F2059BE75EBAE32FA3170B5FA93D69CAB8275935686242E1F43ED23FE8784A0AD694442D35193DAAF5F7DA49B267B716C38F36C92AE7986DF8126904B11EA74323F3AB3AF436D64AC41996529AB95876EE4DF3739130460A50E2EC8463F2306454F08745CE40938858B6237A5D38B33FD6541BB98EFB39A7B0B501B7943FF594DF0964BF535CBD35105E35BA14C40E62D57F3B110AE82CD7F9FF73C3A28740C8EB397494F6D7CF5F0F147385424D70B276C6AD849E56C9985115EAF2CCF3D3A6C828F2A303178EC48BB08F36AF3800739E841F7B758FF06EFA10F6467E98DA4B1B302EFED0EF5A7D3AD74100E41C168ACBBF10EC5FFC497B43409D02D942C144408C32C83ED49334BC48FD1D446FDEBB71CA1F9276F3180ECA057E4B8F19FAFE368D0097EE2A5736D72BE661382939491A244B068D26A071E55E25DF2C8706ADEFD8245BC97A691AB57A8D39CE24469E9CC69198F4F795CACCB45053F464CA0C2F04C71E9CD6BB6D378E917C413B7FADEACD41A7A43E9A1FC04576658DBF7420A35252A899B51F9ED9B2D0B5534A696C2465C950EF5880636D96CC963AF6C314D00834969C456B95242F
-20241204033647 2 6 100 8191 5 DC5E734609D91DA7E5180C89891C148715345D3A56F96DDFF41EE0B90992E9901E55850A78D9DF296A83F5AAF22675720E58E1F6D01F3B45315B818EF9CE880CE92F022763911796D4F86361BEB151ACB400BA017186C1DDCDE5F1853260ECF1082E072C2B7E2FD33E51B5076675269EC247AAE3DF3C1E6853E5D0E58FF7268255E91A9BF6FD43750F114BCA5DC70176ECACAF59C812798941D04FFFF200B53F9843066568A5EF6B324692239A9DC94383C53DA447D942BD51E17F51C22106DC3A2FC7A8942E20E5DA369D19124D184A96589E66EE15C4A8E4CB0FBB6B5E629875DEB3C6AAF622ABC4A4057E0B95533A03C94C514D2129CD6ECE739D9E3A98A54461DF577CC508BF4D5EE7FBE6178B248E3F51C59FE57BFBDE33DD833D0CF22DB22AE0F4F9F03EEF8E0E1DB0EDF7BB4C755148AD2D3FECED23DE1F028A3A6396D7F8F721D11023BD58335ADE175939E140A92C7B532A3D77168E566B7AADEA6F137A158AF3D2608FD4C1081018C1BC2B860A2830A097BDAFA96A3D5B5E1130D2C0778837C63ACBE958573B4ADAC2AE629D17728313AB9064D890006B2F0EC1869E35480B96651B9B3837B876190D5F1876A151A87C58A1CE2A9AD0744BE4CF955BFA9FA5653300FF6ECD64667ECD836D61DC3675048A8EB5AE945B50CB699F7FB4E36167515A2054199687DEC77D5117DF28B63F383403C49097F23AA4DE5857A0D865AFC7E4D0994B46386C20A41E9B41963CD425A82B30C4EE72FB3EFACD6C4090D740E44C196E51F41894FDB26142B72EF1E65A676C30EFB65C937C0F64CDEC167ECC16F0CAA3C932F3DD5C6F7A1EB073F03F2CB9F2059BE75EBAE32FA3170B5FA93D69CAB8275935686242E1F43ED23FE8784A0AD694442D35193DAAF5F7DA49B267B716C38F36C92AE7986DF8126904B11EA74323F3AB3AF436D64AC41996529AB95876EE4DF3739130460A50E2EC8463F2306454F08745CE40938858B6237A5D38B33FD6541BB98EFB39A7B0B501B7943FF594DF0964BF535CBD35105E35BA14C40E62D57F3B110AE82CD7F9FF73C3A28740C8EB397494F6D7CF5F0F147385424D70B276C6AD849E56C9985115EAF2CCF3D3A6C828F2A303178EC48BB08F36AF3800739E841F7B758FF06EFA10F6467E98DA4B1B302EFED0EF5A7D3AD74100E41C168ACBBF10EC5FFC497B43409D02D942C144408C32C83ED49334BC48FD1D446FDEBB71CA1F9276F3180ECA057E4B8F19FAFE368D0097EE2A5736D72BE661382939491A244B068D26A071E55E25DF2C8706ADEFD8245BC97A691AB57A8D39CE24469E9CC69198F4F795CACCB45053F464CA0C2F04C71E9CD6BB6D378E917C413B7FADEACD41A7A43E9A1FC04576658DBF7420A35252A899B51F9ED9B2D0B5534A696C2465C950EF5880636D96CC963AF6C314D00834969C456D1E7FC7
-20241204055147 2 6 100 8191 5 DC5E734609D91DA7E5180C89891C148715345D3A56F96DDFF41EE0B90992E9901E55850A78D9DF296A83F5AAF22675720E58E1F6D01F3B45315B818EF9CE880CE92F022763911796D4F86361BEB151ACB400BA017186C1DDCDE5F1853260ECF1082E072C2B7E2FD33E51B5076675269EC247AAE3DF3C1E6853E5D0E58FF7268255E91A9BF6FD43750F114BCA5DC70176ECACAF59C812798941D04FFFF200B53F9843066568A5EF6B324692239A9DC94383C53DA447D942BD51E17F51C22106DC3A2FC7A8942E20E5DA369D19124D184A96589E66EE15C4A8E4CB0FBB6B5E629875DEB3C6AAF622ABC4A4057E0B95533A03C94C514D2129CD6ECE739D9E3A98A54461DF577CC508BF4D5EE7FBE6178B248E3F51C59FE57BFBDE33DD833D0CF22DB22AE0F4F9F03EEF8E0E1DB0EDF7BB4C755148AD2D3FECED23DE1F028A3A6396D7F8F721D11023BD58335ADE175939E140A92C7B532A3D77168E566B7AADEA6F137A158AF3D2608FD4C1081018C1BC2B860A2830A097BDAFA96A3D5B5E1130D2C0778837C63ACBE958573B4ADAC2AE629D17728313AB9064D890006B2F0EC1869E35480B96651B9B3837B876190D5F1876A151A87C58A1CE2A9AD0744BE4CF955BFA9FA5653300FF6ECD64667ECD836D61DC3675048A8EB5AE945B50CB699F7FB4E36167515A2054199687DEC77D5117DF28B63F383403C49097F23AA4DE5857A0D865AFC7E4D0994B46386C20A41E9B41963CD425A82B30C4EE72FB3EFACD6C4090D740E44C196E51F41894FDB26142B72EF1E65A676C30EFB65C937C0F64CDEC167ECC16F0CAA3C932F3DD5C6F7A1EB073F03F2CB9F2059BE75EBAE32FA3170B5FA93D69CAB8275935686242E1F43ED23FE8784A0AD694442D35193DAAF5F7DA49B267B716C38F36C92AE7986DF8126904B11EA74323F3AB3AF436D64AC41996529AB95876EE4DF3739130460A50E2EC8463F2306454F08745CE40938858B6237A5D38B33FD6541BB98EFB39A7B0B501B7943FF594DF0964BF535CBD35105E35BA14C40E62D57F3B110AE82CD7F9FF73C3A28740C8EB397494F6D7CF5F0F147385424D70B276C6AD849E56C9985115EAF2CCF3D3A6C828F2A303178EC48BB08F36AF3800739E841F7B758FF06EFA10F6467E98DA4B1B302EFED0EF5A7D3AD74100E41C168ACBBF10EC5FFC497B43409D02D942C144408C32C83ED49334BC48FD1D446FDEBB71CA1F9276F3180ECA057E4B8F19FAFE368D0097EE2A5736D72BE661382939491A244B068D26A071E55E25DF2C8706ADEFD8245BC97A691AB57A8D39CE24469E9CC69198F4F795CACCB45053F464CA0C2F04C71E9CD6BB6D378E917C413B7FADEACD41A7A43E9A1FC04576658DBF7420A35252A899B51F9ED9B2D0B5534A696C2465C950EF5880636D96CC963AF6C314D00834969C45749787B7
-20241204060833 2 6 100 8191 2 DC5E734609D91DA7E5180C89891C148715345D3A56F96DDFF41EE0B90992E9901E55850A78D9DF296A83F5AAF22675720E58E1F6D01F3B45315B818EF9CE880CE92F022763911796D4F86361BEB151ACB400BA017186C1DDCDE5F1853260ECF1082E072C2B7E2FD33E51B5076675269EC247AAE3DF3C1E6853E5D0E58FF7268255E91A9BF6FD43750F114BCA5DC70176ECACAF59C812798941D04FFFF200B53F9843066568A5EF6B324692239A9DC94383C53DA447D942BD51E17F51C22106DC3A2FC7A8942E20E5DA369D19124D184A96589E66EE15C4A8E4CB0FBB6B5E629875DEB3C6AAF622ABC4A4057E0B95533A03C94C514D2129CD6ECE739D9E3A98A54461DF577CC508BF4D5EE7FBE6178B248E3F51C59FE57BFBDE33DD833D0CF22DB22AE0F4F9F03EEF8E0E1DB0EDF7BB4C755148AD2D3FECED23DE1F028A3A6396D7F8F721D11023BD58335ADE175939E140A92C7B532A3D77168E566B7AADEA6F137A158AF3D2608FD4C1081018C1BC2B860A2830A097BDAFA96A3D5B5E1130D2C0778837C63ACBE958573B4ADAC2AE629D17728313AB9064D890006B2F0EC1869E35480B96651B9B3837B876190D5F1876A151A87C58A1CE2A9AD0744BE4CF955BFA9FA5653300FF6ECD64667ECD836D61DC3675048A8EB5AE945B50CB699F7FB4E36167515A2054199687DEC77D5117DF28B63F383403C49097F23AA4DE5857A0D865AFC7E4D0994B46386C20A41E9B41963CD425A82B30C4EE72FB3EFACD6C4090D740E44C196E51F41894FDB26142B72EF1E65A676C30EFB65C937C0F64CDEC167ECC16F0CAA3C932F3DD5C6F7A1EB073F03F2CB9F2059BE75EBAE32FA3170B5FA93D69CAB8275935686242E1F43ED23FE8784A0AD694442D35193DAAF5F7DA49B267B716C38F36C92AE7986DF8126904B11EA74323F3AB3AF436D64AC41996529AB95876EE4DF3739130460A50E2EC8463F2306454F08745CE40938858B6237A5D38B33FD6541BB98EFB39A7B0B501B7943FF594DF0964BF535CBD35105E35BA14C40E62D57F3B110AE82CD7F9FF73C3A28740C8EB397494F6D7CF5F0F147385424D70B276C6AD849E56C9985115EAF2CCF3D3A6C828F2A303178EC48BB08F36AF3800739E841F7B758FF06EFA10F6467E98DA4B1B302EFED0EF5A7D3AD74100E41C168ACBBF10EC5FFC497B43409D02D942C144408C32C83ED49334BC48FD1D446FDEBB71CA1F9276F3180ECA057E4B8F19FAFE368D0097EE2A5736D72BE661382939491A244B068D26A071E55E25DF2C8706ADEFD8245BC97A691AB57A8D39CE24469E9CC69198F4F795CACCB45053F464CA0C2F04C71E9CD6BB6D378E917C413B7FADEACD41A7A43E9A1FC04576658DBF7420A35252A899B51F9ED9B2D0B5534A696C2465C950EF5880636D96CC963AF6C314D00834969C45757D2FFB
-20241204064719 2 6 100 8191 2 DC5E734609D91DA7E5180C89891C148715345D3A56F96DDFF41EE0B90992E9901E55850A78D9DF296A83F5AAF22675720E58E1F6D01F3B45315B818EF9CE880CE92F022763911796D4F86361BEB151ACB400BA017186C1DDCDE5F1853260ECF1082E072C2B7E2FD33E51B5076675269EC247AAE3DF3C1E6853E5D0E58FF7268255E91A9BF6FD43750F114BCA5DC70176ECACAF59C812798941D04FFFF200B53F9843066568A5EF6B324692239A9DC94383C53DA447D942BD51E17F51C22106DC3A2FC7A8942E20E5DA369D19124D184A96589E66EE15C4A8E4CB0FBB6B5E629875DEB3C6AAF622ABC4A4057E0B95533A03C94C514D2129CD6ECE739D9E3A98A54461DF577CC508BF4D5EE7FBE6178B248E3F51C59FE57BFBDE33DD833D0CF22DB22AE0F4F9F03EEF8E0E1DB0EDF7BB4C755148AD2D3FECED23DE1F028A3A6396D7F8F721D11023BD58335ADE175939E140A92C7B532A3D77168E566B7AADEA6F137A158AF3D2608FD4C1081018C1BC2B860A2830A097BDAFA96A3D5B5E1130D2C0778837C63ACBE958573B4ADAC2AE629D17728313AB9064D890006B2F0EC1869E35480B96651B9B3837B876190D5F1876A151A87C58A1CE2A9AD0744BE4CF955BFA9FA5653300FF6ECD64667ECD836D61DC3675048A8EB5AE945B50CB699F7FB4E36167515A2054199687DEC77D5117DF28B63F383403C49097F23AA4DE5857A0D865AFC7E4D0994B46386C20A41E9B41963CD425A82B30C4EE72FB3EFACD6C4090D740E44C196E51F41894FDB26142B72EF1E65A676C30EFB65C937C0F64CDEC167ECC16F0CAA3C932F3DD5C6F7A1EB073F03F2CB9F2059BE75EBAE32FA3170B5FA93D69CAB8275935686242E1F43ED23FE8784A0AD694442D35193DAAF5F7DA49B267B716C38F36C92AE7986DF8126904B11EA74323F3AB3AF436D64AC41996529AB95876EE4DF3739130460A50E2EC8463F2306454F08745CE40938858B6237A5D38B33FD6541BB98EFB39A7B0B501B7943FF594DF0964BF535CBD35105E35BA14C40E62D57F3B110AE82CD7F9FF73C3A28740C8EB397494F6D7CF5F0F147385424D70B276C6AD849E56C9985115EAF2CCF3D3A6C828F2A303178EC48BB08F36AF3800739E841F7B758FF06EFA10F6467E98DA4B1B302EFED0EF5A7D3AD74100E41C168ACBBF10EC5FFC497B43409D02D942C144408C32C83ED49334BC48FD1D446FDEBB71CA1F9276F3180ECA057E4B8F19FAFE368D0097EE2A5736D72BE661382939491A244B068D26A071E55E25DF2C8706ADEFD8245BC97A691AB57A8D39CE24469E9CC69198F4F795CACCB45053F464CA0C2F04C71E9CD6BB6D378E917C413B7FADEACD41A7A43E9A1FC04576658DBF7420A35252A899B51F9ED9B2D0B5534A696C2465C950EF5880636D96CC963AF6C314D00834969C45779594EB
-20241204075858 2 6 100 8191 2 DC5E734609D91DA7E5180C89891C148715345D3A56F96DDFF41EE0B90992E9901E55850A78D9DF296A83F5AAF22675720E58E1F6D01F3B45315B818EF9CE880CE92F022763911796D4F86361BEB151ACB400BA017186C1DDCDE5F1853260ECF1082E072C2B7E2FD33E51B5076675269EC247AAE3DF3C1E6853E5D0E58FF7268255E91A9BF6FD43750F114BCA5DC70176ECACAF59C812798941D04FFFF200B53F9843066568A5EF6B324692239A9DC94383C53DA447D942BD51E17F51C22106DC3A2FC7A8942E20E5DA369D19124D184A96589E66EE15C4A8E4CB0FBB6B5E629875DEB3C6AAF622ABC4A4057E0B95533A03C94C514D2129CD6ECE739D9E3A98A54461DF577CC508BF4D5EE7FBE6178B248E3F51C59FE57BFBDE33DD833D0CF22DB22AE0F4F9F03EEF8E0E1DB0EDF7BB4C755148AD2D3FECED23DE1F028A3A6396D7F8F721D11023BD58335ADE175939E140A92C7B532A3D77168E566B7AADEA6F137A158AF3D2608FD4C1081018C1BC2B860A2830A097BDAFA96A3D5B5E1130D2C0778837C63ACBE958573B4ADAC2AE629D17728313AB9064D890006B2F0EC1869E35480B96651B9B3837B876190D5F1876A151A87C58A1CE2A9AD0744BE4CF955BFA9FA5653300FF6ECD64667ECD836D61DC3675048A8EB5AE945B50CB699F7FB4E36167515A2054199687DEC77D5117DF28B63F383403C49097F23AA4DE5857A0D865AFC7E4D0994B46386C20A41E9B41963CD425A82B30C4EE72FB3EFACD6C4090D740E44C196E51F41894FDB26142B72EF1E65A676C30EFB65C937C0F64CDEC167ECC16F0CAA3C932F3DD5C6F7A1EB073F03F2CB9F2059BE75EBAE32FA3170B5FA93D69CAB8275935686242E1F43ED23FE8784A0AD694442D35193DAAF5F7DA49B267B716C38F36C92AE7986DF8126904B11EA74323F3AB3AF436D64AC41996529AB95876EE4DF3739130460A50E2EC8463F2306454F08745CE40938858B6237A5D38B33FD6541BB98EFB39A7B0B501B7943FF594DF0964BF535CBD35105E35BA14C40E62D57F3B110AE82CD7F9FF73C3A28740C8EB397494F6D7CF5F0F147385424D70B276C6AD849E56C9985115EAF2CCF3D3A6C828F2A303178EC48BB08F36AF3800739E841F7B758FF06EFA10F6467E98DA4B1B302EFED0EF5A7D3AD74100E41C168ACBBF10EC5FFC497B43409D02D942C144408C32C83ED49334BC48FD1D446FDEBB71CA1F9276F3180ECA057E4B8F19FAFE368D0097EE2A5736D72BE661382939491A244B068D26A071E55E25DF2C8706ADEFD8245BC97A691AB57A8D39CE24469E9CC69198F4F795CACCB45053F464CA0C2F04C71E9CD6BB6D378E917C413B7FADEACD41A7A43E9A1FC04576658DBF7420A35252A899B51F9ED9B2D0B5534A696C2465C950EF5880636D96CC963AF6C314D00834969C457B89C8B3
-20241204095845 2 6 100 8191 5 DC5E734609D91DA7E5180C89891C148715345D3A56F96DDFF41EE0B90992E9901E55850A78D9DF296A83F5AAF22675720E58E1F6D01F3B45315B818EF9CE880CE92F022763911796D4F86361BEB151ACB400BA017186C1DDCDE5F1853260ECF1082E072C2B7E2FD33E51B5076675269EC247AAE3DF3C1E6853E5D0E58FF7268255E91A9BF6FD43750F114BCA5DC70176ECACAF59C812798941D04FFFF200B53F9843066568A5EF6B324692239A9DC94383C53DA447D942BD51E17F51C22106DC3A2FC7A8942E20E5DA369D19124D184A96589E66EE15C4A8E4CB0FBB6B5E629875DEB3C6AAF622ABC4A4057E0B95533A03C94C514D2129CD6ECE739D9E3A98A54461DF577CC508BF4D5EE7FBE6178B248E3F51C59FE57BFBDE33DD833D0CF22DB22AE0F4F9F03EEF8E0E1DB0EDF7BB4C755148AD2D3FECED23DE1F028A3A6396D7F8F721D11023BD58335ADE175939E140A92C7B532A3D77168E566B7AADEA6F137A158AF3D2608FD4C1081018C1BC2B860A2830A097BDAFA96A3D5B5E1130D2C0778837C63ACBE958573B4ADAC2AE629D17728313AB9064D890006B2F0EC1869E35480B96651B9B3837B876190D5F1876A151A87C58A1CE2A9AD0744BE4CF955BFA9FA5653300FF6ECD64667ECD836D61DC3675048A8EB5AE945B50CB699F7FB4E36167515A2054199687DEC77D5117DF28B63F383403C49097F23AA4DE5857A0D865AFC7E4D0994B46386C20A41E9B41963CD425A82B30C4EE72FB3EFACD6C4090D740E44C196E51F41894FDB26142B72EF1E65A676C30EFB65C937C0F64CDEC167ECC16F0CAA3C932F3DD5C6F7A1EB073F03F2CB9F2059BE75EBAE32FA3170B5FA93D69CAB8275935686242E1F43ED23FE8784A0AD694442D35193DAAF5F7DA49B267B716C38F36C92AE7986DF8126904B11EA74323F3AB3AF436D64AC41996529AB95876EE4DF3739130460A50E2EC8463F2306454F08745CE40938858B6237A5D38B33FD6541BB98EFB39A7B0B501B7943FF594DF0964BF535CBD35105E35BA14C40E62D57F3B110AE82CD7F9FF73C3A28740C8EB397494F6D7CF5F0F147385424D70B276C6AD849E56C9985115EAF2CCF3D3A6C828F2A303178EC48BB08F36AF3800739E841F7B758FF06EFA10F6467E98DA4B1B302EFED0EF5A7D3AD74100E41C168ACBBF10EC5FFC497B43409D02D942C144408C32C83ED49334BC48FD1D446FDEBB71CA1F9276F3180ECA057E4B8F19FAFE368D0097EE2A5736D72BE661382939491A244B068D26A071E55E25DF2C8706ADEFD8245BC97A691AB57A8D39CE24469E9CC69198F4F795CACCB45053F464CA0C2F04C71E9CD6BB6D378E917C413B7FADEACD41A7A43E9A1FC04576658DBF7420A35252A899B51F9ED9B2D0B5534A696C2465C950EF5880636D96CC963AF6C314D00834969C4582223CAF
-20241204102632 2 6 100 8191 2 DC5E734609D91DA7E5180C89891C148715345D3A56F96DDFF41EE0B90992E9901E55850A78D9DF296A83F5AAF22675720E58E1F6D01F3B45315B818EF9CE880CE92F022763911796D4F86361BEB151ACB400BA017186C1DDCDE5F1853260ECF1082E072C2B7E2FD33E51B5076675269EC247AAE3DF3C1E6853E5D0E58FF7268255E91A9BF6FD43750F114BCA5DC70176ECACAF59C812798941D04FFFF200B53F9843066568A5EF6B324692239A9DC94383C53DA447D942BD51E17F51C22106DC3A2FC7A8942E20E5DA369D19124D184A96589E66EE15C4A8E4CB0FBB6B5E629875DEB3C6AAF622ABC4A4057E0B95533A03C94C514D2129CD6ECE739D9E3A98A54461DF577CC508BF4D5EE7FBE6178B248E3F51C59FE57BFBDE33DD833D0CF22DB22AE0F4F9F03EEF8E0E1DB0EDF7BB4C755148AD2D3FECED23DE1F028A3A6396D7F8F721D11023BD58335ADE175939E140A92C7B532A3D77168E566B7AADEA6F137A158AF3D2608FD4C1081018C1BC2B860A2830A097BDAFA96A3D5B5E1130D2C0778837C63ACBE958573B4ADAC2AE629D17728313AB9064D890006B2F0EC1869E35480B96651B9B3837B876190D5F1876A151A87C58A1CE2A9AD0744BE4CF955BFA9FA5653300FF6ECD64667ECD836D61DC3675048A8EB5AE945B50CB699F7FB4E36167515A2054199687DEC77D5117DF28B63F383403C49097F23AA4DE5857A0D865AFC7E4D0994B46386C20A41E9B41963CD425A82B30C4EE72FB3EFACD6C4090D740E44C196E51F41894FDB26142B72EF1E65A676C30EFB65C937C0F64CDEC167ECC16F0CAA3C932F3DD5C6F7A1EB073F03F2CB9F2059BE75EBAE32FA3170B5FA93D69CAB8275935686242E1F43ED23FE8784A0AD694442D35193DAAF5F7DA49B267B716C38F36C92AE7986DF8126904B11EA74323F3AB3AF436D64AC41996529AB95876EE4DF3739130460A50E2EC8463F2306454F08745CE40938858B6237A5D38B33FD6541BB98EFB39A7B0B501B7943FF594DF0964BF535CBD35105E35BA14C40E62D57F3B110AE82CD7F9FF73C3A28740C8EB397494F6D7CF5F0F147385424D70B276C6AD849E56C9985115EAF2CCF3D3A6C828F2A303178EC48BB08F36AF3800739E841F7B758FF06EFA10F6467E98DA4B1B302EFED0EF5A7D3AD74100E41C168ACBBF10EC5FFC497B43409D02D942C144408C32C83ED49334BC48FD1D446FDEBB71CA1F9276F3180ECA057E4B8F19FAFE368D0097EE2A5736D72BE661382939491A244B068D26A071E55E25DF2C8706ADEFD8245BC97A691AB57A8D39CE24469E9CC69198F4F795CACCB45053F464CA0C2F04C71E9CD6BB6D378E917C413B7FADEACD41A7A43E9A1FC04576658DBF7420A35252A899B51F9ED9B2D0B5534A696C2465C950EF5880636D96CC963AF6C314D00834969C4583A5E7A3
-20241204133310 2 6 100 8191 5 DC5E734609D91DA7E5180C89891C148715345D3A56F96DDFF41EE0B90992E9901E55850A78D9DF296A83F5AAF22675720E58E1F6D01F3B45315B818EF9CE880CE92F022763911796D4F86361BEB151ACB400BA017186C1DDCDE5F1853260ECF1082E072C2B7E2FD33E51B5076675269EC247AAE3DF3C1E6853E5D0E58FF7268255E91A9BF6FD43750F114BCA5DC70176ECACAF59C812798941D04FFFF200B53F9843066568A5EF6B324692239A9DC94383C53DA447D942BD51E17F51C22106DC3A2FC7A8942E20E5DA369D19124D184A96589E66EE15C4A8E4CB0FBB6B5E629875DEB3C6AAF622ABC4A4057E0B95533A03C94C514D2129CD6ECE739D9E3A98A54461DF577CC508BF4D5EE7FBE6178B248E3F51C59FE57BFBDE33DD833D0CF22DB22AE0F4F9F03EEF8E0E1DB0EDF7BB4C755148AD2D3FECED23DE1F028A3A6396D7F8F721D11023BD58335ADE175939E140A92C7B532A3D77168E566B7AADEA6F137A158AF3D2608FD4C1081018C1BC2B860A2830A097BDAFA96A3D5B5E1130D2C0778837C63ACBE958573B4ADAC2AE629D17728313AB9064D890006B2F0EC1869E35480B96651B9B3837B876190D5F1876A151A87C58A1CE2A9AD0744BE4CF955BFA9FA5653300FF6ECD64667ECD836D61DC3675048A8EB5AE945B50CB699F7FB4E36167515A2054199687DEC77D5117DF28B63F383403C49097F23AA4DE5857A0D865AFC7E4D0994B46386C20A41E9B41963CD425A82B30C4EE72FB3EFACD6C4090D740E44C196E51F41894FDB26142B72EF1E65A676C30EFB65C937C0F64CDEC167ECC16F0CAA3C932F3DD5C6F7A1EB073F03F2CB9F2059BE75EBAE32FA3170B5FA93D69CAB8275935686242E1F43ED23FE8784A0AD694442D35193DAAF5F7DA49B267B716C38F36C92AE7986DF8126904B11EA74323F3AB3AF436D64AC41996529AB95876EE4DF3739130460A50E2EC8463F2306454F08745CE40938858B6237A5D38B33FD6541BB98EFB39A7B0B501B7943FF594DF0964BF535CBD35105E35BA14C40E62D57F3B110AE82CD7F9FF73C3A28740C8EB397494F6D7CF5F0F147385424D70B276C6AD849E56C9985115EAF2CCF3D3A6C828F2A303178EC48BB08F36AF3800739E841F7B758FF06EFA10F6467E98DA4B1B302EFED0EF5A7D3AD74100E41C168ACBBF10EC5FFC497B43409D02D942C144408C32C83ED49334BC48FD1D446FDEBB71CA1F9276F3180ECA057E4B8F19FAFE368D0097EE2A5736D72BE661382939491A244B068D26A071E55E25DF2C8706ADEFD8245BC97A691AB57A8D39CE24469E9CC69198F4F795CACCB45053F464CA0C2F04C71E9CD6BB6D378E917C413B7FADEACD41A7A43E9A1FC04576658DBF7420A35252A899B51F9ED9B2D0B5534A696C2465C950EF5880636D96CC963AF6C314D00834969C458E07A8DF
-20241204134006 2 6 100 8191 2 DC5E734609D91DA7E5180C89891C148715345D3A56F96DDFF41EE0B90992E9901E55850A78D9DF296A83F5AAF22675720E58E1F6D01F3B45315B818EF9CE880CE92F022763911796D4F86361BEB151ACB400BA017186C1DDCDE5F1853260ECF1082E072C2B7E2FD33E51B5076675269EC247AAE3DF3C1E6853E5D0E58FF7268255E91A9BF6FD43750F114BCA5DC70176ECACAF59C812798941D04FFFF200B53F9843066568A5EF6B324692239A9DC94383C53DA447D942BD51E17F51C22106DC3A2FC7A8942E20E5DA369D19124D184A96589E66EE15C4A8E4CB0FBB6B5E629875DEB3C6AAF622ABC4A4057E0B95533A03C94C514D2129CD6ECE739D9E3A98A54461DF577CC508BF4D5EE7FBE6178B248E3F51C59FE57BFBDE33DD833D0CF22DB22AE0F4F9F03EEF8E0E1DB0EDF7BB4C755148AD2D3FECED23DE1F028A3A6396D7F8F721D11023BD58335ADE175939E140A92C7B532A3D77168E566B7AADEA6F137A158AF3D2608FD4C1081018C1BC2B860A2830A097BDAFA96A3D5B5E1130D2C0778837C63ACBE958573B4ADAC2AE629D17728313AB9064D890006B2F0EC1869E35480B96651B9B3837B876190D5F1876A151A87C58A1CE2A9AD0744BE4CF955BFA9FA5653300FF6ECD64667ECD836D61DC3675048A8EB5AE945B50CB699F7FB4E36167515A2054199687DEC77D5117DF28B63F383403C49097F23AA4DE5857A0D865AFC7E4D0994B46386C20A41E9B41963CD425A82B30C4EE72FB3EFACD6C4090D740E44C196E51F41894FDB26142B72EF1E65A676C30EFB65C937C0F64CDEC167ECC16F0CAA3C932F3DD5C6F7A1EB073F03F2CB9F2059BE75EBAE32FA3170B5FA93D69CAB8275935686242E1F43ED23FE8784A0AD694442D35193DAAF5F7DA49B267B716C38F36C92AE7986DF8126904B11EA74323F3AB3AF436D64AC41996529AB95876EE4DF3739130460A50E2EC8463F2306454F08745CE40938858B6237A5D38B33FD6541BB98EFB39A7B0B501B7943FF594DF0964BF535CBD35105E35BA14C40E62D57F3B110AE82CD7F9FF73C3A28740C8EB397494F6D7CF5F0F147385424D70B276C6AD849E56C9985115EAF2CCF3D3A6C828F2A303178EC48BB08F36AF3800739E841F7B758FF06EFA10F6467E98DA4B1B302EFED0EF5A7D3AD74100E41C168ACBBF10EC5FFC497B43409D02D942C144408C32C83ED49334BC48FD1D446FDEBB71CA1F9276F3180ECA057E4B8F19FAFE368D0097EE2A5736D72BE661382939491A244B068D26A071E55E25DF2C8706ADEFD8245BC97A691AB57A8D39CE24469E9CC69198F4F795CACCB45053F464CA0C2F04C71E9CD6BB6D378E917C413B7FADEACD41A7A43E9A1FC04576658DBF7420A35252A899B51F9ED9B2D0B5534A696C2465C950EF5880636D96CC963AF6C314D00834969C458E603BF3
-20241204153923 2 6 100 8191 5 DC5E734609D91DA7E5180C89891C148715345D3A56F96DDFF41EE0B90992E9901E55850A78D9DF296A83F5AAF22675720E58E1F6D01F3B45315B818EF9CE880CE92F022763911796D4F86361BEB151ACB400BA017186C1DDCDE5F1853260ECF1082E072C2B7E2FD33E51B5076675269EC247AAE3DF3C1E6853E5D0E58FF7268255E91A9BF6FD43750F114BCA5DC70176ECACAF59C812798941D04FFFF200B53F9843066568A5EF6B324692239A9DC94383C53DA447D942BD51E17F51C22106DC3A2FC7A8942E20E5DA369D19124D184A96589E66EE15C4A8E4CB0FBB6B5E629875DEB3C6AAF622ABC4A4057E0B95533A03C94C514D2129CD6ECE739D9E3A98A54461DF577CC508BF4D5EE7FBE6178B248E3F51C59FE57BFBDE33DD833D0CF22DB22AE0F4F9F03EEF8E0E1DB0EDF7BB4C755148AD2D3FECED23DE1F028A3A6396D7F8F721D11023BD58335ADE175939E140A92C7B532A3D77168E566B7AADEA6F137A158AF3D2608FD4C1081018C1BC2B860A2830A097BDAFA96A3D5B5E1130D2C0778837C63ACBE958573B4ADAC2AE629D17728313AB9064D890006B2F0EC1869E35480B96651B9B3837B876190D5F1876A151A87C58A1CE2A9AD0744BE4CF955BFA9FA5653300FF6ECD64667ECD836D61DC3675048A8EB5AE945B50CB699F7FB4E36167515A2054199687DEC77D5117DF28B63F383403C49097F23AA4DE5857A0D865AFC7E4D0994B46386C20A41E9B41963CD425A82B30C4EE72FB3EFACD6C4090D740E44C196E51F41894FDB26142B72EF1E65A676C30EFB65C937C0F64CDEC167ECC16F0CAA3C932F3DD5C6F7A1EB073F03F2CB9F2059BE75EBAE32FA3170B5FA93D69CAB8275935686242E1F43ED23FE8784A0AD694442D35193DAAF5F7DA49B267B716C38F36C92AE7986DF8126904B11EA74323F3AB3AF436D64AC41996529AB95876EE4DF3739130460A50E2EC8463F2306454F08745CE40938858B6237A5D38B33FD6541BB98EFB39A7B0B501B7943FF594DF0964BF535CBD35105E35BA14C40E62D57F3B110AE82CD7F9FF73C3A28740C8EB397494F6D7CF5F0F147385424D70B276C6AD849E56C9985115EAF2CCF3D3A6C828F2A303178EC48BB08F36AF3800739E841F7B758FF06EFA10F6467E98DA4B1B302EFED0EF5A7D3AD74100E41C168ACBBF10EC5FFC497B43409D02D942C144408C32C83ED49334BC48FD1D446FDEBB71CA1F9276F3180ECA057E4B8F19FAFE368D0097EE2A5736D72BE661382939491A244B068D26A071E55E25DF2C8706ADEFD8245BC97A691AB57A8D39CE24469E9CC69198F4F795CACCB45053F464CA0C2F04C71E9CD6BB6D378E917C413B7FADEACD41A7A43E9A1FC04576658DBF7420A35252A899B51F9ED9B2D0B5534A696C2465C950EF5880636D96CC963AF6C314D00834969C459507D47F
-20241204154043 2 6 100 8191 2 DC5E734609D91DA7E5180C89891C148715345D3A56F96DDFF41EE0B90992E9901E55850A78D9DF296A83F5AAF22675720E58E1F6D01F3B45315B818EF9CE880CE92F022763911796D4F86361BEB151ACB400BA017186C1DDCDE5F1853260ECF1082E072C2B7E2FD33E51B5076675269EC247AAE3DF3C1E6853E5D0E58FF7268255E91A9BF6FD43750F114BCA5DC70176ECACAF59C812798941D04FFFF200B53F9843066568A5EF6B324692239A9DC94383C53DA447D942BD51E17F51C22106DC3A2FC7A8942E20E5DA369D19124D184A96589E66EE15C4A8E4CB0FBB6B5E629875DEB3C6AAF622ABC4A4057E0B95533A03C94C514D2129CD6ECE739D9E3A98A54461DF577CC508BF4D5EE7FBE6178B248E3F51C59FE57BFBDE33DD833D0CF22DB22AE0F4F9F03EEF8E0E1DB0EDF7BB4C755148AD2D3FECED23DE1F028A3A6396D7F8F721D11023BD58335ADE175939E140A92C7B532A3D77168E566B7AADEA6F137A158AF3D2608FD4C1081018C1BC2B860A2830A097BDAFA96A3D5B5E1130D2C0778837C63ACBE958573B4ADAC2AE629D17728313AB9064D890006B2F0EC1869E35480B96651B9B3837B876190D5F1876A151A87C58A1CE2A9AD0744BE4CF955BFA9FA5653300FF6ECD64667ECD836D61DC3675048A8EB5AE945B50CB699F7FB4E36167515A2054199687DEC77D5117DF28B63F383403C49097F23AA4DE5857A0D865AFC7E4D0994B46386C20A41E9B41963CD425A82B30C4EE72FB3EFACD6C4090D740E44C196E51F41894FDB26142B72EF1E65A676C30EFB65C937C0F64CDEC167ECC16F0CAA3C932F3DD5C6F7A1EB073F03F2CB9F2059BE75EBAE32FA3170B5FA93D69CAB8275935686242E1F43ED23FE8784A0AD694442D35193DAAF5F7DA49B267B716C38F36C92AE7986DF8126904B11EA74323F3AB3AF436D64AC41996529AB95876EE4DF3739130460A50E2EC8463F2306454F08745CE40938858B6237A5D38B33FD6541BB98EFB39A7B0B501B7943FF594DF0964BF535CBD35105E35BA14C40E62D57F3B110AE82CD7F9FF73C3A28740C8EB397494F6D7CF5F0F147385424D70B276C6AD849E56C9985115EAF2CCF3D3A6C828F2A303178EC48BB08F36AF3800739E841F7B758FF06EFA10F6467E98DA4B1B302EFED0EF5A7D3AD74100E41C168ACBBF10EC5FFC497B43409D02D942C144408C32C83ED49334BC48FD1D446FDEBB71CA1F9276F3180ECA057E4B8F19FAFE368D0097EE2A5736D72BE661382939491A244B068D26A071E55E25DF2C8706ADEFD8245BC97A691AB57A8D39CE24469E9CC69198F4F795CACCB45053F464CA0C2F04C71E9CD6BB6D378E917C413B7FADEACD41A7A43E9A1FC04576658DBF7420A35252A899B51F9ED9B2D0B5534A696C2465C950EF5880636D96CC963AF6C314D00834969C45951265E3
-20241204161206 2 6 100 8191 2 DC5E734609D91DA7E5180C89891C148715345D3A56F96DDFF41EE0B90992E9901E55850A78D9DF296A83F5AAF22675720E58E1F6D01F3B45315B818EF9CE880CE92F022763911796D4F86361BEB151ACB400BA017186C1DDCDE5F1853260ECF1082E072C2B7E2FD33E51B5076675269EC247AAE3DF3C1E6853E5D0E58FF7268255E91A9BF6FD43750F114BCA5DC70176ECACAF59C812798941D04FFFF200B53F9843066568A5EF6B324692239A9DC94383C53DA447D942BD51E17F51C22106DC3A2FC7A8942E20E5DA369D19124D184A96589E66EE15C4A8E4CB0FBB6B5E629875DEB3C6AAF622ABC4A4057E0B95533A03C94C514D2129CD6ECE739D9E3A98A54461DF577CC508BF4D5EE7FBE6178B248E3F51C59FE57BFBDE33DD833D0CF22DB22AE0F4F9F03EEF8E0E1DB0EDF7BB4C755148AD2D3FECED23DE1F028A3A6396D7F8F721D11023BD58335ADE175939E140A92C7B532A3D77168E566B7AADEA6F137A158AF3D2608FD4C1081018C1BC2B860A2830A097BDAFA96A3D5B5E1130D2C0778837C63ACBE958573B4ADAC2AE629D17728313AB9064D890006B2F0EC1869E35480B96651B9B3837B876190D5F1876A151A87C58A1CE2A9AD0744BE4CF955BFA9FA5653300FF6ECD64667ECD836D61DC3675048A8EB5AE945B50CB699F7FB4E36167515A2054199687DEC77D5117DF28B63F383403C49097F23AA4DE5857A0D865AFC7E4D0994B46386C20A41E9B41963CD425A82B30C4EE72FB3EFACD6C4090D740E44C196E51F41894FDB26142B72EF1E65A676C30EFB65C937C0F64CDEC167ECC16F0CAA3C932F3DD5C6F7A1EB073F03F2CB9F2059BE75EBAE32FA3170B5FA93D69CAB8275935686242E1F43ED23FE8784A0AD694442D35193DAAF5F7DA49B267B716C38F36C92AE7986DF8126904B11EA74323F3AB3AF436D64AC41996529AB95876EE4DF3739130460A50E2EC8463F2306454F08745CE40938858B6237A5D38B33FD6541BB98EFB39A7B0B501B7943FF594DF0964BF535CBD35105E35BA14C40E62D57F3B110AE82CD7F9FF73C3A28740C8EB397494F6D7CF5F0F147385424D70B276C6AD849E56C9985115EAF2CCF3D3A6C828F2A303178EC48BB08F36AF3800739E841F7B758FF06EFA10F6467E98DA4B1B302EFED0EF5A7D3AD74100E41C168ACBBF10EC5FFC497B43409D02D942C144408C32C83ED49334BC48FD1D446FDEBB71CA1F9276F3180ECA057E4B8F19FAFE368D0097EE2A5736D72BE661382939491A244B068D26A071E55E25DF2C8706ADEFD8245BC97A691AB57A8D39CE24469E9CC69198F4F795CACCB45053F464CA0C2F04C71E9CD6BB6D378E917C413B7FADEACD41A7A43E9A1FC04576658DBF7420A35252A899B51F9ED9B2D0B5534A696C2465C950EF5880636D96CC963AF6C314D00834969C4596CC6423
-20241204161425 2 6 100 8191 2 DC5E734609D91DA7E5180C89891C148715345D3A56F96DDFF41EE0B90992E9901E55850A78D9DF296A83F5AAF22675720E58E1F6D01F3B45315B818EF9CE880CE92F022763911796D4F86361BEB151ACB400BA017186C1DDCDE5F1853260ECF1082E072C2B7E2FD33E51B5076675269EC247AAE3DF3C1E6853E5D0E58FF7268255E91A9BF6FD43750F114BCA5DC70176ECACAF59C812798941D04FFFF200B53F9843066568A5EF6B324692239A9DC94383C53DA447D942BD51E17F51C22106DC3A2FC7A8942E20E5DA369D19124D184A96589E66EE15C4A8E4CB0FBB6B5E629875DEB3C6AAF622ABC4A4057E0B95533A03C94C514D2129CD6ECE739D9E3A98A54461DF577CC508BF4D5EE7FBE6178B248E3F51C59FE57BFBDE33DD833D0CF22DB22AE0F4F9F03EEF8E0E1DB0EDF7BB4C755148AD2D3FECED23DE1F028A3A6396D7F8F721D11023BD58335ADE175939E140A92C7B532A3D77168E566B7AADEA6F137A158AF3D2608FD4C1081018C1BC2B860A2830A097BDAFA96A3D5B5E1130D2C0778837C63ACBE958573B4ADAC2AE629D17728313AB9064D890006B2F0EC1869E35480B96651B9B3837B876190D5F1876A151A87C58A1CE2A9AD0744BE4CF955BFA9FA5653300FF6ECD64667ECD836D61DC3675048A8EB5AE945B50CB699F7FB4E36167515A2054199687DEC77D5117DF28B63F383403C49097F23AA4DE5857A0D865AFC7E4D0994B46386C20A41E9B41963CD425A82B30C4EE72FB3EFACD6C4090D740E44C196E51F41894FDB26142B72EF1E65A676C30EFB65C937C0F64CDEC167ECC16F0CAA3C932F3DD5C6F7A1EB073F03F2CB9F2059BE75EBAE32FA3170B5FA93D69CAB8275935686242E1F43ED23FE8784A0AD694442D35193DAAF5F7DA49B267B716C38F36C92AE7986DF8126904B11EA74323F3AB3AF436D64AC41996529AB95876EE4DF3739130460A50E2EC8463F2306454F08745CE40938858B6237A5D38B33FD6541BB98EFB39A7B0B501B7943FF594DF0964BF535CBD35105E35BA14C40E62D57F3B110AE82CD7F9FF73C3A28740C8EB397494F6D7CF5F0F147385424D70B276C6AD849E56C9985115EAF2CCF3D3A6C828F2A303178EC48BB08F36AF3800739E841F7B758FF06EFA10F6467E98DA4B1B302EFED0EF5A7D3AD74100E41C168ACBBF10EC5FFC497B43409D02D942C144408C32C83ED49334BC48FD1D446FDEBB71CA1F9276F3180ECA057E4B8F19FAFE368D0097EE2A5736D72BE661382939491A244B068D26A071E55E25DF2C8706ADEFD8245BC97A691AB57A8D39CE24469E9CC69198F4F795CACCB45053F464CA0C2F04C71E9CD6BB6D378E917C413B7FADEACD41A7A43E9A1FC04576658DBF7420A35252A899B51F9ED9B2D0B5534A696C2465C950EF5880636D96CC963AF6C314D00834969C4596E4BA93
-20241204172055 2 6 100 8191 2 DC5E734609D91DA7E5180C89891C148715345D3A56F96DDFF41EE0B90992E9901E55850A78D9DF296A83F5AAF22675720E58E1F6D01F3B45315B818EF9CE880CE92F022763911796D4F86361BEB151ACB400BA017186C1DDCDE5F1853260ECF1082E072C2B7E2FD33E51B5076675269EC247AAE3DF3C1E6853E5D0E58FF7268255E91A9BF6FD43750F114BCA5DC70176ECACAF59C812798941D04FFFF200B53F9843066568A5EF6B324692239A9DC94383C53DA447D942BD51E17F51C22106DC3A2FC7A8942E20E5DA369D19124D184A96589E66EE15C4A8E4CB0FBB6B5E629875DEB3C6AAF622ABC4A4057E0B95533A03C94C514D2129CD6ECE739D9E3A98A54461DF577CC508BF4D5EE7FBE6178B248E3F51C59FE57BFBDE33DD833D0CF22DB22AE0F4F9F03EEF8E0E1DB0EDF7BB4C755148AD2D3FECED23DE1F028A3A6396D7F8F721D11023BD58335ADE175939E140A92C7B532A3D77168E566B7AADEA6F137A158AF3D2608FD4C1081018C1BC2B860A2830A097BDAFA96A3D5B5E1130D2C0778837C63ACBE958573B4ADAC2AE629D17728313AB9064D890006B2F0EC1869E35480B96651B9B3837B876190D5F1876A151A87C58A1CE2A9AD0744BE4CF955BFA9FA5653300FF6ECD64667ECD836D61DC3675048A8EB5AE945B50CB699F7FB4E36167515A2054199687DEC77D5117DF28B63F383403C49097F23AA4DE5857A0D865AFC7E4D0994B46386C20A41E9B41963CD425A82B30C4EE72FB3EFACD6C4090D740E44C196E51F41894FDB26142B72EF1E65A676C30EFB65C937C0F64CDEC167ECC16F0CAA3C932F3DD5C6F7A1EB073F03F2CB9F2059BE75EBAE32FA3170B5FA93D69CAB8275935686242E1F43ED23FE8784A0AD694442D35193DAAF5F7DA49B267B716C38F36C92AE7986DF8126904B11EA74323F3AB3AF436D64AC41996529AB95876EE4DF3739130460A50E2EC8463F2306454F08745CE40938858B6237A5D38B33FD6541BB98EFB39A7B0B501B7943FF594DF0964BF535CBD35105E35BA14C40E62D57F3B110AE82CD7F9FF73C3A28740C8EB397494F6D7CF5F0F147385424D70B276C6AD849E56C9985115EAF2CCF3D3A6C828F2A303178EC48BB08F36AF3800739E841F7B758FF06EFA10F6467E98DA4B1B302EFED0EF5A7D3AD74100E41C168ACBBF10EC5FFC497B43409D02D942C144408C32C83ED49334BC48FD1D446FDEBB71CA1F9276F3180ECA057E4B8F19FAFE368D0097EE2A5736D72BE661382939491A244B068D26A071E55E25DF2C8706ADEFD8245BC97A691AB57A8D39CE24469E9CC69198F4F795CACCB45053F464CA0C2F04C71E9CD6BB6D378E917C413B7FADEACD41A7A43E9A1FC04576658DBF7420A35252A899B51F9ED9B2D0B5534A696C2465C950EF5880636D96CC963AF6C314D00834969C459A8DA68B
-20241204192705 2 6 100 8191 5 DC5E734609D91DA7E5180C89891C148715345D3A56F96DDFF41EE0B90992E9901E55850A78D9DF296A83F5AAF22675720E58E1F6D01F3B45315B818EF9CE880CE92F022763911796D4F86361BEB151ACB400BA017186C1DDCDE5F1853260ECF1082E072C2B7E2FD33E51B5076675269EC247AAE3DF3C1E6853E5D0E58FF7268255E91A9BF6FD43750F114BCA5DC70176ECACAF59C812798941D04FFFF200B53F9843066568A5EF6B324692239A9DC94383C53DA447D942BD51E17F51C22106DC3A2FC7A8942E20E5DA369D19124D184A96589E66EE15C4A8E4CB0FBB6B5E629875DEB3C6AAF622ABC4A4057E0B95533A03C94C514D2129CD6ECE739D9E3A98A54461DF577CC508BF4D5EE7FBE6178B248E3F51C59FE57BFBDE33DD833D0CF22DB22AE0F4F9F03EEF8E0E1DB0EDF7BB4C755148AD2D3FECED23DE1F028A3A6396D7F8F721D11023BD58335ADE175939E140A92C7B532A3D77168E566B7AADEA6F137A158AF3D2608FD4C1081018C1BC2B860A2830A097BDAFA96A3D5B5E1130D2C0778837C63ACBE958573B4ADAC2AE629D17728313AB9064D890006B2F0EC1869E35480B96651B9B3837B876190D5F1876A151A87C58A1CE2A9AD0744BE4CF955BFA9FA5653300FF6ECD64667ECD836D61DC3675048A8EB5AE945B50CB699F7FB4E36167515A2054199687DEC77D5117DF28B63F383403C49097F23AA4DE5857A0D865AFC7E4D0994B46386C20A41E9B41963CD425A82B30C4EE72FB3EFACD6C4090D740E44C196E51F41894FDB26142B72EF1E65A676C30EFB65C937C0F64CDEC167ECC16F0CAA3C932F3DD5C6F7A1EB073F03F2CB9F2059BE75EBAE32FA3170B5FA93D69CAB8275935686242E1F43ED23FE8784A0AD694442D35193DAAF5F7DA49B267B716C38F36C92AE7986DF8126904B11EA74323F3AB3AF436D64AC41996529AB95876EE4DF3739130460A50E2EC8463F2306454F08745CE40938858B6237A5D38B33FD6541BB98EFB39A7B0B501B7943FF594DF0964BF535CBD35105E35BA14C40E62D57F3B110AE82CD7F9FF73C3A28740C8EB397494F6D7CF5F0F147385424D70B276C6AD849E56C9985115EAF2CCF3D3A6C828F2A303178EC48BB08F36AF3800739E841F7B758FF06EFA10F6467E98DA4B1B302EFED0EF5A7D3AD74100E41C168ACBBF10EC5FFC497B43409D02D942C144408C32C83ED49334BC48FD1D446FDEBB71CA1F9276F3180ECA057E4B8F19FAFE368D0097EE2A5736D72BE661382939491A244B068D26A071E55E25DF2C8706ADEFD8245BC97A691AB57A8D39CE24469E9CC69198F4F795CACCB45053F464CA0C2F04C71E9CD6BB6D378E917C413B7FADEACD41A7A43E9A1FC04576658DBF7420A35252A899B51F9ED9B2D0B5534A696C2465C950EF5880636D96CC963AF6C314D00834969C45A16C53A7
-20241204212358 2 6 100 8191 5 DC5E734609D91DA7E5180C89891C148715345D3A56F96DDFF41EE0B90992E9901E55850A78D9DF296A83F5AAF22675720E58E1F6D01F3B45315B818EF9CE880CE92F022763911796D4F86361BEB151ACB400BA017186C1DDCDE5F1853260ECF1082E072C2B7E2FD33E51B5076675269EC247AAE3DF3C1E6853E5D0E58FF7268255E91A9BF6FD43750F114BCA5DC70176ECACAF59C812798941D04FFFF200B53F9843066568A5EF6B324692239A9DC94383C53DA447D942BD51E17F51C22106DC3A2FC7A8942E20E5DA369D19124D184A96589E66EE15C4A8E4CB0FBB6B5E629875DEB3C6AAF622ABC4A4057E0B95533A03C94C514D2129CD6ECE739D9E3A98A54461DF577CC508BF4D5EE7FBE6178B248E3F51C59FE57BFBDE33DD833D0CF22DB22AE0F4F9F03EEF8E0E1DB0EDF7BB4C755148AD2D3FECED23DE1F028A3A6396D7F8F721D11023BD58335ADE175939E140A92C7B532A3D77168E566B7AADEA6F137A158AF3D2608FD4C1081018C1BC2B860A2830A097BDAFA96A3D5B5E1130D2C0778837C63ACBE958573B4ADAC2AE629D17728313AB9064D890006B2F0EC1869E35480B96651B9B3837B876190D5F1876A151A87C58A1CE2A9AD0744BE4CF955BFA9FA5653300FF6ECD64667ECD836D61DC3675048A8EB5AE945B50CB699F7FB4E36167515A2054199687DEC77D5117DF28B63F383403C49097F23AA4DE5857A0D865AFC7E4D0994B46386C20A41E9B41963CD425A82B30C4EE72FB3EFACD6C4090D740E44C196E51F41894FDB26142B72EF1E65A676C30EFB65C937C0F64CDEC167ECC16F0CAA3C932F3DD5C6F7A1EB073F03F2CB9F2059BE75EBAE32FA3170B5FA93D69CAB8275935686242E1F43ED23FE8784A0AD694442D35193DAAF5F7DA49B267B716C38F36C92AE7986DF8126904B11EA74323F3AB3AF436D64AC41996529AB95876EE4DF3739130460A50E2EC8463F2306454F08745CE40938858B6237A5D38B33FD6541BB98EFB39A7B0B501B7943FF594DF0964BF535CBD35105E35BA14C40E62D57F3B110AE82CD7F9FF73C3A28740C8EB397494F6D7CF5F0F147385424D70B276C6AD849E56C9985115EAF2CCF3D3A6C828F2A303178EC48BB08F36AF3800739E841F7B758FF06EFA10F6467E98DA4B1B302EFED0EF5A7D3AD74100E41C168ACBBF10EC5FFC497B43409D02D942C144408C32C83ED49334BC48FD1D446FDEBB71CA1F9276F3180ECA057E4B8F19FAFE368D0097EE2A5736D72BE661382939491A244B068D26A071E55E25DF2C8706ADEFD8245BC97A691AB57A8D39CE24469E9CC69198F4F795CACCB45053F464CA0C2F04C71E9CD6BB6D378E917C413B7FADEACD41A7A43E9A1FC04576658DBF7420A35252A899B51F9ED9B2D0B5534A696C2465C950EF5880636D96CC963AF6C314D00834969C45A7E3BB4F
-20241204213330 2 6 100 8191 2 DC5E734609D91DA7E5180C89891C148715345D3A56F96DDFF41EE0B90992E9901E55850A78D9DF296A83F5AAF22675720E58E1F6D01F3B45315B818EF9CE880CE92F022763911796D4F86361BEB151ACB400BA017186C1DDCDE5F1853260ECF1082E072C2B7E2FD33E51B5076675269EC247AAE3DF3C1E6853E5D0E58FF7268255E91A9BF6FD43750F114BCA5DC70176ECACAF59C812798941D04FFFF200B53F9843066568A5EF6B324692239A9DC94383C53DA447D942BD51E17F51C22106DC3A2FC7A8942E20E5DA369D19124D184A96589E66EE15C4A8E4CB0FBB6B5E629875DEB3C6AAF622ABC4A4057E0B95533A03C94C514D2129CD6ECE739D9E3A98A54461DF577CC508BF4D5EE7FBE6178B248E3F51C59FE57BFBDE33DD833D0CF22DB22AE0F4F9F03EEF8E0E1DB0EDF7BB4C755148AD2D3FECED23DE1F028A3A6396D7F8F721D11023BD58335ADE175939E140A92C7B532A3D77168E566B7AADEA6F137A158AF3D2608FD4C1081018C1BC2B860A2830A097BDAFA96A3D5B5E1130D2C0778837C63ACBE958573B4ADAC2AE629D17728313AB9064D890006B2F0EC1869E35480B96651B9B3837B876190D5F1876A151A87C58A1CE2A9AD0744BE4CF955BFA9FA5653300FF6ECD64667ECD836D61DC3675048A8EB5AE945B50CB699F7FB4E36167515A2054199687DEC77D5117DF28B63F383403C49097F23AA4DE5857A0D865AFC7E4D0994B46386C20A41E9B41963CD425A82B30C4EE72FB3EFACD6C4090D740E44C196E51F41894FDB26142B72EF1E65A676C30EFB65C937C0F64CDEC167ECC16F0CAA3C932F3DD5C6F7A1EB073F03F2CB9F2059BE75EBAE32FA3170B5FA93D69CAB8275935686242E1F43ED23FE8784A0AD694442D35193DAAF5F7DA49B267B716C38F36C92AE7986DF8126904B11EA74323F3AB3AF436D64AC41996529AB95876EE4DF3739130460A50E2EC8463F2306454F08745CE40938858B6237A5D38B33FD6541BB98EFB39A7B0B501B7943FF594DF0964BF535CBD35105E35BA14C40E62D57F3B110AE82CD7F9FF73C3A28740C8EB397494F6D7CF5F0F147385424D70B276C6AD849E56C9985115EAF2CCF3D3A6C828F2A303178EC48BB08F36AF3800739E841F7B758FF06EFA10F6467E98DA4B1B302EFED0EF5A7D3AD74100E41C168ACBBF10EC5FFC497B43409D02D942C144408C32C83ED49334BC48FD1D446FDEBB71CA1F9276F3180ECA057E4B8F19FAFE368D0097EE2A5736D72BE661382939491A244B068D26A071E55E25DF2C8706ADEFD8245BC97A691AB57A8D39CE24469E9CC69198F4F795CACCB45053F464CA0C2F04C71E9CD6BB6D378E917C413B7FADEACD41A7A43E9A1FC04576658DBF7420A35252A899B51F9ED9B2D0B5534A696C2465C950EF5880636D96CC963AF6C314D00834969C45A86569BB
-20241204221629 2 6 100 8191 2 DC5E734609D91DA7E5180C89891C148715345D3A56F96DDFF41EE0B90992E9901E55850A78D9DF296A83F5AAF22675720E58E1F6D01F3B45315B818EF9CE880CE92F022763911796D4F86361BEB151ACB400BA017186C1DDCDE5F1853260ECF1082E072C2B7E2FD33E51B5076675269EC247AAE3DF3C1E6853E5D0E58FF7268255E91A9BF6FD43750F114BCA5DC70176ECACAF59C812798941D04FFFF200B53F9843066568A5EF6B324692239A9DC94383C53DA447D942BD51E17F51C22106DC3A2FC7A8942E20E5DA369D19124D184A96589E66EE15C4A8E4CB0FBB6B5E629875DEB3C6AAF622ABC4A4057E0B95533A03C94C514D2129CD6ECE739D9E3A98A54461DF577CC508BF4D5EE7FBE6178B248E3F51C59FE57BFBDE33DD833D0CF22DB22AE0F4F9F03EEF8E0E1DB0EDF7BB4C755148AD2D3FECED23DE1F028A3A6396D7F8F721D11023BD58335ADE175939E140A92C7B532A3D77168E566B7AADEA6F137A158AF3D2608FD4C1081018C1BC2B860A2830A097BDAFA96A3D5B5E1130D2C0778837C63ACBE958573B4ADAC2AE629D17728313AB9064D890006B2F0EC1869E35480B96651B9B3837B876190D5F1876A151A87C58A1CE2A9AD0744BE4CF955BFA9FA5653300FF6ECD64667ECD836D61DC3675048A8EB5AE945B50CB699F7FB4E36167515A2054199687DEC77D5117DF28B63F383403C49097F23AA4DE5857A0D865AFC7E4D0994B46386C20A41E9B41963CD425A82B30C4EE72FB3EFACD6C4090D740E44C196E51F41894FDB26142B72EF1E65A676C30EFB65C937C0F64CDEC167ECC16F0CAA3C932F3DD5C6F7A1EB073F03F2CB9F2059BE75EBAE32FA3170B5FA93D69CAB8275935686242E1F43ED23FE8784A0AD694442D35193DAAF5F7DA49B267B716C38F36C92AE7986DF8126904B11EA74323F3AB3AF436D64AC41996529AB95876EE4DF3739130460A50E2EC8463F2306454F08745CE40938858B6237A5D38B33FD6541BB98EFB39A7B0B501B7943FF594DF0964BF535CBD35105E35BA14C40E62D57F3B110AE82CD7F9FF73C3A28740C8EB397494F6D7CF5F0F147385424D70B276C6AD849E56C9985115EAF2CCF3D3A6C828F2A303178EC48BB08F36AF3800739E841F7B758FF06EFA10F6467E98DA4B1B302EFED0EF5A7D3AD74100E41C168ACBBF10EC5FFC497B43409D02D942C144408C32C83ED49334BC48FD1D446FDEBB71CA1F9276F3180ECA057E4B8F19FAFE368D0097EE2A5736D72BE661382939491A244B068D26A071E55E25DF2C8706ADEFD8245BC97A691AB57A8D39CE24469E9CC69198F4F795CACCB45053F464CA0C2F04C71E9CD6BB6D378E917C413B7FADEACD41A7A43E9A1FC04576658DBF7420A35252A899B51F9ED9B2D0B5534A696C2465C950EF5880636D96CC963AF6C314D00834969C45AAC0BC23
-20241205021404 2 6 100 8191 5 DC5E734609D91DA7E5180C89891C148715345D3A56F96DDFF41EE0B90992E9901E55850A78D9DF296A83F5AAF22675720E58E1F6D01F3B45315B818EF9CE880CE92F022763911796D4F86361BEB151ACB400BA017186C1DDCDE5F1853260ECF1082E072C2B7E2FD33E51B5076675269EC247AAE3DF3C1E6853E5D0E58FF7268255E91A9BF6FD43750F114BCA5DC70176ECACAF59C812798941D04FFFF200B53F9843066568A5EF6B324692239A9DC94383C53DA447D942BD51E17F51C22106DC3A2FC7A8942E20E5DA369D19124D184A96589E66EE15C4A8E4CB0FBB6B5E629875DEB3C6AAF622ABC4A4057E0B95533A03C94C514D2129CD6ECE739D9E3A98A54461DF577CC508BF4D5EE7FBE6178B248E3F51C59FE57BFBDE33DD833D0CF22DB22AE0F4F9F03EEF8E0E1DB0EDF7BB4C755148AD2D3FECED23DE1F028A3A6396D7F8F721D11023BD58335ADE175939E140A92C7B532A3D77168E566B7AADEA6F137A158AF3D2608FD4C1081018C1BC2B860A2830A097BDAFA96A3D5B5E1130D2C0778837C63ACBE958573B4ADAC2AE629D17728313AB9064D890006B2F0EC1869E35480B96651B9B3837B876190D5F1876A151A87C58A1CE2A9AD0744BE4CF955BFA9FA5653300FF6ECD64667ECD836D61DC3675048A8EB5AE945B50CB699F7FB4E36167515A2054199687DEC77D5117DF28B63F383403C49097F23AA4DE5857A0D865AFC7E4D0994B46386C20A41E9B41963CD425A82B30C4EE72FB3EFACD6C4090D740E44C196E51F41894FDB26142B72EF1E65A676C30EFB65C937C0F64CDEC167ECC16F0CAA3C932F3DD5C6F7A1EB073F03F2CB9F2059BE75EBAE32FA3170B5FA93D69CAB8275935686242E1F43ED23FE8784A0AD694442D35193DAAF5F7DA49B267B716C38F36C92AE7986DF8126904B11EA74323F3AB3AF436D64AC41996529AB95876EE4DF3739130460A50E2EC8463F2306454F08745CE40938858B6237A5D38B33FD6541BB98EFB39A7B0B501B7943FF594DF0964BF535CBD35105E35BA14C40E62D57F3B110AE82CD7F9FF73C3A28740C8EB397494F6D7CF5F0F147385424D70B276C6AD849E56C9985115EAF2CCF3D3A6C828F2A303178EC48BB08F36AF3800739E841F7B758FF06EFA10F6467E98DA4B1B302EFED0EF5A7D3AD74100E41C168ACBBF10EC5FFC497B43409D02D942C144408C32C83ED49334BC48FD1D446FDEBB71CA1F9276F3180ECA057E4B8F19FAFE368D0097EE2A5736D72BE661382939491A244B068D26A071E55E25DF2C8706ADEFD8245BC97A691AB57A8D39CE24469E9CC69198F4F795CACCB45053F464CA0C2F04C71E9CD6BB6D378E917C413B7FADEACD41A7A43E9A1FC04576658DBF7420A35252A899B51F9ED9B2D0B5534A696C2465C950EF5880636D96CC963AF6C314D00834969C45B80CC4F7
-20241205023328 2 6 100 8191 2 DC5E734609D91DA7E5180C89891C148715345D3A56F96DDFF41EE0B90992E9901E55850A78D9DF296A83F5AAF22675720E58E1F6D01F3B45315B818EF9CE880CE92F022763911796D4F86361BEB151ACB400BA017186C1DDCDE5F1853260ECF1082E072C2B7E2FD33E51B5076675269EC247AAE3DF3C1E6853E5D0E58FF7268255E91A9BF6FD43750F114BCA5DC70176ECACAF59C812798941D04FFFF200B53F9843066568A5EF6B324692239A9DC94383C53DA447D942BD51E17F51C22106DC3A2FC7A8942E20E5DA369D19124D184A96589E66EE15C4A8E4CB0FBB6B5E629875DEB3C6AAF622ABC4A4057E0B95533A03C94C514D2129CD6ECE739D9E3A98A54461DF577CC508BF4D5EE7FBE6178B248E3F51C59FE57BFBDE33DD833D0CF22DB22AE0F4F9F03EEF8E0E1DB0EDF7BB4C755148AD2D3FECED23DE1F028A3A6396D7F8F721D11023BD58335ADE175939E140A92C7B532A3D77168E566B7AADEA6F137A158AF3D2608FD4C1081018C1BC2B860A2830A097BDAFA96A3D5B5E1130D2C0778837C63ACBE958573B4ADAC2AE629D17728313AB9064D890006B2F0EC1869E35480B96651B9B3837B876190D5F1876A151A87C58A1CE2A9AD0744BE4CF955BFA9FA5653300FF6ECD64667ECD836D61DC3675048A8EB5AE945B50CB699F7FB4E36167515A2054199687DEC77D5117DF28B63F383403C49097F23AA4DE5857A0D865AFC7E4D0994B46386C20A41E9B41963CD425A82B30C4EE72FB3EFACD6C4090D740E44C196E51F41894FDB26142B72EF1E65A676C30EFB65C937C0F64CDEC167ECC16F0CAA3C932F3DD5C6F7A1EB073F03F2CB9F2059BE75EBAE32FA3170B5FA93D69CAB8275935686242E1F43ED23FE8784A0AD694442D35193DAAF5F7DA49B267B716C38F36C92AE7986DF8126904B11EA74323F3AB3AF436D64AC41996529AB95876EE4DF3739130460A50E2EC8463F2306454F08745CE40938858B6237A5D38B33FD6541BB98EFB39A7B0B501B7943FF594DF0964BF535CBD35105E35BA14C40E62D57F3B110AE82CD7F9FF73C3A28740C8EB397494F6D7CF5F0F147385424D70B276C6AD849E56C9985115EAF2CCF3D3A6C828F2A303178EC48BB08F36AF3800739E841F7B758FF06EFA10F6467E98DA4B1B302EFED0EF5A7D3AD74100E41C168ACBBF10EC5FFC497B43409D02D942C144408C32C83ED49334BC48FD1D446FDEBB71CA1F9276F3180ECA057E4B8F19FAFE368D0097EE2A5736D72BE661382939491A244B068D26A071E55E25DF2C8706ADEFD8245BC97A691AB57A8D39CE24469E9CC69198F4F795CACCB45053F464CA0C2F04C71E9CD6BB6D378E917C413B7FADEACD41A7A43E9A1FC04576658DBF7420A35252A899B51F9ED9B2D0B5534A696C2465C950EF5880636D96CC963AF6C314D00834969C45B9166F1B
-20241205040105 2 6 100 8191 5 DC5E734609D91DA7E5180C89891C148715345D3A56F96DDFF41EE0B90992E9901E55850A78D9DF296A83F5AAF22675720E58E1F6D01F3B45315B818EF9CE880CE92F022763911796D4F86361BEB151ACB400BA017186C1DDCDE5F1853260ECF1082E072C2B7E2FD33E51B5076675269EC247AAE3DF3C1E6853E5D0E58FF7268255E91A9BF6FD43750F114BCA5DC70176ECACAF59C812798941D04FFFF200B53F9843066568A5EF6B324692239A9DC94383C53DA447D942BD51E17F51C22106DC3A2FC7A8942E20E5DA369D19124D184A96589E66EE15C4A8E4CB0FBB6B5E629875DEB3C6AAF622ABC4A4057E0B95533A03C94C514D2129CD6ECE739D9E3A98A54461DF577CC508BF4D5EE7FBE6178B248E3F51C59FE57BFBDE33DD833D0CF22DB22AE0F4F9F03EEF8E0E1DB0EDF7BB4C755148AD2D3FECED23DE1F028A3A6396D7F8F721D11023BD58335ADE175939E140A92C7B532A3D77168E566B7AADEA6F137A158AF3D2608FD4C1081018C1BC2B860A2830A097BDAFA96A3D5B5E1130D2C0778837C63ACBE958573B4ADAC2AE629D17728313AB9064D890006B2F0EC1869E35480B96651B9B3837B876190D5F1876A151A87C58A1CE2A9AD0744BE4CF955BFA9FA5653300FF6ECD64667ECD836D61DC3675048A8EB5AE945B50CB699F7FB4E36167515A2054199687DEC77D5117DF28B63F383403C49097F23AA4DE5857A0D865AFC7E4D0994B46386C20A41E9B41963CD425A82B30C4EE72FB3EFACD6C4090D740E44C196E51F41894FDB26142B72EF1E65A676C30EFB65C937C0F64CDEC167ECC16F0CAA3C932F3DD5C6F7A1EB073F03F2CB9F2059BE75EBAE32FA3170B5FA93D69CAB8275935686242E1F43ED23FE8784A0AD694442D35193DAAF5F7DA49B267B716C38F36C92AE7986DF8126904B11EA74323F3AB3AF436D64AC41996529AB95876EE4DF3739130460A50E2EC8463F2306454F08745CE40938858B6237A5D38B33FD6541BB98EFB39A7B0B501B7943FF594DF0964BF535CBD35105E35BA14C40E62D57F3B110AE82CD7F9FF73C3A28740C8EB397494F6D7CF5F0F147385424D70B276C6AD849E56C9985115EAF2CCF3D3A6C828F2A303178EC48BB08F36AF3800739E841F7B758FF06EFA10F6467E98DA4B1B302EFED0EF5A7D3AD74100E41C168ACBBF10EC5FFC497B43409D02D942C144408C32C83ED49334BC48FD1D446FDEBB71CA1F9276F3180ECA057E4B8F19FAFE368D0097EE2A5736D72BE661382939491A244B068D26A071E55E25DF2C8706ADEFD8245BC97A691AB57A8D39CE24469E9CC69198F4F795CACCB45053F464CA0C2F04C71E9CD6BB6D378E917C413B7FADEACD41A7A43E9A1FC04576658DBF7420A35252A899B51F9ED9B2D0B5534A696C2465C950EF5880636D96CC963AF6C314D00834969C45BE03F83F
-20241205055343 2 6 100 8191 2 DC5E734609D91DA7E5180C89891C148715345D3A56F96DDFF41EE0B90992E9901E55850A78D9DF296A83F5AAF22675720E58E1F6D01F3B45315B818EF9CE880CE92F022763911796D4F86361BEB151ACB400BA017186C1DDCDE5F1853260ECF1082E072C2B7E2FD33E51B5076675269EC247AAE3DF3C1E6853E5D0E58FF7268255E91A9BF6FD43750F114BCA5DC70176ECACAF59C812798941D04FFFF200B53F9843066568A5EF6B324692239A9DC94383C53DA447D942BD51E17F51C22106DC3A2FC7A8942E20E5DA369D19124D184A96589E66EE15C4A8E4CB0FBB6B5E629875DEB3C6AAF622ABC4A4057E0B95533A03C94C514D2129CD6ECE739D9E3A98A54461DF577CC508BF4D5EE7FBE6178B248E3F51C59FE57BFBDE33DD833D0CF22DB22AE0F4F9F03EEF8E0E1DB0EDF7BB4C755148AD2D3FECED23DE1F028A3A6396D7F8F721D11023BD58335ADE175939E140A92C7B532A3D77168E566B7AADEA6F137A158AF3D2608FD4C1081018C1BC2B860A2830A097BDAFA96A3D5B5E1130D2C0778837C63ACBE958573B4ADAC2AE629D17728313AB9064D890006B2F0EC1869E35480B96651B9B3837B876190D5F1876A151A87C58A1CE2A9AD0744BE4CF955BFA9FA5653300FF6ECD64667ECD836D61DC3675048A8EB5AE945B50CB699F7FB4E36167515A2054199687DEC77D5117DF28B63F383403C49097F23AA4DE5857A0D865AFC7E4D0994B46386C20A41E9B41963CD425A82B30C4EE72FB3EFACD6C4090D740E44C196E51F41894FDB26142B72EF1E65A676C30EFB65C937C0F64CDEC167ECC16F0CAA3C932F3DD5C6F7A1EB073F03F2CB9F2059BE75EBAE32FA3170B5FA93D69CAB8275935686242E1F43ED23FE8784A0AD694442D35193DAAF5F7DA49B267B716C38F36C92AE7986DF8126904B11EA74323F3AB3AF436D64AC41996529AB95876EE4DF3739130460A50E2EC8463F2306454F08745CE40938858B6237A5D38B33FD6541BB98EFB39A7B0B501B7943FF594DF0964BF535CBD35105E35BA14C40E62D57F3B110AE82CD7F9FF73C3A28740C8EB397494F6D7CF5F0F147385424D70B276C6AD849E56C9985115EAF2CCF3D3A6C828F2A303178EC48BB08F36AF3800739E841F7B758FF06EFA10F6467E98DA4B1B302EFED0EF5A7D3AD74100E41C168ACBBF10EC5FFC497B43409D02D942C144408C32C83ED49334BC48FD1D446FDEBB71CA1F9276F3180ECA057E4B8F19FAFE368D0097EE2A5736D72BE661382939491A244B068D26A071E55E25DF2C8706ADEFD8245BC97A691AB57A8D39CE24469E9CC69198F4F795CACCB45053F464CA0C2F04C71E9CD6BB6D378E917C413B7FADEACD41A7A43E9A1FC04576658DBF7420A35252A899B51F9ED9B2D0B5534A696C2465C950EF5880636D96CC963AF6C314D00834969C45C44A5013
-20241205065151 2 6 100 8191 2 DC5E734609D91DA7E5180C89891C148715345D3A56F96DDFF41EE0B90992E9901E55850A78D9DF296A83F5AAF22675720E58E1F6D01F3B45315B818EF9CE880CE92F022763911796D4F86361BEB151ACB400BA017186C1DDCDE5F1853260ECF1082E072C2B7E2FD33E51B5076675269EC247AAE3DF3C1E6853E5D0E58FF7268255E91A9BF6FD43750F114BCA5DC70176ECACAF59C812798941D04FFFF200B53F9843066568A5EF6B324692239A9DC94383C53DA447D942BD51E17F51C22106DC3A2FC7A8942E20E5DA369D19124D184A96589E66EE15C4A8E4CB0FBB6B5E629875DEB3C6AAF622ABC4A4057E0B95533A03C94C514D2129CD6ECE739D9E3A98A54461DF577CC508BF4D5EE7FBE6178B248E3F51C59FE57BFBDE33DD833D0CF22DB22AE0F4F9F03EEF8E0E1DB0EDF7BB4C755148AD2D3FECED23DE1F028A3A6396D7F8F721D11023BD58335ADE175939E140A92C7B532A3D77168E566B7AADEA6F137A158AF3D2608FD4C1081018C1BC2B860A2830A097BDAFA96A3D5B5E1130D2C0778837C63ACBE958573B4ADAC2AE629D17728313AB9064D890006B2F0EC1869E35480B96651B9B3837B876190D5F1876A151A87C58A1CE2A9AD0744BE4CF955BFA9FA5653300FF6ECD64667ECD836D61DC3675048A8EB5AE945B50CB699F7FB4E36167515A2054199687DEC77D5117DF28B63F383403C49097F23AA4DE5857A0D865AFC7E4D0994B46386C20A41E9B41963CD425A82B30C4EE72FB3EFACD6C4090D740E44C196E51F41894FDB26142B72EF1E65A676C30EFB65C937C0F64CDEC167ECC16F0CAA3C932F3DD5C6F7A1EB073F03F2CB9F2059BE75EBAE32FA3170B5FA93D69CAB8275935686242E1F43ED23FE8784A0AD694442D35193DAAF5F7DA49B267B716C38F36C92AE7986DF8126904B11EA74323F3AB3AF436D64AC41996529AB95876EE4DF3739130460A50E2EC8463F2306454F08745CE40938858B6237A5D38B33FD6541BB98EFB39A7B0B501B7943FF594DF0964BF535CBD35105E35BA14C40E62D57F3B110AE82CD7F9FF73C3A28740C8EB397494F6D7CF5F0F147385424D70B276C6AD849E56C9985115EAF2CCF3D3A6C828F2A303178EC48BB08F36AF3800739E841F7B758FF06EFA10F6467E98DA4B1B302EFED0EF5A7D3AD74100E41C168ACBBF10EC5FFC497B43409D02D942C144408C32C83ED49334BC48FD1D446FDEBB71CA1F9276F3180ECA057E4B8F19FAFE368D0097EE2A5736D72BE661382939491A244B068D26A071E55E25DF2C8706ADEFD8245BC97A691AB57A8D39CE24469E9CC69198F4F795CACCB45053F464CA0C2F04C71E9CD6BB6D378E917C413B7FADEACD41A7A43E9A1FC04576658DBF7420A35252A899B51F9ED9B2D0B5534A696C2465C950EF5880636D96CC963AF6C314D00834969C45C77D34CB
-20241205065416 2 6 100 8191 2 DC5E734609D91DA7E5180C89891C148715345D3A56F96DDFF41EE0B90992E9901E55850A78D9DF296A83F5AAF22675720E58E1F6D01F3B45315B818EF9CE880CE92F022763911796D4F86361BEB151ACB400BA017186C1DDCDE5F1853260ECF1082E072C2B7E2FD33E51B5076675269EC247AAE3DF3C1E6853E5D0E58FF7268255E91A9BF6FD43750F114BCA5DC70176ECACAF59C812798941D04FFFF200B53F9843066568A5EF6B324692239A9DC94383C53DA447D942BD51E17F51C22106DC3A2FC7A8942E20E5DA369D19124D184A96589E66EE15C4A8E4CB0FBB6B5E629875DEB3C6AAF622ABC4A4057E0B95533A03C94C514D2129CD6ECE739D9E3A98A54461DF577CC508BF4D5EE7FBE6178B248E3F51C59FE57BFBDE33DD833D0CF22DB22AE0F4F9F03EEF8E0E1DB0EDF7BB4C755148AD2D3FECED23DE1F028A3A6396D7F8F721D11023BD58335ADE175939E140A92C7B532A3D77168E566B7AADEA6F137A158AF3D2608FD4C1081018C1BC2B860A2830A097BDAFA96A3D5B5E1130D2C0778837C63ACBE958573B4ADAC2AE629D17728313AB9064D890006B2F0EC1869E35480B96651B9B3837B876190D5F1876A151A87C58A1CE2A9AD0744BE4CF955BFA9FA5653300FF6ECD64667ECD836D61DC3675048A8EB5AE945B50CB699F7FB4E36167515A2054199687DEC77D5117DF28B63F383403C49097F23AA4DE5857A0D865AFC7E4D0994B46386C20A41E9B41963CD425A82B30C4EE72FB3EFACD6C4090D740E44C196E51F41894FDB26142B72EF1E65A676C30EFB65C937C0F64CDEC167ECC16F0CAA3C932F3DD5C6F7A1EB073F03F2CB9F2059BE75EBAE32FA3170B5FA93D69CAB8275935686242E1F43ED23FE8784A0AD694442D35193DAAF5F7DA49B267B716C38F36C92AE7986DF8126904B11EA74323F3AB3AF436D64AC41996529AB95876EE4DF3739130460A50E2EC8463F2306454F08745CE40938858B6237A5D38B33FD6541BB98EFB39A7B0B501B7943FF594DF0964BF535CBD35105E35BA14C40E62D57F3B110AE82CD7F9FF73C3A28740C8EB397494F6D7CF5F0F147385424D70B276C6AD849E56C9985115EAF2CCF3D3A6C828F2A303178EC48BB08F36AF3800739E841F7B758FF06EFA10F6467E98DA4B1B302EFED0EF5A7D3AD74100E41C168ACBBF10EC5FFC497B43409D02D942C144408C32C83ED49334BC48FD1D446FDEBB71CA1F9276F3180ECA057E4B8F19FAFE368D0097EE2A5736D72BE661382939491A244B068D26A071E55E25DF2C8706ADEFD8245BC97A691AB57A8D39CE24469E9CC69198F4F795CACCB45053F464CA0C2F04C71E9CD6BB6D378E917C413B7FADEACD41A7A43E9A1FC04576658DBF7420A35252A899B51F9ED9B2D0B5534A696C2465C950EF5880636D96CC963AF6C314D00834969C45C79803AB
-20241205074544 2 6 100 8191 5 DC5E734609D91DA7E5180C89891C148715345D3A56F96DDFF41EE0B90992E9901E55850A78D9DF296A83F5AAF22675720E58E1F6D01F3B45315B818EF9CE880CE92F022763911796D4F86361BEB151ACB400BA017186C1DDCDE5F1853260ECF1082E072C2B7E2FD33E51B5076675269EC247AAE3DF3C1E6853E5D0E58FF7268255E91A9BF6FD43750F114BCA5DC70176ECACAF59C812798941D04FFFF200B53F9843066568A5EF6B324692239A9DC94383C53DA447D942BD51E17F51C22106DC3A2FC7A8942E20E5DA369D19124D184A96589E66EE15C4A8E4CB0FBB6B5E629875DEB3C6AAF622ABC4A4057E0B95533A03C94C514D2129CD6ECE739D9E3A98A54461DF577CC508BF4D5EE7FBE6178B248E3F51C59FE57BFBDE33DD833D0CF22DB22AE0F4F9F03EEF8E0E1DB0EDF7BB4C755148AD2D3FECED23DE1F028A3A6396D7F8F721D11023BD58335ADE175939E140A92C7B532A3D77168E566B7AADEA6F137A158AF3D2608FD4C1081018C1BC2B860A2830A097BDAFA96A3D5B5E1130D2C0778837C63ACBE958573B4ADAC2AE629D17728313AB9064D890006B2F0EC1869E35480B96651B9B3837B876190D5F1876A151A87C58A1CE2A9AD0744BE4CF955BFA9FA5653300FF6ECD64667ECD836D61DC3675048A8EB5AE945B50CB699F7FB4E36167515A2054199687DEC77D5117DF28B63F383403C49097F23AA4DE5857A0D865AFC7E4D0994B46386C20A41E9B41963CD425A82B30C4EE72FB3EFACD6C4090D740E44C196E51F41894FDB26142B72EF1E65A676C30EFB65C937C0F64CDEC167ECC16F0CAA3C932F3DD5C6F7A1EB073F03F2CB9F2059BE75EBAE32FA3170B5FA93D69CAB8275935686242E1F43ED23FE8784A0AD694442D35193DAAF5F7DA49B267B716C38F36C92AE7986DF8126904B11EA74323F3AB3AF436D64AC41996529AB95876EE4DF3739130460A50E2EC8463F2306454F08745CE40938858B6237A5D38B33FD6541BB98EFB39A7B0B501B7943FF594DF0964BF535CBD35105E35BA14C40E62D57F3B110AE82CD7F9FF73C3A28740C8EB397494F6D7CF5F0F147385424D70B276C6AD849E56C9985115EAF2CCF3D3A6C828F2A303178EC48BB08F36AF3800739E841F7B758FF06EFA10F6467E98DA4B1B302EFED0EF5A7D3AD74100E41C168ACBBF10EC5FFC497B43409D02D942C144408C32C83ED49334BC48FD1D446FDEBB71CA1F9276F3180ECA057E4B8F19FAFE368D0097EE2A5736D72BE661382939491A244B068D26A071E55E25DF2C8706ADEFD8245BC97A691AB57A8D39CE24469E9CC69198F4F795CACCB45053F464CA0C2F04C71E9CD6BB6D378E917C413B7FADEACD41A7A43E9A1FC04576658DBF7420A35252A899B51F9ED9B2D0B5534A696C2465C950EF5880636D96CC963AF6C314D00834969C45CA71FBC7
-20241205081641 2 6 100 8191 2 DC5E734609D91DA7E5180C89891C148715345D3A56F96DDFF41EE0B90992E9901E55850A78D9DF296A83F5AAF22675720E58E1F6D01F3B45315B818EF9CE880CE92F022763911796D4F86361BEB151ACB400BA017186C1DDCDE5F1853260ECF1082E072C2B7E2FD33E51B5076675269EC247AAE3DF3C1E6853E5D0E58FF7268255E91A9BF6FD43750F114BCA5DC70176ECACAF59C812798941D04FFFF200B53F9843066568A5EF6B324692239A9DC94383C53DA447D942BD51E17F51C22106DC3A2FC7A8942E20E5DA369D19124D184A96589E66EE15C4A8E4CB0FBB6B5E629875DEB3C6AAF622ABC4A4057E0B95533A03C94C514D2129CD6ECE739D9E3A98A54461DF577CC508BF4D5EE7FBE6178B248E3F51C59FE57BFBDE33DD833D0CF22DB22AE0F4F9F03EEF8E0E1DB0EDF7BB4C755148AD2D3FECED23DE1F028A3A6396D7F8F721D11023BD58335ADE175939E140A92C7B532A3D77168E566B7AADEA6F137A158AF3D2608FD4C1081018C1BC2B860A2830A097BDAFA96A3D5B5E1130D2C0778837C63ACBE958573B4ADAC2AE629D17728313AB9064D890006B2F0EC1869E35480B96651B9B3837B876190D5F1876A151A87C58A1CE2A9AD0744BE4CF955BFA9FA5653300FF6ECD64667ECD836D61DC3675048A8EB5AE945B50CB699F7FB4E36167515A2054199687DEC77D5117DF28B63F383403C49097F23AA4DE5857A0D865AFC7E4D0994B46386C20A41E9B41963CD425A82B30C4EE72FB3EFACD6C4090D740E44C196E51F41894FDB26142B72EF1E65A676C30EFB65C937C0F64CDEC167ECC16F0CAA3C932F3DD5C6F7A1EB073F03F2CB9F2059BE75EBAE32FA3170B5FA93D69CAB8275935686242E1F43ED23FE8784A0AD694442D35193DAAF5F7DA49B267B716C38F36C92AE7986DF8126904B11EA74323F3AB3AF436D64AC41996529AB95876EE4DF3739130460A50E2EC8463F2306454F08745CE40938858B6237A5D38B33FD6541BB98EFB39A7B0B501B7943FF594DF0964BF535CBD35105E35BA14C40E62D57F3B110AE82CD7F9FF73C3A28740C8EB397494F6D7CF5F0F147385424D70B276C6AD849E56C9985115EAF2CCF3D3A6C828F2A303178EC48BB08F36AF3800739E841F7B758FF06EFA10F6467E98DA4B1B302EFED0EF5A7D3AD74100E41C168ACBBF10EC5FFC497B43409D02D942C144408C32C83ED49334BC48FD1D446FDEBB71CA1F9276F3180ECA057E4B8F19FAFE368D0097EE2A5736D72BE661382939491A244B068D26A071E55E25DF2C8706ADEFD8245BC97A691AB57A8D39CE24469E9CC69198F4F795CACCB45053F464CA0C2F04C71E9CD6BB6D378E917C413B7FADEACD41A7A43E9A1FC04576658DBF7420A35252A899B51F9ED9B2D0B5534A696C2465C950EF5880636D96CC963AF6C314D00834969C45CC1BDF6B
-20241205092757 2 6 100 8191 2 DC5E734609D91DA7E5180C89891C148715345D3A56F96DDFF41EE0B90992E9901E55850A78D9DF296A83F5AAF22675720E58E1F6D01F3B45315B818EF9CE880CE92F022763911796D4F86361BEB151ACB400BA017186C1DDCDE5F1853260ECF1082E072C2B7E2FD33E51B5076675269EC247AAE3DF3C1E6853E5D0E58FF7268255E91A9BF6FD43750F114BCA5DC70176ECACAF59C812798941D04FFFF200B53F9843066568A5EF6B324692239A9DC94383C53DA447D942BD51E17F51C22106DC3A2FC7A8942E20E5DA369D19124D184A96589E66EE15C4A8E4CB0FBB6B5E629875DEB3C6AAF622ABC4A4057E0B95533A03C94C514D2129CD6ECE739D9E3A98A54461DF577CC508BF4D5EE7FBE6178B248E3F51C59FE57BFBDE33DD833D0CF22DB22AE0F4F9F03EEF8E0E1DB0EDF7BB4C755148AD2D3FECED23DE1F028A3A6396D7F8F721D11023BD58335ADE175939E140A92C7B532A3D77168E566B7AADEA6F137A158AF3D2608FD4C1081018C1BC2B860A2830A097BDAFA96A3D5B5E1130D2C0778837C63ACBE958573B4ADAC2AE629D17728313AB9064D890006B2F0EC1869E35480B96651B9B3837B876190D5F1876A151A87C58A1CE2A9AD0744BE4CF955BFA9FA5653300FF6ECD64667ECD836D61DC3675048A8EB5AE945B50CB699F7FB4E36167515A2054199687DEC77D5117DF28B63F383403C49097F23AA4DE5857A0D865AFC7E4D0994B46386C20A41E9B41963CD425A82B30C4EE72FB3EFACD6C4090D740E44C196E51F41894FDB26142B72EF1E65A676C30EFB65C937C0F64CDEC167ECC16F0CAA3C932F3DD5C6F7A1EB073F03F2CB9F2059BE75EBAE32FA3170B5FA93D69CAB8275935686242E1F43ED23FE8784A0AD694442D35193DAAF5F7DA49B267B716C38F36C92AE7986DF8126904B11EA74323F3AB3AF436D64AC41996529AB95876EE4DF3739130460A50E2EC8463F2306454F08745CE40938858B6237A5D38B33FD6541BB98EFB39A7B0B501B7943FF594DF0964BF535CBD35105E35BA14C40E62D57F3B110AE82CD7F9FF73C3A28740C8EB397494F6D7CF5F0F147385424D70B276C6AD849E56C9985115EAF2CCF3D3A6C828F2A303178EC48BB08F36AF3800739E841F7B758FF06EFA10F6467E98DA4B1B302EFED0EF5A7D3AD74100E41C168ACBBF10EC5FFC497B43409D02D942C144408C32C83ED49334BC48FD1D446FDEBB71CA1F9276F3180ECA057E4B8F19FAFE368D0097EE2A5736D72BE661382939491A244B068D26A071E55E25DF2C8706ADEFD8245BC97A691AB57A8D39CE24469E9CC69198F4F795CACCB45053F464CA0C2F04C71E9CD6BB6D378E917C413B7FADEACD41A7A43E9A1FC04576658DBF7420A35252A899B51F9ED9B2D0B5534A696C2465C950EF5880636D96CC963AF6C314D00834969C45CFFBAE8B
-20241205110223 2 6 100 8191 2 DC5E734609D91DA7E5180C89891C148715345D3A56F96DDFF41EE0B90992E9901E55850A78D9DF296A83F5AAF22675720E58E1F6D01F3B45315B818EF9CE880CE92F022763911796D4F86361BEB151ACB400BA017186C1DDCDE5F1853260ECF1082E072C2B7E2FD33E51B5076675269EC247AAE3DF3C1E6853E5D0E58FF7268255E91A9BF6FD43750F114BCA5DC70176ECACAF59C812798941D04FFFF200B53F9843066568A5EF6B324692239A9DC94383C53DA447D942BD51E17F51C22106DC3A2FC7A8942E20E5DA369D19124D184A96589E66EE15C4A8E4CB0FBB6B5E629875DEB3C6AAF622ABC4A4057E0B95533A03C94C514D2129CD6ECE739D9E3A98A54461DF577CC508BF4D5EE7FBE6178B248E3F51C59FE57BFBDE33DD833D0CF22DB22AE0F4F9F03EEF8E0E1DB0EDF7BB4C755148AD2D3FECED23DE1F028A3A6396D7F8F721D11023BD58335ADE175939E140A92C7B532A3D77168E566B7AADEA6F137A158AF3D2608FD4C1081018C1BC2B860A2830A097BDAFA96A3D5B5E1130D2C0778837C63ACBE958573B4ADAC2AE629D17728313AB9064D890006B2F0EC1869E35480B96651B9B3837B876190D5F1876A151A87C58A1CE2A9AD0744BE4CF955BFA9FA5653300FF6ECD64667ECD836D61DC3675048A8EB5AE945B50CB699F7FB4E36167515A2054199687DEC77D5117DF28B63F383403C49097F23AA4DE5857A0D865AFC7E4D0994B46386C20A41E9B41963CD425A82B30C4EE72FB3EFACD6C4090D740E44C196E51F41894FDB26142B72EF1E65A676C30EFB65C937C0F64CDEC167ECC16F0CAA3C932F3DD5C6F7A1EB073F03F2CB9F2059BE75EBAE32FA3170B5FA93D69CAB8275935686242E1F43ED23FE8784A0AD694442D35193DAAF5F7DA49B267B716C38F36C92AE7986DF8126904B11EA74323F3AB3AF436D64AC41996529AB95876EE4DF3739130460A50E2EC8463F2306454F08745CE40938858B6237A5D38B33FD6541BB98EFB39A7B0B501B7943FF594DF0964BF535CBD35105E35BA14C40E62D57F3B110AE82CD7F9FF73C3A28740C8EB397494F6D7CF5F0F147385424D70B276C6AD849E56C9985115EAF2CCF3D3A6C828F2A303178EC48BB08F36AF3800739E841F7B758FF06EFA10F6467E98DA4B1B302EFED0EF5A7D3AD74100E41C168ACBBF10EC5FFC497B43409D02D942C144408C32C83ED49334BC48FD1D446FDEBB71CA1F9276F3180ECA057E4B8F19FAFE368D0097EE2A5736D72BE661382939491A244B068D26A071E55E25DF2C8706ADEFD8245BC97A691AB57A8D39CE24469E9CC69198F4F795CACCB45053F464CA0C2F04C71E9CD6BB6D378E917C413B7FADEACD41A7A43E9A1FC04576658DBF7420A35252A899B51F9ED9B2D0B5534A696C2465C950EF5880636D96CC963AF6C314D00834969C45D53D4193
-20241205112040 2 6 100 8191 5 DC5E734609D91DA7E5180C89891C148715345D3A56F96DDFF41EE0B90992E9901E55850A78D9DF296A83F5AAF22675720E58E1F6D01F3B45315B818EF9CE880CE92F022763911796D4F86361BEB151ACB400BA017186C1DDCDE5F1853260ECF1082E072C2B7E2FD33E51B5076675269EC247AAE3DF3C1E6853E5D0E58FF7268255E91A9BF6FD43750F114BCA5DC70176ECACAF59C812798941D04FFFF200B53F9843066568A5EF6B324692239A9DC94383C53DA447D942BD51E17F51C22106DC3A2FC7A8942E20E5DA369D19124D184A96589E66EE15C4A8E4CB0FBB6B5E629875DEB3C6AAF622ABC4A4057E0B95533A03C94C514D2129CD6ECE739D9E3A98A54461DF577CC508BF4D5EE7FBE6178B248E3F51C59FE57BFBDE33DD833D0CF22DB22AE0F4F9F03EEF8E0E1DB0EDF7BB4C755148AD2D3FECED23DE1F028A3A6396D7F8F721D11023BD58335ADE175939E140A92C7B532A3D77168E566B7AADEA6F137A158AF3D2608FD4C1081018C1BC2B860A2830A097BDAFA96A3D5B5E1130D2C0778837C63ACBE958573B4ADAC2AE629D17728313AB9064D890006B2F0EC1869E35480B96651B9B3837B876190D5F1876A151A87C58A1CE2A9AD0744BE4CF955BFA9FA5653300FF6ECD64667ECD836D61DC3675048A8EB5AE945B50CB699F7FB4E36167515A2054199687DEC77D5117DF28B63F383403C49097F23AA4DE5857A0D865AFC7E4D0994B46386C20A41E9B41963CD425A82B30C4EE72FB3EFACD6C4090D740E44C196E51F41894FDB26142B72EF1E65A676C30EFB65C937C0F64CDEC167ECC16F0CAA3C932F3DD5C6F7A1EB073F03F2CB9F2059BE75EBAE32FA3170B5FA93D69CAB8275935686242E1F43ED23FE8784A0AD694442D35193DAAF5F7DA49B267B716C38F36C92AE7986DF8126904B11EA74323F3AB3AF436D64AC41996529AB95876EE4DF3739130460A50E2EC8463F2306454F08745CE40938858B6237A5D38B33FD6541BB98EFB39A7B0B501B7943FF594DF0964BF535CBD35105E35BA14C40E62D57F3B110AE82CD7F9FF73C3A28740C8EB397494F6D7CF5F0F147385424D70B276C6AD849E56C9985115EAF2CCF3D3A6C828F2A303178EC48BB08F36AF3800739E841F7B758FF06EFA10F6467E98DA4B1B302EFED0EF5A7D3AD74100E41C168ACBBF10EC5FFC497B43409D02D942C144408C32C83ED49334BC48FD1D446FDEBB71CA1F9276F3180ECA057E4B8F19FAFE368D0097EE2A5736D72BE661382939491A244B068D26A071E55E25DF2C8706ADEFD8245BC97A691AB57A8D39CE24469E9CC69198F4F795CACCB45053F464CA0C2F04C71E9CD6BB6D378E917C413B7FADEACD41A7A43E9A1FC04576658DBF7420A35252A899B51F9ED9B2D0B5534A696C2465C950EF5880636D96CC963AF6C314D00834969C45D6362177
-20241205112359 2 6 100 8191 5 DC5E734609D91DA7E5180C89891C148715345D3A56F96DDFF41EE0B90992E9901E55850A78D9DF296A83F5AAF22675720E58E1F6D01F3B45315B818EF9CE880CE92F022763911796D4F86361BEB151ACB400BA017186C1DDCDE5F1853260ECF1082E072C2B7E2FD33E51B5076675269EC247AAE3DF3C1E6853E5D0E58FF7268255E91A9BF6FD43750F114BCA5DC70176ECACAF59C812798941D04FFFF200B53F9843066568A5EF6B324692239A9DC94383C53DA447D942BD51E17F51C22106DC3A2FC7A8942E20E5DA369D19124D184A96589E66EE15C4A8E4CB0FBB6B5E629875DEB3C6AAF622ABC4A4057E0B95533A03C94C514D2129CD6ECE739D9E3A98A54461DF577CC508BF4D5EE7FBE6178B248E3F51C59FE57BFBDE33DD833D0CF22DB22AE0F4F9F03EEF8E0E1DB0EDF7BB4C755148AD2D3FECED23DE1F028A3A6396D7F8F721D11023BD58335ADE175939E140A92C7B532A3D77168E566B7AADEA6F137A158AF3D2608FD4C1081018C1BC2B860A2830A097BDAFA96A3D5B5E1130D2C0778837C63ACBE958573B4ADAC2AE629D17728313AB9064D890006B2F0EC1869E35480B96651B9B3837B876190D5F1876A151A87C58A1CE2A9AD0744BE4CF955BFA9FA5653300FF6ECD64667ECD836D61DC3675048A8EB5AE945B50CB699F7FB4E36167515A2054199687DEC77D5117DF28B63F383403C49097F23AA4DE5857A0D865AFC7E4D0994B46386C20A41E9B41963CD425A82B30C4EE72FB3EFACD6C4090D740E44C196E51F41894FDB26142B72EF1E65A676C30EFB65C937C0F64CDEC167ECC16F0CAA3C932F3DD5C6F7A1EB073F03F2CB9F2059BE75EBAE32FA3170B5FA93D69CAB8275935686242E1F43ED23FE8784A0AD694442D35193DAAF5F7DA49B267B716C38F36C92AE7986DF8126904B11EA74323F3AB3AF436D64AC41996529AB95876EE4DF3739130460A50E2EC8463F2306454F08745CE40938858B6237A5D38B33FD6541BB98EFB39A7B0B501B7943FF594DF0964BF535CBD35105E35BA14C40E62D57F3B110AE82CD7F9FF73C3A28740C8EB397494F6D7CF5F0F147385424D70B276C6AD849E56C9985115EAF2CCF3D3A6C828F2A303178EC48BB08F36AF3800739E841F7B758FF06EFA10F6467E98DA4B1B302EFED0EF5A7D3AD74100E41C168ACBBF10EC5FFC497B43409D02D942C144408C32C83ED49334BC48FD1D446FDEBB71CA1F9276F3180ECA057E4B8F19FAFE368D0097EE2A5736D72BE661382939491A244B068D26A071E55E25DF2C8706ADEFD8245BC97A691AB57A8D39CE24469E9CC69198F4F795CACCB45053F464CA0C2F04C71E9CD6BB6D378E917C413B7FADEACD41A7A43E9A1FC04576658DBF7420A35252A899B51F9ED9B2D0B5534A696C2465C950EF5880636D96CC963AF6C314D00834969C45D65CAD37
-20241205134041 2 6 100 8191 5 DC5E734609D91DA7E5180C89891C148715345D3A56F96DDFF41EE0B90992E9901E55850A78D9DF296A83F5AAF22675720E58E1F6D01F3B45315B818EF9CE880CE92F022763911796D4F86361BEB151ACB400BA017186C1DDCDE5F1853260ECF1082E072C2B7E2FD33E51B5076675269EC247AAE3DF3C1E6853E5D0E58FF7268255E91A9BF6FD43750F114BCA5DC70176ECACAF59C812798941D04FFFF200B53F9843066568A5EF6B324692239A9DC94383C53DA447D942BD51E17F51C22106DC3A2FC7A8942E20E5DA369D19124D184A96589E66EE15C4A8E4CB0FBB6B5E629875DEB3C6AAF622ABC4A4057E0B95533A03C94C514D2129CD6ECE739D9E3A98A54461DF577CC508BF4D5EE7FBE6178B248E3F51C59FE57BFBDE33DD833D0CF22DB22AE0F4F9F03EEF8E0E1DB0EDF7BB4C755148AD2D3FECED23DE1F028A3A6396D7F8F721D11023BD58335ADE175939E140A92C7B532A3D77168E566B7AADEA6F137A158AF3D2608FD4C1081018C1BC2B860A2830A097BDAFA96A3D5B5E1130D2C0778837C63ACBE958573B4ADAC2AE629D17728313AB9064D890006B2F0EC1869E35480B96651B9B3837B876190D5F1876A151A87C58A1CE2A9AD0744BE4CF955BFA9FA5653300FF6ECD64667ECD836D61DC3675048A8EB5AE945B50CB699F7FB4E36167515A2054199687DEC77D5117DF28B63F383403C49097F23AA4DE5857A0D865AFC7E4D0994B46386C20A41E9B41963CD425A82B30C4EE72FB3EFACD6C4090D740E44C196E51F41894FDB26142B72EF1E65A676C30EFB65C937C0F64CDEC167ECC16F0CAA3C932F3DD5C6F7A1EB073F03F2CB9F2059BE75EBAE32FA3170B5FA93D69CAB8275935686242E1F43ED23FE8784A0AD694442D35193DAAF5F7DA49B267B716C38F36C92AE7986DF8126904B11EA74323F3AB3AF436D64AC41996529AB95876EE4DF3739130460A50E2EC8463F2306454F08745CE40938858B6237A5D38B33FD6541BB98EFB39A7B0B501B7943FF594DF0964BF535CBD35105E35BA14C40E62D57F3B110AE82CD7F9FF73C3A28740C8EB397494F6D7CF5F0F147385424D70B276C6AD849E56C9985115EAF2CCF3D3A6C828F2A303178EC48BB08F36AF3800739E841F7B758FF06EFA10F6467E98DA4B1B302EFED0EF5A7D3AD74100E41C168ACBBF10EC5FFC497B43409D02D942C144408C32C83ED49334BC48FD1D446FDEBB71CA1F9276F3180ECA057E4B8F19FAFE368D0097EE2A5736D72BE661382939491A244B068D26A071E55E25DF2C8706ADEFD8245BC97A691AB57A8D39CE24469E9CC69198F4F795CACCB45053F464CA0C2F04C71E9CD6BB6D378E917C413B7FADEACD41A7A43E9A1FC04576658DBF7420A35252A899B51F9ED9B2D0B5534A696C2465C950EF5880636D96CC963AF6C314D00834969C45DDF2FF47
-20241205135041 2 6 100 8191 2 DC5E734609D91DA7E5180C89891C148715345D3A56F96DDFF41EE0B90992E9901E55850A78D9DF296A83F5AAF22675720E58E1F6D01F3B45315B818EF9CE880CE92F022763911796D4F86361BEB151ACB400BA017186C1DDCDE5F1853260ECF1082E072C2B7E2FD33E51B5076675269EC247AAE3DF3C1E6853E5D0E58FF7268255E91A9BF6FD43750F114BCA5DC70176ECACAF59C812798941D04FFFF200B53F9843066568A5EF6B324692239A9DC94383C53DA447D942BD51E17F51C22106DC3A2FC7A8942E20E5DA369D19124D184A96589E66EE15C4A8E4CB0FBB6B5E629875DEB3C6AAF622ABC4A4057E0B95533A03C94C514D2129CD6ECE739D9E3A98A54461DF577CC508BF4D5EE7FBE6178B248E3F51C59FE57BFBDE33DD833D0CF22DB22AE0F4F9F03EEF8E0E1DB0EDF7BB4C755148AD2D3FECED23DE1F028A3A6396D7F8F721D11023BD58335ADE175939E140A92C7B532A3D77168E566B7AADEA6F137A158AF3D2608FD4C1081018C1BC2B860A2830A097BDAFA96A3D5B5E1130D2C0778837C63ACBE958573B4ADAC2AE629D17728313AB9064D890006B2F0EC1869E35480B96651B9B3837B876190D5F1876A151A87C58A1CE2A9AD0744BE4CF955BFA9FA5653300FF6ECD64667ECD836D61DC3675048A8EB5AE945B50CB699F7FB4E36167515A2054199687DEC77D5117DF28B63F383403C49097F23AA4DE5857A0D865AFC7E4D0994B46386C20A41E9B41963CD425A82B30C4EE72FB3EFACD6C4090D740E44C196E51F41894FDB26142B72EF1E65A676C30EFB65C937C0F64CDEC167ECC16F0CAA3C932F3DD5C6F7A1EB073F03F2CB9F2059BE75EBAE32FA3170B5FA93D69CAB8275935686242E1F43ED23FE8784A0AD694442D35193DAAF5F7DA49B267B716C38F36C92AE7986DF8126904B11EA74323F3AB3AF436D64AC41996529AB95876EE4DF3739130460A50E2EC8463F2306454F08745CE40938858B6237A5D38B33FD6541BB98EFB39A7B0B501B7943FF594DF0964BF535CBD35105E35BA14C40E62D57F3B110AE82CD7F9FF73C3A28740C8EB397494F6D7CF5F0F147385424D70B276C6AD849E56C9985115EAF2CCF3D3A6C828F2A303178EC48BB08F36AF3800739E841F7B758FF06EFA10F6467E98DA4B1B302EFED0EF5A7D3AD74100E41C168ACBBF10EC5FFC497B43409D02D942C144408C32C83ED49334BC48FD1D446FDEBB71CA1F9276F3180ECA057E4B8F19FAFE368D0097EE2A5736D72BE661382939491A244B068D26A071E55E25DF2C8706ADEFD8245BC97A691AB57A8D39CE24469E9CC69198F4F795CACCB45053F464CA0C2F04C71E9CD6BB6D378E917C413B7FADEACD41A7A43E9A1FC04576658DBF7420A35252A899B51F9ED9B2D0B5534A696C2465C950EF5880636D96CC963AF6C314D00834969C45DE752163
+20250616002444 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626168803637
+20250616002455 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626168CECC1F
+20250616002507 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA6261692C7353
+20250616002518 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA6261697DCA23
+20250616002520 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA6261698D69EF
+20250616002525 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626169AA57DB
+20250616002529 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626169CBB25F
+20250616002546 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616A5307EB
+20250616002549 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616A6385DB
+20250616002603 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616AD0C40B
+20250616002612 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616B10F7D3
+20250616002613 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616B182DC3
+20250616002615 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616B25024B
+20250616002624 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616B689AFF
+20250616002627 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616B79A1F3
+20250616002633 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616BA0CE7B
+20250616002634 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616BA926E7
+20250616002638 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616BBF1327
+20250616002644 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616BEC119B
+20250616002648 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616C0A4D47
+20250616002651 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616C1B6AAF
+20250616002713 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616CCBE9D3
+20250616002747 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616DE70BB3
+20250616002755 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616E1C5B1F
+20250616002802 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616E57586B
+20250616002822 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616EFEC4AB
+20250616002825 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616F0CBA83
+20250616002826 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616F133697
+20250616002834 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616F526313
+20250616002835 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616F56D8DB
+20250616002838 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616F63E88B
+20250616002842 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616F813C83
+20250616002843 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616F86C16B
+20250616002854 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616FDC52CF
+20250616002858 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616FFB576F
+20250616002914 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626170776DAF
+20250616002919 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626170939C97
+20250616002920 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA6261709C6907
+20250616002954 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626171B2A95B
+20250616002958 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626171CCCD77
+20250616003000 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626171D0FA13
+20250616003002 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626171E18997
+20250616003005 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626171EE92B7
+20250616003006 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626171F5ADB3
+20250616003007 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626171F9F0F3
+20250616003016 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA6261723F66A7
+20250616003019 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA6261724E9AAF
+20250616003020 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626172573C83
+20250616003025 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626172798D8B
+20250616003052 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA6261734F06E7
+20250616003103 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626173A507C3
+20250616003114 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626173FB9947
+20250616003118 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617416E49B
+20250616003127 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA6261745F914B
+20250616003136 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626174A4F763
+20250616003143 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626174D621A7
+20250616003153 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626175244157
+20250616003155 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626175304CEB
+20250616003159 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617553F42F
+20250616003209 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA6261759B7C0B
+20250616003214 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626175BFA7AF
+20250616003217 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626175D8110F
+20250616003218 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626175D8BEBB
+20250616003248 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626176C7670B
+20250616003253 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626176E7934F
+20250616003256 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626176FDC4CB
+20250616003314 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA6261778C1A6B
+20250616003318 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626177A40A3F
+20250616003324 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626177CE451F
+20250616003329 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626177F722EB
+20250616003331 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626177FFB46F
+20250616003336 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617822C973
+20250616003337 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617828C757
+20250616003405 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA6261790E9D67
+20250616003413 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA6261794E5533
+20250616003416 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA6261796529CF
+20250616003430 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626179D66303
+20250616003432 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626179DCC057
+20250616003437 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617A0363F3
+20250616003446 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617A46B76B
+20250616003455 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617A8D28A7
+20250616003502 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617AC41817
+20250616003503 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617AC8EBC3
+20250616003509 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617AF2AA53
+20250616003510 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617AF70D8B
+20250616003522 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617B4FA6B7
+20250616003526 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617B69E4D7
+20250616003530 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617B8C1623
+20250616003541 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617BE325B3
+20250616003554 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617C48E047
+20250616003605 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617C9BBBC7
+20250616003611 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617CC7D78B
+20250616003642 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617DC7164F
+20250616003645 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617DDCEBBB
+20250616003646 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617DDD5EFF
+20250616003700 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617E532FAF
+20250616003718 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617EE49D4F
+20250616003737 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617F78544F
+20250616003745 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617FBBF7FB
+20250616003759 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626180295803
+20250616024900 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE52FE1D8983
+20250616024916 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE52FE5187AB
+20250616025426 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE53015B738B
+20250616025613 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5302B72663
+20250616025652 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE53032B6AB3
+20250616025739 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5303BCB52B
+20250616025750 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5303D8B5E7
+20250616025804 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5303FF3613
+20250616025808 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5304041DF3
+20250616025813 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE53040D42B3
+20250616025942 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5305308573
+20250616025956 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5305566ACB
+20250616030027 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5305B57B5B
+20250616030040 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5305D951BB
+20250616030126 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE53066DC43B
+20250616030131 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5306792277
+20250616030407 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE53087BB3C3
+20250616030439 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5308DA22D7
+20250616030457 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE53090CC43F
+20250616030623 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE530A10BF03
+20250616030625 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE530A12A4A3
+20250616030728 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE530AD1C937
+20250616030747 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE530B08F417
+20250616030753 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE530B149E1F
+20250616030835 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE530B97C463
+20250616030917 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE530C17195B
+20250616030941 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE530C5E29EB
+20250616031012 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE530CB69887
+20250616031047 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE530D1B2B3B
+20250616031102 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE530D42691B
+20250616031119 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE530D6F09B7
+20250616031345 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE530F453A3F
+20250616031437 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE530FE6A46F
+20250616031522 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5310725CA3
+20250616031526 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5310796467
+20250616031630 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531145D673
+20250616031744 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE53122DAB97
+20250616031748 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531235DC5B
+20250616031828 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5312B5048F
+20250616031908 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE53132F33C7
+20250616031911 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531334BD6B
+20250616031947 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5313A1C823
+20250616032023 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE53140EA06B
+20250616032050 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531463930B
+20250616032110 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE53149D1AE3
+20250616032205 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE53154763FB
+20250616032225 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531582AC17
+20250616032243 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5315B3627B
+20250616032250 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5315C62473
+20250616032257 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5315D6A113
+20250616032301 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5315DA6E1B
+20250616032456 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE53174EA23B
+20250616032613 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5318454747
+20250616032619 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5318518CE3
+20250616032621 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE53185266F3
+20250616032705 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5318DB30D3
+20250616032722 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE53190CF753
+20250616032801 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531983C403
+20250616032827 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5319D4832F
+20250616032843 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531A0401AB
+20250616032854 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531A1F94AB
+20250616032858 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531A26B47B
+20250616032930 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531A86BE9B
+20250616032934 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531A8B9B23
+20250616032956 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531ACEECF7
+20250616033009 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531AF0B31B
+20250616033016 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531B028B8B
+20250616033036 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531B3D86EB
+20250616033049 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531B65D127
+20250616033115 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531BB41F3F
+20250616033140 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531C01336B
+20250616033207 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531C54135F
+20250616033259 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531CF6B74B
+20250616033308 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531D0E1EF3
+20250616033331 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531D5478CB
+20250616033419 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531DED6323
+20250616033601 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531F31D043
+20250616033611 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531F48BD03
+20250616033701 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531FEA1EFF
+20250616033825 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5320F3FBAB
+20250616033938 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5321DD2153
+20250616033959 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE53221A5443
+20250616034137 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE532357E1EF
+20250616034150 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE53237AE35B
+20250616034211 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5323B7E21F
+20250616034317 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE532486893F
+20250616034324 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE532496A2F7
+20250616034453 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5325B5FF2F
+20250616034508 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5325DFBD83
+20250616034516 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5325F4BEAF
+20250616034538 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE532632A773
+20250616034604 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE53267F3C1F
+20250616034646 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE532703CCAF
+20250616034920 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5328EDA0EF
+20250616035201 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE532AF8A223
+20250616035247 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE532B864D0B
+20250616035259 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE532BA3AD6F
+20250616035343 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE532C2F66F3
+20250616035404 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE532C6CBB1F
+20250616035550 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE532DC5FC83
+20250616025251 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D0AAACEB7
+20250616025500 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D0B703A67
+20250616025644 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D0C098BAF
+20250616025822 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D0C9F6593
+20250616025947 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D0D1C3E97
+20250616030000 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D0D2AE36B
+20250616030055 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D0D7B87EB
+20250616030200 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D0DD7FA2B
+20250616030339 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D0E70A8D7
+20250616031225 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D119395BB
+20250616031921 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D141530E7
+20250616032156 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D14FF9A9B
+20250616032638 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D16BBC31B
+20250616032926 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D17C00207
+20250616032959 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D17ED9CB7
+20250616033143 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D188B3F2B
+20250616033239 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D18D93D7B
+20250616033406 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D195811AF
+20250616033432 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D197A3F23
+20250616033615 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D1A164913
+20250616033743 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D1A9B44E3
+20250616034059 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D1BCEF6E7
+20250616034148 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D1C136A53
+20250616034236 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D1C5441E3
+20250616034337 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D1CAB3D9F
+20250616034506 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D1D3741AB
+20250616034604 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D1D8D2B83
+20250616034629 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D1DABAEFF
+20250616034737 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D1E0E748B
+20250616034755 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D1E214BBF
+20250616034809 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D1E33125F
+20250616035026 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D1F01594F
+20250616035037 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D1F0BD763
+20250616035313 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D1FFD9B1F
+20250616035402 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D2044014B
+20250616035437 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D20733A13
+20250616035449 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D207F63BF
+20250616035530 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D20B97BAF
+20250616035709 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D214FA723
+20250616035859 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D21FB8CD3
+20250616035947 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D22419713
+20250616040250 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D23574D73
+20250616041101 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D265B4043
+20250616041134 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D2688243B
+20250616041233 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D26E075D3
+20250616041313 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D2717FB07
+20250616041513 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D27C50567
+20250616041521 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D27C7F1FF
+20250616041543 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D27E425BB
+20250616041613 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D280BE63F
+20250616041750 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D289E2F63
+20250616041811 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D28B7A6AB
+20250616042211 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D2A30F7BB
+20250616042216 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D2A31526F
+20250616042440 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D2B142177
+20250616042937 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D2CF2463F
+20250616043203 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D2DCED4A3
+20250616044015 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D30DE8723
+20250616044102 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D3123CD73
+20250616044318 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D31EC950F
+20250616044447 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D326D5903
+20250616044737 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D33780D73
+20250616045055 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D34ADF7BB
+20250616045513 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D363FBDB3
+20250616045709 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D36F8CB13
+20250616045917 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D37C1BF97
+20250616050232 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D38EF2887
+20250616050404 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D3978CA43
+20250616050547 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D3A18F2FB
+20250616050558 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D3A207793
+20250616050630 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D3A4A78B3
+20250616051043 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D3BCF05C7
+20250616051341 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D3CE19A73
+20250616051541 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D3D96A783
+20250616051610 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D3DBD0F4F
+20250616051630 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D3DD597C3
+20250616052534 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D412B8027
+20250616052644 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D4191D41B
+20250616052653 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D4197FE0F
+20250616053049 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D43097AFB
+20250616053247 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D43BB9F6F
+20250616053318 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D43E4F583
+20250616053536 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D44B73D53
+20250616053606 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D44E1EE3B
+20250616053755 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D45876E0F
+20250616054222 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D4726EF6B
+20250616054241 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D473B5563
+20250616054858 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D498E3BAF
+20250616054917 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D49A569F7
+20250616055026 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D4A0F8DAB
+20250616055148 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D4A8B902F
+20250616055232 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D4AC9177F
+20250616055323 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D4B1157AB
+20250616055559 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D4C06056B
+20250616055943 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D4D5F3253
+20250616060324 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D4EB4258B
+20250616060456 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D4F406FC3
+20250616061112 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D51930143
+20250616061754 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D5404A0F3
+20250616062045 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D550D543F
+20250616031848 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABCFEBCFD5B
+20250616041123 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD054A326B
+20250616042441 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD06E7D59B
+20250616042612 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD07106BD3
+20250616043534 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD08355803
+20250616043924 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD08A63293
+20250616044633 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD0982DEEB
+20250616045128 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD0A19FE5B
+20250616050534 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD0BD5F123
+20250616051248 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD0CB284DF
+20250616051744 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD0D4576E7
+20250616052615 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD0E4EAA4F
+20250616053024 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD0EC9F933
+20250616054931 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD112C869B
+20250616061023 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD13C0FA33
+20250616061103 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD13CF073F
+20250616062941 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD16121F27
+20250616063708 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD16F3763F
+20250616065251 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD18E600CF
+20250616065656 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD1961739B
+20250616070508 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD1A63040B
+20250616071147 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD1B2EB503
+20250616072730 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD1D19F2FF
+20250616075823 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD20E7E04F
+20250616085003 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD274EB153
+20250616090823 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD298EF107
+20250616090942 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD29B0BD37
+20250616091953 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD2AD9C44B
+20250616092428 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD2B623263
+20250616092837 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD2BDBD627
+20250616093520 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD2CA7968B
+20250616093745 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD2CEA82B3
+20250616100958 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD30DEC413
+20250616104346 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD34EE8193
+20250616104422 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD34F86857
+20250616111013 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD3825D493
+20250616113910 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD3BAD9997
+20250616115912 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD3E1DEE1B
+20250616121039 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD3F7A2C5B
+20250616130700 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD46657F43
+20250616131547 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD47787287
+20250616131819 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD47C09A53
+20250616132017 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD47F6C84F
+20250616140437 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD4D750693
+20250616141233 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD4E6BD827
+20250616141414 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD4E9887C3
+20250616141602 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD4EC7148F
+20250616142052 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD4F592B73
+20250616142305 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD4F9896B3
+20250616151719 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD5631119F
+20250616152331 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD56EC431B
+20250616154044 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD590666B7
+20250616155712 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD5B10CB97
+20250616160048 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD5B7B673F
+20250616170503 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD6377E0DF
+20250616170926 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD63FDBC83
+20250616171549 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD64C3C247
+20250616171931 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD653018DB
+20250616175241 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD69541097
+20250616183731 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD6EE1B19F
+20250616184010 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD6F2D909B
+20250616184304 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD6F839987
+20250616190140 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD71C69267
+20250616190401 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD720797DB
+20250616191520 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD73692CE3
+20250616192842 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD75053C7B
+20250616194857 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD7782C27B
+20250616195918 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD78C5964B
+20250616200557 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD799219DF
+20250616203649 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD7D732CE7
+20250616205237 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD7F5D63A3
+20250616211219 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD81D243C7
+20250616211808 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD827D9623
+20250616213202 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD8429B4CF
+20250616214429 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD85BA7CCF
+20250616215347 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD86DADC7B
+20250616215504 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD86FBFAC3
+20250616215846 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD876E6177
+20250616221047 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD88DF6D3B
+20250616223829 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD8C566667
+20250616224259 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD8CE0DE5B
+20250616231230 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD908DA493
+20250616232834 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD928EEF7B
+20250616233319 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD931E7A6F
+20250616235722 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD961D984F
+20250617002544 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD3F7A2C5B
+20250617012034 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD46657F43
+20250617012906 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD47787287
+20250617013133 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD47C09A53
+20250617013329 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD47F6C84F
+20250617021654 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD4D750693
+20250617022440 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD4E6BD827
+20250617022615 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD4E9887C3
+20250617022801 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD4EC7148F
+20250617023244 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD4F592B73
+20250617023455 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD4F9896B3
+20250617032739 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD5631119F
+20250617033339 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD56EC431B
+20250617035013 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD590666B7
+20250617040630 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD5B10CB97
+20250616035607 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85826297803B
+20250616042133 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582643F4617
+20250616052001 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858268210533
+20250616054850 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85826A097C53
+20250616080903 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858273567FDB
+20250616093015 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858278B0E5BB
+20250616103728 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85827D1D4113
+20250616111218 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85827F657FAB
+20250616112833 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858280648FFB
+20250616125341 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858285F47EEF
+20250616135204 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858289C8483F
+20250616150327 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85828E80E33B
+20250616161704 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582936A88E3
+20250616170843 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858296D09663
+20250616174557 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858299434467
+20250616185934 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85829E1EAFA3
+20250616190202 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85829E3F6D2B
+20250616202814 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582A400B97B
+20250616210901 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582A6B686D7
+20250616212925 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582A805594B
+20250616232503 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582AFB7787B
+20250616235406 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582B19E791F
+20250616235513 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582B1A8E57B
+20250617002853 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858289C8483F
+20250617013846 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85828E80E33B
+20250617025103 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582936A88E3
+20250617034223 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858296D09663
+20250617041923 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858299434467
+20250617053144 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85829E1EAFA3
+20250617053409 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85829E3F6D2B
+20250617075210 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85826297803B
+20250617081717 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582643F4617
+20250617091509 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858268210533
+20250617094347 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85826A097C53
+20250617120252 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858273567FDB
+20250617132226 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858278B0E5BB
+20250617142749 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85827D1D4113
+20250617150158 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85827F657FAB
+20250617151822 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858280648FFB
+20250617164140 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858285F47EEF
+20250617173833 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858289C8483F
+20250617184837 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85828E80E33B
+20250617200056 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582936A88E3
+20250617205150 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858296D09663
+20250617212820 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858299434467
+20250617223953 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85829E1EAFA3
+20250617224217 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85829E3F6D2B
+20250618000646 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582A400B97B
+20250618004650 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582A6B686D7
+20250618010652 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582A805594B
+20250618030037 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582AFB7787B
+20250618032918 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582B19E791F
+20250618033024 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582B1A8E57B
+20250618042330 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582B53C775B
+20250618045322 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582B7440A97
+20250618052359 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582B954EBF7
+20250618055947 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582BBB8C053
+20250618070614 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582C035FFE3
+20250618072936 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582C1B7AD67
+20250618073924 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582C2551963
+20250618081151 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582C480076F
+20250618091411 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582C8B7648B
+20250618104754 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582CEFBD56F
+20250618114039 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582D2828D6F
+20250618121547 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582D4D953FB
+20250618122123 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582D533E9B3
+20250618123407 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582D608F5D7
+20250618124634 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582D6DB3867
+20250618125907 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582D7B0E9A3
+20250618131722 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582D8E5433B
+20250618154711 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582E318E597
+20250618161518 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582E4FC61FF
+20250618173320 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582EA4C196B
+20250618181001 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582ECCDA5AF
+20250618182405 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582EDB674CF
+20250618185052 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582EF76E9A7
+20250618205008 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582F7986EE3
+20250618212939 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582FA3E17BF
+20250618235642 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858304421B3B
+20250619002145 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858305ECDC73
+20250619004148 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8583074F20CB
+20250619005851 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858308581EC3
+20250619011346 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858309471D47
+20250619020628 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85830CCF0183
+20250619024424 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85830F5F31F3
+20250619033602 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858312D48B7B
+20250619043748 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858316F99C53
+20250619050309 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858318AA26EF
+20250619053830 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85831AFC8263
+20250619063025 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85831E74A76B
+20250619063819 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85831EF74217
+20250619064710 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85831F833663
+20250619082314 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8583253C251F
+20250619082850 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8583257F0853
+20250619090252 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8583276E0493
+20250619095319 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85832AA1D0AB
+20250619111645 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85833035388F
+20250619143826 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85833DC506AB
+20250619144408 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85833E1EBFA7
+20250619144618 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85833E3B9B63
+20250616030759 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F355CA78B
+20250616040000 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F3838355B
+20250616041144 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F38D7F49B
+20250616050424 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F3BBD0A5B
+20250616052304 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F3CBEA257
+20250616061654 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F3FACE56B
+20250616075926 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F454D7B5F
+20250616081144 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F45F6C43F
+20250616090044 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F48A7A38B
+20250616122407 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F53BFE9BB
+20250616142400 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F5A4DBBAF
+20250616160108 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F5F8C5217
+20250616193743 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F6B909527
+20250616213952 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F72566C2F
+20250616232936 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F785F050F
+20250617022031 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F5A4DBBAF
+20250617035521 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F5F8C5217
+20250617084531 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F5A4DBBAF
+20250617102034 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F5F8C5217
+20250617135507 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F6B909527
+20250617155752 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F72566C2F
+20250617174609 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F785F050F
+20250617185010 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F7BE9453B
+20250617203518 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F81D8D1BF
+20250617221016 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F872F0C47
+20250617224617 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F89296483
+20250618022226 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F955CABCF
+20250618025323 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F971B858F
+20250618025845 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F976024CF
+20250618031117 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F980C128F
+20250618050316 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F9E572DB3
+20250618054129 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FA0770223
+20250618054813 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FA0D14BEB
+20250618061719 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FA267BBE3
+20250618064955 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FA436E453
+20250618065418 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FA46BE9D3
+20250618091516 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FAC5A7C77
+20250618094924 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FAE3F83CB
+20250618115905 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FB57652DF
+20250618130037 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FB8EDA617
+20250618132027 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FBA050653
+20250618141430 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FBD161D4F
+20250618141922 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FBD51B563
+20250618142521 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FBD9DAAA3
+20250618155406 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FC2A05D13
+20250618171641 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FC74EF183
+20250618171856 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FC769295B
+20250618181022 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FCA4F6A13
+20250618202914 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FD226B033
+20250618220927 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FD7DA67EF
+20250618224256 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FD9B5DB6B
+20250618232600 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FDC16AAB7
+20250618232719 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FDC210A83
+20250618233147 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FDC59DC33
+20250618234218 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FDCEE4BE3
+20250618235527 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FDDA3E65F
+20250619001532 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FDEC67F03
+20250619021548 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FE56B64F3
+20250619022245 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FE5CF6A53
+20250619050955 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FEF3B127B
+20250619055851 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FF1FBE17F
+20250619061510 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FF2DEEC33
+20250619062630 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FF376CBEB
+20250619062934 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FF39994E7
+20250619075919 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FF8440A8F
+20250619100929 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FFEB8B7A3
+20250619113103 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED940033A057B
+20250619121235 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED94005794C2F
+20250619123456 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED94006B2B897
+20250619124527 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED94007401FAB
+20250619143042 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED9400D0E145B
+20250619161110 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED94012944667
+20250619180616 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED94019090B9F
+20250619182713 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED9401A2D7303
+20250619200425 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED9401F9624E3
+20250619202406 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED94020A68B53
+20250619224804 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED94028B6619B
+20250619234955 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED9402C389D97
+20250619235705 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED9402C96896B
+20250620000401 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED9402CF2980F
+20250620001146 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED9402D572997
+20250620002229 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED9402DE7288F
+20250620004426 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED9402F1E827B
+20250620013315 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED94031D70FAB
diff --git a/moduli.0 b/moduli.0
index 90700a16fde4..3c3c81b4a628 100644
--- a/moduli.0
+++ b/moduli.0
@@ -71,4 +71,4 @@ STANDARDS
M. Friedl, N. Provos, and W. Simpson, Diffie-Hellman Group Exchange for
the Secure Shell (SSH) Transport Layer Protocol, RFC 4419, March 2006.
-OpenBSD 7.7 April 16, 2022 OpenBSD 7.7
+OpenBSD 7.8 April 16, 2022 MODULI(5)
diff --git a/moduli.c b/moduli.c
index 999a90984e18..e8ef9633f024 100644
--- a/moduli.c
+++ b/moduli.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: moduli.c,v 1.40 2025/05/24 03:39:48 dtucker Exp $ */
+/* $OpenBSD: moduli.c,v 1.41 2026/03/03 09:57:25 dtucker Exp $ */
/*
* Copyright 1994 Phil Karn <karn@qualcomm.com>
* Copyright 1996-1998, 2003 William Allen Simpson <wsimpson@greendragon.com>
@@ -125,26 +125,26 @@
*/
/* sieve 2**16 */
-static u_int32_t *TinySieve, tinybits;
+static uint32_t *TinySieve, tinybits;
/* sieve 2**30 in 2**16 parts */
-static u_int32_t *SmallSieve, smallbits, smallbase;
+static uint32_t *SmallSieve, smallbits, smallbase;
/* sieve relative to the initial value */
-static u_int32_t *LargeSieve, largewords, largetries, largenumbers;
-static u_int32_t largebits, largememory; /* megabytes */
+static uint32_t *LargeSieve, largewords, largetries, largenumbers;
+static uint32_t largebits, largememory; /* megabytes */
static BIGNUM *largebase;
-int gen_candidates(FILE *, u_int32_t, BIGNUM *);
-int prime_test(FILE *, FILE *, u_int32_t, u_int32_t, char *, unsigned long,
+int gen_candidates(FILE *, uint32_t, BIGNUM *);
+int prime_test(FILE *, FILE *, uint32_t, uint32_t, char *, unsigned long,
unsigned long);
/*
* print moduli out in consistent form,
*/
static int
-qfileout(FILE * ofile, u_int32_t otype, u_int32_t otests, u_int32_t otries,
- u_int32_t osize, u_int32_t ogenerator, BIGNUM * omodulus)
+qfileout(FILE * ofile, uint32_t otype, uint32_t otests, uint32_t otries,
+ uint32_t osize, uint32_t ogenerator, BIGNUM * omodulus)
{
struct tm *gtm;
time_t time_now;
@@ -177,9 +177,9 @@ qfileout(FILE * ofile, u_int32_t otype, u_int32_t otests, u_int32_t otries,
** Sieve p's and q's with small factors
*/
static void
-sieve_large(u_int32_t s32)
+sieve_large(uint32_t s32)
{
- u_int64_t r, u, s = s32;
+ uint64_t r, u, s = s32;
debug3("sieve_large %u", s32);
largetries++;
@@ -235,14 +235,14 @@ sieve_large(u_int32_t s32)
* The list is checked against small known primes (less than 2**30).
*/
int
-gen_candidates(FILE *out, u_int32_t power, BIGNUM *start)
+gen_candidates(FILE *out, uint32_t power, BIGNUM *start)
{
BIGNUM *q;
- u_int32_t j, r, s, t;
- u_int32_t smallwords = TINY_NUMBER >> 6;
- u_int32_t tinywords = TINY_NUMBER >> 6;
+ uint32_t j, r, s, t;
+ uint32_t smallwords = TINY_NUMBER >> 6;
+ uint32_t tinywords = TINY_NUMBER >> 6;
time_t time_start, time_stop;
- u_int32_t i;
+ uint32_t i;
int ret = 0;
/*
@@ -262,13 +262,13 @@ gen_candidates(FILE *out, u_int32_t power, BIGNUM *start)
largememory = LARGE_MAXIMUM;
largewords = (largememory << SHIFT_MEGAWORD);
- TinySieve = xcalloc(tinywords, sizeof(u_int32_t));
+ TinySieve = xcalloc(tinywords, sizeof(uint32_t));
tinybits = tinywords << SHIFT_WORD;
- SmallSieve = xcalloc(smallwords, sizeof(u_int32_t));
+ SmallSieve = xcalloc(smallwords, sizeof(uint32_t));
smallbits = smallwords << SHIFT_WORD;
- LargeSieve = xcalloc(largewords, sizeof(u_int32_t));
+ LargeSieve = xcalloc(largewords, sizeof(uint32_t));
largebits = largewords << SHIFT_WORD;
largenumbers = largebits * 2; /* even numbers excluded */
@@ -403,7 +403,7 @@ gen_candidates(FILE *out, u_int32_t power, BIGNUM *start)
}
static void
-write_checkpoint(char *cpfile, u_int32_t lineno)
+write_checkpoint(char *cpfile, uint32_t lineno)
{
FILE *fp;
char tmp[PATH_MAX];
@@ -532,13 +532,13 @@ print_progress(unsigned long start_lineno, unsigned long current_lineno,
* The result is a list of so-call "safe" primes
*/
int
-prime_test(FILE *in, FILE *out, u_int32_t trials, u_int32_t generator_wanted,
+prime_test(FILE *in, FILE *out, uint32_t trials, uint32_t generator_wanted,
char *checkpoint_file, unsigned long start_lineno, unsigned long num_lines)
{
BIGNUM *q, *p, *a;
char *cp, *lp;
- u_int32_t count_in = 0, count_out = 0, count_possible = 0;
- u_int32_t generator_known, in_tests, in_tries, in_type, in_size;
+ uint32_t count_in = 0, count_out = 0, count_possible = 0;
+ uint32_t generator_known, in_tests, in_tries, in_type, in_size;
unsigned long last_processed = 0, end_lineno;
time_t time_start, time_stop;
int res, is_prime;
@@ -653,7 +653,7 @@ prime_test(FILE *in, FILE *out, u_int32_t trials, u_int32_t generator_wanted,
* due to earlier inconsistencies in interpretation, check
* the proposed bit size.
*/
- if ((u_int32_t)BN_num_bits(p) != (in_size + 1)) {
+ if ((uint32_t)BN_num_bits(p) != (in_size + 1)) {
debug2("%10u: bit size %u mismatch", count_in, in_size);
continue;
}
@@ -674,7 +674,7 @@ prime_test(FILE *in, FILE *out, u_int32_t trials, u_int32_t generator_wanted,
if (BN_mod_word(p, 24) == 11)
generator_known = 2;
else {
- u_int32_t r = BN_mod_word(p, 10);
+ uint32_t r = BN_mod_word(p, 10);
if (r == 3 || r == 7)
generator_known = 5;
diff --git a/monitor.c b/monitor.c
index ad086c300287..9d6672bb628e 100644
--- a/monitor.c
+++ b/monitor.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: monitor.c,v 1.249 2025/09/25 06:45:50 djm Exp $ */
+/* $OpenBSD: monitor.c,v 1.255 2026/03/28 05:06:16 djm Exp $ */
/*
* Copyright 2002 Niels Provos <provos@citi.umich.edu>
* Copyright 2002 Markus Friedl <markus@openbsd.org>
@@ -28,29 +28,29 @@
#include "includes.h"
#include <sys/types.h>
-#include <sys/socket.h>
#include <sys/wait.h>
+#include <sys/socket.h>
+#include <sys/tree.h>
+#include <sys/queue.h>
#include <errno.h>
#include <fcntl.h>
#include <limits.h>
#include <paths.h>
+#include <poll.h>
#include <pwd.h>
#include <signal.h>
+#include <stdarg.h>
#include <stdint.h>
+#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <stdarg.h>
-#include <stdio.h>
#include <unistd.h>
-#include <poll.h>
#ifdef WITH_OPENSSL
#include <openssl/dh.h>
#endif
-#include "openbsd-compat/sys-tree.h"
-#include "openbsd-compat/sys-queue.h"
#include "openbsd-compat/openssl-compat.h"
#include "atomicio.h"
@@ -106,6 +106,7 @@ static struct sshbuf *child_state;
/* Functions on the monitor that answer unprivileged requests */
int mm_answer_moduli(struct ssh *, int, struct sshbuf *);
+int mm_answer_setcompat(struct ssh *, int, struct sshbuf *);
int mm_answer_sign(struct ssh *, int, struct sshbuf *);
int mm_answer_pwnamallow(struct ssh *, int, struct sshbuf *);
int mm_answer_auth2_read_banner(struct ssh *, int, struct sshbuf *);
@@ -155,7 +156,9 @@ static char *auth_submethod = NULL;
static u_int session_id2_len = 0;
static u_char *session_id2 = NULL;
static pid_t monitor_child_pid;
-int auth_attempted = 0;
+static int auth_attempted = 0;
+static int invalid_user = 0;
+static int compat_set = 0;
struct mon_table {
enum monitor_reqtype type;
@@ -181,6 +184,7 @@ struct mon_table mon_dispatch_proto20[] = {
#ifdef WITH_OPENSSL
{MONITOR_REQ_MODULI, MON_ONCE, mm_answer_moduli},
#endif
+ {MONITOR_REQ_SETCOMPAT, MON_ONCE, mm_answer_setcompat},
{MONITOR_REQ_SIGN, MON_ONCE, mm_answer_sign},
{MONITOR_REQ_PWNAM, MON_ONCE, mm_answer_pwnamallow},
{MONITOR_REQ_AUTHSERV, MON_ONCE, mm_answer_authserv},
@@ -282,6 +286,7 @@ monitor_child_preauth(struct ssh *ssh, struct monitor *pmonitor)
/* Permit requests for state, moduli and signatures */
monitor_permit(mon_dispatch, MONITOR_REQ_STATE, 1);
monitor_permit(mon_dispatch, MONITOR_REQ_MODULI, 1);
+ monitor_permit(mon_dispatch, MONITOR_REQ_SETCOMPAT, 1);
monitor_permit(mon_dispatch, MONITOR_REQ_SIGN, 1);
/* The first few requests do not require asynchronous access */
@@ -684,7 +689,6 @@ mm_answer_moduli(struct ssh *ssh, int sock, struct sshbuf *m)
if (dh == NULL) {
if ((r = sshbuf_put_u8(m, 0)) != 0)
fatal_fr(r, "assemble empty");
- return (0);
} else {
/* Send first bignum */
DH_get0_pqg(dh, &dh_p, NULL, &dh_g);
@@ -701,6 +705,20 @@ mm_answer_moduli(struct ssh *ssh, int sock, struct sshbuf *m)
#endif
int
+mm_answer_setcompat(struct ssh *ssh, int sock, struct sshbuf *m)
+{
+ int r;
+
+ debug3_f("entering");
+
+ if ((r = sshbuf_get_u32(m, &ssh->compat)) != 0)
+ fatal_fr(r, "parse");
+ compat_set = 1;
+
+ return (0);
+}
+
+int
mm_answer_sign(struct ssh *ssh, int sock, struct sshbuf *m)
{
extern int auth_sock; /* XXX move to state struct? */
@@ -715,6 +733,10 @@ mm_answer_sign(struct ssh *ssh, int sock, struct sshbuf *m)
debug3_f("entering");
+ /* Make sure the unpriv process sent the compat bits already */
+ if (!compat_set)
+ fatal_f("state error: setcompat never called");
+
if ((r = sshkey_froms(m, &pubkey)) != 0 ||
(r = sshbuf_get_string(m, &p, &datlen)) != 0 ||
(r = sshbuf_get_cstring(m, &alg, NULL)) != 0 ||
@@ -821,7 +843,7 @@ mm_encode_server_options(struct sshbuf *m)
(r = sshbuf_put_cstring(m, options.x)) != 0) \
fatal_fr(r, "assemble %s", #x); \
} while (0)
-#define M_CP_STRARRAYOPT(x, nx) do { \
+#define M_CP_STRARRAYOPT(x, nx, clobber) do { \
for (i = 0; i < options.nx; i++) { \
if ((r = sshbuf_put_cstring(m, options.x[i])) != 0) \
fatal_fr(r, "assemble %s", #x); \
@@ -842,6 +864,10 @@ mm_answer_pwnamallow(struct ssh *ssh, int sock, struct sshbuf *m)
debug3_f("entering");
+ /* Make sure the unpriv process sent the compat bits already */
+ if (!compat_set)
+ fatal_f("state error: setcompat never called");
+
if (authctxt->attempt++ != 0)
fatal_f("multiple attempts for getpwnam");
@@ -855,6 +881,7 @@ mm_answer_pwnamallow(struct ssh *ssh, int sock, struct sshbuf *m)
sshbuf_reset(m);
if (pwent == NULL) {
+ invalid_user = 1;
if ((r = sshbuf_put_u8(m, 0)) != 0)
fatal_fr(r, "assemble fakepw");
authctxt->pw = fakepw();
@@ -1177,7 +1204,7 @@ mm_answer_pam_query(struct ssh *ssh, int sock, struct sshbuf *m)
fatal_f("no context");
ret = (sshpam_device.query)(sshpam_ctxt, &name, &info,
&num, &prompts, &echo_on);
- if (ret == 0 && num == 0)
+ if (ret == 0 && num == 0 && sshpam_priv_kbdint_authdone(sshpam_ctxt))
sshpam_authok = sshpam_ctxt;
if (num > 1 || name == NULL || info == NULL)
fatal("sshpam_device.query failed");
@@ -1891,11 +1918,6 @@ mm_get_keystate(struct ssh *ssh, struct monitor *pmonitor)
/* XXX */
-#define FD_CLOSEONEXEC(x) do { \
- if (fcntl(x, F_SETFD, FD_CLOEXEC) == -1) \
- fatal("fcntl(%d, F_SETFD)", x); \
-} while (0)
-
static void
monitor_openfds(struct monitor *mon, int do_logfds)
{
@@ -1945,6 +1967,18 @@ monitor_reinit(struct monitor *mon)
monitor_openfds(mon, 0);
}
+int
+monitor_auth_attempted(void)
+{
+ return auth_attempted;
+}
+
+int
+monitor_invalid_user(void)
+{
+ return invalid_user;
+}
+
#ifdef GSSAPI
int
mm_answer_gss_setup_ctx(struct ssh *ssh, int sock, struct sshbuf *m)
diff --git a/monitor.h b/monitor.h
index 3f8a9bea30c6..fe0b00b2ef8d 100644
--- a/monitor.h
+++ b/monitor.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: monitor.h,v 1.24 2024/05/17 00:30:24 djm Exp $ */
+/* $OpenBSD: monitor.h,v 1.28 2026/03/02 02:40:15 djm Exp $ */
/*
* Copyright 2002 Niels Provos <provos@citi.umich.edu>
@@ -39,6 +39,7 @@ enum monitor_reqtype {
MONITOR_REQ_AUTHPASSWORD = 12, MONITOR_ANS_AUTHPASSWORD = 13,
MONITOR_REQ_BSDAUTHQUERY = 14, MONITOR_ANS_BSDAUTHQUERY = 15,
MONITOR_REQ_BSDAUTHRESPOND = 16, MONITOR_ANS_BSDAUTHRESPOND = 17,
+ MONITOR_REQ_SETCOMPAT = 18,
MONITOR_REQ_KEYALLOWED = 22, MONITOR_ANS_KEYALLOWED = 23,
MONITOR_REQ_KEYVERIFY = 24, MONITOR_ANS_KEYVERIFY = 25,
MONITOR_REQ_KEYEXPORT = 26,
@@ -88,6 +89,9 @@ void monitor_child_postauth(struct ssh *, struct monitor *);
void monitor_clear_keystate(struct ssh *, struct monitor *);
void monitor_apply_keystate(struct ssh *, struct monitor *);
+int monitor_auth_attempted(void);
+int monitor_invalid_user(void);
+
/* Prototypes for request sending and receiving */
void mm_request_send(int, enum monitor_reqtype, struct sshbuf *);
void mm_request_receive(int, struct sshbuf *);
diff --git a/monitor_fdpass.c b/monitor_fdpass.c
index 21697ca88937..a2472abdb01b 100644
--- a/monitor_fdpass.c
+++ b/monitor_fdpass.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: monitor_fdpass.c,v 1.22 2020/10/18 11:32:01 djm Exp $ */
+/* $OpenBSD: monitor_fdpass.c,v 1.23 2026/02/08 19:54:31 dtucker Exp $ */
/*
* Copyright 2001 Niels Provos <provos@citi.umich.edu>
* All rights reserved.
@@ -32,11 +32,10 @@
#include <sys/un.h>
#include <errno.h>
+#include <poll.h>
#include <string.h>
#include <stdarg.h>
-#include <poll.h>
-
#include "log.h"
#include "monitor_fdpass.h"
diff --git a/monitor_wrap.c b/monitor_wrap.c
index 33494b73fa94..81596a4cc66b 100644
--- a/monitor_wrap.c
+++ b/monitor_wrap.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: monitor_wrap.c,v 1.142 2025/09/25 06:31:42 djm Exp $ */
+/* $OpenBSD: monitor_wrap.c,v 1.146 2026/03/02 02:40:15 djm Exp $ */
/*
* Copyright 2002 Niels Provos <provos@citi.umich.edu>
* Copyright 2002 Markus Friedl <markus@openbsd.org>
@@ -29,6 +29,7 @@
#include <sys/types.h>
#include <sys/uio.h>
+#include <sys/queue.h>
#include <sys/wait.h>
#include <errno.h>
@@ -45,7 +46,6 @@
#include <openssl/evp.h>
#endif
-#include "openbsd-compat/sys-queue.h"
#include "xmalloc.h"
#include "ssh.h"
#ifdef WITH_OPENSSL
@@ -106,8 +106,13 @@ mm_log_handler(LogLevel level, int forced, const char *msg, void *ctx)
fatal_f("bad length %zu", len);
POKE_U32(sshbuf_mutable_ptr(log_msg), len - 4);
if (atomicio(vwrite, mon->m_log_sendfd,
- sshbuf_mutable_ptr(log_msg), len) != len)
+ sshbuf_mutable_ptr(log_msg), len) != len) {
+ if (errno == EPIPE) {
+ debug_f("write: %s", strerror(errno));
+ cleanup_exit(255);
+ }
fatal_f("write: %s", strerror(errno));
+ }
sshbuf_free(log_msg);
}
@@ -249,6 +254,21 @@ mm_choose_dh(int min, int nbits, int max)
}
#endif
+void
+mm_sshkey_setcompat(struct ssh *ssh)
+{
+ struct sshbuf *m;
+ int r;
+
+ debug3_f("entering");
+ if ((m = sshbuf_new()) == NULL)
+ fatal_f("sshbuf_new failed");
+ if ((r = sshbuf_put_u32(m, ssh->compat)) != 0)
+ fatal_fr(r, "assemble");
+
+ mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_SETCOMPAT, m);
+}
+
int
mm_sshkey_sign(struct ssh *ssh, struct sshkey *key, u_char **sigp, size_t *lenp,
const u_char *data, size_t datalen, const char *hostkey_alg,
@@ -300,7 +320,7 @@ mm_decode_activate_server_options(struct ssh *ssh, struct sshbuf *m)
(r = sshbuf_get_cstring(m, &newopts->x, NULL)) != 0) \
fatal_fr(r, "parse %s", #x); \
} while (0)
-#define M_CP_STRARRAYOPT(x, nx) do { \
+#define M_CP_STRARRAYOPT(x, nx, clobber) do { \
newopts->x = newopts->nx == 0 ? \
NULL : xcalloc(newopts->nx, sizeof(*newopts->x)); \
for (i = 0; i < newopts->nx; i++) { \
@@ -322,7 +342,7 @@ mm_decode_activate_server_options(struct ssh *ssh, struct sshbuf *m)
/* use the macro hell to clean up too */
#define M_CP_STROPT(x) free(newopts->x)
-#define M_CP_STRARRAYOPT(x, nx) do { \
+#define M_CP_STRARRAYOPT(x, nx, clobber) do { \
for (i = 0; i < newopts->nx; i++) \
free(newopts->x[i]); \
free(newopts->x); \
diff --git a/monitor_wrap.h b/monitor_wrap.h
index c87295388fd0..c2f7f97d977a 100644
--- a/monitor_wrap.h
+++ b/monitor_wrap.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: monitor_wrap.h,v 1.53 2025/07/04 07:47:35 djm Exp $ */
+/* $OpenBSD: monitor_wrap.h,v 1.54 2026/03/02 02:40:15 djm Exp $ */
/*
* Copyright 2002 Niels Provos <provos@citi.umich.edu>
@@ -46,6 +46,7 @@ int mm_is_monitor(void);
#ifdef WITH_OPENSSL
DH *mm_choose_dh(int, int, int);
#endif
+void mm_sshkey_setcompat(struct ssh *);
int mm_sshkey_sign(struct ssh *, struct sshkey *, u_char **, size_t *,
const u_char *, size_t, const char *, const char *,
const char *, u_int compat);
diff --git a/msg.c b/msg.c
index a03caeb6ff3e..8173598e5fde 100644
--- a/msg.c
+++ b/msg.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: msg.c,v 1.21 2024/05/17 00:30:24 djm Exp $ */
+/* $OpenBSD: msg.c,v 1.22 2026/02/14 00:18:34 jsg Exp $ */
/*
* Copyright (c) 2002 Markus Friedl. All rights reserved.
*
@@ -26,16 +26,13 @@
#include "includes.h"
#include <sys/types.h>
-#include <sys/uio.h>
#include <errno.h>
-#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdarg.h>
#include "sshbuf.h"
-#include "ssherr.h"
#include "log.h"
#include "atomicio.h"
#include "msg.h"
diff --git a/mux.c b/mux.c
index 37bcb91037ef..0cd169732cd3 100644
--- a/mux.c
+++ b/mux.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: mux.c,v 1.107 2025/09/30 00:03:09 djm Exp $ */
+/* $OpenBSD: mux.c,v 1.113 2026/04/02 07:39:57 djm Exp $ */
/*
* Copyright (c) 2002-2008 Damien Miller <djm@openbsd.org>
*
@@ -20,12 +20,13 @@
#include "includes.h"
#include <sys/types.h>
+#include <sys/queue.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <errno.h>
-#include <fcntl.h>
+#include <poll.h>
#include <limits.h>
#include <signal.h>
#include <stdarg.h>
@@ -34,30 +35,20 @@
#include <stdio.h>
#include <string.h>
#include <unistd.h>
-#include <paths.h>
-
-#include <poll.h>
-#include <util.h>
-
-#include "openbsd-compat/sys-queue.h"
#include "xmalloc.h"
#include "log.h"
#include "ssh.h"
#include "ssh2.h"
-#include "pathnames.h"
#include "misc.h"
#include "match.h"
#include "sshbuf.h"
#include "channels.h"
-#include "msg.h"
#include "packet.h"
#include "monitor_fdpass.h"
#include "sshpty.h"
-#include "sshkey.h"
#include "readconf.h"
#include "clientloop.h"
-#include "ssherr.h"
/* from ssh.c */
extern int tty_flag;
@@ -122,6 +113,7 @@ struct mux_master_state {
#define MUX_C_NEW_STDIO_FWD 0x10000008
#define MUX_C_STOP_LISTENING 0x10000009
#define MUX_C_PROXY 0x1000000f
+#define MUX_C_EXT_INFO 0x20000001
#define MUX_S_OK 0x80000001
#define MUX_S_PERMISSION_DENIED 0x80000002
#define MUX_S_FAILURE 0x80000003
@@ -131,12 +123,18 @@ struct mux_master_state {
#define MUX_S_REMOTE_PORT 0x80000007
#define MUX_S_TTY_ALLOC_FAIL 0x80000008
#define MUX_S_PROXY 0x8000000f
+#define MUX_S_EXT_INFO 0x90000001
/* type codes for MUX_C_OPEN_FWD and MUX_C_CLOSE_FWD */
#define MUX_FWD_LOCAL 1
#define MUX_FWD_REMOTE 2
#define MUX_FWD_DYNAMIC 3
+#define MUX_EXT_INFO 0x00000001
+
+/* Bitmask of supported extensions */
+static u_int extensions = 0;
+
static void mux_session_confirm(struct ssh *, int, int, void *);
static void mux_stdio_confirm(struct ssh *, int, int, void *);
@@ -158,6 +156,8 @@ static int mux_master_process_stop_listening(struct ssh *, u_int,
Channel *, struct sshbuf *, struct sshbuf *);
static int mux_master_process_proxy(struct ssh *, u_int,
Channel *, struct sshbuf *, struct sshbuf *);
+static int mux_master_process_ext_info(struct ssh *, u_int,
+ Channel *, struct sshbuf *, struct sshbuf *);
static const struct {
u_int type;
@@ -173,6 +173,7 @@ static const struct {
{ MUX_C_NEW_STDIO_FWD, mux_master_process_stdio_fwd },
{ MUX_C_STOP_LISTENING, mux_master_process_stop_listening },
{ MUX_C_PROXY, mux_master_process_proxy },
+ { MUX_C_EXT_INFO, mux_master_process_ext_info },
{ 0, NULL }
};
@@ -287,8 +288,13 @@ mux_master_process_hello(struct ssh *ssh, u_int rid,
error_fr(r, "parse extension");
return -1;
}
- debug2_f("Unrecognised extension \"%s\" length %zu",
- name, value_len);
+ if (strcmp(name, "info") == 0) {
+ debug_f("Received 'info' extension");
+ extensions |= MUX_EXT_INFO;
+ } else {
+ debug2_f("Unrecognised extension \"%s\" length %zu",
+ name, value_len);
+ }
free(name);
}
state->hello_rcvd = 1;
@@ -494,6 +500,43 @@ mux_master_process_alive_check(struct ssh *ssh, u_int rid,
return 0;
}
+/* The "info" extension. */
+static int
+mux_master_process_ext_info(struct ssh *ssh, u_int rid,
+ Channel *c, struct sshbuf *m, struct sshbuf *reply)
+{
+ int r;
+ u_int status = 0;
+ char *name = NULL, *msg = NULL;
+
+ debug2_f("channel %d: info request", c->self);
+
+ if ((r = sshbuf_get_cstring(m, &name, NULL)) != 0)
+ fatal_fr(r, "parse");
+
+ if (strcmp(name, "connection") == 0) {
+ if ((msg = connection_info_message(ssh)) == NULL)
+ fatal_f("connection_info_message");
+ status = 1;
+ } else if (strcmp(name, "channels") == 0) {
+ if ((msg = channel_open_message(ssh)) == NULL)
+ fatal_f("channel_open_message");
+ status = 1;
+ } else {
+ msg = xstrdup("info request type not supported");
+ }
+
+ /* prepare reply */
+ if ((r = sshbuf_put_u32(reply, MUX_S_EXT_INFO)) != 0 ||
+ (r = sshbuf_put_u32(reply, rid)) != 0 ||
+ (r = sshbuf_put_u32(reply, status)) != 0 ||
+ (r = sshbuf_put_cstring(reply, msg)) != 0)
+ fatal_fr(r, "reply");
+ free(msg);
+
+ return 0;
+}
+
static int
mux_master_process_terminate(struct ssh *ssh, u_int rid,
Channel *c, struct sshbuf *m, struct sshbuf *reply)
@@ -583,7 +626,7 @@ compare_forward(struct Forward *a, struct Forward *b)
}
static void
-mux_confirm_remote_forward(struct ssh *ssh, int type, u_int32_t seq, void *ctxt)
+mux_confirm_remote_forward(struct ssh *ssh, int type, uint32_t seq, void *ctxt)
{
struct mux_channel_confirm_ctx *fctx = ctxt;
char *failmsg = NULL;
@@ -1129,6 +1172,16 @@ mux_master_process_proxy(struct ssh *ssh, u_int rid,
debug_f("channel %d: proxy request", c->self);
+ if (options.control_master == SSHCTL_MASTER_ASK ||
+ options.control_master == SSHCTL_MASTER_AUTO_ASK) {
+ if (!ask_permission("Allow multiplex proxy connection?")) {
+ debug2_f("proxy refused by user");
+ reply_error(reply, MUX_S_PERMISSION_DENIED, rid,
+ "Permission denied");
+ return 0;
+ }
+ }
+
c->mux_rcb = channel_proxy_downstream;
if ((r = sshbuf_put_u32(reply, MUX_S_PROXY)) != 0 ||
(r = sshbuf_put_u32(reply, rid)) != 0)
@@ -1160,7 +1213,10 @@ mux_master_read_cb(struct ssh *ssh, Channel *c)
if ((r = sshbuf_put_u32(out, MUX_MSG_HELLO)) != 0 ||
(r = sshbuf_put_u32(out, SSHMUX_VER)) != 0)
fatal_fr(r, "reply");
- /* no extensions */
+ /* "info" extension */
+ if ((r = sshbuf_put_cstring(out, "info")) != 0 ||
+ (r = sshbuf_put_cstring(out, "0")) != 0)
+ fatal_fr(r, "put info extension");
if ((r = sshbuf_put_stringb(c->output, out)) != 0)
fatal_fr(r, "enqueue");
debug3_f("channel %d: hello sent", c->self);
@@ -1389,12 +1445,8 @@ mux_session_confirm(struct ssh *ssh, int id, int success, void *arg)
}
}
- if (cctx->want_agent_fwd && options.forward_agent) {
- debug("Requesting authentication agent forwarding.");
- channel_request_start(ssh, id, "auth-agent-req@openssh.com", 0);
- if ((r = sshpkt_send(ssh)) != 0)
- fatal_fr(r, "send");
- }
+ if (cctx->want_agent_fwd && options.forward_agent)
+ client_channel_reqest_agent_forwarding(ssh, id);
client_session2_setup(ssh, id, cctx->want_tty, cctx->want_subsys,
cctx->term, &cctx->tio, c->rfd, cctx->cmd, cctx->env);
@@ -1635,7 +1687,13 @@ mux_client_hello_exchange(int fd, int timeout_ms)
error_fr(r, "parse extension");
goto out;
}
- debug2("Unrecognised master extension \"%s\"", name);
+ /* Process extensions. */
+ if (strcmp(name, "info") == 0) {
+ debug("Received 'info' extension");
+ extensions |= MUX_EXT_INFO;
+ } else {
+ debug2("Unrecognised master extension \"%s\"", name);
+ }
free(name);
}
/* success */
@@ -1696,6 +1754,57 @@ mux_client_request_alive(int fd)
return pid;
}
+static char *
+mux_client_request_info(int fd, const char *name)
+{
+ struct sshbuf *m;
+ char *e, *msg;
+ u_int type, rid, status;
+ int r;
+
+ debug3_f("entering");
+
+ if ((m = sshbuf_new()) == NULL)
+ fatal_f("sshbuf_new");
+ if ((r = sshbuf_put_u32(m, MUX_C_EXT_INFO)) != 0 ||
+ (r = sshbuf_put_u32(m, muxclient_request_id)) != 0 ||
+ (r = sshbuf_put_cstring(m, name)) != 0)
+ fatal_fr(r, "assemble");
+
+ if (mux_client_write_packet(fd, m) != 0)
+ fatal_f("write packet: %s", strerror(errno));
+
+ sshbuf_reset(m);
+
+ /* Read their reply */
+ if (mux_client_read_packet(fd, m) != 0) {
+ sshbuf_free(m);
+ return 0;
+ }
+
+ if ((r = sshbuf_get_u32(m, &type)) != 0)
+ fatal_fr(r, "parse type");
+ if (type != MUX_S_EXT_INFO) {
+ if ((r = sshbuf_get_cstring(m, &e, NULL)) != 0)
+ fatal_fr(r, "parse error message");
+ fatal_f("master returned error: %s", e);
+ }
+
+ if ((r = sshbuf_get_u32(m, &rid)) != 0)
+ fatal_fr(r, "parse remote ID");
+ if (rid != muxclient_request_id)
+ fatal_f("out of sequence reply: my id %u theirs %u",
+ muxclient_request_id, rid);
+ if ((r = sshbuf_get_u32(m, &status)) != 0 ||
+ (r = sshbuf_get_cstring(m, &msg, NULL)) != 0)
+ fatal_fr(r, "parse connection info");
+ sshbuf_free(m);
+
+ muxclient_request_id++;
+
+ return msg;
+}
+
static void
mux_client_request_terminate(int fd)
{
@@ -2261,6 +2370,7 @@ muxclient(const char *path)
struct sockaddr_un addr;
int sock, timeout = options.connection_timeout, timeout_ms = -1;
u_int pid;
+ char *info = NULL;
if (muxclient_command == 0) {
if (options.stdio_forward_host != NULL)
@@ -2331,6 +2441,17 @@ muxclient(const char *path)
fatal_f("master alive check failed");
fprintf(stderr, "Master running (pid=%u)\r\n", pid);
exit(0);
+ case SSHMUX_COMMAND_CONNINFO:
+ case SSHMUX_COMMAND_CHANINFO:
+ if (!(extensions & MUX_EXT_INFO))
+ fatal("mux server does not support info request");
+ info = mux_client_request_info(sock,
+ muxclient_command == SSHMUX_COMMAND_CONNINFO ?
+ "connection" : "channels");
+ if (info == NULL)
+ fatal_f("info request failed");
+ printf("%s", info);
+ exit(0);
case SSHMUX_COMMAND_TERMINATE:
mux_client_request_terminate(sock);
if (options.log_level != SYSLOG_LEVEL_QUIET)
diff --git a/myproposal.h b/myproposal.h
index 8fe9276c21f9..d992d8b12db0 100644
--- a/myproposal.h
+++ b/myproposal.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: myproposal.h,v 1.77 2024/12/02 14:06:42 djm Exp $ */
+/* $OpenBSD: myproposal.h,v 1.78 2026/02/05 22:05:49 djm Exp $ */
/*
* Copyright (c) 2000 Markus Friedl. All rights reserved.
@@ -47,6 +47,7 @@
"ecdsa-sha2-nistp521-cert-v01@openssh.com," \
"sk-ssh-ed25519-cert-v01@openssh.com," \
"sk-ecdsa-sha2-nistp256-cert-v01@openssh.com," \
+ "webauthn-sk-ecdsa-sha2-nistp256-cert-v01@openssh.com," \
"rsa-sha2-512-cert-v01@openssh.com," \
"rsa-sha2-256-cert-v01@openssh.com," \
"ssh-ed25519," \
@@ -55,6 +56,7 @@
"ecdsa-sha2-nistp521," \
"sk-ssh-ed25519@openssh.com," \
"sk-ecdsa-sha2-nistp256@openssh.com," \
+ "webauthn-sk-ecdsa-sha2-nistp256@openssh.com," \
"rsa-sha2-512," \
"rsa-sha2-256"
@@ -87,6 +89,7 @@
"ecdsa-sha2-nistp521," \
"sk-ssh-ed25519@openssh.com," \
"sk-ecdsa-sha2-nistp256@openssh.com," \
+ "webauthn-sk-ecdsa-sha2-nistp256@openssh.com," \
"rsa-sha2-512," \
"rsa-sha2-256"
diff --git a/nchan.c b/nchan.c
index bd4758ac120e..c9d8e79f6bc2 100644
--- a/nchan.c
+++ b/nchan.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: nchan.c,v 1.76 2024/07/25 22:40:08 djm Exp $ */
+/* $OpenBSD: nchan.c,v 1.77 2026/02/14 00:18:34 jsg Exp $ */
/*
* Copyright (c) 1999, 2000, 2001, 2002 Markus Friedl. All rights reserved.
*
@@ -32,10 +32,8 @@
#include <string.h>
#include <stdarg.h>
-#include "openbsd-compat/sys-queue.h"
#include "ssh2.h"
#include "sshbuf.h"
-#include "ssherr.h"
#include "packet.h"
#include "channels.h"
#include "compat.h"
diff --git a/openbsd-compat/bcrypt_pbkdf.c b/openbsd-compat/bcrypt_pbkdf.c
index 5a22ba3b4258..33c9ce109a72 100644
--- a/openbsd-compat/bcrypt_pbkdf.c
+++ b/openbsd-compat/bcrypt_pbkdf.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: bcrypt_pbkdf.c,v 1.16 2020/08/02 18:35:48 tb Exp $ */
+/* $OpenBSD: bcrypt_pbkdf.c,v 1.17 2022/12/27 17:10:08 jmc Exp $ */
/*
* Copyright (c) 2013 Ted Unangst <tedu@openbsd.org>
*
@@ -49,7 +49,7 @@
* function with the following modifications:
* 1. The input password and salt are preprocessed with SHA512.
* 2. The output length is expanded to 256 bits.
- * 3. Subsequently the magic string to be encrypted is lengthened and modifed
+ * 3. Subsequently the magic string to be encrypted is lengthened and modified
* to "OxychromaticBlowfishSwatDynamite"
* 4. The hash function is defined to perform 64 rounds of initial state
* expansion. (More rounds are performed by iterating the hash.)
@@ -73,7 +73,7 @@ static void
bcrypt_hash(uint8_t *sha2pass, uint8_t *sha2salt, uint8_t *out)
{
blf_ctx state;
- uint8_t ciphertext[BCRYPT_HASHSIZE] =
+ uint8_t __attribute__ ((__nonstring__)) ciphertext[BCRYPT_HASHSIZE] =
"OxychromaticBlowfishSwatDynamite";
uint32_t cdata[BCRYPT_WORDS];
int i;
diff --git a/openbsd-compat/bsd-misc.c b/openbsd-compat/bsd-misc.c
index 2c196ec23eee..d5cc3755c72b 100644
--- a/openbsd-compat/bsd-misc.c
+++ b/openbsd-compat/bsd-misc.c
@@ -18,6 +18,7 @@
#include "includes.h"
#include <sys/types.h>
+#include <sys/ioctl.h>
#ifdef HAVE_SYS_SELECT_H
# include <sys/select.h>
#endif
@@ -409,6 +410,14 @@ pledge(const char *promises, const char *execpromises)
}
#endif
+#ifndef HAVE_UNVEIL
+int
+unveil(const char *path, const char *permissions)
+{
+ return 0;
+}
+#endif
+
#ifndef HAVE_MBTOWC
/* a mbtowc that only supports ASCII */
int
diff --git a/openbsd-compat/bsd-misc.h b/openbsd-compat/bsd-misc.h
index 8495f471c285..53e569dc20ed 100644
--- a/openbsd-compat/bsd-misc.h
+++ b/openbsd-compat/bsd-misc.h
@@ -159,6 +159,10 @@ int pselect(int, fd_set *, fd_set *, fd_set *, const struct timespec *,
int pledge(const char *promises, const char *execpromises);
#endif
+#ifndef HAVE_UNVEIL
+int unveil(const char *, const char *);
+#endif
+
/* bsd-err.h */
#ifndef HAVE_ERR
void err(int, const char *, ...) __attribute__((format(printf, 2, 3)));
diff --git a/openbsd-compat/bsd-openpty.c b/openbsd-compat/bsd-openpty.c
index f08d6156d284..2f12862584bd 100644
--- a/openbsd-compat/bsd-openpty.c
+++ b/openbsd-compat/bsd-openpty.c
@@ -38,6 +38,7 @@
#include <sys/types.h>
#include <stdlib.h>
+#include <stdio.h>
#include <sys/stat.h>
#ifdef HAVE_SYS_IOCTL_H
diff --git a/openbsd-compat/sha2.h b/openbsd-compat/bsd-sha2.h
index d051e96e83c9..d051e96e83c9 100644
--- a/openbsd-compat/sha2.h
+++ b/openbsd-compat/bsd-sha2.h
diff --git a/openbsd-compat/fake-rfc2553.c b/openbsd-compat/fake-rfc2553.c
index d5a62975aa46..5eaa47992b8d 100644
--- a/openbsd-compat/fake-rfc2553.c
+++ b/openbsd-compat/fake-rfc2553.c
@@ -94,13 +94,13 @@ gai_strerror(int err)
case EAI_NODATA:
return ("no address associated with name");
case EAI_MEMORY:
- return ("memory allocation failure.");
+ return ("memory allocation failure");
case EAI_NONAME:
- return ("nodename nor servname provided, or not known");
+ return ("name or service is not known");
case EAI_FAMILY:
return ("ai_family not supported");
default:
- return ("unknown/invalid error.");
+ return ("unknown/invalid error");
}
}
#endif /* !HAVE_GAI_STRERROR */
diff --git a/openbsd-compat/openbsd-compat.h b/openbsd-compat/openbsd-compat.h
index 0823d6a8377f..680ba9db2c27 100644
--- a/openbsd-compat/openbsd-compat.h
+++ b/openbsd-compat/openbsd-compat.h
@@ -43,7 +43,7 @@
#include "vis.h"
#include "getrrsetbyname.h"
#include "sha1.h"
-#include "sha2.h"
+#include "bsd-sha2.h"
#include "md5.h"
#include "blf.h"
#include "fnmatch.h"
diff --git a/openbsd-compat/openssl-compat.c b/openbsd-compat/openssl-compat.c
index 48938920cda7..e0cd4720451e 100644
--- a/openbsd-compat/openssl-compat.c
+++ b/openbsd-compat/openssl-compat.c
@@ -69,31 +69,22 @@ ssh_compatible_openssl(long headerver, long libver)
return 0;
}
-void
+int
ssh_libcrypto_init(void)
{
-#if defined(HAVE_OPENSSL_INIT_CRYPTO) && \
- defined(OPENSSL_INIT_ADD_ALL_CIPHERS) && \
- defined(OPENSSL_INIT_ADD_ALL_DIGESTS)
- OPENSSL_init_crypto(OPENSSL_INIT_ADD_ALL_CIPHERS |
- OPENSSL_INIT_ADD_ALL_DIGESTS, NULL);
-#elif defined(HAVE_OPENSSL_ADD_ALL_ALGORITHMS)
- OpenSSL_add_all_algorithms();
-#endif
+ uint64_t opts = OPENSSL_INIT_ADD_ALL_CIPHERS |
+ OPENSSL_INIT_ADD_ALL_DIGESTS;
#ifdef USE_OPENSSL_ENGINE
/* Enable use of crypto hardware */
ENGINE_load_builtin_engines();
ENGINE_register_all_complete();
- /* Load the libcrypto config file to pick up engines defined there */
-# if defined(HAVE_OPENSSL_INIT_CRYPTO) && defined(OPENSSL_INIT_LOAD_CONFIG)
- OPENSSL_init_crypto(OPENSSL_INIT_ADD_ALL_CIPHERS |
- OPENSSL_INIT_ADD_ALL_DIGESTS | OPENSSL_INIT_LOAD_CONFIG, NULL);
-# else
- OPENSSL_config(NULL);
-# endif
+ /* Tell libcrypto config file to pick up engines defined there */
+ opts |= OPENSSL_INIT_LOAD_CONFIG;
#endif /* USE_OPENSSL_ENGINE */
+
+ return OPENSSL_init_crypto(opts, NULL);
}
#ifndef HAVE_EVP_DIGESTSIGN
diff --git a/openbsd-compat/openssl-compat.h b/openbsd-compat/openssl-compat.h
index d07928b17b6d..42e2e2833301 100644
--- a/openbsd-compat/openssl-compat.h
+++ b/openbsd-compat/openssl-compat.h
@@ -31,7 +31,7 @@
#include <openssl/dh.h>
int ssh_compatible_openssl(long, long);
-void ssh_libcrypto_init(void);
+int ssh_libcrypto_init(void);
#if (OPENSSL_VERSION_NUMBER < 0x10100000L)
# error OpenSSL 1.1.0 or greater is required
diff --git a/openbsd-compat/sha2.c b/openbsd-compat/sha2.c
index 4f2ad8f2352a..61941c685eca 100644
--- a/openbsd-compat/sha2.c
+++ b/openbsd-compat/sha2.c
@@ -45,7 +45,7 @@
#define MAKE_CLONE(x, y) void __ssh_compat_make_clone_##x_##y(void)
#include <string.h>
-#include "openbsd-compat/sha2.h"
+#include "openbsd-compat/bsd-sha2.h"
/*
* UNROLLED TRANSFORM LOOP NOTE:
diff --git a/packet.c b/packet.c
index 5dd8269c218a..190a579d1e50 100644
--- a/packet.c
+++ b/packet.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: packet.c,v 1.323 2025/09/25 06:33:19 djm Exp $ */
+/* $OpenBSD: packet.c,v 1.334 2026/03/03 09:57:25 dtucker Exp $ */
/*
* Author: Tatu Ylonen <ylo@cs.hut.fi>
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -40,12 +40,11 @@
#include "includes.h"
#include <sys/types.h>
-#include "openbsd-compat/sys-queue.h"
+#include <sys/queue.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <netinet/in.h>
-#include <netinet/ip.h>
#include <arpa/inet.h>
#include <errno.h>
@@ -59,6 +58,7 @@
#include <poll.h>
#include <signal.h>
#include <time.h>
+#include <util.h>
/*
* Explicitly include OpenSSL before zlib as some versions of OpenSSL have
@@ -80,15 +80,12 @@
#include "compat.h"
#include "ssh2.h"
#include "cipher.h"
-#include "sshkey.h"
#include "kex.h"
#include "digest.h"
#include "mac.h"
#include "log.h"
#include "canohost.h"
#include "misc.h"
-#include "channels.h"
-#include "ssh.h"
#include "packet.h"
#include "ssherr.h"
#include "sshbuf.h"
@@ -102,10 +99,10 @@
#define PACKET_MAX_SIZE (256 * 1024)
struct packet_state {
- u_int32_t seqnr;
- u_int32_t packets;
- u_int64_t blocks;
- u_int64_t bytes;
+ uint32_t seqnr;
+ uint32_t packets;
+ uint64_t blocks;
+ uint64_t bytes;
};
struct packet {
@@ -183,10 +180,11 @@ struct session_state {
struct packet_state p_read, p_send;
/* Volume-based rekeying */
- u_int64_t max_blocks_in, max_blocks_out, rekey_limit;
+ uint64_t hard_max_blocks_in, hard_max_blocks_out;
+ uint64_t max_blocks_in, max_blocks_out, rekey_limit;
/* Time-based rekeying */
- u_int32_t rekey_interval; /* how often in seconds */
+ uint32_t rekey_interval; /* how often in seconds */
time_t rekey_time; /* time of last rekeying */
/* roundup current message to extra_pad bytes */
@@ -471,7 +469,7 @@ ssh_packet_connection_is_on_socket(struct ssh *ssh)
}
void
-ssh_packet_get_bytes(struct ssh *ssh, u_int64_t *ibytes, u_int64_t *obytes)
+ssh_packet_get_bytes(struct ssh *ssh, uint64_t *ibytes, uint64_t *obytes)
{
if (ibytes)
*ibytes = ssh->state->p_read.bytes;
@@ -978,7 +976,7 @@ ssh_set_newkeys(struct ssh *ssh, int mode)
struct sshcomp *comp;
struct sshcipher_ctx **ccp;
struct packet_state *ps;
- u_int64_t *max_blocks;
+ uint64_t *max_blocks, *hard_max_blocks;
const char *wmsg;
int r, crypt_type;
const char *dir = mode == MODE_OUT ? "out" : "in";
@@ -989,11 +987,13 @@ ssh_set_newkeys(struct ssh *ssh, int mode)
ccp = &state->send_context;
crypt_type = CIPHER_ENCRYPT;
ps = &state->p_send;
+ hard_max_blocks = &state->hard_max_blocks_out;
max_blocks = &state->max_blocks_out;
} else {
ccp = &state->receive_context;
crypt_type = CIPHER_DECRYPT;
ps = &state->p_read;
+ hard_max_blocks = &state->hard_max_blocks_in;
max_blocks = &state->max_blocks_in;
}
if (state->newkeys[mode] != NULL) {
@@ -1054,25 +1054,62 @@ ssh_set_newkeys(struct ssh *ssh, int mode)
* See RFC4344 section 3.2.
*/
if (enc->block_size >= 16)
- *max_blocks = (u_int64_t)1 << (enc->block_size*2);
+ *hard_max_blocks = (uint64_t)1 << (enc->block_size*2);
else
- *max_blocks = ((u_int64_t)1 << 30) / enc->block_size;
- if (state->rekey_limit)
+ *hard_max_blocks = ((uint64_t)1 << 30) / enc->block_size;
+ *max_blocks = *hard_max_blocks;
+ if (state->rekey_limit) {
*max_blocks = MINIMUM(*max_blocks,
state->rekey_limit / enc->block_size);
+ }
debug("rekey %s after %llu blocks", dir,
(unsigned long long)*max_blocks);
return 0;
}
#define MAX_PACKETS (1U<<31)
+/*
+ * Checks whether the packet- or block- based rekeying limits have been
+ * exceeded. If the 'hard' flag is set, the checks are performed against the
+ * absolute maximum we're willing to accept for the given cipher. Otherwise
+ * the checks are performed against the RekeyLimit volume, which may be lower.
+ */
+static inline int
+ssh_packet_check_rekey_blocklimit(struct ssh *ssh, u_int packet_len, int hard)
+{
+ struct session_state *state = ssh->state;
+ uint32_t out_blocks;
+ const uint64_t max_blocks_in = hard ?
+ state->hard_max_blocks_in : state->max_blocks_in;
+ const uint64_t max_blocks_out = hard ?
+ state->hard_max_blocks_out : state->max_blocks_out;
+
+ /*
+ * Always rekey when MAX_PACKETS sent in either direction
+ * As per RFC4344 section 3.1 we do this after 2^31 packets.
+ */
+ if (state->p_send.packets > MAX_PACKETS ||
+ state->p_read.packets > MAX_PACKETS)
+ return 1;
+
+ if (state->newkeys[MODE_OUT] == NULL)
+ return 0;
+
+ /* Rekey after (cipher-specific) maximum blocks */
+ out_blocks = ROUNDUP(packet_len,
+ state->newkeys[MODE_OUT]->enc.block_size);
+ return (max_blocks_out &&
+ (state->p_send.blocks + out_blocks > max_blocks_out)) ||
+ (max_blocks_in &&
+ (state->p_read.blocks > max_blocks_in));
+}
+
static int
ssh_packet_need_rekeying(struct ssh *ssh, u_int outbound_packet_len)
{
struct session_state *state = ssh->state;
- u_int32_t out_blocks;
- /* XXX client can't cope with rekeying pre-auth */
+ /* Don't attempt rekeying during pre-auth */
if (!state->after_authentication)
return 0;
@@ -1080,10 +1117,6 @@ ssh_packet_need_rekeying(struct ssh *ssh, u_int outbound_packet_len)
if (ssh_packet_is_rekeying(ssh))
return 0;
- /* Peer can't rekey */
- if (ssh->compat & SSH_BUG_NOREKEY)
- return 0;
-
/*
* Permit one packet in or out per rekey - this allows us to
* make progress when rekey limits are very small.
@@ -1096,26 +1129,30 @@ ssh_packet_need_rekeying(struct ssh *ssh, u_int outbound_packet_len)
(int64_t)state->rekey_time + state->rekey_interval <= monotime())
return 1;
- /*
- * Always rekey when MAX_PACKETS sent in either direction
- * As per RFC4344 section 3.1 we do this after 2^31 packets.
- */
- if (state->p_send.packets > MAX_PACKETS ||
- state->p_read.packets > MAX_PACKETS)
- return 1;
+ return ssh_packet_check_rekey_blocklimit(ssh, outbound_packet_len, 0);
+}
- /* Rekey after (cipher-specific) maximum blocks */
- out_blocks = ROUNDUP(outbound_packet_len,
- state->newkeys[MODE_OUT]->enc.block_size);
- return (state->max_blocks_out &&
- (state->p_send.blocks + out_blocks > state->max_blocks_out)) ||
- (state->max_blocks_in &&
- (state->p_read.blocks > state->max_blocks_in));
+/* Checks that the hard rekey limits have not been exceeded during preauth */
+static int
+ssh_packet_check_rekey_preauth(struct ssh *ssh, u_int outgoing_packet_len)
+{
+ if (ssh->state->after_authentication)
+ return 0;
+
+ if (ssh_packet_check_rekey_blocklimit(ssh, 0, 1)) {
+ error("RekeyLimit exceeded before authentication completed");
+ return SSH_ERR_NEED_REKEY;
+ }
+ return 0;
}
int
ssh_packet_check_rekey(struct ssh *ssh)
{
+ int r;
+
+ if ((r = ssh_packet_check_rekey_preauth(ssh, 0)) != 0)
+ return r;
if (!ssh_packet_need_rekeying(ssh, 0))
return 0;
debug3_f("rekex triggered");
@@ -1326,8 +1363,7 @@ ssh_packet_send2_wrapped(struct ssh *ssh)
logit("outgoing seqnr wraps around");
}
if (++state->p_send.packets == 0)
- if (!(ssh->compat & SSH_BUG_NOREKEY))
- return SSH_ERR_NEED_REKEY;
+ return SSH_ERR_NEED_REKEY;
state->p_send.blocks += len / block_size;
state->p_send.bytes += len;
sshbuf_reset(state->outgoing_packet);
@@ -1373,6 +1409,11 @@ ssh_packet_send2(struct ssh *ssh)
need_rekey = !ssh_packet_type_is_kex(type) &&
ssh_packet_need_rekeying(ssh, sshbuf_len(state->outgoing_packet));
+ /* Enforce hard rekey limit during pre-auth */
+ if (!state->rekeying && !ssh_packet_type_is_kex(type) &&
+ (r = ssh_packet_check_rekey_preauth(ssh, 0)) != 0)
+ return r;
+
/*
* During rekeying we can only send key exchange messages.
* Queue everything else.
@@ -1444,7 +1485,7 @@ ssh_packet_send2(struct ssh *ssh)
*/
int
-ssh_packet_read_seqnr(struct ssh *ssh, u_char *typep, u_int32_t *seqnr_p)
+ssh_packet_read_seqnr(struct ssh *ssh, u_char *typep, uint32_t *seqnr_p)
{
struct session_state *state = ssh->state;
int len, r, ms_remain = 0;
@@ -1537,7 +1578,7 @@ ssh_packet_read(struct ssh *ssh)
}
static int
-ssh_packet_read_poll2_mux(struct ssh *ssh, u_char *typep, u_int32_t *seqnr_p)
+ssh_packet_read_poll2_mux(struct ssh *ssh, u_char *typep, uint32_t *seqnr_p)
{
struct session_state *state = ssh->state;
const u_char *cp;
@@ -1575,7 +1616,7 @@ ssh_packet_read_poll2_mux(struct ssh *ssh, u_char *typep, u_int32_t *seqnr_p)
}
int
-ssh_packet_read_poll2(struct ssh *ssh, u_char *typep, u_int32_t *seqnr_p)
+ssh_packet_read_poll2(struct ssh *ssh, u_char *typep, uint32_t *seqnr_p)
{
struct session_state *state = ssh->state;
u_int padlen, need;
@@ -1737,8 +1778,7 @@ ssh_packet_read_poll2(struct ssh *ssh, u_char *typep, u_int32_t *seqnr_p)
logit("incoming seqnr wraps around");
}
if (++state->p_read.packets == 0)
- if (!(ssh->compat & SSH_BUG_NOREKEY))
- return SSH_ERR_NEED_REKEY;
+ return SSH_ERR_NEED_REKEY;
state->p_read.blocks += (state->packlen + 4) / block_size;
state->p_read.bytes += state->packlen + 4;
@@ -1813,7 +1853,7 @@ ssh_packet_read_poll2(struct ssh *ssh, u_char *typep, u_int32_t *seqnr_p)
}
int
-ssh_packet_read_poll_seqnr(struct ssh *ssh, u_char *typep, u_int32_t *seqnr_p)
+ssh_packet_read_poll_seqnr(struct ssh *ssh, u_char *typep, uint32_t *seqnr_p)
{
struct session_state *state = ssh->state;
u_int reason, seqnr;
@@ -2302,7 +2342,7 @@ ssh_packet_get_maxsize(struct ssh *ssh)
}
void
-ssh_packet_set_rekey_limits(struct ssh *ssh, u_int64_t bytes, u_int32_t seconds)
+ssh_packet_set_rekey_limits(struct ssh *ssh, uint64_t bytes, uint32_t seconds)
{
debug3("rekey after %llu bytes, %u seconds", (unsigned long long)bytes,
(unsigned int)seconds);
@@ -2650,13 +2690,13 @@ sshpkt_put_u8(struct ssh *ssh, u_char val)
}
int
-sshpkt_put_u32(struct ssh *ssh, u_int32_t val)
+sshpkt_put_u32(struct ssh *ssh, uint32_t val)
{
return sshbuf_put_u32(ssh->state->outgoing_packet, val);
}
int
-sshpkt_put_u64(struct ssh *ssh, u_int64_t val)
+sshpkt_put_u64(struct ssh *ssh, uint64_t val)
{
return sshbuf_put_u64(ssh->state->outgoing_packet, val);
}
@@ -2716,13 +2756,13 @@ sshpkt_get_u8(struct ssh *ssh, u_char *valp)
}
int
-sshpkt_get_u32(struct ssh *ssh, u_int32_t *valp)
+sshpkt_get_u32(struct ssh *ssh, uint32_t *valp)
{
return sshbuf_get_u32(ssh->state->incoming_packet, valp);
}
int
-sshpkt_get_u64(struct ssh *ssh, u_int64_t *valp)
+sshpkt_get_u64(struct ssh *ssh, uint64_t *valp)
{
return sshbuf_get_u64(ssh->state->incoming_packet, valp);
}
@@ -2847,7 +2887,7 @@ ssh_packet_send_mux(struct ssh *ssh)
int
sshpkt_msg_ignore(struct ssh *ssh, u_int nbytes)
{
- u_int32_t rnd = 0;
+ uint32_t rnd = 0;
int r;
u_int i;
@@ -2902,3 +2942,165 @@ sshpkt_add_padding(struct ssh *ssh, u_char pad)
ssh->state->extra_pad = pad;
return 0;
}
+
+static char *
+format_traffic_stats(struct packet_state *ps)
+{
+ char *stats = NULL, bytes[FMT_SCALED_STRSIZE];
+
+ if (ps->bytes > LLONG_MAX || fmt_scaled(ps->bytes, bytes) != 0)
+ strlcpy(bytes, "OVERFLOW", sizeof(bytes));
+
+ xasprintf(&stats, "%lu pkts %llu blks %sB",
+ (unsigned long)ps->packets, (unsigned long long)ps->blocks, bytes);
+ return stats;
+}
+
+static char *
+dedupe_alg_names(const char *in, const char *out)
+{
+ char *names = NULL;
+
+ if (in == NULL)
+ in = "<implicit>";
+ if (out == NULL)
+ out = "<implicit>";
+
+ if (strcmp(in, out) == 0) {
+ names = xstrdup(in);
+ } else {
+ xasprintf(&names, "%s in, %s out", in, out);
+ }
+ return names;
+}
+
+static char *
+comp_status_message(struct ssh *ssh)
+{
+#ifdef WITH_ZLIB
+ char *ret = NULL;
+ struct session_state *state = ssh->state;
+ unsigned long long iraw = 0, icmp = 0, oraw = 0, ocmp = 0;
+ char iraw_f[FMT_SCALED_STRSIZE] = "", oraw_f[FMT_SCALED_STRSIZE] = "";
+ char icmp_f[FMT_SCALED_STRSIZE] = "", ocmp_f[FMT_SCALED_STRSIZE] = "";
+
+ if (state->compression_buffer) {
+ if (state->compression_in_started) {
+ iraw = state->compression_in_stream.total_out;
+ icmp = state->compression_in_stream.total_in;
+ if (fmt_scaled(iraw, iraw_f) != 0)
+ strlcpy(iraw_f, "OVERFLOW", sizeof(iraw_f));
+ if (fmt_scaled(icmp, icmp_f) != 0)
+ strlcpy(icmp_f, "OVERFLOW", sizeof(icmp_f));
+ }
+ if (state->compression_out_started) {
+ oraw = state->compression_out_stream.total_in;
+ ocmp = state->compression_out_stream.total_out;
+ if (fmt_scaled(oraw, oraw_f) != 0)
+ strlcpy(oraw_f, "OVERFLOW", sizeof(oraw_f));
+ if (fmt_scaled(ocmp, ocmp_f) != 0)
+ strlcpy(ocmp_f, "OVERFLOW", sizeof(ocmp_f));
+ }
+ xasprintf(&ret,
+ " compressed %s/%s (*%.3f) in,"
+ " %s/%s (*%.3f) out\r\n",
+ icmp_f, iraw_f, iraw == 0 ? 0.0 : (double)icmp / iraw,
+ ocmp_f, oraw_f, oraw == 0 ? 0.0 : (double)ocmp / oraw);
+ return ret;
+ }
+#endif /* WITH_ZLIB */
+ return xstrdup("");
+}
+
+char *
+connection_info_message(struct ssh *ssh)
+{
+ char *ret = NULL, *cipher = NULL, *mac = NULL, *comp = NULL;
+ char *rekey_volume = NULL, *rekey_time = NULL, *comp_info = NULL;
+ char thishost[NI_MAXHOST] = "unknown", *tcp_info = NULL;
+ struct kex *kex;
+ struct session_state *state;
+ struct newkeys *nk_in, *nk_out;
+ char *stats_in = NULL, *stats_out = NULL;
+ uint64_t epoch = (uint64_t)time(NULL) - monotime();
+
+ if (ssh == NULL)
+ return NULL;
+ state = ssh->state;
+ kex = ssh->kex;
+
+ (void)gethostname(thishost, sizeof(thishost));
+
+ if (ssh_local_port(ssh) != 65535 ||
+ strcmp(ssh_local_ipaddr(ssh), "UNKNOWN") != 0) {
+ xasprintf(&tcp_info, " tcp %s:%d -> %s:%d\r\n",
+ ssh_local_ipaddr(ssh), ssh_local_port(ssh),
+ ssh_remote_ipaddr(ssh), ssh_remote_port(ssh));
+ } else {
+ tcp_info = xstrdup("");
+ }
+
+ nk_in = ssh->state->newkeys[MODE_IN];
+ nk_out = ssh->state->newkeys[MODE_OUT];
+ stats_in = format_traffic_stats(&ssh->state->p_read);
+ stats_out = format_traffic_stats(&ssh->state->p_send);
+
+ cipher = dedupe_alg_names(nk_in->enc.name, nk_out->enc.name);
+ mac = dedupe_alg_names(nk_in->mac.name, nk_out->mac.name);
+ comp = dedupe_alg_names(nk_in->comp.name, nk_out->comp.name);
+
+ /* Volume based rekeying. */
+ if (state->rekey_limit == 0) {
+ xasprintf(&rekey_volume, "limit none");
+ } else {
+ char *volumes = NULL, in[32], out[32];
+
+ snprintf(in, sizeof(in), "%llu",
+ (unsigned long long)state->max_blocks_in);
+ snprintf(out, sizeof(out), "%llu",
+ (unsigned long long)state->max_blocks_out);
+ volumes = dedupe_alg_names(in, out);
+ xasprintf(&rekey_volume, "limit blocks %s", volumes);
+ free(volumes);
+ }
+
+ /* Time based rekeying. */
+ if (state->rekey_interval == 0) {
+ rekey_time = xstrdup("interval none");
+ } else {
+ char rekey_next[64];
+
+ format_absolute_time(epoch + state->rekey_time +
+ state->rekey_interval, rekey_next, sizeof(rekey_next));
+ xasprintf(&rekey_time, "interval %s, next %s",
+ fmt_timeframe(state->rekey_interval), rekey_next);
+ }
+ comp_info = comp_status_message(ssh);
+
+ xasprintf(&ret, "Connection information for %s pid %lld\r\n"
+ "%s"
+ " kexalgorithm %s\r\n hostkeyalgorithm %s\r\n"
+ " cipher %s\r\n mac %s\r\n compression %s\r\n"
+ " rekey %s %s\r\n"
+ " traffic %s in, %s out\r\n"
+ "%s",
+ thishost, (long long)getpid(),
+ tcp_info,
+ kex->name, kex->hostkey_alg,
+ cipher, mac, comp,
+ rekey_volume, rekey_time,
+ stats_in, stats_out,
+ comp_info
+ );
+ free(tcp_info);
+ free(cipher);
+ free(mac);
+ free(comp);
+ free(stats_in);
+ free(stats_out);
+ free(rekey_volume);
+ free(rekey_time);
+ free(comp_info);
+ return ret;
+}
+
diff --git a/packet.h b/packet.h
index 072f274259ee..3e8acb2cd7ac 100644
--- a/packet.h
+++ b/packet.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: packet.h,v 1.103 2025/09/25 06:33:19 djm Exp $ */
+/* $OpenBSD: packet.h,v 1.107 2026/03/03 09:57:25 dtucker Exp $ */
/*
* Author: Tatu Ylonen <ylo@cs.hut.fi>
@@ -16,6 +16,10 @@
#ifndef PACKET_H
#define PACKET_H
+#include <sys/queue.h>
+
+#include <stdint.h>
+#include <signal.h>
#include <termios.h>
#ifdef WITH_OPENSSL
@@ -36,9 +40,6 @@
# define EVP_PKEY void
#endif /* WITH_OPENSSL */
-#include <signal.h>
-#include "openbsd-compat/sys-queue.h"
-
struct kex;
struct sshkey;
struct sshbuf;
@@ -74,7 +75,7 @@ struct ssh {
int dispatch_skip_packets;
/* datafellows */
- int compat;
+ uint32_t compat;
/* Lists for private and public keys */
TAILQ_HEAD(, key_entry) private_keys;
@@ -126,11 +127,11 @@ int ssh_packet_send2_wrapped(struct ssh *);
int ssh_packet_send2(struct ssh *);
int ssh_packet_read(struct ssh *);
-int ssh_packet_read_poll2(struct ssh *, u_char *, u_int32_t *seqnr_p);
+int ssh_packet_read_poll2(struct ssh *, u_char *, uint32_t *seqnr_p);
int ssh_packet_process_incoming(struct ssh *, const char *buf, u_int len);
int ssh_packet_process_read(struct ssh *, int);
-int ssh_packet_read_seqnr(struct ssh *, u_char *, u_int32_t *seqnr_p);
-int ssh_packet_read_poll_seqnr(struct ssh *, u_char *, u_int32_t *seqnr_p);
+int ssh_packet_read_seqnr(struct ssh *, u_char *, uint32_t *seqnr_p);
+int ssh_packet_read_poll_seqnr(struct ssh *, u_char *, uint32_t *seqnr_p);
void ssh_packet_disconnect(struct ssh *, const char *fmt, ...)
__attribute__((format(printf, 2, 3)))
@@ -138,7 +139,7 @@ void ssh_packet_disconnect(struct ssh *, const char *fmt, ...)
void ssh_packet_send_debug(struct ssh *, const char *fmt, ...) __attribute__((format(printf, 2, 3)));
int ssh_set_newkeys(struct ssh *, int mode);
-void ssh_packet_get_bytes(struct ssh *, u_int64_t *, u_int64_t *);
+void ssh_packet_get_bytes(struct ssh *, uint64_t *, uint64_t *);
int ssh_packet_write_poll(struct ssh *);
int ssh_packet_write_wait(struct ssh *);
@@ -167,7 +168,7 @@ int ssh_local_port(struct ssh *);
const char *ssh_packet_rdomain_in(struct ssh *);
char *ssh_remote_hostname(struct ssh *);
-void ssh_packet_set_rekey_limits(struct ssh *, u_int64_t, u_int32_t);
+void ssh_packet_set_rekey_limits(struct ssh *, uint64_t, uint32_t);
time_t ssh_packet_get_rekey_timeout(struct ssh *);
void *ssh_packet_get_input(struct ssh *);
@@ -187,8 +188,8 @@ int sshpkt_msg_ignore(struct ssh *, u_int);
int sshpkt_put(struct ssh *ssh, const void *v, size_t len);
int sshpkt_putb(struct ssh *ssh, const struct sshbuf *b);
int sshpkt_put_u8(struct ssh *ssh, u_char val);
-int sshpkt_put_u32(struct ssh *ssh, u_int32_t val);
-int sshpkt_put_u64(struct ssh *ssh, u_int64_t val);
+int sshpkt_put_u32(struct ssh *ssh, uint32_t val);
+int sshpkt_put_u64(struct ssh *ssh, uint64_t val);
int sshpkt_put_string(struct ssh *ssh, const void *v, size_t len);
int sshpkt_put_cstring(struct ssh *ssh, const void *v);
int sshpkt_put_stringb(struct ssh *ssh, const struct sshbuf *v);
@@ -198,8 +199,8 @@ int sshpkt_put_bignum2(struct ssh *ssh, const BIGNUM *v);
int sshpkt_get(struct ssh *ssh, void *valp, size_t len);
int sshpkt_get_u8(struct ssh *ssh, u_char *valp);
-int sshpkt_get_u32(struct ssh *ssh, u_int32_t *valp);
-int sshpkt_get_u64(struct ssh *ssh, u_int64_t *valp);
+int sshpkt_get_u32(struct ssh *ssh, uint32_t *valp);
+int sshpkt_get_u64(struct ssh *ssh, uint64_t *valp);
int sshpkt_get_string(struct ssh *ssh, u_char **valp, size_t *lenp);
int sshpkt_get_string_direct(struct ssh *ssh, const u_char **valp, size_t *lenp);
int sshpkt_peek_string_direct(struct ssh *ssh, const u_char **valp, size_t *lenp);
@@ -210,6 +211,7 @@ int sshpkt_get_bignum2(struct ssh *ssh, BIGNUM **valp);
int sshpkt_get_end(struct ssh *ssh);
void sshpkt_fmt_connection_id(struct ssh *ssh, char *s, size_t l);
const u_char *sshpkt_ptr(struct ssh *, size_t *lenp);
+char *connection_info_message(struct ssh *ssh);
#if !defined(WITH_OPENSSL)
# undef BIGNUM
diff --git a/pathnames.h b/pathnames.h
index 0dcc4955241f..ae01c69e2d91 100644
--- a/pathnames.h
+++ b/pathnames.h
@@ -37,8 +37,8 @@
#define _PATH_SERVER_CONFIG_FILE SSHDIR "/sshd_config"
#define _PATH_HOST_CONFIG_FILE SSHDIR "/ssh_config"
#define _PATH_HOST_ECDSA_KEY_FILE SSHDIR "/ssh_host_ecdsa_key"
-#define _PATH_HOST_ED25519_KEY_FILE SSHDIR "/ssh_host_ed25519_key"
#define _PATH_HOST_RSA_KEY_FILE SSHDIR "/ssh_host_rsa_key"
+#define _PATH_HOST_ED25519_KEY_FILE SSHDIR "/ssh_host_ed25519_key"
#define _PATH_DH_MODULI SSHDIR "/moduli"
#ifndef _PATH_SSH_PROGRAM
@@ -169,6 +169,9 @@
#ifndef _PATH_SFTP_SERVER
#define _PATH_SFTP_SERVER "/usr/libexec/sftp-server"
#endif
+#ifndef _PATH_LS
+#define _PATH_LS "ls"
+#endif
/* chroot directory for unprivileged user when UsePrivilegeSeparation=yes */
#ifndef _PATH_PRIVSEP_CHROOT_DIR
@@ -177,11 +180,7 @@
/* for passwd change */
#ifndef _PATH_PASSWD_PROG
-#define _PATH_PASSWD_PROG "/usr/bin/passwd"
-#endif
-
-#ifndef _PATH_LS
-#define _PATH_LS "ls"
+#define _PATH_PASSWD_PROG "/usr/bin/passwd"
#endif
/* Askpass program define */
diff --git a/progressmeter.c b/progressmeter.c
index 2c169768f60f..22f510a79361 100644
--- a/progressmeter.c
+++ b/progressmeter.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: progressmeter.c,v 1.56 2025/06/11 13:27:11 dtucker Exp $ */
+/* $OpenBSD: progressmeter.c,v 1.57 2026/03/29 01:08:13 djm Exp $ */
/*
* Copyright (c) 2003 Nils Nordman. All rights reserved.
*
@@ -67,7 +67,7 @@ static off_t end_pos; /* ending position of transfer */
static off_t cur_pos; /* transfer position as of last refresh */
static volatile off_t *counter; /* progress counter */
static long stalled; /* how long we have been stalled */
-static int bytes_per_second; /* current speed in bytes per second */
+static long long bytes_per_second; /* current speed in bytes per second */
static int win_size; /* terminal window size */
static volatile sig_atomic_t win_resized; /* for window resizing */
static volatile sig_atomic_t alarm_fired;
@@ -128,7 +128,7 @@ refresh_progress_meter(int force_update)
double elapsed, now;
int percent;
off_t bytes_left;
- int cur_speed;
+ long long cur_speed;
int hours, minutes, seconds;
int file_len, cols;
diff --git a/readconf.c b/readconf.c
index d99205944ecb..10cbd04ba1b9 100644
--- a/readconf.c
+++ b/readconf.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: readconf.c,v 1.406 2025/08/29 03:50:38 djm Exp $ */
+/* $OpenBSD: readconf.c,v 1.411 2026/03/30 07:18:24 djm Exp $ */
/*
* Author: Tatu Ylonen <ylo@cs.hut.fi>
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -22,13 +22,12 @@
#include <net/if.h>
#include <netinet/in.h>
-#include <netinet/in_systm.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <ctype.h>
#include <errno.h>
-#include <fcntl.h>
+#include <glob.h>
#include <ifaddrs.h>
#include <limits.h>
#include <netdb.h>
@@ -39,11 +38,6 @@
#include <string.h>
#include <stdarg.h>
#include <unistd.h>
-#ifdef USE_SYSTEM_GLOB
-# include <glob.h>
-#else
-# include "openbsd-compat/glob.h"
-#endif
#include <util.h>
#if defined(HAVE_STRNVIS) && defined(HAVE_VIS_H) && !defined(BROKEN_STRNVIS)
# include <vis.h>
@@ -51,7 +45,6 @@
#include "xmalloc.h"
#include "ssh.h"
-#include "ssherr.h"
#include "cipher.h"
#include "pathnames.h"
#include "log.h"
@@ -61,7 +54,6 @@
#include "match.h"
#include "kex.h"
#include "mac.h"
-#include "uidswap.h"
#include "myproposal.h"
#include "digest.h"
#include "version.h"
@@ -732,12 +724,12 @@ match_cfg_line(Options *options, const char *full_line, int *acp, char ***avp,
debug2("checking match for '%s' host %s originally %s",
full_line, host, original_host);
while ((attrib = argv_next(acp, avp)) != NULL) {
- attrib = oattrib = xstrdup(attrib);
/* Terminate on comment */
if (*attrib == '#') {
argv_consume(acp);
break;
}
+ attrib = oattrib = xstrdup(attrib);
arg = criteria = NULL;
this_result = 1;
if ((negate = (attrib[0] == '!')))
@@ -777,7 +769,7 @@ match_cfg_line(Options *options, const char *full_line, int *acp, char ***avp,
debug3("%.200s line %d: %smatched '%s'",
filename, linenum,
this_result ? "" : "not ", oattrib);
- continue;
+ goto next;
}
/* Keep this list in sync with below */
@@ -888,7 +880,7 @@ match_cfg_line(Options *options, const char *full_line, int *acp, char ***avp,
debug3("%.200s line %d: skipped exec "
"\"%.100s\"", filename, linenum, cmd);
free(cmd);
- continue;
+ goto next;
}
r = execute_in_shell(cmd);
if (r == -1) {
@@ -912,6 +904,7 @@ match_cfg_line(Options *options, const char *full_line, int *acp, char ***avp,
criteria == NULL ? "" : " \"",
criteria == NULL ? "" : criteria,
criteria == NULL ? "" : "\"");
+ next:
free(criteria);
free(oattrib);
oattrib = attrib = NULL;
@@ -1535,9 +1528,6 @@ parse_char_array:
case oProxyCommand:
charptr = &options->proxy_command;
- /* Ignore ProxyCommand if ProxyJump already specified */
- if (options->jump_host != NULL)
- charptr = &options->jump_host; /* Skip below */
parse_command:
if (str == NULL) {
error("%.200s line %d: Missing argument.",
@@ -1558,7 +1548,7 @@ parse_command:
}
len = strspn(str, WHITESPACE "=");
/* XXX use argv? */
- if (parse_jump(str + len, options, *activep) == -1) {
+ if (parse_jump(str + len, options, cmdline, *activep) == -1) {
error("%.200s line %d: Invalid ProxyJump \"%s\"",
filename, linenum, str + len);
goto out;
@@ -2330,8 +2320,38 @@ parse_pubkey_algos:
goto parse_flag;
case oRevokedHostKeys:
- charptr = &options->revoked_host_keys;
- goto parse_string;
+ uintptr = &options->num_revoked_host_keys;
+ cppptr = &options->revoked_host_keys;
+ found = *uintptr == 0;
+ while ((arg = argv_next(&ac, &av)) != NULL) {
+ if (*arg == '\0') {
+ error("%s line %d: keyword %s empty argument",
+ filename, linenum, keyword);
+ goto out;
+ }
+ /* Allow "none" only in first position */
+ if (strcasecmp(arg, "none") == 0) {
+ if (nstrs > 0 || ac > 0) {
+ error("%s line %d: keyword %s \"none\" "
+ "argument must appear alone.",
+ filename, linenum, keyword);
+ goto out;
+ }
+ }
+ opt_array_append(filename, linenum, keyword,
+ &strs, &nstrs, arg);
+ }
+ if (nstrs == 0) {
+ fatal("%s line %d: no %s specified",
+ filename, linenum, keyword);
+ }
+ if (found && *activep) {
+ *cppptr = strs;
+ *uintptr = nstrs;
+ strs = NULL; /* transferred */
+ nstrs = 0;
+ }
+ break;
case oFingerprintHash:
intptr = &options->fingerprint_hash;
@@ -2789,6 +2809,7 @@ initialize_options(Options * options)
options->canonicalize_fallback_local = -1;
options->canonicalize_hostname = -1;
options->revoked_host_keys = NULL;
+ options->num_revoked_host_keys = 0;
options->fingerprint_hash = -1;
options->update_hostkeys = -1;
options->hostbased_accepted_algos = NULL;
@@ -3057,11 +3078,11 @@ fill_default_options(Options * options)
CLEAR_ON_NONE(options->remote_command);
CLEAR_ON_NONE(options->proxy_command);
CLEAR_ON_NONE(options->control_path);
- CLEAR_ON_NONE(options->revoked_host_keys);
CLEAR_ON_NONE(options->pkcs11_provider);
CLEAR_ON_NONE(options->sk_provider);
CLEAR_ON_NONE(options->known_hosts_command);
CLEAR_ON_NONE_ARRAY(channel_timeouts, num_channel_timeouts, "none");
+ CLEAR_ON_NONE_ARRAY(revoked_host_keys, num_revoked_host_keys, "none");
#undef CLEAR_ON_NONE
#undef CLEAR_ON_NONE_ARRAY
if (options->jump_host != NULL &&
@@ -3172,6 +3193,7 @@ free_options(Options *o)
free(o->permitted_cnames[i].source_list);
free(o->permitted_cnames[i].target_list);
}
+ FREE_ARRAY(u_int, o->num_revoked_host_keys, o->revoked_host_keys);
free(o->revoked_host_keys);
free(o->hostbased_accepted_algos);
free(o->pubkey_accepted_algos);
@@ -3403,65 +3425,116 @@ parse_forward(struct Forward *fwd, const char *fwdspec, int dynamicfwd, int remo
}
int
-parse_jump(const char *s, Options *o, int active)
+ssh_valid_hostname(const char *s)
{
- char *orig, *sdup, *cp;
- char *host = NULL, *user = NULL;
- int r, ret = -1, port = -1, first;
+ size_t i;
- active &= o->proxy_command == NULL && o->jump_host == NULL;
+ if (*s == '-')
+ return 0;
+ for (i = 0; s[i] != 0; i++) {
+ if (strchr("'`\"$\\;&<>|(){},", s[i]) != NULL ||
+ isspace((u_char)s[i]) || iscntrl((u_char)s[i]))
+ return 0;
+ }
+ return 1;
+}
+
+int
+ssh_valid_ruser(const char *s)
+{
+ size_t i;
- orig = sdup = xstrdup(s);
+ if (*s == '-')
+ return 0;
+ for (i = 0; s[i] != 0; i++) {
+ if (iscntrl((u_char)s[i]))
+ return 0;
+ if (strchr("'`\";&<>|(){}", s[i]) != NULL)
+ return 0;
+ /* Disallow '-' after whitespace */
+ if (isspace((u_char)s[i]) && s[i + 1] == '-')
+ return 0;
+ /* Disallow \ in last position */
+ if (s[i] == '\\' && s[i + 1] == '\0')
+ return 0;
+ }
+ return 1;
+}
- /* Remove comment and trailing whitespace */
+int
+parse_jump(const char *s, Options *o, int strict, int active)
+{
+ char *orig = NULL, *sdup = NULL, *cp;
+ char *tmp_user = NULL, *tmp_host = NULL, *host = NULL, *user = NULL;
+ int r, ret = -1, tmp_port = -1, port = -1, first = 1;
+
+ if (strcasecmp(s, "none") == 0) {
+ if (active && o->jump_host == NULL) {
+ o->jump_host = xstrdup("none");
+ o->jump_port = 0;
+ }
+ return 0;
+ }
+
+ orig = xstrdup(s);
if ((cp = strchr(orig, '#')) != NULL)
*cp = '\0';
rtrim(orig);
- first = active;
+ active &= o->proxy_command == NULL && o->jump_host == NULL;
+ sdup = xstrdup(orig);
do {
- if (strcasecmp(s, "none") == 0)
- break;
+ /* Work backwards through string */
if ((cp = strrchr(sdup, ',')) == NULL)
cp = sdup; /* last */
else
*cp++ = '\0';
- if (first) {
- /* First argument and configuration is active */
- r = parse_ssh_uri(cp, &user, &host, &port);
- if (r == -1 || (r == 1 &&
- parse_user_host_port(cp, &user, &host, &port) != 0))
+ r = parse_ssh_uri(cp, &tmp_user, &tmp_host, &tmp_port);
+ if (r == -1 || (r == 1 && parse_user_host_port(cp,
+ &tmp_user, &tmp_host, &tmp_port) != 0))
+ goto out; /* error already logged */
+ if (strict) {
+ if (!ssh_valid_hostname(tmp_host)) {
+ error_f("invalid hostname \"%s\"", tmp_host);
goto out;
- } else {
- /* Subsequent argument or inactive configuration */
- r = parse_ssh_uri(cp, NULL, NULL, NULL);
- if (r == -1 || (r == 1 &&
- parse_user_host_port(cp, NULL, NULL, NULL) != 0))
+ }
+ if (tmp_user != NULL && !ssh_valid_ruser(tmp_user)) {
+ error_f("invalid username \"%s\"", tmp_user);
goto out;
+ }
+ }
+ if (first) {
+ user = tmp_user;
+ host = tmp_host;
+ port = tmp_port;
+ tmp_user = tmp_host = NULL; /* transferred */
}
first = 0; /* only check syntax for subsequent hosts */
+ free(tmp_user);
+ free(tmp_host);
+ tmp_user = tmp_host = NULL;
+ tmp_port = -1;
} while (cp != sdup);
+
/* success */
if (active) {
- if (strcasecmp(s, "none") == 0) {
- o->jump_host = xstrdup("none");
- o->jump_port = 0;
- } else {
- o->jump_user = user;
- o->jump_host = host;
- o->jump_port = port;
- o->proxy_command = xstrdup("none");
- user = host = NULL;
- if ((cp = strrchr(s, ',')) != NULL && cp != s) {
- o->jump_extra = xstrdup(s);
- o->jump_extra[cp - s] = '\0';
- }
+ o->jump_user = user;
+ o->jump_host = host;
+ o->jump_port = port;
+ o->proxy_command = xstrdup("none");
+ user = host = NULL; /* transferred */
+ if (orig != NULL && (cp = strrchr(orig, ',')) != NULL) {
+ o->jump_extra = xstrdup(orig);
+ o->jump_extra[cp - orig] = '\0';
}
}
ret = 0;
out:
free(orig);
+ free(sdup);
+ free(tmp_user);
+ free(tmp_host);
free(user);
free(host);
return ret;
@@ -3751,7 +3824,6 @@ dump_client_config(Options *o, const char *host)
dump_cfg_string(oSecurityKeyProvider, o->sk_provider);
dump_cfg_string(oPreferredAuthentications, o->preferred_authentications);
dump_cfg_string(oPubkeyAcceptedAlgorithms, o->pubkey_accepted_algos);
- dump_cfg_string(oRevokedHostKeys, o->revoked_host_keys);
dump_cfg_string(oXAuthLocation, o->xauth_location);
dump_cfg_string(oKnownHostsCommand, o->known_hosts_command);
dump_cfg_string(oTag, o->tag);
@@ -3768,6 +3840,7 @@ dump_client_config(Options *o, const char *host)
dump_cfg_strarray(oCertificateFile, o->num_certificate_files, o->certificate_files);
dump_cfg_strarray_oneline(oGlobalKnownHostsFile, o->num_system_hostfiles, o->system_hostfiles);
dump_cfg_strarray_oneline(oUserKnownHostsFile, o->num_user_hostfiles, o->user_hostfiles);
+ dump_cfg_strarray_oneline(oRevokedHostKeys, o->num_revoked_host_keys, o->revoked_host_keys);
dump_cfg_strarray(oSendEnv, o->num_send_env, o->send_env);
dump_cfg_strarray(oSetEnv, o->num_setenv, o->setenv);
dump_cfg_strarray_oneline(oLogVerbose,
diff --git a/readconf.h b/readconf.h
index 942149f9ae3f..dbcb417250e1 100644
--- a/readconf.h
+++ b/readconf.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: readconf.h,v 1.161 2025/08/11 10:55:38 djm Exp $ */
+/* $OpenBSD: readconf.h,v 1.163 2026/03/30 07:18:24 djm Exp $ */
/*
* Author: Tatu Ylonen <ylo@cs.hut.fi>
@@ -162,7 +162,8 @@ typedef struct {
int num_permitted_cnames;
struct allowed_cname *permitted_cnames;
- char *revoked_host_keys;
+ u_int num_revoked_host_keys;
+ char **revoked_host_keys;
int fingerprint_hash;
@@ -246,7 +247,9 @@ int process_config_line(Options *, struct passwd *, const char *,
int read_config_file(const char *, struct passwd *, const char *,
const char *, const char *, Options *, int, int *);
int parse_forward(struct Forward *, const char *, int, int);
-int parse_jump(const char *, Options *, int);
+int ssh_valid_hostname(const char *);
+int ssh_valid_ruser(const char *);
+int parse_jump(const char *, Options *, int, int);
int parse_ssh_uri(const char *, char **, char **, int *);
int default_ssh_port(void);
int option_clear_or_none(const char *);
diff --git a/readpass.c b/readpass.c
index 3c9212c2777b..2502e520f584 100644
--- a/readpass.c
+++ b/readpass.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: readpass.c,v 1.72 2025/06/11 13:24:05 dtucker Exp $ */
+/* $OpenBSD: readpass.c,v 1.73 2026/02/14 00:18:34 jsg Exp $ */
/*
* Copyright (c) 2001 Markus Friedl. All rights reserved.
*
@@ -43,7 +43,6 @@
#include "pathnames.h"
#include "log.h"
#include "ssh.h"
-#include "uidswap.h"
static char *
ssh_askpass(char *askpass, const char *msg, const char *env_hint)
diff --git a/regress/Makefile b/regress/Makefile
index ece093a2ba87..ae45bd463fe4 100644
--- a/regress/Makefile
+++ b/regress/Makefile
@@ -1,4 +1,4 @@
-# $OpenBSD: Makefile,v 1.140 2025/07/04 07:52:17 djm Exp $
+# $OpenBSD: Makefile,v 1.144 2026/03/30 07:19:02 djm Exp $
tests: prep file-tests t-exec unit
@@ -19,6 +19,7 @@ clean:
for F in $(CLEANFILES); do rm -f $(OBJ)$$F; done
rm -rf $(OBJ).putty
rm -rf $(OBJ).dropbear
+ rm -rf $(OBJ).fakehome
distclean: clean
@@ -107,6 +108,7 @@ LTESTS= connect \
agent-restrict \
hostbased \
password \
+ kbdint \
channel-timeout \
connection-timeout \
match-subsystem \
@@ -114,7 +116,10 @@ LTESTS= connect \
agent-pkcs11-cert \
penalty \
penalty-expire \
- connect-bigconf
+ connect-bigconf \
+ ssh-pkcs11 \
+ ssh-tty \
+ proxyjump
INTEROP_TESTS= putty-transfer putty-ciphers putty-kex conch-ciphers
INTEROP_TESTS+= dropbear-ciphers dropbear-kex dropbear-server
@@ -151,7 +156,8 @@ CLEANFILES= *.core actual agent-key.* authorized_keys_${USERNAME} \
sshd_proxy_orig t10.out t10.out.pub t12.out t12.out.pub \
t2.out t3.out t6.out1 t6.out2 t7.out t7.out.pub \
t8.out t8.out.pub t9.out t9.out.pub \
- timestamp testdata user_*key* user_ca* user_key*
+ timestamp testdata user_*key* user_ca* user_key* \
+ pin.sh nopin.sh wrongpin.sh key.pub test.sh ctl-sock
# Enable all malloc(3) randomisations and checks
TEST_ENV= "MALLOC_OPTIONS=CFGJRSUX"
diff --git a/regress/cert-hostkey.sh b/regress/cert-hostkey.sh
index bfdd3588d98f..0c160775388f 100644
--- a/regress/cert-hostkey.sh
+++ b/regress/cert-hostkey.sh
@@ -1,4 +1,4 @@
-# $OpenBSD: cert-hostkey.sh,v 1.28 2025/05/06 06:05:48 djm Exp $
+# $OpenBSD: cert-hostkey.sh,v 1.31 2026/02/11 22:58:23 djm Exp $
# Placed in the Public Domain.
tid="certified host keys"
@@ -143,6 +143,8 @@ for ktype in $PLAIN_TYPES ; do
attempt_connect "$ktype basic connect" "yes"
attempt_connect "$ktype empty KRL" "yes" \
-oRevokedHostKeys=$OBJ/host_krl_empty
+ attempt_connect "$ktype multiple KRL files" "no" \
+ -oRevokedHostKeys="/dev/null $OBJ/host_krl_plain"
attempt_connect "$ktype KRL w/ plain key revoked" "no" \
-oRevokedHostKeys=$OBJ/host_krl_plain
attempt_connect "$ktype KRL w/ cert revoked" "no" \
@@ -208,18 +210,32 @@ kh_ca host_ca_key.pub host_ca_key2.pub > $OBJ/known_hosts-cert.orig
cp $OBJ/known_hosts-cert.orig $OBJ/known_hosts-cert
test_one() {
- ident=$1
- result=$2
- sign_opts=$3
+ ident="$1"
+ result="$2"
+ hosts="$3"
+ sign_opts="$4"
+
+ test -z "$hosts" || sign_opts="$sign_opts -n $hosts"
for kt in $PLAIN_TYPES; do
case $ktype in
rsa-sha2-*) tflag="-t $ktype"; ca="$OBJ/host_ca_key2" ;;
*) tflag=""; ca="$OBJ/host_ca_key" ;;
esac
- ${SSHKEYGEN} -q -s $ca $tflag -I "regress host key for $USER" \
- $sign_opts $OBJ/cert_host_key_${kt} ||
- fatal "couldn't sign cert_host_key_${kt}"
+ if test -z "$hosts" ; then
+ # Empty principals section.
+ ${SSHKEYGEN} -q -s $ca $tflag $sign_opts \
+ -I "regress host key for $USER" \
+ $OBJ/cert_host_key_${kt} 2>/dev/null ||
+ fatal "couldn't sign cert_host_key_${kt}"
+ else
+ # Be careful with quoting principals, which may contain
+ # wilcards.
+ ${SSHKEYGEN} -q -s $ca $tflag $sign_opts \
+ -I "regress host key for $USER" -n "$hosts" \
+ $OBJ/cert_host_key_${kt} ||
+ fatal "couldn't sign cert_host_key_${kt}"
+ fi
(
cat $OBJ/sshd_proxy_bak
echo HostKey $OBJ/cert_host_key_${kt}
@@ -243,13 +259,16 @@ test_one() {
done
}
-test_one "user-certificate" failure "-n $HOSTS"
-test_one "empty principals" success "-h"
-test_one "wrong principals" failure "-h -n foo"
-test_one "cert not yet valid" failure "-h -V20300101:20320101"
-test_one "cert expired" failure "-h -V19800101:19900101"
-test_one "cert valid interval" success "-h -V-1w:+2w"
-test_one "cert has constraints" failure "-h -Oforce-command=false"
+test_one "simple" success $HOSTS "-h"
+test_one "wildcard" success "loc*" "-h"
+test_one "user-certificate" failure $HOSTS
+test_one "wildcard user" failure "local*"
+test_one "empty principals" failure "" "-h"
+test_one "wrong principals" failure foo "-h"
+test_one "cert not yet valid" failure $HOSTS "-h -V20300101:20320101"
+test_one "cert expired" failure $HOSTS "-h -V19800101:19900101"
+test_one "cert valid interval" success $HOSTS "-h -V-1w:+2w"
+test_one "cert has constraints" failure $HOSTS "-h -Oforce-command=false"
# Check downgrade of cert to raw key when no CA found
for ktype in $PLAIN_TYPES ; do
diff --git a/regress/cert-userkey.sh b/regress/cert-userkey.sh
index fde2caefbd4f..c0decf065cd3 100644
--- a/regress/cert-userkey.sh
+++ b/regress/cert-userkey.sh
@@ -1,4 +1,4 @@
-# $OpenBSD: cert-userkey.sh,v 1.30 2025/05/06 06:05:48 djm Exp $
+# $OpenBSD: cert-userkey.sh,v 1.32 2026/02/11 22:58:23 djm Exp $
# Placed in the Public Domain.
tid="certified user keys"
@@ -226,7 +226,8 @@ basic_tests() {
verbose "$tid: ${_prefix} revoked key"
(
cat $OBJ/sshd_proxy_bak
- echo "RevokedKeys $OBJ/cert_user_key_revoked"
+ # Also test multiple RevokedKeys files.
+ echo "RevokedKeys /dev/null $OBJ/cert_user_key_revoked"
echo "PubkeyAcceptedAlgorithms ${t}"
echo "$extra_sshd"
) > $OBJ/sshd_proxy
@@ -340,16 +341,15 @@ test_one() {
}
test_one "correct principal" success "-n ${USER}"
+test_one "correct principal" success "-n ${USER},*"
test_one "host-certificate" failure "-n ${USER} -h"
-test_one "wrong principals" failure "-n foo"
+test_one "wrong principals" failure "-n foo,*"
test_one "cert not yet valid" failure "-n ${USER} -V20300101:20320101"
test_one "cert expired" failure "-n ${USER} -V19800101:19900101"
test_one "cert valid interval" success "-n ${USER} -V-1w:+2w"
test_one "wrong source-address" failure "-n ${USER} -Osource-address=10.0.0.0/8"
test_one "force-command" failure "-n ${USER} -Oforce-command=false"
-
-# Behaviour is different here: TrustedUserCAKeys doesn't allow empty principals
-test_one "empty principals" success "" authorized_keys
+test_one "empty principals" failure "" authorized_keys
test_one "empty principals" failure "" TrustedUserCAKeys
# Check explicitly-specified principals: an empty principals list in the cert
diff --git a/regress/cfgmatch.sh b/regress/cfgmatch.sh
index 8b9d80f0a239..d627c37a3fa7 100644
--- a/regress/cfgmatch.sh
+++ b/regress/cfgmatch.sh
@@ -1,4 +1,4 @@
-# $OpenBSD: cfgmatch.sh,v 1.15 2025/07/11 23:26:59 djm Exp $
+# $OpenBSD: cfgmatch.sh,v 1.17 2025/12/19 00:57:42 djm Exp $
# Placed in the Public Domain.
tid="sshd_config match"
@@ -9,6 +9,8 @@ fwd="-L $fwdport:127.0.0.1:$PORT"
echo "ExitOnForwardFailure=yes" >> $OBJ/ssh_config
echo "ExitOnForwardFailure=yes" >> $OBJ/ssh_proxy
+cp $OBJ/sshd_proxy $OBJ/sshd_proxy_bak
+cp $OBJ/sshd_config $OBJ/sshd_config_bak
start_client()
{
@@ -38,7 +40,6 @@ stop_client()
wait
}
-cp $OBJ/sshd_proxy $OBJ/sshd_proxy_bak
echo "PermitOpen 127.0.0.1:1 # comment" >>$OBJ/sshd_config
echo "Match Address 127.0.0.1" >>$OBJ/sshd_config
echo "PermitOpen 127.0.0.1:2 127.0.0.1:3 127.0.0.1:$PORT" >>$OBJ/sshd_config
@@ -160,3 +161,21 @@ EOD
fi
done
done
+
+# Ensure that invalid subsystems are detected at startup
+cp $OBJ/sshd_proxy_bak $OBJ/sshd_proxy
+cat >> $OBJ/sshd_proxy << _EOF
+Match host blah
+ Subsystem invalid
+_EOF
+$SSHD -tf $OBJ/sshd_proxy 2>/dev/null && \
+ fail "sshd_config accepted invalid subsystem"
+
+# A single subsystem inside a match block doesn't cause a crash (bz3906)
+stop_sshd
+grep -vi subsystem $OBJ/sshd_config_bak > $OBJ/sshd_config
+echo "Match host *" >> $OBJ/sshd_config
+grep -i subsystem $OBJ/sshd_config_bak >> $OBJ/sshd_config
+start_sshd
+${SSH} -q -F $OBJ/ssh_config somehost true || fatal "ssh failed"
+
diff --git a/regress/check-perm.c b/regress/check-perm.c
index dac307d24464..5e5941ab393f 100644
--- a/regress/check-perm.c
+++ b/regress/check-perm.c
@@ -2,8 +2,6 @@
* Placed in the public domain
*/
-/* $OpenBSD: modpipe.c,v 1.6 2013/11/21 03:16:47 djm Exp $ */
-
#include "includes.h"
#include <sys/types.h>
diff --git a/regress/gss-auth.sh b/regress/gss-auth.sh
new file mode 100644
index 000000000000..c349fbeb9a87
--- /dev/null
+++ b/regress/gss-auth.sh
@@ -0,0 +1,196 @@
+tid="GSSAPI Authentication"
+
+# Skip the test if GSSAPI support is not configured
+if ! grep -E '^#define GSSAPI' "$BUILDDIR/config.h" >/dev/null 2>&1; then
+ skip "GSSAPI not enabled"
+fi
+
+# We test with MIT Kerberos KDC, skip if not installed
+if ! which krb5kdc >/dev/null 2>&1; then
+ skip "MIT Kerberos KDC not installed"
+fi
+
+# The test needs nss_wrapper to emulate gethostname() and /etc/hosts,
+# we skip if the shared library is not installed
+nss_wrapper="libnss_wrapper.so"
+if ! ldconfig -p | grep "$nss_wrapper" >/dev/null 2>&1; then
+ skip "$nss_wrapper not installed"
+fi
+
+# Set up the username of the SSH client
+client="$LOGNAME"
+if [ "x$client" = "x" ]; then
+ client="$(whoami)"
+fi
+
+# Set up SSHD and KDC hostnames and resolve both to localhost
+sshd_hostname="sshd.example.org"
+bad_hostname="bad.example.org"
+kdc_hostname="kdc.example.org"
+kdc_port=2088
+hosts="$OBJ/hosts"
+echo "127.0.0.1 $sshd_hostname $kdc_hostname" > "$hosts"
+
+# Set up a directory to store Kerberos data
+# (configuration, ticket cache,...)
+gssdir="$OBJ/gss"
+mkdir -p "$gssdir"
+export KRB5CCNAME="$gssdir/cc"
+export KRB5_CONFIG="$gssdir/krb5.conf"
+export KRB5_KDC_PROFILE="$gssdir/kdc.conf"
+export KRB5_KTNAME="$gssdir/ssh.keytab"
+export KRB5RCACHETYPE="none"
+kdc_pidfile="$gssdir/pid"
+
+# Configure Kerberos
+cat<<EOF > "$KRB5_KDC_PROFILE"
+[realms]
+ EXAMPLE.ORG = {
+ database_name = $gssdir/principal
+ key_stash_file = $gssdir/stash
+ kdc_listen = $kdc_hostname:$kdc_port
+ kdc_tcp_listen = $kdc_hostname:$kdc_port
+ }
+[logging]
+ kdc = FILE:$gssdir/kdc.log
+ debug = true
+EOF
+
+cat<<EOF > "$KRB5_CONFIG"
+[libdefaults]
+ default_realm = EXAMPLE.ORG
+[realms]
+ EXAMPLE.ORG = {
+ kdc = $kdc_hostname:$kdc_port
+ }
+EOF
+
+# Back up the default sshd_config
+cp "$OBJ/sshd_config" "$OBJ/sshd_config.orig"
+
+setup_sshd() {
+ mock_hostname="$1"
+ strict_acceptor="$2"
+
+ cp "$OBJ/sshd_config.orig" "$OBJ/sshd_config"
+
+ cat<<EOF >> "$OBJ/sshd_config"
+PubkeyAuthentication No
+PasswordAuthentication No
+GSSAPIAuthentication Yes
+EOF
+
+ if ! $strict_acceptor; then
+ echo "GSSAPIStrictAcceptorCheck No" >> "$OBJ/sshd_config"
+ fi
+
+ test_ssh_sshd_env_backup="$TEST_SSH_SSHD_ENV"
+ TEST_SSH_SSHD_ENV="$TEST_SSH_SSHD_ENV \
+ LD_PRELOAD=$nss_wrapper \
+ NSS_WRAPPER_HOSTS=$hosts \
+ NSS_WRAPPER_HOSTNAME=$mock_hostname \
+ KRB5_CONFIG=$KRB5_CONFIG \
+ KRB5_KDC_PROFILE=$KRB5_KDC_PROFILE \
+ KRB5CCNAME=$KRB5CCNAME \
+ KRB5_KTNAME=$KRB5_KTNAME \
+ KRB5RCACHETYPE=$KRB5RCACHETYPE"
+ start_sshd
+}
+
+teardown_sshd() {
+ TEST_SSH_SSHD_ENV="$test_ssh_sshd_env_backup"
+ stop_sshd
+}
+
+setup_kdc() {
+ kdb5_util create -P "foo" -s
+ krb5kdc -w 1 -P "$kdc_pidfile"
+ i=0;
+ while [ ! -f "$kdc_pidfile" -a $i -lt 10 ]; do
+ i=$((i + 1))
+ sleep 1
+ done
+ test -f "$kdc_pidfile" || fatal "KDC failed to start"
+}
+
+teardown_kdc() {
+ kill "$(cat "$kdc_pidfile")"
+ kdestroy
+ rm -f "$KRB5_KTNAME" "$kdc_pidfile"
+ kdb5_util destroy -f
+}
+
+setup_nss_emulation() {
+ export LD_PRELOAD="$nss_wrapper"
+ export NSS_WRAPPER_HOSTS="$hosts"
+}
+
+teardown_nss_emulation() {
+ unset LD_PRELOAD
+ unset NSS_WRAPPER_HOSTS
+}
+
+setup_krb_principal_with_key() {
+ name="$1"
+ add_to_keytab="$2"
+ kadmin.local add_principal -randkey "$name"
+ if $add_to_keytab; then
+ kadmin.local ktadd "$name"
+ fi
+}
+
+setup_krb_principal_with_pw() {
+ name="$1"
+ password="$2"
+ authenticate="$3"
+ kadmin.local add_principal -pw "$password" "$name"
+ if $authenticate; then
+ echo "$password" | kinit "$name"
+ fi
+}
+
+test_gss_auth() {
+ sshd_mock_hostname="$1" # the name that gethostname() will return within sshd
+ sshd_principal="$2" # the hostname for which a Kerberos principal will be created
+ auth_sshd="$3" # whether sshd will be authenticated via a keytab
+ auth_client="$4" # whether the client will be authenticated via kinit
+ strict_acceptor="$5" # whether to be strict about the identity of the sshd server
+ expect="$6" # the expected return value of the sshd command
+
+ setup_sshd "$sshd_mock_hostname" "$strict_acceptor"
+ setup_nss_emulation
+ setup_kdc
+
+ setup_krb_principal_with_key "host/$sshd_principal" "$auth_sshd"
+ setup_krb_principal_with_pw "$client" "foo" "$auth_client"
+
+ ${SSH} -F "$OBJ/ssh_config" -o "GSSAPIAuthentication Yes" "$client@$sshd_hostname" true
+ status=$?
+
+ teardown_kdc
+ teardown_nss_emulation
+ teardown_sshd
+
+ [ $status -eq $expect ]
+}
+
+# sshd_mock_hostname sshd_principal auth_sshd auth_client strict_acceptor expect
+test_gss_auth $sshd_hostname $sshd_hostname true true true 0 \
+ || fail "valid authentication attempt failed"
+test_gss_auth $sshd_hostname $sshd_hostname false true true 255 \
+ || fail "authentication succeeded without a keytab entry for the host"
+test_gss_auth $sshd_hostname $sshd_hostname true false true 255 \
+ || fail "authentication succeeded without a ticket-granting ticket"
+test_gss_auth $bad_hostname $sshd_hostname true true true 255 \
+ || fail "authentication succeeded with a hostname/principal mismatch on server side"
+test_gss_auth $bad_hostname $sshd_hostname true true false 0 \
+ || fail "valid authentication without strict acceptor check failed"
+test_gss_auth $bad_hostname $bad_hostname true true true 255 \
+ || fail "authentication succeeded with a hostname/principal mismatch on client side"
+
+unset KRB5CCNAME
+unset KRB5_CONFIG
+unset KRB5_KDC_PROFILE
+unset KRB5_KTNAME
+unset KRB5RCACHETYPE
+rm -r "$gssdir"
diff --git a/regress/hostbased.sh b/regress/hostbased.sh
index 5de176b18bf7..69808ceb7c6b 100644
--- a/regress/hostbased.sh
+++ b/regress/hostbased.sh
@@ -1,8 +1,8 @@
-# $OpenBSD: hostbased.sh,v 1.5 2025/05/06 06:05:48 djm Exp $
+# $OpenBSD: hostbased.sh,v 1.9 2026/03/24 12:31:35 dtucker Exp $
# Placed in the Public Domain.
# This test requires external setup and thus is skipped unless
-# TEST_SSH_HOSTBASED_AUTH and SUDO are set to "yes".
+# TEST_SSH_HOSTBASED_AUTH and SUDO are set.
# Since ssh-keysign has key paths hard coded, unlike the other tests it
# needs to use the real host keys. It requires:
# - ssh-keysign must be installed and setuid.
@@ -10,12 +10,34 @@
# - the system's own real FQDN the system-wide shosts.equiv.
# - the system's real public key fingerprints must be in global ssh_known_hosts.
#
+# Setting TEST_SSH_HOSTBASED_AUTH to the special value "setupandrun" will,
+# if run with SUDO, perform this setup and run the test. Note that this will
+# MODIFY THE SYSTEM'S GLOBAL CONFIG to enable HostbasedAuthentication and
+# leave it enabled, so do not do this on a system that matters.
+#
tid="hostbased"
if [ -z "${TEST_SSH_HOSTBASED_AUTH}" ]; then
skip "TEST_SSH_HOSTBASED_AUTH not set."
elif [ -z "${SUDO}" ]; then
skip "SUDO not set"
+elif [ "${TEST_SSH_HOSTBASED_AUTH}" = "setupandrun" ]; then
+ verbose "setting up system for hostbased auth"
+ knownhosts=`$SSH -G localhost | \
+ awk '$1=="globalknownhostsfile" {print $2}'`
+ sshconf=`dirname $knownhosts`
+ hostname >~/.shosts
+ if ! grep "^EnableSSHKeysign yes" $sshconf/ssh_config >/dev/null; then
+ echo "EnableSSHKeysign yes" | \
+ $SUDO tee -a $sshconf/ssh_config >/dev/null
+ fi
+ $SUDO touch "$knownhosts"
+ for pubkey in $sshconf/ssh_host*key*.pub; do
+ line="`hostname` `cat $pubkey`"
+ if ! grep "$line" "$knownhosts" >/dev/null; then
+ echo "$line" | $SUDO tee -a $knownhosts >/dev/null
+ fi
+ done
fi
# Enable all supported hostkey algos (but no others)
@@ -25,6 +47,7 @@ cat >>$OBJ/sshd_proxy <<EOD
HostbasedAuthentication yes
HostbasedAcceptedAlgorithms $hostkeyalgos
HostbasedUsesNameFromPacketOnly yes
+IgnoreRhosts no
HostKeyAlgorithms $hostkeyalgos
EOD
diff --git a/regress/kbdint.sh b/regress/kbdint.sh
new file mode 100644
index 000000000000..7db876180c52
--- /dev/null
+++ b/regress/kbdint.sh
@@ -0,0 +1,86 @@
+# $OpenBSD: kbdint.sh,v 1.2 2026/02/24 00:39:59 dtucker Exp $
+# Placed in the Public Domain.
+#
+# This tests keyboard-interactive authentication. It does not run by default,
+# and needs to be enabled by putting the password of the user running the tests
+# into ${OBJ}/kbdintpw. Since this obviously puts the password at risk it is
+# recommended to do this on a throwaway VM by setting a random password
+# (and randomizing it again after the test, if you can't immediately dispose
+# of the VM).
+
+tid="kbdint"
+
+if [ -z "$SUDO" -o ! -f ${OBJ}/kbdintpw ]; then
+ skip "Password auth requires SUDO and kbdintpw file."
+fi
+
+# Enable keyboard-interactive auth
+echo "KbdInteractiveAuthentication yes" >>sshd_proxy
+
+# Create askpass script to replay a series of password responses.
+# Keep a counter of the number of times it has been called and
+# reply with the next line of the replypass file.
+cat >${OBJ}/replypass.sh <<EOD
+#!/bin/sh
+n=\`cat ${OBJ}/replypass.N\`
+awk "NR==\$n" ${OBJ}/replypass
+echo \$(( \$n + 1 )) >${OBJ}/replypass.N
+EOD
+chmod 700 ${OBJ}/replypass.sh
+
+SSH_ASKPASS=${OBJ}/replypass.sh
+SSH_ASKPASS_REQUIRE=force
+export SSH_ASKPASS SSH_ASKPASS_REQUIRE
+
+opts="-oKbdInteractiveAuthentication=yes -oPreferredAuthentications=keyboard-interactive"
+opts="-oBatchMode=no $opts"
+
+trace correct password 1st attempt
+cat ${OBJ}/kbdintpw >${OBJ}/replypass
+echo 1 >${OBJ}/replypass.N
+${SSH} $opts -F $OBJ/ssh_proxy somehost true
+if [ $? -ne 0 ]; then
+ fail "ssh kdbint failed"
+fi
+
+trace bad password
+echo badpass >${OBJ}/replypass
+echo 1 >${OBJ}/replypass.N
+${SSH} $opts -F $OBJ/ssh_proxy somehost true
+if [ $? -eq 0 ]; then
+ fail "ssh unexpectedly succeeded"
+fi
+
+trace correct password 2nd attempt
+(echo badpass; cat ${OBJ}/kbdintpw) >${OBJ}/replypass
+echo 1 >${OBJ}/replypass.N
+${SSH} $opts -F $OBJ/ssh_proxy somehost true
+if [ $? -ne 0 ]; then
+ fail "did not succeed on 2nd attempt"
+fi
+
+trace empty password
+echo >${OBJ}/replypass
+echo 1 >${OBJ}/replypass.N
+${SSH} $opts -F $OBJ/ssh_proxy somehost true
+if [ $? -eq 0 ]; then
+ fail "ssh unexpectedly succeeded with empty password"
+fi
+
+trace huge password
+(for i in 0 1 2 3 4 5 6 7 8 9; do printf 0123456789; done; echo) \
+ >${OBJ}/replypass
+echo 1 >${OBJ}/replypass.N
+${SSH} $opts -F $OBJ/ssh_proxy somehost true
+if [ $? -eq 0 ]; then
+ fail "ssh unexpectedly succeeded with huge password"
+fi
+
+trace spam password
+for i in 0 1 2 3 4 5 6 7 8 9; do printf '1\n2\n3\n4\n5\n6\n7\n8\n9\n'; done \
+ >${OBJ}/replypass
+echo 1 >${OBJ}/replypass.N
+${SSH} $opts -F $OBJ/ssh_proxy somehost true
+if [ $? -eq 0 ]; then
+ fail "ssh unexpectedly succeeded with password spam"
+fi
diff --git a/regress/misc/sk-dummy/Makefile b/regress/misc/sk-dummy/Makefile
index 18b0a243f664..2a88617ccde9 100644
--- a/regress/misc/sk-dummy/Makefile
+++ b/regress/misc/sk-dummy/Makefile
@@ -1,4 +1,4 @@
-# $OpenBSD: Makefile,v 1.3 2023/01/15 23:35:10 djm Exp $
+# $OpenBSD: Makefile,v 1.7 2025/11/06 17:24:28 djm Exp $
.include <bsd.own.mk>
.include <bsd.obj.mk>
@@ -9,9 +9,10 @@ NOMAN=
SSHREL=../../../../../usr.bin/ssh
.PATH: ${.CURDIR}/${SSHREL}
-SRCS=sk-dummy.c
+SRCS=sk-dummy.c fatal.c
# From usr.bin/ssh
-SRCS+=ed25519.c hash.c
+SRCS+=ed25519-openssl.c
+#SRCS+=ed25519.c
OPENSSL?= yes
CFLAGS+= -fPIC
@@ -36,6 +37,7 @@ CDIAGFLAGS+= -Wimplicit
CDIAGFLAGS+= -Winline
CDIAGFLAGS+= -Wmissing-declarations
CDIAGFLAGS+= -Wmissing-prototypes
+CDIAGFLAGS+= -Wold-style-definition
CDIAGFLAGS+= -Wparentheses
CDIAGFLAGS+= -Wpointer-arith
CDIAGFLAGS+= -Wreturn-type
@@ -48,9 +50,6 @@ CDIAGFLAGS+= -Wtrigraphs
CDIAGFLAGS+= -Wuninitialized
CDIAGFLAGS+= -Wunused
CDIAGFLAGS+= -Wno-unused-parameter
-.if ${COMPILER_VERSION:L} != "gcc3"
-CDIAGFLAGS+= -Wold-style-definition
-.endif
CFLAGS+=-I${.CURDIR}/${SSHREL}
diff --git a/regress/misc/sk-dummy/fatal.c b/regress/misc/sk-dummy/fatal.c
index c6e4b5d6fa71..4f5e88585384 100644
--- a/regress/misc/sk-dummy/fatal.c
+++ b/regress/misc/sk-dummy/fatal.c
@@ -10,18 +10,36 @@
#include "log.h"
void
-sshfatal(const char *file, const char *func, int line, int showfunc,
- LogLevel level, const char *suffix, const char *fmt, ...)
+sshlogv(const char *file, const char *func, int line, int showfunc,
+ LogLevel level, const char *suffix, const char *fmt, va_list args)
{
- va_list ap;
-
if (showfunc)
fprintf(stderr, "%s: ", func);
- va_start(ap, fmt);
- vfprintf(stderr, fmt, ap);
- va_end(ap);
+ vfprintf(stderr, fmt, args);
if (suffix != NULL)
fprintf(stderr, ": %s", suffix);
fputc('\n', stderr);
+}
+
+void
+sshlog(const char *file, const char *func, int line, int showfunc,
+ LogLevel level, const char *suffix, const char *fmt, ...)
+{
+ va_list args;
+
+ va_start(args, fmt);
+ sshlogv(file, func, line, showfunc, level, suffix, fmt, args);
+ va_end(args);
+}
+
+void
+sshfatal(const char *file, const char *func, int line, int showfunc,
+ LogLevel level, const char *suffix, const char *fmt, ...)
+{
+ va_list args;
+
+ va_start(args, fmt);
+ sshlogv(file, func, line, showfunc, level, suffix, fmt, args);
+ va_end(args);
_exit(1);
}
diff --git a/regress/misc/ssh-verify-attestation/Makefile b/regress/misc/ssh-verify-attestation/Makefile
index 06fb8aac4e98..2124b78b1314 100644
--- a/regress/misc/ssh-verify-attestation/Makefile
+++ b/regress/misc/ssh-verify-attestation/Makefile
@@ -1,4 +1,4 @@
-# $OpenBSD: Makefile,v 1.2 2025/05/06 06:05:48 djm Exp $
+# $OpenBSD: Makefile,v 1.4 2025/11/06 01:33:03 djm Exp $
.include <bsd.own.mk>
.include <bsd.obj.mk>
@@ -16,12 +16,11 @@ SRCS+=sshbuf-io.c atomicio.c sshkey.c authfile.c cipher.c log.c ssh-rsa.c
SRCS+=ssh-ecdsa.c ssh-ed25519.c mac.c umac.c umac128.c hmac.c misc.c
SRCS+=ssherr.c uidswap.c cleanup.c xmalloc.c match.c krl.c fatal.c
SRCS+=addr.c addrmatch.c bitmap.c
-SRCS+=ed25519.c hash.c
SRCS+=cipher-chachapoly.c chacha.c poly1305.c ssh-ecdsa-sk.c ssh-sk.c
SRCS+=ssh-ed25519-sk.c sk-usbhid.c
-SRCS+=digest-openssl.c
-#SRCS+=digest-libc.c
+SRCS+=digest-openssl.c ed25519-openssl.c
+#SRCS+=digest-libc.c ed25519.c
SRCS+=utf8.c
OPENSSL?= yes
@@ -46,6 +45,7 @@ CDIAGFLAGS+= -Wimplicit
CDIAGFLAGS+= -Winline
CDIAGFLAGS+= -Wmissing-declarations
CDIAGFLAGS+= -Wmissing-prototypes
+CDIAGFLAGS+= -Wold-style-definition
CDIAGFLAGS+= -Wparentheses
CDIAGFLAGS+= -Wpointer-arith
CDIAGFLAGS+= -Wreturn-type
@@ -58,9 +58,6 @@ CDIAGFLAGS+= -Wtrigraphs
CDIAGFLAGS+= -Wuninitialized
CDIAGFLAGS+= -Wunused
CDIAGFLAGS+= -Wno-unused-parameter
-.if ${COMPILER_VERSION:L} != "gcc3"
-CDIAGFLAGS+= -Wold-style-definition
-.endif
CFLAGS+=-I${.CURDIR}/${SSHREL}
diff --git a/regress/modpipe.c b/regress/modpipe.c
index 5ef2f12ed1f6..99a6e4386595 100644
--- a/regress/modpipe.c
+++ b/regress/modpipe.c
@@ -1,3 +1,5 @@
+/* $OpenBSD: modpipe.c,v 1.9 2026/03/06 07:06:45 dtucker Exp $ */
+
/*
* Copyright (c) 2012 Damien Miller <djm@mindrot.org>
*
@@ -14,8 +16,6 @@
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-/* $OpenBSD: modpipe.c,v 1.7 2025/10/03 01:03:45 dtucker Exp $ */
-
#include "includes.h"
#include <sys/types.h>
@@ -44,7 +44,7 @@ usage(void)
struct modification {
enum { MOD_XOR, MOD_AND_OR } what;
unsigned long long offset;
- u_int8_t m1, m2;
+ uint8_t m1, m2;
};
static void
diff --git a/regress/multiplex.sh b/regress/multiplex.sh
index 8274b9d59d18..584bbbe22619 100644
--- a/regress/multiplex.sh
+++ b/regress/multiplex.sh
@@ -1,12 +1,12 @@
-# $OpenBSD: multiplex.sh,v 1.37 2024/07/19 04:33:36 djm Exp $
+# $OpenBSD: multiplex.sh,v 1.41 2025/12/07 02:59:53 dtucker Exp $
# Placed in the Public Domain.
-make_tmpdir
-CTL=${SSH_REGRESS_TMP}/ctl-sock
-
tid="connection multiplexing"
trace "will use ProxyCommand $proxycmd"
+make_tmpdir
+CTL=${SSH_REGRESS_TMP}/ctl-sock
+
if config_defined DISABLE_FD_PASSING ; then
skip "not supported on this platform (FD passing disabled)"
fi
@@ -24,6 +24,7 @@ wait_for_mux_master_ready()
}
maybe_add_scp_path_to_sshd
+enable_all_kexes_in_sshd
start_sshd
start_mux_master()
@@ -180,6 +181,13 @@ N=$(echo "xyzzy" | $NC -U $OBJ/unix-1.fwd 2>&1 | grep "xyzzy" | wc -l)
test ${N} -eq 0 || fail "remote forward path still listening"
rm -f $OBJ/unix-1.fwd
+verbose "test $tid: cmd conninfo"
+conninfo=`${SSH} -F $OBJ/ssh_config -S $CTL -Oconninfo otherhost` \
+ || fail "request remote forward failed"
+if ! echo "$conninfo" | egrep -- "-> 127.0.0.1:$port" >/dev/null; then
+ fail "conninfo"
+fi
+
verbose "test $tid: cmd exit"
${SSH} -F $OBJ/ssh_config -S $CTL -Oexit otherhost >>$TEST_REGRESS_LOGFILE 2>&1 \
|| fail "send exit command failed"
@@ -188,16 +196,45 @@ ${SSH} -F $OBJ/ssh_config -S $CTL -Oexit otherhost >>$TEST_REGRESS_LOGFILE 2>&1
wait $SSH_PID
kill -0 $SSH_PID >/dev/null 2>&1 && fail "exit command failed"
+# Enable compression and alternative kex for next conninfo test.
+if $SSH -Q compression | grep zlib@openssh.com >/dev/null; then
+ compression=yes
+else
+ compression=no
+fi
+echo compression $compression >>$OBJ/ssh_config
+echo kexalgorithms curve25519-sha256 >>$OBJ/ssh_config
+echo ciphers aes128-ctr >>$OBJ/ssh_config
+
# Restart master and test -O stop command with master using -N
verbose "test $tid: cmd stop"
trace "restart master, fork to background"
start_mux_master
+verbose "test $tid: cmd conninfo algos"
+conninfo=`${SSH} -F $OBJ/ssh_config -S $CTL -Oconninfo otherhost` \
+ || fail "request remote forward failed"
+if echo "$conninfo" | grep "kexalgorithm curve25519-sha256" >/dev/null &&
+ echo "$conninfo" | grep "cipher aes128-ctr" >/dev/null; then
+ trace "ok conninfo algos"
+else
+ fail "conninfo algos"
+fi
+if [ "$compression" = "yes" ]; then
+ verbose "test $tid: cmd conninfo compression"
+ if echo "$conninfo" | grep "compression zlib" >/dev/null &&
+ echo "$conninfo" | grep "compressed" >/dev/null; then
+ trace "ok conninfo compression"
+ else
+ fail "conninfo compression"
+ fi
+fi
+
# start a long-running command then immediately request a stop
${SSH} -F $OBJ/ssh_config -S $CTL otherhost "sleep 10; exit 0" \
>>$TEST_REGRESS_LOGFILE 2>&1 &
SLEEP_PID=$!
-${SSH} -F $OBJ/ssh_config -S $CTL -Ostop otherhost >>$TEST_REGRESS_LOGFILE 2>&1 \
+${SSH} -F$OBJ/ssh_config -S$CTL -Ostop otherhost >>$TEST_REGRESS_LOGFILE 2>&1 \
|| fail "send stop command failed"
# wait until both long-running command and master have exited.
diff --git a/regress/percent.sh b/regress/percent.sh
index c607c8d23aa0..e32a77f0a95b 100644
--- a/regress/percent.sh
+++ b/regress/percent.sh
@@ -1,4 +1,4 @@
-# $OpenBSD: percent.sh,v 1.22 2025/09/04 03:04:44 djm Exp $
+# $OpenBSD: percent.sh,v 1.23 2026/04/02 07:52:15 djm Exp $
# Placed in the Public Domain.
tid="percent expansions"
@@ -140,7 +140,7 @@ done
FOO=bar
export FOO
for i in controlpath identityagent forwardagent localforward remoteforward \
- user setenv userknownhostsfile; do
+ setenv userknownhostsfile; do
verbose $tid $i dollar
trial $i '${FOO}' $FOO
done
@@ -175,7 +175,7 @@ ${SSH} -F $OBJ/ssh_proxy -G "${FOO}@somehost" && fail "user-at expanded env"
# Literal control characters in config is acceptable
verbose $tid user control-literal
-trial user "$FOO" "$FOO"
+#trial user "$FOO" "$FOO"
# Control characters expanded from config aren't.
${SSH} -F $OBJ/ssh_proxy -G '-oUser=${FOO}' somehost && \
diff --git a/regress/proxyjump.sh b/regress/proxyjump.sh
new file mode 100644
index 000000000000..af472e963214
--- /dev/null
+++ b/regress/proxyjump.sh
@@ -0,0 +1,102 @@
+# $OpenBSD: proxyjump.sh,v 1.1 2026/03/30 07:19:02 djm Exp $
+# Placed in the Public Domain.
+
+tid="proxyjump"
+
+# Parsing tests
+verbose "basic parsing"
+for jspec in \
+ "jump1" \
+ "user@jump1" \
+ "jump1:2222" \
+ "user@jump1:2222" \
+ "jump1,jump2" \
+ "user1@jump1:2221,user2@jump2:2222" \
+ "ssh://user@host:2223" \
+ ; do
+ case "$jspec" in
+ "jump1") expected="jump1" ;;
+ "user@jump1") expected="user@jump1" ;;
+ "jump1:2222") expected="jump1:2222" ;;
+ "user@jump1:2222") expected="user@jump1:2222" ;;
+ "jump1,jump2") expected="jump1,jump2" ;;
+ "user1@jump1:2221,user2@jump2:2222")
+ expected="user1@jump1:2221,user2@jump2:2222" ;;
+ "ssh://user@host:2223") expected="user@host:2223" ;;
+ esac
+ f=`${SSH} -GF /dev/null -oProxyJump="$jspec" somehost | \
+ awk '/^proxyjump /{print $2}'`
+ if [ "$f" != "$expected" ]; then
+ fail "ProxyJump $jspec: expected $expected, got $f"
+ fi
+ f=`${SSH} -GF /dev/null -J "$jspec" somehost | \
+ awk '/^proxyjump /{print $2}'`
+ if [ "$f" != "$expected" ]; then
+ fail "ssh -J $jspec: expected $expected, got $f"
+ fi
+done
+
+verbose "precedence"
+f=`${SSH} -GF /dev/null -oProxyJump=none -oProxyJump=jump1 somehost | \
+ grep "^proxyjump "`
+if [ -n "$f" ]; then
+ fail "ProxyJump=none first did not win"
+fi
+f=`${SSH} -GF /dev/null -oProxyJump=jump -oProxyCommand=foo somehost | \
+ grep "^proxyjump "`
+if [ "$f" != "proxyjump jump" ]; then
+ fail "ProxyJump first did not win over ProxyCommand"
+fi
+f=`${SSH} -GF /dev/null -oProxyCommand=foo -oProxyJump=jump somehost | \
+ grep "^proxycommand "`
+if [ "$f" != "proxycommand foo" ]; then
+ fail "ProxyCommand first did not win over ProxyJump"
+fi
+
+verbose "command-line -J invalid characters"
+cp $OBJ/ssh_config $OBJ/ssh_config.orig
+for jspec in \
+ "host;with;semicolon" \
+ "host'with'quote" \
+ "host\`with\`backtick" \
+ "host\$with\$dollar" \
+ "host(with)brace" \
+ "user;with;semicolon@host" \
+ "user'with'quote@host" \
+ "user\`with\`backtick@host" \
+ "user(with)brace@host" ; do
+ ${SSH} -GF /dev/null -J "$jspec" somehost >/dev/null 2>&1
+ if [ $? -ne 255 ]; then
+ fail "ssh -J \"$jspec\" was not rejected"
+ fi
+ ${SSH} -GF /dev/null -oProxyJump="$jspec" somehost >/dev/null 2>&1
+ if [ $? -ne 255 ]; then
+ fail "ssh -oProxyJump=\"$jspec\" was not rejected"
+ fi
+done
+# Special characters should be accepted in the config though.
+echo "ProxyJump user;with;semicolon@host;with;semicolon" >> $OBJ/ssh_config
+f=`${SSH} -GF $OBJ/ssh_config somehost | grep "^proxyjump "`
+if [ "$f" != "proxyjump user;with;semicolon@host;with;semicolon" ]; then
+ fail "ProxyJump did not allow special characters in config: $f"
+fi
+
+verbose "functional test"
+# Use different names to avoid the loop detection in ssh.c
+grep -iv HostKeyAlias $OBJ/ssh_config.orig > $OBJ/ssh_config
+cat << _EOF >> $OBJ/ssh_config
+Host jump-host
+ HostkeyAlias jump-host
+Host target-host
+ HostkeyAlias target-host
+_EOF
+cp $OBJ/known_hosts $OBJ/known_hosts.orig
+sed 's/^[^ ]* /jump-host /' < $OBJ/known_hosts.orig > $OBJ/known_hosts
+sed 's/^[^ ]* /target-host /' < $OBJ/known_hosts.orig >> $OBJ/known_hosts
+start_sshd
+
+verbose "functional ProxyJump"
+res=`${REAL_SSH} -F $OBJ/ssh_config -J jump-host target-host echo "SUCCESS" 2>/dev/null`
+if [ "$res" != "SUCCESS" ]; then
+ fail "functional test failed: expected SUCCESS, got $res"
+fi
diff --git a/regress/scp.sh b/regress/scp.sh
index 640cf434ff67..98f45129b9fe 100644
--- a/regress/scp.sh
+++ b/regress/scp.sh
@@ -1,4 +1,4 @@
-# $OpenBSD: scp.sh,v 1.19 2023/09/08 05:50:57 djm Exp $
+# $OpenBSD: scp.sh,v 1.20 2025/10/13 00:55:09 djm Exp $
# Placed in the Public Domain.
tid="scp"
@@ -199,6 +199,19 @@ for mode in scp sftp ; do
echo b > ${COPY2}
$SCP $scpopts ${DATA} ${COPY} ${COPY2}
cmp ${COPY} ${COPY2} >/dev/null && fail "corrupt target"
+
+ # scp /blah/.. is only supported via the sftp protocol.
+ # Original protocol scp just refuses it.
+ test $mode != sftp && continue
+ verbose "$tag: recursive local .. to remote dir"
+ forest
+ $SCP $scpopts -r ${DIR}/subdir/.. somehost:${DIR2} || fail "copy failed"
+ diff ${DIFFOPT} ${DIR} ${DIR2} || fail "corrupted copy"
+
+ verbose "$tag: recursive remote .. to local dir"
+ forest
+ $SCP $scpopts -r somehost:${DIR}/subdir/.. ${DIR2} || fail "copy failed"
+ diff ${DIFFOPT} ${DIR} ${DIR2} || fail "corrupted copy"
done
scpclean
diff --git a/regress/scp3.sh b/regress/scp3.sh
index eeb7a9dde475..d42abc2dc824 100644
--- a/regress/scp3.sh
+++ b/regress/scp3.sh
@@ -1,4 +1,4 @@
-# $OpenBSD: scp3.sh,v 1.5 2023/09/08 06:10:57 djm Exp $
+# $OpenBSD: scp3.sh,v 1.6 2025/10/13 00:56:15 djm Exp $
# Placed in the Public Domain.
tid="scp3"
@@ -6,6 +6,12 @@ tid="scp3"
COPY2=${OBJ}/copy2
DIR=${COPY}.dd
DIR2=${COPY}.dd2
+DIFFOPT="-rN"
+
+# Figure out if diff does not understand "-N"
+if ! diff -N ${SRC}/scp.sh ${SRC}/scp.sh 2>/dev/null; then
+ DIFFOPT="-r"
+fi
maybe_add_scp_path_to_sshd
@@ -63,6 +69,15 @@ for mode in scp sftp ; do
echo b > ${COPY2}
$SCP $scpopts -3 hostA:${DATA} hostA:${COPY} hostB:${COPY2}
cmp ${COPY} ${COPY2} >/dev/null && fail "corrupt target"
+
+ # scp /blah/.. is only supported via the sftp protocol.
+ # Original protocol scp just refuses it.
+ test $mode != sftp && continue
+ verbose "$tag: recursive .."
+ forest
+ $SCP $scpopts -r hostA:${DIR}/subdir/.. hostB:${DIR2} || \
+ fail "copy failed"
+ diff ${DIFFOPT} ${DIR} ${DIR2} || fail "corrupted copy"
done
scpclean
diff --git a/regress/sftp-cmds.sh b/regress/sftp-cmds.sh
index 56404713a9fd..a03959d60def 100644
--- a/regress/sftp-cmds.sh
+++ b/regress/sftp-cmds.sh
@@ -1,4 +1,4 @@
-# $OpenBSD: sftp-cmds.sh,v 1.20 2024/07/01 03:10:19 djm Exp $
+# $OpenBSD: sftp-cmds.sh,v 1.23 2025/10/13 00:55:45 djm Exp $
# Placed in the Public Domain.
# XXX - TODO:
@@ -7,6 +7,12 @@
tid="sftp commands"
+DIFFOPT="-rN"
+# Figure out if diff does not understand "-N"
+if ! diff -N ${SRC}/sftp-cmds.sh ${SRC}/sftp-cmds.sh 2>/dev/null; then
+ DIFFOPT="-r"
+fi
+
# test that these files are readable!
for i in `(cd /bin;echo l*)`
do
@@ -24,207 +30,246 @@ SPACECOPY_ARG="${COPY}\ this\ has\ spaces.txt"
# File with glob metacharacters
GLOBMETACOPY="${COPY} [metachar].txt"
+sftpserver() {
+ ${SFTP} -D ${SFTPSERVER} >/dev/null 2>&1
+}
+
+sftpserver_with_stdout() {
+ ${SFTP} -D ${SFTPSERVER} 2>&1
+}
+
+forest() {
+ rm -rf ${COPY}.dd/*
+ rm -rf ${COPY}.dd2
+ mkdir -p ${COPY}.dd/a ${COPY}.dd/b ${COPY}.dd/c ${COPY}.dd/a/d
+ echo 'A' > ${COPY}.dd/a/A
+ echo 'B' > ${COPY}.dd/a/B
+ echo 'C' > ${COPY}.dd/a/C
+ echo 'D' > ${COPY}.dd/a/D
+}
+
rm -rf ${COPY} ${COPY}.1 ${COPY}.2 ${COPY}.dd ${COPY}.dd2
mkdir ${COPY}.dd
verbose "$tid: lls"
-printf "lcd ${OBJ}\nlls\n" | ${SFTP} -D ${SFTPSERVER} 2>&1 | \
+printf "lcd ${OBJ}\nlls\n" | sftpserver_with_stdout | \
grep copy.dd >/dev/null || fail "lls failed"
verbose "$tid: lls w/path"
-echo "lls ${OBJ}" | ${SFTP} -D ${SFTPSERVER} 2>&1 | \
+echo "lls ${OBJ}" | sftpserver_with_stdout | \
grep copy.dd >/dev/null || fail "lls w/path failed"
verbose "$tid: ls"
-echo "ls ${OBJ}" | ${SFTP} -D ${SFTPSERVER} >/dev/null 2>&1 \
- || fail "ls failed"
+echo "ls ${OBJ}" | sftpserver || fail "ls failed"
# XXX always successful
verbose "$tid: shell"
-echo "!echo hi there" | ${SFTP} -D ${SFTPSERVER} 2>&1 | \
+echo "!echo hi there" | sftpserver_with_stdout | \
egrep '^hi there$' >/dev/null || fail "shell failed"
verbose "$tid: pwd"
-echo "pwd" | ${SFTP} -D ${SFTPSERVER} >/dev/null 2>&1 \
- || fail "pwd failed"
+echo "pwd" | sftpserver || fail "pwd failed"
# XXX always successful
verbose "$tid: lpwd"
-echo "lpwd" | ${SFTP} -D ${SFTPSERVER} >/dev/null 2>&1 \
- || fail "lpwd failed"
+echo "lpwd" | sftpserver || fail "lpwd failed"
# XXX always successful
verbose "$tid: quit"
-echo "quit" | ${SFTP} -D ${SFTPSERVER} >/dev/null 2>&1 \
- || fail "quit failed"
+echo "quit" | sftpserver || fail "quit failed"
# XXX always successful
verbose "$tid: help"
-echo "help" | ${SFTP} -D ${SFTPSERVER} >/dev/null 2>&1 \
- || fail "help failed"
+echo "help" | sftpserver || fail "help failed"
# XXX always successful
rm -f ${COPY}
verbose "$tid: get"
-echo "get $DATA $COPY" | ${SFTP} -D ${SFTPSERVER} >/dev/null 2>&1 \
- || fail "get failed"
+echo "get $DATA $COPY" | sftpserver || fail "get failed"
cmp $DATA ${COPY} || fail "corrupted copy after get"
rm -f ${COPY}
verbose "$tid: get quoted"
-echo "get \"$DATA\" $COPY" | ${SFTP} -D ${SFTPSERVER} >/dev/null 2>&1 \
- || fail "get failed"
+echo "get \"$DATA\" $COPY" | sftpserver || fail "get failed"
cmp $DATA ${COPY} || fail "corrupted copy after get"
rm -f ${QUOTECOPY}
cp $DATA ${QUOTECOPY}
verbose "$tid: get filename with quotes"
-echo "get \"$QUOTECOPY_ARG\" ${COPY}" | ${SFTP} -D ${SFTPSERVER} >/dev/null 2>&1 \
- || fail "get failed"
+echo "get \"$QUOTECOPY_ARG\" ${COPY}" | sftpserver || fail "get failed"
cmp ${COPY} ${QUOTECOPY} || fail "corrupted copy after get with quotes"
rm -f ${QUOTECOPY} ${COPY}
rm -f "$SPACECOPY" ${COPY}
cp $DATA "$SPACECOPY"
verbose "$tid: get filename with spaces"
-echo "get ${SPACECOPY_ARG} ${COPY}" | ${SFTP} -D ${SFTPSERVER} >/dev/null 2>&1 \
- || fail "get failed"
+echo "get ${SPACECOPY_ARG} ${COPY}" | sftpserver || fail "get failed"
cmp ${COPY} "$SPACECOPY" || fail "corrupted copy after get with spaces"
rm -f "$GLOBMETACOPY" ${COPY}
cp $DATA "$GLOBMETACOPY"
verbose "$tid: get filename with glob metacharacters"
-echo "get \"${GLOBMETACOPY}\" ${COPY}" | \
- ${SFTP} -D ${SFTPSERVER} >/dev/null 2>&1 || fail "get failed"
+echo "get \"${GLOBMETACOPY}\" ${COPY}" | sftpserver || fail "get failed"
cmp ${COPY} "$GLOBMETACOPY" || \
fail "corrupted copy after get with glob metacharacters"
-rm -f ${COPY}.dd/*
+rm -rf ${COPY}.dd/*
verbose "$tid: get to directory"
-echo "get $DATA ${COPY}.dd" | ${SFTP} -D ${SFTPSERVER} >/dev/null 2>&1 \
- || fail "get failed"
+echo "get $DATA ${COPY}.dd" | sftpserver || fail "get failed"
cmp $DATA ${COPY}.dd/${DATANAME} || fail "corrupted copy after get"
-rm -f ${COPY}.dd/*
+rm -rf ${COPY}.dd/*
verbose "$tid: glob get to directory"
-echo "get /bin/l* ${COPY}.dd" | ${SFTP} -D ${SFTPSERVER} >/dev/null 2>&1 \
- || fail "get failed"
+echo "get /bin/l* ${COPY}.dd" | sftpserver || fail "get failed"
for x in $GLOBFILES; do
cmp /bin/$x ${COPY}.dd/$x || fail "corrupted copy after get"
done
-rm -f ${COPY}.dd/*
+rm -rf ${COPY}.dd/*
verbose "$tid: get to local dir"
-printf "lcd ${COPY}.dd\nget $DATA\n" | ${SFTP} -D ${SFTPSERVER} >/dev/null 2>&1 \
- || fail "get failed"
+printf "lcd ${COPY}.dd\nget $DATA\n" | sftpserver || fail "get failed"
cmp $DATA ${COPY}.dd/${DATANAME} || fail "corrupted copy after get"
-rm -f ${COPY}.dd/*
+rm -rf ${COPY}.dd/*
verbose "$tid: glob get to local dir"
-printf "lcd ${COPY}.dd\nget /bin/l*\n" | ${SFTP} -D ${SFTPSERVER} >/dev/null 2>&1 \
- || fail "get failed"
+printf "lcd ${COPY}.dd\nget /bin/l*\n" | sftpserver || fail "get failed"
for x in $GLOBFILES; do
cmp /bin/$x ${COPY}.dd/$x || fail "corrupted copy after get"
done
+forest
+verbose "$tid: get recursive absolute"
+echo "get -R ${COPY}.dd ${COPY}.dd2" | sftpserver || fail "get failed"
+diff ${DIFFOPT} ${COPY}.dd ${COPY}.dd2 || fail "corrupted copy"
+
+forest
+verbose "$tid: get recursive relative src"
+printf "cd ${COPY}.dd\n get -R . ${COPY}.dd2\n" | sftpserver || \
+ fail "get failed"
+diff ${DIFFOPT} ${COPY}.dd ${COPY}.dd2 || fail "corrupted copy"
+
+forest
+verbose "$tid: get relative .."
+printf "cd ${COPY}.dd/b\n get -R .. ${COPY}.dd2\n" | sftpserver || \
+ fail "get failed"
+diff ${DIFFOPT} ${COPY}.dd ${COPY}.dd2 || fail "corrupted copy"
+
+forest
+mkdir ${COPY}.dd2
+verbose "$tid: get recursive relative .."
+printf "cd ${COPY}.dd/b\n lcd ${COPY}.dd2\n get -R ..\n" | sftpserver || \
+ fail "get failed"
+diff ${DIFFOPT} ${COPY}.dd ${COPY}.dd2 || fail "corrupted copy"
+
rm -f ${COPY}
verbose "$tid: put"
-echo "put $DATA $COPY" | \
- ${SFTP} -D ${SFTPSERVER} >/dev/null 2>&1 || fail "put failed"
+echo "put $DATA $COPY" | sftpserver || fail "put failed"
cmp $DATA ${COPY} || fail "corrupted copy after put"
rm -f ${QUOTECOPY}
verbose "$tid: put filename with quotes"
-echo "put $DATA \"$QUOTECOPY_ARG\"" | \
- ${SFTP} -D ${SFTPSERVER} >/dev/null 2>&1 || fail "put failed"
+echo "put $DATA \"$QUOTECOPY_ARG\"" | sftpserver || fail "put failed"
cmp $DATA ${QUOTECOPY} || fail "corrupted copy after put with quotes"
rm -f "$SPACECOPY"
verbose "$tid: put filename with spaces"
-echo "put $DATA ${SPACECOPY_ARG}" | \
- ${SFTP} -D ${SFTPSERVER} >/dev/null 2>&1 || fail "put failed"
+echo "put $DATA ${SPACECOPY_ARG}" | sftpserver || fail "put failed"
cmp $DATA "$SPACECOPY" || fail "corrupted copy after put with spaces"
-rm -f ${COPY}.dd/*
+rm -rf ${COPY}.dd/*
verbose "$tid: put to directory"
-echo "put $DATA ${COPY}.dd" | ${SFTP} -D ${SFTPSERVER} >/dev/null 2>&1 \
- || fail "put failed"
+echo "put $DATA ${COPY}.dd" | sftpserver || fail "put failed"
cmp $DATA ${COPY}.dd/${DATANAME} || fail "corrupted copy after put"
-rm -f ${COPY}.dd/*
+rm -rf ${COPY}.dd/*
verbose "$tid: glob put to directory"
-echo "put /bin/l? ${COPY}.dd" | ${SFTP} -D ${SFTPSERVER} >/dev/null 2>&1 \
- || fail "put failed"
+echo "put /bin/l? ${COPY}.dd" | sftpserver || fail "put failed"
for x in $GLOBFILES; do
cmp /bin/$x ${COPY}.dd/$x || fail "corrupted copy after put"
done
-rm -f ${COPY}.dd/*
+rm -rf ${COPY}.dd/*
verbose "$tid: put to local dir"
-printf "cd ${COPY}.dd\nput $DATA\n" | ${SFTP} -D ${SFTPSERVER} >/dev/null 2>&1 \
- || fail "put failed"
+printf "cd ${COPY}.dd\nput $DATA\n" | sftpserver || fail "put failed"
cmp $DATA ${COPY}.dd/${DATANAME} || fail "corrupted copy after put"
-rm -f ${COPY}.dd/*
+rm -rf ${COPY}.dd/*
verbose "$tid: glob put to local dir"
-printf "cd ${COPY}.dd\nput /bin/l*\n" | ${SFTP} -D ${SFTPSERVER} >/dev/null 2>&1 \
- || fail "put failed"
+printf "cd ${COPY}.dd\nput /bin/l*\n" | sftpserver || fail "put failed"
for x in $GLOBFILES; do
cmp /bin/$x ${COPY}.dd/$x || fail "corrupted copy after put"
done
+forest
+verbose "$tid: put recursive absolute"
+echo "put -R ${COPY}.dd ${COPY}.dd2" | sftpserver || fail "put failed"
+diff ${DIFFOPT} ${COPY}.dd ${COPY}.dd2 || fail "corrupted copy"
+
+forest
+verbose "$tid: put recursive relative src"
+printf "lcd ${COPY}.dd\n put -R . ${COPY}.dd2\n" | sftpserver || \
+ fail "put failed"
+diff ${DIFFOPT} ${COPY}.dd ${COPY}.dd2 || fail "corrupted copy"
+
+forest
+verbose "$tid: put recursive .."
+printf "lcd ${COPY}.dd/b\n put -R .. ${COPY}.dd2\n" | sftpserver || \
+ fail "put failed"
+diff ${DIFFOPT} ${COPY}.dd ${COPY}.dd2 || fail "corrupted copy"
+
+forest
+mkdir ${COPY}.dd2
+verbose "$tid: put recursive .. relative"
+printf "lcd ${COPY}.dd/b\n cd ${COPY}.dd2\n put -R ..\n" | sftpserver || \
+ fail "put failed"
+diff ${DIFFOPT} ${COPY}.dd ${COPY}.dd2 || fail "corrupted copy"
+
verbose "$tid: rename"
-echo "rename $COPY ${COPY}.1" | ${SFTP} -D ${SFTPSERVER} >/dev/null 2>&1 \
- || fail "rename failed"
+echo "rename $COPY ${COPY}.1" | sftpserver || fail "rename failed"
test -f ${COPY}.1 || fail "missing file after rename"
cmp $DATA ${COPY}.1 >/dev/null 2>&1 || fail "corrupted copy after rename"
verbose "$tid: rename directory"
-echo "rename ${COPY}.dd ${COPY}.dd2" | \
- ${SFTP} -D ${SFTPSERVER} >/dev/null 2>&1 || \
+rm -rf ${COPY}.dd2
+echo "rename ${COPY}.dd ${COPY}.dd2" | sftpserver || \
fail "rename directory failed"
test -d ${COPY}.dd && fail "oldname exists after rename directory"
test -d ${COPY}.dd2 || fail "missing newname after rename directory"
verbose "$tid: ln"
-echo "ln ${COPY}.1 ${COPY}.2" | ${SFTP} -D ${SFTPSERVER} >/dev/null 2>&1 || fail "ln failed"
+echo "ln ${COPY}.1 ${COPY}.2" | sftpserver || fail "ln failed"
test -f ${COPY}.2 || fail "missing file after ln"
cmp ${COPY}.1 ${COPY}.2 || fail "created file is not equal after ln"
verbose "$tid: ln -s"
rm -f ${COPY}.2
-echo "ln -s ${COPY}.1 ${COPY}.2" | ${SFTP} -D ${SFTPSERVER} >/dev/null 2>&1 || fail "ln -s failed"
+echo "ln -s ${COPY}.1 ${COPY}.2" | sftpserver || fail "ln -s failed"
test -h ${COPY}.2 || fail "missing file after ln -s"
verbose "$tid: cp"
rm -f ${COPY}.2
-echo "cp ${COPY}.1 ${COPY}.2" | ${SFTP} -D ${SFTPSERVER} >/dev/null 2>&1 || fail "cp failed"
+echo "cp ${COPY}.1 ${COPY}.2" | sftpserver || fail "cp failed"
cmp ${COPY}.1 ${COPY}.2 || fail "created file is not equal after cp"
verbose "$tid: mkdir"
-echo "mkdir ${COPY}.dd" | ${SFTP} -D ${SFTPSERVER} >/dev/null 2>&1 \
- || fail "mkdir failed"
+echo "mkdir ${COPY}.dd" | sftpserver || fail "mkdir failed"
test -d ${COPY}.dd || fail "missing directory after mkdir"
# XXX do more here
verbose "$tid: chdir"
-echo "chdir ${COPY}.dd" | ${SFTP} -D ${SFTPSERVER} >/dev/null 2>&1 \
- || fail "chdir failed"
+echo "chdir ${COPY}.dd" | sftpserver || fail "chdir failed"
verbose "$tid: rmdir"
-echo "rmdir ${COPY}.dd" | ${SFTP} -D ${SFTPSERVER} >/dev/null 2>&1 \
- || fail "rmdir failed"
+echo "rmdir ${COPY}.dd" | sftpserver || fail "rmdir failed"
test -d ${COPY}.1 && fail "present directory after rmdir"
verbose "$tid: lmkdir"
-echo "lmkdir ${COPY}.dd" | ${SFTP} -D ${SFTPSERVER} >/dev/null 2>&1 \
- || fail "lmkdir failed"
+echo "lmkdir ${COPY}.dd" | sftpserver || fail "lmkdir failed"
test -d ${COPY}.dd || fail "missing directory after lmkdir"
# XXX do more here
verbose "$tid: lchdir"
-echo "lchdir ${COPY}.dd" | ${SFTP} -D ${SFTPSERVER} >/dev/null 2>&1 \
- || fail "lchdir failed"
+echo "lchdir ${COPY}.dd" | sftpserver || fail "lchdir failed"
rm -rf ${COPY} ${COPY}.1 ${COPY}.2 ${COPY}.dd ${COPY}.dd2
rm -rf ${QUOTECOPY} "$SPACECOPY" "$GLOBMETACOPY"
diff --git a/regress/sftp-resume.sh b/regress/sftp-resume.sh
index f4fe8f9281dc..4ab0f1d68ef6 100644
--- a/regress/sftp-resume.sh
+++ b/regress/sftp-resume.sh
@@ -10,7 +10,7 @@ increase_datafile_size 1200
for cmd in put get; do
verbose "$tid: ${cmd}"
- for size in 0 1 1k 1m size-1 same; do
+ for size in 0 1 1k 1024k size-1 same; do
trace "$tid: test ${cmd} ${size}"
rm -rf ${COPY}.1 ${COPY}.2
cp ${DATA} ${COPY}.1
@@ -24,8 +24,6 @@ for cmd in put get; do
;;
same) cp ${DATA} ${COPY}.2
;;
- 1m) dd if=${COPY}.1 of=${COPY}.2 bs=1k count=1k >/dev/null 2<&1
- ;;
*) dd if=${COPY}.1 of=${COPY}.2 bs=${size} count=1 >/dev/null 2>&1
;;
esac
diff --git a/regress/ssh-pkcs11.sh b/regress/ssh-pkcs11.sh
new file mode 100644
index 000000000000..96680fca9f74
--- /dev/null
+++ b/regress/ssh-pkcs11.sh
@@ -0,0 +1,40 @@
+# $OpenBSD: ssh-pkcs11.sh,v 1.1 2025/10/16 00:01:54 djm Exp $
+# Placed in the Public Domain.
+
+tid="pkcs11 ssh test"
+
+p11_setup || skip "No PKCS#11 library found"
+
+grep -iv IdentityFile $OBJ/ssh_proxy |
+ grep -vi BatchMode > $OBJ/ssh_proxy.orig
+#echo "IdentitiesOnly=yes" >> $OBJ/ssh_proxy.orig
+echo "PKCS11Provider=${TEST_SSH_PKCS11}" >> $OBJ/ssh_proxy.orig
+
+check_all() {
+ tag="$1"
+ expect_success=$2
+ pinsh="$3"
+ for k in $ED25519 $RSA $EC; do
+ kshort=`basename "$k"`
+ verbose "$tag: $kshort"
+ pub="$k.pub"
+ cp $pub $OBJ/key.pub
+ chmod 0600 $OBJ/key.pub
+ cat $OBJ/key.pub > $OBJ/authorized_keys_$USER
+ cp $OBJ/ssh_proxy.orig $OBJ/ssh_proxy
+ env SSH_ASKPASS="$pinsh" SSH_ASKPASS_REQUIRE=force \
+ ${SSH} -F $OBJ/ssh_proxy somehost exit 5 >/dev/null 2>&1
+ r=$?
+ if [ "x$expect_success" = "xy" ]; then
+ if [ $r -ne 5 ]; then
+ fail "ssh connect failed (exit code $r)"
+ fi
+ elif [ $r -eq 5 ]; then
+ fail "ssh connect succeeded unexpectedly (exit code $r)"
+ fi
+ done
+}
+
+check_all "correct pin" y $PIN_SH
+check_all "wrong pin" n $WRONGPIN_SH
+check_all "nopin" n `which true`
diff --git a/regress/ssh-tty.sh b/regress/ssh-tty.sh
new file mode 100644
index 000000000000..07053d13be64
--- /dev/null
+++ b/regress/ssh-tty.sh
@@ -0,0 +1,179 @@
+# $OpenBSD: ssh-tty.sh,v 1.8 2025/10/23 06:15:26 dtucker Exp $
+# Placed in the Public Domain.
+
+# Basic TTY smoke test
+
+tid="ssh-tty"
+
+# Fake home directory to avoid user shell configuration.
+FAKEHOME="$OBJ/.fakehome"
+rm -rf "$FAKEHOME"
+mkdir -m 0700 -p "$FAKEHOME"
+
+case "${PATH}${HOME}" in
+*\ *|*\t*) skip "\$PATH or \$HOME has whitespace, not supported in this test";;
+esac
+
+# tmux stuff
+TMUX=${TMUX:-tmux}
+type $TMUX >/dev/null || skip "tmux not found"
+
+if $TMUX -V >/dev/null 2>&1; then
+ tver="`$TMUX -V 2>&1`"
+ echo "tmux version $tver"
+else
+ skip "tmux version not reported"
+fi
+
+CLEANENV="env -i HOME=$HOME LOGNAME=$USER USER=$USER PATH=$PATH SHELL=$SHELL"
+TMUX_TEST="$CLEANENV $TMUX -f/dev/null -Lopenssh-regress-ssh-tty"
+sess="regress-ssh-tty$$"
+
+# Multiplexing control socket.
+CTL=$OBJ/ctl-sock
+
+# Some randomish strings used for signalling back and forth.
+# We use the octal variants via printf(1).
+MAGIC1="XY23zzY"
+MAGIC1_OCTAL="\130\131\062\063\172\172\131"
+MAGIC2="99sMarT86"
+MAGIC2_OCTAL="\071\071\163\115\141\162\124\070\066"
+MAGIC3="woLF1701d"
+MAGIC3_OCTAL="\167\157\114\106\061\067\060\061\144"
+MAGIC4="lUh4thX4evR"
+MAGIC4_OCTAL="\154\125\150\064\164\150\130\064\145\166\122"
+MAGIC5="AllMo1000x"
+MAGIC5_OCTAL="\101\154\154\115\157\061\060\060\060\170"
+
+# Wait for a mux process to become ready.
+wait_for_mux_ready()
+{
+ for i in 1 2 3 4 5 6 7 8 9; do
+ ${SSH} -F $OBJ/ssh_config -S $CTL -Ocheck otherhost \
+ >/dev/null 2>&1 && return 0
+ sleep $i
+ done
+ fatal "mux never becomes ready"
+}
+
+# Wait for a mux process to have finished.
+wait_for_mux_done()
+{
+ for i in 1 2 3 4 5 6 7 8 9; do
+ test -S $CTL || return 0
+ sleep $i
+ done
+ fatal "mux socket never removed"
+}
+
+# Wait for a regex to appear in terminal output.
+wait_for_regex() {
+ string="$1"
+ errors_are_fatal="$2"
+ for x in 1 2 3 4 5 6 7 8 9 10 ; do
+ $TMUX_TEST capture-pane -pt $sess | grep "$string" >/dev/null
+ [ $? -eq 0 ] && return
+ sleep 1
+ done
+ if test -z "$errors_are_fatal"; then
+ fail "failed to match \"$string\" in terminal output"
+ return
+ fi
+ fatal "failed to match \"$string\" in terminal output"
+}
+
+# Check that a regex does *not* appear in terminal output
+not_in_term() {
+ string="$1"
+ error="$2"
+ errors_are_fatal="$3"
+ $TMUX_TEST capture-pane -pt $sess | grep "$string" > /dev/null
+ [ $? -ne 0 ] && return
+ if test -z "$errors_are_fatal"; then
+ fail "$error"
+ return
+ fi
+ fatal "$error"
+}
+
+# Shut down tmux session and Wait for it to terminate.
+kill_tmux() {
+ $TMUX_TEST kill-session -t $sess 2>/dev/null
+ for x in 1 2 3 4 5 6 7 8 9 10; do
+ $TMUX_TEST has-session -t $sess >/dev/null 2>&1 || return
+ sleep 1
+ done
+ fatal "tmux session didn't terminate"
+}
+
+trap "$TMUX_TEST kill-session -t $sess 2>/dev/null" EXIT
+
+run_test() {
+ tag="$1"
+ ssh_args="$2"
+ # Prepare a tmux session.
+ kill_tmux
+ $TMUX_TEST new-session -d -s $sess
+ # echo XXXXXXXXXX $TMUX_TEST attach -t $sess; sleep 10
+
+ # Command to start SSH; sent as keystrokes to tmux session.
+ RCMD="$CLEANENV $SHELL"
+ CMD="$SSH -F $OBJ/ssh_proxy $ssh_args -S $CTL x -tt $RCMD"
+
+ verbose "${tag}: start connection"
+ # arrange for the shell to print something after ssh completes.
+ $TMUX_TEST send-keys -t $sess "$CMD && printf '$MAGIC1_OCTAL\n'" ENTER
+ wait_for_mux_ready
+
+ verbose "${tag}: send string"
+ $TMUX_TEST send-keys -t $sess "printf '$MAGIC2_OCTAL\n'" ENTER
+ wait_for_regex "$MAGIC2"
+
+ verbose "${tag}: ^c interrupts process"
+ # ^c should interrupt the sleep and prevent the magic string
+ # from appearing.
+ $TMUX_TEST send-keys -t $sess \
+ "printf '$MAGIC3_OCTAL' ; sleep 30 || printf '$MAGIC4_OCTAL\n'"
+ $TMUX_TEST send-keys -t $sess ENTER
+ wait_for_regex "$MAGIC3" # Command has executed.
+ $TMUX_TEST send-keys -t $sess "C-c"
+ # send another string to let us know that the sleep has finished.
+ $TMUX_TEST send-keys -t $sess "printf '$MAGIC5_OCTAL\n'" ENTER
+ wait_for_regex "$MAGIC5"
+ not_in_term "$MAGIC4" "^c did not interrupt"
+
+ verbose "${tag}: ~? produces help"
+ $TMUX_TEST send-keys -t $sess ENTER "~?"
+ wait_for_regex "^Supported escape sequences:$"
+
+ verbose "${tag}: ~. terminates session"
+ $TMUX_TEST send-keys -t $sess ENTER "~."
+ wait_for_mux_done
+ not_in_term "$MAGIC1" "ssh unexpectedly exited successfully after ~."
+
+ verbose "${tag}: restart session"
+ $TMUX_TEST send-keys -t $sess "$CMD && printf '$MAGIC1_OCTAL\n'" ENTER
+ wait_for_mux_ready
+
+ verbose "${tag}: eof terminates session successfully"
+ $TMUX_TEST send-keys -t $sess ENTER "C-d"
+ wait_for_regex "$MAGIC1"
+}
+
+# Make sure tmux is working as expected before we start.
+kill_tmux
+$TMUX_TEST new-session -d -s $sess
+# Make sure the session doesn't contain the magic strings we will use
+# for signalling or any #? output.
+not_in_term "$MAGIC1" "terminal already contains magic1 string" fatal
+not_in_term "$MAGIC2" "terminal already contains magic2 string" fatal
+not_in_term "$MAGIC3" "terminal already contains magic3 string" fatal
+not_in_term "$MAGIC4" "terminal already contains magic4 string" fatal
+not_in_term "$MAGIC5" "terminal already contains magic5 string" fatal
+not_in_term "^Supported escape" "terminal already contains escape help" fatal
+$TMUX_TEST send-keys -t $sess "printf '$MAGIC1_OCTAL\n'" ENTER
+wait_for_regex "$MAGIC1" fatal
+kill_tmux
+
+run_test "basic" "-oControlMaster=yes"
+run_test "ControlPersist" "-oControlMaster=auto -oControlPersist=1s"
diff --git a/regress/test-exec.sh b/regress/test-exec.sh
index 34fb58fda0f8..577bc01afa1c 100644
--- a/regress/test-exec.sh
+++ b/regress/test-exec.sh
@@ -1,4 +1,4 @@
-# $OpenBSD: test-exec.sh,v 1.131 2025/07/26 01:53:31 djm Exp $
+# $OpenBSD: test-exec.sh,v 1.139 2025/12/22 01:31:07 djm Exp $
# Placed in the Public Domain.
#SUDO=sudo
@@ -168,6 +168,9 @@ fi
if [ "x$TEST_SSH_DROPBEARCONVERT" != "x" ]; then
DROPBEARCONVERT="${TEST_SSH_DROPBEARCONVERT}"
fi
+if [ "x$TEST_SSH_TMUX" != "x" ]; then
+ TMUX="${TEST_SSH_TMUX}"
+fi
if [ "x$TEST_SSH_PKCS11_HELPER" != "x" ]; then
SSH_PKCS11_HELPER="${TEST_SSH_PKCS11_HELPER}"
fi
@@ -531,11 +534,12 @@ save_debug_log ()
for logfile in $TEST_SSH_LOGDIR $TEST_REGRESS_LOGFILE \
$TEST_SSH_LOGFILE $TEST_SSHD_LOGFILE; do
- if [ ! -z "$SUDO" ] && [ -e "$logfile" ]; then
+ if [ ! -z "$SUDO" ]; then
+ touch $logfile
$SUDO chown -R $USER $logfile
+ $SUDO chmod ug+rw $logfile
fi
done
- test -z "$SUDO" || $SUDO chmod ug+rw $TEST_SSHD_LOGFILE
echo $@ >>$TEST_REGRESS_LOGFILE
echo $@ >>$TEST_SSH_LOGFILE
echo $@ >>$TEST_SSHD_LOGFILE
@@ -718,9 +722,9 @@ export EXTRA_AGENT_ARGS
maybe_filter_sk() {
if test -z "$SSH_SK_PROVIDER" ; then
- grep -v ^sk
+ grep -v ^sk | grep -v ^webauthn
else
- cat
+ grep -v ^webauthn
fi
}
@@ -906,6 +910,12 @@ start_sshd ()
test -f $PIDFILE || fatal "no sshd running on port $PORT"
}
+enable_all_kexes_in_sshd ()
+{
+ kexs=`$SSH -Q KexAlgorithms | (tr '\n' ,; echo) | sed 's/,$//'`
+ echo KexAlgorithms $kexs >>$OBJ/sshd_config
+}
+
# Find a PKCS#11 library.
p11_find_lib() {
TEST_SSH_PKCS11=""
@@ -922,6 +932,9 @@ p11_find_lib() {
PKCS11_OK=
export PKCS11_OK
p11_setup() {
+ # XXX we could potentially test ed25519 only in the absence of
+ # RSA and ECDSA support.
+ $SSH -Q key | grep ssh-rsa >/dev/null || return 1
p11_find_lib \
/usr/local/lib/softhsm/libsofthsm2.so \
/usr/lib64/pkcs11/libsofthsm2.so \
@@ -991,13 +1004,19 @@ EOF
fatal "softhsm import ed25519 fail"
chmod 600 $ED25519
${SSHKEYGEN} -y -f $ED25519 > ${ED25519}.pub
- # Prepare askpass script to load PIN.
+ # Prepare some askpass scripts to load PINs.
PIN_SH=$SSH_SOFTHSM_DIR/pin.sh
cat > $PIN_SH << EOF
#!/bin/sh
echo "${TEST_SSH_PIN}"
EOF
chmod 0700 "$PIN_SH"
+ WRONGPIN_SH=$SSH_SOFTHSM_DIR/wrongpin.sh
+ cat > $WRONGPIN_SH << EOF
+#!/bin/sh
+echo "0000"
+EOF
+ chmod 0700 "$WRONGPIN_SH"
PKCS11_OK=yes
if env SSH_ASKPASS="$PIN_SH" SSH_ASKPASS_REQUIRE=force \
${SSHKEYGEN} -D ${TEST_SSH_PKCS11} >/dev/null 2>&1 ; then
@@ -1013,6 +1032,9 @@ p11_ssh_add() {
start_ssh_agent() {
EXTRA_AGENT_ARGS="$1"
+ if [ "$PKCS11_OK" = "yes" ]; then
+ EXTRA_AGENT_ARGS="${EXTRA_AGENT_ARGS} -P${TEST_SSH_PKCS11}"
+ fi
SSH_AUTH_SOCK="$OBJ/agent.sock"
export SSH_AUTH_SOCK
rm -f $SSH_AUTH_SOCK $OBJ/agent.log
@@ -1021,7 +1043,7 @@ start_ssh_agent() {
> $OBJ/agent.log 2>&1 &
AGENT_PID=$!
trap "kill $AGENT_PID" EXIT
- for x in 0 1 2 3 4 ; do
+ for x in 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ; do
# Give it a chance to start
${SSHADD} -l > /dev/null 2>&1
r=$?
diff --git a/regress/unittests/Makefile.inc b/regress/unittests/Makefile.inc
index 5fcf7a950a39..a5c2e8c21188 100644
--- a/regress/unittests/Makefile.inc
+++ b/regress/unittests/Makefile.inc
@@ -1,4 +1,4 @@
-# $OpenBSD: Makefile.inc,v 1.18 2025/05/06 06:05:48 djm Exp $
+# $OpenBSD: Makefile.inc,v 1.19 2025/10/23 19:06:10 miod Exp $
.include <bsd.own.mk>
.include <bsd.obj.mk>
@@ -38,6 +38,7 @@ CDIAGFLAGS+= -Wimplicit
CDIAGFLAGS+= -Winline
CDIAGFLAGS+= -Wmissing-declarations
CDIAGFLAGS+= -Wmissing-prototypes
+CDIAGFLAGS+= -Wold-style-definition
CDIAGFLAGS+= -Wparentheses
CDIAGFLAGS+= -Wpointer-arith
CDIAGFLAGS+= -Wreturn-type
@@ -50,9 +51,6 @@ CDIAGFLAGS+= -Wtrigraphs
CDIAGFLAGS+= -Wuninitialized
CDIAGFLAGS+= -Wunused
CDIAGFLAGS+= -Wno-unused-parameter
-.if ${COMPILER_VERSION:L} != "gcc3"
-CDIAGFLAGS+= -Wold-style-definition
-.endif
SSHREL=../../../../../usr.bin/ssh
diff --git a/regress/unittests/authopt/Makefile b/regress/unittests/authopt/Makefile
index 1ecaa30ce343..a7b8a867da3d 100644
--- a/regress/unittests/authopt/Makefile
+++ b/regress/unittests/authopt/Makefile
@@ -1,4 +1,4 @@
-# $OpenBSD: Makefile,v 1.10 2025/07/24 06:04:47 djm Exp $
+# $OpenBSD: Makefile,v 1.12 2026/02/06 23:39:14 dtucker Exp $
PROG=test_authopt
SRCS=tests.c
@@ -11,12 +11,12 @@ SRCS+=sshbuf-io.c atomicio.c sshkey.c authfile.c cipher.c log.c ssh-rsa.c
SRCS+=ssh-ecdsa.c ssh-ed25519.c mac.c umac.c umac128.c hmac.c misc.c
SRCS+=ssherr.c uidswap.c cleanup.c xmalloc.c match.c krl.c fatal.c
SRCS+=addr.c addrmatch.c bitmap.c
-SRCS+=ed25519.c hash.c
SRCS+=cipher-chachapoly.c chacha.c poly1305.c ssh-ecdsa-sk.c ssh-sk.c
SRCS+=ssh-ed25519-sk.c sk-usbhid.c ssh-pkcs11-client.c
+SRCS+=ssherr-libcrypto.c
-SRCS+=digest-openssl.c
-#SRCS+=digest-libc.c
+SRCS+=digest-openssl.c ed25519-openssl.c
+#SRCS+=digest-libc.c ed25519.c
SRCS+=utf8.c
REGRESS_TARGETS=run-regress-${PROG}
diff --git a/regress/unittests/authopt/tests.c b/regress/unittests/authopt/tests.c
index a81dffbf7ba3..2376b47dc48c 100644
--- a/regress/unittests/authopt/tests.c
+++ b/regress/unittests/authopt/tests.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: tests.c,v 1.4 2025/04/15 04:00:42 djm Exp $ */
+/* $OpenBSD: tests.c,v 1.5 2025/11/20 05:07:57 dtucker Exp $ */
/*
* Regress test for keys options functions.
@@ -141,6 +141,7 @@ test_authkeys_parse(void)
opts = sshauthopt_parse(keywords, &errstr); \
ASSERT_PTR_EQ(opts, NULL); \
ASSERT_PTR_NE(errstr, NULL); \
+ sshauthopt_free(opts); \
TEST_DONE(); \
} while (0)
#define CHECK_SUCCESS_AND_CLEANUP() \
diff --git a/regress/unittests/bitmap/Makefile b/regress/unittests/bitmap/Makefile
index c38cc7918cc1..22bc00c340ce 100644
--- a/regress/unittests/bitmap/Makefile
+++ b/regress/unittests/bitmap/Makefile
@@ -1,4 +1,4 @@
-# $OpenBSD: Makefile,v 1.5 2025/04/15 04:00:42 djm Exp $
+# $OpenBSD: Makefile,v 1.6 2026/02/06 23:39:14 dtucker Exp $
PROG=test_bitmap
SRCS=tests.c
@@ -6,6 +6,7 @@ SRCS=tests.c
# From usr.sbin/ssh
SRCS+=bitmap.c atomicio.c misc.c xmalloc.c fatal.c log.c cleanup.c match.c
SRCS+=sshbuf.c sshbuf-getput-basic.c sshbuf-misc.c ssherr.c addr.c addrmatch.c
+SRCS+=ssherr-libcrypto.c
REGRESS_TARGETS=run-regress-${PROG}
diff --git a/regress/unittests/conversion/Makefile b/regress/unittests/conversion/Makefile
index f9f5859ac5e8..93dffa55319b 100644
--- a/regress/unittests/conversion/Makefile
+++ b/regress/unittests/conversion/Makefile
@@ -1,4 +1,4 @@
-# $OpenBSD: Makefile,v 1.5 2025/04/15 04:00:42 djm Exp $
+# $OpenBSD: Makefile,v 1.6 2026/02/06 23:39:14 dtucker Exp $
PROG=test_conversion
SRCS=tests.c
@@ -6,7 +6,7 @@ SRCS=tests.c
# From usr.bin/ssh
SRCS+=sshbuf-getput-basic.c sshbuf-getput-crypto.c sshbuf-misc.c sshbuf.c
SRCS+=atomicio.c misc.c xmalloc.c log.c uidswap.c cleanup.c fatal.c ssherr.c
-SRCS+=match.c addr.c addrmatch.c
+SRCS+=match.c addr.c addrmatch.c ssherr-libcrypto.c
REGRESS_TARGETS=run-regress-${PROG}
diff --git a/regress/unittests/hostkeys/Makefile b/regress/unittests/hostkeys/Makefile
index 76c8e67f8aa1..2e154e12f755 100644
--- a/regress/unittests/hostkeys/Makefile
+++ b/regress/unittests/hostkeys/Makefile
@@ -1,4 +1,4 @@
-# $OpenBSD: Makefile,v 1.13 2025/07/24 06:04:47 djm Exp $
+# $OpenBSD: Makefile,v 1.15 2026/02/06 23:39:14 dtucker Exp $
PROG=test_hostkeys
SRCS=tests.c test_iterate.c
@@ -9,12 +9,11 @@ SRCS+=sshbuf-io.c atomicio.c sshkey.c authfile.c cipher.c log.c ssh-rsa.c
SRCS+=ssh-ecdsa.c ssh-ed25519.c mac.c umac.c umac128.c hmac.c misc.c
SRCS+=ssherr.c uidswap.c cleanup.c xmalloc.c match.c krl.c fatal.c
SRCS+=addr.c addrmatch.c bitmap.c hostfile.c
-SRCS+=ed25519.c hash.c
SRCS+=cipher-chachapoly.c chacha.c poly1305.c ssh-ecdsa-sk.c ssh-sk.c
-SRCS+=ssh-ed25519-sk.c sk-usbhid.c ssh-pkcs11-client.c
+SRCS+=ssh-ed25519-sk.c sk-usbhid.c ssh-pkcs11-client.c ssherr-libcrypto.c
-SRCS+=digest-openssl.c
-#SRCS+=digest-libc.c
+SRCS+=digest-openssl.c ed25519-openssl.c
+#SRCS+=digest-libc.c ed25519.c
SRCS+=utf8.c
REGRESS_TARGETS=run-regress-${PROG}
diff --git a/regress/unittests/hostkeys/test_iterate.c b/regress/unittests/hostkeys/test_iterate.c
index 65d6d1f43557..a330adce53a9 100644
--- a/regress/unittests/hostkeys/test_iterate.c
+++ b/regress/unittests/hostkeys/test_iterate.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: test_iterate.c,v 1.10 2025/05/06 06:05:48 djm Exp $ */
+/* $OpenBSD: test_iterate.c,v 1.11 2025/11/17 09:59:13 dtucker Exp $ */
/*
* Regress test for hostfile.h hostkeys_foreach()
*
@@ -133,7 +133,7 @@ check(struct hostkey_foreach_line *l, void *_ctx)
ASSERT_INT_EQ(sshkey_equal(l->key, expected->l.key), 1);
}
}
- if (parse_key && !(l->comment == NULL && expected->l.comment == NULL))
+ if (parse_key && l->comment != NULL && expected->l.comment != NULL)
ASSERT_STRING_EQ(l->comment, expected->l.comment);
return 0;
}
diff --git a/regress/unittests/kex/Makefile b/regress/unittests/kex/Makefile
index 5201a35df5bc..7a53978f1749 100644
--- a/regress/unittests/kex/Makefile
+++ b/regress/unittests/kex/Makefile
@@ -1,4 +1,4 @@
-# $OpenBSD: Makefile,v 1.19 2025/07/24 06:04:47 djm Exp $
+# $OpenBSD: Makefile,v 1.21 2026/02/06 23:39:14 dtucker Exp $
PROG=test_kex
SRCS=tests.c test_kex.c test_proposal.c
@@ -9,9 +9,9 @@ SRCS+=sshbuf-io.c atomicio.c sshkey.c authfile.c cipher.c log.c ssh-rsa.c
SRCS+=ssh-ecdsa.c ssh-ed25519.c mac.c umac.c umac128.c hmac.c misc.c
SRCS+=ssherr.c uidswap.c cleanup.c xmalloc.c match.c krl.c fatal.c
SRCS+=addr.c addrmatch.c bitmap.c packet.c dispatch.c canohost.c ssh_api.c
-SRCS+=compat.c ed25519.c hash.c
+SRCS+=compat.c
SRCS+=cipher-chachapoly.c chacha.c poly1305.c ssh-ecdsa-sk.c ssh-sk.c
-SRCS+=ssh-ed25519-sk.c sk-usbhid.c ssh-pkcs11-client.c
+SRCS+=ssh-ed25519-sk.c sk-usbhid.c ssh-pkcs11-client.c ssherr-libcrypto.c
SRCS+= kex.c
SRCS+= kex-names.c
@@ -29,8 +29,8 @@ SRCS+= kexmlkem768x25519.c
SRCS+= sntrup761.c
SRCS+= utf8.c
-SRCS+=digest-openssl.c
-#SRCS+=digest-libc.c
+SRCS+=digest-openssl.c ed25519-openssl.c
+#SRCS+=digest-libc.c ed25519.c
REGRESS_TARGETS=run-regress-${PROG}
diff --git a/regress/unittests/kex/tests.c b/regress/unittests/kex/tests.c
index a3ef19ef410a..d8a38e04a1e5 100644
--- a/regress/unittests/kex/tests.c
+++ b/regress/unittests/kex/tests.c
@@ -3,6 +3,10 @@
* Placed in the public domain
*/
+#include "includes.h"
+
+#include <stdio.h>
+
#include "../test_helper/test_helper.h"
void kex_tests(void);
diff --git a/regress/unittests/match/Makefile b/regress/unittests/match/Makefile
index 7b17e5689344..558e10bd415e 100644
--- a/regress/unittests/match/Makefile
+++ b/regress/unittests/match/Makefile
@@ -1,4 +1,4 @@
-# $OpenBSD: Makefile,v 1.6 2025/04/15 04:00:42 djm Exp $
+# $OpenBSD: Makefile,v 1.7 2026/02/06 23:39:14 dtucker Exp $
PROG=test_match
SRCS=tests.c
@@ -6,7 +6,7 @@ SRCS=tests.c
# From usr.bin/ssh
SRCS+=sshbuf-getput-basic.c sshbuf-getput-crypto.c sshbuf-misc.c sshbuf.c
SRCS+=match.c misc.c log.c uidswap.c fatal.c ssherr.c addrmatch.c xmalloc.c
-SRCS+=cleanup.c atomicio.c addr.c
+SRCS+=cleanup.c atomicio.c addr.c ssherr-libcrypto.c
REGRESS_TARGETS=run-regress-${PROG}
diff --git a/regress/unittests/misc/Makefile b/regress/unittests/misc/Makefile
index 77575061d456..c2d39244dee7 100644
--- a/regress/unittests/misc/Makefile
+++ b/regress/unittests/misc/Makefile
@@ -1,4 +1,4 @@
-# $OpenBSD: Makefile,v 1.12 2025/09/04 00:34:17 djm Exp $
+# $OpenBSD: Makefile,v 1.13 2026/02/06 23:39:14 dtucker Exp $
PROG=test_misc
SRCS=tests.c
@@ -25,7 +25,7 @@ SRCS+= addr.c
SRCS+= addrmatch.c
# From usr.bin/ssh/sshd/Makefile
-SRCS+= atomicio.c cleanup.c fatal.c
+SRCS+= atomicio.c cleanup.c fatal.c ssherr-libcrypto.c
REGRESS_TARGETS=run-regress-${PROG}
diff --git a/regress/unittests/misc/test_convtime.c b/regress/unittests/misc/test_convtime.c
index 4fdcf38127df..83af8c8c8118 100644
--- a/regress/unittests/misc/test_convtime.c
+++ b/regress/unittests/misc/test_convtime.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: test_convtime.c,v 1.3 2022/08/11 01:57:50 djm Exp $ */
+/* $OpenBSD: test_convtime.c,v 1.4 2025/12/05 07:43:24 djm Exp $ */
/*
* Regress test for misc time conversion functions.
*
@@ -57,6 +57,41 @@ test_convtime(void)
#endif
TEST_DONE();
+ TEST_START("misc_convtime_double");
+ ASSERT_DOUBLE_EQ(convtime_double("0"), 0);
+ ASSERT_DOUBLE_EQ(convtime_double("1"), 1.0);
+ ASSERT_DOUBLE_EQ(convtime_double("2s"), 2.0);
+ ASSERT_DOUBLE_EQ(convtime_double("3m"), 180.0);
+ ASSERT_DOUBLE_EQ(convtime_double("1m30s"), 90.0);
+ ASSERT_DOUBLE_EQ(convtime_double("1.5s"), 1.5);
+ ASSERT_DOUBLE_EQ(convtime_double(".5s"), 0.5);
+ ASSERT_DOUBLE_EQ(convtime_double("0.5s"), 0.5);
+ ASSERT_DOUBLE_EQ(convtime_double("1.123456s"), 1.123456);
+ ASSERT_DOUBLE_EQ(convtime_double("1.1234567s"), 1.1234567);
+ ASSERT_DOUBLE_EQ(convtime_double("1.123s"), 1.123);
+ ASSERT_DOUBLE_EQ(convtime_double("1m0.5s"), 60.5);
+ ASSERT_DOUBLE_EQ(convtime_double("1m.5s"), 60.5);
+ ASSERT_DOUBLE_EQ(convtime_double("1.5"), 1.5);
+ ASSERT_DOUBLE_EQ(convtime_double("1.123456"), 1.123456);
+ ASSERT_DOUBLE_EQ(convtime_double("1.1234567"), 1.1234567);
+ /* errors */
+ ASSERT_DOUBLE_LT(convtime_double(""), 0.0);
+ ASSERT_DOUBLE_LT(convtime_double("trout"), 0.0);
+ ASSERT_DOUBLE_LT(convtime_double("1.s"), 0.0);
+ ASSERT_DOUBLE_LT(convtime_double("0x1"), 0.0);
+ ASSERT_DOUBLE_LT(convtime_double("inf"), 0.0);
+ ASSERT_DOUBLE_LT(convtime_double("nan"), 0.0);
+ ASSERT_DOUBLE_LT(convtime_double("1e10"), 0.0);
+ ASSERT_DOUBLE_LT(convtime_double("-1"), 0.0);
+ ASSERT_DOUBLE_LT(convtime_double("3.w0.5s"), 0.0);
+ ASSERT_DOUBLE_LT(convtime_double("1.0d0.5s"), 0.0);
+ ASSERT_DOUBLE_LT(convtime_double("1.5m"), 0.0);
+ ASSERT_DOUBLE_LT(convtime_double("1.5h"), 0.0);
+ ASSERT_DOUBLE_LT(convtime_double("1.5d"), 0.0);
+ ASSERT_DOUBLE_LT(convtime_double("1.5w"), 0.0);
+ ASSERT_DOUBLE_LT(convtime_double("1s1.5"), 0.0);
+ TEST_DONE();
+
/* XXX timezones/DST make verification of this tricky */
/* XXX maybe setenv TZ and tzset() to make it unambiguous? */
TEST_START("misc_parse_absolute_time");
diff --git a/regress/unittests/misc/test_misc.c b/regress/unittests/misc/test_misc.c
index d175196b7d47..db0b5bb6643f 100644
--- a/regress/unittests/misc/test_misc.c
+++ b/regress/unittests/misc/test_misc.c
@@ -374,6 +374,44 @@ test_path_absolute(void)
}
static void
+test_stringlist(void)
+{
+ char **list = NULL;
+
+ TEST_START("stringlist_append initial");
+ stringlist_append(&list, "one");
+ ASSERT_PTR_NE(list, NULL);
+ ASSERT_STRING_EQ(list[0], "one");
+ ASSERT_PTR_EQ(list[1], NULL);
+ TEST_DONE();
+
+ TEST_START("stringlist_append second");
+ stringlist_append(&list, "two");
+ ASSERT_PTR_NE(list, NULL);
+ ASSERT_STRING_EQ(list[0], "one");
+ ASSERT_STRING_EQ(list[1], "two");
+ ASSERT_PTR_EQ(list[2], NULL);
+ TEST_DONE();
+
+ TEST_START("stringlist_append third");
+ stringlist_append(&list, "three");
+ ASSERT_PTR_NE(list, NULL);
+ ASSERT_STRING_EQ(list[0], "one");
+ ASSERT_STRING_EQ(list[1], "two");
+ ASSERT_STRING_EQ(list[2], "three");
+ ASSERT_PTR_EQ(list[3], NULL);
+ TEST_DONE();
+
+ TEST_START("stringlist_free");
+ stringlist_free(list);
+ TEST_DONE();
+
+ TEST_START("stringlist_free NULL");
+ stringlist_free(NULL);
+ TEST_DONE();
+}
+
+static void
test_skip_space(void)
{
char *s, *p;
@@ -432,5 +470,6 @@ test_misc(void)
test_tohex();
test_lowercase();
test_path_absolute();
+ test_stringlist();
test_skip_space();
}
diff --git a/regress/unittests/sshbuf/Makefile b/regress/unittests/sshbuf/Makefile
index a8ddfaf7ed24..27106247e2a1 100644
--- a/regress/unittests/sshbuf/Makefile
+++ b/regress/unittests/sshbuf/Makefile
@@ -1,6 +1,4 @@
-# $OpenBSD: Makefile,v 1.10 2021/01/09 12:24:31 dtucker Exp $
-
-# $OpenBSD: Makefile,v 1.8 2020/01/26 00:09:50 djm Exp $
+# $OpenBSD: Makefile,v 1.11 2026/02/06 23:39:14 dtucker Exp $
PROG=test_sshbuf
SRCS=tests.c
@@ -15,7 +13,7 @@ SRCS+=test_sshbuf_fixed.c
# From usr.bin/ssh
SRCS+=sshbuf-getput-basic.c sshbuf-getput-crypto.c sshbuf-misc.c sshbuf.c
SRCS+=sshbuf-io.c atomicio.c misc.c xmalloc.c log.c fatal.c ssherr.c cleanup.c
-SRCS+=match.c addr.c addrmatch.c
+SRCS+=match.c addr.c addrmatch.c ssherr-libcrypto.c
run-regress-${PROG}: ${PROG}
env ${TEST_ENV} ./${PROG} ${UNITTEST_ARGS}
diff --git a/regress/unittests/sshbuf/test_sshbuf.c b/regress/unittests/sshbuf/test_sshbuf.c
index dc021ba9087b..3e165d430b3d 100644
--- a/regress/unittests/sshbuf/test_sshbuf.c
+++ b/regress/unittests/sshbuf/test_sshbuf.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: test_sshbuf.c,v 1.2 2021/12/14 21:25:27 deraadt Exp $ */
+/* $OpenBSD: test_sshbuf.c,v 1.3 2025/12/30 00:12:58 djm Exp $ */
/*
* Regress test for sshbuf.h buffer API
*
@@ -28,7 +28,8 @@ void sshbuf_tests(void);
void
sshbuf_tests(void)
{
- struct sshbuf *p1;
+ struct sshbuf *p1, *p2, *p3;
+ u_int v32;
const u_char *cdp;
u_char *dp;
size_t sz;
@@ -238,4 +239,38 @@ sshbuf_tests(void)
ASSERT_SIZE_T_EQ(sshbuf_avail(p1), 1223);
sshbuf_free(p1);
TEST_DONE();
+
+ TEST_START("sshbuf_consume_upto_child");
+ p1 = sshbuf_new();
+ ASSERT_PTR_NE(p1, NULL);
+ p2 = sshbuf_new();
+ ASSERT_PTR_NE(p2, NULL);
+ /* Unrelated buffers */
+ ASSERT_INT_EQ(sshbuf_consume_upto_child(p1, p2),
+ SSH_ERR_INVALID_ARGUMENT);
+ /* Simple success case */
+ ASSERT_INT_EQ(sshbuf_put_u32(p1, 0xdeadbeef), 0);
+ ASSERT_INT_EQ(sshbuf_put_u32(p1, 0x01020304), 0);
+ ASSERT_INT_EQ(sshbuf_put_u32(p1, 0xfeedface), 0);
+ ASSERT_SIZE_T_EQ(sshbuf_len(p1), 12);
+ p3 = sshbuf_fromb(p1);
+ ASSERT_PTR_NE(p3, NULL);
+ ASSERT_INT_EQ(sshbuf_get_u32(p3, &v32), 0);
+ ASSERT_U32_EQ(v32, 0xdeadbeef);
+ ASSERT_SIZE_T_EQ(sshbuf_len(p3), 8);
+ ASSERT_INT_EQ(sshbuf_consume_upto_child(p1, p3), 0);
+ ASSERT_SIZE_T_EQ(sshbuf_len(p1), sshbuf_len(p3));
+ ASSERT_PTR_EQ(sshbuf_ptr(p1), sshbuf_ptr(p3));
+ sshbuf_free(p3);
+ /* Parent already consumed past child */
+ p3 = sshbuf_fromb(p1);
+ ASSERT_PTR_NE(p3, NULL);
+ ASSERT_INT_EQ(sshbuf_get_u32(p1, &v32), 0);
+ ASSERT_U32_EQ(v32, 0x01020304);
+ ASSERT_INT_EQ(sshbuf_consume_upto_child(p1, p3),
+ SSH_ERR_INVALID_ARGUMENT);
+ sshbuf_free(p1);
+ sshbuf_free(p2);
+ sshbuf_free(p3);
+ TEST_DONE();
}
diff --git a/regress/unittests/sshbuf/test_sshbuf_fuzz.c b/regress/unittests/sshbuf/test_sshbuf_fuzz.c
index 51838ee724dd..0d8083035cae 100644
--- a/regress/unittests/sshbuf/test_sshbuf_fuzz.c
+++ b/regress/unittests/sshbuf/test_sshbuf_fuzz.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: test_sshbuf_fuzz.c,v 1.4 2021/12/18 06:53:59 anton Exp $ */
+/* $OpenBSD: test_sshbuf_fuzz.c,v 1.5 2026/03/06 06:57:33 dtucker Exp $ */
/*
* Regress test for sshbuf.h buffer API
*
@@ -28,7 +28,7 @@ sshbuf_fuzz_tests(void)
struct sshbuf *p1;
u_char *dp;
size_t sz, sz2, i, ntests = NUM_FUZZ_TESTS;
- u_int32_t r;
+ uint32_t r;
int ret;
if (test_is_fast())
diff --git a/regress/unittests/sshbuf/test_sshbuf_getput_basic.c b/regress/unittests/sshbuf/test_sshbuf_getput_basic.c
index bfe61a8773bc..1e479a41bf6e 100644
--- a/regress/unittests/sshbuf/test_sshbuf_getput_basic.c
+++ b/regress/unittests/sshbuf/test_sshbuf_getput_basic.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: test_sshbuf_getput_basic.c,v 1.5 2025/09/15 03:00:22 djm Exp $ */
+/* $OpenBSD: test_sshbuf_getput_basic.c,v 1.7 2026/03/06 06:57:33 dtucker Exp $ */
/*
* Regress test for sshbuf.h buffer API
*
@@ -27,9 +27,9 @@ sshbuf_getput_basic_tests(void)
u_char *d, d2[32], x[] = {
0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x00, 0x99
};
- u_int64_t v64;
- u_int32_t v32;
- u_int16_t v16;
+ uint64_t v64;
+ uint32_t v32;
+ uint16_t v16;
u_char v8;
size_t s;
char *s2;
@@ -712,4 +712,119 @@ sshbuf_getput_basic_tests(void)
sshbuf_free(p1);
free(s2);
TEST_DONE();
+
+ TEST_START("sshbuf_get_nulterminated_string");
+ p1 = sshbuf_new();
+ ASSERT_PTR_NE(p1, NULL);
+ ASSERT_INT_EQ(sshbuf_put(p1, "hello", 5), 0);
+ ASSERT_INT_EQ(sshbuf_put_u8(p1, 0), 0); /* hello\0 */
+ ASSERT_INT_EQ(sshbuf_put(p1, "there", 5), 0); /* hello\0there */
+ ASSERT_SIZE_T_EQ(sshbuf_len(p1), 11);
+ /* short maxlen */
+ ASSERT_INT_EQ(sshbuf_get_nulterminated_string(p1, 1, &s2, &s),
+ SSH_ERR_INVALID_FORMAT);
+ ASSERT_PTR_EQ(s2, NULL);
+ ASSERT_SIZE_T_EQ(s, 0);
+ ASSERT_SIZE_T_EQ(sshbuf_len(p1), 11); /* Buffer should be unchanged */
+ ASSERT_INT_EQ(sshbuf_get_nulterminated_string(p1, 4, &s2, &s),
+ SSH_ERR_INVALID_FORMAT);
+ ASSERT_PTR_EQ(s2, NULL);
+ ASSERT_SIZE_T_EQ(s, 0);
+ ASSERT_SIZE_T_EQ(sshbuf_len(p1), 11); /* Buffer should be unchanged */
+ /* minimum usable maxlen */
+ ASSERT_INT_EQ(sshbuf_get_nulterminated_string(p1, 5, &s2, &s), 0);
+ ASSERT_STRING_EQ(s2, "hello");
+ ASSERT_SIZE_T_EQ(s, 5);
+ ASSERT_SIZE_T_EQ(sshbuf_len(p1), 5); /* "there" remains */
+ free(s2);
+ sshbuf_free(p1);
+ TEST_DONE();
+
+ TEST_START("sshbuf_get_nulterminated_string un-terminated string");
+ p1 = sshbuf_new();
+ ASSERT_PTR_NE(p1, NULL);
+ ASSERT_INT_EQ(sshbuf_put(p1, "there", 5), 0); /* "there" */
+ ASSERT_SIZE_T_EQ(sshbuf_len(p1), 5);
+ ASSERT_INT_EQ(sshbuf_get_nulterminated_string(p1, 5, &s2, &s),
+ SSH_ERR_INVALID_FORMAT);
+ ASSERT_PTR_EQ(s2, NULL);
+ ASSERT_SIZE_T_EQ(s, 0);
+ ASSERT_SIZE_T_EQ(sshbuf_len(p1), 5); /* Buffer should be unchanged */
+ ASSERT_INT_EQ(sshbuf_get_nulterminated_string(p1, 6, &s2, &s),
+ SSH_ERR_MESSAGE_INCOMPLETE);
+ ASSERT_PTR_EQ(s2, NULL);
+ ASSERT_SIZE_T_EQ(s, 0);
+ ASSERT_SIZE_T_EQ(sshbuf_len(p1), 5); /* Buffer should be unchanged */
+ ASSERT_INT_EQ(sshbuf_get_nulterminated_string(p1, SIZE_MAX, &s2, &s),
+ SSH_ERR_MESSAGE_INCOMPLETE);
+ ASSERT_PTR_EQ(s2, NULL);
+ ASSERT_SIZE_T_EQ(s, 0);
+ ASSERT_SIZE_T_EQ(sshbuf_len(p1), 5);
+ sshbuf_free(p1);
+ TEST_DONE();
+
+ TEST_START("sshbuf_get_nulterminated_string subsequent strings");
+ p1 = sshbuf_new();
+ ASSERT_PTR_NE(p1, NULL);
+ ASSERT_INT_EQ(sshbuf_put(p1, "there", 5), 0);
+ ASSERT_INT_EQ(sshbuf_put_u8(p1, 0), 0); /* "there\0" */
+ ASSERT_INT_EQ(sshbuf_put(p1, "it is", 5), 0);
+ ASSERT_INT_EQ(sshbuf_put_u8(p1, 0), 0); /* "it is\0" */
+ ASSERT_SIZE_T_EQ(sshbuf_len(p1), 12);
+ ASSERT_INT_EQ(sshbuf_get_nulterminated_string(p1, 6, &s2, &s), 0);
+ ASSERT_STRING_EQ(s2, "there");
+ ASSERT_SIZE_T_EQ(s, 5);
+ ASSERT_SIZE_T_EQ(sshbuf_len(p1), 6);
+ free(s2);
+ ASSERT_INT_EQ(sshbuf_get_nulterminated_string(p1, SIZE_MAX, &s2, &s), 0);
+ ASSERT_STRING_EQ(s2, "it is");
+ ASSERT_SIZE_T_EQ(s, 5);
+ ASSERT_SIZE_T_EQ(sshbuf_len(p1), 0);
+ free(s2);
+ sshbuf_free(p1);
+ TEST_DONE();
+
+ TEST_START("sshbuf_get_nulterminated_string empty buffer");
+ p1 = sshbuf_new();
+ ASSERT_PTR_NE(p1, NULL);
+ ASSERT_INT_EQ(sshbuf_get_nulterminated_string(p1, SIZE_MAX, &s2, &s),
+ SSH_ERR_MESSAGE_INCOMPLETE);
+ ASSERT_PTR_EQ(s2, NULL);
+ ASSERT_SIZE_T_EQ(s, 0);
+ ASSERT_SIZE_T_EQ(sshbuf_len(p1), 0);
+ sshbuf_free(p1);
+ TEST_DONE();
+
+ TEST_START("sshbuf_get_nulterminated_string: single nul byte");
+ p1 = sshbuf_new();
+ ASSERT_PTR_NE(p1, NULL);
+ ASSERT_INT_EQ(sshbuf_put_u8(p1, 0), 0);
+ ASSERT_SIZE_T_EQ(sshbuf_len(p1), 1);
+ ASSERT_INT_EQ(sshbuf_get_nulterminated_string(p1, 0, &s2, &s), 0);
+ ASSERT_STRING_EQ(s2, "");
+ ASSERT_SIZE_T_EQ(s, 0);
+ ASSERT_SIZE_T_EQ(sshbuf_len(p1), 0);
+ free(s2);
+ sshbuf_free(p1);
+ TEST_DONE();
+
+ TEST_START("sshbuf_get_nulterminated_string starts with nul");
+ p1 = sshbuf_new();
+ ASSERT_PTR_NE(p1, NULL);
+ ASSERT_INT_EQ(sshbuf_put_u8(p1, 0), 0);
+ ASSERT_INT_EQ(sshbuf_put(p1, "hello", 5), 0);
+ ASSERT_INT_EQ(sshbuf_put_u8(p1, 0), 0);
+ ASSERT_SIZE_T_EQ(sshbuf_len(p1), 7);
+ ASSERT_INT_EQ(sshbuf_get_nulterminated_string(p1, SIZE_MAX, &s2, &s), 0);
+ ASSERT_STRING_EQ(s2, "");
+ ASSERT_SIZE_T_EQ(s, 0);
+ ASSERT_SIZE_T_EQ(sshbuf_len(p1), 6);
+ free(s2);
+ ASSERT_INT_EQ(sshbuf_get_nulterminated_string(p1, SIZE_MAX, &s2, &s), 0);
+ ASSERT_STRING_EQ(s2, "hello");
+ ASSERT_SIZE_T_EQ(s, 5);
+ ASSERT_SIZE_T_EQ(sshbuf_len(p1), 0);
+ free(s2);
+ sshbuf_free(p1);
+ TEST_DONE();
}
diff --git a/regress/unittests/sshbuf/test_sshbuf_getput_crypto.c b/regress/unittests/sshbuf/test_sshbuf_getput_crypto.c
index 97ee853d8875..1d83ffd88d2e 100644
--- a/regress/unittests/sshbuf/test_sshbuf_getput_crypto.c
+++ b/regress/unittests/sshbuf/test_sshbuf_getput_crypto.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: test_sshbuf_getput_crypto.c,v 1.4 2025/05/12 05:42:02 tb Exp $ */
+/* $OpenBSD: test_sshbuf_getput_crypto.c,v 1.5 2026/03/06 06:57:33 dtucker Exp $ */
/*
* Regress test for sshbuf.h buffer API
*
@@ -82,7 +82,7 @@ sshbuf_getput_crypto_tests(void)
ASSERT_PTR_NE(p1, NULL);
ASSERT_INT_EQ(sshbuf_put_bignum2(p1, bn), 0);
ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(expbn1) + 4);
- ASSERT_U32_EQ(PEEK_U32(sshbuf_ptr(p1)), (u_int32_t)BN_num_bytes(bn));
+ ASSERT_U32_EQ(PEEK_U32(sshbuf_ptr(p1)), (uint32_t)BN_num_bytes(bn));
ASSERT_MEM_EQ(sshbuf_ptr(p1) + 4, expbn1, sizeof(expbn1));
BN_free(bn);
sshbuf_free(p1);
@@ -106,7 +106,7 @@ sshbuf_getput_crypto_tests(void)
ASSERT_PTR_NE(p1, NULL);
ASSERT_INT_EQ(sshbuf_put_bignum2(p1, bn), 0);
ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(expbn2) + 4 + 1); /* MSB */
- ASSERT_U32_EQ(PEEK_U32(sshbuf_ptr(p1)), (u_int32_t)BN_num_bytes(bn) + 1);
+ ASSERT_U32_EQ(PEEK_U32(sshbuf_ptr(p1)), (uint32_t)BN_num_bytes(bn) + 1);
ASSERT_U8_EQ(*(sshbuf_ptr(p1) + 4), 0x00);
ASSERT_MEM_EQ(sshbuf_ptr(p1) + 5, expbn2, sizeof(expbn2));
BN_free(bn);
diff --git a/regress/unittests/sshbuf/test_sshbuf_getput_fuzz.c b/regress/unittests/sshbuf/test_sshbuf_getput_fuzz.c
index cd712c62be29..7b2ffced385d 100644
--- a/regress/unittests/sshbuf/test_sshbuf_getput_fuzz.c
+++ b/regress/unittests/sshbuf/test_sshbuf_getput_fuzz.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: test_sshbuf_getput_fuzz.c,v 1.6 2025/09/25 22:17:29 dtucker Exp $ */
+/* $OpenBSD: test_sshbuf_getput_fuzz.c,v 1.7 2026/03/06 06:57:33 dtucker Exp $ */
/*
* Regress test for sshbuf.h buffer API
*
@@ -39,10 +39,10 @@ attempt_parse_blob(u_char *blob, size_t len)
#endif /* WITH_OPENSSL */
u_char *s;
size_t l;
- u_int8_t u8;
- u_int16_t u16;
- u_int32_t u32;
- u_int64_t u64;
+ uint8_t u8;
+ uint16_t u16;
+ uint32_t u32;
+ uint64_t u64;
p1 = sshbuf_new();
ASSERT_PTR_NE(p1, NULL);
diff --git a/regress/unittests/sshkey/Makefile b/regress/unittests/sshkey/Makefile
index 77d07d1b550e..083175cbf264 100644
--- a/regress/unittests/sshkey/Makefile
+++ b/regress/unittests/sshkey/Makefile
@@ -1,4 +1,4 @@
-# $OpenBSD: Makefile,v 1.14 2025/07/24 06:04:47 djm Exp $
+# $OpenBSD: Makefile,v 1.16 2026/02/06 23:39:14 dtucker Exp $
PROG=test_sshkey
SRCS=tests.c test_sshkey.c test_file.c test_fuzz.c common.c
@@ -9,13 +9,13 @@ SRCS+=sshbuf-io.c atomicio.c sshkey.c authfile.c cipher.c log.c ssh-rsa.c
SRCS+=ssh-ecdsa.c ssh-ed25519.c mac.c umac.c umac128.c hmac.c misc.c
SRCS+=ssherr.c uidswap.c cleanup.c xmalloc.c match.c krl.c fatal.c
SRCS+=addr.c addrmatch.c bitmap.c
-SRCS+=ed25519.c hash.c
SRCS+=cipher-chachapoly.c chacha.c poly1305.c ssh-ecdsa-sk.c ssh-sk.c
SRCS+=ssh-ed25519-sk.c sk-usbhid.c ssh-pkcs11-client.c
+SRCS+=utf8.c ssherr-libcrypto.c
+
+SRCS+=digest-openssl.c ed25519-openssl.c
+#SRCS+=digest-libc.c ed25519.c
-SRCS+=digest-openssl.c
-#SRCS+=digest-libc.c
-SRCS+=utf8.c
REGRESS_TARGETS=run-regress-${PROG}
diff --git a/regress/unittests/sshkey/test_sshkey.c b/regress/unittests/sshkey/test_sshkey.c
index d0c46a90beb7..1701c87c54a8 100644
--- a/regress/unittests/sshkey/test_sshkey.c
+++ b/regress/unittests/sshkey/test_sshkey.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: test_sshkey.c,v 1.32 2025/10/01 00:33:37 dtucker Exp $ */
+/* $OpenBSD: test_sshkey.c,v 1.33 2026/03/06 06:57:33 dtucker Exp $ */
/*
* Regress test for sshkey.h key management API
*
@@ -466,7 +466,7 @@ sshkey_tests(void)
ASSERT_PTR_NE(k1->cert->principals[3], NULL);
k1->cert->nprincipals = 4;
k1->cert->valid_after = 0;
- k1->cert->valid_before = (u_int64_t)-1;
+ k1->cert->valid_before = (uint64_t)-1;
sshbuf_free(k1->cert->critical);
k1->cert->critical = sshbuf_new();
ASSERT_PTR_NE(k1->cert->critical, NULL);
diff --git a/regress/unittests/sshkey/tests.c b/regress/unittests/sshkey/tests.c
index 5511e7b8900d..426543bd7c37 100644
--- a/regress/unittests/sshkey/tests.c
+++ b/regress/unittests/sshkey/tests.c
@@ -7,6 +7,8 @@
#include "includes.h"
+#include <stdio.h>
+
#include "../test_helper/test_helper.h"
void sshkey_tests(void);
diff --git a/regress/unittests/sshsig/Makefile b/regress/unittests/sshsig/Makefile
index f2f03e843856..54abd8499b07 100644
--- a/regress/unittests/sshsig/Makefile
+++ b/regress/unittests/sshsig/Makefile
@@ -1,4 +1,4 @@
-# $OpenBSD: Makefile,v 1.5 2025/07/24 06:04:47 djm Exp $
+# $OpenBSD: Makefile,v 1.7 2026/02/06 23:39:14 dtucker Exp $
PROG=test_sshsig
SRCS=tests.c
@@ -9,12 +9,11 @@ SRCS+=sshbuf-io.c atomicio.c sshkey.c authfile.c cipher.c log.c ssh-rsa.c
SRCS+=ssh-ecdsa.c ssh-ed25519.c mac.c umac.c umac128.c hmac.c misc.c
SRCS+=ssherr.c uidswap.c cleanup.c xmalloc.c match.c krl.c fatal.c
SRCS+=addr.c addrmatch.c bitmap.c sshsig.c
-SRCS+=ed25519.c hash.c
SRCS+=cipher-chachapoly.c chacha.c poly1305.c ssh-ecdsa-sk.c ssh-sk.c
-SRCS+=ssh-ed25519-sk.c sk-usbhid.c ssh-pkcs11-client.c
+SRCS+=ssh-ed25519-sk.c sk-usbhid.c ssh-pkcs11-client.c ssherr-libcrypto.c
-SRCS+=digest-openssl.c
-#SRCS+=digest-libc.c
+SRCS+=digest-openssl.c ed25519-openssl.c
+#SRCS+=digest-libc.c ed25519.c
SRCS+=utf8.c
REGRESS_TARGETS=run-regress-${PROG}
diff --git a/regress/unittests/test_helper/test_helper.c b/regress/unittests/test_helper/test_helper.c
index 51b80119bafa..525a82b1ff87 100644
--- a/regress/unittests/test_helper/test_helper.c
+++ b/regress/unittests/test_helper/test_helper.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: test_helper.c,v 1.14 2025/04/15 04:00:42 djm Exp $ */
+/* $OpenBSD: test_helper.c,v 1.16 2026/03/06 06:57:33 dtucker Exp $ */
/*
* Copyright (c) 2011 Damien Miller <djm@mindrot.org>
*
@@ -448,7 +448,7 @@ assert_mem(const char *file, int line, const char *a1, const char *a2,
}
static int
-memvalcmp(const u_int8_t *s, u_char v, size_t l, size_t *where)
+memvalcmp(const uint8_t *s, u_char v, size_t l, size_t *where)
{
size_t i;
@@ -560,7 +560,7 @@ assert_char(const char *file, int line, const char *a1, const char *a2,
void
assert_u8(const char *file, int line, const char *a1, const char *a2,
- u_int8_t aa1, u_int8_t aa2, enum test_predicate pred)
+ uint8_t aa1, uint8_t aa2, enum test_predicate pred)
{
TEST_CHECK(aa1, aa2, pred);
test_header(file, line, a1, a2, "U8", pred);
@@ -571,7 +571,7 @@ assert_u8(const char *file, int line, const char *a1, const char *a2,
void
assert_u16(const char *file, int line, const char *a1, const char *a2,
- u_int16_t aa1, u_int16_t aa2, enum test_predicate pred)
+ uint16_t aa1, uint16_t aa2, enum test_predicate pred)
{
TEST_CHECK(aa1, aa2, pred);
test_header(file, line, a1, a2, "U16", pred);
@@ -582,7 +582,7 @@ assert_u16(const char *file, int line, const char *a1, const char *a2,
void
assert_u32(const char *file, int line, const char *a1, const char *a2,
- u_int32_t aa1, u_int32_t aa2, enum test_predicate pred)
+ uint32_t aa1, uint32_t aa2, enum test_predicate pred)
{
TEST_CHECK(aa1, aa2, pred);
test_header(file, line, a1, a2, "U32", pred);
@@ -593,7 +593,7 @@ assert_u32(const char *file, int line, const char *a1, const char *a2,
void
assert_u64(const char *file, int line, const char *a1, const char *a2,
- u_int64_t aa1, u_int64_t aa2, enum test_predicate pred)
+ uint64_t aa1, uint64_t aa2, enum test_predicate pred)
{
TEST_CHECK(aa1, aa2, pred);
test_header(file, line, a1, a2, "U64", pred);
@@ -605,6 +605,47 @@ assert_u64(const char *file, int line, const char *a1, const char *a2,
}
void
+assert_double(const char *file, int line, const char *a1, const char *a2,
+ double aa1, double aa2, enum test_predicate pred)
+{
+ const double epsilon = 0.000000001;
+
+ switch (pred) {
+ case TEST_EQ:
+ if (fabs(aa1 - aa2) < epsilon)
+ return;
+ break;
+ case TEST_NE:
+ if (fabs(aa1 - aa2) >= epsilon)
+ return;
+ break;
+ case TEST_LT:
+ if (aa1 < aa2)
+ return;
+ break;
+ case TEST_LE:
+ if (aa1 <= aa2)
+ return;
+ break;
+ case TEST_GT:
+ if (aa1 > aa2)
+ return;
+ break;
+ case TEST_GE:
+ if (aa1 >= aa2)
+ return;
+ break;
+ default:
+ abort();
+ }
+
+ test_header(file, line, a1, a2, "DOUBLE", pred);
+ fprintf(stderr, "%12s = %f\n", a1, aa1);
+ fprintf(stderr, "%12s = %f\n", a2, aa2);
+ test_die();
+}
+
+void
assert_ptr(const char *file, int line, const char *a1, const char *a2,
const void *aa1, const void *aa2, enum test_predicate pred)
{
diff --git a/regress/unittests/test_helper/test_helper.h b/regress/unittests/test_helper/test_helper.h
index 4f7e2c87f28d..91fdca435347 100644
--- a/regress/unittests/test_helper/test_helper.h
+++ b/regress/unittests/test_helper/test_helper.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: test_helper.h,v 1.10 2025/04/15 04:00:42 djm Exp $ */
+/* $OpenBSD: test_helper.h,v 1.12 2026/03/06 06:57:33 dtucker Exp $ */
/*
* Copyright (c) 2011 Damien Miller <djm@mindrot.org>
*
@@ -89,16 +89,19 @@ void assert_ptr(const char *file, int line,
const void *aa1, const void *aa2, enum test_predicate pred);
void assert_u8(const char *file, int line,
const char *a1, const char *a2,
- u_int8_t aa1, u_int8_t aa2, enum test_predicate pred);
+ uint8_t aa1, uint8_t aa2, enum test_predicate pred);
void assert_u16(const char *file, int line,
const char *a1, const char *a2,
- u_int16_t aa1, u_int16_t aa2, enum test_predicate pred);
+ uint16_t aa1, uint16_t aa2, enum test_predicate pred);
void assert_u32(const char *file, int line,
const char *a1, const char *a2,
- u_int32_t aa1, u_int32_t aa2, enum test_predicate pred);
+ uint32_t aa1, uint32_t aa2, enum test_predicate pred);
void assert_u64(const char *file, int line,
const char *a1, const char *a2,
- u_int64_t aa1, u_int64_t aa2, enum test_predicate pred);
+ uint64_t aa1, uint64_t aa2, enum test_predicate pred);
+void assert_double(const char *file, int line,
+ const char *a1, const char *a2,
+ double aa1, double aa2, enum test_predicate pred);
#define TEST_START(n) test_start(n)
#define TEST_DONE() test_done()
@@ -285,6 +288,19 @@ void assert_u64(const char *file, int line,
#define ASSERT_U64_GE(a1, a2) \
assert_u64(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_GE)
+#define ASSERT_DOUBLE_EQ(a1, a2) \
+ assert_double(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_EQ)
+#define ASSERT_DOUBLE_NE(a1, a2) \
+ assert_double(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_NE)
+#define ASSERT_DOUBLE_LT(a1, a2) \
+ assert_double(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_LT)
+#define ASSERT_DOUBLE_LE(a1, a2) \
+ assert_double(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_LE)
+#define ASSERT_DOUBLE_GT(a1, a2) \
+ assert_double(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_GT)
+#define ASSERT_DOUBLE_GE(a1, a2) \
+ assert_double(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_GE)
+
/* Benchmarking support */
#define BENCH_START(name) \
do { \
diff --git a/regress/unittests/utf8/Makefile b/regress/unittests/utf8/Makefile
index e89536500822..a5495735906b 100644
--- a/regress/unittests/utf8/Makefile
+++ b/regress/unittests/utf8/Makefile
@@ -1,4 +1,4 @@
-# $OpenBSD: Makefile,v 1.6 2025/04/15 04:00:42 djm Exp $
+# $OpenBSD: Makefile,v 1.7 2026/02/06 23:39:14 dtucker Exp $
PROG=test_utf8
SRCS=tests.c
@@ -6,6 +6,7 @@ SRCS=tests.c
# From usr.bin/ssh
SRCS+=utf8.c atomicio.c misc.c xmalloc.c match.c ssherr.c cleanup.c fatal.c
SRCS+=sshbuf.c sshbuf-getput-basic.c sshbuf-misc.c addr.c addrmatch.c log.c
+SRCS+=ssherr-libcrypto.c
REGRESS_TARGETS=run-regress-${PROG}
diff --git a/rijndael.c b/rijndael.c
index 40ab7b1f5103..805687b82bd9 100644
--- a/rijndael.c
+++ b/rijndael.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: rijndael.c,v 1.20 2015/03/16 11:09:52 djm Exp $ */
+/* $OpenBSD: rijndael.c,v 1.21 2026/02/11 17:05:32 dtucker Exp $ */
/**
* rijndael-alg-fst.c
diff --git a/sandbox-seccomp-filter.c b/sandbox-seccomp-filter.c
index b3da8d5877b1..7b2444930d1a 100644
--- a/sandbox-seccomp-filter.c
+++ b/sandbox-seccomp-filter.c
@@ -405,6 +405,9 @@ static const struct sock_filter preauth_insns[] = {
#ifdef __NR_read
SC_ALLOW(__NR_read),
#endif
+#ifdef __NR_riscv_hwprobe
+ SC_ALLOW(__NR_riscv_hwprobe),
+#endif
#ifdef __NR_rt_sigprocmask
SC_ALLOW(__NR_rt_sigprocmask),
#endif
diff --git a/scp.0 b/scp.0
index 43acd03c53bb..d59fe31ccec2 100644
--- a/scp.0
+++ b/scp.0
@@ -270,4 +270,4 @@ CAVEATS
requires careful quoting of any characters that have special meaning to
the remote shell, such as quote characters.
-OpenBSD 7.7 October 4, 2025 OpenBSD 7.7
+OpenBSD 7.8 October 4, 2025 SCP(1)
diff --git a/scp.c b/scp.c
index c5f573cc1fde..1faa9a555744 100644
--- a/scp.c
+++ b/scp.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: scp.c,v 1.268 2025/09/25 06:23:19 jsg Exp $ */
+/* $OpenBSD: scp.c,v 1.273 2026/04/02 07:42:16 djm Exp $ */
/*
* scp - secure remote copy. This is basically patched BSD rcp which
* uses ssh to do the data transfer (instead of using rcmd).
@@ -75,7 +75,6 @@
#include <sys/types.h>
#include <sys/stat.h>
-#include <poll.h>
#include <sys/time.h>
#include <sys/wait.h>
#include <sys/uio.h>
@@ -87,15 +86,10 @@
#ifdef HAVE_FNMATCH_H
#include <fnmatch.h>
#endif
-#ifdef USE_SYSTEM_GLOB
-# include <glob.h>
-#else
-# include "openbsd-compat/glob.h"
-#endif
+#include <glob.h>
#include <libgen.h>
-#include <limits.h>
-#include <util.h>
#include <locale.h>
+#include <poll.h>
#include <pwd.h>
#include <signal.h>
#include <stdarg.h>
@@ -105,6 +99,8 @@
#include <string.h>
#include <time.h>
#include <unistd.h>
+#include <limits.h>
+#include <util.h>
#if defined(HAVE_STRNVIS) && defined(HAVE_VIS_H) && !defined(BROKEN_STRNVIS)
#include <vis.h>
#endif
@@ -216,7 +212,7 @@ suspchild(int signo)
static int
do_local_cmd(arglist *a)
{
- u_int i;
+ char *cp;
int status;
pid_t pid;
@@ -224,10 +220,9 @@ do_local_cmd(arglist *a)
fatal("do_local_cmd: no arguments");
if (verbose_mode) {
- fprintf(stderr, "Executing:");
- for (i = 0; i < a->num; i++)
- fmprintf(stderr, " %s", a->list[i]);
- fprintf(stderr, "\n");
+ cp = argv_assemble(a->num, a->list);
+ fmprintf(stderr, "Executing: %s\n", cp);
+ free(cp);
}
if ((pid = fork()) == -1)
fatal("do_local_cmd: fork: %s", strerror(errno));
@@ -970,7 +965,7 @@ brace_expand(const char *pattern, char ***patternsp, size_t *npatternsp)
continue;
}
/*
- * Pattern did not expand; append the finename component to
+ * Pattern did not expand; append the filename component to
* the completed list
*/
if ((cp2 = strrchr(cp, '/')) != NULL)
@@ -1340,6 +1335,10 @@ source_sftp(int argc, char *src, char *targ, struct sftp_conn *conn)
if ((filename = basename(src)) == NULL)
fatal("basename \"%s\": %s", src, strerror(errno));
+ /* Special handling for source of '..' */
+ if (strcmp(filename, "..") == 0)
+ filename = "."; /* Upload to dest, not dest/.. */
+
/*
* No need to glob here - the local shell already took care of
* the expansions
@@ -1613,6 +1612,10 @@ sink_sftp(int argc, char *dst, const char *src, struct sftp_conn *conn)
goto out;
}
+ /* Special handling for destination of '..' */
+ if (strcmp(filename, "..") == 0)
+ filename = "."; /* Download to dest, not dest/.. */
+
if (dst_is_dir)
abs_dst = sftp_path_append(dst, filename);
else
@@ -1675,8 +1678,10 @@ sink(int argc, char **argv, const char *src)
setimes = targisdir = 0;
mask = umask(0);
- if (!pflag)
+ if (!pflag) {
+ mask |= 07000;
(void) umask(mask);
+ }
if (argc != 1) {
run_err("ambiguous target");
exit(1);
diff --git a/servconf.c b/servconf.c
index 48ec8c4ecd43..668259a2074b 100644
--- a/servconf.c
+++ b/servconf.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: servconf.c,v 1.435 2025/09/25 06:31:42 djm Exp $ */
+/* $OpenBSD: servconf.c,v 1.446 2026/04/02 07:38:14 djm Exp $ */
/*
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
* All rights reserved
@@ -14,19 +14,20 @@
#include <sys/types.h>
#include <sys/socket.h>
+#include <sys/queue.h>
#include <sys/stat.h>
#ifdef __OpenBSD__
#include <sys/sysctl.h>
#endif
#include <netinet/in.h>
-#include <netinet/in_systm.h>
#include <netinet/ip.h>
#ifdef HAVE_NET_ROUTE_H
#include <net/route.h>
#endif
#include <ctype.h>
+#include <glob.h>
#include <netdb.h>
#include <pwd.h>
#include <stdio.h>
@@ -38,13 +39,7 @@
#include <stdarg.h>
#include <errno.h>
#include <util.h>
-#ifdef USE_SYSTEM_GLOB
-# include <glob.h>
-#else
-# include "openbsd-compat/glob.h"
-#endif
-#include "openbsd-compat/sys-queue.h"
#include "xmalloc.h"
#include "ssh.h"
#include "log.h"
@@ -137,6 +132,7 @@ initialize_server_options(ServerOptions *options)
options->kerberos_get_afs_token = -1;
options->gss_authentication=-1;
options->gss_cleanup_creds = -1;
+ options->gss_deleg_creds = -1;
options->gss_strict_acceptor = -1;
options->password_authentication = -1;
options->kbd_interactive_authentication = -1;
@@ -173,13 +169,14 @@ initialize_server_options(ServerOptions *options)
options->per_source_penalty.max_sources6 = -1;
options->per_source_penalty.overflow_mode = -1;
options->per_source_penalty.overflow_mode6 = -1;
- options->per_source_penalty.penalty_crash = -1;
- options->per_source_penalty.penalty_authfail = -1;
- options->per_source_penalty.penalty_noauth = -1;
- options->per_source_penalty.penalty_grace = -1;
- options->per_source_penalty.penalty_refuseconnection = -1;
- options->per_source_penalty.penalty_max = -1;
- options->per_source_penalty.penalty_min = -1;
+ options->per_source_penalty.penalty_crash = -1.0;
+ options->per_source_penalty.penalty_authfail = -1.0;
+ options->per_source_penalty.penalty_invaliduser = -1.0;
+ options->per_source_penalty.penalty_noauth = -1.0;
+ options->per_source_penalty.penalty_grace = -1.0;
+ options->per_source_penalty.penalty_refuseconnection = -1.0;
+ options->per_source_penalty.penalty_max = -1.0;
+ options->per_source_penalty.penalty_min = -1.0;
options->max_authtries = -1;
options->max_sessions = -1;
options->banner = NULL;
@@ -196,7 +193,8 @@ initialize_server_options(ServerOptions *options)
options->chroot_directory = NULL;
options->authorized_keys_command = NULL;
options->authorized_keys_command_user = NULL;
- options->revoked_keys_file = NULL;
+ options->revoked_keys_files = NULL;
+ options->num_revoked_keys_files = 0;
options->sk_provider = NULL;
options->trusted_user_ca_keys = NULL;
options->authorized_principals_file = NULL;
@@ -376,6 +374,8 @@ fill_default_server_options(ServerOptions *options)
options->gss_authentication = 0;
if (options->gss_cleanup_creds == -1)
options->gss_cleanup_creds = 1;
+ if (options->gss_deleg_creds == -1)
+ options->gss_deleg_creds = 1;
if (options->gss_strict_acceptor == -1)
options->gss_strict_acceptor = 1;
if (options->password_authentication == -1)
@@ -429,20 +429,22 @@ fill_default_server_options(ServerOptions *options)
options->per_source_penalty.overflow_mode = PER_SOURCE_PENALTY_OVERFLOW_PERMISSIVE;
if (options->per_source_penalty.overflow_mode6 == -1)
options->per_source_penalty.overflow_mode6 = options->per_source_penalty.overflow_mode;
- if (options->per_source_penalty.penalty_crash == -1)
- options->per_source_penalty.penalty_crash = 90;
- if (options->per_source_penalty.penalty_grace == -1)
- options->per_source_penalty.penalty_grace = 10;
- if (options->per_source_penalty.penalty_authfail == -1)
- options->per_source_penalty.penalty_authfail = 5;
- if (options->per_source_penalty.penalty_noauth == -1)
- options->per_source_penalty.penalty_noauth = 1;
- if (options->per_source_penalty.penalty_refuseconnection == -1)
- options->per_source_penalty.penalty_refuseconnection = 10;
- if (options->per_source_penalty.penalty_min == -1)
- options->per_source_penalty.penalty_min = 15;
- if (options->per_source_penalty.penalty_max == -1)
- options->per_source_penalty.penalty_max = 600;
+ if (options->per_source_penalty.penalty_crash < 0.0)
+ options->per_source_penalty.penalty_crash = 90.0;
+ if (options->per_source_penalty.penalty_grace < 0.0)
+ options->per_source_penalty.penalty_grace = 10.0;
+ if (options->per_source_penalty.penalty_authfail < 0.0)
+ options->per_source_penalty.penalty_authfail = 5.0;
+ if (options->per_source_penalty.penalty_invaliduser < 0.0)
+ options->per_source_penalty.penalty_invaliduser = 5.0;
+ if (options->per_source_penalty.penalty_noauth < 0.0)
+ options->per_source_penalty.penalty_noauth = 1.0;
+ if (options->per_source_penalty.penalty_refuseconnection < 0.0)
+ options->per_source_penalty.penalty_refuseconnection = 10.0;
+ if (options->per_source_penalty.penalty_min < 0.0)
+ options->per_source_penalty.penalty_min = 15.0;
+ if (options->per_source_penalty.penalty_max < 0.0)
+ options->per_source_penalty.penalty_max = 600.0;
if (options->max_authtries == -1)
options->max_authtries = DEFAULT_AUTH_FAIL_MAX;
if (options->max_sessions == -1)
@@ -517,7 +519,6 @@ fill_default_server_options(ServerOptions *options)
CLEAR_ON_NONE(options->xauth_location);
CLEAR_ON_NONE(options->banner);
CLEAR_ON_NONE(options->trusted_user_ca_keys);
- CLEAR_ON_NONE(options->revoked_keys_file);
CLEAR_ON_NONE(options->sk_provider);
CLEAR_ON_NONE(options->authorized_principals_file);
CLEAR_ON_NONE(options->adm_forced_command);
@@ -533,6 +534,8 @@ fill_default_server_options(ServerOptions *options)
CLEAR_ON_NONE_ARRAY(channel_timeouts, num_channel_timeouts, "none");
CLEAR_ON_NONE_ARRAY(auth_methods, num_auth_methods, "any");
+ CLEAR_ON_NONE_ARRAY(revoked_keys_files, num_revoked_keys_files, "none");
+ CLEAR_ON_NONE_ARRAY(authorized_keys_files, num_authkeys_files, "none");
#undef CLEAR_ON_NONE
#undef CLEAR_ON_NONE_ARRAY
}
@@ -561,7 +564,7 @@ typedef enum {
sHostKeyAlgorithms, sPerSourceMaxStartups, sPerSourceNetBlockSize,
sPerSourcePenalties, sPerSourcePenaltyExemptList,
sClientAliveInterval, sClientAliveCountMax, sAuthorizedKeysFile,
- sGssAuthentication, sGssCleanupCreds, sGssStrictAcceptor,
+ sGssAuthentication, sGssCleanupCreds, sGssDelegateCreds, sGssStrictAcceptor,
sAcceptEnv, sSetEnv, sPermitTunnel,
sMatch, sPermitOpen, sPermitListen, sForceCommand, sChrootDirectory,
sUsePrivilegeSeparation, sAllowAgentForwarding,
@@ -647,10 +650,12 @@ static struct {
#ifdef GSSAPI
{ "gssapiauthentication", sGssAuthentication, SSHCFG_ALL },
{ "gssapicleanupcredentials", sGssCleanupCreds, SSHCFG_GLOBAL },
+ { "gssapidelegatecredentials", sGssDelegateCreds, SSHCFG_GLOBAL },
{ "gssapistrictacceptorcheck", sGssStrictAcceptor, SSHCFG_GLOBAL },
#else
{ "gssapiauthentication", sUnsupported, SSHCFG_ALL },
{ "gssapicleanupcredentials", sUnsupported, SSHCFG_GLOBAL },
+ { "gssapidelegatecredentials", sUnsupported, SSHCFG_GLOBAL },
{ "gssapistrictacceptorcheck", sUnsupported, SSHCFG_GLOBAL },
#endif
{ "passwordauthentication", sPasswordAuthentication, SSHCFG_ALL },
@@ -1048,12 +1053,12 @@ match_cfg_line(const char *full_line, int *acp, char ***avp,
}
while ((oattrib = argv_next(acp, avp)) != NULL) {
- attrib = xstrdup(oattrib);
/* Terminate on comment */
- if (*attrib == '#') {
+ if (*oattrib == '#') {
argv_consume(acp); /* mark all arguments consumed */
break;
}
+ attrib = xstrdup(oattrib);
arg = NULL;
attributes++;
/* Criterion "all" has no argument and must appear alone */
@@ -1075,13 +1080,13 @@ match_cfg_line(const char *full_line, int *acp, char ***avp,
if (strcasecmp(attrib, "invalid-user") == 0) {
if (ci == NULL) {
result = 0;
- continue;
+ goto next;
}
if (ci->user_invalid == 0)
result = 0;
else
debug("matched invalid-user at line %d", line);
- continue;
+ goto next;
}
/* Keep this list in sync with below */
@@ -1108,7 +1113,7 @@ match_cfg_line(const char *full_line, int *acp, char ***avp,
if (strcasecmp(attrib, "user") == 0) {
if (ci == NULL || (ci->test && ci->user == NULL)) {
result = 0;
- continue;
+ goto next;
}
if (ci->user == NULL)
match_test_missing_fatal("User", "user");
@@ -1120,7 +1125,7 @@ match_cfg_line(const char *full_line, int *acp, char ***avp,
} else if (strcasecmp(attrib, "group") == 0) {
if (ci == NULL || (ci->test && ci->user == NULL)) {
result = 0;
- continue;
+ goto next;
}
if (ci->user == NULL)
match_test_missing_fatal("Group", "user");
@@ -1134,7 +1139,7 @@ match_cfg_line(const char *full_line, int *acp, char ***avp,
} else if (strcasecmp(attrib, "host") == 0) {
if (ci == NULL || (ci->test && ci->host == NULL)) {
result = 0;
- continue;
+ goto next;
}
if (ci->host == NULL)
match_test_missing_fatal("Host", "host");
@@ -1149,7 +1154,7 @@ match_cfg_line(const char *full_line, int *acp, char ***avp,
fatal("Invalid Match address argument "
"'%s' at line %d", arg, line);
result = 0;
- continue;
+ goto next;
}
if (ci->address == NULL)
match_test_missing_fatal("Address", "addr");
@@ -1173,7 +1178,7 @@ match_cfg_line(const char *full_line, int *acp, char ***avp,
"argument '%s' at line %d", arg,
line);
result = 0;
- continue;
+ goto next;
}
if (ci->laddress == NULL)
match_test_missing_fatal("LocalAddress",
@@ -1201,7 +1206,7 @@ match_cfg_line(const char *full_line, int *acp, char ***avp,
}
if (ci == NULL || (ci->test && ci->lport == -1)) {
result = 0;
- continue;
+ goto next;
}
if (ci->lport == 0)
match_test_missing_fatal("LocalPort", "lport");
@@ -1215,7 +1220,7 @@ match_cfg_line(const char *full_line, int *acp, char ***avp,
} else if (strcasecmp(attrib, "rdomain") == 0) {
if (ci == NULL || (ci->test && ci->rdomain == NULL)) {
result = 0;
- continue;
+ goto next;
}
if (ci->rdomain == NULL)
match_test_missing_fatal("RDomain", "rdomain");
@@ -1237,6 +1242,7 @@ match_cfg_line(const char *full_line, int *acp, char ***avp,
result = -1;
goto out;
}
+ next:
free(attrib);
attrib = NULL;
}
@@ -1314,6 +1320,7 @@ process_server_config_line_depth(ServerOptions *options, char *line,
{
char *str, ***chararrayptr, **charptr, *arg, *arg2, *p, *keyword;
int cmdline = 0, *intptr, value, value2, value3, n, port, oactive, r;
+ double dvalue, *doubleptr = NULL;
int ca_only = 0, found = 0;
SyslogFacility *log_facility_ptr;
LogLevel *log_level_ptr;
@@ -1647,6 +1654,10 @@ process_server_config_line_depth(ServerOptions *options, char *line,
intptr = &options->gss_cleanup_creds;
goto parse_flag;
+ case sGssDelegateCreds:
+ intptr = &options->gss_deleg_creds;
+ goto parse_flag;
+
case sGssStrictAcceptor:
intptr = &options->gss_strict_acceptor;
goto parse_flag;
@@ -1944,8 +1955,8 @@ process_server_config_line_depth(ServerOptions *options, char *line,
break;
case sSubsystem:
- arg = argv_next(&ac, &av);
- if (!arg || *arg == '\0')
+ if ((arg = argv_next(&ac, &av)) == NULL || *arg == '\0' ||
+ ((arg2 = argv_next(&ac, &av)) == NULL || *arg2 == '\0'))
fatal("%s line %d: %s missing argument.",
filename, linenum, keyword);
if (!*activep) {
@@ -1978,15 +1989,10 @@ process_server_config_line_depth(ServerOptions *options, char *line,
options->num_subsystems + 1,
sizeof(*options->subsystem_args));
options->subsystem_name[options->num_subsystems] = xstrdup(arg);
- arg = argv_next(&ac, &av);
- if (!arg || *arg == '\0') {
- fatal("%s line %d: Missing subsystem command.",
- filename, linenum);
- }
options->subsystem_command[options->num_subsystems] =
- xstrdup(arg);
+ xstrdup(arg2);
/* Collect arguments (separate to executable) */
- arg = argv_assemble(1, &arg); /* quote command correctly */
+ arg = argv_assemble(1, &arg2); /* quote command correctly */
arg2 = argv_assemble(ac, av); /* rest of command */
xasprintf(&options->subsystem_args[options->num_subsystems],
"%s%s%s", arg, *arg2 == '\0' ? "" : " ", arg2);
@@ -2009,12 +2015,12 @@ process_server_config_line_depth(ServerOptions *options, char *line,
filename, linenum, keyword);
} else if (n == 1) {
value3 = value;
- value = value2 = -1;
+ value2 = -1;
} else {
fatal("%s line %d: Invalid %s spec.",
filename, linenum, keyword);
}
- if (value3 <= 0 || (value2 != -1 && value <= 0))
+ if (value <= 0 || value3 <= 0)
fatal("%s line %d: Invalid %s spec.",
filename, linenum, keyword);
if (*activep && options->max_startups == -1) {
@@ -2043,7 +2049,8 @@ process_server_config_line_depth(ServerOptions *options, char *line,
filename, linenum, keyword);
if (*activep && options->per_source_masklen_ipv4 == -1) {
options->per_source_masklen_ipv4 = value;
- options->per_source_masklen_ipv6 = value2;
+ if (n == 2)
+ options->per_source_masklen_ipv6 = value2;
}
break;
@@ -2083,6 +2090,8 @@ process_server_config_line_depth(ServerOptions *options, char *line,
const char *q = NULL;
found = 1;
+ intptr = NULL;
+ doubleptr = NULL;
value = -1;
value2 = 0;
/* Allow no/yes only in first position */
@@ -2098,19 +2107,21 @@ process_server_config_line_depth(ServerOptions *options, char *line,
options->per_source_penalty.enabled = value2;
continue;
} else if ((q = strprefix(arg, "crash:", 0)) != NULL) {
- intptr = &options->per_source_penalty.penalty_crash;
+ doubleptr = &options->per_source_penalty.penalty_crash;
} else if ((q = strprefix(arg, "authfail:", 0)) != NULL) {
- intptr = &options->per_source_penalty.penalty_authfail;
+ doubleptr = &options->per_source_penalty.penalty_authfail;
+ } else if ((q = strprefix(arg, "invaliduser:", 0)) != NULL) {
+ doubleptr = &options->per_source_penalty.penalty_invaliduser;
} else if ((q = strprefix(arg, "noauth:", 0)) != NULL) {
- intptr = &options->per_source_penalty.penalty_noauth;
+ doubleptr = &options->per_source_penalty.penalty_noauth;
} else if ((q = strprefix(arg, "grace-exceeded:", 0)) != NULL) {
- intptr = &options->per_source_penalty.penalty_grace;
+ doubleptr = &options->per_source_penalty.penalty_grace;
} else if ((q = strprefix(arg, "refuseconnection:", 0)) != NULL) {
- intptr = &options->per_source_penalty.penalty_refuseconnection;
+ doubleptr = &options->per_source_penalty.penalty_refuseconnection;
} else if ((q = strprefix(arg, "max:", 0)) != NULL) {
- intptr = &options->per_source_penalty.penalty_max;
+ doubleptr = &options->per_source_penalty.penalty_max;
} else if ((q = strprefix(arg, "min:", 0)) != NULL) {
- intptr = &options->per_source_penalty.penalty_min;
+ doubleptr = &options->per_source_penalty.penalty_min;
} else if ((q = strprefix(arg, "max-sources4:", 0)) != NULL) {
intptr = &options->per_source_penalty.max_sources4;
if ((errstr = atoi_err(q, &value)) != NULL)
@@ -2137,15 +2148,24 @@ process_server_config_line_depth(ServerOptions *options, char *line,
fatal("%s line %d: unsupported %s keyword %s",
filename, linenum, keyword, arg);
}
- /* If no value was parsed above, assume it's a time */
- if (value == -1 && (value = convtime(q)) == -1) {
- fatal("%s line %d: invalid %s time value.",
- filename, linenum, keyword);
- }
- if (*activep && *intptr == -1) {
- *intptr = value;
- /* any option implicitly enables penalties */
- options->per_source_penalty.enabled = 1;
+
+ if (doubleptr != NULL) {
+ if ((dvalue = convtime_double(q)) < 0) {
+ fatal("%s line %d: invalid %s time value.",
+ filename, linenum, keyword);
+ }
+ if (*activep && *doubleptr < 0.0) {
+ *doubleptr = dvalue;
+ options->per_source_penalty.enabled = 1;
+ }
+ } else if (intptr != NULL) {
+ if (*activep && *intptr == -1) {
+ *intptr = value;
+ options->per_source_penalty.enabled = 1;
+ }
+ } else {
+ fatal_f("%s line %d: internal error",
+ filename, linenum);
}
}
if (!found) {
@@ -2173,13 +2193,25 @@ process_server_config_line_depth(ServerOptions *options, char *line,
* AuthorizedKeysFile /etc/ssh_keys/%u
*/
case sAuthorizedKeysFile:
- found = options->num_authkeys_files == 0;
+ uintptr = &options->num_authkeys_files;
+ chararrayptr = &options->authorized_keys_files;
+ parse_filenames:
+ found = *uintptr == 0;
while ((arg = argv_next(&ac, &av)) != NULL) {
if (*arg == '\0') {
error("%s line %d: keyword %s empty argument",
filename, linenum, keyword);
goto out;
}
+ /* Allow "none" only in first position */
+ if (strcasecmp(arg, "none") == 0) {
+ if (nstrs > 0 || ac > 0) {
+ error("%s line %d: keyword %s \"none\" "
+ "argument must appear alone.",
+ filename, linenum, keyword);
+ goto out;
+ }
+ }
arg2 = tilde_expand_filename(arg, getuid());
opt_array_append(filename, linenum, keyword,
&strs, &nstrs, arg2);
@@ -2190,8 +2222,8 @@ process_server_config_line_depth(ServerOptions *options, char *line,
filename, linenum, keyword);
}
if (found && *activep) {
- options->authorized_keys_files = strs;
- options->num_authkeys_files = nstrs;
+ *chararrayptr = strs;
+ *uintptr = nstrs;
strs = NULL; /* transferred */
nstrs = 0;
}
@@ -2482,8 +2514,9 @@ process_server_config_line_depth(ServerOptions *options, char *line,
goto parse_filename;
case sRevokedKeys:
- charptr = &options->revoked_keys_file;
- goto parse_filename;
+ uintptr = &options->num_revoked_keys_files;
+ chararrayptr = &options->revoked_keys_files;
+ goto parse_filenames;
case sSecurityKeyProvider:
charptr = &options->sk_provider;
@@ -2526,7 +2559,7 @@ process_server_config_line_depth(ServerOptions *options, char *line,
" using DSCP values.", filename, linenum, arg);
value2 = INT_MAX;
}
- if (*activep) {
+ if (*activep && options->ip_qos_interactive == -1) {
options->ip_qos_interactive = value;
options->ip_qos_bulk = value2;
}
@@ -2969,7 +3002,7 @@ copy_set_server_options(ServerOptions *dst, ServerOptions *src, int preauth)
dst->n = xstrdup(src->n); \
} \
} while(0)
-#define M_CP_STRARRAYOPT(s, num_s) do {\
+#define M_CP_STRARRAYOPT(s, num_s, clobber) do {\
u_int i; \
if (src->num_s != 0) { \
for (i = 0; i < dst->num_s; i++) \
@@ -2978,7 +3011,8 @@ copy_set_server_options(ServerOptions *dst, ServerOptions *src, int preauth)
dst->s = xcalloc(src->num_s, sizeof(*dst->s)); \
for (i = 0; i < src->num_s; i++) \
dst->s[i] = xstrdup(src->s[i]); \
- dst->num_s = src->num_s; \
+ if (clobber) \
+ dst->num_s = src->num_s; \
} \
} while(0)
@@ -3256,6 +3290,7 @@ dump_config(ServerOptions *o)
#ifdef GSSAPI
dump_cfg_fmtint(sGssAuthentication, o->gss_authentication);
dump_cfg_fmtint(sGssCleanupCreds, o->gss_cleanup_creds);
+ dump_cfg_fmtint(sGssDelegateCreds, o->gss_deleg_creds);
dump_cfg_fmtint(sGssStrictAcceptor, o->gss_strict_acceptor);
#endif
dump_cfg_fmtint(sPasswordAuthentication, o->password_authentication);
@@ -3294,7 +3329,6 @@ dump_config(ServerOptions *o)
dump_cfg_string(sForceCommand, o->adm_forced_command);
dump_cfg_string(sChrootDirectory, o->chroot_directory);
dump_cfg_string(sTrustedUserCAKeys, o->trusted_user_ca_keys);
- dump_cfg_string(sRevokedKeys, o->revoked_keys_file);
dump_cfg_string(sSecurityKeyProvider, o->sk_provider);
dump_cfg_string(sAuthorizedPrincipalsFile,
o->authorized_principals_file);
@@ -3324,6 +3358,8 @@ dump_config(ServerOptions *o)
/* string array arguments */
dump_cfg_strarray_oneline(sAuthorizedKeysFile, o->num_authkeys_files,
o->authorized_keys_files);
+ dump_cfg_strarray_oneline(sRevokedKeys, o->num_revoked_keys_files,
+ o->revoked_keys_files);
dump_cfg_strarray(sHostKeyFile, o->num_host_key_files,
o->host_key_files);
dump_cfg_strarray(sHostCertificate, o->num_host_cert_files,
@@ -3405,13 +3441,15 @@ dump_config(ServerOptions *o)
printf("\n");
if (o->per_source_penalty.enabled) {
- printf("persourcepenalties crash:%d authfail:%d noauth:%d "
- "grace-exceeded:%d refuseconnection:%d max:%d min:%d "
+ printf("persourcepenalties crash:%f authfail:%f noauth:%f "
+ "invaliduser:%f "
+ "grace-exceeded:%f refuseconnection:%f max:%f min:%f "
"max-sources4:%d max-sources6:%d "
"overflow:%s overflow6:%s\n",
o->per_source_penalty.penalty_crash,
o->per_source_penalty.penalty_authfail,
o->per_source_penalty.penalty_noauth,
+ o->per_source_penalty.penalty_invaliduser,
o->per_source_penalty.penalty_grace,
o->per_source_penalty.penalty_refuseconnection,
o->per_source_penalty.penalty_max,
diff --git a/servconf.h b/servconf.h
index 9beb90fae3da..b06db09e1090 100644
--- a/servconf.h
+++ b/servconf.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: servconf.h,v 1.168 2024/09/15 01:18:26 djm Exp $ */
+/* $OpenBSD: servconf.h,v 1.176 2026/03/03 09:57:25 dtucker Exp $ */
/*
* Author: Tatu Ylonen <ylo@cs.hut.fi>
@@ -16,7 +16,7 @@
#ifndef SERVCONF_H
#define SERVCONF_H
-#include <openbsd-compat/sys-queue.h>
+#include <sys/queue.h>
#define MAX_PORTS 256 /* Max # ports. */
@@ -73,13 +73,14 @@ struct per_source_penalty {
int max_sources6;
int overflow_mode;
int overflow_mode6;
- int penalty_crash;
- int penalty_grace;
- int penalty_authfail;
- int penalty_noauth;
- int penalty_refuseconnection;
- int penalty_max;
- int penalty_min;
+ double penalty_crash;
+ double penalty_grace;
+ double penalty_authfail;
+ double penalty_invaliduser;
+ double penalty_noauth;
+ double penalty_refuseconnection;
+ double penalty_max;
+ double penalty_min;
};
typedef struct {
@@ -151,6 +152,7 @@ typedef struct {
* authenticated with Kerberos. */
int gss_authentication; /* If true, permit GSSAPI authentication */
int gss_cleanup_creds; /* If true, destroy cred cache on logout */
+ int gss_deleg_creds; /* If true, accept delegated GSS credentials */
int gss_strict_acceptor; /* If true, restrict the GSSAPI acceptor name */
int password_authentication; /* If true, permit password
* authentication. */
@@ -221,7 +223,8 @@ typedef struct {
u_int num_permitted_listens;
char *chroot_directory;
- char *revoked_keys_file;
+ uint num_revoked_keys_files;
+ char **revoked_keys_files;
char *trusted_user_ca_keys;
char *authorized_keys_command;
char *authorized_keys_command_user;
@@ -239,7 +242,7 @@ typedef struct {
int fingerprint_hash;
int expose_userauth_info;
- u_int64_t timing_secret;
+ uint64_t timing_secret;
char *sk_provider;
int required_rsa_size; /* minimum size of RSA keys */
@@ -289,7 +292,6 @@ TAILQ_HEAD(include_list, include_item);
#define COPY_MATCH_STRING_OPTS() do { \
M_CP_STROPT(banner); \
M_CP_STROPT(trusted_user_ca_keys); \
- M_CP_STROPT(revoked_keys_file); \
M_CP_STROPT(authorized_keys_command); \
M_CP_STROPT(authorized_keys_command_user); \
M_CP_STROPT(authorized_principals_file); \
@@ -301,21 +303,24 @@ TAILQ_HEAD(include_list, include_item);
M_CP_STROPT(routing_domain); \
M_CP_STROPT(permit_user_env_allowlist); \
M_CP_STROPT(pam_service_name); \
- M_CP_STRARRAYOPT(authorized_keys_files, num_authkeys_files); \
- M_CP_STRARRAYOPT(allow_users, num_allow_users); \
- M_CP_STRARRAYOPT(deny_users, num_deny_users); \
- M_CP_STRARRAYOPT(allow_groups, num_allow_groups); \
- M_CP_STRARRAYOPT(deny_groups, num_deny_groups); \
- M_CP_STRARRAYOPT(accept_env, num_accept_env); \
- M_CP_STRARRAYOPT(setenv, num_setenv); \
- M_CP_STRARRAYOPT(auth_methods, num_auth_methods); \
- M_CP_STRARRAYOPT(permitted_opens, num_permitted_opens); \
- M_CP_STRARRAYOPT(permitted_listens, num_permitted_listens); \
- M_CP_STRARRAYOPT(channel_timeouts, num_channel_timeouts); \
- M_CP_STRARRAYOPT(log_verbose, num_log_verbose); \
- M_CP_STRARRAYOPT(subsystem_name, num_subsystems); \
- M_CP_STRARRAYOPT(subsystem_command, num_subsystems); \
- M_CP_STRARRAYOPT(subsystem_args, num_subsystems); \
+ M_CP_STRARRAYOPT(authorized_keys_files, num_authkeys_files, 1);\
+ M_CP_STRARRAYOPT(revoked_keys_files, \
+ num_revoked_keys_files, 1); \
+ M_CP_STRARRAYOPT(allow_users, num_allow_users, 1); \
+ M_CP_STRARRAYOPT(deny_users, num_deny_users, 1); \
+ M_CP_STRARRAYOPT(allow_groups, num_allow_groups, 1); \
+ M_CP_STRARRAYOPT(deny_groups, num_deny_groups, 1); \
+ M_CP_STRARRAYOPT(accept_env, num_accept_env, 1); \
+ M_CP_STRARRAYOPT(setenv, num_setenv, 1); \
+ M_CP_STRARRAYOPT(auth_methods, num_auth_methods, 1); \
+ M_CP_STRARRAYOPT(permitted_opens, num_permitted_opens, 1); \
+ M_CP_STRARRAYOPT(permitted_listens, num_permitted_listens, 1); \
+ M_CP_STRARRAYOPT(channel_timeouts, num_channel_timeouts, 1); \
+ M_CP_STRARRAYOPT(log_verbose, num_log_verbose, 1); \
+ /* Note: don't clobber num_subsystems until all copied */ \
+ M_CP_STRARRAYOPT(subsystem_name, num_subsystems, 0); \
+ M_CP_STRARRAYOPT(subsystem_command, num_subsystems, 0); \
+ M_CP_STRARRAYOPT(subsystem_args, num_subsystems, 1); \
} while (0)
void initialize_server_options(ServerOptions *);
diff --git a/serverloop.c b/serverloop.c
index 5d3b194d128f..8e63480ecefa 100644
--- a/serverloop.c
+++ b/serverloop.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: serverloop.c,v 1.244 2025/09/25 06:23:19 jsg Exp $ */
+/* $OpenBSD: serverloop.c,v 1.246 2026/03/03 09:57:25 dtucker Exp $ */
/*
* Author: Tatu Ylonen <ylo@cs.hut.fi>
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -41,6 +41,7 @@
#include <sys/wait.h>
#include <sys/socket.h>
#include <sys/time.h>
+#include <sys/queue.h>
#include <netinet/in.h>
@@ -55,7 +56,6 @@
#include <unistd.h>
#include <stdarg.h>
-#include "openbsd-compat/sys-queue.h"
#include "xmalloc.h"
#include "packet.h"
#include "sshbuf.h"
@@ -178,12 +178,15 @@ wait_until_can_do_something(struct ssh *ssh,
* start the clock to terminate the connection.
*/
if (options.unused_connection_timeout != 0) {
- if (channel_still_open(ssh) || unused_connection_expiry == 0) {
+ if (channel_still_open(ssh))
+ unused_connection_expiry = 0;
+ else if (unused_connection_expiry == 0) {
unused_connection_expiry = now +
options.unused_connection_timeout;
}
- ptimeout_deadline_monotime(&timeout, unused_connection_expiry);
}
+ if (unused_connection_expiry != 0)
+ ptimeout_deadline_monotime(&timeout, unused_connection_expiry);
/*
* if using client_alive, set the max timeout accordingly,
@@ -399,7 +402,7 @@ server_loop2(struct ssh *ssh, Authctxt *authctxt)
}
static int
-server_input_keep_alive(int type, u_int32_t seq, struct ssh *ssh)
+server_input_keep_alive(int type, uint32_t seq, struct ssh *ssh)
{
debug("Got %d/%u for keepalive", type, seq);
/*
@@ -605,7 +608,7 @@ server_request_session(struct ssh *ssh)
}
static int
-server_input_channel_open(int type, u_int32_t seq, struct ssh *ssh)
+server_input_channel_open(int type, uint32_t seq, struct ssh *ssh)
{
Channel *c = NULL;
char *ctype = NULL;
@@ -749,7 +752,7 @@ server_input_hostkeys_prove(struct ssh *ssh, struct sshbuf **respp)
}
static int
-server_input_global_request(int type, u_int32_t seq, struct ssh *ssh)
+server_input_global_request(int type, uint32_t seq, struct ssh *ssh)
{
char *rtype = NULL;
u_char want_reply = 0;
@@ -854,7 +857,7 @@ server_input_global_request(int type, u_int32_t seq, struct ssh *ssh)
}
static int
-server_input_channel_req(int type, u_int32_t seq, struct ssh *ssh)
+server_input_channel_req(int type, uint32_t seq, struct ssh *ssh)
{
Channel *c;
int r, success = 0;
diff --git a/session.c b/session.c
index f265fdc3ed3b..93de35d7c5e3 100644
--- a/session.c
+++ b/session.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: session.c,v 1.344 2025/09/25 02:15:39 jsg Exp $ */
+/* $OpenBSD: session.c,v 1.348 2026/03/05 05:40:36 djm Exp $ */
/*
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
* All rights reserved
@@ -36,10 +36,11 @@
#include "includes.h"
#include <sys/types.h>
+#include <sys/wait.h>
+#include <sys/un.h>
#include <sys/stat.h>
#include <sys/socket.h>
-#include <sys/un.h>
-#include <sys/wait.h>
+#include <sys/queue.h>
#include <arpa/inet.h>
@@ -58,7 +59,6 @@
#include <unistd.h>
#include <limits.h>
-#include "openbsd-compat/sys-queue.h"
#include "xmalloc.h"
#include "ssh.h"
#include "ssh2.h"
@@ -183,7 +183,7 @@ auth_sock_cleanup_proc(struct passwd *pw)
}
static int
-auth_input_request_forwarding(struct ssh *ssh, struct passwd * pw)
+auth_input_request_forwarding(struct ssh *ssh, struct passwd *pw, int agent_new)
{
Channel *nc;
int sock = -1;
@@ -211,6 +211,7 @@ auth_input_request_forwarding(struct ssh *ssh, struct passwd * pw)
CHAN_X11_WINDOW_DEFAULT, CHAN_X11_PACKET_DEFAULT,
0, "auth socket", 1);
nc->path = xstrdup(auth_sock_name);
+ nc->agent_new = agent_new;
return 1;
authsock_err:
@@ -314,7 +315,7 @@ do_authenticated(struct ssh *ssh, Authctxt *authctxt)
auth_log_authopts("active", auth_opts, 0);
- /* setup the channel layer */
+ /* set up the channel layer */
/* XXX - streamlocal? */
set_fwdpermit_from_authopts(ssh, auth_opts);
@@ -1012,6 +1013,12 @@ do_setup_env(struct ssh *ssh, Session *s, const char *shell)
if (getenv("TZ"))
child_set_env(&env, &envsize, "TZ", getenv("TZ"));
+#ifdef HAVE_LOGIN_CAP
+ if (getenv("XDG_RUNTIME_DIR")) {
+ child_set_env(&env, &envsize, "XDG_RUNTIME_DIR",
+ getenv("XDG_RUNTIME_DIR"));
+ }
+#endif /* HAVE_LOGIN_CAP */
if (s->term)
child_set_env(&env, &envsize, "TERM", s->term);
if (s->display)
@@ -2125,7 +2132,7 @@ session_signal_req(struct ssh *ssh, Session *s)
}
static int
-session_auth_agent_req(struct ssh *ssh, Session *s)
+session_auth_agent_req(struct ssh *ssh, Session *s, int agent_new)
{
static int called = 0;
int r;
@@ -2138,12 +2145,11 @@ session_auth_agent_req(struct ssh *ssh, Session *s)
debug_f("agent forwarding disabled");
return 0;
}
- if (called) {
+ if (called)
return 0;
- } else {
- called = 1;
- return auth_input_request_forwarding(ssh, s->pw);
- }
+
+ called = 1;
+ return auth_input_request_forwarding(ssh, s->pw, agent_new);
}
int
@@ -2172,7 +2178,9 @@ session_input_channel_req(struct ssh *ssh, Channel *c, const char *rtype)
} else if (strcmp(rtype, "x11-req") == 0) {
success = session_x11_req(ssh, s);
} else if (strcmp(rtype, "auth-agent-req@openssh.com") == 0) {
- success = session_auth_agent_req(ssh, s);
+ success = session_auth_agent_req(ssh, s, 0);
+ } else if (strcmp(rtype, "agent-req") == 0) {
+ success = session_auth_agent_req(ssh, s, 1);
} else if (strcmp(rtype, "subsystem") == 0) {
success = session_subsystem_req(ssh, s);
} else if (strcmp(rtype, "env") == 0) {
diff --git a/sftp-client.c b/sftp-client.c
index 840170ab63e3..69ef28cdc16b 100644
--- a/sftp-client.c
+++ b/sftp-client.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sftp-client.c,v 1.180 2025/09/30 00:10:42 djm Exp $ */
+/* $OpenBSD: sftp-client.c,v 1.185 2026/03/03 09:57:25 dtucker Exp $ */
/*
* Copyright (c) 2001-2004 Damien Miller <djm@openbsd.org>
*
@@ -23,18 +23,16 @@
#include "includes.h"
#include <sys/types.h>
-#ifdef HAVE_SYS_STATVFS_H
-#include <sys/statvfs.h>
-#endif
-#include "openbsd-compat/sys-queue.h"
+#include <sys/queue.h>
#include <sys/stat.h>
#include <sys/time.h>
+#include <sys/statvfs.h>
#include <sys/uio.h>
#include <dirent.h>
#include <errno.h>
-#include <poll.h>
#include <fcntl.h>
+#include <poll.h>
#include <signal.h>
#include <stdarg.h>
#include <stdio.h>
@@ -96,7 +94,7 @@ struct sftp_conn {
#define SFTP_EXT_COPY_DATA 0x00000100
#define SFTP_EXT_GETUSERSGROUPS_BY_ID 0x00000200
u_int exts;
- u_int64_t limit_kbps;
+ uint64_t limit_kbps;
struct bwlimit bwlimit_in, bwlimit_out;
};
@@ -104,7 +102,7 @@ struct sftp_conn {
struct request {
u_int id;
size_t len;
- u_int64_t offset;
+ uint64_t offset;
TAILQ_ENTRY(request) tq;
};
TAILQ_HEAD(requests, request);
@@ -390,7 +388,7 @@ get_decode_statvfs(struct sftp_conn *conn, struct sftp_statvfs *st,
struct sshbuf *msg;
u_char type;
u_int id;
- u_int64_t flag;
+ uint64_t flag;
int r;
if ((msg = sshbuf_new()) == NULL)
@@ -444,7 +442,7 @@ get_decode_statvfs(struct sftp_conn *conn, struct sftp_statvfs *st,
struct sftp_conn *
sftp_init(int fd_in, int fd_out, u_int transfer_buflen, u_int num_requests,
- u_int64_t limit_kbps)
+ uint64_t limit_kbps)
{
u_char type;
struct sshbuf *msg;
@@ -571,17 +569,6 @@ sftp_init(int fd_in, int fd_out, u_int transfer_buflen, u_int num_requests,
(unsigned long long)limits.read_length,
ret->upload_buflen, ret->download_buflen);
}
-
- /* Use the server limit to scale down our value only */
- if (num_requests == 0 && limits.open_handles) {
- ret->num_requests =
- MINIMUM(DEFAULT_NUM_REQUESTS, limits.open_handles);
- if (ret->num_requests == 0)
- ret->num_requests = 1;
- debug3("server handle limit %llu; using %u",
- (unsigned long long)limits.open_handles,
- ret->num_requests);
- }
}
/* Some filexfer v.0 servers don't support large packets */
@@ -1517,7 +1504,7 @@ sftp_lsetstat(struct sftp_conn *conn, const char *path, Attrib *a)
}
static void
-send_read_request(struct sftp_conn *conn, u_int id, u_int64_t offset,
+send_read_request(struct sftp_conn *conn, u_int id, uint64_t offset,
u_int len, const u_char *handle, u_int handle_len)
{
struct sshbuf *msg;
@@ -1600,7 +1587,7 @@ sftp_download(struct sftp_conn *conn, const char *remote_path,
u_char *handle;
int local_fd = -1, write_error;
int read_error, write_errno, lmodified = 0, reordered = 0, r;
- u_int64_t offset = 0, size, highwater = 0, maxack = 0;
+ uint64_t offset = 0, size, highwater = 0, maxack = 0;
u_int mode, id, buflen, num_req, max_req, status = SSH2_FX_OK;
off_t progress_counter;
size_t handle_len;
@@ -1661,7 +1648,7 @@ sftp_download(struct sftp_conn *conn, const char *remote_path,
error("\"%s\" has negative size", local_path);
goto fail;
}
- if ((u_int64_t)st.st_size > size) {
+ if ((uint64_t)st.st_size > size) {
error("Unable to resume download of \"%s\": "
"local file is larger than remote", local_path);
fail:
@@ -2038,8 +2025,8 @@ sftp_upload(struct sftp_conn *conn, const char *local_path,
struct sshbuf *msg;
struct stat sb;
Attrib a, t, c;
- u_int32_t startid, ackid;
- u_int64_t highwater = 0, maxack = 0;
+ uint32_t startid, ackid;
+ uint64_t highwater = 0, maxack = 0;
struct request *ack = NULL;
struct requests acks;
size_t handle_len;
@@ -2252,13 +2239,13 @@ upload_dir_internal(struct sftp_conn *conn, const char *src, const char *dst,
int depth, int preserve_flag, int print_flag, int resume, int fsync_flag,
int follow_link_flag, int inplace_flag)
{
- int ret = 0;
+ int created = 0, ret = 0;
DIR *dirp;
struct dirent *dp;
char *filename, *new_src = NULL, *new_dst = NULL;
struct stat sb;
Attrib a, dirattrib;
- u_int32_t saved_perm;
+ uint32_t saved_perm;
debug2_f("upload local dir \"%s\" to remote \"%s\"", src, dst);
@@ -2293,7 +2280,9 @@ upload_dir_internal(struct sftp_conn *conn, const char *src, const char *dst,
*/
saved_perm = a.perm;
a.perm |= (S_IWUSR|S_IXUSR);
- if (sftp_mkdir(conn, dst, &a, 0) != 0) {
+ if (sftp_mkdir(conn, dst, &a, 0) == 0)
+ created = 1;
+ else {
if (sftp_stat(conn, dst, 0, &dirattrib) != 0)
return -1;
if (!S_ISDIR(dirattrib.perm)) {
@@ -2357,7 +2346,8 @@ upload_dir_internal(struct sftp_conn *conn, const char *src, const char *dst,
free(new_dst);
free(new_src);
- sftp_setstat(conn, dst, &a);
+ if (created || preserve_flag)
+ sftp_setstat(conn, dst, &a);
(void) closedir(dirp);
return ret;
@@ -2457,7 +2447,7 @@ sftp_crossload(struct sftp_conn *from, struct sftp_conn *to,
{
struct sshbuf *msg;
int write_error, read_error, r;
- u_int64_t offset = 0, size;
+ uint64_t offset = 0, size;
u_int id, buflen, num_req, max_req, status = SSH2_FX_OK;
u_int num_upload_req;
off_t progress_counter;
@@ -2703,7 +2693,7 @@ crossload_dir_internal(struct sftp_conn *from, struct sftp_conn *to,
int depth, Attrib *dirattrib, int preserve_flag, int print_flag,
int follow_link_flag)
{
- int i, ret = 0;
+ int i, ret = 0, created = 0;
SFTP_DIRENT **dir_entries;
char *filename, *new_from_path = NULL, *new_to_path = NULL;
mode_t mode = 0777;
@@ -2749,7 +2739,9 @@ crossload_dir_internal(struct sftp_conn *from, struct sftp_conn *to,
* the path already existed and is a directory. Ensure we can
* write to the directory we create for the duration of the transfer.
*/
- if (sftp_mkdir(to, to_path, &curdir, 0) != 0) {
+ if (sftp_mkdir(to, to_path, &curdir, 0) == 0)
+ created = 1;
+ else {
if (sftp_stat(to, to_path, 0, &newdir) != 0)
return -1;
if (!S_ISDIR(newdir.perm)) {
@@ -2811,7 +2803,8 @@ crossload_dir_internal(struct sftp_conn *from, struct sftp_conn *to,
free(new_to_path);
free(new_from_path);
- sftp_setstat(to, to_path, &curdir);
+ if (created || preserve_flag)
+ sftp_setstat(to, to_path, &curdir);
sftp_free_dirents(dir_entries);
diff --git a/sftp-client.h b/sftp-client.h
index 873ad3849f5b..cc8e202980ba 100644
--- a/sftp-client.h
+++ b/sftp-client.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: sftp-client.h,v 1.40 2025/09/15 05:17:37 djm Exp $ */
+/* $OpenBSD: sftp-client.h,v 1.41 2026/03/03 09:57:25 dtucker Exp $ */
/*
* Copyright (c) 2001-2004 Damien Miller <djm@openbsd.org>
@@ -21,12 +21,6 @@
#ifndef _SFTP_CLIENT_H
#define _SFTP_CLIENT_H
-#ifdef USE_SYSTEM_GLOB
-# include <glob.h>
-#else
-# include "openbsd-compat/glob.h"
-#endif
-
typedef struct SFTP_DIRENT SFTP_DIRENT;
struct SFTP_DIRENT {
@@ -40,25 +34,25 @@ struct SFTP_DIRENT {
* server's native format may be larger than the client's.
*/
struct sftp_statvfs {
- u_int64_t f_bsize;
- u_int64_t f_frsize;
- u_int64_t f_blocks;
- u_int64_t f_bfree;
- u_int64_t f_bavail;
- u_int64_t f_files;
- u_int64_t f_ffree;
- u_int64_t f_favail;
- u_int64_t f_fsid;
- u_int64_t f_flag;
- u_int64_t f_namemax;
+ uint64_t f_bsize;
+ uint64_t f_frsize;
+ uint64_t f_blocks;
+ uint64_t f_bfree;
+ uint64_t f_bavail;
+ uint64_t f_files;
+ uint64_t f_ffree;
+ uint64_t f_favail;
+ uint64_t f_fsid;
+ uint64_t f_flag;
+ uint64_t f_namemax;
};
/* Used for limits response on the wire from the server */
struct sftp_limits {
- u_int64_t packet_length;
- u_int64_t read_length;
- u_int64_t write_length;
- u_int64_t open_handles;
+ uint64_t packet_length;
+ uint64_t read_length;
+ uint64_t write_length;
+ uint64_t open_handles;
};
/* print flag values */
@@ -70,7 +64,7 @@ struct sftp_limits {
* Initialise a SSH filexfer connection. Returns NULL on error or
* a pointer to a initialized sftp_conn struct on success.
*/
-struct sftp_conn *sftp_init(int, int, u_int, u_int, u_int64_t);
+struct sftp_conn *sftp_init(int, int, u_int, u_int, uint64_t);
void sftp_free(struct sftp_conn *);
u_int sftp_proto_version(struct sftp_conn *);
diff --git a/sftp-common.c b/sftp-common.c
index 4abd54a07a1a..eb5cc2b8212d 100644
--- a/sftp-common.c
+++ b/sftp-common.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sftp-common.c,v 1.34 2023/03/31 04:00:37 djm Exp $ */
+/* $OpenBSD: sftp-common.c,v 1.36 2026/02/11 17:05:32 dtucker Exp $ */
/*
* Copyright (c) 2001 Markus Friedl. All rights reserved.
* Copyright (c) 2001 Damien Miller. All rights reserved.
@@ -32,10 +32,10 @@
#include <grp.h>
#include <pwd.h>
#include <stdio.h>
-#include <stdlib.h>
#include <string.h>
-#include <time.h>
#include <stdarg.h>
+#include <stdlib.h>
+#include <time.h>
#include <unistd.h>
#include <util.h>
diff --git a/sftp-common.h b/sftp-common.h
index 421a78f78822..95e90d484615 100644
--- a/sftp-common.h
+++ b/sftp-common.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: sftp-common.h,v 1.13 2022/09/19 10:41:58 djm Exp $ */
+/* $OpenBSD: sftp-common.h,v 1.14 2026/03/03 09:57:25 dtucker Exp $ */
/*
* Copyright (c) 2001 Markus Friedl. All rights reserved.
@@ -33,13 +33,13 @@ typedef struct Attrib Attrib;
/* File attributes */
struct Attrib {
- u_int32_t flags;
- u_int64_t size;
- u_int32_t uid;
- u_int32_t gid;
- u_int32_t perm;
- u_int32_t atime;
- u_int32_t mtime;
+ uint32_t flags;
+ uint64_t size;
+ uint32_t uid;
+ uint32_t gid;
+ uint32_t perm;
+ uint32_t atime;
+ uint32_t mtime;
};
void attrib_clear(Attrib *);
diff --git a/sftp-glob.c b/sftp-glob.c
index e054e75e80af..a8d3e07fc690 100644
--- a/sftp-glob.c
+++ b/sftp-glob.c
@@ -21,6 +21,7 @@
#include <sys/stat.h>
#include <dirent.h>
+#include <glob.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
diff --git a/sftp-server.0 b/sftp-server.0
index 273b69908c66..91e0cc497c1e 100644
--- a/sftp-server.0
+++ b/sftp-server.0
@@ -95,4 +95,4 @@ HISTORY
AUTHORS
Markus Friedl <markus@openbsd.org>
-OpenBSD 7.7 July 27, 2021 OpenBSD 7.7
+OpenBSD 7.8 July 27, 2021 SFTP-SERVER(8)
diff --git a/sftp-server.c b/sftp-server.c
index 777821acd521..ebdb31d32c6a 100644
--- a/sftp-server.c
+++ b/sftp-server.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sftp-server.c,v 1.149 2025/09/02 09:26:21 djm Exp $ */
+/* $OpenBSD: sftp-server.c,v 1.153 2026/03/03 09:57:25 dtucker Exp $ */
/*
* Copyright (c) 2000-2004 Markus Friedl. All rights reserved.
*
@@ -18,19 +18,15 @@
#include "includes.h"
#include <sys/types.h>
-#include <sys/stat.h>
#include <sys/resource.h>
+#include <sys/stat.h>
#include <sys/time.h>
-#ifdef HAVE_SYS_MOUNT_H
-#include <sys/mount.h>
-#endif
-#ifdef HAVE_SYS_STATVFS_H
#include <sys/statvfs.h>
-#endif
#include <dirent.h>
#include <errno.h>
#include <fcntl.h>
+#include <limits.h>
#include <poll.h>
#include <pwd.h>
#include <grp.h>
@@ -91,42 +87,42 @@ struct Stat {
};
/* Packet handlers */
-static void process_open(u_int32_t id);
-static void process_close(u_int32_t id);
-static void process_read(u_int32_t id);
-static void process_write(u_int32_t id);
-static void process_stat(u_int32_t id);
-static void process_lstat(u_int32_t id);
-static void process_fstat(u_int32_t id);
-static void process_setstat(u_int32_t id);
-static void process_fsetstat(u_int32_t id);
-static void process_opendir(u_int32_t id);
-static void process_readdir(u_int32_t id);
-static void process_remove(u_int32_t id);
-static void process_mkdir(u_int32_t id);
-static void process_rmdir(u_int32_t id);
-static void process_realpath(u_int32_t id);
-static void process_rename(u_int32_t id);
-static void process_readlink(u_int32_t id);
-static void process_symlink(u_int32_t id);
-static void process_extended_posix_rename(u_int32_t id);
-static void process_extended_statvfs(u_int32_t id);
-static void process_extended_fstatvfs(u_int32_t id);
-static void process_extended_hardlink(u_int32_t id);
-static void process_extended_fsync(u_int32_t id);
-static void process_extended_lsetstat(u_int32_t id);
-static void process_extended_limits(u_int32_t id);
-static void process_extended_expand(u_int32_t id);
-static void process_extended_copy_data(u_int32_t id);
-static void process_extended_home_directory(u_int32_t id);
-static void process_extended_get_users_groups_by_id(u_int32_t id);
-static void process_extended(u_int32_t id);
+static void process_open(uint32_t id);
+static void process_close(uint32_t id);
+static void process_read(uint32_t id);
+static void process_write(uint32_t id);
+static void process_stat(uint32_t id);
+static void process_lstat(uint32_t id);
+static void process_fstat(uint32_t id);
+static void process_setstat(uint32_t id);
+static void process_fsetstat(uint32_t id);
+static void process_opendir(uint32_t id);
+static void process_readdir(uint32_t id);
+static void process_remove(uint32_t id);
+static void process_mkdir(uint32_t id);
+static void process_rmdir(uint32_t id);
+static void process_realpath(uint32_t id);
+static void process_rename(uint32_t id);
+static void process_readlink(uint32_t id);
+static void process_symlink(uint32_t id);
+static void process_extended_posix_rename(uint32_t id);
+static void process_extended_statvfs(uint32_t id);
+static void process_extended_fstatvfs(uint32_t id);
+static void process_extended_hardlink(uint32_t id);
+static void process_extended_fsync(uint32_t id);
+static void process_extended_lsetstat(uint32_t id);
+static void process_extended_limits(uint32_t id);
+static void process_extended_expand(uint32_t id);
+static void process_extended_copy_data(uint32_t id);
+static void process_extended_home_directory(uint32_t id);
+static void process_extended_get_users_groups_by_id(uint32_t id);
+static void process_extended(uint32_t id);
struct sftp_handler {
const char *name; /* user-visible name for fine-grained perms */
const char *ext_name; /* extended request name */
u_int type; /* packet type, for non extended packets */
- void (*handler)(u_int32_t);
+ void (*handler)(uint32_t);
int does_write; /* if nonzero, banned for readonly mode */
};
@@ -309,7 +305,7 @@ struct Handle {
int fd;
int flags;
char *name;
- u_int64_t bytes_read, bytes_write;
+ uint64_t bytes_read, bytes_write;
int next_unused;
};
@@ -434,7 +430,7 @@ handle_update_write(int handle, ssize_t bytes)
handles[handle].bytes_write += bytes;
}
-static u_int64_t
+static uint64_t
handle_bytes_read(int handle)
{
if (handle_is_ok(handle, HANDLE_FILE))
@@ -442,7 +438,7 @@ handle_bytes_read(int handle)
return 0;
}
-static u_int64_t
+static uint64_t
handle_bytes_write(int handle)
{
if (handle_is_ok(handle, HANDLE_FILE))
@@ -524,7 +520,7 @@ send_msg(struct sshbuf *m)
}
static const char *
-status_to_message(u_int32_t status)
+status_to_message(uint32_t status)
{
static const char * const status_messages[] = {
"Success", /* SSH_FX_OK */
@@ -542,7 +538,7 @@ status_to_message(u_int32_t status)
}
static void
-send_status_errmsg(u_int32_t id, u_int32_t status, const char *errmsg)
+send_status_errmsg(uint32_t id, uint32_t status, const char *errmsg)
{
struct sshbuf *msg;
int r;
@@ -568,13 +564,13 @@ send_status_errmsg(u_int32_t id, u_int32_t status, const char *errmsg)
}
static void
-send_status(u_int32_t id, u_int32_t status)
+send_status(uint32_t id, uint32_t status)
{
send_status_errmsg(id, status, NULL);
}
static void
-send_data_or_handle(char type, u_int32_t id, const u_char *data, int dlen)
+send_data_or_handle(char type, uint32_t id, const u_char *data, int dlen)
{
struct sshbuf *msg;
int r;
@@ -590,14 +586,14 @@ send_data_or_handle(char type, u_int32_t id, const u_char *data, int dlen)
}
static void
-send_data(u_int32_t id, const u_char *data, int dlen)
+send_data(uint32_t id, const u_char *data, int dlen)
{
debug("request %u: sent data len %d", id, dlen);
send_data_or_handle(SSH2_FXP_DATA, id, data, dlen);
}
static void
-send_handle(u_int32_t id, int handle)
+send_handle(uint32_t id, int handle)
{
u_char *string;
int hlen;
@@ -609,7 +605,7 @@ send_handle(u_int32_t id, int handle)
}
static void
-send_names(u_int32_t id, int count, const Stat *stats)
+send_names(uint32_t id, int count, const Stat *stats)
{
struct sshbuf *msg;
int i, r;
@@ -632,7 +628,7 @@ send_names(u_int32_t id, int count, const Stat *stats)
}
static void
-send_attrib(u_int32_t id, const Attrib *a)
+send_attrib(uint32_t id, const Attrib *a)
{
struct sshbuf *msg;
int r;
@@ -649,10 +645,10 @@ send_attrib(u_int32_t id, const Attrib *a)
}
static void
-send_statvfs(u_int32_t id, struct statvfs *st)
+send_statvfs(uint32_t id, struct statvfs *st)
{
struct sshbuf *msg;
- u_int64_t flag;
+ uint64_t flag;
int r;
flag = (st->f_flag & ST_RDONLY) ? SSH2_FXE_STATVFS_ST_RDONLY : 0;
@@ -735,9 +731,9 @@ process_init(void)
}
static void
-process_open(u_int32_t id)
+process_open(uint32_t id)
{
- u_int32_t pflags;
+ uint32_t pflags;
Attrib a;
char *name;
int r, handle, fd, flags, mode, status = SSH2_FX_FAILURE;
@@ -777,7 +773,7 @@ process_open(u_int32_t id)
}
static void
-process_close(u_int32_t id)
+process_close(uint32_t id)
{
int r, handle, ret, status = SSH2_FX_FAILURE;
@@ -792,13 +788,13 @@ process_close(u_int32_t id)
}
static void
-process_read(u_int32_t id)
+process_read(uint32_t id)
{
static u_char *buf;
static size_t buflen;
- u_int32_t len;
+ uint32_t len;
int r, handle, fd, ret, status = SSH2_FX_FAILURE;
- u_int64_t off;
+ uint64_t off;
if ((r = get_handle(iqueue, &handle)) != 0 ||
(r = sshbuf_get_u64(iqueue, &off)) != 0 ||
@@ -847,9 +843,9 @@ process_read(u_int32_t id)
}
static void
-process_write(u_int32_t id)
+process_write(uint32_t id)
{
- u_int64_t off;
+ uint64_t off;
size_t len;
int r, handle, fd, ret, status;
u_char *data;
@@ -892,7 +888,7 @@ process_write(u_int32_t id)
}
static void
-process_do_stat(u_int32_t id, int do_lstat)
+process_do_stat(uint32_t id, int do_lstat)
{
Attrib a;
struct stat st;
@@ -918,19 +914,19 @@ process_do_stat(u_int32_t id, int do_lstat)
}
static void
-process_stat(u_int32_t id)
+process_stat(uint32_t id)
{
process_do_stat(id, 0);
}
static void
-process_lstat(u_int32_t id)
+process_lstat(uint32_t id)
{
process_do_stat(id, 1);
}
static void
-process_fstat(u_int32_t id)
+process_fstat(uint32_t id)
{
Attrib a;
struct stat st;
@@ -980,7 +976,7 @@ attrib_to_ts(const Attrib *a)
}
static void
-process_setstat(u_int32_t id)
+process_setstat(uint32_t id)
{
Attrib a;
char *name;
@@ -1027,7 +1023,7 @@ process_setstat(u_int32_t id)
}
static void
-process_fsetstat(u_int32_t id)
+process_fsetstat(uint32_t id)
{
Attrib a;
int handle, fd, r;
@@ -1092,7 +1088,7 @@ process_fsetstat(u_int32_t id)
}
static void
-process_opendir(u_int32_t id)
+process_opendir(uint32_t id)
{
DIR *dirp = NULL;
char *path;
@@ -1122,7 +1118,7 @@ process_opendir(u_int32_t id)
}
static void
-process_readdir(u_int32_t id)
+process_readdir(uint32_t id)
{
DIR *dirp;
struct dirent *dp;
@@ -1179,7 +1175,7 @@ process_readdir(u_int32_t id)
}
static void
-process_remove(u_int32_t id)
+process_remove(uint32_t id)
{
char *name;
int r, status = SSH2_FX_FAILURE;
@@ -1196,7 +1192,7 @@ process_remove(u_int32_t id)
}
static void
-process_mkdir(u_int32_t id)
+process_mkdir(uint32_t id)
{
Attrib a;
char *name;
@@ -1217,7 +1213,7 @@ process_mkdir(u_int32_t id)
}
static void
-process_rmdir(u_int32_t id)
+process_rmdir(uint32_t id)
{
char *name;
int r, status;
@@ -1234,7 +1230,7 @@ process_rmdir(u_int32_t id)
}
static void
-process_realpath(u_int32_t id)
+process_realpath(uint32_t id)
{
char resolvedname[PATH_MAX];
char *path;
@@ -1261,7 +1257,7 @@ process_realpath(u_int32_t id)
}
static void
-process_rename(u_int32_t id)
+process_rename(uint32_t id)
{
char *oldpath, *newpath;
int r, status;
@@ -1321,7 +1317,7 @@ process_rename(u_int32_t id)
}
static void
-process_readlink(u_int32_t id)
+process_readlink(uint32_t id)
{
int r, len;
char buf[PATH_MAX];
@@ -1346,7 +1342,7 @@ process_readlink(u_int32_t id)
}
static void
-process_symlink(u_int32_t id)
+process_symlink(uint32_t id)
{
char *oldpath, *newpath;
int r, status;
@@ -1366,7 +1362,7 @@ process_symlink(u_int32_t id)
}
static void
-process_extended_posix_rename(u_int32_t id)
+process_extended_posix_rename(uint32_t id)
{
char *oldpath, *newpath;
int r, status;
@@ -1385,7 +1381,7 @@ process_extended_posix_rename(u_int32_t id)
}
static void
-process_extended_statvfs(u_int32_t id)
+process_extended_statvfs(uint32_t id)
{
char *path;
struct statvfs st;
@@ -1404,7 +1400,7 @@ process_extended_statvfs(u_int32_t id)
}
static void
-process_extended_fstatvfs(u_int32_t id)
+process_extended_fstatvfs(uint32_t id)
{
int r, handle, fd;
struct statvfs st;
@@ -1424,7 +1420,7 @@ process_extended_fstatvfs(u_int32_t id)
}
static void
-process_extended_hardlink(u_int32_t id)
+process_extended_hardlink(uint32_t id)
{
char *oldpath, *newpath;
int r, status;
@@ -1443,7 +1439,7 @@ process_extended_hardlink(u_int32_t id)
}
static void
-process_extended_fsync(u_int32_t id)
+process_extended_fsync(uint32_t id)
{
int handle, fd, r, status = SSH2_FX_OP_UNSUPPORTED;
@@ -1461,7 +1457,7 @@ process_extended_fsync(u_int32_t id)
}
static void
-process_extended_lsetstat(u_int32_t id)
+process_extended_lsetstat(uint32_t id)
{
Attrib a;
char *name;
@@ -1510,7 +1506,7 @@ process_extended_lsetstat(u_int32_t id)
}
static void
-process_extended_limits(u_int32_t id)
+process_extended_limits(uint32_t id)
{
struct sshbuf *msg;
int r;
@@ -1544,7 +1540,7 @@ process_extended_limits(u_int32_t id)
}
static void
-process_extended_expand(u_int32_t id)
+process_extended_expand(uint32_t id)
{
char cwd[PATH_MAX], resolvedname[PATH_MAX];
char *path, *npath;
@@ -1603,11 +1599,11 @@ process_extended_expand(u_int32_t id)
}
static void
-process_extended_copy_data(u_int32_t id)
+process_extended_copy_data(uint32_t id)
{
u_char buf[64*1024];
int read_handle, read_fd, write_handle, write_fd;
- u_int64_t len, read_off, read_len, write_off;
+ uint64_t len, read_off, read_len, write_off;
int r, copy_until_eof, status = SSH2_FX_OP_UNSUPPORTED;
size_t ret;
@@ -1627,7 +1623,7 @@ process_extended_copy_data(u_int32_t id)
/* For read length of 0, we read until EOF. */
if (read_len == 0) {
- read_len = (u_int64_t)-1 - read_off;
+ read_len = (uint64_t)-1 - read_off;
copy_until_eof = 1;
} else
copy_until_eof = 0;
@@ -1691,7 +1687,7 @@ process_extended_copy_data(u_int32_t id)
}
static void
-process_extended_home_directory(u_int32_t id)
+process_extended_home_directory(uint32_t id)
{
char *username;
struct passwd *user_pw;
@@ -1718,7 +1714,7 @@ process_extended_home_directory(u_int32_t id)
}
static void
-process_extended_get_users_groups_by_id(u_int32_t id)
+process_extended_get_users_groups_by_id(uint32_t id)
{
struct passwd *user_pw;
struct group *gr;
@@ -1754,7 +1750,7 @@ process_extended_get_users_groups_by_id(u_int32_t id)
debug3_f("gid %u => \"%s\"", n, name);
if ((r = sshbuf_put_cstring(groupnames, name)) != 0)
fatal_fr(r, "assemble gid reply");
- nusers++;
+ ngroups++;
}
verbose("users-groups-by-id: %u users, %u groups", nusers, ngroups);
@@ -1773,7 +1769,7 @@ process_extended_get_users_groups_by_id(u_int32_t id)
}
static void
-process_extended(u_int32_t id)
+process_extended(uint32_t id)
{
char *request;
int r;
@@ -1804,7 +1800,7 @@ process(void)
u_char type;
const u_char *cp;
int i, r;
- u_int32_t id;
+ uint32_t id;
buf_len = sshbuf_len(iqueue);
if (buf_len < 5)
diff --git a/sftp-usergroup.c b/sftp-usergroup.c
index 93396ffc63db..d931b29113b3 100644
--- a/sftp-usergroup.c
+++ b/sftp-usergroup.c
@@ -19,8 +19,9 @@
#include "includes.h"
#include <sys/types.h>
-#include <openbsd-compat/sys-tree.h>
+#include <sys/tree.h>
+#include <glob.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
diff --git a/sftp.0 b/sftp.0
index d6648ac26ab0..a0e20e30cce0 100644
--- a/sftp.0
+++ b/sftp.0
@@ -474,4 +474,4 @@ SEE ALSO
T. Ylonen and S. Lehtinen, SSH File Transfer Protocol, draft-ietf-secsh-
filexfer-00.txt, January 2001, work in progress material.
-OpenBSD 7.7 December 6, 2024 OpenBSD 7.7
+OpenBSD 7.8 December 6, 2024 SFTP(1)
diff --git a/sftp.c b/sftp.c
index 3b505eea23db..eebb166e8de4 100644
--- a/sftp.c
+++ b/sftp.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sftp.c,v 1.245 2025/10/02 04:23:11 djm Exp $ */
+/* $OpenBSD: sftp.c,v 1.250 2026/02/11 17:01:34 dtucker Exp $ */
/*
* Copyright (c) 2001-2004 Damien Miller <djm@openbsd.org>
*
@@ -21,14 +21,12 @@
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <sys/socket.h>
-#include <sys/wait.h>
-#ifdef HAVE_SYS_STATVFS_H
#include <sys/statvfs.h>
-#endif
+#include <sys/wait.h>
#include <ctype.h>
#include <errno.h>
-
+#include <glob.h>
#include <paths.h>
#include <libgen.h>
#ifdef HAVE_LOCALE_H
@@ -46,7 +44,6 @@ typedef void EditLine;
#include <stdio.h>
#include <string.h>
#include <unistd.h>
-
#include <util.h>
#include "xmalloc.h"
@@ -679,6 +676,10 @@ process_get(struct sftp_conn *conn, const char *src, const char *dst,
goto out;
}
+ /* Special handling for dest of '..' */
+ if (strcmp(filename, "..") == 0)
+ filename = "."; /* Download to dest, not dest/.. */
+
if (g.gl_matchc == 1 && dst) {
if (local_is_dir(dst)) {
abs_dst = sftp_path_append(dst, filename);
@@ -773,6 +774,9 @@ process_put(struct sftp_conn *conn, const char *src, const char *dst,
err = -1;
goto out;
}
+ /* Special handling for source of '..' */
+ if (strcmp(filename, "..") == 0)
+ filename = "."; /* Upload to dest, not dest/.. */
free(abs_dst);
abs_dst = NULL;
@@ -1863,29 +1867,44 @@ complete_display(char **list, u_int len)
static char *
complete_ambiguous(const char *word, char **list, size_t count)
{
+ size_t i, j, matchlen;
+ char *tmp;
+ int len;
+
if (word == NULL)
return NULL;
- if (count > 0) {
- u_int y, matchlen = strlen(list[0]);
-
- /* Find length of common stem */
- for (y = 1; list[y]; y++) {
- u_int x;
-
- for (x = 0; x < matchlen; x++)
- if (list[0][x] != list[y][x])
- break;
+ if (count == 0)
+ return xstrdup(word); /* no options to complete */
- matchlen = x;
- }
+ /* Find length of common stem across list */
+ matchlen = strlen(list[0]);
+ for (i = 1; i < count && list[i] != NULL; i++) {
+ for (j = 0; j < matchlen; j++)
+ if (list[0][j] != list[i][j])
+ break;
+ matchlen = j;
+ }
- if (matchlen > strlen(word)) {
- char *tmp = xstrdup(list[0]);
+ /*
+ * Now check that the common stem doesn't finish in the middle of
+ * a multibyte character.
+ */
+ mblen(NULL, 0);
+ for (i = 0; i < matchlen;) {
+ len = mblen(list[0] + i, matchlen - i);
+ if (len <= 0 || i + (size_t)len > matchlen)
+ break;
+ i += (size_t)len;
+ }
+ /* If so, truncate */
+ if (i < matchlen)
+ matchlen = i;
- tmp[matchlen] = '\0';
- return tmp;
- }
+ if (matchlen > strlen(word)) {
+ tmp = xstrdup(list[0]);
+ tmp[matchlen] = '\0';
+ return tmp;
}
return xstrdup(word);
@@ -2065,6 +2084,7 @@ complete_match(EditLine *el, struct sftp_conn *conn, char *remote_path,
tmp2 = tmp + filelen - cesc;
len = strlen(tmp2);
/* quote argument on way out */
+ mblen(NULL, 0);
for (i = 0; i < len; i += clen) {
if ((clen = mblen(tmp2 + i, len - i)) < 0 ||
(size_t)clen > sizeof(ins) - 2)
@@ -2205,6 +2225,7 @@ interactive_loop(struct sftp_conn *conn, char *file1, char *file2)
int err, interactive;
EditLine *el = NULL;
#ifdef USE_LIBEDIT
+ const char *editor;
History *hl = NULL;
HistEvent hev;
extern char *__progname;
@@ -2238,6 +2259,10 @@ interactive_loop(struct sftp_conn *conn, char *file1, char *file2)
el_set(el, EL_BIND, "\\e\\e[D", "ed-prev-word", NULL);
/* make ^w match ksh behaviour */
el_set(el, EL_BIND, "^w", "ed-delete-prev-word", NULL);
+
+ /* el_source() may have changed EL_EDITOR to vi */
+ if (el_get(el, EL_EDITOR, &editor) == 0 && editor[0] == 'v')
+ el_set(el, EL_BIND, "^[", "vi-command-mode", NULL);
}
#endif /* USE_LIBEDIT */
diff --git a/sntrup761.c b/sntrup761.c
index 123d01381c61..a731e560f6f8 100644
--- a/sntrup761.c
+++ b/sntrup761.c
@@ -1,5 +1,4 @@
-
-/* $OpenBSD: sntrup761.c,v 1.8 2024/09/16 05:37:05 djm Exp $ */
+/* $OpenBSD: sntrup761.c,v 1.9 2026/01/20 22:56:11 dtucker Exp $ */
/*
* Public Domain, Authors:
@@ -1961,27 +1960,20 @@ static void Hash_prefix(unsigned char *out, int b, const unsigned char *in, int
for (i = 0; i < 32; ++i) out[i] = h[i];
}
-static uint32_t urandom32(void) {
- unsigned char c[4];
- uint32_t result = 0;
- int i;
- randombytes(c, 4);
- for (i = 0; i < 4; ++i) result += ((uint32_t)c[i]) << (8 * i);
- return result;
-}
static void Short_random(small *out) {
uint32_t L[p];
- int i;
- for (i = 0; i < p; ++i) L[i] = urandom32();
+ randombytes(L, sizeof(L));
Short_fromlist(out, L);
+ explicit_bzero(L, sizeof(L));
}
-
static void Small_random(small *out) {
int i;
- for (i = 0; i < p; ++i) out[i] = (((urandom32() & 0x3fffffff) * 3) >> 30) - 1;
+ uint32_t L[p];
+ randombytes(L, sizeof(L));
+ for (i = 0; i < p; ++i) out[i] = (((L[i] & 0x3fffffff) * 3) >> 30) - 1;
+ explicit_bzero(L, sizeof(L));
}
-
static void KeyGen(Fq *h, small *f, small *ginv) {
small g[p];
Fq finv[p];
diff --git a/sntrup761.sh b/sntrup761.sh
index 4de8dc33479f..d4da9919540b 100644
--- a/sntrup761.sh
+++ b/sntrup761.sh
@@ -1,5 +1,5 @@
#!/bin/sh
-# $OpenBSD: sntrup761.sh,v 1.9 2024/09/16 05:37:05 djm Exp $
+# $OpenBSD: sntrup761.sh,v 1.10 2026/01/20 22:56:11 dtucker Exp $
# Placed in the Public Domain.
#
AUTHOR="supercop-20240808/crypto_kem/sntrup761/ref/implementors"
@@ -87,6 +87,28 @@ for i in $FILES; do
*/uint32/useint32/sort.c)
sed -e "s/void crypto_sort/void crypto_sort_uint32/g"
;;
+ # Replace Short_random and Small_random with versions that fetch
+ # entropy in a single operation, then delete urandom32 as unused.
+ */crypto_kem/sntrup761/compact/kem.c)
+ sed -e '/ uint32_t urandom32/,/^}$/d' \
+ -e '/ void Short_random/i\
+static void Short_random(small *out) {\
+ uint32_t L[p];\
+ randombytes(L, sizeof(L));\
+ Short_fromlist(out, L);\
+ explicit_bzero(L, sizeof(L));\
+}' \
+ -e '/ void Short_random(/,/^}$/d' \
+ -e '/ void Small_random/i\
+static void Small_random(small *out) {\
+ int i;\
+ uint32_t L[p];\
+ randombytes(L, sizeof(L));\
+ for (i = 0; i < p; ++i) out[i] = (((L[i] & 0x3fffffff) * 3) >> 30) - 1;\
+ explicit_bzero(L, sizeof(L));\
+}' \
+ -e '/ void Small_random(/,/^}$/d'
+ ;;
# Remove unused function to prevent warning.
*/crypto_kem/sntrup761/ref/int32.c)
sed -e '/ int32_div_uint14/,/^}$/d'
diff --git a/srclimit.c b/srclimit.c
index c62763724b53..05f22ee136ce 100644
--- a/srclimit.c
+++ b/srclimit.c
@@ -19,7 +19,7 @@
#include <sys/socket.h>
#include <sys/types.h>
-#include <openbsd-compat/sys-tree.h>
+#include <sys/tree.h>
#include <limits.h>
#include <netdb.h>
@@ -53,7 +53,7 @@ static struct child_info {
*/
struct penalty {
struct xaddr addr;
- time_t expiry;
+ double expiry;
int active;
const char *reason;
RB_ENTRY(penalty) by_addr;
@@ -212,7 +212,7 @@ penalty_expiry_cmp(struct penalty *a, struct penalty *b)
}
static void
-expire_penalties_from_tree(time_t now, const char *t,
+expire_penalties_from_tree(double now, const char *t,
struct penalties_by_expiry *by_expiry,
struct penalties_by_addr *by_addr, size_t *npenaltiesp)
{
@@ -234,7 +234,7 @@ expire_penalties_from_tree(time_t now, const char *t,
}
static void
-expire_penalties(time_t now)
+expire_penalties(double now)
{
expire_penalties_from_tree(now, "ipv4",
&penalties_by_expiry4, &penalties_by_addr4, &npenalties4);
@@ -260,7 +260,7 @@ srclimit_penalty_check_allow(int sock, const char **reason)
{
struct xaddr addr;
struct penalty find, *penalty;
- time_t now;
+ double now;
int bits, max_sources, overflow_mode;
char addr_s[NI_MAXHOST];
struct penalties_by_addr *by_addr;
@@ -277,7 +277,7 @@ srclimit_penalty_check_allow(int sock, const char **reason)
return 1;
}
}
- now = monotime();
+ now = monotime_double();
expire_penalties(now);
by_addr = addr.af == AF_INET ?
&penalties_by_addr4 : &penalties_by_addr6;
@@ -347,8 +347,9 @@ srclimit_penalise(struct xaddr *addr, int penalty_type)
{
struct xaddr masked;
struct penalty *penalty = NULL, *existing = NULL;
- time_t now;
- int bits, penalty_secs, max_sources = 0, overflow_mode;
+ double now;
+ int bits, max_sources = 0, overflow_mode;
+ double penalty_secs;
char addrnetmask[NI_MAXHOST + 4];
const char *reason = NULL, *t;
size_t *npenaltiesp = NULL;
@@ -381,6 +382,10 @@ srclimit_penalise(struct xaddr *addr, int penalty_type)
penalty_secs = penalty_cfg.penalty_noauth;
reason = "penalty: connections without attempting authentication";
break;
+ case SRCLIMIT_PENALTY_INVALIDUSER:
+ penalty_secs = penalty_cfg.penalty_invaliduser;
+ reason = "penalty: attempted authentication by invalid user";
+ break;
case SRCLIMIT_PENALTY_REFUSECONNECTION:
penalty_secs = penalty_cfg.penalty_refuseconnection;
reason = "penalty: connection prohibited by RefuseConnection";
@@ -392,12 +397,16 @@ srclimit_penalise(struct xaddr *addr, int penalty_type)
default:
fatal_f("internal error: unknown penalty %d", penalty_type);
}
+
+ if (penalty_secs <= 0)
+ return;
+
bits = addr->af == AF_INET ? ipv4_masklen : ipv6_masklen;
if (srclimit_mask_addr(addr, bits, &masked) != 0)
return;
addr_masklen_ntop(addr, bits, addrnetmask, sizeof(addrnetmask));
- now = monotime();
+ now = monotime_double();
expire_penalties(now);
by_expiry = addr->af == AF_INET ?
&penalties_by_expiry4 : &penalties_by_expiry6;
@@ -429,7 +438,7 @@ srclimit_penalise(struct xaddr *addr, int penalty_type)
fatal_f("internal error: %s penalty tables corrupt", t);
do_log2_f(penalty->active ?
SYSLOG_LEVEL_INFO : SYSLOG_LEVEL_VERBOSE,
- "%s: new %s %s penalty of %d seconds for %s", t,
+ "%s: new %s %s penalty of %.3f seconds for %s", t,
addrnetmask, penalty->active ? "active" : "deferred",
penalty_secs, reason);
if (++(*npenaltiesp) > (size_t)max_sources)
@@ -448,9 +457,8 @@ srclimit_penalise(struct xaddr *addr, int penalty_type)
existing->expiry = now + penalty_cfg.penalty_max;
if (existing->expiry - now > penalty_cfg.penalty_min &&
!existing->active) {
- logit_f("%s: activating %s penalty of %lld seconds for %s",
- addrnetmask, t, (long long)(existing->expiry - now),
- reason);
+ logit_f("%s: activating %s penalty of %.3f seconds for %s",
+ addrnetmask, t, existing->expiry - now, reason);
existing->active = 1;
}
existing->reason = penalty->reason;
@@ -468,9 +476,9 @@ srclimit_penalty_info_for_tree(const char *t,
struct penalty *p = NULL;
int bits;
char s[NI_MAXHOST + 4];
- time_t now;
+ double now;
- now = monotime();
+ now = monotime_double();
logit("%zu active %s penalties", npenalties, t);
RB_FOREACH(p, penalties_by_expiry, by_expiry) {
bits = p->addr.af == AF_INET ? ipv4_masklen : ipv6_masklen;
@@ -478,8 +486,8 @@ srclimit_penalty_info_for_tree(const char *t,
if (p->expiry < now)
logit("client %s %s (expired)", s, p->reason);
else {
- logit("client %s %s (%llu secs left)", s, p->reason,
- (long long)(p->expiry - now));
+ logit("client %s %s (%.3f secs left)", s, p->reason,
+ p->expiry - now);
}
}
}
diff --git a/srclimit.h b/srclimit.h
index 77d951ba66ea..3e083df4413e 100644
--- a/srclimit.h
+++ b/srclimit.h
@@ -28,12 +28,14 @@ void srclimit_done(int);
#define SRCLIMIT_PENALTY_GRACE_EXCEEDED 3
#define SRCLIMIT_PENALTY_NOAUTH 4
#define SRCLIMIT_PENALTY_REFUSECONNECTION 5
+#define SRCLIMIT_PENALTY_INVALIDUSER 6
/* meaningful exit values, used by sshd listener for penalties */
#define EXIT_LOGIN_GRACE 3 /* login grace period exceeded */
#define EXIT_CHILD_CRASH 4 /* preauth child crashed */
#define EXIT_AUTH_ATTEMPTED 5 /* at least one auth attempt made */
#define EXIT_CONFIG_REFUSED 6 /* sshd_config RefuseConnection */
+#define EXIT_INVALID_USER 7 /* invalid user supplied */
void srclimit_penalise(struct xaddr *, int);
int srclimit_penalty_check_allow(int, const char **);
diff --git a/ssh-add.0 b/ssh-add.0
index a6b655df728a..dfdf71fb55cb 100644
--- a/ssh-add.0
+++ b/ssh-add.0
@@ -9,6 +9,7 @@ SYNOPSIS
ssh-add -s pkcs11 [-Cv] [certificate ...]
ssh-add -e pkcs11
ssh-add -T pubkey ...
+ ssh-add -Q
DESCRIPTION
ssh-add adds private key identities to the authentication agent,
@@ -126,6 +127,9 @@ DESCRIPTION
and does not specify a lifetime for certificates added to an
agent.
+ -Q Query the agent for the list of protocol extensions it supports.
+ Note: not all agents support this query.
+
-q Be quiet after a successful operation.
-S provider
@@ -177,7 +181,7 @@ ENVIRONMENT
input regardless of whether DISPLAY is set.
SSH_AUTH_SOCK
- Identifies the path of a UNIX-domain socket used to communicate
+ Identifies the path of a Unix-domain socket used to communicate
with the agent.
SSH_SK_PROVIDER
@@ -212,4 +216,4 @@ AUTHORS
created OpenSSH. Markus Friedl contributed the support for SSH protocol
versions 1.5 and 2.0.
-OpenBSD 7.7 September 11, 2025 OpenBSD 7.7
+OpenBSD 7.8 March 5, 2026 SSH-ADD(1)
diff --git a/ssh-add.1 b/ssh-add.1
index babe78040f3d..af5f8f7b055c 100644
--- a/ssh-add.1
+++ b/ssh-add.1
@@ -1,4 +1,4 @@
-.\" $OpenBSD: ssh-add.1,v 1.88 2025/09/11 02:54:42 djm Exp $
+.\" $OpenBSD: ssh-add.1,v 1.89 2026/03/05 05:44:15 djm Exp $
.\"
.\" Author: Tatu Ylonen <ylo@cs.hut.fi>
.\" Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -35,7 +35,7 @@
.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
.\"
-.Dd $Mdocdate: September 11 2025 $
+.Dd $Mdocdate: March 5 2026 $
.Dt SSH-ADD 1
.Os
.Sh NAME
@@ -59,6 +59,8 @@
.Nm ssh-add
.Fl T
.Ar pubkey ...
+.Nm ssh-add
+.Fl Q
.Sh DESCRIPTION
.Nm
adds private key identities to the authentication agent,
@@ -230,6 +232,9 @@ will request that the agent automatically delete the certificate shortly
after the certificate's expiry date.
This flag suppresses this behaviour and does not specify a lifetime for
certificates added to an agent.
+.It Fl Q
+Query the agent for the list of protocol extensions it supports.
+Note: not all agents support this query.
.It Fl q
Be quiet after a successful operation.
.It Fl S Ar provider
diff --git a/ssh-add.c b/ssh-add.c
index 2d5bec89cec5..1e9eddf9048e 100644
--- a/ssh-add.c
+++ b/ssh-add.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ssh-add.c,v 1.181 2025/09/29 03:17:54 djm Exp $ */
+/* $OpenBSD: ssh-add.c,v 1.186 2026/03/05 05:44:15 djm Exp $ */
/*
* Author: Tatu Ylonen <ylo@cs.hut.fi>
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -238,6 +238,21 @@ delete_all(int agent_fd, int qflag)
}
static int
+query_exts(int agent_fd)
+{
+ int r;
+ char **exts = NULL;
+ size_t i;
+
+ if ((r = ssh_agent_query_extensions(agent_fd, &exts)) != 0)
+ fatal_r(r, "unable to query supported extensions");
+ for (i = 0; exts != NULL && exts[i] != NULL; i++)
+ puts(exts[i]);
+ stringlist_free(exts);
+ return 0;
+}
+
+static int
check_cert_lifetime(const struct sshkey *cert, int cert_lifetime)
{
time_t now;
@@ -601,8 +616,8 @@ load_resident_keys(int agent_fd, const char *skprovider, int qflag,
if ((fp = sshkey_fingerprint(key,
fingerprint_hash, SSH_FP_DEFAULT)) == NULL)
fatal_f("sshkey_fingerprint failed");
- if ((r = ssh_add_identity_constrained(agent_fd, key, "",
- lifetime, confirm, skprovider,
+ if ((r = ssh_add_identity_constrained(agent_fd, key,
+ key->sk_application, lifetime, confirm, skprovider,
dest_constraints, ndest_constraints)) != 0) {
error("Unable to add key %s %s",
sshkey_type(key), fp);
@@ -649,34 +664,6 @@ do_file(int agent_fd, int deleting, int key_only, int cert_only,
return 0;
}
-/* Append string 's' to a NULL-terminated array of strings */
-static void
-stringlist_append(char ***listp, const char *s)
-{
- size_t i = 0;
-
- if (*listp == NULL)
- *listp = xcalloc(2, sizeof(**listp));
- else {
- for (i = 0; (*listp)[i] != NULL; i++)
- ; /* count */
- *listp = xrecallocarray(*listp, i + 1, i + 2, sizeof(**listp));
- }
- (*listp)[i] = xstrdup(s);
-}
-
-static void
-stringlist_free(char **list)
-{
- size_t i = 0;
-
- if (list == NULL)
- return;
- for (i = 0; list[i] != NULL; i++)
- free(list[i]);
- free(list);
-}
-
static void
free_dest_constraint_hop(struct dest_constraint_hop *dch)
{
@@ -831,7 +818,7 @@ main(int argc, char **argv)
char **dest_constraint_strings = NULL, **hostkey_files = NULL;
int r, i, ch, deleting = 0, ret = 0, key_only = 0, cert_only = 0;
int do_download = 0, xflag = 0, lflag = 0, Dflag = 0;
- int qflag = 0, Tflag = 0, Nflag = 0;
+ int Qflag = 0, qflag = 0, Tflag = 0, Nflag = 0;
SyslogFacility log_facility = SYSLOG_FACILITY_AUTH;
LogLevel log_level = SYSLOG_LEVEL_INFO;
struct sshkey *k, **certs = NULL;
@@ -863,7 +850,7 @@ main(int argc, char **argv)
skprovider = getenv("SSH_SK_PROVIDER");
- while ((ch = getopt(argc, argv, "vkKlLNCcdDTxXE:e:h:H:M:m:qs:S:t:")) != -1) {
+ while ((ch = getopt(argc, argv, "vkKlLNCcdDTxXE:e:h:H:M:m:Qqs:S:t:")) != -1) {
switch (ch) {
case 'v':
if (log_level == SYSLOG_LEVEL_INFO)
@@ -940,6 +927,9 @@ main(int argc, char **argv)
case 'q':
qflag = 1;
break;
+ case 'Q':
+ Qflag = 1;
+ break;
case 'T':
Tflag = 1;
break;
@@ -951,7 +941,7 @@ main(int argc, char **argv)
}
log_init(__progname, log_level, log_facility, 1);
- if ((xflag != 0) + (lflag != 0) + (Dflag != 0) > 1)
+ if ((xflag != 0) + (lflag != 0) + (Dflag != 0) + (Qflag != 0) > 1)
fatal("Invalid combination of actions");
else if (xflag) {
if (lock_agent(agent_fd, xflag == 'x' ? 1 : 0) == -1)
@@ -965,6 +955,10 @@ main(int argc, char **argv)
if (delete_all(agent_fd, qflag) == -1)
ret = 1;
goto done;
+ } else if (Qflag) {
+ if (query_exts(agent_fd) == -1)
+ ret = 1;
+ goto done;
}
#ifdef ENABLE_SK_INTERNAL
diff --git a/ssh-agent.0 b/ssh-agent.0
index 95d4da4bc406..9abedc210d0f 100644
--- a/ssh-agent.0
+++ b/ssh-agent.0
@@ -20,7 +20,7 @@ DESCRIPTION
The options are as follows:
-a bind_address
- Bind the agent to the UNIX-domain socket bind_address. The
+ Bind the agent to the Unix-domain socket bind_address. The
default is to create a socket at a random path matching
$HOME/.ssh/agent/s.*.
@@ -75,7 +75,7 @@ DESCRIPTION
and FIDO authenticator middleware shared libraries that may be
used with the -S or -s options to ssh-add(1). Libraries that do
not match the pattern list will be refused. The default list is
- M-bM-^@M-^\usr/lib*/*,/usr/local/lib*/*M-bM-^@M-^].
+ M-bM-^@M-^\/usr/lib*/*,/usr/local/lib*/*M-bM-^@M-^].
See PATTERNS in ssh_config(5) for a description of pattern-list
syntax.
@@ -152,14 +152,14 @@ ENVIRONMENT
SSH_AGENT_PID When ssh-agent starts, it stores the name of the agent's
process ID (PID) in this variable.
- SSH_AUTH_SOCK When ssh-agent starts, it creates a UNIX-domain socket and
+ SSH_AUTH_SOCK When ssh-agent starts, it creates a Unix-domain socket and
stores its pathname in this variable. It is accessible
only to the current user, but is easily abused by root or
another instance of the same user.
FILES
$HOME/.ssh/agent/s.*
- UNIX-domain sockets used to contain the connection to the
+ Unix-domain sockets used to contain the connection to the
authentication agent. These sockets should only be readable by
the owner. The sockets should get automatically removed when the
agent exits.
@@ -174,4 +174,4 @@ AUTHORS
created OpenSSH. Markus Friedl contributed the support for SSH protocol
versions 1.5 and 2.0.
-OpenBSD 7.7 October 4, 2025 OpenBSD 7.7
+OpenBSD 7.8 October 4, 2025 SSH-AGENT(1)
diff --git a/ssh-agent.1 b/ssh-agent.1
index f77a6cdd58f0..016f7e0ebc76 100644
--- a/ssh-agent.1
+++ b/ssh-agent.1
@@ -166,7 +166,7 @@ options to
.Xr ssh-add 1 .
Libraries that do not match the pattern list will be refused.
The default list is
-.Dq usr/lib*/*,/usr/local/lib*/* .
+.Dq /usr/lib*/*,/usr/local/lib*/* .
.Pp
See PATTERNS in
.Xr ssh_config 5
diff --git a/ssh-agent.c b/ssh-agent.c
index df241379c0b1..c73abd1d08f8 100644
--- a/ssh-agent.c
+++ b/ssh-agent.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ssh-agent.c,v 1.313 2025/08/29 03:50:38 djm Exp $ */
+/* $OpenBSD: ssh-agent.c,v 1.324 2026/03/10 07:27:14 djm Exp $ */
/*
* Author: Tatu Ylonen <ylo@cs.hut.fi>
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -37,13 +37,13 @@
#include "includes.h"
#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/queue.h>
#include <sys/resource.h>
-#include <sys/stat.h>
#include <sys/socket.h>
-#include <sys/wait.h>
-#include <sys/time.h>
+#include <sys/stat.h>
#include <sys/un.h>
-#include "openbsd-compat/sys-queue.h"
+#include <sys/wait.h>
#ifdef WITH_OPENSSL
#include <openssl/evp.h>
@@ -52,15 +52,15 @@
#include <errno.h>
#include <fcntl.h>
-#include <limits.h>
#include <paths.h>
#include <poll.h>
#include <signal.h>
-#include <stdarg.h>
-#include <stdio.h>
#include <stdlib.h>
-#include <time.h>
+#include <stdio.h>
#include <string.h>
+#include <stdarg.h>
+#include <limits.h>
+#include <time.h>
#include <unistd.h>
#include <util.h>
@@ -162,8 +162,8 @@ static sig_atomic_t signalled_keydrop;
pid_t cleanup_pid = 0;
/* pathname and directory for AUTH_SOCKET */
-char socket_name[PATH_MAX];
-char socket_dir[PATH_MAX];
+static char *socket_name;
+static char socket_dir[PATH_MAX];
/* Pattern-list of allowed PKCS#11/Security key paths */
static char *allowed_providers;
@@ -392,7 +392,7 @@ match_key_hop(const char *tag, const struct sshkey *key,
return -1; /* shouldn't happen */
if (!sshkey_equal(key->cert->signature_key, dch->keys[i]))
continue;
- if (sshkey_cert_check_host(key, hostname, 1,
+ if (sshkey_cert_check_host(key, hostname,
SSH_ALLOWED_CA_SIGALGS, &reason) != 0) {
debug_f("cert %s / hostname %s rejected: %s",
key->cert->key_id, hostname, reason);
@@ -598,16 +598,22 @@ confirm_key(Identity *id, const char *extra)
}
static void
-send_status(SocketEntry *e, int success)
+send_status_generic(SocketEntry *e, u_int code)
{
int r;
if ((r = sshbuf_put_u32(e->output, 1)) != 0 ||
- (r = sshbuf_put_u8(e->output, success ?
- SSH_AGENT_SUCCESS : SSH_AGENT_FAILURE)) != 0)
+ (r = sshbuf_put_u8(e->output, code)) != 0)
fatal_fr(r, "compose");
}
+static void
+send_status(SocketEntry *e, int success)
+{
+ return send_status_generic(e,
+ success ? SSH_AGENT_SUCCESS : SSH_AGENT_FAILURE);
+}
+
/* send list of supported public keys to 'client' */
static void
process_request_identities(SocketEntry *e)
@@ -1756,6 +1762,26 @@ process_ext_session_bind(SocketEntry *e)
return r == 0 ? 1 : 0;
}
+static int
+process_ext_query(SocketEntry *e)
+{
+ int r;
+ struct sshbuf *msg = NULL;
+
+ debug2_f("entering");
+ if ((msg = sshbuf_new()) == NULL)
+ fatal_f("sshbuf_new failed");
+ if ((r = sshbuf_put_u8(msg, SSH_AGENT_EXTENSION_RESPONSE)) != 0 ||
+ (r = sshbuf_put_cstring(msg, "query")) != 0 ||
+ /* string[] supported extension types */
+ (r = sshbuf_put_cstring(msg, "session-bind@openssh.com")) != 0)
+ fatal_fr(r, "compose");
+ if ((r = sshbuf_put_stringb(e->output, msg)) != 0)
+ fatal_fr(r, "enqueue");
+ sshbuf_free(msg);
+ return 1;
+}
+
static void
process_extension(SocketEntry *e)
{
@@ -1765,16 +1791,26 @@ process_extension(SocketEntry *e)
debug2_f("entering");
if ((r = sshbuf_get_cstring(e->request, &name, NULL)) != 0) {
error_fr(r, "parse");
- goto send;
+ send_status(e, 0);
+ return;
}
- if (strcmp(name, "session-bind@openssh.com") == 0)
+
+ if (strcmp(name, "query") == 0)
+ success = process_ext_query(e);
+ else if (strcmp(name, "session-bind@openssh.com") == 0)
success = process_ext_session_bind(e);
- else
+ else {
debug_f("unsupported extension \"%s\"", name);
+ free(name);
+ send_status(e, 0);
+ return;
+ }
free(name);
-send:
- send_status(e, success);
+ /* Agent failures are signalled with a different error code */
+ send_status_generic(e,
+ success ? SSH_AGENT_SUCCESS : SSH_AGENT_EXTENSION_FAILURE);
}
+
/*
* dispatch incoming message.
* returns 1 on success, 0 for incomplete messages or -1 on error.
@@ -2131,8 +2167,11 @@ cleanup_socket(void)
if (cleanup_pid != 0 && getpid() != cleanup_pid)
return;
debug_f("cleanup");
- if (socket_name[0])
+ if (socket_name != NULL) {
unlink(socket_name);
+ free(socket_name);
+ socket_name = NULL;
+ }
if (socket_dir[0])
rmdir(socket_dir);
}
@@ -2192,7 +2231,9 @@ main(int ac, char **av)
int c_flag = 0, d_flag = 0, D_flag = 0, k_flag = 0;
int s_flag = 0, T_flag = 0, u_flag = 0, U_flag = 0;
int sock = -1, ch, result, saved_errno;
- char *homedir = NULL, *shell, *format, *pidstr, *agentsocket = NULL;
+ pid_t pid;
+ char *homedir = NULL, *shell, *format, *pidstr, *agentsocket = NULL;
+ char *cp, pidstrbuf[1 + 3 * sizeof pid];
char *fdstr;
const char *errstr = NULL;
const char *ccp;
@@ -2201,8 +2242,6 @@ main(int ac, char **av)
#endif
extern int optind;
extern char *optarg;
- pid_t pid;
- char pidstrbuf[1 + 3 * sizeof pid];
size_t len;
mode_t prev_mask;
struct timespec timeout;
@@ -2393,16 +2432,9 @@ main(int ac, char **av)
fatal("Couldn't determine home directory");
if (!U_flag)
agent_cleanup_stale(homedir, 0);
- if (agent_listener(homedir, "agent", &sock, &agentsocket) != 0)
+ if (agent_listener(homedir, "agent", &sock, &socket_name) != 0)
fatal_f("Couldn't prepare agent socket");
- if (strlcpy(socket_name, agentsocket,
- sizeof(socket_name)) >= sizeof(socket_name)) {
- fatal_f("Socket path \"%s\" too long",
- agentsocket);
- }
free(homedir);
- free(agentsocket);
- agentsocket = NULL;
} else if (sock == -1) {
if (T_flag) {
/*
@@ -2414,16 +2446,12 @@ main(int ac, char **av)
perror("mkdtemp: private socket dir");
exit(1);
}
- snprintf(socket_name, sizeof(socket_name),
- "%s/agent.%ld", socket_dir, (long)parent_pid);
+ xasprintf(&socket_name, "%s/agent.%ld",
+ socket_dir, (long)parent_pid);
} else {
/* Try to use specified agent socket */
socket_dir[0] = '\0';
- if (strlcpy(socket_name, agentsocket,
- sizeof(socket_name)) >= sizeof(socket_name)) {
- fatal_f("Socket path \"%s\" too long",
- agentsocket);
- }
+ socket_name = xstrdup(agentsocket);
}
/* Listen on socket */
prev_mask = umask(0177);
@@ -2460,11 +2488,13 @@ main(int ac, char **av)
log_init(__progname,
d_flag ? SYSLOG_LEVEL_DEBUG3 : SYSLOG_LEVEL_INFO,
SYSLOG_FACILITY_AUTH, 1);
- if (socket_name[0] != '\0') {
+ if (socket_name != NULL) {
+ cp = argv_assemble(1, &socket_name);
format = c_flag ?
"setenv %s %s;\n" : "%s=%s; export %s;\n";
- printf(format, SSH_AUTHSOCKET_ENV_NAME, socket_name,
+ printf(format, SSH_AUTHSOCKET_ENV_NAME, cp,
SSH_AUTHSOCKET_ENV_NAME);
+ free(cp);
printf("echo Agent pid %ld;\n", (long)parent_pid);
fflush(stdout);
}
@@ -2480,10 +2510,12 @@ main(int ac, char **av)
snprintf(pidstrbuf, sizeof pidstrbuf, "%ld", (long)pid);
if (ac == 0) {
format = c_flag ? "setenv %s %s;\n" : "%s=%s; export %s;\n";
- printf(format, SSH_AUTHSOCKET_ENV_NAME, socket_name,
+ cp = argv_assemble(1, &socket_name);
+ printf(format, SSH_AUTHSOCKET_ENV_NAME, cp,
SSH_AUTHSOCKET_ENV_NAME);
printf(format, SSH_AGENTPID_ENV_NAME, pidstrbuf,
SSH_AGENTPID_ENV_NAME);
+ free(cp);
printf("echo Agent pid %ld;\n", (long)pid);
exit(0);
}
@@ -2540,7 +2572,23 @@ skip:
sigaddset(&nsigset, SIGTERM);
sigaddset(&nsigset, SIGUSR1);
- if (pledge("stdio rpath cpath unix id proc exec", NULL) == -1)
+ if (unveil("/", "r") == -1)
+ fatal("%s: unveil /: %s", __progname, strerror(errno));
+ if ((ccp = getenv("SSH_SK_HELPER")) == NULL || *ccp == '\0')
+ ccp = _PATH_SSH_SK_HELPER;
+ if (unveil(ccp, "x") == -1)
+ fatal("%s: unveil %s: %s", __progname, ccp, strerror(errno));
+ if ((ccp = getenv("SSH_PKCS11_HELPER")) == NULL || *ccp == '\0')
+ ccp = _PATH_SSH_PKCS11_HELPER;
+ if (unveil(ccp, "x") == -1)
+ fatal("%s: unveil %s: %s", __progname, ccp, strerror(errno));
+ if ((ccp = getenv("SSH_ASKPASS")) == NULL || *ccp == '\0')
+ ccp = _PATH_SSH_ASKPASS_DEFAULT;
+ if (unveil(ccp, "x") == -1)
+ fatal("%s: unveil %s: %s", __progname, ccp, strerror(errno));
+ if (unveil("/dev/null", "rw") == -1)
+ fatal("%s: unveil /dev/null: %s", __progname, strerror(errno));
+ if (pledge("stdio rpath cpath wpath unix id proc exec", NULL) == -1)
fatal("%s: pledge: %s", __progname, strerror(errno));
platform_pledge_agent();
diff --git a/ssh-ecdsa-sk.c b/ssh-ecdsa-sk.c
index 3588b11a4a8b..eb5c8bc1eb0d 100644
--- a/ssh-ecdsa-sk.c
+++ b/ssh-ecdsa-sk.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ssh-ecdsa-sk.c,v 1.19 2024/08/15 00:51:51 djm Exp $ */
+/* $OpenBSD: ssh-ecdsa-sk.c,v 1.21 2026/02/06 22:59:18 dtucker Exp $ */
/*
* Copyright (c) 2000 Markus Friedl. All rights reserved.
* Copyright (c) 2010 Damien Miller. All rights reserved.
@@ -210,7 +210,7 @@ webauthn_check_prepare_hash(const u_char *data, size_t datalen,
fprintf(stderr, "%s: received origin: %s\n", __func__, origin);
fprintf(stderr, "%s: received clientData:\n", __func__);
sshbuf_dump(wrapper, stderr);
- fprintf(stderr, "%s: expected clientData premable:\n", __func__);
+ fprintf(stderr, "%s: expected clientData preamble:\n", __func__);
sshbuf_dump(m, stderr);
#endif
/* Check that the supplied clientData has the preamble we expect */
@@ -273,7 +273,9 @@ ssh_ecdsa_sk_verify(const struct sshkey *key,
ret = SSH_ERR_INVALID_FORMAT;
goto out;
}
- if (strcmp(ktype, "webauthn-sk-ecdsa-sha2-nistp256@openssh.com") == 0)
+ if (strcmp(ktype, "webauthn-sk-ecdsa-sha2-nistp256@openssh.com") == 0 ||
+ strcmp(ktype, "webauthn-sk-ecdsa-sha2-nistp256-cert-v01@openssh.com")
+ == 0)
is_webauthn = 1;
else if (strcmp(ktype, "sk-ecdsa-sha2-nistp256@openssh.com") != 0) {
ret = SSH_ERR_INVALID_FORMAT;
@@ -489,4 +491,16 @@ const struct sshkey_impl sshkey_ecdsa_sk_webauthn_impl = {
/* .funcs = */ &sshkey_ecdsa_sk_funcs,
};
+const struct sshkey_impl sshkey_ecdsa_sk_webauthn_cert_impl = {
+ /* .name = */ "webauthn-sk-ecdsa-sha2-nistp256-cert-v01@openssh.com",
+ /* .shortname = */ "ECDSA-SK-CERT",
+ /* .sigalg = */ NULL,
+ /* .type = */ KEY_ECDSA_SK_CERT,
+ /* .nid = */ NID_X9_62_prime256v1,
+ /* .cert = */ 1,
+ /* .sigonly = */ 1,
+ /* .keybits = */ 256,
+ /* .funcs = */ &sshkey_ecdsa_sk_funcs,
+};
+
#endif /* OPENSSL_HAS_ECC */
diff --git a/ssh-ecdsa.c b/ssh-ecdsa.c
index b423bfb65685..526ae74546f5 100644
--- a/ssh-ecdsa.c
+++ b/ssh-ecdsa.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ssh-ecdsa.c,v 1.28 2025/07/24 05:44:55 djm Exp $ */
+/* $OpenBSD: ssh-ecdsa.c,v 1.29 2026/02/14 00:18:34 jsg Exp $ */
/*
* Copyright (c) 2000 Markus Friedl. All rights reserved.
* Copyright (c) 2010 Damien Miller. All rights reserved.
@@ -27,6 +27,7 @@
#include "includes.h"
#if defined(WITH_OPENSSL) && defined(OPENSSL_HAS_ECC)
+#include "openbsd-compat/openssl-compat.h"
#include <sys/types.h>
@@ -39,12 +40,9 @@
#include "sshbuf.h"
#include "ssherr.h"
-#include "digest.h"
#define SSHKEY_INTERNAL
#include "sshkey.h"
-#include "openbsd-compat/openssl-compat.h"
-
int
sshkey_ecdsa_fixup_group(EVP_PKEY *k)
{
diff --git a/ssh-ed25519-sk.c b/ssh-ed25519-sk.c
index c6bc5e72b1d2..2c91eb46c676 100644
--- a/ssh-ed25519-sk.c
+++ b/ssh-ed25519-sk.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ssh-ed25519-sk.c,v 1.15 2022/10/28 00:44:44 djm Exp $ */
+/* $OpenBSD: ssh-ed25519-sk.c,v 1.16 2026/02/14 00:18:34 jsg Exp $ */
/*
* Copyright (c) 2019 Markus Friedl. All rights reserved.
*
@@ -21,7 +21,6 @@
#define SSHKEY_INTERNAL
#include <sys/types.h>
-#include <limits.h>
#include "crypto_api.h"
@@ -32,7 +31,6 @@
#include "sshbuf.h"
#include "sshkey.h"
#include "ssherr.h"
-#include "ssh.h"
#include "digest.h"
/* Reuse some ED25519 internals */
diff --git a/ssh-ed25519.c b/ssh-ed25519.c
index c8caa22214b7..2369c3af069b 100644
--- a/ssh-ed25519.c
+++ b/ssh-ed25519.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ssh-ed25519.c,v 1.20 2025/07/24 06:12:08 djm Exp $ */
+/* $OpenBSD: ssh-ed25519.c,v 1.22 2026/02/14 00:18:34 jsg Exp $ */
/*
* Copyright (c) 2013 Markus Friedl <markus@openbsd.org>
*
@@ -30,7 +30,6 @@
#define SSHKEY_INTERNAL
#include "sshkey.h"
#include "ssherr.h"
-#include "ssh.h"
static void
ssh_ed25519_cleanup(struct sshkey *k)
diff --git a/ssh-keygen.0 b/ssh-keygen.0
index 9ae8d3e3e531..1c1ca7793669 100644
--- a/ssh-keygen.0
+++ b/ssh-keygen.0
@@ -550,12 +550,20 @@ CERTIFICATES
certificates authenticate users to servers, whereas host certificates
authenticate server hosts to users. To generate a user certificate:
- $ ssh-keygen -s /path/to/ca_key -I key_id /path/to/user_key.pub
+ $ ssh-keygen -s /path/to/ca_key -I id -n user \
+ M-BM- M-BM- M-BM- M-BM- M-BM- M-BM- /path/to/user_key.pub
The resultant certificate will be placed in /path/to/user_key-cert.pub.
- A host certificate requires the -h option:
+ The argument to -I is a key identifier that will be used in logs and may
+ be used to revoke keys. The argument to -n is one or more (comma-
+ separated) principals, typically usernames, that the certificate
+ represents. A host certificate requires the -h option:
- $ ssh-keygen -s /path/to/ca_key -I key_id -h /path/to/host_key.pub
+ $ ssh-keygen -s /path/to/ca_key -I id -h -n foo.example.org \
+ M-BM- M-BM- M-BM- M-BM- M-BM- M-BM- /path/to/host_key.pub
+
+ For host certificates, the principals specified using the -n argument are
+ hostnames and may contain wildcard characters.
The host certificate will be output to /path/to/host_key-cert.pub.
@@ -563,24 +571,23 @@ CERTIFICATES
providing the token library using -D and identifying the CA key by
providing its public half as an argument to -s:
- $ ssh-keygen -s ca_key.pub -D libpkcs11.so -I key_id user_key.pub
+ $ ssh-keygen -s ca_key.pub -D libpkcs11.so -I id -n user \
+ M-BM- M-BM- M-BM- M-BM- M-BM- M-BM- user_key.pub
Similarly, it is possible for the CA key to be hosted in an ssh-agent(1).
This is indicated by the -U flag and, again, the CA key must be
identified by its public half.
- $ ssh-keygen -Us ca_key.pub -I key_id user_key.pub
+ $ ssh-keygen -Us ca_key.pub -I id -n user user_key.pub
In all cases, key_id is a "key identifier" that is logged by the server
when the certificate is used for authentication.
- Certificates may be limited to be valid for a set of principal
- (user/host) names. By default, generated certificates are valid for all
- users or hosts. To generate a certificate for a specified set of
- principals:
+ Certificates are limited to be valid for a set of principal (user/host)
+ names. To generate a certificate for a specified set of principals:
- $ ssh-keygen -s ca_key -I key_id -n user1,user2 user_key.pub
- $ ssh-keygen -s ca_key -I key_id -h -n host.domain host_key.pub
+ $ ssh-keygen -s ca_key -I id -n user1,user2 user_key.pub
+ $ ssh-keygen -s ca_key -I id -h -n host.domain host_key.pub
Additional limitations on the validity and use of user certificates may
be specified through certificate options. A certificate option may
@@ -661,7 +668,7 @@ CERTIFICATES
Finally, certificates may be defined with a validity lifetime. The -V
option allows specification of certificate start and end times. A
certificate that is presented at a time outside this range will not be
- considered valid. By default, certificates are valid from the UNIX Epoch
+ considered valid. By default, certificates are valid from the Unix Epoch
to the distant future.
For certificates to be used for user or host authentication, the CA
@@ -901,4 +908,4 @@ AUTHORS
created OpenSSH. Markus Friedl contributed the support for SSH protocol
versions 1.5 and 2.0.
-OpenBSD 7.7 October 4, 2025 OpenBSD 7.7
+OpenBSD 7.8 December 22, 2025 SSH-KEYGEN(1)
diff --git a/ssh-keygen.1 b/ssh-keygen.1
index 7ceb1db959fb..c5f3f741017f 100644
--- a/ssh-keygen.1
+++ b/ssh-keygen.1
@@ -1,4 +1,4 @@
-.\" $OpenBSD: ssh-keygen.1,v 1.236 2025/10/04 21:41:35 naddy Exp $
+.\" $OpenBSD: ssh-keygen.1,v 1.237 2025/12/22 01:49:03 djm Exp $
.\"
.\" Author: Tatu Ylonen <ylo@cs.hut.fi>
.\" Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -35,7 +35,7 @@
.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
.\"
-.Dd $Mdocdate: October 4 2025 $
+.Dd $Mdocdate: December 22 2025 $
.Dt SSH-KEYGEN 1
.Os
.Sh NAME
@@ -902,15 +902,29 @@ User certificates authenticate users to servers, whereas host certificates
authenticate server hosts to users.
To generate a user certificate:
.Pp
-.Dl $ ssh-keygen -s /path/to/ca_key -I key_id /path/to/user_key.pub
+.Dl $ ssh-keygen -s /path/to/ca_key -I id -n user \e
+.Dl \ \ \ \ \ \ /path/to/user_key.pub
.Pp
The resultant certificate will be placed in
.Pa /path/to/user_key-cert.pub .
+The argument to
+.Fl I
+is a key identifier that will be used in logs and may be used to revoke
+keys.
+The argument to
+.Fl n
+is one or more (comma-separated) principals, typically usernames, that
+the certificate represents.
A host certificate requires the
.Fl h
option:
.Pp
-.Dl $ ssh-keygen -s /path/to/ca_key -I key_id -h /path/to/host_key.pub
+.Dl $ ssh-keygen -s /path/to/ca_key -I id -h -n foo.example.org \e
+.Dl \ \ \ \ \ \ /path/to/host_key.pub
+.Pp
+For host certificates, the principals specified using the
+.Fl n
+argument are hostnames and may contain wildcard characters.
.Pp
The host certificate will be output to
.Pa /path/to/host_key-cert.pub .
@@ -922,7 +936,8 @@ and identifying the CA key by providing its public half as an argument
to
.Fl s :
.Pp
-.Dl $ ssh-keygen -s ca_key.pub -D libpkcs11.so -I key_id user_key.pub
+.Dl $ ssh-keygen -s ca_key.pub -D libpkcs11.so -I id -n user \e
+.Dl \ \ \ \ \ \ user_key.pub
.Pp
Similarly, it is possible for the CA key to be hosted in an
.Xr ssh-agent 1 .
@@ -930,20 +945,19 @@ This is indicated by the
.Fl U
flag and, again, the CA key must be identified by its public half.
.Pp
-.Dl $ ssh-keygen -Us ca_key.pub -I key_id user_key.pub
+.Dl $ ssh-keygen -Us ca_key.pub -I id -n user user_key.pub
.Pp
In all cases,
.Ar key_id
is a "key identifier" that is logged by the server when the certificate
is used for authentication.
.Pp
-Certificates may be limited to be valid for a set of principal (user/host)
+Certificates are limited to be valid for a set of principal (user/host)
names.
-By default, generated certificates are valid for all users or hosts.
To generate a certificate for a specified set of principals:
.Pp
-.Dl $ ssh-keygen -s ca_key -I key_id -n user1,user2 user_key.pub
-.Dl "$ ssh-keygen -s ca_key -I key_id -h -n host.domain host_key.pub"
+.Dl $ ssh-keygen -s ca_key -I id -n user1,user2 user_key.pub
+.Dl $ ssh-keygen -s ca_key -I id -h -n host.domain host_key.pub
.Pp
Additional limitations on the validity and use of user certificates may
be specified through certificate options.
diff --git a/ssh-keygen.c b/ssh-keygen.c
index 3c582a83ac9b..584d5a899993 100644
--- a/ssh-keygen.c
+++ b/ssh-keygen.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ssh-keygen.c,v 1.485 2025/10/03 00:08:02 djm Exp $ */
+/* $OpenBSD: ssh-keygen.c,v 1.490 2026/03/03 09:57:25 dtucker Exp $ */
/*
* Author: Tatu Ylonen <ylo@cs.hut.fi>
* Copyright (c) 1994 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -109,8 +109,8 @@ static char *cert_key_id = NULL;
static char *cert_principals = NULL;
/* Validity period for certificates */
-static u_int64_t cert_valid_from = 0;
-static u_int64_t cert_valid_to = ~0ULL;
+static uint64_t cert_valid_from = 0;
+static uint64_t cert_valid_to = ~0ULL;
/* Certificate options */
#define CERTOPT_X_FWD (1)
@@ -122,7 +122,7 @@ static u_int64_t cert_valid_to = ~0ULL;
#define CERTOPT_REQUIRE_VERIFY (1<<6)
#define CERTOPT_DEFAULT (CERTOPT_X_FWD|CERTOPT_AGENT_FWD| \
CERTOPT_PORT_FWD|CERTOPT_PTY|CERTOPT_USER_RC)
-static u_int32_t certflags_flags = CERTOPT_DEFAULT;
+static uint32_t certflags_flags = CERTOPT_DEFAULT;
static char *certflags_command = NULL;
static char *certflags_src_addr = NULL;
@@ -166,13 +166,13 @@ static char hostname[NI_MAXHOST];
#ifdef WITH_OPENSSL
/* moduli.c */
-int gen_candidates(FILE *, u_int32_t, BIGNUM *);
-int prime_test(FILE *, FILE *, u_int32_t, u_int32_t, char *, unsigned long,
+int gen_candidates(FILE *, uint32_t, BIGNUM *);
+int prime_test(FILE *, FILE *, uint32_t, uint32_t, char *, unsigned long,
unsigned long);
#endif
static void
-type_bits_valid(int type, const char *name, u_int32_t *bitsp)
+type_bits_valid(int type, const char *name, uint32_t *bitsp)
{
if (type == KEY_UNSPEC)
fatal("unknown key type %s", key_type_name);
@@ -1018,7 +1018,7 @@ do_gen_all_hostkeys(struct passwd *pw)
{ NULL, NULL, NULL }
};
- u_int32_t bits = 0;
+ uint32_t bits = 0;
int first = 0;
struct stat st;
struct sshkey *private, *public;
@@ -1713,7 +1713,7 @@ do_ca_sign(struct passwd *pw, const char *ca_key_path, int prefer_agent,
unsigned long long cert_serial, int cert_serial_autoinc,
int argc, char **argv)
{
- int r, i, found, agent_fd = -1;
+ int r, i, key_in_agent = 0, agent_fd = -1;
u_int n;
struct sshkey *ca, *public;
char valid[64], *otmp, *tmp, *cp, *out, *comment;
@@ -1742,17 +1742,19 @@ do_ca_sign(struct passwd *pw, const char *ca_key_path, int prefer_agent,
fatal_r(r, "Cannot use public key for CA signature");
if ((r = ssh_fetch_identitylist(agent_fd, &agent_ids)) != 0)
fatal_r(r, "Retrieve agent key list");
- found = 0;
for (j = 0; j < agent_ids->nkeys; j++) {
if (sshkey_equal(ca, agent_ids->keys[j])) {
- found = 1;
+ key_in_agent = 1;
+ /* Replace the CA key with the agent one */
+ sshkey_free(ca);
+ ca = agent_ids->keys[j];
+ agent_ids->keys[j] = NULL;
break;
}
}
- if (!found)
+ if (!key_in_agent)
fatal("CA key %s not found in agent", tmp);
ssh_free_identitylist(agent_ids);
- ca->flags |= SSHKEY_FLAG_EXT;
} else {
/* CA key is assumed to be a private key on the filesystem */
ca = load_identity(tmp, NULL);
@@ -1804,7 +1806,7 @@ do_ca_sign(struct passwd *pw, const char *ca_key_path, int prefer_agent,
if ((r = sshkey_to_certified(public)) != 0)
fatal_r(r, "Could not upgrade key %s to certificate", tmp);
public->cert->type = cert_key_type;
- public->cert->serial = (u_int64_t)cert_serial;
+ public->cert->serial = (uint64_t)cert_serial;
public->cert->key_id = xstrdup(cert_key_id);
public->cert->nprincipals = n;
public->cert->principals = plist;
@@ -1817,7 +1819,7 @@ do_ca_sign(struct passwd *pw, const char *ca_key_path, int prefer_agent,
&public->cert->signature_key)) != 0)
fatal_r(r, "sshkey_from_private (ca key)");
- if (agent_fd != -1 && (ca->flags & SSHKEY_FLAG_EXT) != 0) {
+ if (key_in_agent) {
if ((r = sshkey_certify_custom(public, ca,
key_type_name, sk_provider, NULL, agent_signer,
&agent_fd)) != 0)
@@ -1873,7 +1875,7 @@ do_ca_sign(struct passwd *pw, const char *ca_key_path, int prefer_agent,
#endif
}
-static u_int64_t
+static uint64_t
parse_relative_time(const char *s, time_t now)
{
int64_t mul, secs;
@@ -1884,7 +1886,7 @@ parse_relative_time(const char *s, time_t now)
fatal("Invalid relative certificate time %s", s);
if (mul == -1 && secs > now)
fatal("Certificate time %s cannot be represented", s);
- return now + (u_int64_t)(secs * mul);
+ return now + (uint64_t)(secs * mul);
}
static void
@@ -1945,7 +1947,7 @@ parse_cert_times(char *timespec)
if (*to == '-' || *to == '+')
cert_valid_to = parse_relative_time(to, now);
else if (strcmp(to, "forever") == 0)
- cert_valid_to = ~(u_int64_t)0;
+ cert_valid_to = ~(uint64_t)0;
else if (strncmp(to, "0x", 2) == 0)
parse_hex_u64(to, &cert_valid_to);
else if (parse_absolute_time(to, &cert_valid_to) != 0)
@@ -2961,7 +2963,7 @@ do_moduli_screen(const char *out_file, char **opts, size_t nopts)
#ifdef WITH_OPENSSL
/* Moduli generation/screening */
char *checkpoint = NULL;
- u_int32_t generator_wanted = 0;
+ uint32_t generator_wanted = 0;
unsigned long start_lineno = 0, lines_to_process = 0;
int prime_tests = 0;
FILE *out, *in = stdin;
@@ -2978,7 +2980,7 @@ do_moduli_screen(const char *out_file, char **opts, size_t nopts)
free(checkpoint);
checkpoint = xstrdup(p);
} else if ((p = strprefix(opts[i], "generator=", 0)) != NULL) {
- generator_wanted = (u_int32_t)strtonum(p, 1, UINT_MAX,
+ generator_wanted = (uint32_t)strtonum(p, 1, UINT_MAX,
&errstr);
if (errstr != NULL) {
fatal("Generator invalid: %s (%s)", p, errstr);
@@ -3303,7 +3305,7 @@ main(int argc, char **argv)
char *sk_attestation_path = NULL;
struct sshbuf *challenge = NULL, *attest = NULL;
size_t i, nopts = 0;
- u_int32_t bits = 0;
+ uint32_t bits = 0;
uint8_t sk_flags = SSH_SK_USER_PRESENCE_REQD;
const char *errstr, *p;
int log_level = SYSLOG_LEVEL_INFO;
@@ -3342,7 +3344,7 @@ main(int argc, char **argv)
gen_all_hostkeys = 1;
break;
case 'b':
- bits = (u_int32_t)strtonum(optarg, 1, UINT32_MAX,
+ bits = (uint32_t)strtonum(optarg, 1, UINT32_MAX,
&errstr);
if (errstr)
fatal("Bits has bad value %s (%s)",
@@ -3663,6 +3665,15 @@ main(int argc, char **argv)
if (ca_key_path != NULL) {
if (cert_key_id == NULL)
fatal("Must specify key id (-I) when certifying");
+ if (cert_principals == NULL) {
+ /*
+ * Ideally this would be a fatal(), but we need to
+ * be able to generate such certificates for testing
+ * even though they will be rejected.
+ */
+ error("Warning: certificate will contain no "
+ "principals (-n)");
+ }
for (i = 0; i < nopts; i++)
add_cert_option(opts[i]);
do_ca_sign(pw, ca_key_path, prefer_agent,
diff --git a/ssh-keyscan.0 b/ssh-keyscan.0
index 76d7388d4c94..beb5c32d296d 100644
--- a/ssh-keyscan.0
+++ b/ssh-keyscan.0
@@ -120,4 +120,4 @@ AUTHORS
Davison <wayned@users.sourceforge.net> added support for protocol version
2.
-OpenBSD 7.7 October 4, 2025 OpenBSD 7.7
+OpenBSD 7.8 October 4, 2025 SSH-KEYSCAN(1)
diff --git a/ssh-keyscan.c b/ssh-keyscan.c
index f9788114df8d..9bd3e78ebbd3 100644
--- a/ssh-keyscan.c
+++ b/ssh-keyscan.c
@@ -10,9 +10,10 @@
#include "includes.h"
#include <sys/types.h>
-#include "openbsd-compat/sys-queue.h"
-#include <sys/resource.h>
+#include <sys/socket.h>
+#include <sys/queue.h>
#include <sys/time.h>
+#include <sys/resource.h>
#include <netinet/in.h>
#include <arpa/inet.h>
diff --git a/ssh-keysign.0 b/ssh-keysign.0
index ff330580986f..569f85964b5f 100644
--- a/ssh-keysign.0
+++ b/ssh-keysign.0
@@ -47,4 +47,4 @@ HISTORY
AUTHORS
Markus Friedl <markus@openbsd.org>
-OpenBSD 7.7 June 17, 2024 OpenBSD 7.7
+OpenBSD 7.8 June 17, 2024 SSH-KEYSIGN(8)
diff --git a/ssh-keysign.c b/ssh-keysign.c
index 8d6bcda10919..6cfa51102a62 100644
--- a/ssh-keysign.c
+++ b/ssh-keysign.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ssh-keysign.c,v 1.78 2025/09/25 06:25:38 djm Exp $ */
+/* $OpenBSD: ssh-keysign.c,v 1.80 2026/03/19 02:36:28 djm Exp $ */
/*
* Copyright (c) 2002 Markus Friedl. All rights reserved.
*
@@ -185,9 +185,6 @@ main(int argc, char **argv)
char *host, *fp, *pkalg;
size_t slen, dlen;
- if (pledge("stdio rpath getpw dns id", NULL) != 0)
- fatal("%s: pledge: %s", __progname, strerror(errno));
-
/* Ensure that stdin and stdout are connected */
if ((fd = open(_PATH_DEVNULL, O_RDWR)) < 2)
exit(1);
@@ -195,6 +192,9 @@ main(int argc, char **argv)
if (fd > 2)
close(fd);
+ if (pledge("stdio rpath getpw dns id", NULL) != 0)
+ fatal("%s: pledge: %s", __progname, strerror(errno));
+
for (i = 0; i < NUM_KEYTYPES; i++)
key_fd[i] = -1;
diff --git a/ssh-pkcs11-client.c b/ssh-pkcs11-client.c
index 85afb62ac6f4..6d74d728083f 100644
--- a/ssh-pkcs11-client.c
+++ b/ssh-pkcs11-client.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ssh-pkcs11-client.c,v 1.24 2025/07/30 10:17:13 dtucker Exp $ */
+/* $OpenBSD: ssh-pkcs11-client.c,v 1.26 2026/02/09 22:11:39 dtucker Exp $ */
/*
* Copyright (c) 2010 Markus Friedl. All rights reserved.
* Copyright (c) 2014 Pedro Martelletto. All rights reserved.
@@ -355,6 +355,7 @@ pkcs11_start_helper(const char *path)
}
close(pair[0]);
close(pair[1]);
+ closefrom(STDERR_FILENO + 1);
prog = getenv("SSH_PKCS11_HELPER");
if (prog == NULL || strlen(prog) == 0)
prog = _PATH_SSH_PKCS11_HELPER;
diff --git a/ssh-pkcs11-helper.0 b/ssh-pkcs11-helper.0
index 4b1cb8d7dd12..ccb05e283196 100644
--- a/ssh-pkcs11-helper.0
+++ b/ssh-pkcs11-helper.0
@@ -32,4 +32,4 @@ HISTORY
AUTHORS
Markus Friedl <markus@openbsd.org>
-OpenBSD 7.7 April 29, 2022 OpenBSD 7.7
+OpenBSD 7.8 April 29, 2022 SSH-PKCS11-HELPER(8)
diff --git a/ssh-pkcs11-helper.c b/ssh-pkcs11-helper.c
index aeb5b7a8a924..f7b7b2e81ebf 100644
--- a/ssh-pkcs11-helper.c
+++ b/ssh-pkcs11-helper.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ssh-pkcs11-helper.c,v 1.29 2025/07/30 04:27:42 djm Exp $ */
+/* $OpenBSD: ssh-pkcs11-helper.c,v 1.31 2026/02/11 17:03:17 dtucker Exp $ */
/*
* Copyright (c) 2010 Markus Friedl. All rights reserved.
*
@@ -222,6 +222,8 @@ main(int argc, char **argv)
__progname = ssh_get_progname(argv[0]);
seed_rng();
+ sanitise_stdfd();
+ closefrom(STDERR_FILENO + 1);
log_init(__progname, log_level, log_facility, log_stderr);
while ((ch = getopt(argc, argv, "v")) != -1) {
diff --git a/ssh-pkcs11.c b/ssh-pkcs11.c
index 5e956208bb72..7a7d3b8eaa0a 100644
--- a/ssh-pkcs11.c
+++ b/ssh-pkcs11.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ssh-pkcs11.c,v 1.74 2025/10/09 23:25:23 djm Exp $ */
+/* $OpenBSD: ssh-pkcs11.c,v 1.78 2026/03/03 09:57:25 dtucker Exp $ */
/*
* Copyright (c) 2010 Markus Friedl. All rights reserved.
* Copyright (c) 2014 Pedro Martelletto. All rights reserved.
@@ -23,16 +23,13 @@
#include <sys/time.h>
#include <sys/types.h>
+#include <sys/queue.h>
#include <stdarg.h>
#include <stdio.h>
-#include <ctype.h>
#include <string.h>
#include <dlfcn.h>
-#include "openbsd-compat/sys-queue.h"
-#include "openbsd-compat/openssl-compat.h"
-
#ifdef WITH_OPENSSL
#include "openbsd-compat/openssl-compat.h"
#include <openssl/bn.h>
@@ -935,8 +932,8 @@ pkcs11_fetch_ecdsa_pubkey(struct pkcs11_provider *p, CK_ULONG slotidx,
ossl_error("d2i_ASN1_OCTET_STRING failed");
goto fail;
}
- attrp = octet->data;
- if (o2i_ECPublicKey(&ec, &attrp, octet->length) == NULL) {
+ attrp = ASN1_STRING_get0_data(octet);
+ if (o2i_ECPublicKey(&ec, &attrp, ASN1_STRING_length(octet)) == NULL) {
ossl_error("o2i_ECPublicKey failed");
goto fail;
}
@@ -1652,7 +1649,7 @@ fail:
static struct sshkey *
pkcs11_rsa_generate_private_key(struct pkcs11_provider *p, CK_ULONG slotidx,
- char *label, CK_ULONG bits, CK_BYTE keyid, u_int32_t *err)
+ char *label, CK_ULONG bits, CK_BYTE keyid, uint32_t *err)
{
struct pkcs11_slotinfo *si;
char *plabel = label ? label : "";
@@ -1772,7 +1769,7 @@ static struct ec_curve_info {
static struct sshkey *
pkcs11_ecdsa_generate_private_key(struct pkcs11_provider *p, CK_ULONG slotidx,
- char *label, CK_ULONG bits, CK_BYTE keyid, u_int32_t *err)
+ char *label, CK_ULONG bits, CK_BYTE keyid, uint32_t *err)
{
struct pkcs11_slotinfo *si;
char *plabel = label ? label : "";
@@ -1890,7 +1887,7 @@ pkcs11_register_provider(char *provider_id, char *pin,
p = xcalloc(1, sizeof(*p));
p->name = xstrdup(provider_id);
p->handle = handle;
- /* setup the pkcs11 callbacks */
+ /* set up the pkcs11 callbacks */
if ((rv = (*getfunctionlist)(&f)) != CKR_OK) {
error("C_GetFunctionList for provider %s failed: %lu",
provider_id, rv);
@@ -2104,7 +2101,7 @@ pkcs11_key_free(struct sshkey *key)
#ifdef WITH_PKCS11_KEYGEN
struct sshkey *
pkcs11_gakp(char *provider_id, char *pin, unsigned int slotidx, char *label,
- unsigned int type, unsigned int bits, unsigned char keyid, u_int32_t *err)
+ unsigned int type, unsigned int bits, unsigned char keyid, uint32_t *err)
{
struct pkcs11_provider *p = NULL;
struct pkcs11_slotinfo *si;
@@ -2170,7 +2167,7 @@ out:
struct sshkey *
pkcs11_destroy_keypair(char *provider_id, char *pin, unsigned long slotidx,
- unsigned char keyid, u_int32_t *err)
+ unsigned char keyid, uint32_t *err)
{
struct pkcs11_provider *p = NULL;
struct pkcs11_slotinfo *si;
diff --git a/ssh-pkcs11.h b/ssh-pkcs11.h
index d86c506c1c57..1d0277a6de14 100644
--- a/ssh-pkcs11.h
+++ b/ssh-pkcs11.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: ssh-pkcs11.h,v 1.9 2025/07/30 04:27:42 djm Exp $ */
+/* $OpenBSD: ssh-pkcs11.h,v 1.11 2026/03/03 09:57:25 dtucker Exp $ */
/*
* Copyright (c) 2010 Markus Friedl. All rights reserved.
*
@@ -15,6 +15,8 @@
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
+/* API for ssh-pkcs11.c and ssh-pkcs11-client.c */
+
/* Errors for pkcs11_add_provider() */
#define SSH_PKCS11_ERR_GENERIC 1
#define SSH_PKCS11_ERR_LOGIN_FAIL 2
@@ -36,10 +38,10 @@ void pkcs11_key_free(struct sshkey *);
#ifdef WITH_PKCS11_KEYGEN
struct sshkey *
pkcs11_gakp(char *, char *, unsigned int, char *, unsigned int,
- unsigned int, unsigned char, u_int32_t *);
+ unsigned int, unsigned char, uint32_t *);
struct sshkey *
pkcs11_destroy_keypair(char *, char *, unsigned long, unsigned char,
- u_int32_t *);
+ uint32_t *);
#endif
/* Only available in ssh-pkcs11-client.c */
diff --git a/ssh-rsa.c b/ssh-rsa.c
index fe1518984849..ccadb14ca37d 100644
--- a/ssh-rsa.c
+++ b/ssh-rsa.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ssh-rsa.c,v 1.82 2025/10/03 00:08:02 djm Exp $ */
+/* $OpenBSD: ssh-rsa.c,v 1.84 2026/02/14 00:18:34 jsg Exp $ */
/*
* Copyright (c) 2000, 2003 Markus Friedl <markus@openbsd.org>
*
@@ -18,13 +18,12 @@
#include "includes.h"
#ifdef WITH_OPENSSL
+#include "openbsd-compat/openssl-compat.h"
#include <sys/types.h>
-#include "openbsd-compat/openssl-compat.h"
#include <openssl/bn.h>
#include <openssl/evp.h>
-#include <openssl/err.h>
#include <stdarg.h>
#include <string.h>
@@ -34,7 +33,6 @@
#define SSHKEY_INTERNAL
#include "sshkey.h"
#include "digest.h"
-#include "log.h"
static u_int
ssh_rsa_size(const struct sshkey *k)
diff --git a/ssh-sk-client.c b/ssh-sk-client.c
index 06fad22134fb..52da28d1f442 100644
--- a/ssh-sk-client.c
+++ b/ssh-sk-client.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ssh-sk-client.c,v 1.13 2025/02/18 08:02:48 djm Exp $ */
+/* $OpenBSD: ssh-sk-client.c,v 1.18 2026/03/11 09:10:59 dtucker Exp $ */
/*
* Copyright (c) 2019 Google LLC
*
@@ -21,7 +21,6 @@
#include <sys/socket.h>
#include <sys/wait.h>
-#include <fcntl.h>
#include <limits.h>
#include <errno.h>
#include <signal.h>
@@ -30,13 +29,13 @@
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
+#include <fcntl.h>
#include "log.h"
#include "ssherr.h"
#include "sshbuf.h"
#include "sshkey.h"
#include "msg.h"
-#include "digest.h"
#include "pathnames.h"
#include "ssh-sk.h"
#include "misc.h"
@@ -47,9 +46,10 @@ static int
start_helper(int *fdp, pid_t *pidp, void (**osigchldp)(int))
{
void (*osigchld)(int);
- int oerrno, pair[2];
+ int oerrno, pair[2], execpipe[2];
+ ssize_t n;
pid_t pid;
- char *helper, *verbosity = NULL;
+ char execbuf[100], *helper, *verbosity = NULL;
*fdp = -1;
*pidp = 0;
@@ -58,19 +58,20 @@ start_helper(int *fdp, pid_t *pidp, void (**osigchldp)(int))
helper = getenv("SSH_SK_HELPER");
if (helper == NULL || strlen(helper) == 0)
helper = _PATH_SSH_SK_HELPER;
- if (access(helper, X_OK) != 0) {
- oerrno = errno;
- error_f("helper \"%s\" unusable: %s", helper, strerror(errno));
- errno = oerrno;
- return SSH_ERR_SYSTEM_ERROR;
- }
#ifdef DEBUG_SK
verbosity = "-vvv";
#endif
+ /* Create a O_CLOEXEC pipe to capture the execve() failure */
+ if (pipe(execpipe) == -1) {
+ error("pipe: %s", strerror(errno));
+ return SSH_ERR_SYSTEM_ERROR;
+ }
/* Start helper */
if (socketpair(AF_UNIX, SOCK_STREAM, 0, pair) == -1) {
error("socketpair: %s", strerror(errno));
+ close(execpipe[0]);
+ close(execpipe[1]);
return SSH_ERR_SYSTEM_ERROR;
}
osigchld = ssh_signal(SIGCHLD, SIG_DFL);
@@ -79,14 +80,20 @@ start_helper(int *fdp, pid_t *pidp, void (**osigchldp)(int))
error("fork: %s", strerror(errno));
close(pair[0]);
close(pair[1]);
+ close(execpipe[0]);
+ close(execpipe[1]);
ssh_signal(SIGCHLD, osigchld);
errno = oerrno;
return SSH_ERR_SYSTEM_ERROR;
}
if (pid == 0) {
+ close(execpipe[0]);
+ FD_CLOSEONEXEC(execpipe[1]);
if ((dup2(pair[1], STDIN_FILENO) == -1) ||
(dup2(pair[1], STDOUT_FILENO) == -1)) {
- error_f("dup2: %s", strerror(errno));
+ snprintf(execbuf, sizeof execbuf,
+ "dup2: %s", strerror(errno));
+ write(execpipe[1], execbuf, strlen(execbuf)+1);
_exit(1);
}
close(pair[0]);
@@ -95,11 +102,22 @@ start_helper(int *fdp, pid_t *pidp, void (**osigchldp)(int))
debug_f("starting %s %s", helper,
verbosity == NULL ? "" : verbosity);
execlp(helper, helper, verbosity, (char *)NULL);
- error_f("execlp: %s", strerror(errno));
+ snprintf(execbuf, sizeof execbuf,
+ "execlp: %s", strerror(errno));
+ write(execpipe[1], execbuf, strlen(execbuf)+1);
_exit(1);
}
close(pair[1]);
+ close(execpipe[1]);
+ n = read(execpipe[0], execbuf, sizeof execbuf);
+ close(execpipe[0]);
+ if (n > 0) {
+ execbuf[n - 1] = '\0';
+ error_f("%s", execbuf);
+ return SSH_ERR_AGENT_FAILURE;
+ }
+
/* success */
debug3_f("started pid=%ld", (long)pid);
*fdp = pair[0];
diff --git a/ssh-sk-helper.0 b/ssh-sk-helper.0
index 4abc5e8a03c9..886eac9dec5f 100644
--- a/ssh-sk-helper.0
+++ b/ssh-sk-helper.0
@@ -31,4 +31,4 @@ HISTORY
AUTHORS
Damien Miller <djm@openbsd.org>
-OpenBSD 7.7 April 29, 2022 OpenBSD 7.7
+OpenBSD 7.8 April 29, 2022 SSH-SK-HELPER(8)
diff --git a/ssh-sk-helper.c b/ssh-sk-helper.c
index 806019c46a3d..7a87912bff16 100644
--- a/ssh-sk-helper.c
+++ b/ssh-sk-helper.c
@@ -373,7 +373,6 @@ main(int argc, char **argv)
return (0);
}
#else /* ENABLE_SK */
-#include <stdio.h>
int
main(int argc, char **argv)
diff --git a/ssh.0 b/ssh.0
index 5cc410b1a8cd..04e0e1c793de 100644
--- a/ssh.0
+++ b/ssh.0
@@ -17,7 +17,7 @@ DESCRIPTION
ssh (SSH client) is a program for logging into a remote machine and for
executing commands on a remote machine. It is intended to provide secure
encrypted communications between two untrusted hosts over an insecure
- network. X11 connections, arbitrary TCP ports and UNIX-domain sockets
+ network. X11 connections, arbitrary TCP ports and Unix-domain sockets
can also be forwarded over the secure channel.
ssh connects and logs into the specified destination, which may be
@@ -43,7 +43,7 @@ DESCRIPTION
Agent forwarding should be enabled with caution. Users with the
ability to bypass file permissions on the remote host (for the
- agent's UNIX-domain socket) can access the local agent through
+ agent's Unix-domain socket) can access the local agent through
the forwarded connection. An attacker cannot obtain key material
from the agent, however they can perform operations on the keys
that enable them to authenticate using the identities loaded into
@@ -63,7 +63,7 @@ DESCRIPTION
address.
-C Requests compression of all data (including stdin, stdout,
- stderr, and data for forwarded X11, TCP and UNIX-domain
+ stderr, and data for forwarded X11, TCP and Unix-domain
connections). The compression algorithm is the same used by
gzip(1). Compression is desirable on modem lines and other slow
connections, but will only slow down things on fast networks.
@@ -232,12 +232,13 @@ DESCRIPTION
Control an active connection multiplexing master process. When
the -O option is specified, the ctl_cmd argument is interpreted
and passed to the master process. Valid commands are: M-bM-^@M-^\checkM-bM-^@M-^]
- (check that the master process is running), M-bM-^@M-^\forwardM-bM-^@M-^] (request
- forwardings without command execution), M-bM-^@M-^\cancelM-bM-^@M-^] (cancel
- forwardings), M-bM-^@M-^\proxyM-bM-^@M-^] (connect to a running multiplexing master
- in proxy mode), M-bM-^@M-^\exitM-bM-^@M-^] (request the master to exit), and M-bM-^@M-^\stopM-bM-^@M-^]
- (request the master to stop accepting further multiplexing
- requests).
+ (check that the master process is running), M-bM-^@M-^\conninfoM-bM-^@M-^] (report
+ information about the master connection), M-bM-^@M-^\channelsM-bM-^@M-^] (report
+ information about open channels), M-bM-^@M-^\forwardM-bM-^@M-^] (request forwardings
+ without command execution), M-bM-^@M-^\cancelM-bM-^@M-^] (cancel forwardings),
+ M-bM-^@M-^\proxyM-bM-^@M-^] (connect to a running multiplexing master in proxy mode),
+ M-bM-^@M-^\exitM-bM-^@M-^] (request the master to exit), and M-bM-^@M-^\stopM-bM-^@M-^] (request the
+ master to stop accepting further multiplexing requests).
-o option
Can be used to give options in the format used in the
@@ -628,6 +629,8 @@ ESCAPE CHARACTERS
PermitLocalCommand option is enabled in ssh_config(5). Basic
help is available, using the -h option.
+ ~I Show information about the current SSH connection.
+
~R Request rekeying of the connection (only useful if the peer
supports it).
@@ -828,7 +831,7 @@ ENVIRONMENT
all passphrase input regardless of whether DISPLAY
is set.
- SSH_AUTH_SOCK Identifies the path of a UNIX-domain socket used to
+ SSH_AUTH_SOCK Identifies the path of a Unix-domain socket used to
communicate with the agent.
SSH_CONNECTION Identifies the client and server ends of the
@@ -1027,4 +1030,4 @@ AUTHORS
created OpenSSH. Markus Friedl contributed the support for SSH protocol
versions 1.5 and 2.0.
-OpenBSD 7.7 December 4, 2024 OpenBSD 7.7
+OpenBSD 7.8 December 22, 2025 SSH(1)
diff --git a/ssh.1 b/ssh.1
index 697f4e42a4a3..82ae5480c3ee 100644
--- a/ssh.1
+++ b/ssh.1
@@ -33,8 +33,8 @@
.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
.\"
-.\" $OpenBSD: ssh.1,v 1.444 2024/12/04 14:37:55 djm Exp $
-.Dd $Mdocdate: December 4 2024 $
+.\" $OpenBSD: ssh.1,v 1.447 2025/12/22 01:17:31 djm Exp $
+.Dd $Mdocdate: December 22 2025 $
.Dt SSH 1
.Os
.Sh NAME
@@ -486,6 +486,10 @@ argument is interpreted and passed to the master process.
Valid commands are:
.Dq check
(check that the master process is running),
+.Dq conninfo
+(report information about the master connection),
+.Dq channels
+(report information about open channels),
.Dq forward
(request forwardings without command execution),
.Dq cancel
@@ -1156,6 +1160,8 @@ option is enabled in
Basic help is available, using the
.Fl h
option.
+.It Cm ~I
+Show information about the current SSH connection.
.It Cm ~R
Request rekeying of the connection
(only useful if the peer supports it).
diff --git a/ssh.c b/ssh.c
index 3b03108db156..531f28eb2a56 100644
--- a/ssh.c
+++ b/ssh.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ssh.c,v 1.619 2025/09/25 07:05:11 djm Exp $ */
+/* $OpenBSD: ssh.c,v 1.630 2026/04/02 07:50:55 djm Exp $ */
/*
* Author: Tatu Ylonen <ylo@cs.hut.fi>
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -43,10 +43,8 @@
#include "includes.h"
#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/resource.h>
-#include <sys/ioctl.h>
#include <sys/socket.h>
+#include <sys/stat.h>
#include <sys/wait.h>
#include <sys/utsname.h>
@@ -62,7 +60,6 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <stdarg.h>
#include <unistd.h>
#include <limits.h>
#include <locale.h>
@@ -75,12 +72,10 @@
#include <openssl/err.h>
#endif
#include "openbsd-compat/openssl-compat.h"
-#include "openbsd-compat/sys-queue.h"
#include "xmalloc.h"
#include "ssh.h"
#include "ssh2.h"
-#include "canohost.h"
#include "compat.h"
#include "cipher.h"
#include "packet.h"
@@ -90,7 +85,6 @@
#include "authfd.h"
#include "authfile.h"
#include "pathnames.h"
-#include "dispatch.h"
#include "clientloop.h"
#include "log.h"
#include "misc.h"
@@ -98,12 +92,9 @@
#include "sshconnect.h"
#include "kex.h"
#include "mac.h"
-#include "sshpty.h"
#include "match.h"
-#include "msg.h"
#include "version.h"
#include "ssherr.h"
-#include "myproposal.h"
#include "utf8.h"
#ifdef ENABLE_PKCS11
@@ -641,43 +632,6 @@ ssh_conn_info_free(struct ssh_conn_info *cinfo)
free(cinfo);
}
-static int
-valid_hostname(const char *s)
-{
- size_t i;
-
- if (*s == '-')
- return 0;
- for (i = 0; s[i] != 0; i++) {
- if (strchr("'`\"$\\;&<>|(){},", s[i]) != NULL ||
- isspace((u_char)s[i]) || iscntrl((u_char)s[i]))
- return 0;
- }
- return 1;
-}
-
-static int
-valid_ruser(const char *s)
-{
- size_t i;
-
- if (*s == '-')
- return 0;
- for (i = 0; s[i] != 0; i++) {
- if (iscntrl((u_char)s[i]))
- return 0;
- if (strchr("'`\";&<>|(){}", s[i]) != NULL)
- return 0;
- /* Disallow '-' after whitespace */
- if (isspace((u_char)s[i]) && s[i + 1] == '-')
- return 0;
- /* Disallow \ in last position */
- if (s[i] == '\\' && s[i + 1] == '\0')
- return 0;
- }
- return 1;
-}
-
/*
* Main program for the ssh client.
*/
@@ -817,6 +771,10 @@ main(int ac, char **av)
fatal("Multiplexing command already specified");
if (strcmp(optarg, "check") == 0)
muxclient_command = SSHMUX_COMMAND_ALIVE_CHECK;
+ else if (strcmp(optarg, "conninfo") == 0)
+ muxclient_command = SSHMUX_COMMAND_CONNINFO;
+ else if (strcmp(optarg, "channels") == 0)
+ muxclient_command = SSHMUX_COMMAND_CHANINFO;
else if (strcmp(optarg, "forward") == 0)
muxclient_command = SSHMUX_COMMAND_FORWARD;
else if (strcmp(optarg, "exit") == 0)
@@ -925,9 +883,9 @@ main(int ac, char **av)
}
if (options.proxy_command != NULL)
fatal("Cannot specify -J with ProxyCommand");
- if (parse_jump(optarg, &options, 1) == -1)
+ if (parse_jump(optarg, &options, 1, 1) == -1)
+
fatal("Invalid -J argument");
- options.proxy_command = xstrdup("none");
break;
case 't':
if (options.request_tty == REQUEST_TTY_YES)
@@ -1177,8 +1135,15 @@ main(int ac, char **av)
if (!host)
usage();
- if (!valid_hostname(host))
+ /*
+ * Validate commandline-specified values that end up in %tokens
+ * before they are used in config parsing.
+ */
+ if (options.user != NULL && !ssh_valid_ruser(options.user))
+ fatal("remote username contains invalid characters");
+ if (!ssh_valid_hostname(host))
fatal("hostname contains invalid characters");
+
options.host_arg = xstrdup(host);
/* Initialize the command to execute on remote host. */
@@ -1348,7 +1313,8 @@ main(int ac, char **av)
sshbin = "ssh";
/* Consistency check */
- if (options.proxy_command != NULL)
+ if (options.proxy_command != NULL &&
+ strcasecmp(options.proxy_command, "none") != 0)
fatal("inconsistent options: ProxyCommand+ProxyJump");
/* Never use FD passing for ProxyJump */
options.proxy_use_fdpass = 0;
@@ -1490,7 +1456,7 @@ main(int ac, char **av)
* via configuration (i.e. not expanded) are not subject to validation.
*/
if ((user_on_commandline || user_expanded) &&
- !valid_ruser(options.user))
+ !ssh_valid_ruser(options.user))
fatal("remote username contains invalid characters");
/* Now User is expanded, store it and calculate hash. */
@@ -1531,12 +1497,13 @@ main(int ac, char **av)
options.identity_agent = cp;
}
- if (options.revoked_host_keys != NULL) {
- p = tilde_expand_filename(options.revoked_host_keys, getuid());
+ for (j = 0; j < options.num_revoked_host_keys; j++) {
+ p = tilde_expand_filename(options.revoked_host_keys[j],
+ getuid());
cp = default_client_percent_dollar_expand(p, cinfo);
free(p);
- free(options.revoked_host_keys);
- options.revoked_host_keys = cp;
+ free(options.revoked_host_keys[j]);
+ options.revoked_host_keys[j] = cp;
}
if (options.forward_agent_sock_path != NULL) {
@@ -1954,7 +1921,7 @@ forwarding_success(void)
/* Callback for remote forward global requests */
static void
-ssh_confirm_remote_forward(struct ssh *ssh, int type, u_int32_t seq, void *ctxt)
+ssh_confirm_remote_forward(struct ssh *ssh, int type, uint32_t seq, void *ctxt)
{
struct Forward *rfwd = (struct Forward *)ctxt;
u_int port;
@@ -2198,7 +2165,6 @@ ssh_session2_setup(struct ssh *ssh, int id, int success, void *arg)
{
extern char **environ;
const char *display, *term;
- int r;
char *proto = NULL, *data = NULL;
if (!success)
@@ -2220,12 +2186,8 @@ ssh_session2_setup(struct ssh *ssh, int id, int success, void *arg)
}
check_agent_present();
- if (options.forward_agent) {
- debug("Requesting authentication agent forwarding.");
- channel_request_start(ssh, id, "auth-agent-req@openssh.com", 0);
- if ((r = sshpkt_send(ssh)) != 0)
- fatal_fr(r, "send packet");
- }
+ if (options.forward_agent)
+ client_channel_reqest_agent_forwarding(ssh, id);
if ((term = lookup_env_in_list("TERM", options.setenv,
options.num_setenv)) == NULL || *term == '\0')
diff --git a/ssh_api.c b/ssh_api.c
index 7bdcee148213..38ac17da1174 100644
--- a/ssh_api.c
+++ b/ssh_api.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ssh_api.c,v 1.32 2024/10/18 05:14:51 djm Exp $ */
+/* $OpenBSD: ssh_api.c,v 1.34 2026/03/03 09:57:25 dtucker Exp $ */
/*
* Copyright (c) 2012 Markus Friedl. All rights reserved.
*
@@ -255,7 +255,7 @@ int
ssh_packet_next(struct ssh *ssh, u_char *typep)
{
int r;
- u_int32_t seqnr;
+ uint32_t seqnr;
u_char type;
/*
diff --git a/ssh_api.h b/ssh_api.h
index 584f896a78c4..d5ba574802b3 100644
--- a/ssh_api.h
+++ b/ssh_api.h
@@ -18,11 +18,10 @@
#ifndef API_H
#define API_H
+#include <sys/queue.h>
#include <sys/types.h>
#include <signal.h>
-#include "openbsd-compat/sys-queue.h"
-
#include "cipher.h"
#include "sshkey.h"
#include "kex.h"
diff --git a/ssh_config.0 b/ssh_config.0
index 1c236cf05844..1c9273f9b804 100644
--- a/ssh_config.0
+++ b/ssh_config.0
@@ -586,12 +586,14 @@ DESCRIPTION
ecdsa-sha2-nistp521-cert-v01@openssh.com,
sk-ssh-ed25519-cert-v01@openssh.com,
sk-ecdsa-sha2-nistp256-cert-v01@openssh.com,
+ webauthn-sk-ecdsa-sha2-nistp256-cert-v01@openssh.com,
rsa-sha2-512-cert-v01@openssh.com,
rsa-sha2-256-cert-v01@openssh.com,
ssh-ed25519,
ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,
sk-ssh-ed25519@openssh.com,
sk-ecdsa-sha2-nistp256@openssh.com,
+ webauthn-sk-ecdsa-sha2-nistp256@openssh.com,
rsa-sha2-512,rsa-sha2-256
The -Q option of ssh(1) may be used to list supported signature
@@ -620,11 +622,13 @@ DESCRIPTION
ecdsa-sha2-nistp521-cert-v01@openssh.com,
sk-ssh-ed25519-cert-v01@openssh.com,
sk-ecdsa-sha2-nistp256-cert-v01@openssh.com,
+ webauthn-sk-ecdsa-sha2-nistp256-cert-v01@openssh.com,
rsa-sha2-512-cert-v01@openssh.com,
rsa-sha2-256-cert-v01@openssh.com,
ssh-ed25519,
ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,
sk-ecdsa-sha2-nistp256@openssh.com,
+ webauthn-sk-ecdsa-sha2-nistp256@openssh.com
sk-ssh-ed25519@openssh.com,
rsa-sha2-512,rsa-sha2-256
@@ -660,7 +664,7 @@ DESCRIPTION
many different identities.
IdentityAgent
- Specifies the UNIX-domain socket used to communicate with the
+ Specifies the Unix-domain socket used to communicate with the
authentication agent.
This option overrides the SSH_AUTH_SOCK environment variable and
@@ -1016,12 +1020,14 @@ DESCRIPTION
ecdsa-sha2-nistp521-cert-v01@openssh.com,
sk-ssh-ed25519-cert-v01@openssh.com,
sk-ecdsa-sha2-nistp256-cert-v01@openssh.com,
+ webauthn-sk-ecdsa-sha2-nistp256-cert-v01@openssh.com,
rsa-sha2-512-cert-v01@openssh.com,
rsa-sha2-256-cert-v01@openssh.com,
ssh-ed25519,
ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,
sk-ssh-ed25519@openssh.com,
sk-ecdsa-sha2-nistp256@openssh.com,
+ webauthn-sk-ecdsa-sha2-nistp256@openssh.com,
rsa-sha2-512,rsa-sha2-256
The list of available signature algorithms may also be obtained
@@ -1404,7 +1410,11 @@ PATTERNS
TOKENS
Arguments to some keywords can make use of tokens, which are expanded at
- runtime:
+ runtime. Tokens are expanded without quoting or escaping of shell
+ characters. It is the user's responsibility to ensure they are safe in
+ the context of their use.
+
+ The supported tokens in ssh_config are:
%% A literal M-bM-^@M-^X%M-bM-^@M-^Y.
%C Hash of %l%h%p%r%j.
@@ -1489,4 +1499,4 @@ AUTHORS
created OpenSSH. Markus Friedl contributed the support for SSH protocol
versions 1.5 and 2.0.
-OpenBSD 7.7 October 4, 2025 OpenBSD 7.7
+OpenBSD 7.8 March 23, 2026 SSH_CONFIG(5)
diff --git a/ssh_config.5 b/ssh_config.5
index f7066cbaab78..b459b0449709 100644
--- a/ssh_config.5
+++ b/ssh_config.5
@@ -33,8 +33,8 @@
.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
.\"
-.\" $OpenBSD: ssh_config.5,v 1.420 2025/10/04 21:41:35 naddy Exp $
-.Dd $Mdocdate: October 4 2025 $
+.\" $OpenBSD: ssh_config.5,v 1.423 2026/03/23 01:33:46 djm Exp $
+.Dd $Mdocdate: March 23 2026 $
.Dt SSH_CONFIG 5
.Os
.Sh NAME
@@ -1020,12 +1020,14 @@ ecdsa-sha2-nistp384-cert-v01@openssh.com,
ecdsa-sha2-nistp521-cert-v01@openssh.com,
sk-ssh-ed25519-cert-v01@openssh.com,
sk-ecdsa-sha2-nistp256-cert-v01@openssh.com,
+webauthn-sk-ecdsa-sha2-nistp256-cert-v01@openssh.com,
rsa-sha2-512-cert-v01@openssh.com,
rsa-sha2-256-cert-v01@openssh.com,
ssh-ed25519,
ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,
sk-ssh-ed25519@openssh.com,
sk-ecdsa-sha2-nistp256@openssh.com,
+webauthn-sk-ecdsa-sha2-nistp256@openssh.com,
rsa-sha2-512,rsa-sha2-256
.Ed
.Pp
@@ -1066,11 +1068,13 @@ ecdsa-sha2-nistp384-cert-v01@openssh.com,
ecdsa-sha2-nistp521-cert-v01@openssh.com,
sk-ssh-ed25519-cert-v01@openssh.com,
sk-ecdsa-sha2-nistp256-cert-v01@openssh.com,
+webauthn-sk-ecdsa-sha2-nistp256-cert-v01@openssh.com,
rsa-sha2-512-cert-v01@openssh.com,
rsa-sha2-256-cert-v01@openssh.com,
ssh-ed25519,
ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,
sk-ecdsa-sha2-nistp256@openssh.com,
+webauthn-sk-ecdsa-sha2-nistp256@openssh.com
sk-ssh-ed25519@openssh.com,
rsa-sha2-512,rsa-sha2-256
.Ed
@@ -1689,12 +1693,14 @@ ecdsa-sha2-nistp384-cert-v01@openssh.com,
ecdsa-sha2-nistp521-cert-v01@openssh.com,
sk-ssh-ed25519-cert-v01@openssh.com,
sk-ecdsa-sha2-nistp256-cert-v01@openssh.com,
+webauthn-sk-ecdsa-sha2-nistp256-cert-v01@openssh.com,
rsa-sha2-512-cert-v01@openssh.com,
rsa-sha2-256-cert-v01@openssh.com,
ssh-ed25519,
ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,
sk-ssh-ed25519@openssh.com,
sk-ecdsa-sha2-nistp256@openssh.com,
+webauthn-sk-ecdsa-sha2-nistp256@openssh.com,
rsa-sha2-512,rsa-sha2-256
.Ed
.Pp
@@ -2299,7 +2305,14 @@ such as a wildcard:
.Dl from=\&"!host1,!host2,*\&"
.Sh TOKENS
Arguments to some keywords can make use of tokens,
-which are expanded at runtime:
+which are expanded at runtime.
+Tokens are expanded without quoting or escaping of shell characters.
+It is the user's responsibility to ensure they are safe in the
+context of their use.
+.Pp
+The supported tokens in
+.Nm
+are:
.Pp
.Bl -tag -width XXXX -offset indent -compact
.It %%
diff --git a/sshbuf-getput-basic.c b/sshbuf-getput-basic.c
index 2cc562b244f2..77c0a782fb3c 100644
--- a/sshbuf-getput-basic.c
+++ b/sshbuf-getput-basic.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sshbuf-getput-basic.c,v 1.13 2022/05/25 06:03:44 djm Exp $ */
+/* $OpenBSD: sshbuf-getput-basic.c,v 1.15 2026/03/03 09:57:25 dtucker Exp $ */
/*
* Copyright (c) 2011 Damien Miller
*
@@ -15,7 +15,6 @@
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-#define SSHBUF_INTERNAL
#include "includes.h"
#include <sys/types.h>
@@ -27,6 +26,7 @@
#include <stdint.h>
#include "ssherr.h"
+#define SSHBUF_INTERNAL
#include "sshbuf.h"
int
@@ -43,7 +43,7 @@ sshbuf_get(struct sshbuf *buf, void *v, size_t len)
}
int
-sshbuf_get_u64(struct sshbuf *buf, u_int64_t *valp)
+sshbuf_get_u64(struct sshbuf *buf, uint64_t *valp)
{
const u_char *p = sshbuf_ptr(buf);
int r;
@@ -56,7 +56,7 @@ sshbuf_get_u64(struct sshbuf *buf, u_int64_t *valp)
}
int
-sshbuf_get_u32(struct sshbuf *buf, u_int32_t *valp)
+sshbuf_get_u32(struct sshbuf *buf, uint32_t *valp)
{
const u_char *p = sshbuf_ptr(buf);
int r;
@@ -69,7 +69,7 @@ sshbuf_get_u32(struct sshbuf *buf, u_int32_t *valp)
}
int
-sshbuf_get_u16(struct sshbuf *buf, u_int16_t *valp)
+sshbuf_get_u16(struct sshbuf *buf, uint16_t *valp)
{
const u_char *p = sshbuf_ptr(buf);
int r;
@@ -90,7 +90,7 @@ sshbuf_get_u8(struct sshbuf *buf, u_char *valp)
if ((r = sshbuf_consume(buf, 1)) < 0)
return r;
if (valp != NULL)
- *valp = (u_int8_t)*p;
+ *valp = (uint8_t)*p;
return 0;
}
@@ -122,7 +122,7 @@ check_roffset(const struct sshbuf *buf, size_t offset, size_t len,
}
int
-sshbuf_peek_u64(const struct sshbuf *buf, size_t offset, u_int64_t *valp)
+sshbuf_peek_u64(const struct sshbuf *buf, size_t offset, uint64_t *valp)
{
const u_char *p = NULL;
int r;
@@ -137,7 +137,7 @@ sshbuf_peek_u64(const struct sshbuf *buf, size_t offset, u_int64_t *valp)
}
int
-sshbuf_peek_u32(const struct sshbuf *buf, size_t offset, u_int32_t *valp)
+sshbuf_peek_u32(const struct sshbuf *buf, size_t offset, uint32_t *valp)
{
const u_char *p = NULL;
int r;
@@ -152,7 +152,7 @@ sshbuf_peek_u32(const struct sshbuf *buf, size_t offset, u_int32_t *valp)
}
int
-sshbuf_peek_u16(const struct sshbuf *buf, size_t offset, u_int16_t *valp)
+sshbuf_peek_u16(const struct sshbuf *buf, size_t offset, uint16_t *valp)
{
const u_char *p = NULL;
int r;
@@ -238,7 +238,7 @@ int
sshbuf_peek_string_direct(const struct sshbuf *buf, const u_char **valp,
size_t *lenp)
{
- u_int32_t len;
+ uint32_t len;
const u_char *p = sshbuf_ptr(buf);
if (valp != NULL)
@@ -303,7 +303,7 @@ sshbuf_get_cstring(struct sshbuf *buf, char **valp, size_t *lenp)
int
sshbuf_get_stringb(struct sshbuf *buf, struct sshbuf *v)
{
- u_int32_t len;
+ uint32_t len;
u_char *p;
int r;
@@ -387,7 +387,7 @@ sshbuf_putfv(struct sshbuf *buf, const char *fmt, va_list ap)
}
int
-sshbuf_put_u64(struct sshbuf *buf, u_int64_t val)
+sshbuf_put_u64(struct sshbuf *buf, uint64_t val)
{
u_char *p;
int r;
@@ -399,7 +399,7 @@ sshbuf_put_u64(struct sshbuf *buf, u_int64_t val)
}
int
-sshbuf_put_u32(struct sshbuf *buf, u_int32_t val)
+sshbuf_put_u32(struct sshbuf *buf, uint32_t val)
{
u_char *p;
int r;
@@ -411,7 +411,7 @@ sshbuf_put_u32(struct sshbuf *buf, u_int32_t val)
}
int
-sshbuf_put_u16(struct sshbuf *buf, u_int16_t val)
+sshbuf_put_u16(struct sshbuf *buf, uint16_t val)
{
u_char *p;
int r;
@@ -449,7 +449,7 @@ check_woffset(struct sshbuf *buf, size_t offset, size_t len, u_char **p)
}
int
-sshbuf_poke_u64(struct sshbuf *buf, size_t offset, u_int64_t val)
+sshbuf_poke_u64(struct sshbuf *buf, size_t offset, uint64_t val)
{
u_char *p = NULL;
int r;
@@ -461,7 +461,7 @@ sshbuf_poke_u64(struct sshbuf *buf, size_t offset, u_int64_t val)
}
int
-sshbuf_poke_u32(struct sshbuf *buf, size_t offset, u_int32_t val)
+sshbuf_poke_u32(struct sshbuf *buf, size_t offset, uint32_t val)
{
u_char *p = NULL;
int r;
@@ -473,7 +473,7 @@ sshbuf_poke_u32(struct sshbuf *buf, size_t offset, u_int32_t val)
}
int
-sshbuf_poke_u16(struct sshbuf *buf, size_t offset, u_int16_t val)
+sshbuf_poke_u16(struct sshbuf *buf, size_t offset, uint16_t val)
{
u_char *p = NULL;
int r;
@@ -629,3 +629,41 @@ sshbuf_get_bignum2_bytes_direct(struct sshbuf *buf,
}
return 0;
}
+
+int
+sshbuf_get_nulterminated_string(struct sshbuf *buf, size_t maxlen,
+ char **valp, size_t *lenp)
+{
+ const u_char zero = 0;
+ char *val = NULL;
+ size_t len = 0;
+ int r;
+
+ if (valp != NULL)
+ *valp = NULL;
+ if (lenp != NULL)
+ *lenp = 0;
+ if ((r = sshbuf_find(buf, 0, &zero, sizeof(zero), &len)) != 0) {
+ if (r == SSH_ERR_INVALID_FORMAT && sshbuf_len(buf) < maxlen)
+ return SSH_ERR_MESSAGE_INCOMPLETE;
+ return r;
+ }
+ if (len > maxlen)
+ return SSH_ERR_INVALID_FORMAT;
+ /* can strdup() because it's definitely nul-terminated */
+ if ((val = strdup(sshbuf_ptr(buf))) == NULL)
+ return SSH_ERR_ALLOC_FAIL;
+ if ((r = sshbuf_consume(buf, len + 1)) != 0)
+ goto out;
+ /* success */
+ r = 0;
+ if (valp != NULL) {
+ *valp = val;
+ val = NULL;
+ }
+ if (lenp != NULL)
+ *lenp = len;
+ out:
+ free(val);
+ return r;
+}
diff --git a/sshbuf-getput-crypto.c b/sshbuf-getput-crypto.c
index e7bffe225cd9..7516fd588065 100644
--- a/sshbuf-getput-crypto.c
+++ b/sshbuf-getput-crypto.c
@@ -15,7 +15,6 @@
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-#define SSHBUF_INTERNAL
#include "includes.h"
#include <sys/types.h>
@@ -30,6 +29,7 @@
#endif /* OPENSSL_HAS_ECC */
#include "ssherr.h"
+#define SSHBUF_INTERNAL
#include "sshbuf.h"
int
diff --git a/sshbuf-misc.c b/sshbuf-misc.c
index 7b11e4e1760b..c8ffdec685fb 100644
--- a/sshbuf-misc.c
+++ b/sshbuf-misc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sshbuf-misc.c,v 1.22 2025/09/04 00:32:31 djm Exp $ */
+/* $OpenBSD: sshbuf-misc.c,v 1.23 2026/03/28 05:10:25 djm Exp $ */
/*
* Copyright (c) 2011 Damien Miller
*
@@ -95,7 +95,7 @@ b16tod(const char v)
return v - '0';
if (v >= 'a' && v <= 'f')
return 10 + v - 'a';
- if (v >= 'A' && v <= 'A')
+ if (v >= 'A' && v <= 'F')
return 10 + v - 'A';
return -1;
}
diff --git a/sshbuf.c b/sshbuf.c
index 1b714e5f9c79..0dc411c51374 100644
--- a/sshbuf.c
+++ b/sshbuf.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sshbuf.c,v 1.23 2024/08/14 15:42:18 tobias Exp $ */
+/* $OpenBSD: sshbuf.c,v 1.24 2025/12/29 23:52:09 djm Exp $ */
/*
* Copyright (c) 2011 Damien Miller
*
@@ -425,3 +425,23 @@ sshbuf_consume_end(struct sshbuf *buf, size_t len)
return 0;
}
+int
+sshbuf_consume_upto_child(struct sshbuf *buf, const struct sshbuf *child)
+{
+ int r;
+
+ if ((r = sshbuf_check_sanity(buf)) != 0 ||
+ (r = sshbuf_check_sanity(child)) != 0)
+ return r;
+ /* This function is only used for parent/child buffers */
+ if (child->parent != buf)
+ return SSH_ERR_INVALID_ARGUMENT;
+ /* Nonsensical if the parent has advanced past the child */
+ if (sshbuf_len(child) > sshbuf_len(buf))
+ return SSH_ERR_INVALID_ARGUMENT;
+ /* More paranoia, shouldn't happen */
+ if (child->cd < buf->cd)
+ return SSH_ERR_INTERNAL_ERROR;
+ /* Advance */
+ return sshbuf_consume(buf, sshbuf_len(buf) - sshbuf_len(child));
+}
diff --git a/sshbuf.h b/sshbuf.h
index 0c82f120c422..b8ccb7385389 100644
--- a/sshbuf.h
+++ b/sshbuf.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: sshbuf.h,v 1.32 2025/09/02 09:41:23 djm Exp $ */
+/* $OpenBSD: sshbuf.h,v 1.35 2026/03/03 09:57:25 dtucker Exp $ */
/*
* Copyright (c) 2011 Damien Miller
*
@@ -21,6 +21,7 @@
#include <sys/types.h>
#include <stdarg.h>
#include <stdio.h>
+
#ifdef WITH_OPENSSL
# include <openssl/bn.h>
# include <openssl/evp.h>
@@ -143,6 +144,24 @@ int sshbuf_consume(struct sshbuf *buf, size_t len);
*/
int sshbuf_consume_end(struct sshbuf *buf, size_t len);
+/*
+ * Consume data from a parent buffer up to that of a child buffer (i.e.
+ * one created by sshbuf_fromb()).
+ *
+ * Intended to be used in a pattern like:
+ *
+ * b = sshbuf_fromb(parent);
+ * sshbuf_get_string(b, &foo, &foostr);
+ * sshbuf_get_u32(b, &bar);
+ * sshbuf_consume_upto_child(parent, b);
+ *
+ * After which, both "b" and "parent" will point to the same data.
+ *
+ * "child" must be a direct child of "buf" (i.e. neither an unrelated buffer
+ * nor a grandchild) which has consumed data past that of "buf".
+ */
+int sshbuf_consume_upto_child(struct sshbuf *buf, const struct sshbuf *child);
+
/* Extract or deposit some bytes */
int sshbuf_get(struct sshbuf *buf, void *v, size_t len);
int sshbuf_put(struct sshbuf *buf, const void *v, size_t len);
@@ -154,22 +173,22 @@ int sshbuf_putf(struct sshbuf *buf, const char *fmt, ...)
int sshbuf_putfv(struct sshbuf *buf, const char *fmt, va_list ap);
/* Functions to extract or store big-endian words of various sizes */
-int sshbuf_get_u64(struct sshbuf *buf, u_int64_t *valp);
-int sshbuf_get_u32(struct sshbuf *buf, u_int32_t *valp);
-int sshbuf_get_u16(struct sshbuf *buf, u_int16_t *valp);
+int sshbuf_get_u64(struct sshbuf *buf, uint64_t *valp);
+int sshbuf_get_u32(struct sshbuf *buf, uint32_t *valp);
+int sshbuf_get_u16(struct sshbuf *buf, uint16_t *valp);
int sshbuf_get_u8(struct sshbuf *buf, u_char *valp);
-int sshbuf_put_u64(struct sshbuf *buf, u_int64_t val);
-int sshbuf_put_u32(struct sshbuf *buf, u_int32_t val);
-int sshbuf_put_u16(struct sshbuf *buf, u_int16_t val);
+int sshbuf_put_u64(struct sshbuf *buf, uint64_t val);
+int sshbuf_put_u32(struct sshbuf *buf, uint32_t val);
+int sshbuf_put_u16(struct sshbuf *buf, uint16_t val);
int sshbuf_put_u8(struct sshbuf *buf, u_char val);
/* Functions to peek at the contents of a buffer without modifying it. */
int sshbuf_peek_u64(const struct sshbuf *buf, size_t offset,
- u_int64_t *valp);
+ uint64_t *valp);
int sshbuf_peek_u32(const struct sshbuf *buf, size_t offset,
- u_int32_t *valp);
+ uint32_t *valp);
int sshbuf_peek_u16(const struct sshbuf *buf, size_t offset,
- u_int16_t *valp);
+ uint16_t *valp);
int sshbuf_peek_u8(const struct sshbuf *buf, size_t offset,
u_char *valp);
@@ -177,9 +196,9 @@ int sshbuf_peek_u8(const struct sshbuf *buf, size_t offset,
* Functions to poke values into an existing buffer (e.g. a length header
* to a packet). The destination bytes must already exist in the buffer.
*/
-int sshbuf_poke_u64(struct sshbuf *buf, size_t offset, u_int64_t val);
-int sshbuf_poke_u32(struct sshbuf *buf, size_t offset, u_int32_t val);
-int sshbuf_poke_u16(struct sshbuf *buf, size_t offset, u_int16_t val);
+int sshbuf_poke_u64(struct sshbuf *buf, size_t offset, uint64_t val);
+int sshbuf_poke_u32(struct sshbuf *buf, size_t offset, uint32_t val);
+int sshbuf_poke_u16(struct sshbuf *buf, size_t offset, uint16_t val);
int sshbuf_poke_u8(struct sshbuf *buf, size_t offset, u_char val);
int sshbuf_poke(struct sshbuf *buf, size_t offset, void *v, size_t len);
@@ -229,6 +248,10 @@ int sshbuf_put_ec_pkey(struct sshbuf *buf, EVP_PKEY *pkey);
# endif /* OPENSSL_HAS_ECC */
#endif /* WITH_OPENSSL */
+/* Functions to extract or store various non-SSH wire encoded values */
+int sshbuf_get_nulterminated_string(struct sshbuf *buf, size_t maxlen,
+ char **valp, size_t *lenp);
+
/* Dump the contents of the buffer in a human-readable format */
void sshbuf_dump(const struct sshbuf *buf, FILE *f);
@@ -314,26 +337,26 @@ int sshbuf_read(int, struct sshbuf *, size_t, size_t *)
/* Macros for decoding/encoding integers */
#define PEEK_U64(p) \
- (((u_int64_t)(((const u_char *)(p))[0]) << 56) | \
- ((u_int64_t)(((const u_char *)(p))[1]) << 48) | \
- ((u_int64_t)(((const u_char *)(p))[2]) << 40) | \
- ((u_int64_t)(((const u_char *)(p))[3]) << 32) | \
- ((u_int64_t)(((const u_char *)(p))[4]) << 24) | \
- ((u_int64_t)(((const u_char *)(p))[5]) << 16) | \
- ((u_int64_t)(((const u_char *)(p))[6]) << 8) | \
- (u_int64_t)(((const u_char *)(p))[7]))
+ (((uint64_t)(((const u_char *)(p))[0]) << 56) | \
+ ((uint64_t)(((const u_char *)(p))[1]) << 48) | \
+ ((uint64_t)(((const u_char *)(p))[2]) << 40) | \
+ ((uint64_t)(((const u_char *)(p))[3]) << 32) | \
+ ((uint64_t)(((const u_char *)(p))[4]) << 24) | \
+ ((uint64_t)(((const u_char *)(p))[5]) << 16) | \
+ ((uint64_t)(((const u_char *)(p))[6]) << 8) | \
+ (uint64_t)(((const u_char *)(p))[7]))
#define PEEK_U32(p) \
- (((u_int32_t)(((const u_char *)(p))[0]) << 24) | \
- ((u_int32_t)(((const u_char *)(p))[1]) << 16) | \
- ((u_int32_t)(((const u_char *)(p))[2]) << 8) | \
- (u_int32_t)(((const u_char *)(p))[3]))
+ (((uint32_t)(((const u_char *)(p))[0]) << 24) | \
+ ((uint32_t)(((const u_char *)(p))[1]) << 16) | \
+ ((uint32_t)(((const u_char *)(p))[2]) << 8) | \
+ (uint32_t)(((const u_char *)(p))[3]))
#define PEEK_U16(p) \
- (((u_int16_t)(((const u_char *)(p))[0]) << 8) | \
- (u_int16_t)(((const u_char *)(p))[1]))
+ (((uint16_t)(((const u_char *)(p))[0]) << 8) | \
+ (uint16_t)(((const u_char *)(p))[1]))
#define POKE_U64(p, v) \
do { \
- const u_int64_t __v = (v); \
+ const uint64_t __v = (v); \
((u_char *)(p))[0] = (__v >> 56) & 0xff; \
((u_char *)(p))[1] = (__v >> 48) & 0xff; \
((u_char *)(p))[2] = (__v >> 40) & 0xff; \
@@ -345,7 +368,7 @@ int sshbuf_read(int, struct sshbuf *, size_t, size_t *)
} while (0)
#define POKE_U32(p, v) \
do { \
- const u_int32_t __v = (v); \
+ const uint32_t __v = (v); \
((u_char *)(p))[0] = (__v >> 24) & 0xff; \
((u_char *)(p))[1] = (__v >> 16) & 0xff; \
((u_char *)(p))[2] = (__v >> 8) & 0xff; \
@@ -353,7 +376,7 @@ int sshbuf_read(int, struct sshbuf *, size_t, size_t *)
} while (0)
#define POKE_U16(p, v) \
do { \
- const u_int16_t __v = (v); \
+ const uint16_t __v = (v); \
((u_char *)(p))[0] = (__v >> 8) & 0xff; \
((u_char *)(p))[1] = __v & 0xff; \
} while (0)
diff --git a/sshconnect.c b/sshconnect.c
index 912a520c51bf..4384277a6eab 100644
--- a/sshconnect.c
+++ b/sshconnect.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sshconnect.c,v 1.376 2025/09/25 06:23:19 jsg Exp $ */
+/* $OpenBSD: sshconnect.c,v 1.382 2026/02/16 00:45:41 dtucker Exp $ */
/*
* Author: Tatu Ylonen <ylo@cs.hut.fi>
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -17,15 +17,12 @@
#include <sys/types.h>
#include <sys/wait.h>
-#include <sys/stat.h>
#include <sys/socket.h>
-#include <sys/time.h>
#include <net/if.h>
#include <netinet/in.h>
#include <arpa/inet.h>
-#include <ctype.h>
#include <errno.h>
#include <fcntl.h>
#include <limits.h>
@@ -44,7 +41,7 @@
#include "xmalloc.h"
#include "hostfile.h"
#include "ssh.h"
-#include "sshbuf.h"
+#include "compat.h"
#include "packet.h"
#include "sshkey.h"
#include "sshconnect.h"
@@ -52,11 +49,8 @@
#include "match.h"
#include "misc.h"
#include "readconf.h"
-#include "atomicio.h"
#include "dns.h"
#include "monitor_fdpass.h"
-#include "ssh2.h"
-#include "version.h"
#include "authfile.h"
#include "ssherr.h"
#include "authfd.h"
@@ -1084,7 +1078,7 @@ check_host_key(char *hostname, const struct ssh_conn_info *cinfo,
if (want_cert) {
if (sshkey_cert_check_host(host_key,
options.host_key_alias == NULL ?
- hostname : options.host_key_alias, 0,
+ hostname : options.host_key_alias,
options.ca_sign_algorithms, &fail_reason) != 0) {
error("%s", fail_reason);
goto fail;
@@ -1507,22 +1501,23 @@ verify_host_key(char *host, struct sockaddr *hostaddr, struct sshkey *host_key,
goto out;
}
- /* Check in RevokedHostKeys file if specified */
- if (options.revoked_host_keys != NULL) {
- r = sshkey_check_revoked(host_key, options.revoked_host_keys);
+ /* Check in RevokedHostKeys files if specified */
+ for (i = 0; i < options.num_revoked_host_keys; i++) {
+ r = sshkey_check_revoked(host_key,
+ options.revoked_host_keys[i]);
switch (r) {
case 0:
break; /* not revoked */
case SSH_ERR_KEY_REVOKED:
error("Host key %s %s revoked by file %s",
sshkey_type(host_key), fp,
- options.revoked_host_keys);
+ options.revoked_host_keys[i]);
r = -1;
goto out;
default:
error_r(r, "Error checking host key %s %s in "
"revoked keys file %s", sshkey_type(host_key),
- fp, options.revoked_host_keys);
+ fp, options.revoked_host_keys[i]);
r = -1;
goto out;
}
@@ -1609,6 +1604,11 @@ ssh_login(struct ssh *ssh, Sensitive *sensitive, const char *orighost,
options.version_addendum)) != 0)
sshpkt_fatal(ssh, r, "banner exchange");
+ if ((ssh->compat & SSH_BUG_NOREKEY)) {
+ logit("Warning: this server does not support rekeying.");
+ logit("This session will eventually fail");
+ }
+
/* Put the connection into non-blocking mode. */
ssh_packet_set_nonblocking(ssh);
diff --git a/sshconnect.h b/sshconnect.h
index 308270160405..4c19490da487 100644
--- a/sshconnect.h
+++ b/sshconnect.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: sshconnect.h,v 1.49 2025/03/01 06:11:26 dtucker Exp $ */
+/* $OpenBSD: sshconnect.h,v 1.50 2026/02/13 01:04:47 jsg Exp $ */
/*
* Copyright (c) 2000 Markus Friedl. All rights reserved.
@@ -50,7 +50,6 @@ struct ssh_conn_info {
struct addrinfo;
struct ssh;
struct hostkeys;
-struct ssh_conn_info;
/* default argument for client percent expansions, minus remote user */
#define DEFAULT_CLIENT_PERCENT_EXPAND_ARGS_NOUSER(conn_info) \
diff --git a/sshconnect2.c b/sshconnect2.c
index b3679c9d7f3c..478a9a52fd38 100644
--- a/sshconnect2.c
+++ b/sshconnect2.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sshconnect2.c,v 1.378 2025/09/15 04:51:35 djm Exp $ */
+/* $OpenBSD: sshconnect2.c,v 1.385 2026/04/02 07:48:13 djm Exp $ */
/*
* Copyright (c) 2000 Markus Friedl. All rights reserved.
* Copyright (c) 2008 Damien Miller. All rights reserved.
@@ -29,12 +29,12 @@
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/wait.h>
+#include <sys/queue.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#include <limits.h>
-#include <netdb.h>
#include <pwd.h>
#include <signal.h>
#include <stdio.h>
@@ -45,8 +45,6 @@
#include <vis.h>
#endif
-#include "openbsd-compat/sys-queue.h"
-
#include "xmalloc.h"
#include "ssh.h"
#include "ssh2.h"
@@ -58,7 +56,6 @@
#include "kex.h"
#include "sshconnect.h"
#include "authfile.h"
-#include "dh.h"
#include "authfd.h"
#include "log.h"
#include "misc.h"
@@ -68,7 +65,6 @@
#include "canohost.h"
#include "msg.h"
#include "pathnames.h"
-#include "uidswap.h"
#include "hostfile.h"
#include "ssherr.h"
#include "utf8.h"
@@ -89,6 +85,7 @@ extern Options options;
static char *xxx_host;
static struct sockaddr *xxx_hostaddr;
static const struct ssh_conn_info *xxx_conn_info;
+static int key_type_allowed(struct sshkey *, const char *);
static int
verify_host_key_callback(struct sshkey *hostkey, struct ssh *ssh)
@@ -98,6 +95,10 @@ verify_host_key_callback(struct sshkey *hostkey, struct ssh *ssh)
if ((r = sshkey_check_rsa_length(hostkey,
options.required_rsa_size)) != 0)
fatal_r(r, "Bad server host key");
+ if (!key_type_allowed(hostkey, options.hostkeyalgorithms)) {
+ fatal("Server host key %s not in HostKeyAlgorithms",
+ sshkey_ssh_name(hostkey));
+ }
if (verify_host_key(xxx_host, xxx_hostaddr, hostkey,
xxx_conn_info) != 0)
fatal("Host key verification failed.");
@@ -347,14 +348,14 @@ struct cauthmethod {
int *batch_flag; /* flag in option struct that disables method */
};
-static int input_userauth_service_accept(int, u_int32_t, struct ssh *);
-static int input_userauth_success(int, u_int32_t, struct ssh *);
-static int input_userauth_failure(int, u_int32_t, struct ssh *);
-static int input_userauth_banner(int, u_int32_t, struct ssh *);
-static int input_userauth_error(int, u_int32_t, struct ssh *);
-static int input_userauth_info_req(int, u_int32_t, struct ssh *);
-static int input_userauth_pk_ok(int, u_int32_t, struct ssh *);
-static int input_userauth_passwd_changereq(int, u_int32_t, struct ssh *);
+static int input_userauth_service_accept(int, uint32_t, struct ssh *);
+static int input_userauth_success(int, uint32_t, struct ssh *);
+static int input_userauth_failure(int, uint32_t, struct ssh *);
+static int input_userauth_banner(int, uint32_t, struct ssh *);
+static int input_userauth_error(int, uint32_t, struct ssh *);
+static int input_userauth_info_req(int, uint32_t, struct ssh *);
+static int input_userauth_pk_ok(int, uint32_t, struct ssh *);
+static int input_userauth_passwd_changereq(int, uint32_t, struct ssh *);
static int userauth_none(struct ssh *);
static int userauth_pubkey(struct ssh *);
@@ -365,10 +366,10 @@ static int userauth_hostbased(struct ssh *);
#ifdef GSSAPI
static int userauth_gssapi(struct ssh *);
static void userauth_gssapi_cleanup(struct ssh *);
-static int input_gssapi_response(int type, u_int32_t, struct ssh *);
-static int input_gssapi_token(int type, u_int32_t, struct ssh *);
-static int input_gssapi_error(int, u_int32_t, struct ssh *);
-static int input_gssapi_errtok(int, u_int32_t, struct ssh *);
+static int input_gssapi_response(int type, uint32_t, struct ssh *);
+static int input_gssapi_token(int type, uint32_t, struct ssh *);
+static int input_gssapi_error(int, uint32_t, struct ssh *);
+static int input_gssapi_errtok(int, uint32_t, struct ssh *);
#endif
void userauth(struct ssh *, char *);
@@ -488,7 +489,7 @@ ssh_userauth2(struct ssh *ssh, const char *local_user,
}
static int
-input_userauth_service_accept(int type, u_int32_t seq, struct ssh *ssh)
+input_userauth_service_accept(int type, uint32_t seq, struct ssh *ssh)
{
int r;
@@ -559,14 +560,14 @@ userauth(struct ssh *ssh, char *authlist)
}
static int
-input_userauth_error(int type, u_int32_t seq, struct ssh *ssh)
+input_userauth_error(int type, uint32_t seq, struct ssh *ssh)
{
fatal_f("bad message during authentication: type %d", type);
return 0;
}
static int
-input_userauth_banner(int type, u_int32_t seq, struct ssh *ssh)
+input_userauth_banner(int type, uint32_t seq, struct ssh *ssh)
{
char *msg = NULL;
size_t len;
@@ -585,7 +586,7 @@ input_userauth_banner(int type, u_int32_t seq, struct ssh *ssh)
}
static int
-input_userauth_success(int type, u_int32_t seq, struct ssh *ssh)
+input_userauth_success(int type, uint32_t seq, struct ssh *ssh)
{
Authctxt *authctxt = ssh->authctxt;
@@ -604,7 +605,7 @@ input_userauth_success(int type, u_int32_t seq, struct ssh *ssh)
#if 0
static int
-input_userauth_success_unexpected(int type, u_int32_t seq, struct ssh *ssh)
+input_userauth_success_unexpected(int type, uint32_t seq, struct ssh *ssh)
{
Authctxt *authctxt = ssh->authctxt;
@@ -618,7 +619,7 @@ input_userauth_success_unexpected(int type, u_int32_t seq, struct ssh *ssh)
#endif
static int
-input_userauth_failure(int type, u_int32_t seq, struct ssh *ssh)
+input_userauth_failure(int type, uint32_t seq, struct ssh *ssh)
{
Authctxt *authctxt = ssh->authctxt;
char *authlist = NULL;
@@ -678,7 +679,7 @@ format_identity(Identity *id)
}
static int
-input_userauth_pk_ok(int type, u_int32_t seq, struct ssh *ssh)
+input_userauth_pk_ok(int type, uint32_t seq, struct ssh *ssh)
{
Authctxt *authctxt = ssh->authctxt;
struct sshkey *key = NULL;
@@ -885,7 +886,7 @@ process_gssapi_token(struct ssh *ssh, gss_buffer_t recv_tok)
}
static int
-input_gssapi_response(int type, u_int32_t plen, struct ssh *ssh)
+input_gssapi_response(int type, uint32_t plen, struct ssh *ssh)
{
Authctxt *authctxt = ssh->authctxt;
Gssctxt *gssctxt;
@@ -929,7 +930,7 @@ input_gssapi_response(int type, u_int32_t plen, struct ssh *ssh)
}
static int
-input_gssapi_token(int type, u_int32_t plen, struct ssh *ssh)
+input_gssapi_token(int type, uint32_t plen, struct ssh *ssh)
{
Authctxt *authctxt = ssh->authctxt;
gss_buffer_desc recv_tok;
@@ -961,7 +962,7 @@ input_gssapi_token(int type, u_int32_t plen, struct ssh *ssh)
}
static int
-input_gssapi_errtok(int type, u_int32_t plen, struct ssh *ssh)
+input_gssapi_errtok(int type, uint32_t plen, struct ssh *ssh)
{
Authctxt *authctxt = ssh->authctxt;
Gssctxt *gssctxt;
@@ -995,7 +996,7 @@ input_gssapi_errtok(int type, u_int32_t plen, struct ssh *ssh)
}
static int
-input_gssapi_error(int type, u_int32_t plen, struct ssh *ssh)
+input_gssapi_error(int type, uint32_t plen, struct ssh *ssh)
{
char *msg = NULL;
char *lang = NULL;
@@ -1072,13 +1073,14 @@ userauth_passwd(struct ssh *ssh)
* parse PASSWD_CHANGEREQ, prompt user and send SSH2_MSG_USERAUTH_REQUEST
*/
static int
-input_userauth_passwd_changereq(int type, u_int32_t seqnr, struct ssh *ssh)
+input_userauth_passwd_changereq(int type, uint32_t seqnr, struct ssh *ssh)
{
Authctxt *authctxt = ssh->authctxt;
char *info = NULL, *lang = NULL, *password = NULL, *retype = NULL;
char prompt[256];
const char *host;
- int r;
+ int r, addnl;
+ size_t len;
debug2("input_userauth_passwd_changereq");
@@ -1090,8 +1092,10 @@ input_userauth_passwd_changereq(int type, u_int32_t seqnr, struct ssh *ssh)
if ((r = sshpkt_get_cstring(ssh, &info, NULL)) != 0 ||
(r = sshpkt_get_cstring(ssh, &lang, NULL)) != 0)
goto out;
- if (strlen(info) > 0)
- logit("%s", info);
+ if ((len = strlen(info)) > 0) {
+ addnl = info[len] != '\n';
+ fmprintf(stderr, "%s%s", info, addnl ? "\n" : "");
+ }
if ((r = sshpkt_start(ssh, SSH2_MSG_USERAUTH_REQUEST)) != 0 ||
(r = sshpkt_put_cstring(ssh, authctxt->server_user)) != 0 ||
(r = sshpkt_put_cstring(ssh, authctxt->service)) != 0 ||
@@ -1273,7 +1277,8 @@ identity_sign(struct identity *id, u_char **sigp, size_t *lenp,
* PKCS#11 tokens may not support all signature algorithms,
* so check what we get back.
*/
- if ((r = sshkey_check_sigtype(*sigp, *lenp, alg)) != 0) {
+ if ((id->key->flags & SSHKEY_FLAG_EXT) != 0 &&
+ (r = sshkey_check_sigtype(*sigp, *lenp, alg)) != 0) {
debug_fr(r, "sshkey_check_sigtype");
goto out;
}
@@ -1341,7 +1346,7 @@ sign_and_send_pubkey(struct ssh *ssh, Identity *id)
* This will try to set sign_id to the private key that will perform
* the signature.
*/
- if (sshkey_is_cert(id->key)) {
+ if (id->agent_fd == -1 && sshkey_is_cert(id->key)) {
TAILQ_FOREACH(private_id, &authctxt->keys, next) {
if (sshkey_equal_public(id->key, private_id->key) &&
id->key->type != private_id->key->type) {
@@ -1598,34 +1603,37 @@ load_identity_file(Identity *id)
}
static int
-key_type_allowed_by_config(struct sshkey *key)
+key_type_allowed(struct sshkey *key, const char *allowlist)
{
- if (match_pattern_list(sshkey_ssh_name(key),
- options.pubkey_accepted_algos, 0) == 1)
+ if (match_pattern_list(sshkey_ssh_name(key), allowlist, 0) == 1)
return 1;
/* RSA keys/certs might be allowed by alternate signature types */
switch (key->type) {
case KEY_RSA:
- if (match_pattern_list("rsa-sha2-512",
- options.pubkey_accepted_algos, 0) == 1)
+ if (match_pattern_list("rsa-sha2-512", allowlist, 0) == 1)
return 1;
- if (match_pattern_list("rsa-sha2-256",
- options.pubkey_accepted_algos, 0) == 1)
+ if (match_pattern_list("rsa-sha2-256", allowlist, 0) == 1)
return 1;
break;
case KEY_RSA_CERT:
if (match_pattern_list("rsa-sha2-512-cert-v01@openssh.com",
- options.pubkey_accepted_algos, 0) == 1)
+ allowlist, 0) == 1)
return 1;
if (match_pattern_list("rsa-sha2-256-cert-v01@openssh.com",
- options.pubkey_accepted_algos, 0) == 1)
+ allowlist, 0) == 1)
return 1;
break;
}
return 0;
}
+static int
+key_type_allowed_by_config(struct sshkey *key)
+{
+ return key_type_allowed(key, options.pubkey_accepted_algos);
+}
+
/* obtain a list of keys from the agent */
static int
get_agent_identities(struct ssh *ssh, int *agent_fdp,
@@ -1938,14 +1946,15 @@ userauth_kbdint(struct ssh *ssh)
* parse INFO_REQUEST, prompt user and send INFO_RESPONSE
*/
static int
-input_userauth_info_req(int type, u_int32_t seq, struct ssh *ssh)
+input_userauth_info_req(int type, uint32_t seq, struct ssh *ssh)
{
Authctxt *authctxt = ssh->authctxt;
char *name = NULL, *inst = NULL, *lang = NULL, *prompt = NULL;
char *display_prompt = NULL, *response = NULL;
u_char echo = 0;
u_int num_prompts, i;
- int r;
+ int r, addnl;
+ size_t len;
debug2_f("entering");
@@ -1958,10 +1967,14 @@ input_userauth_info_req(int type, u_int32_t seq, struct ssh *ssh)
(r = sshpkt_get_cstring(ssh, &inst, NULL)) != 0 ||
(r = sshpkt_get_cstring(ssh, &lang, NULL)) != 0)
goto out;
- if (strlen(name) > 0)
- logit("%s", name);
- if (strlen(inst) > 0)
- logit("%s", inst);
+ if ((len = strlen(name)) > 0) {
+ addnl = name[len] != '\n';
+ fmprintf(stderr, "%s%s", name, addnl ? "\n" : "");
+ }
+ if ((len = strlen(inst)) > 0) {
+ addnl = inst[len] != '\n';
+ fmprintf(stderr, "%s%s", inst, addnl ? "\n" : "");
+ }
if ((r = sshpkt_get_u32(ssh, &num_prompts)) != 0)
goto out;
diff --git a/sshd-auth.c b/sshd-auth.c
index 9c31515de18f..76350a2a3501 100644
--- a/sshd-auth.c
+++ b/sshd-auth.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sshd-auth.c,v 1.9 2025/09/15 04:52:12 djm Exp $ */
+/* $OpenBSD: sshd-auth.c,v 1.14 2026/03/11 09:10:59 dtucker Exp $ */
/*
* SSH2 implementation:
* Privilege Separation:
@@ -32,12 +32,11 @@
#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/wait.h>
+#include <sys/tree.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <sys/time.h>
-
-#include "openbsd-compat/sys-tree.h"
-#include "openbsd-compat/sys-queue.h"
+#include <sys/queue.h>
#include <errno.h>
#include <fcntl.h>
@@ -588,10 +587,6 @@ main(int ac, char **av)
if (!rexeced_flag)
fatal("sshd-auth should not be executed directly");
-#ifdef WITH_OPENSSL
- OpenSSL_add_all_algorithms();
-#endif
-
log_init(__progname,
options.log_level == SYSLOG_LEVEL_NOT_SET ?
SYSLOG_LEVEL_INFO : options.log_level,
@@ -720,8 +715,8 @@ main(int ac, char **av)
setproctitle("%s", "[session-auth]");
/* Executed child processes don't need these. */
- fcntl(sock_out, F_SETFD, FD_CLOEXEC);
- fcntl(sock_in, F_SETFD, FD_CLOEXEC);
+ FD_CLOSEONEXEC(sock_out);
+ FD_CLOSEONEXEC(sock_in);
ssh_signal(SIGPIPE, SIG_IGN);
ssh_signal(SIGALRM, SIG_DFL);
@@ -754,9 +749,6 @@ main(int ac, char **av)
fatal("sshbuf_new loginmsg failed");
auth_debug_reset();
- /* Enable challenge-response authentication for privilege separation */
- privsep_challenge_enable();
-
#ifdef GSSAPI
/* Cache supported mechanism OIDs for later use */
ssh_gssapi_prepare_supported_oids();
@@ -819,6 +811,14 @@ do_ssh2_kex(struct ssh *ssh)
free(hkalgs);
+ if ((r = kex_exchange_identification(ssh, -1,
+ options.version_addendum)) != 0)
+ sshpkt_fatal(ssh, r, "banner exchange");
+ mm_sshkey_setcompat(ssh); /* tell monitor */
+
+ if ((ssh->compat & SSH_BUG_NOREKEY))
+ debug("client does not support rekeying");
+
/* start key exchange */
if ((r = kex_setup(ssh, myproposal)) != 0)
fatal_r(r, "kex_setup");
diff --git a/sshd-session.c b/sshd-session.c
index 8979f743bfdf..e9a488d08906 100644
--- a/sshd-session.c
+++ b/sshd-session.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sshd-session.c,v 1.16 2025/09/25 06:45:50 djm Exp $ */
+/* $OpenBSD: sshd-session.c,v 1.23 2026/03/11 09:10:59 dtucker Exp $ */
/*
* SSH2 implementation:
* Privilege Separation:
@@ -31,12 +31,12 @@
#include <sys/types.h>
#include <sys/ioctl.h>
-#include <sys/socket.h>
+#include <sys/wait.h>
+#include <sys/tree.h>
#include <sys/stat.h>
+#include <sys/socket.h>
#include <sys/time.h>
-#include "openbsd-compat/sys-tree.h"
-#include "openbsd-compat/sys-queue.h"
-#include <sys/wait.h>
+#include <sys/queue.h>
#include <errno.h>
#include <fcntl.h>
@@ -52,13 +52,6 @@
#include <unistd.h>
#include <limits.h>
-#ifdef WITH_OPENSSL
-#include <openssl/bn.h>
-#include <openssl/evp.h>
-#include <openssl/rand.h>
-#include "openbsd-compat/openssl-compat.h"
-#endif
-
#ifdef HAVE_SECUREWARE
#include <sys/security.h>
#include <prot.h>
@@ -269,27 +262,6 @@ demote_sensitive_data(void)
}
}
-static void
-reseed_prngs(void)
-{
- u_int32_t rnd[256];
-
-#ifdef WITH_OPENSSL
- RAND_poll();
-#endif
- arc4random_stir(); /* noop on recent arc4random() implementations */
- arc4random_buf(rnd, sizeof(rnd)); /* let arc4random notice PID change */
-
-#ifdef WITH_OPENSSL
- RAND_seed(rnd, sizeof(rnd));
- /* give libcrypto a chance to notice the PID change */
- if ((RAND_bytes((u_char *)rnd, 1)) != 1)
- fatal_f("RAND_bytes failed");
-#endif
-
- explicit_bzero(rnd, sizeof(rnd));
-}
-
struct sshbuf *
pack_hostkeys(void)
{
@@ -405,7 +377,7 @@ privsep_postauth(struct ssh *ssh, Authctxt *authctxt)
* Hack for systems that don't support FD passing: retain privileges
* in the post-auth privsep process so it can allocate PTYs directly.
* This is basically equivalent to what we did <= 9.7, which was to
- * disable post-auth privsep entriely.
+ * disable post-auth privsep entirely.
* Cygwin doesn't need to drop privs here although it doesn't support
* fd passing, as AFAIK PTY allocation on this platform doesn't require
* special privileges to begin with.
@@ -818,7 +790,7 @@ main(int ac, char **av)
const char *remote_ip, *rdomain;
char *line, *laddr, *logfile = NULL;
u_int i;
- u_int64_t ibytes, obytes;
+ uint64_t ibytes, obytes;
mode_t new_umask;
Authctxt *authctxt;
struct connection_info *connection_info = NULL;
@@ -1165,8 +1137,8 @@ main(int ac, char **av)
setproctitle("%s", "[accepted]");
/* Executed child processes don't need these. */
- fcntl(sock_out, F_SETFD, FD_CLOEXEC);
- fcntl(sock_in, F_SETFD, FD_CLOEXEC);
+ FD_CLOSEONEXEC(sock_out);
+ FD_CLOSEONEXEC(sock_in);
/* We will not restart on SIGHUP since it no longer makes sense. */
ssh_signal(SIGALRM, SIG_DFL);
@@ -1248,10 +1220,6 @@ main(int ac, char **av)
fatal("login grace time setitimer failed");
}
- if ((r = kex_exchange_identification(ssh, -1,
- options.version_addendum)) != 0)
- sshpkt_fatal(ssh, r, "banner exchange");
-
ssh_packet_set_nonblocking(ssh);
/* allocate authentication context */
@@ -1375,8 +1343,6 @@ sshd_hostkey_sign(struct ssh *ssh, struct sshkey *privkey,
void
cleanup_exit(int i)
{
- extern int auth_attempted; /* monitor.c */
-
if (the_active_state != NULL && the_authctxt != NULL) {
do_cleanup(the_active_state, the_authctxt);
if (privsep_is_preauth &&
@@ -1395,7 +1361,9 @@ cleanup_exit(int i)
audit_event(the_active_state, SSH_CONNECTION_ABANDON);
#endif
/* Override default fatal exit value when auth was attempted */
- if (i == 255 && auth_attempted)
+ if (i == 255 && monitor_auth_attempted())
_exit(EXIT_AUTH_ATTEMPTED);
+ if (i == 255 && monitor_invalid_user())
+ _exit(EXIT_INVALID_USER);
_exit(i);
}
diff --git a/sshd.0 b/sshd.0
index eddbeec0bd9c..890adcb3395e 100644
--- a/sshd.0
+++ b/sshd.0
@@ -684,4 +684,4 @@ AUTHORS
versions 1.5 and 2.0. Niels Provos and Markus Friedl contributed support
for privilege separation.
-OpenBSD 7.7 October 4, 2025 OpenBSD 7.7
+OpenBSD 7.8 October 4, 2025 SSHD(8)
diff --git a/sshd.c b/sshd.c
index 3c76b60b0f03..74d25fc73fbe 100644
--- a/sshd.c
+++ b/sshd.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sshd.c,v 1.622 2025/08/29 03:50:38 djm Exp $ */
+/* $OpenBSD: sshd.c,v 1.626 2026/02/09 21:21:39 dtucker Exp $ */
/*
* Copyright (c) 2000, 2001, 2002 Markus Friedl. All rights reserved.
* Copyright (c) 2002 Niels Provos. All rights reserved.
@@ -31,8 +31,7 @@
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/time.h>
-#include "openbsd-compat/sys-tree.h"
-#include "openbsd-compat/sys-queue.h"
+#include <sys/queue.h>
#include <sys/wait.h>
#include <sys/utsname.h>
@@ -52,12 +51,6 @@
#include <unistd.h>
#include <limits.h>
-#ifdef WITH_OPENSSL
-#include <openssl/evp.h>
-#include <openssl/rand.h>
-#include "openbsd-compat/openssl-compat.h"
-#endif
-
#ifdef HAVE_SECUREWARE
#include <sys/security.h>
#include <prot.h>
@@ -399,6 +392,12 @@ child_reap(struct early_child *child)
"after unsuccessful auth attempt%s",
(long)child->pid, child->id, child_status);
break;
+ case EXIT_INVALID_USER:
+ penalty_type = SRCLIMIT_PENALTY_INVALIDUSER;
+ debug_f("preauth child %ld for %s exited "
+ "after auth attempt by invalid user%s",
+ (long)child->pid, child->id, child_status);
+ break;
case EXIT_CONFIG_REFUSED:
penalty_type = SRCLIMIT_PENALTY_REFUSECONNECTION;
debug_f("preauth child %ld for %s prohibited by"
@@ -923,7 +922,6 @@ server_accept_loop(int *sock_in, int *sock_out, int *newsock, int *config_s,
struct early_child *child;
struct sshbuf *buf;
socklen_t fromlen;
- u_char rnd[256];
sigset_t nsigset, osigset;
/* pipes connected to unauthenticated child sshd processes */
@@ -1220,14 +1218,7 @@ server_accept_loop(int *sock_in, int *sock_out, int *newsock, int *config_s,
* Ensure that our random state differs
* from that of the child
*/
- arc4random_stir();
- arc4random_buf(rnd, sizeof(rnd));
-#ifdef WITH_OPENSSL
- RAND_seed(rnd, sizeof(rnd));
- if ((RAND_bytes((u_char *)rnd, 1)) != 1)
- fatal_f("RAND_bytes failed");
-#endif
- explicit_bzero(rnd, sizeof(rnd));
+ reseed_prngs();
}
}
}
diff --git a/sshd_config.0 b/sshd_config.0
index c63d729a98a4..770ec742e42b 100644
--- a/sshd_config.0
+++ b/sshd_config.0
@@ -45,8 +45,8 @@ DESCRIPTION
users whose primary group or supplementary group list matches one
of the patterns. Only group names are valid; a numerical group
ID is not recognized. By default, login is allowed for all
- groups. The allow/deny groups directives are processed in the
- following order: DenyGroups, AllowGroups.
+ groups. AllowGroups is not consulted for groups matched by
+ DenyGroups.
See PATTERNS in ssh_config(5) for more information on patterns.
This keyword may appear multiple times in sshd_config with each
@@ -80,8 +80,8 @@ DESCRIPTION
USER@HOST then USER and HOST are separately checked, restricting
logins to particular users from particular hosts. HOST criteria
may additionally contain addresses to match in CIDR
- address/masklen format. The allow/deny users directives are
- processed in the following order: DenyUsers, AllowUsers.
+ address/masklen format. AllowUsers is not consulted for users
+ matched by DenyUsers.
See PATTERNS in ssh_config(5) for more information on patterns.
This keyword may appear multiple times in sshd_config with each
@@ -137,7 +137,8 @@ DESCRIPTION
of authorized_keys output (see AUTHORIZED_KEYS in sshd(8)).
AuthorizedKeysCommand is tried after the usual AuthorizedKeysFile
files and will not be executed if a matching key is found there.
- By default, no AuthorizedKeysCommand is run.
+ By default, no AuthorizedKeysCommand is run. This command is
+ only executed for valid users.
AuthorizedKeysCommandUser
Specifies the user under whose account the AuthorizedKeysCommand
@@ -156,7 +157,8 @@ DESCRIPTION
Multiple files may be listed, separated by whitespace.
Alternately this option may be set to none to skip checking for
user keys in files. The default is ".ssh/authorized_keys
- .ssh/authorized_keys2".
+ .ssh/authorized_keys2". These files are only checked for valid
+ users.
AuthorizedPrincipalsCommand
Specifies a program to be used to generate the list of allowed
@@ -172,7 +174,8 @@ DESCRIPTION
AuthorizedPrincipalsCommand or AuthorizedPrincipalsFile is
specified, then certificates offered by the client for
authentication must contain a principal that is listed. By
- default, no AuthorizedPrincipalsCommand is run.
+ default, no AuthorizedPrincipalsCommand is run. This command is
+ only executed for valid users.
AuthorizedPrincipalsCommandUser
Specifies the user under whose account the
@@ -197,7 +200,8 @@ DESCRIPTION
path or one relative to the user's home directory. The default
is none, i.e. not to use a principals file M-bM-^@M-^S in this case, the
username of the user must appear in a certificate's principals
- list for it to be accepted.
+ list for it to be accepted. This file is only checked for valid
+ users.
Note that AuthorizedPrincipalsFile is only used when
authentication proceeds using a CA listed in TrustedUserCAKeys
@@ -380,9 +384,8 @@ DESCRIPTION
separated by spaces. Login is disallowed for users whose primary
group or supplementary group list matches one of the patterns.
Only group names are valid; a numerical group ID is not
- recognized. By default, login is allowed for all groups. The
- allow/deny groups directives are processed in the following
- order: DenyGroups, AllowGroups.
+ recognized. By default, login is allowed for all groups.
+ AllowGroups is not consulted for groups matched by DenyGroups.
See PATTERNS in ssh_config(5) for more information on patterns.
This keyword may appear multiple times in sshd_config with each
@@ -397,8 +400,8 @@ DESCRIPTION
then USER and HOST are separately checked, restricting logins to
particular users from particular hosts. HOST criteria may
additionally contain addresses to match in CIDR address/masklen
- format. The allow/deny users directives are processed in the
- following order: DenyUsers, AllowUsers.
+ format. AllowUsers is not consulted for users matched by
+ DenyUsers.
See PATTERNS in ssh_config(5) for more information on patterns.
This keyword may appear multiple times in sshd_config with each
@@ -432,6 +435,12 @@ DESCRIPTION
that requires no support files when used with ChrootDirectory.
The default is none.
+ This directive does not limit other kinds of access that a client
+ may request via their connection, such as TCP, agent, socket or
+ X11 forwarding. If these are not desired, then they must be
+ explicitly disabled, either individually via their respective
+ options or all together using the DisableForwarding option.
+
GatewayPorts
Specifies whether remote hosts are allowed to connect to ports
forwarded for the client. By default, sshd(8) binds remote port
@@ -453,6 +462,10 @@ DESCRIPTION
Specifies whether to automatically destroy the user's credentials
cache on logout. The default is yes.
+ GSSAPIDelegateCredentials
+ Accept delegated credentials on the server side. The default is
+ yes.
+
GSSAPIStrictAcceptorCheck
Determines whether to be strict about the identity of the GSSAPI
acceptor a client authenticates against. If set to yes then the
@@ -481,12 +494,14 @@ DESCRIPTION
ecdsa-sha2-nistp521-cert-v01@openssh.com,
sk-ssh-ed25519-cert-v01@openssh.com,
sk-ecdsa-sha2-nistp256-cert-v01@openssh.com,
+ webauthn-sk-ecdsa-sha2-nistp256-cert-v01@openssh.com,
rsa-sha2-512-cert-v01@openssh.com,
rsa-sha2-256-cert-v01@openssh.com,
ssh-ed25519,
ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,
sk-ssh-ed25519@openssh.com,
sk-ecdsa-sha2-nistp256@openssh.com,
+ webauthn-sk-ecdsa-sha2-nistp256@openssh.com,
rsa-sha2-512,rsa-sha2-256
The list of available signature algorithms may also be obtained
@@ -543,12 +558,14 @@ DESCRIPTION
ecdsa-sha2-nistp521-cert-v01@openssh.com,
sk-ssh-ed25519-cert-v01@openssh.com,
sk-ecdsa-sha2-nistp256-cert-v01@openssh.com,
+ webauthn-sk-ecdsa-sha2-nistp256-cert-v01@openssh.com,
rsa-sha2-512-cert-v01@openssh.com,
rsa-sha2-256-cert-v01@openssh.com,
ssh-ed25519,
ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,
sk-ssh-ed25519@openssh.com,
sk-ecdsa-sha2-nistp256@openssh.com,
+ webauthn-sk-ecdsa-sha2-nistp256@openssh.com,
rsa-sha2-512,rsa-sha2-256
The list of available signature algorithms may also be obtained
@@ -818,15 +835,16 @@ DESCRIPTION
Specifies the maximum number of concurrent unauthenticated
connections to the SSH daemon. Additional connections will be
dropped until authentication succeeds or the LoginGraceTime
- expires for a connection. The default is 10:30:100.
+ expires for a connection.
Alternatively, random early drop can be enabled by specifying the
three colon separated values start:rate:full (e.g. "10:30:60").
- sshd(8) will refuse connection attempts with a probability of
- rate/100 (30%) if there are currently start (10) unauthenticated
- connections. The probability increases linearly and all
- connection attempts are refused if the number of unauthenticated
- connections reaches full (60).
+ The default is 10:30:100. sshd(8) will refuse connection
+ attempts with a probability of rate/100 (30%) if there are
+ currently start (10) unauthenticated connections. The
+ probability increases linearly and all connection attempts are
+ refused if the number of unauthenticated connections reaches full
+ (60).
ModuliFile
Specifies the moduli(5) file that contains the Diffie-Hellman
@@ -972,6 +990,10 @@ DESCRIPTION
after making one or more unsuccessful authentication
attempts (default: 5s).
+ invaliduser:duration
+ Specifies how long to refuse clients that attempt to log
+ in with an invalid user (default: 5s).
+
refuseconnection:duration
Specifies how long to refuse clients that were
administratively prohibited connection via the
@@ -1067,12 +1089,14 @@ DESCRIPTION
ecdsa-sha2-nistp521-cert-v01@openssh.com,
sk-ssh-ed25519-cert-v01@openssh.com,
sk-ecdsa-sha2-nistp256-cert-v01@openssh.com,
+ webauthn-sk-ecdsa-sha2-nistp256-cert-v01@openssh.com,
rsa-sha2-512-cert-v01@openssh.com,
rsa-sha2-256-cert-v01@openssh.com,
ssh-ed25519,
ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,
sk-ssh-ed25519@openssh.com,
sk-ecdsa-sha2-nistp256@openssh.com,
+ webauthn-sk-ecdsa-sha2-nistp256@openssh.com,
rsa-sha2-512,rsa-sha2-256
The list of available signature algorithms may also be obtained
@@ -1136,8 +1160,12 @@ DESCRIPTION
public key authentication will be refused for all users. Keys
may be specified as a text file, listing one public key per line,
or as an OpenSSH Key Revocation List (KRL) as generated by
- ssh-keygen(1). For more information on KRLs, see the KEY
- REVOCATION LISTS section in ssh-keygen(1).
+ ssh-keygen(1). This file may be consulted for each public key
+ authentication attempt received by sshd(8) and its contents must
+ be consistent at all times, therefore it should only be
+ atomically replaced and never modified in place while the server
+ is running. For more information on KRLs, see the KEY REVOCATION
+ LISTS section in ssh-keygen(1).
RDomain
Specifies an explicit routing domain that is applied after
@@ -1365,7 +1393,11 @@ TIME FORMATS
TOKENS
Arguments to some keywords can make use of tokens, which are expanded at
- runtime:
+ runtime. Tokens are expanded without quoting or escaping of shell
+ characters. It is the administrator's responsibility to ensure they are
+ safe in the context of their use.
+
+ The supported tokens in sshd_config are:
%% A literal M-bM-^@M-^X%M-bM-^@M-^Y.
%C Identifies the connection endpoints, containing four space-
@@ -1416,4 +1448,4 @@ AUTHORS
versions 1.5 and 2.0. Niels Provos and Markus Friedl contributed support
for privilege separation.
-OpenBSD 7.7 October 4, 2025 OpenBSD 7.7
+OpenBSD 7.8 March 28, 2026 SSHD_CONFIG(5)
diff --git a/sshd_config.5 b/sshd_config.5
index 6ae606f1e04f..3f5e29812d3f 100644
--- a/sshd_config.5
+++ b/sshd_config.5
@@ -33,8 +33,8 @@
.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
.\"
-.\" $OpenBSD: sshd_config.5,v 1.385 2025/10/04 21:41:35 naddy Exp $
-.Dd $Mdocdate: October 4 2025 $
+.\" $OpenBSD: sshd_config.5,v 1.397 2026/03/28 05:07:12 djm Exp $
+.Dd $Mdocdate: March 28 2026 $
.Dt SSHD_CONFIG 5
.Os
.Sh NAME
@@ -113,9 +113,9 @@ If specified, login is allowed only for users whose primary
group or supplementary group list matches one of the patterns.
Only group names are valid; a numerical group ID is not recognized.
By default, login is allowed for all groups.
-The allow/deny groups directives are processed in the following order:
-.Cm DenyGroups ,
-.Cm AllowGroups .
+.Cm AllowGroups
+is not consulted for groups matched by
+.Cm DenyGroups .
.Pp
See PATTERNS in
.Xr ssh_config 5
@@ -173,9 +173,9 @@ are separately checked, restricting logins to particular
users from particular hosts.
HOST criteria may additionally contain addresses to match in CIDR
address/masklen format.
-The allow/deny users directives are processed in the following order:
-.Cm DenyUsers ,
-.Cm AllowUsers .
+.Cm AllowUsers
+is not consulted for users matched by
+.Cm DenyUsers .
.Pp
See PATTERNS in
.Xr ssh_config 5
@@ -260,6 +260,7 @@ files and will not be executed if a matching key is found there.
By default, no
.Cm AuthorizedKeysCommand
is run.
+This command is only executed for valid users.
.It Cm AuthorizedKeysCommandUser
Specifies the user under whose account the
.Cm AuthorizedKeysCommand
@@ -292,6 +293,7 @@ Alternately this option may be set to
to skip checking for user keys in files.
The default is
.Qq .ssh/authorized_keys .ssh/authorized_keys2 .
+These files are only checked for valid users.
.It Cm AuthorizedPrincipalsCommand
Specifies a program to be used to generate the list of allowed
certificate principals as per
@@ -318,6 +320,7 @@ must contain a principal that is listed.
By default, no
.Cm AuthorizedPrincipalsCommand
is run.
+This command is only executed for valid users.
.It Cm AuthorizedPrincipalsCommandUser
Specifies the user under whose account the
.Cm AuthorizedPrincipalsCommand
@@ -359,6 +362,7 @@ The default is
i.e. not to use a principals file \(en in this case, the username
of the user must appear in a certificate's principals list for it to be
accepted.
+This file is only checked for valid users.
.Pp
Note that
.Cm AuthorizedPrincipalsFile
@@ -636,9 +640,9 @@ Login is disallowed for users whose primary group or supplementary
group list matches one of the patterns.
Only group names are valid; a numerical group ID is not recognized.
By default, login is allowed for all groups.
-The allow/deny groups directives are processed in the following order:
-.Cm DenyGroups ,
-.Cm AllowGroups .
+.Cm AllowGroups
+is not consulted for groups matched by
+.Cm DenyGroups .
.Pp
See PATTERNS in
.Xr ssh_config 5
@@ -657,9 +661,9 @@ are separately checked, restricting logins to particular
users from particular hosts.
HOST criteria may additionally contain addresses to match in CIDR
address/masklen format.
-The allow/deny users directives are processed in the following order:
-.Cm DenyUsers ,
-.Cm AllowUsers .
+.Cm AllowUsers
+is not consulted for users matched by
+.Cm DenyUsers .
.Pp
See PATTERNS in
.Xr ssh_config 5
@@ -710,6 +714,14 @@ files when used with
.Cm ChrootDirectory .
The default is
.Cm none .
+.Pp
+This directive does not limit other kinds of access that a
+client may request via their connection, such as TCP, agent, socket or
+X11 forwarding.
+If these are not desired, then they must be explicitly disabled, either
+individually via their respective options or all together using the
+.Cm DisableForwarding
+option.
.It Cm GatewayPorts
Specifies whether remote hosts are allowed to connect to ports
forwarded for the client.
@@ -739,6 +751,10 @@ Specifies whether to automatically destroy the user's credentials cache
on logout.
The default is
.Cm yes .
+.It Cm GSSAPIDelegateCredentials
+Accept delegated credentials on the server side.
+The default is
+.Cm yes .
.It Cm GSSAPIStrictAcceptorCheck
Determines whether to be strict about the identity of the GSSAPI acceptor
a client authenticates against.
@@ -776,12 +792,14 @@ ecdsa-sha2-nistp384-cert-v01@openssh.com,
ecdsa-sha2-nistp521-cert-v01@openssh.com,
sk-ssh-ed25519-cert-v01@openssh.com,
sk-ecdsa-sha2-nistp256-cert-v01@openssh.com,
+webauthn-sk-ecdsa-sha2-nistp256-cert-v01@openssh.com,
rsa-sha2-512-cert-v01@openssh.com,
rsa-sha2-256-cert-v01@openssh.com,
ssh-ed25519,
ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,
sk-ssh-ed25519@openssh.com,
sk-ecdsa-sha2-nistp256@openssh.com,
+webauthn-sk-ecdsa-sha2-nistp256@openssh.com,
rsa-sha2-512,rsa-sha2-256
.Ed
.Pp
@@ -860,12 +878,14 @@ ecdsa-sha2-nistp384-cert-v01@openssh.com,
ecdsa-sha2-nistp521-cert-v01@openssh.com,
sk-ssh-ed25519-cert-v01@openssh.com,
sk-ecdsa-sha2-nistp256-cert-v01@openssh.com,
+webauthn-sk-ecdsa-sha2-nistp256-cert-v01@openssh.com,
rsa-sha2-512-cert-v01@openssh.com,
rsa-sha2-256-cert-v01@openssh.com,
ssh-ed25519,
ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,
sk-ssh-ed25519@openssh.com,
sk-ecdsa-sha2-nistp256@openssh.com,
+webauthn-sk-ecdsa-sha2-nistp256@openssh.com,
rsa-sha2-512,rsa-sha2-256
.Ed
.Pp
@@ -1366,11 +1386,11 @@ SSH daemon.
Additional connections will be dropped until authentication succeeds or the
.Cm LoginGraceTime
expires for a connection.
-The default is 10:30:100.
.Pp
Alternatively, random early drop can be enabled by specifying
the three colon separated values
start:rate:full (e.g. "10:30:60").
+The default is 10:30:100.
.Xr sshd 8
will refuse connection attempts with a probability of rate/100 (30%)
if there are currently start (10) unauthenticated connections.
@@ -1611,6 +1631,9 @@ Specifies how long to refuse clients that cause a crash of
.It Cm authfail:duration
Specifies how long to refuse clients that disconnect after making one or more
unsuccessful authentication attempts (default: 5s).
+.It Cm invaliduser:duration
+Specifies how long to refuse clients that attempt to log in with an invalid
+user (default: 5s).
.It Cm refuseconnection:duration
Specifies how long to refuse clients that were administratively prohibited
connection via the
@@ -1723,12 +1746,14 @@ ecdsa-sha2-nistp384-cert-v01@openssh.com,
ecdsa-sha2-nistp521-cert-v01@openssh.com,
sk-ssh-ed25519-cert-v01@openssh.com,
sk-ecdsa-sha2-nistp256-cert-v01@openssh.com,
+webauthn-sk-ecdsa-sha2-nistp256-cert-v01@openssh.com,
rsa-sha2-512-cert-v01@openssh.com,
rsa-sha2-256-cert-v01@openssh.com,
ssh-ed25519,
ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,
sk-ssh-ed25519@openssh.com,
sk-ecdsa-sha2-nistp256@openssh.com,
+webauthn-sk-ecdsa-sha2-nistp256@openssh.com,
rsa-sha2-512,rsa-sha2-256
.Ed
.Pp
@@ -1830,6 +1855,11 @@ be refused for all users.
Keys may be specified as a text file, listing one public key per line, or as
an OpenSSH Key Revocation List (KRL) as generated by
.Xr ssh-keygen 1 .
+This file may be consulted for each public key authentication attempt
+received by
+.Xr sshd 8
+and its contents must be consistent at all times, therefore it should only
+be atomically replaced and never modified in place while the server is running.
For more information on KRLs, see the KEY REVOCATION LISTS section in
.Xr ssh-keygen 1 .
.It Cm RDomain
@@ -2168,7 +2198,14 @@ Time format examples:
.El
.Sh TOKENS
Arguments to some keywords can make use of tokens,
-which are expanded at runtime:
+which are expanded at runtime.
+Tokens are expanded without quoting or escaping of shell characters.
+It is the administrator's responsibility to ensure they are safe in the
+context of their use.
+.Pp
+The supported tokens in
+.Nm
+are:
.Pp
.Bl -tag -width XXXX -offset indent -compact
.It %%
diff --git a/ssherr-libcrypto.c b/ssherr-libcrypto.c
new file mode 100644
index 000000000000..5b817e54aa80
--- /dev/null
+++ b/ssherr-libcrypto.c
@@ -0,0 +1,59 @@
+/* $OpenBSD: ssherr-libcrypto.c,v 1.1 2026/02/06 23:31:29 dtucker Exp $ */
+/*
+ * Copyright (c) 2026 Darren Tucker
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include "includes.h"
+
+#include <sys/types.h>
+
+#include <errno.h>
+#include <string.h>
+
+#include "log.h"
+
+#ifdef WITH_OPENSSL
+#include <openssl/err.h>
+
+const char *
+ssherr_libcrypto(void)
+{
+ unsigned long e;
+ static char buf[512];
+ char msg[4096];
+ const char *reason = NULL, *file, *data;
+ int ln, fl;
+
+ ERR_load_crypto_strings();
+ while ((e = ERR_get_error_line_data(&file, &ln, &data, &fl)) != 0) {
+ ERR_error_string_n(e, buf, sizeof(buf));
+ snprintf(msg, sizeof(msg), "%s:%s:%d:%s", buf, file, ln,
+ (fl & ERR_TXT_STRING) ? data : "");
+ debug("libcrypto: '%s'", msg);
+ if ((reason = ERR_reason_error_string(e)) != NULL)
+ snprintf(buf, sizeof(buf), "error in libcrypto: %s",
+ reason);
+ }
+ if (reason == NULL)
+ return NULL;
+ return buf;
+}
+#else
+const char *
+ssherr_libcrypto(void)
+{
+ return NULL;
+}
+#endif
diff --git a/ssherr-nolibcrypto.c b/ssherr-nolibcrypto.c
new file mode 100644
index 000000000000..039d69d06432
--- /dev/null
+++ b/ssherr-nolibcrypto.c
@@ -0,0 +1,26 @@
+/* $OpenBSD: ssherr-nolibcrypto.c,v 1.1 2026/02/06 23:31:29 dtucker Exp $ */
+/*
+ * Copyright (c) 2026 Darren Tucker
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <stddef.h>
+
+#include "ssherr.h"
+
+const char *
+ssherr_libcrypto(void)
+{
+ return NULL;
+}
diff --git a/ssherr.c b/ssherr.c
index bd954aadd729..d22072de7966 100644
--- a/ssherr.c
+++ b/ssherr.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ssherr.c,v 1.10 2020/01/25 23:13:09 djm Exp $ */
+/* $OpenBSD: ssherr.c,v 1.11 2026/02/06 23:31:29 dtucker Exp $ */
/*
* Copyright (c) 2011 Damien Miller
*
@@ -22,6 +22,8 @@
const char *
ssh_err(int n)
{
+ const char *msg = NULL;
+
switch (n) {
case SSH_ERR_SUCCESS:
return "success";
@@ -68,7 +70,8 @@ ssh_err(int n)
case SSH_ERR_SIGNATURE_INVALID:
return "incorrect signature";
case SSH_ERR_LIBCRYPTO_ERROR:
- return "error in libcrypto"; /* XXX fetch and return */
+ msg = ssherr_libcrypto();
+ return msg != NULL ? msg : "error in libcrypto";
case SSH_ERR_UNEXPECTED_TRAILING_DATA:
return "unexpected bytes remain after decoding";
case SSH_ERR_SYSTEM_ERROR:
diff --git a/ssherr.h b/ssherr.h
index 085e752744d8..3dac27ab0234 100644
--- a/ssherr.h
+++ b/ssherr.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: ssherr.h,v 1.8 2020/01/25 23:13:09 djm Exp $ */
+/* $OpenBSD: ssherr.h,v 1.9 2026/02/06 23:31:29 dtucker Exp $ */
/*
* Copyright (c) 2011 Damien Miller
*
@@ -85,5 +85,7 @@
/* Translate a numeric error code to a human-readable error string */
const char *ssh_err(int n);
+/* Return most recent error from libcrypto. */
+const char *ssherr_libcrypto(void);
#endif /* _SSHERR_H */
diff --git a/sshkey.c b/sshkey.c
index afd7822c4f41..59d14531c473 100644
--- a/sshkey.c
+++ b/sshkey.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sshkey.c,v 1.155 2025/10/03 00:08:02 djm Exp $ */
+/* $OpenBSD: sshkey.c,v 1.161 2026/02/06 22:59:18 dtucker Exp $ */
/*
* Copyright (c) 2000, 2001 Markus Friedl. All rights reserved.
* Copyright (c) 2008 Alexander von Gernler. All rights reserved.
@@ -96,6 +96,7 @@ extern const struct sshkey_impl sshkey_ed25519_sk_cert_impl;
extern const struct sshkey_impl sshkey_ecdsa_sk_impl;
extern const struct sshkey_impl sshkey_ecdsa_sk_cert_impl;
extern const struct sshkey_impl sshkey_ecdsa_sk_webauthn_impl;
+extern const struct sshkey_impl sshkey_ecdsa_sk_webauthn_cert_impl;
# endif /* ENABLE_SK */
extern const struct sshkey_impl sshkey_ecdsa_nistp256_impl;
extern const struct sshkey_impl sshkey_ecdsa_nistp256_cert_impl;
@@ -135,6 +136,7 @@ const struct sshkey_impl * const keyimpls[] = {
&sshkey_ecdsa_sk_impl,
&sshkey_ecdsa_sk_cert_impl,
&sshkey_ecdsa_sk_webauthn_impl,
+ &sshkey_ecdsa_sk_webauthn_cert_impl,
# endif /* ENABLE_SK */
# endif /* OPENSSL_HAS_ECC */
&sshkey_rsa_impl,
@@ -300,6 +302,17 @@ sshkey_match_keyname_to_sigalgs(const char *keyname, const char *sigalgs)
sigalgs, 0) == 1 ||
match_pattern_list("rsa-sha2-512-cert-v01@openssh.com",
sigalgs, 0) == 1;
+ } else if (ktype == KEY_ECDSA_SK) {
+ return match_pattern_list("sk-ecdsa-sha2-nistp256@openssh.com",
+ sigalgs, 0) == 1 || match_pattern_list(
+ "webauthn-sk-ecdsa-sha2-nistp256@openssh.com",
+ sigalgs, 0) == 1;
+ } else if (ktype == KEY_ECDSA_SK_CERT) {
+ return match_pattern_list(
+ "sk-ecdsa-sha2-nistp256-cert-v01@openssh.com",
+ sigalgs, 0) == 1 || match_pattern_list(
+ "webauthn-sk-ecdsa-sha2-nistp256-cert-v01@openssh.com",
+ sigalgs, 0) == 1;
} else
return match_pattern_list(keyname, sigalgs, 0) == 1;
}
@@ -2205,7 +2218,7 @@ sshkey_sign(struct sshkey *key,
}
/*
- * ssh_key_verify returns 0 for a correct signature and < 0 on error.
+ * ssh_key_verify returns 0 for a correct signature and < 0 on error.
* If "alg" specified, then the signature must use that algorithm.
*/
int
@@ -2386,8 +2399,8 @@ sshkey_certify(struct sshkey *k, struct sshkey *ca, const char *alg,
int
sshkey_cert_check_authority(const struct sshkey *k,
- int want_host, int require_principal, int wildcard_pattern,
- uint64_t verify_time, const char *name, const char **reason)
+ int want_host, int wildcard_pattern, uint64_t verify_time,
+ const char *name, const char **reason)
{
u_int i, principal_matches;
@@ -2417,37 +2430,36 @@ sshkey_cert_check_authority(const struct sshkey *k,
return SSH_ERR_KEY_CERT_INVALID;
}
if (k->cert->nprincipals == 0) {
- if (require_principal) {
- *reason = "Certificate lacks principal list";
- return SSH_ERR_KEY_CERT_INVALID;
- }
- } else if (name != NULL) {
- principal_matches = 0;
- for (i = 0; i < k->cert->nprincipals; i++) {
- if (wildcard_pattern) {
- if (match_pattern(k->cert->principals[i],
- name)) {
- principal_matches = 1;
- break;
- }
- } else if (strcmp(name, k->cert->principals[i]) == 0) {
+ *reason = "Certificate lacks principal list";
+ return SSH_ERR_KEY_CERT_INVALID;
+ }
+ if (name == NULL)
+ return 0; /* principal matching not requested */
+
+ principal_matches = 0;
+ for (i = 0; i < k->cert->nprincipals; i++) {
+ if (wildcard_pattern) {
+ if (match_pattern(name, k->cert->principals[i])) {
principal_matches = 1;
break;
}
- }
- if (!principal_matches) {
- *reason = "Certificate invalid: name is not a listed "
- "principal";
- return SSH_ERR_KEY_CERT_INVALID;
+ } else if (strcmp(name, k->cert->principals[i]) == 0) {
+ principal_matches = 1;
+ break;
}
}
+ if (!principal_matches) {
+ *reason = "Certificate invalid: name is not a listed "
+ "principal";
+ return SSH_ERR_KEY_CERT_INVALID;
+ }
return 0;
}
int
sshkey_cert_check_authority_now(const struct sshkey *k,
- int want_host, int require_principal, int wildcard_pattern,
- const char *name, const char **reason)
+ int want_host, int wildcard_pattern, const char *name,
+ const char **reason)
{
time_t now;
@@ -2456,19 +2468,17 @@ sshkey_cert_check_authority_now(const struct sshkey *k,
*reason = "Certificate invalid: not yet valid";
return SSH_ERR_KEY_CERT_INVALID;
}
- return sshkey_cert_check_authority(k, want_host, require_principal,
- wildcard_pattern, (uint64_t)now, name, reason);
+ return sshkey_cert_check_authority(k, want_host, wildcard_pattern,
+ (uint64_t)now, name, reason);
}
int
sshkey_cert_check_host(const struct sshkey *key, const char *host,
- int wildcard_principals, const char *ca_sign_algorithms,
- const char **reason)
+ const char *ca_sign_algorithms, const char **reason)
{
int r;
- if ((r = sshkey_cert_check_authority_now(key, 1, 0, wildcard_principals,
- host, reason)) != 0)
+ if ((r = sshkey_cert_check_authority_now(key, 1, 1, host, reason)) != 0)
return r;
if (sshbuf_len(key->cert->critical) != 0) {
*reason = "Certificate contains unsupported critical options";
@@ -2672,64 +2682,54 @@ int
sshkey_ec_validate_public(const EC_GROUP *group, const EC_POINT *public)
{
EC_POINT *nq = NULL;
- BIGNUM *order = NULL, *x = NULL, *y = NULL, *tmp = NULL;
+ BIGNUM *order = NULL, *cofactor = NULL;
int ret = SSH_ERR_KEY_INVALID_EC_VALUE;
/*
* NB. This assumes OpenSSL has already verified that the public
- * point lies on the curve. This is done by EC_POINT_oct2point()
- * implicitly calling EC_POINT_is_on_curve(). If this code is ever
- * reachable with public points not unmarshalled using
- * EC_POINT_oct2point then the caller will need to explicitly check.
+ * point lies on the curve and that its coordinates are in [0, p).
+ * This is done by EC_POINT_oct2point() on at least OpenSSL >= 1.1,
+ * LibreSSL and BoringSSL.
*/
/* Q != infinity */
if (EC_POINT_is_at_infinity(group, public))
goto out;
- if ((x = BN_new()) == NULL ||
- (y = BN_new()) == NULL ||
- (order = BN_new()) == NULL ||
- (tmp = BN_new()) == NULL) {
+ if ((cofactor = BN_new()) == NULL) {
ret = SSH_ERR_ALLOC_FAIL;
goto out;
}
-
- /* log2(x) > log2(order)/2, log2(y) > log2(order)/2 */
- if (EC_GROUP_get_order(group, order, NULL) != 1 ||
- EC_POINT_get_affine_coordinates(group, public, x, y, NULL) != 1) {
- ret = SSH_ERR_LIBCRYPTO_ERROR;
- goto out;
- }
- if (BN_num_bits(x) <= BN_num_bits(order) / 2 ||
- BN_num_bits(y) <= BN_num_bits(order) / 2)
+ if (EC_GROUP_get_cofactor(group, cofactor, NULL) != 1)
goto out;
- /* nQ == infinity (n == order of subgroup) */
- if ((nq = EC_POINT_new(group)) == NULL) {
- ret = SSH_ERR_ALLOC_FAIL;
- goto out;
- }
- if (EC_POINT_mul(group, nq, NULL, public, order, NULL) != 1) {
- ret = SSH_ERR_LIBCRYPTO_ERROR;
- goto out;
+ /*
+ * Verify nQ == infinity (n == order of subgroup)
+ * This check may be skipped for curves with cofactor 1, as per
+ * NIST SP 800-56A, 5.6.2.3.
+ */
+ if (!BN_is_one(cofactor)) {
+ if ((order = BN_new()) == NULL) {
+ ret = SSH_ERR_ALLOC_FAIL;
+ goto out;
+ }
+ if ((nq = EC_POINT_new(group)) == NULL) {
+ ret = SSH_ERR_ALLOC_FAIL;
+ goto out;
+ }
+ if (EC_POINT_mul(group, nq, NULL, public, order, NULL) != 1) {
+ ret = SSH_ERR_LIBCRYPTO_ERROR;
+ goto out;
+ }
+ if (EC_POINT_is_at_infinity(group, nq) != 1)
+ goto out;
}
- if (EC_POINT_is_at_infinity(group, nq) != 1)
- goto out;
- /* x < order - 1, y < order - 1 */
- if (!BN_sub(tmp, order, BN_value_one())) {
- ret = SSH_ERR_LIBCRYPTO_ERROR;
- goto out;
- }
- if (BN_cmp(x, tmp) >= 0 || BN_cmp(y, tmp) >= 0)
- goto out;
+ /* success */
ret = 0;
out:
- BN_clear_free(x);
- BN_clear_free(y);
+ BN_clear_free(cofactor);
BN_clear_free(order);
- BN_clear_free(tmp);
EC_POINT_free(nq);
return ret;
}
@@ -3321,6 +3321,19 @@ sshkey_private_to_blob_pem_pkcs8(struct sshkey *key, struct sshbuf *buf,
success = 1;
}
break;
+#ifdef OPENSSL_HAS_ED25519
+ case KEY_ED25519:
+ if (format == SSHKEY_PRIVATE_PEM) {
+ r = SSH_ERR_INVALID_FORMAT;
+ goto out;
+ } else {
+ pkey = EVP_PKEY_new_raw_private_key(EVP_PKEY_ED25519,
+ NULL, key->ed25519_sk,
+ ED25519_SK_SZ - ED25519_PK_SZ);
+ success = pkey != NULL;
+ }
+ break;
+#endif
default:
success = 0;
break;
@@ -3366,9 +3379,11 @@ sshkey_private_to_fileblob(struct sshkey *key, struct sshbuf *blob,
#ifdef WITH_OPENSSL
case KEY_ECDSA:
case KEY_RSA:
+ case KEY_ED25519:
break; /* see below */
-#endif /* WITH_OPENSSL */
+#else /* WITH_OPENSSL */
case KEY_ED25519:
+#endif /* WITH_OPENSSL */
case KEY_ED25519_SK:
#ifdef WITH_OPENSSL
case KEY_ECDSA_SK:
diff --git a/sshkey.h b/sshkey.h
index c3262b896f06..a9cdfcd19502 100644
--- a/sshkey.h
+++ b/sshkey.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: sshkey.h,v 1.70 2025/08/29 03:50:38 djm Exp $ */
+/* $OpenBSD: sshkey.h,v 1.73 2026/03/03 09:57:26 dtucker Exp $ */
/*
* Copyright (c) 2000, 2001 Markus Friedl. All rights reserved.
@@ -98,22 +98,22 @@ enum sshkey_private_format {
#define SSHKEY_FLAG_EXT 0x0001
#define SSHKEY_CERT_MAX_PRINCIPALS 256
-/* XXX opaquify? */
+/* XXX opacify? */
struct sshkey_cert {
struct sshbuf *certblob; /* Kept around for use on wire */
u_int type; /* SSH2_CERT_TYPE_USER or SSH2_CERT_TYPE_HOST */
- u_int64_t serial;
+ uint64_t serial;
char *key_id;
u_int nprincipals;
char **principals;
- u_int64_t valid_after, valid_before;
+ uint64_t valid_after, valid_before;
struct sshbuf *critical;
struct sshbuf *extensions;
struct sshkey *signature_key;
char *signature_type;
};
-/* XXX opaquify? */
+/* XXX opacify? */
struct sshkey {
int type;
int flags;
@@ -218,12 +218,12 @@ int sshkey_match_keyname_to_sigalgs(const char *, const char *);
int sshkey_to_certified(struct sshkey *);
int sshkey_drop_cert(struct sshkey *);
int sshkey_cert_copy(const struct sshkey *, struct sshkey *);
-int sshkey_cert_check_authority(const struct sshkey *, int, int, int,
+int sshkey_cert_check_authority(const struct sshkey *, int, int,
uint64_t, const char *, const char **);
-int sshkey_cert_check_authority_now(const struct sshkey *, int, int, int,
+int sshkey_cert_check_authority_now(const struct sshkey *, int, int,
const char *, const char **);
int sshkey_cert_check_host(const struct sshkey *, const char *,
- int , const char *, const char **);
+ const char *, const char **);
size_t sshkey_format_cert_validity(const struct sshkey_cert *,
char *, size_t) __attribute__((__bounded__(__string__, 2, 3)));
int sshkey_check_cert_sigtype(const struct sshkey *, const char *);
diff --git a/sshlogin.c b/sshlogin.c
index fb55cadd677b..f3f4639a577d 100644
--- a/sshlogin.c
+++ b/sshlogin.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sshlogin.c,v 1.35 2020/10/18 11:32:02 djm Exp $ */
+/* $OpenBSD: sshlogin.c,v 1.37 2026/02/16 23:47:06 jsg Exp $ */
/*
* Author: Tatu Ylonen <ylo@cs.hut.fi>
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -48,7 +48,6 @@
#include <errno.h>
#include <fcntl.h>
-#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
diff --git a/sshpty.c b/sshpty.c
index 0a82b7d3bea9..b3e1e2466c1c 100644
--- a/sshpty.c
+++ b/sshpty.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sshpty.c,v 1.34 2019/07/04 16:20:10 deraadt Exp $ */
+/* $OpenBSD: sshpty.c,v 1.35 2026/02/11 17:05:32 dtucker Exp $ */
/*
* Author: Tatu Ylonen <ylo@cs.hut.fi>
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -17,13 +17,13 @@
#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
-#include <signal.h>
#include <errno.h>
#include <fcntl.h>
#include <grp.h>
#include <paths.h>
#include <pwd.h>
+#include <signal.h>
#include <stdarg.h>
#include <stdio.h>
#include <string.h>
diff --git a/sshsig.c b/sshsig.c
index 3789c437baa0..5b267d07d684 100644
--- a/sshsig.c
+++ b/sshsig.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sshsig.c,v 1.40 2025/09/25 06:23:19 jsg Exp $ */
+/* $OpenBSD: sshsig.c,v 1.41 2025/12/22 01:49:03 djm Exp $ */
/*
* Copyright (c) 2019 Google LLC
*
@@ -854,8 +854,8 @@ cert_filter_principals(const char *path, u_long linenum,
while ((cp = strsep(&principals, ",")) != NULL && *cp != '\0') {
/* Check certificate validity */
- if ((r = sshkey_cert_check_authority(cert, 0, 1, 0,
- verify_time, NULL, &reason)) != 0) {
+ if ((r = sshkey_cert_check_authority(cert, 0, 0, verify_time,
+ NULL, &reason)) != 0) {
debug("%s:%lu: principal \"%s\" not authorized: %s",
path, linenum, cp, reason);
continue;
@@ -920,7 +920,7 @@ check_allowed_keys_line(const char *path, u_long linenum, char *line,
sshkey_equal_public(sign_key->cert->signature_key, found_key)) {
if (principal) {
/* Match certificate CA key with specified principal */
- if ((r = sshkey_cert_check_authority(sign_key, 0, 1, 0,
+ if ((r = sshkey_cert_check_authority(sign_key, 0, 0,
verify_time, principal, &reason)) != 0) {
error("%s:%lu: certificate not authorized: %s",
path, linenum, reason);
diff --git a/ttymodes.c b/ttymodes.c
index 1d20ce8005bf..6102f8d82c1e 100644
--- a/ttymodes.c
+++ b/ttymodes.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ttymodes.c,v 1.36 2021/01/27 09:26:54 djm Exp $ */
+/* $OpenBSD: ttymodes.c,v 1.37 2026/02/14 00:18:34 jsg Exp $ */
/*
* Author: Tatu Ylonen <ylo@cs.hut.fi>
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -56,7 +56,6 @@
#include "log.h"
#include "compat.h"
#include "sshbuf.h"
-#include "ssherr.h"
#define TTY_OP_END 0
/*
diff --git a/uidswap.c b/uidswap.c
index 793688eb5817..413b2c63a373 100644
--- a/uidswap.c
+++ b/uidswap.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: uidswap.c,v 1.42 2019/06/28 13:35:04 deraadt Exp $ */
+/* $OpenBSD: uidswap.c,v 1.43 2026/02/11 17:05:32 dtucker Exp $ */
/*
* Author: Tatu Ylonen <ylo@cs.hut.fi>
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -15,6 +15,7 @@
#include "includes.h"
#include <errno.h>
+#include <grp.h>
#include <pwd.h>
#include <string.h>
#include <unistd.h>
@@ -22,8 +23,6 @@
#include <stdarg.h>
#include <stdlib.h>
-#include <grp.h>
-
#include "log.h"
#include "uidswap.h"
#include "xmalloc.h"
diff --git a/umac.c b/umac.c
index 8d6e1641521c..66e6ffe3c3b1 100644
--- a/umac.c
+++ b/umac.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: umac.c,v 1.27 2025/09/05 10:34:35 dtucker Exp $ */
+/* $OpenBSD: umac.c,v 1.30 2026/03/03 09:57:26 dtucker Exp $ */
/* -----------------------------------------------------------------------
*
* umac.c -- C Implementation UMAC Message Authentication
@@ -40,7 +40,7 @@
* "Barreto"). The only two files needed are rijndael-alg-fst.c and
* rijndael-alg-fst.h. Brian Gladman's version is distributed with the GNU
* Public license at http://fp.gladman.plus.com/AES/index.htm. It
- * includes a fast IA-32 assembly version. The OpenSSL crypo library is
+ * includes a fast IA-32 assembly version. The OpenSSL crypto library is
* the third.
*
* 5) With FORCE_C_ONLY flags set to 0, incorrect results are sometimes
@@ -53,7 +53,7 @@
/* ---------------------------------------------------------------------- */
#ifndef UMAC_OUTPUT_LEN
-#define UMAC_OUTPUT_LEN 8 /* Alowable: 4, 8, 12, 16 */
+#define UMAC_OUTPUT_LEN 8 /* Allowable: 4, 8, 12, 16 */
#endif
#if UMAC_OUTPUT_LEN != 4 && UMAC_OUTPUT_LEN != 8 && \
@@ -77,7 +77,6 @@
#include <endian.h>
#include <string.h>
#include <stdarg.h>
-#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <stddef.h>
@@ -91,10 +90,10 @@
/* ---------------------------------------------------------------------- */
/* The following assumptions may need change on your system */
-typedef u_int8_t UINT8; /* 1 byte */
-typedef u_int16_t UINT16; /* 2 byte */
-typedef u_int32_t UINT32; /* 4 byte */
-typedef u_int64_t UINT64; /* 8 bytes */
+typedef uint8_t UINT8; /* 1 byte */
+typedef uint16_t UINT16; /* 2 byte */
+typedef uint32_t UINT32; /* 4 byte */
+typedef uint64_t UINT64; /* 8 bytes */
typedef unsigned int UWORD; /* Register */
/* ---------------------------------------------------------------------- */
diff --git a/version.h b/version.h
index 086cdba98516..fceafae97661 100644
--- a/version.h
+++ b/version.h
@@ -1,6 +1,6 @@
-/* $OpenBSD: version.h,v 1.107 2025/10/08 00:32:52 djm Exp $ */
+/* $OpenBSD: version.h,v 1.108 2026/04/02 07:51:12 djm Exp $ */
-#define SSH_VERSION "OpenSSH_10.2"
+#define SSH_VERSION "OpenSSH_10.3"
#define SSH_PORTABLE "p1"
#define SSH_RELEASE SSH_VERSION SSH_PORTABLE